1项目概述
1.1 平台简介
SCIDraw(科研绘图平台)是一套面向高校科研院所的专业在线科研插图绘制与管理平台。平台提供浏览器端矢量画布编辑器(基于 Fabric.js)、AI 智能生图、模板中心、素材库管理、协作绘图、PPT 生成、学术论坛等核心功能,支持多用户并发使用。
1.2 部署模式
本次采购为私有化部署方案,即将 SCIDraw 平台完整部署于采购方(高校)指定的服务器或私有云环境中,所有数据(用户数据、项目文件、素材资源等)存储在本地,不经过任何第三方服务器,确保数据安全与隐私合规。
1.3 适用场景
- 高校图书馆公共科研绘图服务
- 院系实验室科研插图教学与创作平台
- 研究生/博士后科研绘图培训与协作
- 校级科研支撑服务平台
2技术架构
2.1 总体架构
| 层级 | 技术栈 | 说明 |
| 前端 | React 18 + TypeScript + Vite 5 + Fabric.js 5 | SPA 单页应用,Vite 构建产物由后端 Express 静态托管 |
| 后端 | Node.js 18+ + Express 4 | RESTful API + WebSocket(Socket.io 4) |
| 数据库 | MySQL 8.0(utf8mb4) | 30+ 数据表,InnoDB 引擎 |
| 缓存 | Redis 6.0+ 推荐 | 热数据缓存、会话管理、限流计数 |
| 进程管理 | PM2 5.0+ | Cluster 集群模式,支持热重启、日志管理 |
| 反向代理 | Nginx 1.20+ | HTTPS 终止、WebSocket 代理、静态资源加速 |
| AI 服务 | 智谱 GLM / MiniMax 可选 | 可替换为校内自建模型 |
2.2 系统架构图
┌──────────────────────────────────────────────────────┐
│ 用户浏览器 │
│ React SPA + Fabric.js 画布引擎 │
└──────────────────────┬───────────────────────────────┘
│ HTTPS / WebSocket
┌──────────────────────▼───────────────────────────────┐
│ Nginx 反向代理 │
│ SSL 终止 · 静态资源 · WebSocket 代理 │
└──────────────────────┬───────────────────────────────┘
│
┌──────────────────────▼───────────────────────────────┐
│ PM2 Cluster (Node.js) │
│ Express API + Socket.io + 定时任务 │
│ ┌──────────┬──────────┬──────────┐ │
│ │ 实例 1 │ 实例 2 │ 实例 N │ │
│ └──────────┴──────────┴──────────┘ │
└───────┬─────────────┬────────────────┬───────────────┘
│ │ │
┌───────▼──────┐ ┌────▼──────┐ ┌──────▼──────────────┐
│ MySQL 8.0 │ │ Redis │ │ 本地文件存储 │
│ 30+ 数据表 │ │ 缓存服务 │ │ 素材/头像/模板/PPT │
└──────────────┘ └───────────┘ └─────────────────────┘
3硬件服务器配置要求
3.1 配置方案
基础版
50 并发
- CPU
- 4 核
- 内存
- 8 GB
- 系统盘
- 50 GB SSD
- 数据盘
- 100 GB SSD
- 网络
- 10 Mbps
标准版
200 并发(推荐)
- CPU
- 8 核
- 内存
- 16 GB
- 系统盘
- 100 GB SSD
- 数据盘
- 500 GB SSD
- 网络
- 100 Mbps
集群版
500+ 并发
- 应用服务器
- 2 台 x 8 核 16 GB
- 数据库服务器
- 1 台 x 8 核 32 GB
- Redis 服务器
- 1 台 x 4 核 8 GB
- 文件存储
- NAS/NFS 2 TB
- 负载均衡
- Nginx 或硬件 LB
3.2 素材库存储估算
| 数据类别 | 初始大小 | 年增长量 | 说明 |
| 系统图标库 | ~1.5 GB | ~200 MB | SVG/PNG 科研素材图标(5000+) |
| 系统模板数据 | ~100 MB | ~50 MB | 模板画布 JSON + 缩略图 |
| 用户项目数据 | 0 | ~5 GB/百人/年 | 画布数据存储于 MySQL |
| 用户上传文件 | 0 | ~10 GB/百人/年 | 自定义素材、头像、PPT 等 |
| 博客/论坛图片 | 0 | ~1 GB/年 | 内容运营图片 |
4软件环境要求
4.1 操作系统与基础环境
| 软件 | 版本要求 | 用途 | 部署方式 |
| 操作系统 | CentOS 7+ / Ubuntu 20.04+ / Rocky Linux 8+ | 服务器操作系统 | 裸机或虚拟机 |
| Node.js | v18.x LTS(推荐 v22.x) | 后端运行时 | nvm 或包管理器 |
| npm | v10+ | 包管理 | 随 Node.js 安装 |
| PM2 | v5.0+ | 进程管理 | npm install -g pm2 |
| MySQL | 8.0+(utf8mb4) | 关系型数据库 | 自建或 RDS |
| Redis | 6.0+ | 缓存服务 | 自建或云服务 |
| Nginx | 1.20+ | 反向代理 | 包管理器安装 |
4.2 SSL 证书
| 要求 | 说明 |
| 用途 | HTTPS 加密访问 |
| 类型 | 单域名或通配符证书 |
| 来源 | Let's Encrypt(免费自动续签)或商业证书 |
| 域名 | 需采购方提供独立域名(如 draw.university.edu.cn) |
4.3 第三方服务(按需选配)
说明:私有化部署场景下,平台核心功能(画布编辑、素材库、模板、项目管理、协作、论坛)不依赖任何外部第三方服务即可完整运行。
| 服务 | 用途 | 必须 | 备选方案 |
| AI 大模型 API | AI 智能生图、智能客服 | 否 | 智谱 GLM / MiniMax / 校内自建模型 |
| 邮件服务 | 注册验证、通知、密码重置 | 是 | 校内 SMTP / 阿里云邮件推送 |
| 微信支付 | VIP 订阅付费 | 否 | 支付宝 / 关闭付费功能 |
| 支付宝 | VIP 订阅付费 | 否 | 微信支付 / 关闭付费功能 |
| 微信 OAuth | 扫码登录 | 否 | 邮箱+密码登录 |
| 对象存储 | 大文件存储 | 否 | 本地文件系统 |
5功能模块清单
5.1 核心功能(标配)
| 模块 | 功能描述 | 技术实现 |
| 画布编辑器 | 矢量画布编辑,支持拖拽、缩放、旋转、对齐、图层管理、撤销/重做 | Fabric.js 5,支持高清 2x 渲染 |
| 素材库 | 5000+ 科研插图 SVG 素材,支持分类浏览、关键词搜索、拖入画布 | SVG 签名防盗链,Redis 缓存加速 |
| 模板中心 | 预设科研模板(Nature/Science 风格),一键套用 | 模板审核、缩略图自动生成 |
| 项目管理 | 创建/删除/重命名项目,文件夹组织,版本历史(每项目最多 50 版本) | 自动保存 5 分钟节流,手动保存即创建版本 |
| 协作绘图 | 实时多人协作编辑同一画布,光标追踪 | Socket.io WebSocket 增量同步 |
| 导出功能 | PNG / JPG / SVG / PDF 多格式导出,支持 DPI 自定义(72~600) | Canvas toBlob + jsPDF |
| LaTeX 公式 | KaTeX 渲染数学公式并插入画布 | KaTeX 0.16 |
| 分子结构式 | SMILES 输入 → RDKit.js 渲染 2D 分子结构 → 插入画布 | RDKit WASM,22 个快捷模板 |
| 注册/登录 | 邮箱注册、密码登录、JWT Token 鉴权 | bcrypt 加密,7 天 Token 有效期 |
| 用户管理 | 个人信息、头像、密码修改、邮箱验证 | RESTful API |
| 后台管理 | 用户管理、素材管理、模板审核、订单管理、系统统计 | 管理员角色权限控制 |
| 论坛/问答 | 校内科研绘图交流论坛,支持发帖、回复、点赞 | Markdown 富文本 |
| 博客系统 | 教程发布、功能更新、公告通知 | Markdown + GFM 表格 |
| 数据统计 | PV/UV/用户活跃度/功能使用频次 | 按日聚合,管理员可视化面板 |
| 安全防护 | 速率限制、恶意路径拦截、IP 黑名单、SVG 防盗链 | 分层中间件防护 |
5.2 增强功能(选配)
| 模块 | 功能描述 | 前置依赖 |
| AI 智能生图 | 文字描述生成科研插图 SVG(支持编辑) | AI 大模型 API |
| AI 智能客服 | 自动回答使用问题,复杂问题转人工 | AI 大模型 API |
| AI 生成 PPT | 根据主题自动生成科研汇报 PPT | AI 大模型 API |
| VIP 订阅 | 会员分级、积分体系、有效期管理 | 支付渠道 |
| 支付集成 | 微信支付、支付宝在线支付 | 商户资质 |
| 微信登录 | 扫码登录/绑定 | 微信开放平台 |
| 邀请裂变 | 邀请码分享、注册奖励积分 | — |
| 邮件营销 | 定时邮件推送、活动通知 | 邮件服务 |
5.3 画布编辑器详细功能
| 功能 | 说明 |
| 基础绘图 | 矩形、圆形、三角形、直线、箭头、自由绘制 |
| 折线工具 | 中点锚点无限二分折线、鱼骨叉装饰物 |
| 文字编辑 | 富文本、字体选择、大小、颜色、对齐 |
| 图片导入 | PNG/JPG/SVG/TIFF 拖入画布,自动适配大小 |
| 渐变填充 | 线性/径向渐变,色阶拾色器 |
| 对齐分布 | 左/右/上/下/水平居中/垂直居中/等间距分布 |
| 图层管理 | 上移/下移/置顶/置底/锁定/隐藏 |
| 撤销/重做 | 无限步撤销重做栈 |
| 智能缩放 | 自动适配画布,支持 100%~1000% 缩放 |
| 画布尺寸 | A4/Letter/自定义尺寸,预设期刊投稿尺寸 |
| 裁切/蒙版 | 对象裁切、clipPath 蒙版 |
6后台管理系统
6.1 用户管理
| 功能 | 描述 |
| 用户列表 | 查看所有注册用户,支持搜索/筛选/分页 |
| 用户详情 | 查看用户信息、项目数量、存储用量、登录记录 |
| 状态管理 | 启用/禁用账户,设置管理员权限 |
| VIP 发放 | 管理员手动为用户开通 VIP 体验卡(日卡/周卡/月卡) |
| 积分调整 | 管理员手动增减用户积分 |
| 批量操作 | 批量导入用户、批量发放 VIP |
| 操作日志 | 所有管理操作留痕审计 |
6.2 素材管理
| 功能 | 描述 |
| 图标库管理 | 5000+ 系统图标,支持新增/删除/修改 |
| 分类管理 | 多级分类树,支持增删改排序 |
| 上传审核 | 用户提交的图标/模板需管理员审核后发布 |
| 批量导入 | 支持 CSV + ZIP 批量导入素材 |
| 存储统计 | 实时监控素材存储用量 |
6.3 模板管理
| 功能 | 描述 |
| 模板列表 | 查看所有公开模板,支持分类/搜索 |
| 模板审核 | 用户提交模板需审核通过后上架 |
| 使用统计 | 各模板使用次数排行 |
| 精选推荐 | 设置首页推荐模板 |
6.4 数据统计
| 功能 | 描述 |
| 访问统计 | 每日 PV/UV 趋势图、新注册用户数 |
| 用户活跃 | 日活/周活/月活用户统计 |
| 功能使用 | 各功能模块使用频次排行 |
| 存储监控 | 数据库/文件系统存储使用趋势 |
| 系统健康 | CPU/内存/磁盘使用率实时监控 |
6.5 内容管理
| 功能 | 描述 |
| 博客管理 | 发布/编辑/删除教程、公告、功能更新 |
| 论坛管理 | 帖子审核、举报处理、版块设置 |
| 通知管理 | 全站公告发布、定向用户通知 |
7日常运维
7.1 系统监控
| 监控项 | 工具/方法 | 告警阈值建议 |
| 应用进程 | pm2 list / pm2 monit | 重启次数 > 3 次/小时 |
| CPU 使用率 | PM2 监控 / 系统命令 | 持续 > 80% 超过 5 分钟 |
| 内存使用 | PM2 监控 | 实例 > 512MB 触发自动重启 |
| 磁盘空间 | df -h | 使用率 > 85% |
| MySQL 连接数 | SHOW PROCESSLIST | 活跃连接 > 25/30 |
| Redis 内存 | INFO memory | 使用 > maxmemory 的 80% |
| API 响应时间 | /api/health 健康检查 | 平均 > 2 秒 |
| 错误日志 | PM2 日志 / 应用日志 | 5xx 错误 > 10 次/分钟 |
7.2 备份策略
| 备份对象 | 备份方式 | 频率 | 保留周期 | 恢复时间 |
| MySQL 数据库 | mysqldump 全量 | 每日凌晨 2:00 | 30 天 | < 1 小时 |
| MySQL Binlog | 实时归档 | 持续 | 7 天 | 点级恢复 |
| 用户文件 | rsync 增量 | 每日凌晨 3:00 | 30 天 | < 2 小时 |
| 系统配置 | Git 版本控制 | 变更时 | 永久 | < 30 分钟 |
| PM2 配置 | pm2 save | 变更时 | 永久 | < 10 分钟 |
推荐备份脚本:详见附录,建议添加到 crontab 自动执行。
7.3 常见故障处理
| 故障现象 | 排查方法 | 处理方案 |
| 服务无响应 | pm2 list 查看进程状态 | pm2 restart scidraw-backend |
| 内存溢出 | pm2 monit 查看内存使用 | 检查日志定位泄漏 |
| 数据库连接失败 | mysql -u root -p -e "SELECT 1" | 检查 MySQL 服务状态 |
| Redis 连接失败 | redis-cli ping | 平台可降级运行 |
| 502 Bad Gateway | 检查 Node.js 进程是否存活 | pm2 restart |
| 文件上传失败 | 检查磁盘空间 df -h | 清理临时文件或扩容 |
| SSL 证书过期 | openssl x509 -enddate | 续签证书 |
8安全要求
8.1 网络安全
| 安全措施 | 描述 |
| HTTPS 加密 | 全站 HTTPS,TLS 1.2+ |
| 防火墙 | 仅开放 80/443 端口,数据库/Redis 不对外暴露 |
| 速率限制 | API 全局限流 200 req/min,认证接口 10 req/min |
| IP 黑名单 | 自动封禁恶意扫描 IP,支持手动管理 |
| SVG 防盗链 | HMAC-SHA256 签名 URL + 过期时间 |
8.2 数据安全
| 安全措施 | 描述 |
| 密码加密 | bcrypt 哈希,盐值轮次 10 |
| JWT Token | 有效期 7 天,支持刷新与吊销 |
| SQL 注入防护 | 参数化查询(mysql2 prepared statement) |
| XSS 防护 | 输入过滤 + 输出转义 |
| CSRF 防护 | SameSite Cookie + Token 验证 |
| 文件上传安全 | 类型白名单 + 大小限制 + 路径过滤 |
| 敏感配置 | 环境变量隔离,.env 不纳入版本控制 |
8.3 管理安全
| 安全措施 | 描述 |
| 管理员审计 | 所有管理操作记录 admin_logs 表 |
| 权限分级 | 管理员/普通用户二级权限 |
| 登录保护 | 登录失败次数限制,IP 频率控制 |
| 文件监控 | 实时监控素材目录文件变更,异常变动邮件告警 |
9部署实施计划
9.1 实施阶段
| 阶段 | 内容 | 工期 | 交付物 |
| 一、环境准备 | 服务器采购/分配、操作系统安装、基础软件部署 | 3~5 个工作日 | 服务器就绪报告 |
| 二、平台部署 | 数据库初始化、应用部署、Nginx 配置、SSL 证书、域名解析 | 3~5 个工作日 | 部署完成确认书 |
| 三、数据迁移 | 素材库导入、模板导入、历史数据迁移(如有) | 2~3 个工作日 | 数据迁移报告 |
| 四、功能验证 | 核心功能测试、性能测试、安全测试 | 3~5 个工作日 | 测试报告 |
| 五、用户培训 | 管理员培训(2 课时)、普通用户使用手册 | 1~2 个工作日 | 培训材料、用户手册 |
| 六、正式上线 | 试运行 1~2 周后正式切换 | 1~2 周 | 上线确认书 |
总工期:约 3~4 周(不含服务器采购周期)
9.2 验收标准
| 验收项 | 标准 |
| 功能完整性 | 招标功能清单中标配功能 100% 可用 |
| 性能指标 | 50 并发用户下,API 平均响应时间 < 500ms,页面首屏加载 < 3s |
| 稳定性 | 连续运行 72 小时无故障,无内存泄漏 |
| 安全性 | 通过 OWASP Top 10 基础安全扫描 |
| 数据完整性 | 数据库 30+ 表完整创建,素材库 5000+ 图标可正常访问 |
| 文档完备性 | 部署文档、运维手册、用户手册、API 文档齐全 |
10售后服务与技术支持
10.1 服务内容
| 服务项 | 内容 | 响应时间 |
| 电话支持 | 5×8 小时技术支持热线 | 工作日 2 小时内响应 |
| 远程支持 | 远程排查、配置调整、故障修复 | 4 小时内响应 |
| 版本升级 | 功能更新、安全补丁、Bug 修复 | 季度更新,紧急补丁 24h 内 |
| 培训服务 | 新管理员培训、功能升级培训 | 按需安排 |
| 数据备份 | 协助制定备份策略、恢复演练 | 每半年一次 |
10.2 服务级别协议(SLA)
| 指标 | 承诺 |
| 系统可用性 | ≥ 99.5%(每月计划外停机 ≤ 3.6 小时) |
| 故障响应 | 严重故障:30 分钟内响应;一般故障:4 小时内响应 |
| 数据恢复 | RPO ≤ 24 小时 |
| 版本更新 | 每季度至少一次功能更新 |
10.3 服务期限
| 项目 | 期限 |
| 免费质保期 | 验收合格之日起 12 个月 |
| 延保服务 | 可选 1~3 年延保,另行报价 |
| 源码交付 | 可选(需另行签订源码授权协议) |
11交付物清单
| 序号 | 交付物 | 格式 | 数量 |
| 1 | 软件安装包 | 源码 + 构建产物 | 1 套 |
| 2 | 部署实施文档 | PDF | 1 份 |
| 3 | 运维管理手册 | PDF | 1 份 |
| 4 | 用户使用手册 | PDF + 在线帮助 | 1 份 |
| 5 | API 接口文档 | PDF / 在线 Swagger | 1 份 |
| 6 | 数据库设计文档 | PDF(含 ER 图 + 表结构) | 1 份 |
| 7 | 测试报告 | PDF | 1 份 |
| 8 | 培训材料 | PPT + PDF | 1 套 |
| 9 | 源代码(可选) | Git 仓库 | 1 套 |
12资质与商务要求
12.1 供应商资质要求
| 资质项 | 要求 |
| 企业法人 | 具有独立法人资格 |
| 注册资本 | ≥ 100 万元人民币 |
| 软件著作权 | SCIDraw 相关软件著作权登记证书 |
| 类似业绩 | 近 3 年内高校/科研院所软件部署案例 ≥ 2 个 |
| 技术团队 | 具备 Node.js / React / MySQL 技术栈开发能力 |
12.2 报价要求
报价应包含以下费用项(可分项报价):
| 费用项 | 说明 |
| 软件授权费 | 永久授权 / 年度订阅 |
| 部署实施费 | 含环境搭建、数据迁移、测试验证 |
| 定制开发费(如有) | 校方提出的个性化功能定制 |
| 第一年运维费 | 含技术支持、版本更新 |
| 培训费 | 管理员培训 + 用户培训 |
| 素材扩展包(可选) | 额外科研素材包 |
附录 A:数据库表结构概览
| 序号 | 表名 | 说明 | 预估行数 |
| 1 | users | 用户账户 | 按注册量 |
| 2 | projects | 用户绘图项目 | 按使用量 |
| 3 | project_versions | 版本历史 | 按保存频率 |
| 4 | folders | 项目文件夹 | 按使用量 |
| 5 | system_icons | 系统图标库 | 5,000+ |
| 6 | icon_categories | 图标分类 | 180+ |
| 7 | custom_assets | 用户自定义素材 | 按使用量 |
| 8 | icon_submissions | 图标投稿审核 | 按投稿量 |
| 9 | system_templates | 系统模板 | 100+ |
| 10 | template_submissions | 模板投稿审核 | 按投稿量 |
| 11 | subscriptions | 订阅计划定义 | 6~10 |
| 12 | orders | 支付订单 | 按交易量 |
| 13 | credits_history | 积分流水 | 按使用量 |
| 14 | blog_posts | 博客文章 | 按运营量 |
| 15 | forum_posts | 论坛帖子 | 按使用量 |
| 16 | forum_replies | 论坛回复 | 按使用量 |
| 17 | support_conversations | 客服会话 | 按使用量 |
| 18 | support_messages | 客服消息 | 按使用量 |
| 19 | page_views | 页面访问记录 | 日均数百~数千 |
| 20 | daily_stats | 日统计汇总 | 按运行天数 |
| 21 | admin_logs | 管理操作日志 | 按操作量 |
| 22 | draw_groups | 协作绘图组 | 按使用量 |
| 23 | group_members | 协作组成员 | 按使用量 |
| 24 | ai_generation_history | AI 生图记录 | 按使用量 |
| 25 | email_campaigns | 邮件活动 | 按运营量 |
| 26 | referral_codes | 邀请码 | 按用户量 |
| 27 | user_notifications | 用户通知 | 按使用量 |
| 28 | password_reset_tokens | 密码重置令牌 | 临时数据 |
| 29 | email_subscriptions | 邮件订阅偏好 | 按用户量 |
| 30 | ppt_generation_history | PPT 生成记录 | 按使用量 |
附录 B:环境变量配置清单
私有化部署需配置以下环境变量(backend/.env 文件):
# === 必填项 ===
# 数据库
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=scidraw
DB_PASSWORD=<由校方设定>
DB_NAME=scidraw
# 服务端口
PORT=3000
# JWT 密钥(随机生成 64 位字符串)
JWT_SECRET=<随机生成>
# SVG 签名密钥(随机生成 32 位字符串)
SVG_SIGN_SECRET=<随机生成>
# === 可选项(按需配置)===
# Redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=<由校方设定>
REDIS_DB=0
# 邮件服务(必选,用于注册验证和通知)
SMTP_HOST=smtp.university.edu.cn
SMTP_PORT=465
SMTP_SECURE=true
SMTP_USER=noreply@university.edu.cn
SMTP_PASS=<由校方提供>
# 管理员邮箱(接收系统告警)
ADMIN_EMAIL=admin@university.edu.cn
# AI 服务(可选)
GLM_API_KEY=<如需 AI 功能>
GLM_BASE_URL=https://open.bigmodel.cn/api/paas/v4
# 支付(可选,高校免费场景可不配)
# WEIXIN_APPID=
# WEIXIN_MCHID=
# ALIPAY_APP_ID=
附录 C:Nginx 参考配置
server {
listen 80;
server_name draw.university.edu.cn;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name draw.university.edu.cn;
# SSL 证书
ssl_certificate /etc/nginx/ssl/draw.crt;
ssl_certificate_key /etc/nginx/ssl/draw.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 上传大小限制
client_max_body_size 50M;
# Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json
application/javascript text/xml;
gzip_min_length 1024;
# 主代理
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 120s;
}
# WebSocket 支持(Socket.io)
location /socket.io/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400s;
}
# 静态资源长缓存
location /assets/ {
proxy_pass http://127.0.0.1:3000;
expires 30d;
add_header Cache-Control "public, immutable";
}
# 健康检查
location /api/health {
proxy_pass http://127.0.0.1:3000;
access_log off;
}
}