# 特种设备与人员资质年审合规系统 **Repository Path**: wyabsdai/certi-pass ## Basic Information - **Project Name**: 特种设备与人员资质年审合规系统 - **Description**: 特种设备与人员资质年审合规管理系统 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-10-30 - **Last Updated**: 2026-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 安审云 CertiPass # 我的资质截图,支持视频验资格证 ![输入图片说明](imgs/964da53b-1281-44b5-b786-404cb273fc55.png) > 面向中小型工贸制造、物流车队企业的**特种设备与人员资质年审合规管理系统**(SaaS 多租户),开源版。 企业里叉车、压力容器、起重机的定检报告过期了没人盯,电工证、焊工证脱审了才发现——监管检查一罚就是几万。安审云把"证书到期"这件事变成系统问题:**台账电子化、到期自动预警、合规一键导出**,免费 10 个证书额度,够小微企业直接用。 - 解决三大痛点:**罚款重**(脱审即罚)、**管理乱**(纸质台账找不到)、**应检难**(检查来了来不及补) - 预警通道:企业微信 / 钉钉 / 飞书群机器人 + 邮件 + 短信,每日 07:30 自动盘点推送 - 现场核验:"一机一码"二维码贴纸,扫码即看设备检验状态 ## 界面预览 ![输入图片说明](imgs/12e6f1bcefb027553e9dacbe16a94a61.png) ![输入图片说明](imgs/939be870f5f8418364c11b452bd5cc0e.png) ![输入图片说明](imgs/c18ab06a9ff45d81af19d37aa46b432c.png) ![输入图片说明](imgs/4fd57b72f044ab0943d47268fe128520.png) ![输入图片说明](imgs/97124adafed3231b259020b74d71887c.png) ![输入图片说明](imgs/229f605fab8d18dc062ba03394dc88ef.png) ![输入图片说明](imgs/c7074af9eb4a6b07d63ed4fee5a94e4d.png) ![输入图片说明](11056c483c67465cb269c4f8e7e2222a.png) ![输入图片说明](imgs/65bb15baf1e8d5e5f258e34078a9c7bd.png) ![输入图片说明](imgs/0fc3d6c2d3885d6dfdbe19a254d5a55b.png) > 演示地址:qq:67113031 联系演示,app代码点小星星点下加qq免费提供 ## 特性 ### 核心业务(六大模块) | 模块 | 说明 | |---|---| | 人员资质台账 | 电工/焊工/起重机/叉车/危化等证书的录入、复审提醒、脱审标记,支持拍照录入 | | 设备定检台账 | 叉车、压力容器、起重机等特种设备的注册 Code、检验周期、下次检验日管理 | | 预警中心 | 过期 / 紧急(≤30 天)/ 预警(≤60 天)/ 正常 四级状态,多通道推送 + 发送日志留痕 | | 合规报告导出 | Excel(MiniExcel)与 PDF(QuestPDF)台账一键导出,含中文字体嵌入 | | 可视化看板 | 到期分布、预警趋势、租户概况 ECharts 大屏 | | 一机一码核验 | 每台设备生成签名二维码(SM3),扫码落地页展示检验状态,现场执法可查 | ### 平台能力 - **SaaS 多租户**:租户数据行级隔离(EF Core 全局过滤器),免费版 / 专业版 / 旗舰代运营版套餐与到期控制 - **动态权限**:若依同款 `sys_menu` 动态路由 + 权限字符串(`certi:worker:add` 式)细粒度按钮控制 - **国密安全**:登录口令前端 SM3 摘要 + 后端 `salt$SM3(salt+hash)` 二次加盐存储 - **移动端**:uni-app(Vue2)小程序 / App,扫码、拍照、巡查场景 - **注册开通**:企业自助注册即开租户,扫码/上传双通道录入 ## 技术栈 | 层 | 技术 | |---|---| | 后端 | .NET 10 + FastEndpoints 8 + EF Core 10 + Npgsql | | 数据库 | PostgreSQL 17 | | 管理端 | Vue 3.5 + Vite 7 + Element Plus 2.11 + Pinia + ECharts 6 | | 移动端 | uni-app(Vue 2)小程序 / App | | 报告导出 | QuestPDF(社区版)+ MiniExcel + QRCoder | | 认证 | JWT Bearer(全局 Fallback 鉴权策略) | | 国密 | SM3 摘要(BouncyCastle) | ## 项目结构 ``` ├── CertiPass/ # 后端(.NET 10 Minimal API + FastEndpoints) │ ├── Endpoints/ # API 端点(认证/资质/设备/预警/导出/系统管理…) │ ├── Services/ # 业务服务(预警引擎/台账导出/Webhook 通知/种子初始化) │ ├── Entities/ # EF Core 实体(cp_* 业务表 + sys_* 系统表) │ ├── Framework/ # 多租户上下文、持久化基座 │ ├── Common/ # SM3、统一响应、全局异常 │ └── wwwroot/ # 扫码落地页 verify.html、上传目录 ├── vue3-sail/ # 管理端前端(Vue3 + Element Plus,若依风格) ├── app/ # 移动端(uni-app Vue2) └── sql/ # 数据库完整导出(表结构 + 演示数据) ``` ## 快速开始 ### 环境要求 - .NET SDK 10.0+ - Node.js 20.19+ 或 22.12+ - PostgreSQL 17(16 亦可) ### 1. 初始化数据库 创建数据库后导入本项目附带的完整 SQL(含表结构与演示数据): ```sql CREATE DATABASE "CertiPass"; ``` ```bash psql -U postgres -d CertiPass -f sql/certipass_full_export.sql ``` > 也可以选择跳过 SQL 文件、只启动后端:程序启动时会通过 EF Core 迁移自动建表并种子系统数据, > 但演示业务数据仍需执行 `sql/` 中种子部分。 ### 2. 配置连接串 仓库不提交含密钥的开发配置。先由模板生成本地配置,再编辑 `CertiPass/appsettings.Development.json`: ```bash cp appsettings.Development.json.example CertiPass/appsettings.Development.json ``` ```json { "ConnectionStrings": { "PostgresConnection": "Host=127.0.0.1;Port=5432;Database=CertiPass;Username=postgres;Password=你的密码" }, "Jwt": { "SecretKey": "改成不少于32位的随机强密钥" } } ``` ### 3. 启动后端 ```bash cd CertiPass dotnet run # 默认 http://localhost:5117,开发环境自带 Swagger ``` ### 4. 启动管理端 ```bash cd vue3-sail npm install npm run dev # 默认 http://localhost:8990(已加入后端 CORS 白名单) ``` ### 5. 移动端(可选) 用 HBuilderX 打开 `app/` 目录运行,或修改 `app/common/config.js` 中的后端基址 (真机/小程序调试请用局域网 IP,localhost 在小程序内不可达)。 ### 默认账号 | 账号 | 角色 | 说明 | |---|---|---| | `admin` | 超级管理员 | 全部权限 `*:*:*` | | `root` | 平台超管 | 平台运营视角,按权限串控制 | | `demo` | 企业管理员 | 租户隔离演示,仅合规业务模块 | 初始密码统一为 `Cert@2026`。⚠️ **部署前务必修改,并更换 JWT 密钥。** ## 数据库设计 15 张表(含 EF 迁移历史表),两类前缀: **业务表 `cp_*`(6 张)** | 表 | 说明 | |---|---| | `cp_tenants` | 租户(企业),套餐类型/到期/状态 | | `cp_tenant_settings` | 租户预警配置(webhook、邮箱、短信、阈值天数) | | `cp_worker_certificates` | 人员资质证书台账 | | `cp_special_equipments` | 特种设备定检台账(含检验机构电话) | | `cp_alert_logs` | 预警发送日志(通道留痕、去重) | | `cp_review_archives` | 复审/检验更新归档(新旧到期快照) | **系统表 `sys_*`(8 张,若依风格)** `sys_user` / `sys_role` / `sys_menu` / `sys_user_role` / `sys_role_menu` / `sys_dict_type` / `sys_dict_data` / `sys_config`,支撑动态菜单、RBAC 权限、字典与参数配置。 完整 DDL 见 [`sql/certipass_full_export.sql`](sql/certipass_full_export.sql)。 ## 预警机制 ``` 每日 07:30 (HostedService) 手动"立即盘点"(复用同一引擎) │ │ ▼ ▼ AlertScanEngine 全租户扫描 ──► 计算剩余天数 ──► 命中阈值(60/30/0) │ ├─► 企业微信 / 钉钉 / 飞书 群机器人 Webhook ├─► 邮件(SMTP) ├─► 短信(阿里云/腾讯云通道,自行接入) └─► cp_alert_logs 留痕(同目标同日去重) ``` ## API 规范 - 统一响应体:`{ code, msg, data }`,分页 `{ list, total }`(与若依前端约定一致) - 日期序列化为 `yyyy-MM-dd HH:mm:ss` - 除匿名端点(登录/注册/扫码落地页/uploads)外全局要求 JWT - 权限字符串与 `sys_menu.perms` 前后端一一对应 - 开发环境 Swagger:`http://localhost:5117/swagger` ## 部署 ```bash # 后端 dotnet publish -c Release -o publish # 管理端(产物 dist/ 交给 Nginx 等静态托管) npm run build:prod ``` Nginx 关键配置:前端静态目录 + `/api` 反代到后端;`wwwroot/uploads` 需可写。 QuestPDF 在 Linux 需安装中文字体(项目已内置 MiSans,随发布分发)。 ## 安全须知(发布前检查清单) - [ ] 修改 `admin/root/demo` 默认密码 - [ ] 更换 `Jwt:SecretKey` 为随机强密钥 - [ ] `appsettings*.json` 中的数据库密码、SMTP、微信 AppSecret 等不要提交(用环境变量覆盖) - [ ] 开启 HTTPS(JWT 与扫码链路依赖安全上下文) ## FAQ **Q:登录提示"用户名或密码错误"但账号是种子建的?** A:前端提交前做 SM3 摘要,数据库存的是 `salt$SM3(salt+SM3(明文))`;若手工 SQL 改密码请复用已有哈希串,不要写明文。 **Q:移动端连不上本地后端?** A:小程序/App 内 `localhost` 不可达,把基址改为开发机局域网 IP(如 `http://192.168.x.x:5117`)。 **Q:PDF 导出中文乱码 / 缺字?** A:确认 `wwwroot` 下字体文件随发布输出;Linux 服务器建议同时安装系统级中文字体。 **Q:多租户数据是怎么隔离的?** A:JWT Claim 携带 `tenant_id` → `ITenantContext` → EF Core 全局查询过滤器自动追加 `WHERE tenant_id = @t`。 ## 贡献 欢迎 Issue / PR:先提 Issue 说明场景与方案,再提交 PR(一个 PR 只做一件事,附本地验证说明)。 ## 开源协议 [MIT](LICENSE) —— 自由使用、修改、分发,保留版权声明即可。 依赖的 QuestPDF 为社区版许可(年营收 < 100 万美元可免费商用),商用前请自查各自组件协议。