人员技能证书管理系统 · 系统结构图
多租户(多公司)技能证书管理平台 · 版本 v2.1 · 更新日期 2026-09-23 · 部署方式:nginx + gunicorn + MySQL + Redis
用户层
公众与管理分离;公司管理员仅使用门户,不登录后台系统
公
公众用户
- 免登录,仅使用门户公开功能
- 扫描证书二维码验证 / 证书编号查询
- 查看通知公告 · 验证结果页查看证书原件
司
公司管理员
- 仅通过门户「管理登录」进入自助工作台
- 维护本公司人员 / 证书 / 学时 / 考试报名
- 不登录后台系统,数据仅限本公司
总
总管理员
- 仅登录管理后台系统
- 全局管理:公司 / 账号 / 考试 / 公告 / 系统设置
- 高危操作专属(强制删除等)
HTTPSHTTPSHTTPS
站点层
两个独立域名 · 各自同源调用 API,无跨域
公众门户 portal-web · 纯静态,无需构建
- 首页证书编号查询 · 扫码验证页 · 查看证书原件
- 通知公告展示(条数受系统设置控制)
- 公司管理员登录(图形验证码)
- 工作台五页:人员管理 / 证书管理 / 学时记录 / 考试报名 / 公司信息维护(受开关控制)
管理后台 admin-web · Vue3 + Element Plus 构建产物
- 总管理员登录:图形验证码 + 密码连错 5 次锁 15 分钟
- 公司台账管理 · 管理员账号 · 人员档案 · 技能证书
- 编号规则 · 考试与成绩 · 公告 · 系统设置 · 日志查询
- 工作台统计(公司 / 人员 / 有效证书)
/api/* 反代/media/* 反代
nginx(双站点配置)
SSL/HTTPS · 同源反向代理 /api → 127.0.0.1:8012 · /media 静态别名 · client_max_body_size 20m · 门户页面 no-cache
HTTP
服务层 · FastAPI 单服务
gunicorn + uvicorn worker 多进程 · SQLAlchemy 2.0 · Pydantic v2
auth 认证JWT 双 token 自动续期 · 图形验证码 · 限流与锁定 · 登出拉黑 · RSA 加密口令
companies 公司台账 CRUD · 区域/资质/关键字筛选 · 台账导出/导入 · 停用 · 逻辑删除
company_profile 信息维护门户自助维护本公司台账(系统开关 + 字段白名单 + 变更留痕)
persons 人员档案CRUD · 照片上传 · Excel 导入导出 · 身份证校验与解析
certificates 证书编号手录/规则生成 · 年度记录 · 完整度检查 · 批量 PDF · 台账导出
exams 考试考试 CRUD · 时间区间 · 批量报名 · 名单/成绩导入导出 · 自动结束
announcements 公告发布/置顶/下线 · 首页滚动展示
settings 系统设置成绩展示 · 报名入口 · 合格线 · 公告条数 · 信息维护开关
code-rules 编号规则模板变量 · 实时预览 · 全局唯一
dicts 字典证书类型 · 学历等基础字典
logs 日志操作日志(含变更前后值)· 扫码查询日志
public 公开验证扫码 / 编号查询 · 字段白名单 · IP 限流 · 结果缓存
users 管理员账号账号 CRUD · 批量自动生成(编号+随机密码)· 账号密码清单导出
dashboard 工作台公司/人员/证书汇总 · 月度出证趋势 · 30 天到期预警
编号规则引擎Redis INCR 发号 + MySQL 唯一索引兜底
证书 PDF 渲染WeasyPrint(Linux)/ Chrome 无头(开发)可切换
身份证保护AES-256-GCM 加密 + SHA256 查重 + 脱敏展示
RSA 信封加密登录口令 / 身份证传输加密 + 防重放
多租户隔离业务表强制 company_id 过滤,越权 404
外部系统集成 · 外部答题系统:考试成绩带"答题记录"跳转链接,地址模板可配置(EXTERNAL_ANSWER_URL_TEMPLATE)
贯穿各层
安全策略
全站 HTTPS · 密钥一经使用永不更换 · 离线备份
传输安全
- 全站 HTTPS / SSL,强制加密通道
- RSA-2048 信封加密:登录口令 / 身份证传输密文
- 防重放:时间戳窗口 + nonce 一次性校验
认证安全
- JWT 双 token(2h / 7d),登出即拉黑,改密全量失效
- 图形验证码(开关控制)+ 登录 IP 限流
- 密码连错 5 次锁定 15 分钟
数据安全
- 身份证 AES-256-GCM 加密存储 + SHA256 哈希查重
- 全链路脱敏展示 · 公开接口字段白名单
- 初始密码加密暂存,改密后更新
业务安全
- 多租户 company_id 强制过滤,越权一律 404
- 角色分级:高危操作(强制删除等)仅总管理员
- 操作留痕(含变更前后值)· 公司删除为逻辑删除可恢复
上传防护
- nginx 全局 20m 上传上限,超限 413 拦截
- 接口级文件大小校验(check_upload_size)
- 类型限定:图片 / Excel,前端 accept + 后端校验
读写存取文件
数据层
MySQL(15 张表)
companypersoncertificate
cert_annual_recordcert_code_rulecert_template
sys_usersys_settingsys_dict
examexam_registrationexam_score
announcementoperation_logverify_log
Redis
图形验证码(5 分钟)
登录限流 / 失败锁定
证书编号发号序列
公开验证结果缓存
media/ 文件存储
人员照片
证书 PDF(含历史版本)
上传扫描件
运维部署层 · 宝塔面板
Linux 单机部署 · 组件集中可视化管理
进程守护
- Python 项目管理器托管 gunicorn(127.0.0.1:8012)
- 异常退出自动拉起 · 开机自启
备份任务
- 每日数据库全量备份(mysqldump)
- 每周 media 目录打包(照片 + 证书 PDF)
- AES 密钥离线保管(丢失不可再生)
运行日志
- nginx 访问 / 错误日志
- 后端应用日志(gunicorn 输出)
- 后台「日志查询」:操作留痕 + 扫码记录
环境要求
- Python 3.12 + 依赖(含 gunicorn / weasyprint)
- Nginx · MySQL · Redis(宝塔软件商店)
- 中文字体(证书 PDF 中文必需)
支撑
核心业务流程
出证主线
人员建档→
证书录入(编号 + 年度记录)→
完整度检查→
批量生成 PDF→
打印分发→
公众扫码验证
考试主线
考试发布(时间区间)→
门户批量报名→
成绩导入(合格线判定 · 缺考/作弊标注)→
门户成绩查询
多租户铁律业务表全部携带 company_id,公司管理员所有查询/操作强制注入本公司过滤,越权一律 404。
编号双轨cert_no(人读、可修改、留痕)与 verify_token(机读、永不变)解耦,改号不影响已打印二维码。
密钥纪律AES 密钥一经使用永不更换(身份证/初始密码密文依赖);SECRET_KEY 更换仅使登录态失效。