【应急演练子系统】项目总结:从0到1搭建应急演练系统的完整复盘
一、项目概述
1.1 项目背景
企业应急演练是安全生产的重要环节,但传统管理方式存在诸多痛点:
- 演练计划制定依赖人工,效率低且不统一
- 演练过程记录不规范,难以追溯
- 应急预案分散管理,知识复用困难
- 缺乏智能化工具辅助决策
1.2 项目目标
在3周内,从零构建一套功能完整的应急演练管理子系统:
核心目标:
├── 演练全流程管理
│ ├── 演练计划制定
│ ├── 任务分配执行
│ ├── 执行跟踪反馈
│ └── 评估报告生成
├── AI智能助手
│ ├── RAG知识库问答
│ ├── 演练方案自动生成
│ └── 对话式计划创建
└── 集成能力
├── 飞书机器人
├── 微信/QQ登录
└── Docker一键部署
1.3 项目成果
| 维度 |
成果 |
| 功能 |
3个Sprint完成全部计划功能 |
| 代码 |
约3000行Python代码 |
| API |
25+ RESTful接口 |
| 测试 |
86%代码覆盖率 |
| 文档 |
10+篇技术文档 |
| 部署 |
Docker一键部署方案 |
二、技术架构总结
2.1 系统架构图
┌─────────────────────────────────────────────────────────────────┐
│ 用户层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Web管理后台│ │ 移动端 │ │ 飞书机器人│ │ 微信/QQ │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
└───────┼─────────────┼─────────────┼─────────────┼───────────────┘
│ │ │ │
└─────────────┼─────────────┼─────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ API网关层 (FastAPI) │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ JWT认证 │ CORS │ 限流 │ 安全中间件 │ 全局异常处理 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────┼──────────────────────────────┐ │
│ │ 路由层 (API Router) │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │认证路由│ │计划路由│ │任务路由│ │AI路由 │ │飞书路由│ │ │
│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────┼──────────────────────────────┐ │
│ │ 业务逻辑层 (Service) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │UserService│ │DrillService│ │LLMService │ │ │
│ │ │RAGService │ │FeishuService│ │ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────┼──────────────────────────────┐ │
│ │ 数据访问层 (CRUD) │ │
│ │ ┌────────────────────────────────────────────────────┐ │ │
│ │ │ BaseCRUD<Model> ├── create() ├── get() │ │ │
│ │ │ ├── update() ├── remove() ├── get_multi() │ │ │
│ │ └────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────┼───────────────────────────────────┐
│ 数据层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ MySQL 8 │ │ Redis 7 │ │ ChromaDB │ │
│ │ (关系数据) │ │ (缓存/会话) │ │ (向量数据) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
2.2 技术栈一览
| 层级 |
技术选型 |
版本 |
作用 |
| 后端框架 |
FastAPI |
0.109 |
高性能API框架 |
| ORM |
SQLAlchemy |
2.0 |
数据库ORM |
| 迁移工具 |
Alembic |
1.13 |
数据库版本管理 |
| 验证层 |
Pydantic |
2.5 |
数据验证 |
| 数据库 |
MySQL |
8.0 |
关系型数据存储 |
| 缓存 |
Redis |
7 |
会话、Token管理 |
| 向量库 |
ChromaDB |
0.4 |
文档向量存储 |
| AI框架 |
LangChain |
0.1 |
LLM应用框架 |
| LLM |
DashScope |
- |
阿里云通义模型 |
| 部署 |
Docker |
- |
容器化部署 |
三、核心功能实现
3.1 用户认证与权限
实现亮点:
- 双令牌机制 - Access Token + Refresh Token,兼顾安全性和用户体验
- Token黑名单 - 登出时将Token加入Redis黑名单,支持主动失效
- 登录限流 - 5次失败锁定5分钟,防止暴力破解
- 多登录方式 - 用户名密码、手机号、微信、QQ
# 双令牌生成
def login(self, username, password):
user = authenticate(username, password)
# Access Token (短期)
access_token = create_access_token({
"sub": str(user.id),
"username": user.username,
"roles": get_user_roles(user.id)
}, expires_delta=timedelta(minutes=30))
# Refresh Token (长期)
refresh_token = create_refresh_token({
"sub": str(user.id)
}, expires_delta=timedelta(days=7))
# 存储Refresh Token到Redis
redis.set(f"user:{user.id}:refresh_token", refresh_token)
return {"access_token": access_token, "refresh_token": refresh_token}
# 登出 - Token加入黑名单
def logout(self, access_token, refresh_token):
# Access Token加入黑名单
add_token_to_blacklist(access_token)
# 删除Redis中的Refresh Token
user_id = decode_token(access_token)["sub"]
redis.delete(f"user:{user_id}:refresh_token")
3.2 演练全流程管理
演练计划
│
├── 制定计划(支持AI生成)
│
├── 创建任务(可批量)
│
▼
演练任务 ──执行──▶ 演练执行记录
│ │
│ ├── 开始时间(自动)
│ ├── 结束时间(自动)
│ ├── 地点
│ ├── 过程记录
│ └── 安全确认
│
└── 评估反馈
│
├── 问题描述
├── 改进建议
├── 综合评分
└── 评估结论
3.3 AI智能助手
三大核心能力:
| 能力 |
实现方案 |
技术亮点 |
| RAG知识库问答 |
ChromaDB + DashScope |
文档解析、分块、向量化、检索 |
| 演练方案生成 |
LLM Prompt Engineering |
结构化JSON输出、降级模板 |
| 对话式计划创建 |
状态机 + 多轮对话 |
收集信息、一键创建计划 |
四、代码质量保障
4.1 分层架构
┌────────────────────────────────────────┐
│ API Layer (Router) │ 接收请求、参数校验
├────────────────────────────────────────┤
│ Service Layer │ 业务逻辑、事务管理
├────────────────────────────────────────┤
│ CRUD Layer │ 数据访问、封装
├────────────────────────────────────────┤
│ Model Layer │ 数据模型、关系定义
├────────────────────────────────────────┤
│ Database / Cache │ 数据存储
└────────────────────────────────────────┘
4.2 统一响应格式
class ResponseModel(BaseModel):
code: int = 200 # 状态码
message: str = "success"
data: Any = None # 数据
# 所有API返回格式统一
{
"code": 200,
"message": "操作成功",
"data": { ... }
}
4.3 全局异常处理
# 自定义业务异常
class BusinessException(Exception):
def __init__(self, message: str, code: int = 400):
self.message = message
self.code = code
# 全局异常处理器
@app.exception_handler(BusinessException)
async def business_exception_handler(request, exc):
return JSONResponse(
status_code=200, # FastAPI返回200,前端看code判断
content={"code": exc.code, "message": exc.message}
)
五、部署与运维
5.1 Docker一键部署
# docker-compose.yml 核心配置
services:
app:
build: .
ports:
- "8080:8080"
environment:
- MYSQL_HOST=mysql
- REDIS_HOST=redis
- LLM_API_KEY=${LLM_API_KEY}
volumes:
- ./uploads:/app/uploads
- ./logs:/app/logs
depends_on:
mysql:
condition: service_healthy
restart: always
mysql:
image: mysql:8.0
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
interval: 10s
retries: 5
redis:
image: redis:7-alpine
5.2 环境配置
# .env.production
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_PASSWORD=secure_password
MYSQL_DATABASE=emergency_drill
REDIS_HOST=redis
REDIS_PORT=6379
JWT_SECRET_KEY=your-very-long-secret-key
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=30
LLM_API_KEY=your-dashscope-api-key
LLM_MODEL=qwen-plus
FEISHU_APP_ID=your-feishu-app-id
FEISHU_APP_SECRET=your-feishu-app-secret
5.3 部署检查清单
| 检查项 |
命令 |
预期结果 |
| 服务启动 |
docker-compose up -d |
无错误 |
| 健康检查 |
curl localhost:8080/health |
{"status": "healthy"} |
| 数据库连接 |
访问 /docs |
Swagger正常加载 |
| AI功能 |
调用 /api/ai/chat |
返回回答 |
六、项目指标
6.1 交付指标
| 指标 |
目标 |
实际 |
完成率 |
| 功能交付 |
100% |
100% |
100% |
| 代码质量 |
覆盖率>80% |
86% |
107% |
| Sprint准时率 |
90% |
100% |
111% |
| Bug修复率 |
95% |
100% |
105% |
| 文档完整性 |
完整 |
完整 |
100% |
6.2 性能指标
| 指标 |
数值 |
说明 |
| API响应时间(P99) |
150ms |
99%请求在150ms内响应 |
| 并发支持 |
100+ |
支持100+同时在线用户 |
| AI问答响应时间 |
3-5s |
含网络延迟 |
| 系统可用性 |
99.5% |
生产环境目标 |