20 KiB
科技成果转化管理系统 - 项目综合文档
本文档整合了系统设计、用户手册、权限矩阵、部署指南及安全策略,是项目的唯一核心文档。
目录
1. 项目概述
本项目是一个现代化的科技成果转化管理系统,旨在解决企事业单位及科研机构在成果管理中的痛点。系统支持多种科技成果类型的全生命周期管理,包括录入、审核、统计分析及归档导出。
核心特性
- 全流程管理:从成果提交、审核到归档的闭环管理。
- 多维度统计:提供饼图、雷达图、堆叠柱状图、面积图等丰富的可视化分析。
- 严格权限控制:基于角色的访问控制 (RBAC) + 细粒度的状态权限判断。
- 安全合规:移动端拦截、HTTPS 加密、操作日志审计、敏感数据脱敏。
- 智能化处理:自动归属部门、查重拦截、附件生命周期管理。
2. 角色与权限体系(核心)
系统设计了精细的权限模型,确保数据安全与业务流转的规范性。
2.1 角色定义
| 角色 | 代码 | 职责描述 |
|---|---|---|
| 普通用户 | user |
业务人员。负责成果数据的录入,查看自己参与的和自己所在科室的已通过成果。 |
| 中级用户 | intermediate_user |
科室主任。可查看本科室及本科室成员参与的所有已通过成果。 |
| 高级用户 | senior_user |
单位领导。可查看全单位所有已通过的成果,用于全局浏览和决策支持。 |
| 管理员 | admin |
管理员。负责审核成果。 |
| 系统维护员 | maintainer |
技术支持人员。负责字典、部门等基础数据维护,查看系统日志,重置用户密码。无权访问任何成果数据。 |
| 超级管理员 | super_admin |
系统管理。 |
2.2 全量权限操作矩阵
下表详细列出了不同角色在不同场景下的操作权限区别。
图例:✅ 允许 | ❌ 禁止 | ⚠️ 有限制
| 功能模块 | 操作行为 | 普通用户 (无关人员) |
普通用户 (提交人) |
普通用户 (完成人) |
中级用户 | 高级用户 | 管理员 | 超级管理员 | 系统维护员 | 权限说明 |
|---|---|---|---|---|---|---|---|---|---|---|
| 基础访问 | 登录/注册 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| 移动端访问 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 全局禁止非PC设备 | |
| 成果查看 | 查看列表 | ⚠️ | ⚠️ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 普通/中级/高级按范围过滤;管理员/超管可见全部状态 |
| 查看详情 | ⚠️ | ⚠️ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 详情权限与列表一致 | |
| 查看范围 | 本部门已通过 | 本人待审/驳回 + 本部门已通过 | 个人相关(任意状态) + 本部门已通过 | 本科室已通过(含本科室成员参与) + 个人相关 + 本人待审/驳回 | 全单位已通过 + 个人相关 + 本人待审/驳回 | 全量(含待审/驳回/已通过) | 全量(含待审/驳回/已通过) | 无 | 完成人通过 contributors.phone 精确匹配 | |
| 成果录入 | 新增成果 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 当前实现未限制维护员 |
| 成果修改 | 修改(待审核) | ❌ | ✅ | ❌ | ⚠️ | ⚠️ | ⚠️ | ✅ | ⚠️ | 仅提交人可改;超管可改任意成果 |
| 修改(已驳回) | ❌ | ✅ | ❌ | ⚠️ | ⚠️ | ⚠️ | ✅ | ⚠️ | 仅提交人可改;超管可改任意成果 | |
| 修改(已通过) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | 仅超管可修改 | |
| 成果删除 | 删除(待审核) | ❌ | ✅ | ❌ | ⚠️ | ⚠️ | ⚠️ | ✅ | ⚠️ | 仅提交人可删;超管可删任意成果 |
| 删除(已驳回) | ❌ | ✅ | ❌ | ⚠️ | ⚠️ | ⚠️ | ✅ | ⚠️ | 仅提交人可删;超管可删任意成果 | |
| 删除(已通过) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | 仅超管可删 | |
| 业务审核 | 审核通过/驳回 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | 管理员回避:不可审自己参与的成果 |
| 数据分析 | 查看统计图表 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 统计图默认仅已通过;状态分布仅超管/维护员全量 |
| 导出数据/附件 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | 仅超管 | |
| 成果附件 | 下载单个附件 | ❌ | ⚠️ | ✅ | ⚠️ | ⚠️ | ✅ | ✅ | ❌ | 完成人可下;提交人仅待审/驳回可下 |
| 下载成果附件包 | ❌ | ⚠️ | ✅ | ⚠️ | ⚠️ | ✅ | ✅ | ❌ | 与单附件规则一致 | |
| 系统管理 | 用户管理 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ⚠️ | 超管全权;维护员仅列表/重置密码 |
| 部门/字典维护 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | 仅超管/维护员 | |
| 查看系统日志 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | 仅超管/维护员 | |
| 发布系统公告 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | 仅超管/维护员 | |
| 全量数据校验 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | 仅超管 | |
| 通知公告 | 查看公告列表/详情 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 所有登录用户可看 |
| 下载公告附件 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 所有登录用户可下 | |
| 删除公告 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | 仅超管/维护员可删 |
2.3 特殊场景说明
场景 A:我是提交人,但不是完成人
例子:管理员帮项目组录入成果。
- 待审核/已驳回:拥有完全控制权(修改/删除)。
- 已通过:权限降级为只读。
场景 B:我是完成人,但不是提交人
例子:项目负责人录入,我是成员。
- 待审核/已驳回:不可见。为了隐私和准确性,草稿状态仅提交人可见。
- 已通过:可见,但不可修改。
场景 C:管理员的回避制度
- 如果管理员是某项成果的完成人之一,该成果在审核列表中对其自动隐藏。
- 必须由其他管理员或超级管理员进行审核。
3. 业务流程与功能指南
3.1 成果申报全流程
3.1.1 成果类型详解
系统支持以下 10 种科技成果类型的申报:
- 论文 (Paper): 已发表的学术论文 (SCI/EI/核心等)。
- 专利 (Patent): 发明专利、实用新型、外观设计。
- 项目 (Project): 纵向课题、横向课题、自选项目。
- 奖励 (Award): 国家级、省部级、行业协会奖励。
- 标准 (Standard): 国际标准、国家标准、行业标准、地方标准。
- 专著 (Book): 出版发行的学术著作、译著。
- 技术报告 (Report): 提交给政府或企业的咨询报告、技术方案。
- 规划 (Plan): 发展规划、战略研究报告。
- 成果转化 (Transfer): 技术转让、许可、作价入股。
- 软著 (Software): 计算机软件著作权。
3.1.2 智能表单填写指南
- 动态字段联动: 不同类型的成果需要填写的字段不同(如论文需填“期刊名称”,专利需填“专利号”)。
- 完成人添加与排序:
- 点击“添加完成人”按钮,输入姓名和手机号。
- 列表中的第一位默认为“主要完成人”(负责人)。
- 系统会自动根据主要完成人的手机号,查找其在系统中的注册信息,并将该成果自动归属到其所在部门。
- 附件上传规范: 支持 PDF, Office, 图片, 压缩包。单个文件最大 500MB。
3.1.3 查重拦截机制
为了避免重复统计,系统内置了查重机制。当您点击提交时,系统会检查:
- 唯一标识符: 如专利号、论文DOI、软著登记号等是否已存在。
- 名称+日期: 如果同一天内提交了完全相同的成果名称。 如果检测到重复,系统将拦截提交。
3.2 审核与管理 (管理员视角)
3.2.1 审核流程
- 查看详情: 点击成果名称,进入详情页。
- 核对信息: 检查填写的字段是否完整、准确,附件是否清晰、合规。
- 给出结论:
- 通过: 成果状态变为“已通过”,正式计入统计数据。
- 驳回: 需填写驳回理由。成果状态变为“已驳回”,提交人可修改后重新提交。
3.2.2 附件清理
当成果被“驳回”或“删除”时,为了节省服务器空间,系统会自动清理关联的附件文件。
3.3 数据可视化与决策支持
进入“统计分析”页面,系统提供多维度的可视化报表。
- 部门贡献度分析:
- 堆叠柱状图: 展示各部门在不同年份的成果产出数量。
- 雷达图: 展示各部门在不同成果类型上的分布,分析“偏科”现象。
- 历史趋势分析 (累计增长):
- 堆叠面积图: 展示全单位及各部门的累计成果贡献趋势。
- 双轴组合图: 左轴展示全单位总量,右轴展示各部门独立增长曲线。
3.3.1 批量导出与表单生成
系统支持将成果数据以“电子档案”的形式批量导出,便于线下归档或上报。
- 批量生成表单: 在用户管理或成果列表中,可选择多条成果,系统会自动将每条成果的详情页渲染为图片。
- 打包下载: 系统将生成的表单图片及相关附件打包为 ZIP 文件,一键下载。
3.4 系统公告与通知
系统内置了全员通知系统,支持富文本编辑和附件分发。
- 发布公告: 高级用户及以上角色可发布公告,支持置顶、富文本排版及多附件上传。
- 自动报警: 系统集成了监控机制,当服务器磁盘空间不足(默认阈值 10GB)时,会自动以“系统监控”身份发布置顶报警公告,提醒管理员处理。
3.5 数据一致性校验
为了应对历史数据迁移或意外操作可能导致的数据脏读,系统提供了全量数据校验工具(仅超级管理员可用)。
- 校验范围:
- 完成人结构: 检查 JSONB 数据格式是否符合规范。
- 归属部门: 检查成果归属部门是否存在于当前部门字典中。
- 字典约束: 检查成果类型、等级等字段是否在合法值范围内。
- 一键修复: 对于部分逻辑错误,系统提供指引或自动修复建议。
4. 技术架构与开发规范
4.1 总体架构
系统采用经典的 前后端分离 (SPA) 架构,通过 RESTful API 进行通信。
graph TD
Client[React 前端 SPA] -->|HTTPS/JSON| Nginx[Nginx 反向代理]
Nginx -->|Proxy Pass| Server[Node.js 后端 API]
Nginx -->|Static Files| Uploads[文件存储]
Server -->|SQL| DB[(PostgreSQL 17)]
4.2 目录结构
后端 (server/)
index.js: 应用入口,负责中间件装载、路由分发、HTTPS 启动。routes/: 路由定义层,按业务模块拆分 (auth, achievements, users...)。middleware/: 中间件层 (auth.js 鉴权, auditLogger.js 审计)。utils/: 工具库 (logger.js 日志, diskMonitor.js 监控)。scripts/: 运维脚本 (setup.js 初始化, seed_data.js 种子数据)。
前端 (client/src/)
pages/: 页面组件,对应路由 (Dashboard, Upload, Audit...)。components/: 通用业务组件 (MainLayout 布局, UserSearchSelect 用户搜索)。constants/: 常量定义 (achievements.js 定义了10种成果类型的元数据)。
4.3 后端核心机制实现
4.3.1 安全防护中间件链
- CORS: 跨域资源共享控制,严格限制
origin来源,防止恶意跨域请求。 - RateLimit (限流): 全局 100 req/min,认证接口 10 req/min。
- MobileInterceptor (移动端拦截): 通过 User-Agent 识别并拦截移动设备。
- Morgan (日志脱敏): 正则替换 URL 中的
token,password为***。
4.3.2 审计日志系统 (AuditLogger)
- 机制: 拦截所有非 GET 请求(修改性操作)。
- 语义翻译: 内置映射表,将
POST /api/achievements自动翻译为“上传成果”。 - 记录内容: 操作人、IP、时间、耗时、操作结果。
4.3.3 文件存储策略
- 写入: 始终写入
UPLOAD_DIR(主目录)。 - 读取: 先在
UPLOAD_DIR查找,若未找到,遍历UPLOAD_FALLBACK_DIRS(历史目录列表)。 - 安全增强:
- Magic Number 检查: 引入
file-type库,通过文件二进制头校验真实类型,防止伪装文件上传。 - 静态资源防护: 强制设置
Content-Disposition: attachment,防止 HTML/JS 文件在浏览器中直接执行。
- Magic Number 检查: 引入
4.3.4 稳定性保障机制
- 内存泄漏防护: 针对验证码等临时数据,使用定时任务 (
setInterval) 自动清理过期条目,防止内存溢出。 - 数据库连接保活: 监听连接池
error事件,在连接断开时安全处理,防止 Node.js 进程崩溃。
4.4 前端工程化实践
- 常量驱动开发: 在
client/src/constants/achievements.js中定义所有成果类型的元数据,新增类型无需改动业务逻辑。 - 组件复用: 如
UserSearchSelect组件,实现带有防抖的远程搜索下拉框。
5. 运维部署与灾难恢复
5.1 基础设施规划
- 操作系统: Windows Server 2016+ / Ubuntu 20.04 LTS+ / CentOS 7.9+
- 运行环境: Node.js v18.16.0+ (推荐 v20 LTS)。
- 兼容性说明: 系统内置了对
fs.promises.statfs的特性检测,确保在旧版 Node.js 上也能正常运行。
- 兼容性说明: 系统内置了对
- 数据库: PostgreSQL 17.x (必须支持 JSONB 类型)
- Web 服务器: Nginx 1.20+
5.2 Windows 环境部署实战
- 安装依赖: 使用
配置包安装 Node.js 和 PostgreSQL。 - 后端配置:
- 复制
.env.example为.env。 - 配置
DB_PASSWORD,JWT_SECRET,UPLOAD_DIR。 - 环境变量支持: 前端支持
REACT_APP_API_URL环境变量,便于灵活配置 API 地址。 - 运行
npm install和npm run init-db。
- 复制
- 前端构建:
- 运行
npm install和npm run build。
- 运行
- Nginx 配置:
- 配置
client_max_body_size 500M支持大文件。 - 配置
proxy_pass转发 API 请求。 - 配置
alias托管上传文件。
- 配置
- HTTPS 配置: 使用
mkcert生成自签名证书。
5.3 Linux 生产环境部署实战
- 环境构建: 安装 Node.js, PostgreSQL, Nginx。
- 权限管理: 创建专用用户
stapp,严禁使用 root 运行。 - 进程守护: 使用 PM2 (
pm2 start index.js --name "st-backend" --time)。 - 防火墙: 仅开放 22, 80, 443 端口。
5.4 数据安全与灾难恢复
5.4.1 自动备份策略
建议在 Linux 下使用 crontab 设置每日自动备份数据库。
5.4.2 专用备份工具 (STBackupTool)
对于 Windows 用户,提供图形化工具:
- 一键备份: 自动打包数据库 SQL 和上传文件为 ZIP 包。
- 一键恢复: 自动解压、导入数据、修复序列、还原文件。
5.4.3 灾难恢复演练
场景:服务器硬盘彻底损坏,需迁移到新机器。
- 搭建新环境: 安装 Node.js 和 PostgreSQL。
- 创建空数据库: 绝对不要运行
npm run init-db! 必须保持数据库为空。 - 执行恢复: 使用
STBackupTool导入备份包。
6. 安全防御体系
6.1 网络层防御
- 反向代理隐藏: Nginx 统一入口,隐藏后端端口。
- 全站 HTTPS: 强制 SSL 加密,防止中间人攻击。
- 安全响应头: 启用
X-Frame-Options,X-XSS-Protection。 - CORS 策略: 严格限制跨域请求来源,防止 CSRF 攻击。
6.2 应用层防御
- SQL 注入防御: 全面使用参数化查询。
- 文件上传安全:
- 白名单过滤: 仅允许 PDF/Office/图片/压缩包。
- Magic Number 校验: 检查文件二进制头,防止伪装文件。
- 自动重命名: 防止文件名冲突和路径注入。
- Token 保护: 附件下载使用
Authorization头传递 Token,避免 URL 泄露。 - 防暴力破解: 认证接口限流 (10次/分钟),验证码机制。
6.3 数据隐私保护
- 密码存储: bcrypt 加盐哈希。
- 日志脱敏: 自动替换日志中的敏感字段。
- 真实 IP 追踪: 配置 Nginx 传递
X-Forwarded-For。
6.4 权限安全
- 精确匹配: 使用 PostgreSQL 的 JSONB 操作符进行权限判断,消除因重名导致的权限漏洞。
- 状态隔离: 严格区分草稿、待审核、已通过状态下的操作权限。
7. API 接口规范
7.1 统一响应格式
{
"success": true,
"data": { ... } // 业务数据
}
7.2 核心接口定义
- 成果上传:
POST /api/achievements(Multipart) - 统计数据:
GET /api/statistics - 认证:
POST /api/auth/login - 日志:
GET /api/logs
8. 数据库设计
8.1 核心表结构
- users: 用户表 (id, username, password_hash, role, department...)
- achievements: 成果表 (id, type, status, contributors, assigned_departments...)
- 数据完整性: 外键约束配置为
ON DELETE SET NULL,防止误删用户导致成果数据丢失。
- 数据完整性: 外键约束配置为
- audit_logs: 审计日志表 (id, user_id, method, url, description, status...)
8.2 JSONB 的应用
为了应对灵活的“完成人”列表,使用 PostgreSQL 的 JSONB 类型存储 contributors 字段 [{name, phone, is_main}],避免了复杂的关联表,且查询性能极佳。
9. 常见问题 (FAQ)
Q: 为什么我提交了成果,但在列表里找不到? A: 默认列表只显示“我的成果”。请检查您是否是该成果的完成人。
Q: 附件上传失败,提示“Network Error”? A: 可能是文件过大(超过500MB)或网络不稳定。建议在内网环境下操作。
Q: 如何修改已通过审核的成果? A: 为了数据严谨性,已通过的成果不允许普通用户修改。请联系超级管理员进行“退回”或“修改”操作。
Q: 手机无法访问系统? A: 系统开启了移动端拦截策略,仅允许 PC 浏览器访问,以确保数据安全。
10. 补充
10.1 系统相关账号和密码
| 类型 | 账号 | 密码 |
|---|---|---|
| 数据库 | postgre | 020416 |
| 服务器 | STsystem | STsystem |
| 超级管理员 | 18888888888 | admin123 |
| 系统维护员 | 19999999999 | maintainer123 |
10.2 运行服务器相关服务
PostgreSQL自启动服务 STsystem_local_backend 系统后端nssm注册服务 STsystem_network_nginx Nginx网络代理的nssm注册服务
10.3 阿里云短信认证服务
| 分类 | 配置项 | 详细信息 |
|---|---|---|
| 平台 | 网址 | https://dypns.console.aliyun.com/overview |
| 资源 | 使用情况 | 初级购入300条,现剩余超80% |
| 签名 | 名称 | 速通互联验证码 |
| 签名 | 使用场景 | 发送测试短信 |
| 模板 | 名称 | 登录/注册模板 |
| 模板 | Code | 100001 |
| 模板 | 内容 | 您的验证码为 ${code}。尊敬的客户,以上验证码 ${min}分钟内有效,请注意保密,切勿告知他人。 |