# 科技成果转化管理系统 - 项目综合文档
本文档整合了系统设计、用户手册、权限矩阵、部署指南及安全策略,是项目的唯一核心文档。
---
## 目录
1. [项目概述](#1-项目概述)
2. [角色与权限体系(核心)](#2-角色与权限体系核心)
3. [业务流程与功能指南](#3-业务流程与功能指南)
4. [技术架构与开发规范](#4-技术架构与开发规范)
5. [运维部署与灾难恢复](#5-运维部署与灾难恢复)
6. [安全防御体系](#6-安全防御体系)
7. [API 接口规范](#7-api-接口规范)
8. [数据库设计](#8-数据库设计)
9. [常见问题 (FAQ)](#9-常见问题-faq)
---
## 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 种科技成果类型的申报:
1. **论文 (Paper)**: 已发表的学术论文 (SCI/EI/核心等)。
2. **专利 (Patent)**: 发明专利、实用新型、外观设计。
3. **项目 (Project)**: 纵向课题、横向课题、自选项目。
4. **奖励 (Award)**: 国家级、省部级、行业协会奖励。
5. **标准 (Standard)**: 国际标准、国家标准、行业标准、地方标准。
6. **专著 (Book)**: 出版发行的学术著作、译著。
7. **技术报告 (Report)**: 提交给政府或企业的咨询报告、技术方案。
8. **规划 (Plan)**: 发展规划、战略研究报告。
9. **成果转化 (Transfer)**: 技术转让、许可、作价入股。
10. **软著 (Software)**: 计算机软件著作权。
#### 3.1.2 智能表单填写指南
* **动态字段联动**: 不同类型的成果需要填写的字段不同(如论文需填“期刊名称”,专利需填“专利号”)。
* **完成人添加与排序**:
* 点击“添加完成人”按钮,输入姓名和手机号。
* 列表中的**第一位**默认为“主要完成人”(负责人)。
* 系统会自动根据**主要完成人**的手机号,查找其在系统中的注册信息,并将该成果自动归属到其所在部门。
* **附件上传规范**: 支持 PDF, Office, 图片, 压缩包。单个文件最大 **500MB**。
#### 3.1.3 查重拦截机制
为了避免重复统计,系统内置了查重机制。当您点击提交时,系统会检查:
1. **唯一标识符**: 如专利号、论文DOI、软著登记号等是否已存在。
2. **名称+日期**: 如果同一天内提交了完全相同的成果名称。
如果检测到重复,系统将拦截提交。
### 3.2 审核与管理 (管理员视角)
#### 3.2.1 审核流程
1. **查看详情**: 点击成果名称,进入详情页。
2. **核对信息**: 检查填写的字段是否完整、准确,附件是否清晰、合规。
3. **给出结论**:
* **通过**: 成果状态变为“已通过”,正式计入统计数据。
* **驳回**: 需填写驳回理由。成果状态变为“已驳回”,提交人可修改后重新提交。
#### 3.2.2 附件清理
当成果被“驳回”或“删除”时,为了节省服务器空间,系统会自动清理关联的附件文件。
### 3.3 数据可视化与决策支持
进入“统计分析”页面,系统提供多维度的可视化报表。
* **部门贡献度分析**:
* **堆叠柱状图**: 展示各部门在不同年份的成果产出数量。
* **雷达图**: 展示各部门在不同成果类型上的分布,分析“偏科”现象。
* **历史趋势分析 (累计增长)**:
* **堆叠面积图**: 展示全单位及各部门的**累计**成果贡献趋势。
* **双轴组合图**: 左轴展示全单位总量,右轴展示各部门独立增长曲线。
#### 3.3.1 批量导出与表单生成
系统支持将成果数据以“电子档案”的形式批量导出,便于线下归档或上报。
* **批量生成表单**: 在用户管理或成果列表中,可选择多条成果,系统会自动将每条成果的详情页渲染为图片。
* **打包下载**: 系统将生成的表单图片及相关附件打包为 ZIP 文件,一键下载。
### 3.4 系统公告与通知
系统内置了全员通知系统,支持富文本编辑和附件分发。
* **发布公告**: 高级用户及以上角色可发布公告,支持置顶、富文本排版及多附件上传。
* **自动报警**: 系统集成了监控机制,当服务器磁盘空间不足(默认阈值 10GB)时,会自动以“系统监控”身份发布置顶报警公告,提醒管理员处理。
### 3.5 数据一致性校验
为了应对历史数据迁移或意外操作可能导致的数据脏读,系统提供了**全量数据校验工具**(仅超级管理员可用)。
* **校验范围**:
* **完成人结构**: 检查 JSONB 数据格式是否符合规范。
* **归属部门**: 检查成果归属部门是否存在于当前部门字典中。
* **字典约束**: 检查成果类型、等级等字段是否在合法值范围内。
* **一键修复**: 对于部分逻辑错误,系统提供指引或自动修复建议。
---
## 4. 技术架构与开发规范
### 4.1 总体架构
系统采用经典的 **前后端分离 (SPA)** 架构,通过 RESTful API 进行通信。
```mermaid
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 安全防护中间件链
1. **CORS**: 跨域资源共享控制,严格限制 `origin` 来源,防止恶意跨域请求。
2. **RateLimit (限流)**: 全局 100 req/min,认证接口 10 req/min。
3. **MobileInterceptor (移动端拦截)**: 通过 User-Agent 识别并拦截移动设备。
4. **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 文件在浏览器中直接执行。
#### 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 环境部署实战
1. **安装依赖**: 使用 `配置包` 安装 Node.js 和 PostgreSQL。
2. **后端配置**:
* 复制 `.env.example` 为 `.env`。
* 配置 `DB_PASSWORD`, `JWT_SECRET`, `UPLOAD_DIR`。
* *环境变量支持*: 前端支持 `REACT_APP_API_URL` 环境变量,便于灵活配置 API 地址。
* 运行 `npm install` 和 `npm run init-db`。
3. **前端构建**:
* 运行 `npm install` 和 `npm run build`。
4. **Nginx 配置**:
* 配置 `client_max_body_size 500M` 支持大文件。
* 配置 `proxy_pass` 转发 API 请求。
* 配置 `alias` 托管上传文件。
5. **HTTPS 配置**: 使用 `mkcert` 生成自签名证书。
### 5.3 Linux 生产环境部署实战
1. **环境构建**: 安装 Node.js, PostgreSQL, Nginx。
2. **权限管理**: 创建专用用户 `stapp`,严禁使用 root 运行。
3. **进程守护**: 使用 PM2 (`pm2 start index.js --name "st-backend" --time`)。
4. **防火墙**: 仅开放 22, 80, 443 端口。
### 5.4 数据安全与灾难恢复
#### 5.4.1 自动备份策略
建议在 Linux 下使用 `crontab` 设置每日自动备份数据库。
#### 5.4.2 专用备份工具 (STBackupTool)
对于 Windows 用户,提供图形化工具:
* **一键备份**: 自动打包数据库 SQL 和上传文件为 ZIP 包。
* **一键恢复**: 自动解压、导入数据、修复序列、还原文件。
#### 5.4.3 灾难恢复演练
**场景:服务器硬盘彻底损坏,需迁移到新机器。**
1. **搭建新环境**: 安装 Node.js 和 PostgreSQL。
2. **创建空数据库**: **绝对不要运行 `npm run init-db`!** 必须保持数据库为空。
3. **执行恢复**: 使用 `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 统一响应格式
```json
{
"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}分钟内有效,请注意保密,切勿告知他人。 |