定位: 面向电力施工企业的安全生产全流程数字化管理平台,覆盖业主、施工、监理、监管四方协同,实现安全管理的标准化、透明化、可追溯。
平台涵盖八大主菜单、20+业务模块,核心功能如下:
| 分类 | 模块 | 功能说明 |
|---|---|---|
| 🏠 工作台 | 待办任务 / 预警提醒 / 安全驾驶舱 / AI 智能助手 | 聚合待办、实时预警、数据可视化 |
| 🏢 组织管理 | 项目部 / 人员资质 / 安全管理机构 / 安全目标 / 制度法规 / 员工健康 | 组织架构与人员全生命周期管理 |
| 🚧 现场安全 | 隐患排查 / 危险作业审批 / 现场检查 / 风险管控 / 施工用电 / 安全检查考核 | 施工现场安全的全流程闭环 |
| 📚 教育培训 | 培训计划 / 在线学习 / 考试考核 / 学时台账 / 技术交底 / 安全文化 | 三级安全教育与考试体系 |
| 🔧 设备物资 | 特种设备 / 大型起重 / 施工机具 / 车辆管理 / 领用归还 / 设备预警 | 设备全生命周期台账管理 |
| 🆘 应急管理 | 安全会议 / 安全管理日志 / 应急预案 / 事故管理 / 专项安全方案 | 应急响应与事故闭环 |
| 📊 档案报表 | 统计报表 / 电子归档 / 安全文档生成 / 安全绩效看板 / 安全健康诊断 | 76项归档分类 + 30份文档模板 |
| ⚙️ 系统管理 | 用户与角色 / 授权管理 / 审计日志 / 系统配置 / 备份管理 | RBAC 权限管理与运维操作 |
截图:侧边栏菜单全景 
截图:工作台首页 
┌─────────────────────────────────────────────────────┐
│ 前端层 (PC / H5) │
│ Vue 3 + TypeScript + Element Plus / Vant │
│ Pinia 状态管理 / Vue Router / WebSocket 客户端 │
└────────────────────┬────────────────────────────────┘
│ REST API (JSON) + WebSocket
┌────────────────────▼────────────────────────────────┐
│ 网关层 (Nginx) │
│ 反向代理 / SSL 终止 / 限流 / 跨域 │
└────────────────────┬────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────┐
│ 后端层 (Django 6.0) │
│ Django REST Framework / SimpleJWT / Channels │
│ django-axes(登录锁定) / django-safedelete(软删除) │
│ Celery + Redis (异步任务 + 消息队列) │
│ django-guardian (对象级权限) / drf-spectacular (API)│
└────────────────────┬────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────┐
│ 数据层 │
│ MySQL 8.0 / PostgreSQL / SQLite (开发) │
│ Redis (缓存 + 会话 + WebSocket pub/sub) │
│ + 文件存储 (本地 / OSS) + 日志审计 (JSON) │
└─────────────────────────────────────────────────────┘
| 角色 | 职责范围 |
|---|---|
| 🏗️ 建设单位(业主) | 全局监督、数据查看、合规审查 |
| 🛠️ 施工单位 | 日常安全操作、作业审批、整改闭环 |
| 📋 监理单位 | 监督检查、验收确认、签字留痕 |
| 🏛️ 监管机构 | 数据抽检、合规审查、统计分析 |
面向运维人员: 环境要求、部署步骤、日常维护与故障处理。
软件支持三种部署模式,同一套代码,不改程序,只改配置。用户根据自身需求选择即可。
| 模式 | 应用服务器 | 数据库 | 文件存储 | 用户访问 | 适合场景 |
|---|---|---|---|---|---|
| 🏢 本地部署 | 公司内网服务器 | 本地 MySQL | 本地磁盘 | 公司内网访问 | 数据不出企业、 |
| 网络封闭的工地 | |||||
| ☁️ 云端部署 | 云服务器 | 云数据库 RDS | 云 OSS 存储 | 互联网任意访问 | 省运维、 |
| 多项目多地使用 | |||||
| 🔗 混合部署 | |||||
| (计算上云·数据留本地) | 云服务器 | 公司内网 MySQL | |||
| (通过 VPN 隧道) | 公司内网文件服务器 | ||||
| (通过 VPN 隧道) | 外网+内网皆可 | 要云端计算能力, | |||
| 但数据必须留在企业内部 |
💡 常见误解: 云部署 ≠ 数据上云。混合模式下,软件跑在云服务器上,但你的数据库和文件依然保存在公司内部服务器里。云服务器只是一个”远程操作台”,操作完的数据回传到你自己的数据库。
┌ 数据必须留在企业内部?
├── 是 → 公司有运维能力?
│ ├── 是 → 🏢 本地部署(最简单)
│ └── 否 → 🔗 混合部署(云服务器算,数据留本地)
└── 否 → 公司有固定运维人员?
├── 有 → 🏢 本地部署
└── 无 → ☁️ 云端部署(云服务商帮管数据库和备份)
| 组件 | 版本要求 | 说明 |
|---|---|---|
| Python | ≥ 3.14 | 后端运行环境 |
| Node.js | ≥ 20 | 前端编译 |
| MySQL | 8.0 | 生产数据库(可选 PostgreSQL) |
| Redis | 7.x | 缓存 + 消息队列 |
| Docker | ≥ 24 | 容器化部署(可选) |
| Nginx | ≥ 1.24 | 反向代理 |
开发环境可使用 SQLite,生产环境推荐 MySQL 8.0 或 PostgreSQL。
# 克隆项目
git clone <项目仓库地址> /opt/sa-power
cd /opt/sa-power
# 创建环境变量文件
cp .env.example .env
# 编辑 .env,填写 DJANGO_SECRET_KEY、MYSQL_ROOT_PASSWORD 等必要变量docker-compose.yml
位于项目根目录(src/docker-compose.yml),提供三种
profile:
# 开发模式(仅后端 + DB + Redis)
docker compose --profile dev up -d
# 完整模式(含前端 + Celery Worker + Beat)
docker compose --profile full up -d
# 生产模式(含 Nginx 反向代理)
docker compose --profile prod up -d# 检查容器状态
docker compose ps
# 查看后端日志
docker compose logs -f web
# 测试 API 是否正常
curl http://localhost:8000/api/health/应用服务器部署到云上,但数据库和上传文件留在公司内网。
┌─ 云服务器 ─────────────────────┐
│ Django APP(Nginx + Gunicorn) │
│ 前端 Vue (编译后静态文件) │
│ Redis (缓存,可放云上) │
└─────────────┬──────────────────┘
│ VPN 加密隧道
┌─────────────▼──────────────────┐
│ 公司内网服务器 │
│ MySQL 数据库 │
│ 上传文件存储(NFS / 本地磁盘) │
│ (可选)敏感 Redis │
└────────────────────────────────┘
内网服务器 — 准备好 MySQL 服务器和文件存储目录
建 VPN 隧道 — WireGuard(最简单)或 OpenVPN,打通云服务器和内网
# 内网服务器上安装 WireGuard,分配一个虚拟 IP(如 10.0.0.2)
# 云服务器上安装 WireGuard,也分配一个虚拟 IP(如 10.0.0.1)
# 两边配好密钥对,互相能 ping 通即可云服务器 .env 配置 — 数据库地址指向内网 IP
USE_MYSQL=True
MYSQL_HOST=10.0.0.2 ← 内网数据库的 WireGuard IP
MYSQL_PASSWORD=xxx
FILE_STORAGE=local
MEDIA_ROOT=/mnt/nfs/uploads ← 或挂载内网的 NFS 共享目录正常启动云服务器上的 Docker 或手动部署
三种部署模式的区别就是 .env
配置文件里的几行参数不同,其他完全一样。
| 配置项 | 🏢 本地部署 | ☁️ 云端部署 | 🔗 混合部署 |
|---|---|---|---|
| 应用服务器位置 | 公司内网 | 云服务器 | 云服务器 |
DJANGO_DEBUG |
False |
False |
False |
USE_MYSQL |
True |
True |
True |
MYSQL_HOST |
127.0.0.1 |
云数据库地址 |
内网 IP(VPN) |
MYSQL_DATABASE |
sa_power |
sa_power |
sa_power |
| 文件存储 | MEDIA_ROOT=本地路径 |
OSS / S3 配置 |
NFS 挂载路径 |
| 备份方式 | 本地 crontab | 云数据库自动备份 | 内网 crontab |
切换模式只需换
.env文件 + 迁移数据,不涉及程序代码的任何修改。
如果之前用本地部署,现在想上云,数据迁移步骤:
# 1. 在本地服务器导出数据库
mysqldump -u root -p sa_power_db > export.sql
# 2. 把文件传到云服务器
scp export.sql user@云服务器:/tmp/
# 3. 导入云数据库
mysql -h 云数据库地址 -u admin -p sa_power_db < /tmp/export.sql
# 4. 上传文件从本地拷贝到云存储(OSS/S3)
# 5. 换 `.env` 配置,重启服务# 创建 Python 虚拟环境
python3 -m venv .venv
source .venv/bin/activate
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
export DJANGO_SECRET_KEY="your-generated-secret-key"
export DJANGO_DEBUG=False
export DJANGO_ALLOWED_HOSTS=localhost,your-domain.com
export USE_MYSQL=True
export MYSQL_PASSWORD=your-db-password
# 数据库迁移
python manage.py migrate
# 收集静态文件
python manage.py collectstatic --noinput
# 启动后端服务(开发)
python manage.py runserver 0.0.0.0:8000
# 或使用 Gunicorn(生产)
gunicorn config.wsgi:application -w 4 -b 0.0.0.0:8000cd frontend
# 安装依赖
npm install
# 编译生产版本
npm run build
# 开发模式(热更新)
npx vite --port 3000cd h5
# 安装依赖
npm install
# 编译
npm run build
# 开发模式
npx vite --port 3002项目根目录提供 src/nginx.conf
配置文件。典型配置要点:
# API 反向代理
location /api/ {
proxy_pass http://127.0.0.1:8000;
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;
}
# WebSocket 代理
location /ws/ {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 前端静态文件
location / {
root /path/to/frontend/dist;
try_files $uri $uri/ /index.html;
}
安全提示: 生产环境请配置 SSL 证书(Let’s Encrypt 免费证书),并开启 HSTS。
本地部署 / 混合部署:
# MySQL 备份到内网存储
mysqldump -u root -p sa_power_db > /data/backup/backup_$(date +%Y%m%d).sql
# 建议设置 crontab 自动备份
0 2 * * * mysqldump -u root -p密码 sa_power_db > /data/backup/daily_$(date +\%Y\%m\%d).sql云端部署: - 使用云数据库的自动备份功能(阿里云 RDS 每天自动备份,保留 7~30 天) - 也可每月一次手动拉回本地存档
mysqldump -h 云数据库地址 -u admin -p sa_power_db > local_backup_$(date +%Y%m%d).sql# MySQL 恢复
mysql -u root -p sa_power_db < backup_20260601.sql
python manage.py migrate# Django 应用日志
tail -f logs/app.log
# 审计日志
tail -f logs/audit.log
# Docker 日志
docker compose logs -f --tail=100 web# 拉取最新代码
git pull
# 更新后端依赖
source .venv/bin/activate
pip install -r requirements.txt
# 执行数据库迁移
python manage.py migrate
# 更新前端
cd frontend && npm install && npm run build
# 重启服务
# Docker 部署:
docker compose restart web
# 手动部署:
systemctl restart sa-power # 或 supervisorctl restart# 检查端口占用
lsof -i :8000
# 终止占用进程
kill -9 <PID>
# 或更换端口
python manage.py runserver 0.0.0.0:8001# 检查数据库服务是否运行
systemctl status mysql
# 检查数据库凭证(.env 文件)
# 确认 DB_NAME / DB_USER / DB_PASSWORD 正确
# 测试连接
mysql -u sa_power_user -p -h 127.0.0.1 -e "SELECT 1"# 检查文件权限
ls -la db.sqlite3
chmod 644 db.sqlite3
# Django 密钥检查
# 确保 DJANGO_SECRET_KEY 环境变量已设置且有效
# 日志文件权限
chmod -R 755 logs/# 确认 daphne/Channels 已运行
# 生产环境需配置 Nginx WebSocket 代理(参见上方 Nginx 配置)
# 检查 Redis 是否可访问
redis-cli ping # 应返回 PONG面向系统管理员: 平台内置的安全机制与合规保障,帮助您满足等保 2.0 三级、数据安全法等监管要求。
平台对敏感数据采用 EncryptedCharField /
EncryptedTextField 自动加密:
| 字段 | 加密方式 | 涉及模块 |
|---|---|---|
| 身份证号 | AES + Fernet | 人员管理(sa_personnel) |
| 手机号 | AES + Fernet | 人员管理(sa_personnel) |
| 家庭住址 | AES + Fernet | 人员管理(sa_personnel) |
| 供应商联系方式 | AES + Fernet | 物资管理(sa_material) |
| 电子签名数据 | AES + Fernet | 签名模块(sa_signature) |
| CA 私钥 | AES + Fernet | 签名模块(sa_signature) |
加密密钥从 DJANGO_SECRET_KEY
派生,或通过 ENCRYPTION_KEY
环境变量独立设置。
0o640,防止未授权访问截图:双因素认证设置界面 
平台采用精细化的 基于角色的访问控制(RBAC),权限颗粒度细至单操作:
| 层级 | 说明 | 数量 |
|---|---|---|
| 角色模板 | 预定义的权限集合 | 8 种 |
| 授权码 | 最小权限单元 | 39 项 |
| 范围限定 | 按项目/公司级限定 | 动态 |
8 种角色权限对比:
| 角色 | 权限特征 |
|---|---|
| 超级管理员 | 39 项全部权限 |
| 法人 | 公司级查看 + 授权管理 |
| 安全总监 | 公司/项目级安全监督 |
| 项目安全员 | 项目级安全操作 |
| 项目经理 | 项目全流程管理 |
| 施工队长 | 班组级协作 |
| 公司职员 | 个人事务 |
| 班组成员 | 基础操作 |
grant_role_permissions()
自动为用户分配角色权限所有关键操作由 AuditLog
模型自动记录,支持:
审计日志通过 AuditModel
基类自动集成,新增模型只需继承即可获得审计能力。审计日志不可删除(仅软删除),满足等保
4.1.6 审计要求。
截图:审计日志列表 
提示: 管理员可在「系统管理 → 审计日志」页面查看和搜索所有日志记录。
| 等保要求 | 对应实现 |
|---|---|
| 4.1.3 访问控制 | RBAC 权限模型 + 8 角色 + 39 授权码 |
| 4.1.6 安全审计 | AuditLog 全量审计 + JSON 结构化日志 |
| 4.3.4 登录安全 | django-axes(5 次锁定 15 分钟)+ 密码 12 位 |
| 4.3.7 剩余信息保护 | django-safedelete 软删除 + 安全擦除 |
| 5.1.3 数据加密 | 字段级加密(Fernet)+ HTTPS 传输 |
| 5.5.1 开发与生产隔离 | settings_production.py 独立配置 |
| 会话管理 | JWT 30 分钟过期 + HTTPOnly Cookie + SameSite=Lax |
依据《个人信息保护法》第 29 条,敏感个人信息需取得个人单独同意:
*_consent
布尔字段*_consent_date、*_consent_text)| 安全策略 | 配置值 |
|---|---|
| Token 类型 | JWT(Bearer)+ TokenAuthentication |
| Access Token 有效期 | 30 分钟 |
| Refresh Token 有效期 | 1 天(支持轮换) |
| Session Cookie | HTTPOnly + Secure + SameSite=Lax |
| 浏览器关闭会话 | 生产环境可配置为保持或清除 |
| XSS 防护 | CSP 策略 + HttpOnly Cookie |
| CSRF 防护 | CSRF Cookie Secure + Referer 校验 |
| 登录失败锁定 | 5 次失败 → 锁定 15 分钟 |
作为系统管理员,建议定期执行以下操作:
DJANGO_SECRET_KEY,执行字段重加密系统设置与管理模块涵盖用户管理、角色权限、通知模板配置、系统配置、授权码管理和电子档案归档管理六大功能,是整个系统的运维管理中心。
截图:用户管理列表 
系统通过 Django 认证体系 + 员工信息模型实现用户全生命周期管理。用户账号自动关联员工信息,手机号作为登录用户名。
新建用户 → 创建员工自动生成账号
E26001)编辑用户信息
禁用/启用用户账号
True → 正常登录;False →
禁止登录EncryptedCharField
加密存储id_card_consent、phone_consent)采用 RBAC(Role-Based Access Control)模型,包含 8 种预设角色和 39 项授权码。
| 角色 | 角色代码 | 说明 |
|---|---|---|
| 超级管理员 | super_admin |
拥有全部权限,is_superuser=True |
| 法人 | legal_person |
公司法定代表人,核心管理权限 |
| 安全总监 | safety_director |
公司级安全管理负责人 |
| 项目安全员 | project_safety_officer |
项目部专职安全管理人员 |
| 项目经理 | project_manager |
项目部负责人 |
| 施工队长 | team_leader |
施工队/班组负责人 |
| 公司职员 | office_staff |
公司职能部门人员 |
| 班组成员 | member |
一线操作工人 |
授权码按功能域分为以下几类:
危险作业审批 permit_create |
permit_approve_1 | permit_approve_2 |
permit_approve_3 permit_issue |
permit_close
分包与危大工程 subcontract_approve |
subcontract_audit | hazard_eng_manage
安全教育培训 train_org_company |
train_org_project | train_org_team |
train_exam
安全技术交底 disclosure_give |
disclosure_receive
违章与检查 violation_entry |
violation_process | inspection_exec
事故管理 accident_report |
accident_investigate
证书与方案 cert_manage |
plan_edit | plan_approve
班前会 meeting_org |
meeting_review | meeting_participate
安全检查与防护 safety_confirm |
hazard_report | safety_officer_report |
ppe_confirm
数据查看范围 view_self |
view_team | view_squad |
view_project | view_all
系统管理 sys_user |
sys_auth | sys_config |
sys_audit
为用户分配角色
UserRole 记录 →
批量授予该角色的所有授权码手动配置授权码
撤销授权
is_active 设置为
False(不删除记录,保证审计链完整性)系统支持配置安全生产委员会、项目安全领导小组等机构:
系统提供多通道通知能力,支持站内信、邮件、短信和 WebSocket 推送。
| 模板类型 | 说明 |
|---|---|
hazard_auto_report |
重大隐患自动上报通知 |
training_reminder |
培训提醒通知 |
training_overdue |
培训到期提醒通知 |
approval_request |
审批请求通知 |
approval_completed |
审批完成通知 |
system_alert |
系统告警通知 |
编辑通知模板
{{ hazard.title }} - 重大隐患上报配置升级规则
支持隐患超期未审、整改超期未完、证书即将过期、工作票逾期四类事件的逐级升级:
系统配置通过 SystemConfig
模型管理,支持安全策略、密码策略、会话超时等功能。
| 配置项 | 说明 | 默认值 |
|---|---|---|
| 安全策略 | 登录失败锁定次数、锁定时间 | 5 次/30 分钟 |
| 密码策略 | 密码最小长度、复杂度要求 | 8 位含字母+数字 |
| 会话超时 | 登录会话有效期、无操作超时时间 | 480 分钟/30 分钟 |
| 2FA 策略 | 是否强制双因素认证 | 可选开启 |
| 审计日志保留 | 操作日志保留天数 | 180 天 |
ConfigChangeLogAuditLog授权(Authorization)是系统的最小权限单元,每个授权码对应一个具体操作。
auth_code):程序唯一标识(如
permit_create)auth_name):中文描述(如”新建作业票”)project):公司级或特定项目expire_at):支持限时授权查看用户授权清单
批量授予/撤销
角色一键授权
Authorization 记录系统支持按制度要求自动创建和管理电子档案,符合等保 2.0 合规要求。
按 7 大类 76 项进行归档:
| 大类 | 代码 | 说明 |
|---|---|---|
| 教育培训与人员资质 | EDU | 培训记录、证书等 |
| 安全检查与考核 | CHK | 检查记录、整改等 |
| 隐患排查与危险源 | HAZ | 隐患台账、危险源等 |
| 会议与交底 | MET | 会议纪要、交底记录 |
| 事故与应急 | ACC | 事故报告、应急演练 |
| 设备物资与工器具 | EQP | 设备台账、检验等 |
| 综合管理 | GEN | 其他综合档案 |
收集中 → 待冻结 → 已冻结 → 补录窗口期 → 已封存 → 待销毁 → 已销毁
创建归档
YEAR-CAT-SEQ)冻结与封存
sealed)档案销毁
destroy_date、destroy_reason)ArchiveLog归档的原则:归档操作必须人工完成,系统不会自动冻结。归档后的数据不可篡改,只能追加材料直到封存。
面向系统管理员: 组织架构是系统运行的基础骨架,合理的组织层级设计决定了权限分配、审批流程和数据隔离的有效性。
截图:人员管理列表 
系统支持四级组织层级:
| 层级 | 说明 | 示例 |
|---|---|---|
| 公司级 | 法人实体,顶层组织 | 云南某电力工程有限公司 |
| 部门级 | 公司下属职能部门 | 安全部、工程部、物资部 |
| 项目部级 | 具体项目实施单位 | 大桥水电站项目部 |
| 班组级 | 项目部下属作业班组 | 安装一班、电气二班 |
创建组织: 1. 进入【组织架构】页面,默认展示树形结构 2. 点击父级组织的【添加子级】按钮 3. 填写组织名称、类型、负责人等信息 4. 点击【保存】完成创建
支持的操作: - 编辑组织信息 - 调整组织层级 - 停用/启用组织 - 查看组织下的人员和设备
项目管理是在组织架构基础上的进一步细化,用于管理不同工程项目的业务数据。
项目管理要点: - 项目需挂靠在某个部门或项目部下 - 项目可设置专属的安全目标、检查计划 - 项目数据默认隔离,不同项目间不可见