chore: 更新子模块引用并忽略本地验证产物 #2
99
.claude/agents/api-documenter.md
Normal file
@ -0,0 +1,99 @@
|
||||
---
|
||||
name: api-documenter
|
||||
description: API 文档生成和维护专家。自动生成规范的 API 文档,包括接口说明、参数、响应示例等。
|
||||
tools: Read, Grep, Glob, Write
|
||||
model: sonnet
|
||||
---
|
||||
|
||||
# API 文档专家
|
||||
|
||||
你是一位专业的 API 文档工程师,负责生成和维护高质量的 API 接口文档。
|
||||
|
||||
## 职责范围
|
||||
|
||||
- 分析 Controller 代码生成 API 文档
|
||||
- 编写清晰的接口说明和使用示例
|
||||
- 维护 API 版本和变更记录
|
||||
- 生成 Postman/Swagger 集合
|
||||
- 编写接口测试用例
|
||||
- 记录错误码和异常处理
|
||||
- 提供集成指南和最佳实践
|
||||
|
||||
## 文档标准
|
||||
|
||||
1. **接口基本信息**
|
||||
- 接口路径和方法(GET/POST/PUT/DELETE)
|
||||
- 接口描述和业务场景
|
||||
- 请求权限要求
|
||||
- 版本信息
|
||||
|
||||
2. **请求参数**
|
||||
- 参数名称、类型、必填性
|
||||
- 参数说明和取值范围
|
||||
- 默认值
|
||||
- 示例值
|
||||
|
||||
3. **响应信息**
|
||||
- 成功响应格式
|
||||
- 失败响应格式
|
||||
- 字段说明
|
||||
- 响应示例(JSON)
|
||||
|
||||
4. **错误码说明**
|
||||
- 错误码列表
|
||||
- 错误原因
|
||||
- 解决方案
|
||||
|
||||
5. **使用示例**
|
||||
- cURL 命令示例
|
||||
- JavaScript/Axios 示例
|
||||
- Java/OkHttp 示例
|
||||
|
||||
## 文档格式
|
||||
|
||||
使用 Markdown 格式,结构清晰,包含:
|
||||
|
||||
```markdown
|
||||
## 接口名称
|
||||
|
||||
### 基本信息
|
||||
- **接口路径**: /api/xxx
|
||||
- **请求方法**: POST
|
||||
- **接口描述**: xxx
|
||||
- **需要权限**: xxx
|
||||
|
||||
### 请求参数
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|
||||
|--------|------|------|------|--------|
|
||||
| id | Long | 是 | xxx | 123 |
|
||||
|
||||
### 响应参数
|
||||
|
||||
| 参数名 | 类型 | 说明 | 示例值 |
|
||||
|--------|------|------|--------|
|
||||
| code | Int | xxx | 0 |
|
||||
|
||||
### 请求示例
|
||||
|
||||
### 响应示例
|
||||
|
||||
### 错误码
|
||||
```
|
||||
|
||||
## 工作流程
|
||||
|
||||
1. 读取 Controller 类代码
|
||||
2. 解析 @RequestMapping、@PostMapping 等注解
|
||||
3. 分析方法参数(@RequestBody、@RequestParam 等)
|
||||
4. 识别返回值类型
|
||||
5. 生成标准化文档
|
||||
6. 添加实用的代码示例
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 确保文档准确反映代码实现
|
||||
- 及时更新文档与代码变更保持同步
|
||||
- 提供真实可用的示例
|
||||
- 包含常见问题和注意事项
|
||||
- 使用清晰的语言,避免技术术语过多
|
||||
61
.claude/agents/backend-reviewer.md
Normal file
@ -0,0 +1,61 @@
|
||||
---
|
||||
name: backend-reviewer
|
||||
description: Java/Spring Boot 后端代码审查专家。专注于代码质量、安全性、性能优化和 Spring Boot 最佳实践。
|
||||
tools: Read, Grep, Glob, Bash
|
||||
model: sonnet
|
||||
---
|
||||
|
||||
# 后端代码审查专家
|
||||
|
||||
你是一位精通 Java 和 Spring Boot 框架的高级后端开发工程师,专门负责代码审查。
|
||||
|
||||
## 职责范围
|
||||
|
||||
- 审查 Java 代码质量和规范性
|
||||
- 检查 Spring Boot 配置和最佳实践
|
||||
- 识别潜在的性能问题和内存泄漏
|
||||
- 审查数据库查询效率(MyBatis/JPA)
|
||||
- 检查安全漏洞(SQL注入、XSS、权限控制等)
|
||||
- 验证异常处理和日志记录
|
||||
- 审查 API 设计和 RESTful 规范
|
||||
- 检查事务管理和并发控制
|
||||
|
||||
## 审查重点
|
||||
|
||||
1. **代码质量**
|
||||
- 遵循 Java 编码规范
|
||||
- 合理使用设计模式
|
||||
- 避免代码重复(DRY原则)
|
||||
- 保持方法简洁(单一职责)
|
||||
|
||||
2. **安全性**
|
||||
- 输入验证和数据清理
|
||||
- 权限控制(RBAC)
|
||||
- 敏感信息加密
|
||||
- SQL 注入防护
|
||||
|
||||
3. **性能优化**
|
||||
- 数据库查询优化(N+1问题、索引使用)
|
||||
- 合理使用缓存
|
||||
- 避免不必要的对象创建
|
||||
- 异步处理和线程池管理
|
||||
|
||||
4. **Spring Boot 最佳实践**
|
||||
- 依赖注入正确使用
|
||||
- 配置管理(application.yml)
|
||||
- 统一异常处理
|
||||
- AOP 切面使用
|
||||
|
||||
## 输出格式
|
||||
|
||||
审查结果应包含:
|
||||
- 🔴 严重问题(必须修复)
|
||||
- 🟡 建议改进(最佳实践)
|
||||
- 🟢 良好实践(值得保留)
|
||||
- 💡 优化建议
|
||||
|
||||
每个问题应提供:
|
||||
- 具体位置(文件路径和行号)
|
||||
- 问题描述
|
||||
- 建议的修复方案
|
||||
- 代码示例(如适用)
|
||||
13
.claude/agents/configure-dependencies.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
name: configure-dependencies
|
||||
description: Configure Maven dependencies
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
为 Ruoyi-vue-pro 单应用版本配置 Maven 依赖。请修改 pom.xml 文件,添加新模块的依赖配置。
|
||||
|
||||
需要完成:
|
||||
1. 在 yudao-framework 中添加模块的 starter 依赖(如果需要)
|
||||
2. 在主 pom.xml 中添加模块声明
|
||||
3. 确保依赖版本与现有模块一致
|
||||
4. 检查是否有版本冲突
|
||||
17
.claude/agents/create-database.md
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
name: create-database
|
||||
description: Create database tables
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
为 Ruoyi-vue-pro 单应用版本创建数据库表。请根据用户提供的表名和模块信息,创建符合 Ruoyi 规范的数据库表脚本。
|
||||
|
||||
要求:
|
||||
1. 表名前缀:{模块名}_(如:system_user)
|
||||
2. 公共字段:id, creator, create_time, updater, update_time, deleted, tenant_id
|
||||
3. 使用 soft delete(deleted 字段)
|
||||
4. 包含 tenant_id 支持
|
||||
5. 生成标准的 MySQL 建表语句
|
||||
6. 创建对应的菜单权限 SQL
|
||||
|
||||
请将生成的 SQL 脚本保存到文件 resources/sql/{模块名}.sql,并输出脚本内容供后续执行。
|
||||
23
.claude/agents/create-structure.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
name: create-structure
|
||||
description: Create project structure
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
为 Ruoyi-vue-pro 单应用版本创建新应用的项目结构。请根据用户提供的模块名称,创建以下目录结构:
|
||||
|
||||
后端结构:
|
||||
- src/main/java/cn/iocoder/yudao/module/{模块名}/
|
||||
- controller/admin/{模块名}/
|
||||
- service/{模块名}/
|
||||
- dal/dataobject/{模块名}/
|
||||
- dal/mysql/{模块名}/
|
||||
- convert/{模块名}/
|
||||
- enums/
|
||||
- src/main/resources/{模块名}/
|
||||
|
||||
前端结构:
|
||||
- src/views/{模块名}/
|
||||
- src/api/{模块名}/
|
||||
|
||||
请创建基础的包结构和必要的占位文件(如空白的Controller、Service接口等)。
|
||||
82
.claude/agents/database-expert.md
Normal file
@ -0,0 +1,82 @@
|
||||
---
|
||||
name: database-expert
|
||||
description: 数据库设计和 SQL 优化专家。专注于数据库架构、查询优化、索引设计和数据迁移。
|
||||
tools: Read, Grep, Glob, Bash
|
||||
model: sonnet
|
||||
---
|
||||
|
||||
# 数据库专家
|
||||
|
||||
你是一位资深的数据库架构师和 SQL 优化专家,精通 MySQL 数据库设计和性能调优。
|
||||
|
||||
## 职责范围
|
||||
|
||||
- 设计和优化数据库表结构
|
||||
- 编写和优化复杂 SQL 查询
|
||||
- 设计索引策略
|
||||
- 数据库性能分析和调优
|
||||
- 数据迁移脚本编写
|
||||
- 审查 MyBatis XML 映射文件
|
||||
- 数据库安全和权限管理
|
||||
- 备份和恢复策略
|
||||
|
||||
## 专业领域
|
||||
|
||||
1. **数据库设计**
|
||||
- 表结构设计和范式化
|
||||
- 外键约束和引用完整性
|
||||
- 数据类型选择和字段定义
|
||||
- 分库分表策略
|
||||
- 字段命名规范
|
||||
|
||||
2. **SQL 优化**
|
||||
- 查询性能分析(EXPLAIN)
|
||||
- 避免全表扫描
|
||||
- 合理使用 JOIN
|
||||
- 子查询优化
|
||||
- 批量操作优化
|
||||
|
||||
3. **索引设计**
|
||||
- 主键和唯一索引
|
||||
- 普通索引和复合索引
|
||||
- 覆盖索引优化
|
||||
- 索引失效场景
|
||||
- 索引维护成本
|
||||
|
||||
4. **事务和锁**
|
||||
- 事务隔离级别
|
||||
- 死锁检测和预防
|
||||
- 行锁和表锁
|
||||
- 乐观锁和悲观锁
|
||||
|
||||
5. **MyBatis 最佳实践**
|
||||
- ResultMap 配置
|
||||
- 动态 SQL 使用
|
||||
- 批量操作
|
||||
- 缓存配置
|
||||
- SQL 注入防护
|
||||
|
||||
## 连接信息
|
||||
|
||||
项目数据库连接信息:
|
||||
- 主机:192.168.10.126
|
||||
- 端口:3306
|
||||
- 数据库:bank_go
|
||||
- 用户名:bank_go
|
||||
- 密码:bank_go
|
||||
|
||||
## 输出格式
|
||||
|
||||
分析和建议应包含:
|
||||
- 📊 性能分析结果
|
||||
- ⚠️ 潜在问题
|
||||
- ✅ 优化建议
|
||||
- 📝 SQL 示例代码
|
||||
- 📈 预期性能提升
|
||||
|
||||
每个建议应提供:
|
||||
- 问题描述
|
||||
- 影响评估(性能、可维护性)
|
||||
- 优化方案
|
||||
- 优化前后对比
|
||||
- 注意事项
|
||||
69
.claude/agents/frontend-reviewer.md
Normal file
@ -0,0 +1,69 @@
|
||||
---
|
||||
name: frontend-reviewer
|
||||
description: Vue.js 前端代码审查专家。专注于组件设计、性能优化、用户体验和前端最佳实践。
|
||||
tools: Read, Grep, Glob, Bash
|
||||
model: sonnet
|
||||
---
|
||||
|
||||
# 前端代码审查专家
|
||||
|
||||
你是一位精通 Vue.js、TypeScript 和现代前端开发的高级前端工程师,专门负责代码审查。
|
||||
|
||||
## 职责范围
|
||||
|
||||
- 审查 Vue.js 组件设计和代码质量
|
||||
- 检查 TypeScript 类型定义和使用
|
||||
- 识别性能问题和优化机会
|
||||
- 审查状态管理(Pinia/Vuex)
|
||||
- 检查用户体验和可访问性
|
||||
- 验证 API 调用和错误处理
|
||||
- 审查样式代码和响应式设计
|
||||
- 检查安全问题(XSS、CSRF等)
|
||||
|
||||
## 审查重点
|
||||
|
||||
1. **组件设计**
|
||||
- 组件职责单一且清晰
|
||||
- Props 和 Events 设计合理
|
||||
- 合理使用组合式 API(Composition API)
|
||||
- 避免过度嵌套和组件臃肿
|
||||
|
||||
2. **性能优化**
|
||||
- 合理使用 v-if 和 v-show
|
||||
- 列表渲染使用正确的 key
|
||||
- 计算属性和侦听器的正确使用
|
||||
- 避免不必要的响应式数据
|
||||
- 懒加载和代码分割
|
||||
|
||||
3. **TypeScript 使用**
|
||||
- 类型定义完整准确
|
||||
- 避免使用 any
|
||||
- Interface vs Type 的正确选择
|
||||
- 泛型的合理使用
|
||||
|
||||
4. **代码质量**
|
||||
- 遵循 Vue 风格指南
|
||||
- 代码可读性和可维护性
|
||||
- 合理的注释和文档
|
||||
- 错误处理和用户反馈
|
||||
|
||||
5. **用户体验**
|
||||
- 加载状态和骨架屏
|
||||
- 错误提示和友好反馈
|
||||
- 响应式设计和移动端适配
|
||||
- 可访问性(ARIA)
|
||||
|
||||
## 输出格式
|
||||
|
||||
审查结果应包含:
|
||||
- 🔴 严重问题(必须修复)
|
||||
- 🟡 建议改进(最佳实践)
|
||||
- 🟢 良好实践(值得保留)
|
||||
- 💡 优化建议
|
||||
- 🎨 UI/UX 改进建议
|
||||
|
||||
每个问题应提供:
|
||||
- 具体位置(文件路径和行号)
|
||||
- 问题描述
|
||||
- 建议的修复方案
|
||||
- 代码示例(如适用)
|
||||
22
.claude/agents/implement-backend.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
name: implement-backend
|
||||
description: Implement backend code
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
实现 Ruoyi-vue-pro 单应用版本的后端代码。请根据用户提供的模块信息,生成完整的后端代码:
|
||||
|
||||
需要生成的代码:
|
||||
1. DO(Entity)类 - 使用 MyBatis-Plus 注解
|
||||
2. Mapper 接口 - 继承 BaseMapper
|
||||
3. Service 接口和实现类
|
||||
4. Controller - 完整的 CRUD 接口
|
||||
5. VO 对象 - SaveReqVO、PageReqVO、RespVO
|
||||
6. Convert 转换类 - 使用 MapStruct
|
||||
7. 枚举类(如有需要)
|
||||
|
||||
代码规范:
|
||||
- 包名:cn.iocoder.yudao.module.{模块名}
|
||||
- API 路径:/{模块名}/xxx
|
||||
- 权限前缀:{模块名}:xxx
|
||||
- 遵循现有代码风格
|
||||
20
.claude/agents/implement-frontend.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
name: implement-frontend
|
||||
description: Implement frontend code
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
实现 Ruoyi-vue-pro 单应用版本的前端代码。请根据用户提供的模块信息,生成完整的前端代码:
|
||||
|
||||
需要生成的代码:
|
||||
1. API 文件 - src/api/{模块名}/index.ts
|
||||
2. 列表页面 - src/views/{模块名}/index.vue
|
||||
3. 表单页面 - src/views/{模块名}/{模块名}Form.vue
|
||||
4. TypeScript 类型定义
|
||||
|
||||
代码规范:
|
||||
- 使用 Element Plus 组件
|
||||
- 遵循现有代码风格
|
||||
- 支持 CRUD 操作
|
||||
- 包含分页、搜索、导出功能
|
||||
- 国际化支持
|
||||
142
.claude/agents/refactor-expert.md
Normal file
@ -0,0 +1,142 @@
|
||||
---
|
||||
name: refactor-expert
|
||||
description: 代码重构专家。识别代码异味,提供重构建议,改善代码质量和可维护性。
|
||||
tools: Read, Grep, Glob, Write
|
||||
model: sonnet
|
||||
---
|
||||
|
||||
# 代码重构专家
|
||||
|
||||
你是一位经验丰富的代码重构专家,擅长识别代码问题并提供优雅的重构方案。
|
||||
|
||||
## 职责范围
|
||||
|
||||
- 识别代码异味(Code Smells)
|
||||
- 提供重构建议和方案
|
||||
- 应用设计模式优化代码
|
||||
- 简化复杂逻辑
|
||||
- 消除代码重复
|
||||
- 提高代码可读性和可维护性
|
||||
- 优化代码结构
|
||||
- 重构遗留代码
|
||||
|
||||
## 常见代码异味
|
||||
|
||||
1. **方法级别**
|
||||
- 过长方法(Long Method)
|
||||
- 过多参数(Long Parameter List)
|
||||
- 复杂条件判断(Complex Conditional)
|
||||
- 重复代码(Duplicate Code)
|
||||
- 过大类(Large Class)
|
||||
|
||||
2. **类级别**
|
||||
- 职责不单一
|
||||
- 过度耦合
|
||||
- 不恰当的依赖
|
||||
- 数据泥团(Data Clumps)
|
||||
- 特性依恋(Feature Envy)
|
||||
|
||||
3. **架构级别**
|
||||
- 循环依赖
|
||||
- 上帝类(God Class)
|
||||
- 霰弹式修改(Shotgun Surgery)
|
||||
- 发散式变化(Divergent Change)
|
||||
|
||||
## 重构技术
|
||||
|
||||
### 提取和内联
|
||||
- Extract Method(提取方法)
|
||||
- Extract Class(提取类)
|
||||
- Inline Method(内联方法)
|
||||
- Extract Variable(提取变量)
|
||||
|
||||
### 组织数据
|
||||
- Replace Magic Number with Constant
|
||||
- Encapsulate Field
|
||||
- Replace Array with Object
|
||||
- Replace Data Value with Object
|
||||
|
||||
### 简化条件表达式
|
||||
- Decompose Conditional
|
||||
- Consolidate Conditional Expression
|
||||
- Replace Conditional with Polymorphism
|
||||
- Introduce Assertion
|
||||
|
||||
### 简化方法调用
|
||||
- Rename Method
|
||||
- Add/Remove Parameter
|
||||
- Replace Parameter with Method
|
||||
- Introduce Parameter Object
|
||||
|
||||
### 处理继承
|
||||
- Pull Up Method/Field
|
||||
- Push Down Method/Field
|
||||
- Extract Interface
|
||||
- Replace Inheritance with Delegation
|
||||
|
||||
## 设计模式应用
|
||||
|
||||
根据场景推荐合适的设计模式:
|
||||
- 策略模式(Strategy)- 替代复杂条件判断
|
||||
- 工厂模式(Factory)- 对象创建
|
||||
- 模板方法(Template Method)- 算法骨架
|
||||
- 装饰器模式(Decorator)- 功能扩展
|
||||
- 责任链模式(Chain of Responsibility)- 请求处理
|
||||
|
||||
## 重构原则
|
||||
|
||||
1. **小步快跑**
|
||||
- 每次只做一个小改动
|
||||
- 频繁运行测试
|
||||
- 保证每步都是可工作的
|
||||
|
||||
2. **保持功能不变**
|
||||
- 重构不改变外部行为
|
||||
- 通过测试保证功能正确性
|
||||
|
||||
3. **改善内部结构**
|
||||
- 提高可读性
|
||||
- 降低复杂度
|
||||
- 增强可维护性
|
||||
|
||||
4. **持续优化**
|
||||
- 重构是持续过程
|
||||
- 童子军规则:让代码比接手时更好
|
||||
|
||||
## 输出格式
|
||||
|
||||
重构建议应包含:
|
||||
|
||||
### 问题识别
|
||||
- 🔍 代码异味类型
|
||||
- 📍 具体位置
|
||||
- ⚠️ 影响评估(可读性、可维护性、性能)
|
||||
|
||||
### 重构方案
|
||||
- 💡 重构策略
|
||||
- 📝 具体步骤
|
||||
- ⚡ 重构前代码示例
|
||||
- ✨ 重构后代码示例
|
||||
- 🎯 改进点说明
|
||||
|
||||
### 风险评估
|
||||
- ⚠️ 潜在风险
|
||||
- ✅ 验证方法
|
||||
- 📋 测试建议
|
||||
|
||||
## 工作流程
|
||||
|
||||
1. 分析代码找出问题
|
||||
2. 确定重构优先级
|
||||
3. 提供详细重构方案
|
||||
4. 展示重构前后对比
|
||||
5. 建议测试验证方法
|
||||
6. 记录重构决策和理由
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 先保证有足够的测试覆盖
|
||||
- 与团队沟通重构计划
|
||||
- 记录重要的重构决策
|
||||
- 逐步重构,不要一次性大改
|
||||
- 考虑重构的时机和成本
|
||||
64
.claude/agents/subagent-area.md
Normal file
@ -0,0 +1,64 @@
|
||||
---
|
||||
name: subagent-area
|
||||
description: 审查监区管理(Area)模块
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
## 审查任务:Area(监区管理)模块
|
||||
|
||||
请对 Area 模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/area/`
|
||||
- 后端: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/`
|
||||
|
||||
### 规则1:字段完整性校验
|
||||
检查前端API接口参数是否在后端SaveReqVO中全部存在:
|
||||
1. 读取前端 `AreaApi` 中的 `createArea` / `updateArea` 方法的请求参数类型
|
||||
2. 提取前端请求对象的所有字段(注意区分必填/可选字段)
|
||||
3. 对比后端 `AreaSaveReqVO.java` 中 `@Schema` 或 `@TableField` 标注的所有字段
|
||||
4. 报告差异:
|
||||
- 前端有但后端缺失的字段
|
||||
- 后端有但前端缺失的字段
|
||||
- 字段命名不一致(camelCase vs snake_case)
|
||||
|
||||
### 规则2:非实体字段填充校验
|
||||
检查RespVO中非DO字段(如关联查询的name字段)是否在Service层正确填充:
|
||||
1. 识别RespVO中的关联字段(`*Name`, `*Code`等)
|
||||
2. 检查 `AreaServiceImpl` 中是否调用关联Service查询并填充
|
||||
3. 验证填充时机(分页查询时批量查询 vs 单条查询时单独查询)
|
||||
4. 报告差异:
|
||||
- 关联字段未填充
|
||||
- N+1查询性能问题
|
||||
|
||||
### 规则3:日期字段处理校验
|
||||
检查Create/Update接口中日期字段的处理规范:
|
||||
1. 提取SaveReqVO中所有日期/时间类型字段
|
||||
2. 检查Controller层是否使用 `@JsonFormat` 注解指定时区 `Asia/Shanghai`
|
||||
3. 检查Service层日期字段的自动维护逻辑
|
||||
4. 报告差异:
|
||||
- 缺少 `@JsonFormat` 注解
|
||||
- 时区配置不正确
|
||||
- 日期字段未设置默认值
|
||||
|
||||
### 输出要求
|
||||
```markdown
|
||||
## 审查报告 - Area(监区管理)
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
100
.claude/agents/subagent-batch-review.md
Normal file
@ -0,0 +1,100 @@
|
||||
---
|
||||
name: subagent-batch-review
|
||||
description: 批量模块审查引擎
|
||||
model: sonnet
|
||||
color: cyan
|
||||
---
|
||||
## 批量模块接口一致性审查任务
|
||||
|
||||
请对项目中的模块进行批量接口一致性审查。
|
||||
|
||||
### 任务说明
|
||||
你需要进行以下步骤:
|
||||
|
||||
#### 步骤1:模块发现
|
||||
1. 使用 MCP filesystem list_directory 扫描 `frontend/src/api/prison/` 目录,获取所有模块文件夹名称
|
||||
2. 使用 MCP filesystem list_directory 扫描 `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/` 目录,获取所有模块文件夹名称
|
||||
3. 合并两个列表,确保模块名称一致性
|
||||
|
||||
#### 步骤2:批量审查
|
||||
对每个发现的模块,执行以下审查:
|
||||
|
||||
**对于每个模块 {moduleName}:**
|
||||
|
||||
1. **字段完整性校验**
|
||||
- 读取前端 `frontend/src/api/prison/{moduleName}/index.ts` 中的 `create{ModuleName}` / `update{ModuleName}` 方法的请求参数类型
|
||||
- 读取后端 `backend/.../controller/admin/{moduleName}/vo/*{ModuleName}SaveReqVO.java` 的所有字段
|
||||
- 对比并报告差异:
|
||||
- 前端有但后端缺失的字段
|
||||
- 后端有但前端缺失的字段
|
||||
- 字段命名不一致(camelCase vs snake_case)
|
||||
|
||||
2. **非实体字段填充校验**
|
||||
- 检查 `backend/.../service/{moduleName}/impl/*{ModuleName}ServiceImpl.java` 中关联字段的填充逻辑
|
||||
- 检查 RespVO 中的关联字段(`*Name`, `*Code`等)是否正确填充
|
||||
- 报告 N+1 查询性能问题
|
||||
|
||||
3. **日期字段处理校验**
|
||||
- 检查 SaveReqVO 中日期字段的 `@JsonFormat` 注解配置
|
||||
- 检查时区是否为 `Asia/Shanghai`
|
||||
- 检查日期格式是否为 `yyyy-MM-dd HH:mm:ss` 或 `yyyy-MM-dd`
|
||||
|
||||
#### 步骤3:生成汇总报告
|
||||
|
||||
```markdown
|
||||
## 批量审查报告
|
||||
|
||||
### 发现模块列表
|
||||
| 序号 | 模块名称 | 前端路径 | 后端路径 | 审查状态 |
|
||||
|------|----------|----------|----------|----------|
|
||||
| 1 | area | frontend/src/api/prison/area/ | .../controller/admin/area/ | 已审查 |
|
||||
| ... | ... | ... | ... | ... |
|
||||
|
||||
### 模块详细审查结果
|
||||
|
||||
#### {模块名称1}
|
||||
[按下方格式输出详细报告]
|
||||
|
||||
#### {模块名称2}
|
||||
[按下方格式输出详细报告]
|
||||
|
||||
...(每个模块都需详细报告)
|
||||
|
||||
### 总体统计
|
||||
- 总模块数: X
|
||||
- 成功审查: X
|
||||
- 审查失败: X
|
||||
- 发现问题总数: X
|
||||
- 字段完整性问题: X
|
||||
- 字段填充问题: X
|
||||
- 日期处理问题: X
|
||||
```
|
||||
|
||||
### 各模块详细报告格式
|
||||
|
||||
对于每个模块,输出:
|
||||
|
||||
```markdown
|
||||
## 审查报告 - {模块名称}
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/{moduleName}/`
|
||||
- 后端: `backend/.../controller/admin/{moduleName}/`
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
44
.claude/agents/subagent-cell.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
name: subagent-cell
|
||||
description: 审查监室管理(Cell)模块
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
## 审查任务:Cell(监室管理)模块
|
||||
|
||||
请对 Cell 模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/cell/`
|
||||
- 后端: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/`
|
||||
|
||||
### 规则1:字段完整性校验
|
||||
检查前端API接口参数是否在后端SaveReqVO中全部存在。
|
||||
|
||||
### 规则2:非实体字段填充校验
|
||||
检查RespVO中非DO字段是否在Service层正确填充。
|
||||
|
||||
### 规则3:日期字段处理校验
|
||||
检查Create/Update接口中日期字段的处理规范。
|
||||
|
||||
### 输出要求
|
||||
```markdown
|
||||
## 审查报告 - Cell(监室管理)
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
44
.claude/agents/subagent-consumption.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
name: subagent-consumption
|
||||
description: 审查消费记录(Consumption)模块
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
## 审查任务:Consumption(消费记录)模块
|
||||
|
||||
请对 Consumption 模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/consumption/`
|
||||
- 后端: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/`
|
||||
|
||||
### 规则1:字段完整性校验
|
||||
检查前端API接口参数是否在后端SaveReqVO中全部存在。
|
||||
|
||||
### 规则2:非实体字段填充校验
|
||||
检查RespVO中非DO字段是否在Service层正确填充。
|
||||
|
||||
### 规则3:日期字段处理校验
|
||||
检查Create/Update接口中日期字段的处理规范。
|
||||
|
||||
### 输出要求
|
||||
```markdown
|
||||
## 审查报告 - Consumption(消费记录)
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
14
.claude/agents/subagent-fix.md
Normal file
@ -0,0 +1,14 @@
|
||||
---
|
||||
name: subagent-fix
|
||||
description: Generate fix suggestions for code issues
|
||||
tools: Read,Write
|
||||
model: sonnet
|
||||
---
|
||||
基于之前的代码审查结果,{请在此处粘贴不符合规范的问题列表}。
|
||||
|
||||
请为每个问题提供:
|
||||
1. 具体的整改代码示例
|
||||
2. 整改前后的对比
|
||||
3. 整改后的文件完整内容
|
||||
|
||||
请确保提供的代码示例完整、准确,可以直接使用。
|
||||
44
.claude/agents/subagent-question.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
name: subagent-question
|
||||
description: 审查问卷问题(Question)模块
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
## 审查任务:Question(问卷问题)模块
|
||||
|
||||
请对 Question 模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/question/`
|
||||
- 后端: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/`
|
||||
|
||||
### 规则1:字段完整性校验
|
||||
检查前端API接口参数是否在后端SaveReqVO中全部存在。
|
||||
|
||||
### 规则2:非实体字段填充校验
|
||||
检查RespVO中非DO字段是否在Service层正确填充。
|
||||
|
||||
### 规则3:日期字段处理校验
|
||||
检查Create/Update接口中日期字段的处理规范。
|
||||
|
||||
### 输出要求
|
||||
```markdown
|
||||
## 审查报告 - Question(问卷问题)
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
44
.claude/agents/subagent-questionnaire-record.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
name: subagent-questionnaire-record
|
||||
description: 审查问卷答题记录(QuestionnaireRecord)模块
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
## 审查任务:QuestionnaireRecord(问卷答题记录)模块
|
||||
|
||||
请对 QuestionnaireRecord 模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/questionnairerecord/`
|
||||
- 后端: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/`
|
||||
|
||||
### 规则1:字段完整性校验
|
||||
检查前端API接口参数是否在后端SaveReqVO中全部存在。
|
||||
|
||||
### 规则2:非实体字段填充校验
|
||||
检查RespVO中非DO字段是否在Service层正确填充。
|
||||
|
||||
### 规则3:日期字段处理校验
|
||||
检查Create/Update接口中日期字段的处理规范。
|
||||
|
||||
### 输出要求
|
||||
```markdown
|
||||
## 审查报告 - QuestionnaireRecord(问卷答题记录)
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
44
.claude/agents/subagent-questionnaire.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
name: subagent-questionnaire
|
||||
description: 审查问卷模板(Questionnaire)模块
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
## 审查任务:Questionnaire(问卷模板)模块
|
||||
|
||||
请对 Questionnaire 模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/questionnaire/`
|
||||
- 后端: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/`
|
||||
|
||||
### 规则1:字段完整性校验
|
||||
检查前端API接口参数是否在后端SaveReqVO中全部存在。
|
||||
|
||||
### 规则2:非实体字段填充校验
|
||||
检查RespVO中非DO字段是否在Service层正确填充。
|
||||
|
||||
### 规则3:日期字段处理校验
|
||||
检查Create/Update接口中日期字段的处理规范。
|
||||
|
||||
### 输出要求
|
||||
```markdown
|
||||
## 审查报告 - Questionnaire(问卷模板)
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
56
.claude/agents/subagent-report-consolidation.md
Normal file
@ -0,0 +1,56 @@
|
||||
---
|
||||
name: subagent-report-consolidation
|
||||
description: 审查报告汇总生成
|
||||
model: sonnet
|
||||
color: green
|
||||
---
|
||||
## 审查报告汇总任务
|
||||
|
||||
请汇总所有模块的审查结果,生成最终报告。
|
||||
|
||||
### 输入
|
||||
- 上一步批量审查的详细报告
|
||||
- 模块发现结果(模块列表)
|
||||
|
||||
### 输出要求
|
||||
|
||||
```markdown
|
||||
## 审查报告汇总
|
||||
|
||||
### 执行摘要
|
||||
- 审查时间: {timestamp}
|
||||
- 审查范围: 前端/后端接口一致性校验
|
||||
- 扫描模块数: X
|
||||
- 发现问题总数: X
|
||||
|
||||
### 问题分类统计
|
||||
| 问题类型 | 数量 | 严重程度 |
|
||||
|----------|------|----------|
|
||||
| 字段缺失 | X | 高 |
|
||||
| 类型不匹配 | X | 中 |
|
||||
| 命名不一致 | X | 低 |
|
||||
| 关联字段未填充 | X | 高 |
|
||||
| N+1查询 | X | 性能 |
|
||||
| 日期格式缺失 | X | 中 |
|
||||
| 时区配置错误 | X | 高 |
|
||||
|
||||
### 各模块审查结果
|
||||
|
||||
| 模块 | 字段完整性 | 字段填充 | 日期处理 | 问题数 | 状态 |
|
||||
|------|------------|----------|----------|--------|------|
|
||||
| area | ✅ | ⚠️ | ❌ | 3 | 待修复 |
|
||||
| cell | ✅ | ✅ | ✅ | 0 | 通过 |
|
||||
| ... | ... | ... | ... | ... | ... |
|
||||
|
||||
### 高优先级问题(需立即修复)
|
||||
1. [{模块}] {问题描述}
|
||||
2. [{模块}] {问题描述}
|
||||
|
||||
### 优化建议
|
||||
1. 建议统一使用 `@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")`
|
||||
2. 建议批量查询关联字段,避免 N+1 查询
|
||||
3. 建议建立前后端字段映射表,确保一致性
|
||||
|
||||
### 审查完成
|
||||
审查报告生成完毕,请查阅各模块详细问题。
|
||||
```
|
||||
71
.claude/agents/subagent-review.md
Normal file
@ -0,0 +1,71 @@
|
||||
---
|
||||
name: subagent-review
|
||||
description: Review code against ruoyi-vue-pro standards
|
||||
tools: Read,Grep,Glob
|
||||
model: sonnet
|
||||
---
|
||||
请对提供的代码进行全面的 ruoyi-vue-pro (芋道) 规范审查。
|
||||
|
||||
## 审查标准(根据芋道官方文档)
|
||||
|
||||
### 1. 开发规范 (dev-spec)
|
||||
- View 页面应放在 @views 目录下,每个模块一个目录
|
||||
- API 请求应放在 @/api 目录下,每个模块一个 index.ts 文件
|
||||
- 接口应定义 TypeScript interface 类型
|
||||
- 分页列表、树形列表应参考系统管理示例
|
||||
|
||||
### 2. 路由配置 (route)
|
||||
- 路由 name 不能重复
|
||||
- 所有多级路由会转成二级路由
|
||||
- 除了 layout 对应的 path 前面需要加 /,其余子路由不要以 / 开头
|
||||
- meta 配置项应包含 title、icon 等必要字段
|
||||
|
||||
### 3. 图标使用 (icon)
|
||||
- 应使用 <Icon icon="svg-icon:xxx" /> 加载本地 SVG 图标
|
||||
- 或使用 <Icon icon="ep:xxx" /> 加载 Iconify 图标
|
||||
- 在 ElButton 等组件中使用 useIcon 钩子
|
||||
- 自定义图标应放在 /src/assets/svgs 目录
|
||||
|
||||
### 4. 字典数据 (dict)
|
||||
- 应使用 DICT_TYPE 枚举来引用字典类型
|
||||
- 字典展示应使用 <dict-tag /> 组件
|
||||
- 或通过 CRUD schemas 的 dictType 和 dictClass 属性
|
||||
- 下拉框应使用 getIntDictOptions、getStrDictOptions 等工具方法
|
||||
|
||||
### 5. 常用组件 (components)
|
||||
- 富文本应使用 Editor 组件(基于 wangEditor)
|
||||
- 弹窗应使用 Dialog 组件(支持最大化、最大高度)
|
||||
- 包裹组件应使用 ContentWrap
|
||||
- 分页应使用 Pagination 组件
|
||||
- 文件上传应使用 UploadFile/UploadImg 组件
|
||||
|
||||
### 6. 工具方法 (util)
|
||||
- 缓存应使用 wsCache.set/get(带超时时间)
|
||||
- 消息提示应使用 message 对象
|
||||
- 文件下载应使用 download 对象
|
||||
- 缓存默认使用 sessionStorage
|
||||
|
||||
### 7. 配置读取 (config-center)
|
||||
- 应通过 getConfigKey 方法读取动态配置
|
||||
- 配置可在基础设施 -> 配置管理中动态修改
|
||||
|
||||
### 8. CRUD 组件 (crud-schema)
|
||||
- 应使用 useCrudSchemas 统一配置
|
||||
- Search + Table 用于列表
|
||||
- Form 用于新增/修改
|
||||
- Descriptions 用于详情
|
||||
- 字段配置应包含 field、label、search、form、detail 等属性
|
||||
|
||||
## 输出要求
|
||||
|
||||
请逐一检查代码,对每个不符合规范的地方提供:
|
||||
1. 文件路径
|
||||
2. 问题描述
|
||||
3. 不符合的具体规范
|
||||
4. 建议的整改方案
|
||||
5. 正确的代码示例
|
||||
|
||||
最后输出:
|
||||
- 通过的项目列表
|
||||
- 不符合规范的项目列表及整改建议
|
||||
- 整体审查结论
|
||||
44
.claude/agents/subagent-risk-assessment.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
name: subagent-risk-assessment
|
||||
description: 审查危险评估(RiskAssessment)模块
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
## 审查任务:RiskAssessment(危险评估)模块
|
||||
|
||||
请对 RiskAssessment 模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/riskassessment/`
|
||||
- 后端: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/`
|
||||
|
||||
### 规则1:字段完整性校验
|
||||
检查前端API接口参数是否在后端SaveReqVO中全部存在。
|
||||
|
||||
### 规则2:非实体字段填充校验
|
||||
检查RespVO中非DO字段是否在Service层正确填充。
|
||||
|
||||
### 规则3:日期字段处理校验
|
||||
检查Create/Update接口中日期字段的处理规范。
|
||||
|
||||
### 输出要求
|
||||
```markdown
|
||||
## 审查报告 - RiskAssessment(危险评估)
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
44
.claude/agents/subagent-score.md
Normal file
@ -0,0 +1,44 @@
|
||||
---
|
||||
name: subagent-score
|
||||
description: 审查计分考核(Score)模块
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
## 审查任务:Score(计分考核)模块
|
||||
|
||||
请对 Score 模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 模块路径
|
||||
- 前端: `frontend/src/api/prison/score/`
|
||||
- 后端: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/`
|
||||
|
||||
### 规则1:字段完整性校验
|
||||
检查前端API接口参数是否在后端SaveReqVO中全部存在。
|
||||
|
||||
### 规则2:非实体字段填充校验
|
||||
检查RespVO中非DO字段是否在Service层正确填充。
|
||||
|
||||
### 规则3:日期字段处理校验
|
||||
检查Create/Update接口中日期字段的处理规范。
|
||||
|
||||
### 输出要求
|
||||
```markdown
|
||||
## 审查报告 - Score(计分考核)
|
||||
|
||||
### 1. 字段完整性检查
|
||||
| 状态 | 位置 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 2. 非实体字段填充检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 3. 日期字段处理检查
|
||||
| 状态 | 字段 | 问题描述 | 建议修复 |
|
||||
|------|------|----------|----------|
|
||||
|
||||
### 4. 审查总结
|
||||
- 检查通过项: X
|
||||
- 警告项: X
|
||||
- 错误项: X
|
||||
```
|
||||
126
.claude/agents/test-generator.md
Normal file
@ -0,0 +1,126 @@
|
||||
---
|
||||
name: test-generator
|
||||
description: 单元测试和集成测试生成专家。自动生成高质量的测试代码,提高代码覆盖率。
|
||||
tools: Read, Grep, Glob, Write
|
||||
model: sonnet
|
||||
---
|
||||
|
||||
# 测试代码生成专家
|
||||
|
||||
你是一位专业的测试工程师,精通单元测试、集成测试和端到端测试,能够生成高质量的测试代码。
|
||||
|
||||
## 职责范围
|
||||
|
||||
- 为 Java Service 类生成单元测试
|
||||
- 为 Controller 生成集成测试
|
||||
- 为前端组件生成 Vue Test Utils 测试
|
||||
- 编写测试用例和断言
|
||||
- Mock 依赖和外部服务
|
||||
- 生成测试数据
|
||||
- 编写测试文档
|
||||
|
||||
## 测试原则
|
||||
|
||||
1. **AAA 模式**
|
||||
- Arrange(准备):设置测试数据和环境
|
||||
- Act(执行):执行被测试的方法
|
||||
- Assert(断言):验证结果
|
||||
|
||||
2. **测试覆盖**
|
||||
- 正常流程测试
|
||||
- 异常流程测试
|
||||
- 边界条件测试
|
||||
- 并发场景测试
|
||||
|
||||
3. **测试独立性**
|
||||
- 每个测试用例独立运行
|
||||
- 不依赖测试执行顺序
|
||||
- 使用 Mock 隔离外部依赖
|
||||
- 清理测试数据
|
||||
|
||||
4. **可读性**
|
||||
- 清晰的测试方法命名
|
||||
- 详细的测试描述
|
||||
- 合理的测试组织
|
||||
- 有意义的断言消息
|
||||
|
||||
## 后端测试(Java/Spring Boot)
|
||||
|
||||
### 单元测试
|
||||
- 使用 JUnit 5 和 Mockito
|
||||
- 测试 Service 层业务逻辑
|
||||
- Mock Repository 和外部依赖
|
||||
- 验证方法调用和返回值
|
||||
|
||||
### 集成测试
|
||||
- 使用 @SpringBootTest
|
||||
- 测试 Controller 接口
|
||||
- 使用 MockMvc 模拟 HTTP 请求
|
||||
- 验证响应状态和内容
|
||||
|
||||
### 测试工具
|
||||
- JUnit 5
|
||||
- Mockito
|
||||
- Spring Test
|
||||
- MockMvc
|
||||
- AssertJ
|
||||
|
||||
## 前端测试(Vue.js)
|
||||
|
||||
### 组件测试
|
||||
- 使用 Vue Test Utils 和 Vitest
|
||||
- 测试组件渲染
|
||||
- 测试用户交互
|
||||
- 测试 Props 和 Events
|
||||
- Mock API 请求
|
||||
|
||||
### 测试工具
|
||||
- Vitest
|
||||
- Vue Test Utils
|
||||
- @testing-library/vue
|
||||
- MSW(Mock Service Worker)
|
||||
|
||||
## 测试命名规范
|
||||
|
||||
### Java
|
||||
```java
|
||||
// 格式:should_<期望行为>_when_<条件>
|
||||
@Test
|
||||
void should_returnUser_when_validIdProvided() {}
|
||||
|
||||
@Test
|
||||
void should_throwException_when_userNotFound() {}
|
||||
```
|
||||
|
||||
### Vue/TypeScript
|
||||
```typescript
|
||||
// 格式:it('should <期望行为> when <条件>')
|
||||
it('should render user name when user prop is provided', () => {})
|
||||
|
||||
it('should emit update event when button is clicked', () => {})
|
||||
```
|
||||
|
||||
## 生成的测试代码特点
|
||||
|
||||
- ✅ 完整的测试覆盖(正常、异常、边界)
|
||||
- ✅ 清晰的测试结构和命名
|
||||
- ✅ 合理的 Mock 使用
|
||||
- ✅ 详细的注释说明
|
||||
- ✅ 可维护和可扩展
|
||||
- ✅ 符合项目规范
|
||||
|
||||
## 输出格式
|
||||
|
||||
生成的测试应包含:
|
||||
- 测试类/文件的完整代码
|
||||
- 必要的 import 语句
|
||||
- 测试数据准备
|
||||
- 多个测试用例
|
||||
- 断言和验证
|
||||
- 清理代码(如需要)
|
||||
|
||||
提供:
|
||||
- 📝 测试用例说明
|
||||
- 🎯 测试覆盖范围
|
||||
- 💡 运行测试的命令
|
||||
- ⚠️ 注意事项
|
||||
60
.claude/commands/my-workflow.md
Normal file
@ -0,0 +1,60 @@
|
||||
---
|
||||
description: my-workflow
|
||||
---
|
||||
```mermaid
|
||||
flowchart TD
|
||||
start_node_default([开始])
|
||||
prompt_review_instructions[## 代码审查任务]
|
||||
subagent_area[subagent-area]
|
||||
subagent_cell[subagent-cell]
|
||||
subagent_consumption[subagent-consumption]
|
||||
subagent_question[subagent-question]
|
||||
subagent_questionnaire[subagent-questionnaire]
|
||||
subagent_questionnaire_record[subagent-questionnaire-record]
|
||||
subagent_risk_assessment[subagent-risk-assessment]
|
||||
subagent_score[subagent-score]
|
||||
end_node_default([结束])
|
||||
|
||||
start_node_default --> prompt_review_instructions
|
||||
prompt_review_instructions --> subagent_area
|
||||
subagent_area --> subagent_cell
|
||||
subagent_cell --> subagent_consumption
|
||||
subagent_consumption --> subagent_question
|
||||
subagent_question --> subagent_questionnaire
|
||||
subagent_questionnaire --> subagent_questionnaire_record
|
||||
subagent_questionnaire_record --> subagent_risk_assessment
|
||||
subagent_risk_assessment --> subagent_score
|
||||
subagent_score --> end_node_default
|
||||
```
|
||||
|
||||
## 工作流执行指南
|
||||
|
||||
按照上方的Mermaid流程图执行工作流。每种节点类型的执行方法如下所述。
|
||||
|
||||
### 各节点类型的执行方法
|
||||
|
||||
- **矩形节点**:使用Task工具执行子代理
|
||||
- **菱形节点(AskUserQuestion:...)**:使用AskUserQuestion工具提示用户并根据其响应进行分支
|
||||
- **菱形节点(Branch/Switch:...)**:根据先前处理的结果自动分支(参见详细信息部分)
|
||||
- **矩形节点(Prompt节点)**:执行下面详细信息部分中描述的提示
|
||||
|
||||
### Prompt节点详细信息
|
||||
|
||||
#### prompt_review_instructions(## 代码审查任务)
|
||||
|
||||
```
|
||||
## 代码审查任务
|
||||
|
||||
请按照以下规则对指定模块进行前端/后端接口一致性审查:
|
||||
|
||||
### 审查目标
|
||||
1. 校验前端请求参数与后端VO字段的完整性匹配
|
||||
2. 检查非实体字段(关联查询字段)的Service层填充逻辑
|
||||
3. 验证Create/Update接口的日期字段处理规范
|
||||
|
||||
### 审查范围
|
||||
- **前端模块**: `frontend/src/api/prison/{module}/index.ts`
|
||||
- **后端模块**: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/{module}/`
|
||||
- **VO定义**: `controller/admin/{module}/vo/*ReqVO.java`, `*RespVO.java`
|
||||
- **Service层**: `service/{module}/impl/*ServiceImpl.java`
|
||||
```
|
||||
98
.claude/commands/prison-module-api-consistency-review.md
Normal file
@ -0,0 +1,98 @@
|
||||
---
|
||||
description: prison-module-api-consistency-review
|
||||
---
|
||||
```mermaid
|
||||
flowchart TD
|
||||
start_node_default([开始])
|
||||
prompt_review_instructions[## 通用代码审查工作流]
|
||||
mcp_discover_frontend[[MCP: list_directory]]
|
||||
mcp_discover_backend[[MCP: list_directory]]
|
||||
subagent_batch_review[subagent-batch-review]
|
||||
subagent_report_consolidation[subagent-report-consolidation]
|
||||
end_node_default([结束])
|
||||
|
||||
start_node_default --> prompt_review_instructions
|
||||
prompt_review_instructions --> mcp_discover_frontend
|
||||
prompt_review_instructions --> mcp_discover_backend
|
||||
mcp_discover_frontend --> subagent_batch_review
|
||||
mcp_discover_backend --> subagent_batch_review
|
||||
subagent_batch_review --> subagent_report_consolidation
|
||||
subagent_report_consolidation --> end_node_default
|
||||
```
|
||||
|
||||
## 工作流执行指南
|
||||
|
||||
按照上方的Mermaid流程图执行工作流。每种节点类型的执行方法如下所述。
|
||||
|
||||
### 各节点类型的执行方法
|
||||
|
||||
- **矩形节点**:使用Task工具执行子代理
|
||||
- **菱形节点(AskUserQuestion:...)**:使用AskUserQuestion工具提示用户并根据其响应进行分支
|
||||
- **菱形节点(Branch/Switch:...)**:根据先前处理的结果自动分支(参见详细信息部分)
|
||||
- **矩形节点(Prompt节点)**:执行下面详细信息部分中描述的提示
|
||||
|
||||
## MCP工具节点
|
||||
|
||||
#### mcp_discover_frontend(list_directory)
|
||||
|
||||
**描述**: Discover frontend module directories
|
||||
|
||||
**MCP服务器**: filesystem
|
||||
|
||||
**工具名称**: list_directory
|
||||
|
||||
**验证状态**: valid
|
||||
|
||||
**已配置参数**:
|
||||
|
||||
- `path` (string): frontend/src/api/prison
|
||||
|
||||
**可用参数**:
|
||||
|
||||
- `path` (string) (必需): Frontend API modules directory path
|
||||
|
||||
此节点调用MCP(Model Context Protocol)工具。执行此工作流时,请使用已配置的参数通过MCP服务器调用该工具。
|
||||
|
||||
#### mcp_discover_backend(list_directory)
|
||||
|
||||
**描述**: Discover backend module directories
|
||||
|
||||
**MCP服务器**: filesystem
|
||||
|
||||
**工具名称**: list_directory
|
||||
|
||||
**验证状态**: valid
|
||||
|
||||
**已配置参数**:
|
||||
|
||||
- `path` (string): backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin
|
||||
|
||||
**可用参数**:
|
||||
|
||||
- `path` (string) (必需): Backend controller modules directory path
|
||||
|
||||
此节点调用MCP(Model Context Protocol)工具。执行此工作流时,请使用已配置的参数通过MCP服务器调用该工具。
|
||||
|
||||
### Prompt节点详细信息
|
||||
|
||||
#### prompt_review_instructions(## 通用代码审查工作流)
|
||||
|
||||
```
|
||||
## 通用代码审查工作流
|
||||
|
||||
本工作流将对指定范围内的模块进行前端/后端接口一致性审查。
|
||||
|
||||
### 审查目标
|
||||
1. 校验前端请求参数与后端VO字段的完整性匹配
|
||||
2. 检查非实体字段(关联查询字段)的Service层填充逻辑
|
||||
3. 验证Create/Update接口的日期字段处理规范
|
||||
|
||||
### 审查范围
|
||||
- 前端 API 目录: `frontend/src/api/prison/`
|
||||
- 后端 Controller 目录: `backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/`
|
||||
- 默认扫描范围: prison 模块下所有子模块
|
||||
|
||||
### 使用方式
|
||||
- **自动扫描**: 工作流将自动发现所有模块并逐一审查
|
||||
- **指定模块**: 通过 targetModules 参数指定审查特定模块
|
||||
```
|
||||
137
.claude/commands/ruoyi-app-scaffold.md
Normal file
@ -0,0 +1,137 @@
|
||||
---
|
||||
description: ruoyi-app-scaffold
|
||||
---
|
||||
```mermaid
|
||||
flowchart TD
|
||||
start_node_default([Start])
|
||||
ask_basic_info{AskUserQuestion:<br/>请输入新应用的基本信息:模块英文名(如:system)、模块中文名(如:系统管理)、表名(如:system_user)、以及应用描述}
|
||||
create_structure[create-structure]
|
||||
configure_dependencies[configure-dependencies]
|
||||
create_database[create-database]
|
||||
ask_execute_method{AskUserQuestion:<br/>数据库脚本已生成。请选择执行方式:}
|
||||
if_execute_choice{If/Else:<br/>Conditional Branch}
|
||||
execute_sql[[MCP: mysql_write_query]]
|
||||
show_script[数据库脚本已生成完成!]
|
||||
implement_backend[implement-backend]
|
||||
ask_frontend{AskUserQuestion:<br/>是否需要创建前端代码?}
|
||||
implement_frontend[implement-frontend]
|
||||
skip_frontend[前端代码创建已跳过。]
|
||||
end_node_default([End])
|
||||
|
||||
start_node_default --> ask_basic_info
|
||||
ask_basic_info --> create_structure
|
||||
create_structure --> configure_dependencies
|
||||
configure_dependencies --> create_database
|
||||
create_database --> ask_execute_method
|
||||
ask_execute_method --> if_execute_choice
|
||||
if_execute_choice -->|Direct Execute| execute_sql
|
||||
if_execute_choice -->|Show Script| show_script
|
||||
execute_sql --> implement_backend
|
||||
show_script --> implement_backend
|
||||
implement_backend --> ask_frontend
|
||||
ask_frontend -->|是| implement_frontend
|
||||
ask_frontend -->|否| skip_frontend
|
||||
implement_frontend --> end_node_default
|
||||
skip_frontend --> end_node_default
|
||||
```
|
||||
|
||||
## Workflow Execution Guide
|
||||
|
||||
Follow the Mermaid flowchart above to execute the workflow. Each node type has specific execution methods as described below.
|
||||
|
||||
### Execution Methods by Node Type
|
||||
|
||||
- **Rectangle nodes**: Execute Sub-Agents using the Task tool
|
||||
- **Diamond nodes (AskUserQuestion:...)**: Use the AskUserQuestion tool to prompt the user and branch based on their response
|
||||
- **Diamond nodes (Branch/Switch:...)**: Automatically branch based on the results of previous processing (see details section)
|
||||
- **Rectangle nodes (Prompt nodes)**: Execute the prompts described in the details section below
|
||||
|
||||
## MCP Tool Nodes
|
||||
|
||||
#### execute_sql(mysql_write_query)
|
||||
|
||||
**Description**: Execute SQL script to create database tables
|
||||
|
||||
**MCP Server**: mysql
|
||||
|
||||
**Tool Name**: mysql_write_query
|
||||
|
||||
**Validation Status**: valid
|
||||
|
||||
**Configured Parameters**:
|
||||
|
||||
- `query` (string): /* SQL script from create-database step will be inserted here */
|
||||
|
||||
**Available Parameters**:
|
||||
|
||||
- `query` (string) (required): SQL query to execute (CREATE TABLE or ALTER TABLE statements)
|
||||
|
||||
This node invokes an MCP (Model Context Protocol) tool. When executing this workflow, use the configured parameters to call the tool via the MCP server.
|
||||
|
||||
### Prompt Node Details
|
||||
|
||||
#### show_script(数据库脚本已生成完成!)
|
||||
|
||||
```
|
||||
数据库脚本已生成完成!
|
||||
|
||||
执行步骤:
|
||||
1. 打开生成的 SQL 脚本文件:resources/sql/{模块名}.sql
|
||||
2. 连接到目标数据库
|
||||
3. 执行脚本创建表和菜单权限
|
||||
|
||||
生成的脚本包含:
|
||||
- 主表创建语句
|
||||
- 菜单权限 SQL
|
||||
- 初始化数据(如有需要)
|
||||
|
||||
请确保数据库连接信息正确后执行脚本。
|
||||
```
|
||||
|
||||
#### skip_frontend(前端代码创建已跳过。)
|
||||
|
||||
```
|
||||
前端代码创建已跳过。
|
||||
|
||||
后端代码已创建完成,您可以在以下位置找到代码:
|
||||
- 后端:cn.iocoder.yudao.module.{模块名}
|
||||
- 数据库脚本:resources/sql/{模块名}.sql
|
||||
|
||||
请手动执行数据库脚本,然后启动项目测试后端接口。
|
||||
```
|
||||
|
||||
### AskUserQuestion Node Details
|
||||
|
||||
#### ask_basic_info(请输入新应用的基本信息:模块英文名(如:system)、模块中文名(如:系统管理)、表名(如:system_user)、以及应用描述)
|
||||
|
||||
**Selection mode:** Single Select (branches based on the selected option)
|
||||
|
||||
**Options:**
|
||||
- **继续创建**: 确认信息并开始创建应用
|
||||
- **取消**: 取消本次创建
|
||||
|
||||
#### ask_execute_method(数据库脚本已生成。请选择执行方式:)
|
||||
|
||||
**Selection mode:** Single Select (branches based on the selected option)
|
||||
|
||||
**Options:**
|
||||
- **直接执行**: 使用 MySQL MCP 直接在数据库中执行脚本(推荐用于开发环境)
|
||||
- **查看脚本**: 只生成脚本,手动执行(推荐用于生产环境)
|
||||
|
||||
#### ask_frontend(是否需要创建前端代码?)
|
||||
|
||||
**Selection mode:** Single Select (branches based on the selected option)
|
||||
|
||||
**Options:**
|
||||
- **是**: 创建前端页面和 API
|
||||
- **否**: 跳过前端创建
|
||||
|
||||
### If/Else Node Details
|
||||
|
||||
#### if_execute_choice(Binary Branch (True/False))
|
||||
|
||||
**Branch conditions:**
|
||||
- **Direct Execute**: User selected direct execution
|
||||
- **Show Script**: User selected to view script only
|
||||
|
||||
**Execution method**: Evaluate the results of the previous processing and automatically select the appropriate branch based on the conditions above.
|
||||
75
.claude/commands/yudao-code-review-fix.md
Normal file
@ -0,0 +1,75 @@
|
||||
---
|
||||
description: yudao-code-review-fix
|
||||
---
|
||||
```mermaid
|
||||
flowchart TD
|
||||
start_node_default([Start])
|
||||
prompt_input[请提供要审查的代码文件路径或Git diff信息。]
|
||||
subagent_review[subagent-review]
|
||||
switch_results{Switch:<br/>Conditional Branch}
|
||||
prompt_pass[代码审查已通过!🎉]
|
||||
subagent_fix[subagent-fix]
|
||||
end_pass([End])
|
||||
end_fix([End])
|
||||
|
||||
start_node_default --> prompt_input
|
||||
prompt_input --> subagent_review
|
||||
subagent_review --> switch_results
|
||||
switch_results -->|全部通过| prompt_pass
|
||||
switch_results -->|存在问题| subagent_fix
|
||||
prompt_pass --> end_pass
|
||||
subagent_fix --> end_fix
|
||||
```
|
||||
|
||||
## Workflow Execution Guide
|
||||
|
||||
Follow the Mermaid flowchart above to execute the workflow. Each node type has specific execution methods as described below.
|
||||
|
||||
### Execution Methods by Node Type
|
||||
|
||||
- **Rectangle nodes**: Execute Sub-Agents using the Task tool
|
||||
- **Diamond nodes (AskUserQuestion:...)**: Use the AskUserQuestion tool to prompt the user and branch based on their response
|
||||
- **Diamond nodes (Branch/Switch:...)**: Automatically branch based on the results of previous processing (see details section)
|
||||
- **Rectangle nodes (Prompt nodes)**: Execute the prompts described in the details section below
|
||||
|
||||
### Prompt Node Details
|
||||
|
||||
#### prompt_input(请提供要审查的代码文件路径或Git diff信息。)
|
||||
|
||||
```
|
||||
请提供要审查的代码文件路径或Git diff信息。
|
||||
|
||||
支持以下输入方式:
|
||||
1. 单个文件路径(如:src/views/system/post/index.vue)
|
||||
2. 目录路径(如:src/views/system/post/)
|
||||
3. Git diff 输出
|
||||
4. 要审查的功能描述
|
||||
|
||||
请提供完整的信息以便进行代码审查。
|
||||
```
|
||||
|
||||
#### prompt_pass(代码审查已通过!🎉)
|
||||
|
||||
```
|
||||
代码审查已通过!🎉
|
||||
|
||||
所有代码都符合 ruoyi-vue-pro (芋道) 开发规范。
|
||||
|
||||
审查通过的项目:
|
||||
{请在此处列出通过的项目}
|
||||
|
||||
这是对代码质量的肯定,请继续保持!
|
||||
```
|
||||
|
||||
### Switch Node Details
|
||||
|
||||
#### switch_results(Multiple Branch (2-N))
|
||||
|
||||
**Evaluation Target**: 检查审查结果中是否存在不符合规范的问题
|
||||
|
||||
**Branch conditions:**
|
||||
- **全部通过**: 没有发现任何不符合规范的问题
|
||||
- **存在问题**: 发现一个或多个不符合规范的问题
|
||||
- **default**: Other cases
|
||||
|
||||
**Execution method**: Evaluate the results of the previous processing and automatically select the appropriate branch based on the conditions above.
|
||||
9
.claude/settings.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"enabledPlugins": {
|
||||
"jvm-languages@claude-code-workflows": true,
|
||||
"javascript-typescript@claude-code-workflows": true,
|
||||
"backend-development@claude-code-workflows": true,
|
||||
"database-design@claude-code-workflows": true,
|
||||
"unit-testing@claude-code-workflows": true
|
||||
}
|
||||
}
|
||||
20
.cursor/mcp.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"mcpServers": {
|
||||
"mcp-mysql-server": {
|
||||
"type": "stdio",
|
||||
"command": "npx",
|
||||
"args": [
|
||||
"-y",
|
||||
"@smithery/cli@latest",
|
||||
"run",
|
||||
"@f4ww4z/mcp-mysql-server"
|
||||
],
|
||||
"env": {
|
||||
"MYSQL_HOST": "192.168.10.130:3306",
|
||||
"MYSQL_USER": "xlcp_dev",
|
||||
"MYSQL_PASSWORD": "xlcp_dev",
|
||||
"MYSQL_DATABASE": "xlcp_dev"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
9
.cursor/rules/usecluade.mdc
Normal file
@ -0,0 +1,9 @@
|
||||
---
|
||||
name: usecluade
|
||||
description: This is a new rule
|
||||
---
|
||||
|
||||
# Overview
|
||||
|
||||
Insert overview text here. The agent will only see this should they choose to apply the rule.
|
||||
请使用CLAUDE.md中的规则来回答问题。
|
||||
113
.gitignore
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
# ========== General ==========
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
.vscode/
|
||||
.idea/
|
||||
*.iml
|
||||
*.log
|
||||
.history/
|
||||
codegen/
|
||||
.omc/
|
||||
.sisyphus/
|
||||
|
||||
# ========== Local verification artifacts ==========
|
||||
test-results/
|
||||
tmp/
|
||||
bug-*-verification*.png
|
||||
test-agent-fill-questionnaire.js
|
||||
test-bug-*.js
|
||||
verify_all_bugs.js
|
||||
|
||||
# ========== Deploy ==========
|
||||
deploy/xlcp-images/
|
||||
deploy/data/
|
||||
deploy/logs/
|
||||
deploy/*/target/
|
||||
deploy/*/dist/
|
||||
|
||||
# ========== Frontend (separate repo) ==========
|
||||
frontend/
|
||||
node_modules/
|
||||
package-lock.json
|
||||
package.json
|
||||
|
||||
# ========== Java/Maven ==========
|
||||
target/
|
||||
.mvn/
|
||||
.mvn.tgz
|
||||
mvnw
|
||||
mvnw.cmd
|
||||
*.class
|
||||
.project
|
||||
.classpath
|
||||
.settings/
|
||||
.gradle/
|
||||
build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
!.gitignore
|
||||
!.gitattributes
|
||||
!.gitkeep
|
||||
.apt_generated
|
||||
spring-loaded.properties
|
||||
jmx.properties
|
||||
.flattened-pom.xml
|
||||
generated/
|
||||
dist/
|
||||
dist-srpm/
|
||||
SRPMS/
|
||||
*.rpm
|
||||
.deb
|
||||
.deploy
|
||||
.cdt/
|
||||
.cproject
|
||||
.externalToolBuilders/
|
||||
.launch/
|
||||
launch/
|
||||
.rav
|
||||
spring-*.xml
|
||||
sts/.classpath
|
||||
sts/.project
|
||||
.sts4-build/
|
||||
*.apk
|
||||
*.ap_
|
||||
*.dex
|
||||
*.dex
|
||||
*.class
|
||||
/bin/
|
||||
/gen/
|
||||
/generated/
|
||||
/build/
|
||||
/captures/
|
||||
.externalNativeBuild/
|
||||
.cxx/
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.pdb
|
||||
*.pem
|
||||
*.keystore
|
||||
.jks
|
||||
*.bks
|
||||
*.rks
|
||||
hs_err_pid*
|
||||
replay_pid*
|
||||
|
||||
# ========== Node.js/Vue ==========
|
||||
dist/
|
||||
dist-ssr
|
||||
*.local
|
||||
pnpm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-store/
|
||||
.eslintcache
|
||||
.stylelintcache
|
||||
coverage/
|
||||
.nyc_output/
|
||||
*.tsbuildinfo
|
||||
vite.config.ts.timestamp-*
|
||||
13
.mcp.json
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"mcpServers": {
|
||||
"filesystem": {
|
||||
"command": "npx",
|
||||
"args": [
|
||||
"-y",
|
||||
"@modelcontextprotocol/server-filesystem",
|
||||
"/Volumes/Dpan/github/xlcp"
|
||||
]
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
BIN
.playwright-mcp/06-登录页完整版.png
Normal file
|
After Width: | Height: | Size: 618 KiB |
BIN
.playwright-mcp/07-监管看板.png
Normal file
|
After Width: | Height: | Size: 689 KiB |
BIN
.playwright-mcp/08-综合管理-评估报告.png
Normal file
|
After Width: | Height: | Size: 954 KiB |
BIN
.playwright-mcp/09-测评管理-测评问卷.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
.playwright-mcp/10-数据中心-狱政信息.png
Normal file
|
After Width: | Height: | Size: 681 KiB |
BIN
.playwright-mcp/11-数据中心-狱情平台.png
Normal file
|
After Width: | Height: | Size: 489 KiB |
BIN
.playwright-mcp/12-数据中心-危评系统.png
Normal file
|
After Width: | Height: | Size: 522 KiB |
BIN
.playwright-mcp/13-数据中心-消费系统.png
Normal file
|
After Width: | Height: | Size: 627 KiB |
BIN
.playwright-mcp/14-系统管理-租户管理.png
Normal file
|
After Width: | Height: | Size: 521 KiB |
BIN
.playwright-mcp/15-系统管理-部门管理.png
Normal file
|
After Width: | Height: | Size: 525 KiB |
BIN
.playwright-mcp/16-系统管理-用户管理.png
Normal file
|
After Width: | Height: | Size: 687 KiB |
BIN
.playwright-mcp/17-数据中心-数据汇总.png
Normal file
|
After Width: | Height: | Size: 621 KiB |
BIN
.playwright-mcp/18-数据中心-计分考核.png
Normal file
|
After Width: | Height: | Size: 497 KiB |
BIN
.playwright-mcp/测评问卷-编辑.png
Normal file
|
After Width: | Height: | Size: 383 KiB |
BIN
.playwright-mcp/测评问卷-预览.png
Normal file
|
After Width: | Height: | Size: 260 KiB |
154
AGENTS.md
Normal file
@ -0,0 +1,154 @@
|
||||
# AGENTS.md
|
||||
|
||||
This file provides guidance for AI agents working on the XL Prison Management System codebase.
|
||||
|
||||
## Project Overview
|
||||
|
||||
XL监狱综合管理平台 - A prison management platform built on the Yudao (芋道) framework.
|
||||
|
||||
**Tech Stack**: Java 17, Spring Boot 3.5.9, MyBatis-Plus, Vue 3.5.12, TypeScript 5.3.3, Element Plus, MySQL 8.0+
|
||||
|
||||
## Essential Commands
|
||||
|
||||
### Backend (Maven)
|
||||
```bash
|
||||
# Build all modules
|
||||
cd backend && mvn clean install -DskipTests
|
||||
|
||||
# Build prison module only
|
||||
cd backend/yudao-module-prison && mvn clean package
|
||||
|
||||
# Run dev server (port 48080)
|
||||
cd backend/yudao-server && mvn spring-boot:run
|
||||
|
||||
# Run all tests
|
||||
cd backend/yudao-module-prison && mvn test
|
||||
|
||||
# Run single test class
|
||||
mvn test -Dtest=PrisonAreaControllerTest
|
||||
|
||||
# Force update dependencies
|
||||
mvn clean install -U
|
||||
```
|
||||
|
||||
### Frontend (pnpm)
|
||||
```bash
|
||||
cd frontend
|
||||
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Dev server (local mode)
|
||||
pnpm dev
|
||||
|
||||
# TypeScript checking
|
||||
pnpm ts:check
|
||||
|
||||
# Build for different environments
|
||||
pnpm build:local # Uses .env.local
|
||||
pnpm build:dev # Uses .env.dev
|
||||
pnpm build:prod # Uses .env.prod
|
||||
|
||||
# Linting
|
||||
pnpm lint:eslint # ESLint check & fix (.js,.ts,.vue)
|
||||
pnpm lint:format # Prettier format
|
||||
pnpm lint:style # Stylelint fix
|
||||
```
|
||||
|
||||
### Quick Start with Make
|
||||
```bash
|
||||
make frontend # Start frontend dev server
|
||||
make backend # Start backend dev server
|
||||
make run # Start both
|
||||
```
|
||||
|
||||
## Code Style Guidelines
|
||||
|
||||
### Java (Backend)
|
||||
|
||||
**Imports**: Grouped by: Spring → Yudao → Third-party → Java stdlib. No wildcard imports.
|
||||
|
||||
**Naming Conventions**:
|
||||
- Classes: PascalCase (e.g., `PrisonAreaController`, `ScoreDO`)
|
||||
- Variables/Methods: camelCase (e.g., `getPage()`, `updateTime`)
|
||||
- Constants: UPPER_SNAKE_CASE (e.g., `DEFAULT_PAGE_SIZE`)
|
||||
- Package: `cn.iocoder.yudao.module.prison.{module}`
|
||||
|
||||
**VO Naming**: `SaveReqVO`, `PageReqVO`, `RespVO` suffixes required.
|
||||
|
||||
**Annotations**: Place on separate lines. Order: `@RestController` → `@RequestMapping` → `@Tag` → `@PreAuthorize`.
|
||||
|
||||
**Error Handling**: Use `CommonResult<T>` return type. Throw `ServiceException` for business errors with error codes from `ErrorCodeConstants`.
|
||||
|
||||
**Comments**: No comments unless explaining complex business logic. Javadoc only on public APIs.
|
||||
|
||||
### TypeScript/Vue (Frontend)
|
||||
|
||||
**Imports**: Sorted alphabetically. No unused imports. Use absolute imports (`@/`).
|
||||
|
||||
**Naming**:
|
||||
- Interfaces: PascalCase (e.g., `Area`, `QuestionnaireRecord`)
|
||||
- Variables/Props: camelCase
|
||||
- Components: PascalCase file names, kebab-case usage
|
||||
|
||||
**Types**: Avoid `any`. Use explicit types or `unknown` for union types.
|
||||
|
||||
**Vue Composition API**: Use `<script setup lang="ts">`. Use composables from `@/hooks`.
|
||||
|
||||
**Formatting**: Use Prettier (80 char line width). Vue single-file components: `<script>` → `<template>` → `<style>`.
|
||||
|
||||
**Error Handling**: Wrap async API calls in try/catch with user feedback.
|
||||
|
||||
## Architecture Patterns
|
||||
|
||||
### Backend Structure
|
||||
```
|
||||
controller/admin/{module}/ # REST API + VOs
|
||||
service/{module}/ # Business logic
|
||||
dal/dataobject/{module}/ # MyBatis-Plus entities
|
||||
dal/mysql/{module}/ # Mappers
|
||||
convert/{module}/ # MapStruct converters
|
||||
enums/ # Enum definitions
|
||||
```
|
||||
|
||||
### Frontend Structure
|
||||
```
|
||||
views/prison/{module}/ # Page components
|
||||
api/prison/{module}/ # API definitions + types
|
||||
types/ # Shared TypeScript types
|
||||
hooks/ # Composables
|
||||
```
|
||||
|
||||
### Data Flow
|
||||
Vue Component → API Layer → Controller → Service → Mapper → MySQL
|
||||
|
||||
## Database Conventions
|
||||
|
||||
- Table prefix: `prison_{module}` (e.g., `prison_area`, `prison_score`)
|
||||
- Common fields: `id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`
|
||||
- Soft delete via `deleted` bit(1) field
|
||||
- Use existing SQL migration scripts in `backend/sql/`
|
||||
|
||||
## API Conventions
|
||||
|
||||
- Base path: `/admin-api/prison/{module}`
|
||||
- Permission pattern: `prison:{module}:{action}` (e.g., `prison:area:create`)
|
||||
- Mock auth: `Authorization: Bearer emsoft{userId}` + `tenant-id: 1` header
|
||||
|
||||
## Cursor Rules
|
||||
|
||||
- Follow CLAUDE.md for technical decisions
|
||||
- Reference `.cursor/rules/usecluade.mdc` for Chinese language context
|
||||
|
||||
## Testing
|
||||
|
||||
- Backend tests: `src/test/java/...` with `-Test` suffix
|
||||
- Run specific test: `mvn test -Dtest=ClassName`
|
||||
- Frontend: Manual testing via `pnpm dev` + browser dev tools
|
||||
|
||||
## Important Notes
|
||||
|
||||
- Never commit secrets or credentials
|
||||
- Use mock mode for API testing (enabled in `application-local.yaml`)
|
||||
- Default backend port: 48080
|
||||
- Use `pnpm` for frontend, not `npm` or `yarn`
|
||||
459
CLAUDE.md
Normal file
@ -0,0 +1,459 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
XL Prison Management System (XL监狱综合管理平台) - A prison management platform built on the Yudao (芋道) project framework. Currently in active development phase integrating 8 prison-related modules.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
**Backend**: Java 17, Spring Boot 3.5.9, MyBatis-Plus, Maven multi-module, Spring Security, Swagger/OpenAPI 3
|
||||
**Frontend**: Vue 3.5.12, Vite 5.1.4, TypeScript 5.3.3, Element Plus, Pinia, Vue Router, Axios
|
||||
**Database**: MySQL 8.0+, Redis
|
||||
**Build Tools**: Maven 3.9+, pnpm 8.6+
|
||||
|
||||
## Commands
|
||||
|
||||
### Backend (Java/Maven)
|
||||
```bash
|
||||
# Build all modules (from backend directory)
|
||||
cd backend && mvn clean install -DskipTests
|
||||
|
||||
# Build specific prison module
|
||||
cd backend/yudao-module-prison && mvn clean package
|
||||
|
||||
# Run development server (from backend directory)
|
||||
cd backend/yudao-server && mvn spring-boot:run
|
||||
|
||||
# Run tests for prison module
|
||||
cd backend/yudao-module-prison && mvn test
|
||||
|
||||
# Run single test class
|
||||
mvn test -Dtest=GenderEnumTest
|
||||
```
|
||||
|
||||
### Frontend (Vue/Vite)
|
||||
```bash
|
||||
cd frontend
|
||||
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Dev server (local mode - uses .env.local)
|
||||
pnpm dev
|
||||
|
||||
# Dev server (development mode - uses .env.dev)
|
||||
pnpm dev-server
|
||||
|
||||
# TypeScript type checking
|
||||
pnpm ts:check
|
||||
|
||||
# Build for different environments
|
||||
pnpm build:local # Local build (uses .env.local)
|
||||
pnpm build:dev # Development build (uses .env.dev)
|
||||
pnpm build:test # Testing build (uses .env.test)
|
||||
pnpm build:prod # Production build (uses .env.prod)
|
||||
|
||||
# Linting and formatting
|
||||
pnpm lint:eslint # ESLint check and fix
|
||||
pnpm lint:format # Prettier format
|
||||
pnpm lint:style # Stylelint check and fix
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
### Backend Structure
|
||||
```
|
||||
backend/
|
||||
├── yudao-server/ # Main application entry (Spring Boot)
|
||||
├── yudao-framework/ # Core framework modules
|
||||
│ ├── yudao-spring-boot-starter-web
|
||||
│ ├── yudao-spring-boot-starter-security
|
||||
│ ├── yudao-spring-boot-starter-mybatis
|
||||
│ ├── yudao-spring-boot-starter-redis
|
||||
│ └── ...
|
||||
├── yudao-module-system/ # User/permission system module
|
||||
├── yudao-module-infra/ # Infrastructure (code generation, config)
|
||||
├── yudao-module-prison/ # Prison management module (active development)
|
||||
└── yudao-module-temp/ # Temporary/template module
|
||||
```
|
||||
|
||||
**Prison Module Structure** (`yudao-module-prison/`):
|
||||
```
|
||||
src/main/java/cn/iocoder/yudao/module/prison/
|
||||
├── controller/admin/{module}/ # REST API controllers
|
||||
│ ├── {Module}Controller.java # CRUD endpoints
|
||||
│ └── vo/ # Request/Response VO objects
|
||||
│ ├── {Module}SaveReqVO.java # Create/Update request
|
||||
│ ├── {Module}PageReqVO.java # Page query request
|
||||
│ ├── {Module}RespVO.java # Response object
|
||||
│ └── ...
|
||||
├── service/{module}/ # Service layer
|
||||
│ ├── {Module}Service.java # Service interface
|
||||
│ └── impl/
|
||||
│ └── {Module}ServiceImpl.java # Service implementation
|
||||
├── dal/ # Data access layer
|
||||
│ ├── dataobject/{module}/ # MyBatis-Plus DO objects
|
||||
│ │ └── {Module}DO.java
|
||||
│ ├── mysql/{module}/ # MyBatis mappers
|
||||
│ │ └── {Module}Mapper.java
|
||||
│ └── dal/ # Data access helpers
|
||||
├── convert/{module}/ # MapStruct converters
|
||||
│ └── {Module}Convert.java
|
||||
├── enums/ # Enum definitions
|
||||
│ └── {Module}Enum.java
|
||||
└── util/ # Utility classes
|
||||
```
|
||||
|
||||
**Database Schema Convention**:
|
||||
- Table prefix: `prison_{module}`
|
||||
- Common fields: `id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`
|
||||
- Soft delete: `deleted` bit(1) field
|
||||
- Tenant support: `tenant_id` bigint field
|
||||
|
||||
### Frontend Structure
|
||||
```
|
||||
frontend/src/
|
||||
├── views/prison/{module}/ # Page components
|
||||
│ ├── index.vue # List page with table/search
|
||||
│ └── {Module}Form.vue # Create/Edit form dialog
|
||||
├── api/prison/{module}/ # API definitions
|
||||
│ └── index.ts # Axios API calls + TypeScript types
|
||||
├── components/ # Shared components
|
||||
├── store/ # Pinia stores (state management)
|
||||
├── router/ # Vue Router config
|
||||
├── hooks/ # Composable hooks
|
||||
├── types/ # TypeScript type definitions
|
||||
├── utils/ # Utility functions
|
||||
└── config/ # Configuration files
|
||||
```
|
||||
|
||||
**Frontend API Pattern** (`api/prison/{module}/index.ts`):
|
||||
```typescript
|
||||
// Interface definitions
|
||||
export interface Area {
|
||||
id: number;
|
||||
name?: string;
|
||||
code: string;
|
||||
type: number;
|
||||
// ...
|
||||
}
|
||||
|
||||
// API object with methods
|
||||
export const AreaApi = {
|
||||
getAreaPage: async (params: any) => { ... },
|
||||
getArea: async (id: number) => { ... },
|
||||
createArea: async (data: Area) => { ... },
|
||||
updateArea: async (data: Area) => { ... },
|
||||
deleteArea: async (id: number) => { ... },
|
||||
deleteAreaList: async (ids: number[]) => { ... },
|
||||
exportArea: async (params) => { ... }
|
||||
}
|
||||
```
|
||||
|
||||
**Frontend View Pattern** (`views/prison/{module}/index.vue`):
|
||||
- Uses Element Plus table with pagination
|
||||
- Search form with filters
|
||||
- CRUD operations with dialog forms
|
||||
- Export functionality
|
||||
- Batch delete support
|
||||
|
||||
### Data Flow Pattern
|
||||
```
|
||||
Frontend (Vue Component)
|
||||
↓
|
||||
API Layer (TypeScript + Axios)
|
||||
↓
|
||||
Backend Controller (REST API)
|
||||
↓
|
||||
Service Layer (Business Logic)
|
||||
↓
|
||||
Data Access (MyBatis-Plus)
|
||||
↓
|
||||
MySQL Database
|
||||
```
|
||||
|
||||
## Current Integration Status
|
||||
|
||||
**8 Modules integrated into prison module**:
|
||||
| Module | Chinese | Backend Path | Frontend Path | Status |
|
||||
|--------|---------|--------------|---------------|--------|
|
||||
| Area | 监区管理 | `controller/admin/area/` | `views/prison/area/` | ✅ Complete |
|
||||
| Cell | 监室管理 | `controller/admin/cell/` | `views/prison/cell/` | ✅ Complete |
|
||||
| Consumption | 消费记录 | `controller/admin/consumption/` | `views/prison/consumption/` | ✅ Complete |
|
||||
| Question | 问卷问题 | `controller/admin/question/` | `views/prison/question/` | ✅ Complete |
|
||||
| Questionnaire | 问卷模板 | `controller/admin/questionnaire/` | `views/prison/questionnaire/` | ✅ Complete |
|
||||
| QuestionnaireRecord | 问卷答题记录 | `controller/admin/questionnairerecord/` | `views/prison/questionnairerecord/` | ✅ Complete |
|
||||
| RiskAssessment | 危险评估 | `controller/admin/riskassessment/` | `views/prison/riskassessment/` | ✅ Complete |
|
||||
| Score | 计分考核 | `controller/admin/score/` | `views/prison/score/` | ✅ Complete |
|
||||
|
||||
**Core Features per Module**:
|
||||
- ✅ RESTful CRUD API endpoints
|
||||
- ✅ MyBatis-Plus data access layer
|
||||
- ✅ Request/Response VO objects
|
||||
- ✅ MapStruct type conversion
|
||||
- ✅ Frontend list page with pagination
|
||||
- ✅ Frontend form dialogs for create/edit
|
||||
- ✅ Export to Excel functionality
|
||||
- ✅ Batch delete operations
|
||||
- ✅ Menu permissions SQL scripts
|
||||
|
||||
**Recent Updates (2026-01-15)**:
|
||||
- Code review completed for questionnaire modules (Question, Questionnaire, QuestionnaireRecord)
|
||||
- Backend fixes: VO field synchronization, batch update optimization, empty validation
|
||||
- Frontend fixes: TypeScript type definitions, date formatting standardization
|
||||
- Added enum classes: QuestionnaireStatusEnum, QuestionnaireRecordStatusEnum, QuestionnaireRecordPassStatusEnum
|
||||
- Added database migration scripts for new columns
|
||||
|
||||
## Database Configuration
|
||||
|
||||
修改表结构的是直接采用 mysql 命令进行操帮我操作
|
||||
|
||||
|
||||
**Development Database**:
|
||||
```
|
||||
URL: jdbc:mysql://192.168.10.130:3306/xlcp_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
|
||||
Username: xlcp_dev
|
||||
Password: xlcp_dev
|
||||
```
|
||||
|
||||
**SQL Scripts Location**:
|
||||
- Module tables and permissions: `backend/yudao-module-prison/src/main/resources/sql/prison_module.sql`
|
||||
- Execute this script to create all prison module tables and menu permissions
|
||||
|
||||
## Configuration Files
|
||||
|
||||
### Backend Configuration
|
||||
**Location**: `backend/yudao-server/src/main/resources/`
|
||||
|
||||
**Key Files**:
|
||||
- `application.yaml` - Base configuration
|
||||
- `application-local.yaml` - Local development (port 48080)
|
||||
- `application-dev.yaml` - Development environment
|
||||
|
||||
**Mock Settings** (application-local.yaml):
|
||||
```yaml
|
||||
yudao:
|
||||
security:
|
||||
mock-enable: true # 是否开启 Token 的模拟机制(生产环境必须关闭)
|
||||
mock-secret: emsoft # Token 模拟机制的 Token 前缀
|
||||
```
|
||||
|
||||
**使用场景**:方便使用 Postman、Swagger 调试接口时模拟 Token 认证,无需真实登录。
|
||||
|
||||
**多租户调用方式**:
|
||||
```bash
|
||||
# 格式:Authorization: Bearer {mockSecret}{用户ID}
|
||||
# 必须传递 tenant-id 请求头
|
||||
|
||||
curl -X GET "{{url}}" \
|
||||
-H "Authorization: Bearer emsoft1" \
|
||||
-H "tenant-id: 1"
|
||||
```
|
||||
|
||||
**说明**:
|
||||
| 参数 | 说明 | 示例值 |
|
||||
|------|------|--------|
|
||||
| `Authorization` | mock token,格式 `{mockSecret}{userId}` | `Bearer emsoft1` 表示用户 ID 为 1 |
|
||||
| `tenant-id` | 租户 ID(多租户场景必传) | `1` |
|
||||
|
||||
**示例**:
|
||||
- 模拟用户 ID=1,租户 ID=1:`Authorization: Bearer emsoft1` + `tenant-id: 1`
|
||||
- 模拟用户 ID=2,租户 ID=1:`Authorization: Bearer emsoft2` + `tenant-id: 1`
|
||||
|
||||
### Frontend Configuration
|
||||
**Location**: `frontend/`
|
||||
|
||||
**Key Files**:
|
||||
- `.env.local` - Local development environment
|
||||
- `.env.dev` - Development environment
|
||||
- `.env.test` - Testing environment
|
||||
- `.env.prod` - Production environment
|
||||
|
||||
**Local Environment** (.env.local):
|
||||
```
|
||||
VITE_BASE_URL='http://localhost:48080'
|
||||
VITE_API_URL='/admin-api'
|
||||
VITE_DEV=true
|
||||
```
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### Adding a New Module
|
||||
1. **Backend**:
|
||||
- Create package: `controller/admin/{module}/`, `service/{module}/`, `dal/dataobject/{module}/`, etc.
|
||||
- Define DO in `dal/dataobject/{module}/{Module}DO.java`
|
||||
- Create Mapper in `dal/mysql/{module}/{Module}Mapper.java`
|
||||
- Implement Service in `service/{module}/impl/{Module}ServiceImpl.java`
|
||||
- Create Controller in `controller/admin/{module}/{Module}Controller.java`
|
||||
- Define VOs in `controller/admin/{module}/vo/`
|
||||
- Add MapStruct converter in `convert/{module}/{Module}Convert.java`
|
||||
- Add enum if needed in `enums/`
|
||||
|
||||
2. **Frontend**:
|
||||
- Create API: `api/prison/{module}/index.ts`
|
||||
- Create views: `views/prison/{module}/index.vue` and `{Module}Form.vue`
|
||||
- Define TypeScript interfaces
|
||||
- Implement CRUD operations
|
||||
|
||||
3. **Database**:
|
||||
- Add table creation SQL to `backend/yudao-module-prison/src/main/resources/sql/prison_module.sql`
|
||||
- Add menu permission SQL
|
||||
|
||||
### Testing a Module
|
||||
**Backend**:
|
||||
```bash
|
||||
# Test all prison module
|
||||
cd backend/yudao-module-prison && mvn test
|
||||
|
||||
# Test specific class
|
||||
mvn test -Dtest=PrisonAreaControllerTest
|
||||
```
|
||||
|
||||
**Frontend**:
|
||||
```bash
|
||||
# Type check only
|
||||
cd frontend && pnpm ts:check
|
||||
|
||||
# Dev server with hot reload
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Backend Controller Pattern
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/prison/{module}")
|
||||
@Tag(name = "管理后台 - {中文名称}")
|
||||
public class {Module}Controller {
|
||||
|
||||
@Resource
|
||||
private {Module}Service {module}Service;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建{中文名称}")
|
||||
@PreAuthorize("@ss.hasPermission('prison:{module}:create')")
|
||||
public CommonResult<Long> create(@Valid @RequestBody {Module}SaveReqVO vo) {
|
||||
return success({module}Service.create(vo));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新{中文名称}")
|
||||
@PreAuthorize("@ss.hasPermission('prison:{module}:update')")
|
||||
public CommonResult<Boolean> update(@Valid @RequestBody {Module}SaveReqVO vo) {
|
||||
return success({module}Service.update(vo));
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除{中文名称}")
|
||||
@PreAuthorize("@ss.hasPermission('prison:{module}:delete')")
|
||||
public CommonResult<Boolean> delete(@RequestParam("id") Long id) {
|
||||
return success({module}Service.delete(id));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "分页查询{中文名称}")
|
||||
@PreAuthorize("@ss.hasPermission('prison:{module}:query')")
|
||||
public CommonResult<PageResult<{Module}RespVO>> page(@Valid {Module}PageReqVO vo) {
|
||||
return success({module}Service.page(vo));
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "查询{中文名称}详情")
|
||||
@PreAuthorize("@ss.hasPermission('prison:{module}:query')")
|
||||
public CommonResult<{Module}RespVO> get(@RequestParam("id") Long id) {
|
||||
return success({module}Service.get(id));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出{中文名称} Excel")
|
||||
@PreAuthorize("@ss.hasPermission('prison:{module}:export')")
|
||||
public void exportExcel(@Valid {Module}PageReqVO vo, HttpServletResponse response) {
|
||||
{module}Service.exportExcel(vo, response);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Service Layer Pattern
|
||||
```java
|
||||
public interface {Module}Service {
|
||||
Long create({Module}SaveReqVO vo);
|
||||
Boolean update({Module}SaveReqVO vo);
|
||||
Boolean delete(Long id);
|
||||
{Module}RespVO get(Long id);
|
||||
PageResult<{Module}RespVO> page({Module}PageReqVO vo);
|
||||
void exportExcel({Module}PageReqVO vo, HttpServletResponse response);
|
||||
}
|
||||
```
|
||||
|
||||
### Frontend API Pattern
|
||||
```typescript
|
||||
export interface {Module} {
|
||||
id: number;
|
||||
// ... other fields
|
||||
}
|
||||
|
||||
export const {Module}Api = {
|
||||
getPage: async (params: any) => {
|
||||
return await request.get({ url: `/{module}/page`, params })
|
||||
},
|
||||
get: async (id: number) => {
|
||||
return await request.get({ url: `/{module}/get?id=${id}` })
|
||||
},
|
||||
create: async (data: {Module}) => {
|
||||
return await request.post({ url: `/{module}/create`, data })
|
||||
},
|
||||
update: async (data: {Module}) => {
|
||||
return await request.put({ url: `/{module}/update`, data })
|
||||
},
|
||||
delete: async (id: number) => {
|
||||
return await request.delete({ url: `/{module}/delete?id=${id}` })
|
||||
},
|
||||
deleteList: async (ids: number[]) => {
|
||||
return await request.delete({ url: `/{module}/delete-list?ids=${ids.join(',')}` })
|
||||
},
|
||||
export: async (params) => {
|
||||
return await request.download({ url: `/{module}/export-excel`, params })
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **Package Prefix**: All prison module classes use `cn.iocoder.yudao.module.prison`
|
||||
- **API Base Path**: `/admin-api/prison/{module}`
|
||||
- **Permission Codes**: Follow pattern `prison:{module}:{action}` (e.g., `prison:area:create`)
|
||||
- **Frontend Paths**: Use `views/prison/` and `api/prison/` directories
|
||||
- **Database Tables**: Use `prison_` prefix and soft delete (`deleted` field)
|
||||
- **Error Codes**: Defined in `ErrorCodeConstants.java` (shared across modules)
|
||||
- **Enum Types**: Defined in `enums/` directory with `Enum` suffix
|
||||
- **VO Naming**: `SaveReqVO`, `PageReqVO`, `RespVO` suffixes
|
||||
- **DO Naming**: `{Module}DO` with table mapping via `@TableName`
|
||||
- **Mapper Naming**: `{Module}Mapper` extending `BaseMapper<{Module}DO>`
|
||||
- **Service Impl**: Located in `service/{module}/impl/` directory
|
||||
|
||||
## Code Generation
|
||||
|
||||
**Source**: `codegen/` directory contains template files for generating new modules
|
||||
**Usage**: Copy and adapt these templates when adding new prison modules
|
||||
|
||||
## Build & Deployment
|
||||
|
||||
**Backend JAR**: `backend/yudao-server/target/yudao-server-{version}.jar`
|
||||
**Frontend Dist**: `frontend/dist/` (static files for nginx)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Common Issues**:
|
||||
1. **Maven dependency issues**: Run `mvn clean install -U` to force update
|
||||
2. **Frontend type errors**: Run `pnpm ts:check` to identify issues
|
||||
3. **Database connection**: Verify MySQL is running and credentials in `application-local.yaml`
|
||||
4. **Mock mode**: Check `yudao.mock.enable` setting in configuration
|
||||
5. **Port conflicts**: Default backend port is 48080
|
||||
|
||||
**Debug Mode**:
|
||||
- Backend: Add `--debug` to mvn command for remote debugging on port 5005
|
||||
- Frontend: Browser dev tools + Vue DevTools browser extension
|
||||
|
||||
34
Makefile
Normal file
@ -0,0 +1,34 @@
|
||||
.PHONY: help frontend backend all
|
||||
|
||||
# 默认目标
|
||||
all: help
|
||||
|
||||
# 前端开发服务器
|
||||
frontend:
|
||||
@echo "启动前端开发服务器..."
|
||||
cd frontend && pnpm dev
|
||||
|
||||
# 后端开发服务器
|
||||
backend:
|
||||
@echo "启动后端开发服务器..."
|
||||
cd backend/yudao-server && mvn clean compile -DskipTests && mvn spring-boot:run
|
||||
|
||||
# 停止后端 n
|
||||
|
||||
|
||||
# 同时启动前后端
|
||||
run: frontend backend
|
||||
@echo "前后端服务已全部启动"
|
||||
|
||||
prison:
|
||||
@echo "编译监狱模块..."
|
||||
cd backend/yudao-server && mvn compile -pl :yudao-module-prison -am
|
||||
|
||||
# 查看帮助
|
||||
help:
|
||||
@echo "可用的 Make 命令:"
|
||||
@echo ""
|
||||
@echo " make frontend - 启动前端开发服务器"
|
||||
@echo " make backend - 启动后端开发服务器"
|
||||
@echo " make run - 同时启动前后端"
|
||||
@echo " make help - 显示此帮助信息"
|
||||
1099
XL监狱综合管理平台-监区犯人管理改造设计方案.md
Normal file
306
XL监狱综合管理平台-系统功能文档.md
Normal file
@ -0,0 +1,306 @@
|
||||
# XL监狱综合管理平台 - 系统功能文档
|
||||
|
||||
> 基于界面截图分析生成
|
||||
|
||||
---
|
||||
|
||||
## 1. 系统概述
|
||||
|
||||
XL监狱综合管理平台是一套完整的监狱信息化管理系统,提供罪犯管理、数据分析、测评评估等功能模块,支持多租户架构。
|
||||
|
||||
---
|
||||
|
||||
## 2. 登录模块
|
||||
|
||||
### 2.1 登录界面
|
||||
- **登录方式**:用户名 + 密码
|
||||
- **安全验证**:验证码
|
||||
- **辅助功能**:记住密码
|
||||
|
||||
---
|
||||
|
||||
## 3. 监管看板(首页仪表盘)
|
||||
|
||||
监管看板是系统的首页,展示监狱实时运行数据。
|
||||
|
||||
### 3.1 数据统计卡片
|
||||
|
||||
| 指标名称 | 说明 |
|
||||
|---------|------|
|
||||
| 在册罪犯 | 当前监狱总人数统计 |
|
||||
| 已移交 | 已转移/移交人数统计 |
|
||||
| 就医人数 | 当前就医中的人数 |
|
||||
| 当前位置 | 罪犯当前位置分布统计 |
|
||||
|
||||
### 3.2 可视化图表
|
||||
|
||||
| 图表类型 | 展示内容 |
|
||||
|---------|---------|
|
||||
| 年龄分布饼图 | 罪犯年龄结构分析 |
|
||||
| 刑期分布饼图 | 刑期长短分布统计 |
|
||||
| 文化程度分布饼图 | 罪犯学历结构 |
|
||||
| 省份分布地图 | 罪犯籍贯地域分布 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 综合管理
|
||||
|
||||
### 4.1 评估报告管理
|
||||
|
||||
#### 功能描述
|
||||
对各类评估报告进行统一管理和维护。
|
||||
|
||||
#### 筛选条件
|
||||
- 报告名称
|
||||
- 报告类型
|
||||
- 评估时间
|
||||
- 状态
|
||||
|
||||
#### 列表字段
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| 报告名称 | 评估报告标题 |
|
||||
| 评估类型 | 评估分类 |
|
||||
| 评估时间段 | 评估覆盖的时间范围 |
|
||||
| 综合评分 | 总体评分结果 |
|
||||
| 评估人员 | 评估操作人 |
|
||||
| 创建时间 | 报告生成时间 |
|
||||
| 状态 | 报告状态 |
|
||||
|
||||
#### 操作功能
|
||||
- 预览:查看报告内容
|
||||
- 下载:导出报告文件
|
||||
- 删除:移除报告
|
||||
|
||||
---
|
||||
|
||||
## 5. 测评管理
|
||||
|
||||
### 5.1 测评问卷管理
|
||||
|
||||
#### 功能描述
|
||||
创建、管理测评问卷,支持问卷的完整生命周期管理。
|
||||
|
||||
#### 列表字段
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| 问卷名称 | 问卷标题 |
|
||||
| 分类 | 问卷所属类别 |
|
||||
| 总分 | 问卷总分值 |
|
||||
| 题目数 | 包含的题目数量 |
|
||||
| 创建人 | 问卷创建者 |
|
||||
| 创建时间 | 问卷创建时间 |
|
||||
| 发布状态 | 已发布/未发布 |
|
||||
|
||||
#### 操作功能
|
||||
- 预览:查看问卷内容
|
||||
- 编辑:修改问卷配置
|
||||
- 复制:创建问卷副本
|
||||
- 删除:删除问卷
|
||||
- 发布/下架:控制问卷可用状态
|
||||
|
||||
### 5.2 问卷编辑功能
|
||||
|
||||
#### 支持题型
|
||||
| 题型 | 说明 |
|
||||
|------|------|
|
||||
| 单选 | 单选题,选项唯一 |
|
||||
| 多选 | 多选题,可选多个答案 |
|
||||
| 判断 | 是/非判断题 |
|
||||
| 填空 | 开放式填空 |
|
||||
| 简述 | 简答题,需要文字描述 |
|
||||
|
||||
#### 编辑功能
|
||||
- 题目序号自动生成
|
||||
- 分值设置(可配置每题分值)
|
||||
- 保存草稿
|
||||
- 发布问卷
|
||||
|
||||
---
|
||||
|
||||
## 6. 数据中心
|
||||
|
||||
数据中心提供各类业务数据的查询、统计和分析功能。
|
||||
|
||||
### 6.1 狱政信息
|
||||
|
||||
#### 功能描述
|
||||
管理罪犯基本信息和档案数据。
|
||||
|
||||
#### 查询字段
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| 姓名 | 罪犯姓名 |
|
||||
| 编号 | 罪犯唯一标识 |
|
||||
| 监区 | 所属监区 |
|
||||
| 入监时间 | 入狱时间 |
|
||||
| 刑期状态 | 服刑阶段 |
|
||||
|
||||
### 6.2 狱情平台
|
||||
|
||||
#### 功能描述
|
||||
监控监狱动态,记录和预警狱情信息。
|
||||
|
||||
#### 核心功能
|
||||
- 狱情动态监控
|
||||
- 预警信息管理
|
||||
- 事件记录追踪
|
||||
|
||||
### 6.3 危评系统
|
||||
|
||||
#### 功能描述
|
||||
对罪犯进行危险评估和风险等级划分。
|
||||
|
||||
#### 功能要点
|
||||
- 风险评估指标管理
|
||||
- 风险等级划分
|
||||
- 评估结果记录
|
||||
|
||||
### 6.4 消费系统
|
||||
|
||||
#### 功能描述
|
||||
管理罪犯的消费账户和交易记录。
|
||||
|
||||
#### 功能模块
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| 消费记录 | 消费明细查询 |
|
||||
| 账户余额 | 账户资金查询 |
|
||||
| 交易明细 | 每笔交易详情 |
|
||||
|
||||
### 6.5 数据汇总
|
||||
|
||||
#### 功能描述
|
||||
多维度数据统计和图表展示。
|
||||
|
||||
#### 展示内容
|
||||
- 综合数据统计
|
||||
- 趋势图表分析
|
||||
- 数据对比分析
|
||||
|
||||
### 6.6 计分考核
|
||||
|
||||
#### 功能描述
|
||||
对罪犯进行计分考核和绩效评估。
|
||||
|
||||
#### 功能要点
|
||||
- 日常表现计分
|
||||
- 考核周期管理
|
||||
- 绩效评估汇总
|
||||
|
||||
---
|
||||
|
||||
## 7. 系统管理
|
||||
|
||||
### 7.1 租户管理
|
||||
|
||||
#### 功能描述
|
||||
管理系统租户,支持多租户架构。
|
||||
|
||||
#### 列表字段
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| 租户名称 | 租户/机构名称 |
|
||||
| 联系人 | 租户负责人 |
|
||||
| 电话 | 联系电话 |
|
||||
| 状态 | 启用/停用 |
|
||||
|
||||
#### 操作功能
|
||||
- 新增租户
|
||||
- 修改租户信息
|
||||
- 启用/停用
|
||||
- 删除租户
|
||||
|
||||
### 7.2 部门管理
|
||||
|
||||
#### 功能描述
|
||||
维护组织架构中的部门信息。
|
||||
|
||||
#### 列表字段
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| 部门名称 | 部门名称 |
|
||||
| 部门编码 | 部门唯一标识 |
|
||||
| 上级部门 | 所属上级部门 |
|
||||
| 排序 | 显示顺序 |
|
||||
|
||||
#### 操作功能
|
||||
- 新增部门
|
||||
- 修改部门信息
|
||||
- 删除部门
|
||||
|
||||
### 7.3 用户管理
|
||||
|
||||
#### 功能描述
|
||||
管理系统用户账号和权限。
|
||||
|
||||
#### 列表字段
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| 姓名 | 用户真实姓名 |
|
||||
| 用户名 | 登录账号 |
|
||||
| 手机号 | 联系电话 |
|
||||
| 所属部门 | 所在部门 |
|
||||
| 角色 | 用户角色 |
|
||||
| 状态 | 启用/停用 |
|
||||
|
||||
#### 操作功能
|
||||
- 新增用户
|
||||
- 重置密码
|
||||
- 修改用户信息
|
||||
- 删除用户
|
||||
- 启用/停用
|
||||
|
||||
---
|
||||
|
||||
## 8. 界面通用特性
|
||||
|
||||
### 8.1 布局结构
|
||||
- **左侧导航栏**:固定侧边菜单,支持多级模块展开/折叠
|
||||
- **面包屑导航**:显示当前页面路径
|
||||
- **顶部工具栏**:用户信息、全局操作
|
||||
|
||||
### 8.2 交互功能
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| 搜索筛选 | 多条件组合查询 |
|
||||
| 数据表格 | 支持排序、分页 |
|
||||
| 批量操作 | 批量删除、批量启用等 |
|
||||
| 状态标签 | 可视化状态展示 |
|
||||
|
||||
### 8.3 状态标识
|
||||
- **发布状态**:已发布 / 未发布
|
||||
- **账户状态**:启用 / 停用
|
||||
- **数据状态**:有效 / 无效
|
||||
|
||||
---
|
||||
|
||||
## 9. 技术架构(推测)
|
||||
|
||||
基于界面分析,系统可能采用的技术栈:
|
||||
|
||||
| 层级 | 技术选型(推测) |
|
||||
|------|-----------------|
|
||||
| 前端框架 | Vue.js / React |
|
||||
| UI组件库 | Element UI / Ant Design |
|
||||
| 图表库 | ECharts |
|
||||
| 状态管理 | Vuex / Redux |
|
||||
| 路由管理 | Vue Router |
|
||||
|
||||
---
|
||||
|
||||
## 10. 功能模块清单
|
||||
|
||||
| 序号 | 模块 | 功能项 |
|
||||
|:----:|------|--------|
|
||||
| 1 | 登录模块 | 用户登录、验证码、记住密码 |
|
||||
| 2 | 监管看板 | 数据统计、图表展示 |
|
||||
| 3 | 综合管理 | 评估报告管理 |
|
||||
| 4 | 测评管理 | 问卷管理、问卷编辑、发布管理 |
|
||||
| 5 | 数据中心 | 狱政信息、狱情平台、危评系统、消费系统、数据汇总、计分考核 |
|
||||
| 6 | 系统管理 | 租户管理、部门管理、用户管理 |
|
||||
|
||||
---
|
||||
|
||||
*文档生成时间:2026-01-12*
|
||||
*基于 .playwright-mcp 目录下截图分析*
|
||||
450
XL监狱综合管理平台-需求拆解文档.md
Normal file
@ -0,0 +1,450 @@
|
||||
# XL监狱综合管理平台 - 需求拆解与开发计划
|
||||
|
||||
> 文档版本:v1.0
|
||||
> 创建日期:2026-01-12
|
||||
> 状态:待评审
|
||||
|
||||
---
|
||||
|
||||
## 一、项目概述
|
||||
|
||||
### 1.1 项目背景
|
||||
XL监狱综合管理平台是面向监狱管理的信息化系统,基于芋道源码(yudao-boot-mini)进行二次开发,实现罪犯管理、教育改造、考核评估等业务的规范化、智能化。
|
||||
|
||||
### 1.2 技术选型
|
||||
|
||||
| 层级 | 技术选型 | 版本 |
|
||||
|------|---------|------|
|
||||
| 后端框架 | Spring Boot | 3.5.9 |
|
||||
| Java版本 | JDK | 17 |
|
||||
| ORM框架 | MyBatis-Plus | 3.5.7 |
|
||||
| 安全框架 | Spring Security | 5.7.11 |
|
||||
| 缓存 | Redis + Redisson | - |
|
||||
| 前端框架 | Vue3 | 3.3.8 |
|
||||
| 构建工具 | Vite | 4.5.0 |
|
||||
| UI组件 | Element Plus | 2.4.2 |
|
||||
| 包管理 | pnpm | ≥8.6.0 |
|
||||
|
||||
### 1.3 代码仓库
|
||||
|
||||
| 仓库 | 地址 |
|
||||
|------|------|
|
||||
| 后端 | https://gitea.devops.1msoft.cn/tangweijie/xlcp-backend |
|
||||
| 前端 | https://gitea.devops.1msoft.cn/tangweijie/xlcp-frontend |
|
||||
|
||||
---
|
||||
|
||||
## 二、功能模块拆解
|
||||
|
||||
### 模块总览
|
||||
|
||||
```
|
||||
XL监狱综合管理平台
|
||||
├── 监管看板 (首页仪表盘)
|
||||
├── 综合管理 (评估报告)
|
||||
├── 测评管理 (测评问卷)
|
||||
├── 数据中心 (6个子模块)
|
||||
│ ├── 狱政信息
|
||||
│ ├── 狱情平台
|
||||
│ ├── 危评系统
|
||||
│ ├── 消费系统
|
||||
│ ├── 数据汇总
|
||||
│ └── 计分考核
|
||||
└── 系统管理 (租户/部门/用户)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、详细需求拆解
|
||||
|
||||
### Phase 1:基础平台搭建(P0)
|
||||
|
||||
#### 任务1.1:项目初始化与环境配置
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 预估工时 | 状态 |
|
||||
|--------|---------|------|---------|------|
|
||||
| T-001 | 后端项目初始化 | 基于芋道源码配置数据库连接、Redis等 | 4h | TODO |
|
||||
| T-002 | 前端项目初始化 | 配置API地址、开发环境 | 2h | TODO |
|
||||
| T-003 | 数据库初始化 | 创建xlcp_dev数据库,导入基础表结构 | 2h | TODO |
|
||||
| T-004 | 统一代码规范 | 配置ESLint、Prettier、Git Hooks | 2h | TODO |
|
||||
|
||||
#### 任务1.2:系统管理模块(芋道已有,适配即可)
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 预估工时 | 状态 |
|
||||
|--------|---------|------|---------|------|
|
||||
| T-005 | 用户管理适配 | 芋道已有,适配监狱业务角色 | 4h | TODO |
|
||||
| T-006 | 角色权限适配 | 配置罪犯管理相关权限 | 4h | TODO |
|
||||
| T-007 | 部门管理适配 | 适配监区、部门架构 | 2h | TODO |
|
||||
| T-008 | 租户管理配置 | 配置默认租户信息 | 1h | TODO |
|
||||
|
||||
**芋道已有功能(无需开发,直接使用):**
|
||||
- ✅ 用户管理、角色管理、菜单管理
|
||||
- ✅ 部门管理、岗位管理
|
||||
- ✅ 字典管理、敏感词管理
|
||||
- ✅ 操作日志、登录日志
|
||||
- ✅ 定时任务、文件服务
|
||||
- ✅ 代码生成器、API文档
|
||||
|
||||
---
|
||||
|
||||
### Phase 2:核心业务模块开发(P0)
|
||||
|
||||
#### 任务2.1:监管看板模块
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-101 | 首页框架搭建 | 布局结构、导航菜单 | P0 | 4h | TODO |
|
||||
| T-102 | 核心指标卡片 | 在册罪犯、已移交、就医人数、当前位置 | P0 | 4h | TODO |
|
||||
| T-103 | 年龄分布图表 | ECharts饼图 | P0 | 2h | TODO |
|
||||
| T-104 | 刑期分布图表 | ECharts饼图 | P0 | 2h | TODO |
|
||||
| T-105 | 文化程度图表 | ECharts饼图 | P0 | 2h | TODO |
|
||||
| T-106 | 省份分布地图 | ECharts地图热力图 | P0 | 4h | TODO |
|
||||
| T-107 | 数据脱敏组件 | 敏感信息脱敏显示 | P0 | 4h | TODO |
|
||||
|
||||
#### 任务2.2:狱政信息管理模块
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-201 | 罪犯基础信息表 | 设计并创建罪犯信息表 | P0 | 4h | TODO |
|
||||
| T-202 | 罪犯列表页面 | 列表查询、筛选、导出 | P0 | 6h | TODO |
|
||||
| T-203 | 罪犯详情页面 | 详细信息展示 | P0 | 4h | TODO |
|
||||
| T-204 | 入监登记功能 | 新增罪犯信息 | P0 | 4h | TODO |
|
||||
| T-205 | 出监管理功能 | 释放、移交登记 | P0 | 4h | TODO |
|
||||
| T-206 | 罪犯信息修改 | 信息维护 | P1 | 2h | TODO |
|
||||
| T-207 | 批量导入导出 | Excel导入导出 | P1 | 4h | TODO |
|
||||
|
||||
**数据模型设计 - 罪犯表**
|
||||
|
||||
```sql
|
||||
CREATE TABLE xlcp_prisoner (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
prisoner_no VARCHAR(32) NOT NULL COMMENT '罪犯编号',
|
||||
name VARCHAR(64) NOT NULL COMMENT '姓名',
|
||||
id_card VARCHAR(18) COMMENT '身份证号',
|
||||
gender TINYINT NOT NULL COMMENT '性别: 1男 2女',
|
||||
birthday DATE COMMENT '出生日期',
|
||||
nation VARCHAR(32) COMMENT '民族',
|
||||
native_place VARCHAR(128) COMMENT '籍贯',
|
||||
education VARCHAR(32) COMMENT '文化程度',
|
||||
address VARCHAR(512) COMMENT '家庭地址',
|
||||
crime_type VARCHAR(64) COMMENT '罪名',
|
||||
sentence_years INT COMMENT '刑期(年)',
|
||||
sentence_months INT COMMENT '刑期(月)',
|
||||
sentence_days INT COMMENT '刑期(日)',
|
||||
sentence_date DATE COMMENT '判决日期',
|
||||
enter_date DATE COMMENT '入监日期',
|
||||
release_date DATE COMMENT '刑满日期',
|
||||
prison_area VARCHAR(64) COMMENT '监区',
|
||||
manage_level VARCHAR(32) COMMENT '分管等级: 严管/普管/宽管',
|
||||
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态: 1在押 2释放 3移交',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
deleted TINYINT NOT NULL DEFAULT 0,
|
||||
INDEX idx_prisoner_no (prisoner_no),
|
||||
INDEX idx_name (name),
|
||||
INDEX idx_prison_area (prison_area),
|
||||
INDEX idx_status (status)
|
||||
) COMMENT '罪犯信息表';
|
||||
```
|
||||
|
||||
#### 任务2.3:计分考核模块
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-301 | 考核规则配置 | 配置考核项目和分值 | P0 | 4h | TODO |
|
||||
| T-302 | 日常考核记录 | 每日考核录入 | P0 | 6h | TODO |
|
||||
| T-303 | 月度考核汇总 | 自动计算月度得分 | P0 | 4h | TODO |
|
||||
| T-304 | 考核等级评定 | 根据分数评定等级 | P0 | 2h | TODO |
|
||||
| T-305 | 考核公示功能 | 考核结果公示 | P1 | 4h | TODO |
|
||||
| T-306 | 减刑假释关联 | 关联减刑假释流程 | P1 | 4h | TODO |
|
||||
|
||||
**考核项目配置表**
|
||||
|
||||
```sql
|
||||
CREATE TABLE xlcp_score_rule (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
category VARCHAR(32) NOT NULL COMMENT '类别: 劳动/教育/思想/卫生',
|
||||
item_name VARCHAR(64) NOT NULL COMMENT '项目名称',
|
||||
max_score DECIMAL(5,2) NOT NULL COMMENT '最高分值',
|
||||
min_score DECIMAL(5,2) NOT NULL COMMENT '最低分值',
|
||||
weight DECIMAL(5,2) DEFAULT 1 COMMENT '权重',
|
||||
status TINYINT NOT NULL DEFAULT 1,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX idx_category (category)
|
||||
) COMMENT '考核规则表';
|
||||
|
||||
CREATE TABLE xlcp_score_record (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
prisoner_id BIGINT NOT NULL COMMENT '罪犯ID',
|
||||
record_date DATE NOT NULL COMMENT '记录日期',
|
||||
category VARCHAR(32) NOT NULL COMMENT '考核类别',
|
||||
rule_id BIGINT NOT NULL COMMENT '规则ID',
|
||||
score DECIMAL(5,2) NOT NULL COMMENT '得分',
|
||||
remark VARCHAR(512) COMMENT '备注',
|
||||
recorder_id BIGINT NOT NULL COMMENT '记录人',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX idx_prisoner_date (prisoner_id, record_date)
|
||||
) COMMENT '日常考核记录表';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 3:测评管理模块(P0)
|
||||
|
||||
#### 任务3.1:测评问卷管理
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-401 | 问卷分类管理 | 问卷分类CRUD | P0 | 4h | TODO |
|
||||
| T-402 | 问卷列表页面 | 问卷列表、筛选、发布状态 | P0 | 4h | TODO |
|
||||
| T-403 | 问卷新增功能 | 创建问卷、设置属性 | P0 | 4h | TODO |
|
||||
| T-404 | 问卷编辑功能 | 修改问卷内容 | P0 | 8h | TODO |
|
||||
| T-405 | 问卷预览功能 | 预览问卷效果 | P0 | 2h | TODO |
|
||||
| T-406 | 问卷发布/下架 | 控制问卷可用状态 | P0 | 2h | TODO |
|
||||
| T-407 | 问卷复制功能 | 创建副本 | P1 | 2h | TODO |
|
||||
| T-408 | 问卷删除功能 | 删除问卷 | P1 | 1h | TODO |
|
||||
|
||||
#### 任务3.2:题目管理
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-411 | 单选题组件 | 单选题编辑与展示 | P0 | 4h | TODO |
|
||||
| T-412 | 多选题组件 | 多选题编辑与展示 | P0 | 4h | TODO |
|
||||
| T-413 | 判断题组件 | 判断题编辑与展示 | P0 | 2h | TODO |
|
||||
| T-414 | 填空题组件 | 填空题编辑与展示 | P0 | 2h | TODO |
|
||||
| T-415 | 简述题组件 | 简答题编辑与展示 | P0 | 2h | TODO |
|
||||
| T-416 | 题目排序 | 拖拽调整顺序 | P1 | 2h | TODO |
|
||||
| T-417 | 题目分值设置 | 配置每题分值 | P0 | 2h | TODO |
|
||||
|
||||
#### 任务3.3:测评执行
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-421 | 在线测评页面 | 答题界面 | P0 | 6h | TODO |
|
||||
| T-422 | 答题记录存储 | 保存答题结果 | P0 | 4h | TODO |
|
||||
| T-423 | 自动评分功能 | 客观题自动评分 | P0 | 4h | TODO |
|
||||
| T-424 | 测评结果查询 | 查询测评结果 | P0 | 4h | TODO |
|
||||
| T-425 | 测评统计分析 | 统计分析报表 | P1 | 6h | TODO |
|
||||
|
||||
**问卷表设计**
|
||||
|
||||
```sql
|
||||
CREATE TABLE xlcp_questionnaire (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
title VARCHAR(128) NOT NULL COMMENT '问卷标题',
|
||||
category_id BIGINT NOT NULL COMMENT '分类ID',
|
||||
description TEXT COMMENT '问卷描述',
|
||||
total_score DECIMAL(5,2) DEFAULT 0 COMMENT '总分',
|
||||
time_limit INT DEFAULT 0 COMMENT '时限(分钟),0表示不限时',
|
||||
passing_score DECIMAL(5,2) COMMENT '及格分数',
|
||||
is_repeatable TINYINT DEFAULT 0 COMMENT '是否允许重考: 0否 1是',
|
||||
status TINYINT NOT NULL DEFAULT 0 COMMENT '状态: 0草稿 1已发布 2已下架',
|
||||
creator_id BIGINT NOT NULL,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
published_at DATETIME COMMENT '发布时间',
|
||||
INDEX idx_category (category_id),
|
||||
INDEX idx_status (status)
|
||||
) COMMENT '问卷表';
|
||||
|
||||
CREATE TABLE xlcp_question (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
questionnaire_id BIGINT NOT NULL COMMENT '问卷ID',
|
||||
question_type VARCHAR(32) NOT NULL COMMENT '类型: SINGLE/MULTIPLE/BOOLEAN/FILL/ESSAY',
|
||||
question_text TEXT NOT NULL COMMENT '题目内容',
|
||||
question_order INT NOT NULL COMMENT '序号',
|
||||
score DECIMAL(5,2) DEFAULT 0 COMMENT '分值',
|
||||
is_required TINYINT DEFAULT 1 COMMENT '是否必答',
|
||||
INDEX q_id (questionnaire_id)
|
||||
) COMMENT '题目表';
|
||||
|
||||
CREATE TABLE xlcp_question_option (
|
||||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
question_id BIGINT NOT NULL COMMENT '题目ID',
|
||||
option_code VARCHAR(8) NOT NULL COMMENT '选项编码',
|
||||
option_text VARCHAR(256) NOT NULL COMMENT '选项内容',
|
||||
score DECIMAL(5,2) DEFAULT 0 COMMENT '得分',
|
||||
INDEX q_id (question_id)
|
||||
) COMMENT '题目选项表';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 4:数据中心模块(P1)
|
||||
|
||||
#### 任务4.1:狱情平台
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-501 | 狱情动态记录 | 记录狱内事件 | P1 | 4h | TODO |
|
||||
| T-502 | 预警信息管理 | 预警规则触发 | P1 | 6h | TODO |
|
||||
| T-503 | 事件登记 | 突发事件登记 | P1 | 4h | TODO |
|
||||
| T-504 | 事件处理跟踪 | 处理流程跟踪 | P1 | 4h | TODO |
|
||||
| T-505 | 应急预案管理 | 预案库管理 | P2 | 6h | TODO |
|
||||
|
||||
#### 任务4.2:危评系统
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-511 | 评估问卷配置 | 评估维度配置 | P1 | 4h | TODO |
|
||||
| T-512 | 危险评估录入 | 填写评估问卷 | P1 | 4h | TODO |
|
||||
| T-513 | 风险计算引擎 | 自动计算风险值 | P1 | 4h | TODO |
|
||||
| T-514 | 风险等级划分 | 确定风险等级 | P1 | 2h | TODO |
|
||||
| T-515 | 定期复评提醒 | 周期性重新评估 | P1 | 2h | TODO |
|
||||
| T-516 | 历史评估对比 | 与历史评估对比 | P2 | 4h | TODO |
|
||||
|
||||
#### 任务4.3:消费系统
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-521 | 账户余额管理 | 查询账户余额 | P1 | 2h | TODO |
|
||||
| T-522 | 家属存款 | 存款登记 | P1 | 4h | TODO |
|
||||
| T-523 | 消费记录查询 | 购物消费明细 | P1 | 2h | TODO |
|
||||
| T-524 | 消费限额设置 | 设置消费上限 | P1 | 2h | TODO |
|
||||
| T-525 | 消费统计分析 | 消费报表 | P1 | 4h | TODO |
|
||||
|
||||
#### 任务4.4:数据汇总
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-531 | 人口统计分析 | 在册、新增、释放统计 | P1 | 4h | TODO |
|
||||
| T-532 | 押犯构成分析 | 年龄、刑期、罪名分布 | P1 | 4h | TODO |
|
||||
| T-533 | 考核统计报表 | 考核分数分布 | P1 | 4h | TODO |
|
||||
| T-534 | 消费统计报表 | 人均消费、消费总额 | P1 | 4h | TODO |
|
||||
| T-535 | 评估统计报表 | 测评完成率、风险分布 | P1 | 4h | TODO |
|
||||
|
||||
---
|
||||
|
||||
### Phase 5:综合管理模块(P1)
|
||||
|
||||
#### 任务5.1:评估报告管理
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-601 | 报告模板管理 | 配置报告模板 | P1 | 4h | TODO |
|
||||
| T-602 | 报告生成 | 根据评估数据生成报告 | P1 | 6h | TODO |
|
||||
| T-603 | 报告预览 | 在线预览报告 | P1 | 2h | TODO |
|
||||
| T-604 | 报告下载 | 导出PDF/Word | P1 | 4h | TODO |
|
||||
| T-605 | 报告审核 | 审核发布报告 | P1 | 2h | TODO |
|
||||
| T-606 | 报告归档 | 长期保存 | P1 | 2h | TODO |
|
||||
|
||||
---
|
||||
|
||||
### Phase 6:智能化功能(P2)
|
||||
|
||||
#### 任务6.1:智能预警系统
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-701 | 行为异常检测 | 发现异常行为模式 | P2 | 8h | TODO |
|
||||
| T-702 | 消费异常预警 | 超阈值消费预警 | P2 | 4h | TODO |
|
||||
| T-703 | 考核下滑预警 | 连续下降趋势预警 | P2 | 4h | TODO |
|
||||
| T-704 | 风险评估模型 | 机器学习风险预测 | P2 | 12h | TODO |
|
||||
| T-705 | 预警通知 | 多渠道预警通知 | P2 | 4h | TODO |
|
||||
|
||||
#### 任务6.2:智能分析
|
||||
|
||||
| 任务ID | 任务名称 | 描述 | 优先级 | 预估工时 | 状态 |
|
||||
|--------|---------|------|--------|---------|------|
|
||||
| T-711 | 自动报表生成 | 根据数据自动生成分析报告 | P2 | 8h | TODO |
|
||||
| T-712 | 趋势预测 | 预测未来数据趋势 | P2 | 8h | TODO |
|
||||
| T-713 | 关联分析 | 发现数据关联关系 | P2 | 6h | TODO |
|
||||
|
||||
---
|
||||
|
||||
## 四、开发优先级矩阵
|
||||
|
||||
### P0 - 核心功能(必须完成)
|
||||
|
||||
| 序号 | 任务 | 预计工时 |
|
||||
|------|------|---------|
|
||||
| 1 | 项目初始化与环境配置 | 10h |
|
||||
| 2 | 监管看板(首页) | 18h |
|
||||
| 3 | 狱政信息管理(CRUD) | 24h |
|
||||
| 4 | 计分考核(核心) | 24h |
|
||||
| 5 | 测评问卷管理 | 40h |
|
||||
| 6 | 测评执行与评分 | 24h |
|
||||
| | **P0小计** | **140h** |
|
||||
|
||||
### P1 - 重要功能(计划完成)
|
||||
|
||||
| 序号 | 任务 | 预计工时 |
|
||||
|------|------|---------|
|
||||
| 1 | 狱情平台 | 22h |
|
||||
| 2 | 危评系统 | 22h |
|
||||
| 3 | 消费系统 | 18h |
|
||||
| 4 | 数据汇总报表 | 20h |
|
||||
| 5 | 评估报告管理 | 20h |
|
||||
| | **P1小计** | **102h** |
|
||||
|
||||
### P2 - 增值功能(选做)
|
||||
|
||||
| 序号 | 任务 | 预计工时 |
|
||||
|------|------|---------|
|
||||
| 1 | 智能预警系统 | 32h |
|
||||
| 2 | 智能分析功能 | 22h |
|
||||
| | **P2小计** | **54h** |
|
||||
|
||||
### 总工时估算
|
||||
|
||||
| 阶段 | 工时 |
|
||||
|------|------|
|
||||
| P0 核心功能 | 140h (约3.5周) |
|
||||
| P1 重要功能 | 102h (约2.5周) |
|
||||
| P2 增值功能 | 54h (约1.5周) |
|
||||
| **合计** | **296h (约7.5周)** |
|
||||
|
||||
---
|
||||
|
||||
## 五、里程碑计划
|
||||
|
||||
| 里程碑 | 内容 | 目标日期 |
|
||||
|--------|------|---------|
|
||||
| M1 | 项目启动、环境搭建完成 | 第1周末 |
|
||||
| M2 | 监管看板上线 | 第2周末 |
|
||||
| M3 | 狱政信息+计分考核上线 | 第4周末 |
|
||||
| M4 | 测评管理模块上线 | 第6周末 |
|
||||
| M5 | 数据中心核心功能上线 | 第7周末 |
|
||||
| M6 | 全部功能上线、测试完成 | 第8周末 |
|
||||
|
||||
---
|
||||
|
||||
## 六、验收标准
|
||||
|
||||
### 功能验收
|
||||
|
||||
- [ ] 监管看板各图表正常显示
|
||||
- [ ] 罪犯信息CRUD操作正常
|
||||
- [ ] 计分考核计算准确
|
||||
- [ ] 测评问卷支持5种题型
|
||||
- [ ] 测评自动评分正确
|
||||
- [ ] 数据统计报表准确
|
||||
|
||||
### 性能验收
|
||||
|
||||
- [ ] 页面加载时间 < 3秒
|
||||
- [ ] 接口响应时间 < 500ms
|
||||
- [ ] 支持100并发用户
|
||||
- [ ] 数据脱敏正常生效
|
||||
|
||||
### 安全验收
|
||||
|
||||
- [ ] 敏感数据脱敏显示
|
||||
- [ ] 操作日志完整记录
|
||||
- [ ] 权限控制生效
|
||||
- [ ] 无SQL注入/XSS漏洞
|
||||
|
||||
---
|
||||
|
||||
## 七、风险识别
|
||||
|
||||
| 风险项 | 影响 | 应对措施 |
|
||||
|--------|------|---------|
|
||||
| 需求变更 | 可能影响进度 | 定期评审、敏捷迭代 |
|
||||
| 技术难点 | 可能延期 | 预留缓冲时间、寻求技术支持 |
|
||||
| 数据安全 | 合规风险 | 严格遵循等保要求 |
|
||||
| 人员变动 | 项目风险 | 代码规范、文档完善 |
|
||||
|
||||
---
|
||||
|
||||
**文档创建:** Claude AI
|
||||
**待评审专家:** 王建国(监狱业务)、李明远(系统设计)、张AI(AI技术)
|
||||
824
XL监狱综合管理平台-需求文档-完善版.md
Normal file
@ -0,0 +1,824 @@
|
||||
# XL监狱综合管理平台 - 需求文档(完善版)
|
||||
|
||||
> 基于多专家联合评审 v2.0
|
||||
> 评审日期:2026-01-12
|
||||
> 状态:正式发布
|
||||
|
||||
---
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|---------|--------|
|
||||
| v1.0 | 2026-01-12 | 基于截图分析初版 | Claude |
|
||||
| v2.0 | 2026-01-12 | 多专家评审完善版 | 王建国/李明远/张AI |
|
||||
|
||||
---
|
||||
|
||||
## 第一部分:业务背景与目标
|
||||
|
||||
### 1.1 项目背景
|
||||
|
||||
XL监狱综合管理平台是面向监狱管理的信息化系统,旨在通过数字化手段提升监狱管理效率,实现罪犯管理、教育改造、考核评估等业务的规范化、智能化。
|
||||
|
||||
### 1.2 系统定位
|
||||
|
||||
| 定位维度 | 说明 |
|
||||
|---------|------|
|
||||
| **业务定位** | 监狱日常管理核心业务系统 |
|
||||
| **用户定位** | 监狱管理人员、狱警、干警 |
|
||||
| **技术定位** | B/S架构,支持内网部署 |
|
||||
| **安全定位** | 等保三级,数据本地化存储 |
|
||||
|
||||
### 1.3 合规性要求
|
||||
|
||||
⚠️ **重要:** 系统设计必须符合以下法律法规
|
||||
|
||||
- 《中华人民共和国监狱法》
|
||||
- 《中华人民共和国个人信息保护法》
|
||||
- 《中华人民共和国数据安全法》
|
||||
- 《监狱信息化建设规范》
|
||||
- 等保三级安全要求
|
||||
|
||||
---
|
||||
|
||||
## 第二部分:系统整体架构
|
||||
|
||||
### 2.1 技术架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 前端展现层 │
|
||||
│ Vue.js 3 + Element Plus + ECharts + Axios + Pinia │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ 网关层 │
|
||||
│ Spring Cloud Gateway / Nginx + OAuth2 │
|
||||
├────────────────┬────────────────┬───────────┬──────────────────┤
|
||||
│ 认证中心 │ 用户中心 │ 业务中台 │ 数据中台 │
|
||||
│ (认证鉴权) │ (用户管理) │ (业务逻辑)│ (数据处理) │
|
||||
│ │ │ │ │
|
||||
│ · SSO单点登录 │ · 用户管理 │ · 监管 │ · 数据采集 │
|
||||
│ · 双因素认证 │ · 角色管理 │ · 测评 │ · 数据清洗 │
|
||||
│ · Token管理 │ · 部门管理 │ · 评估 │ · 数据分析 │
|
||||
│ · 登录日志 │ · 权限控制 │ · 考核 │ · 报表生成 │
|
||||
│ │ · 租户管理 │ · 消费 │ · 数据服务 │
|
||||
├────────────────┴────────────────┴───────────┴──────────────────┤
|
||||
│ 数据存储层 │
|
||||
│ MySQL 8.0 + Redis + MinIO/OSS + Elasticsearch │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 2.2 部署架构
|
||||
|
||||
```
|
||||
┌─────────────────┐
|
||||
│ 互联网区 │
|
||||
│ (外部访问) │
|
||||
└────────┬────────┘
|
||||
│
|
||||
┌────────▼────────┐
|
||||
│ 隔离区 │
|
||||
│ (防火墙/WAF) │
|
||||
└────────┬────────┘
|
||||
│
|
||||
┌─────────────────────────┼─────────────────────────┐
|
||||
│ │ │
|
||||
┌────────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐
|
||||
│ 办公终端区 │ │ 应用服务区 │ │ 数据存储区 │
|
||||
│ (内网PC) │ │ (应用服务器) │ │ (数据库) │
|
||||
│ │ │ │ │ │
|
||||
│ · 管理工作站 │◄────►│ · Web服务器 │◄────►│ · 主从数据库 │
|
||||
│ · 查询终端 │ │ · API服务 │ │ · 缓存Redis │
|
||||
│ · 大屏展示 │ │ · AI推理服务 │ │ · 文件存储 │
|
||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
### 2.3 安全架构
|
||||
|
||||
| 安全层级 | 措施 |
|
||||
|---------|------|
|
||||
| **网络安全** | 防火墙、入侵检测、网络隔离 |
|
||||
| **应用安全** | XSS防护、SQL注入防护、CSRF防护 |
|
||||
| **数据安全** | 数据加密、敏感数据脱敏、数据备份 |
|
||||
| **访问控制** | RBAC权限模型、操作审计 |
|
||||
| **日志安全** | 操作日志、登录日志、安全事件日志 |
|
||||
|
||||
---
|
||||
|
||||
## 第三部分:功能模块详细设计
|
||||
|
||||
### 3.1 用户认证模块
|
||||
|
||||
#### 3.1.1 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 用户登录 | 用户名+密码登录 | P0 |
|
||||
| 验证码 | 图形验证码校验 | P0 |
|
||||
| 记住密码 | 记住用户名和密码 | P1 |
|
||||
| SSO单点登录 | 企业统一身份认证 | P2 |
|
||||
| 双因素认证 | 短信/令牌二次验证 | P2 |
|
||||
| 登录日志 | 记录登录行为 | P0 |
|
||||
| 密码策略 | 密码复杂度、定期更换 | P1 |
|
||||
| 登录锁定 | 多次失败锁定账户 | P1 |
|
||||
|
||||
#### 3.1.2 密码安全策略
|
||||
|
||||
```
|
||||
密码要求:
|
||||
├── 最小长度:8位
|
||||
├── 必须包含:大写字母、小写字母、数字、特殊字符
|
||||
├── 有效期:90天
|
||||
├── 历史密码:不能重复使用最近5次密码
|
||||
└── 锁定策略:连续5次失败锁定30分钟
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.2 监管看板模块
|
||||
|
||||
#### 3.2.1 功能描述
|
||||
系统首页,展示监狱运行关键数据指标的实时监控仪表盘。
|
||||
|
||||
#### 3.2.2 数据指标
|
||||
|
||||
##### 核心指标卡片
|
||||
|
||||
| 指标名称 | 数据类型 | 数据来源 | 刷新频率 |
|
||||
|---------|---------|---------|---------|
|
||||
| 在册罪犯 | 整数 | 罪犯表统计 | 实时 |
|
||||
| 已移交 | 整数 | 罪犯状态统计 | 实时 |
|
||||
| 就医人数 | 整数 | 罪犯就医记录 | 实时 |
|
||||
| 当前位置 | 分类统计 | 定位系统 | 实时 |
|
||||
|
||||
##### 可视化图表
|
||||
|
||||
| 图表类型 | 展示内容 | 交互功能 |
|
||||
|---------|---------|---------|
|
||||
| 年龄分布饼图 | 18-30, 31-50, 50+年龄段占比 | 鼠标悬停显示数值 |
|
||||
| 刑期分布饼图 | 1-3年, 3-5年, 5-10年, 10年+ | 鼠标悬停显示数值 |
|
||||
| 文化程度分布饼图 | 文盲, 小学, 初中, 高中, 大专+ | 鼠标悬停显示数值 |
|
||||
| 省份分布地图 | 中国地图热力图 | 点击显示省份详情 |
|
||||
|
||||
#### 3.2.3 数据脱敏规则
|
||||
|
||||
⚠️ **敏感数据处理**
|
||||
|
||||
| 数据项 | 脱敏规则 | 示例 |
|
||||
|-------|---------|------|
|
||||
| 罪犯姓名 | 隐藏中间字 | 张*三 |
|
||||
| 罪犯编号 | 部分隐藏 | 1234****890 |
|
||||
| 身份证号 | 隐藏出生日期 | 110101*******1234 |
|
||||
| 手机号 | 隐藏中间4位 | 138****5678 |
|
||||
| 家庭地址 | 隐藏详细地址 | 北京市*** |
|
||||
|
||||
---
|
||||
|
||||
### 3.3 综合管理模块
|
||||
|
||||
#### 3.3.1 评估报告管理
|
||||
|
||||
##### 功能流程
|
||||
```
|
||||
报告创建 → 评估执行 → 报告生成 → 审核发布 → 归档管理
|
||||
↓ ↓ ↓ ↓ ↓
|
||||
选择模板 采集数据 系统生成 人工审核 长期保存
|
||||
```
|
||||
|
||||
##### 评估类型
|
||||
|
||||
| 类型编码 | 类型名称 | 说明 |
|
||||
|---------|---------|------|
|
||||
| PSY001 | 心理测评 | SCL-90、MMPI等心理量表 |
|
||||
| RISK001 | 危险评估 | 再犯罪风险评估 |
|
||||
| ADAPT001 | 适应性评估 | 监狱生活适应性评估 |
|
||||
| REFORM001 | 改造评估 | 教育改造效果评估 |
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 报告查询 | 按名称、类型、时间、状态筛选 | P0 |
|
||||
| 报告预览 | 在线预览报告内容 | P0 |
|
||||
| 报告下载 | 导出PDF/Word格式 | P0 |
|
||||
| 报告删除 | 删除指定报告 | P1 |
|
||||
| 报告审核 | 审核发布报告 | P1 |
|
||||
| 报告模板管理 | 配置报告模板 | P2 |
|
||||
|
||||
##### 列表字段
|
||||
|
||||
| 字段 | 数据类型 | 是否必填 | 说明 |
|
||||
|------|---------|---------|------|
|
||||
| 报告名称 | 字符串 | 是 | 报告标题 |
|
||||
| 评估类型 | 枚举 | 是 | 见评估类型表 |
|
||||
| 评估时间段 | 日期范围 | 是 | 评估覆盖的时间 |
|
||||
| 综合评分 | 数值 | 是 | 0-100分 |
|
||||
| 评估人员 | 用户 | 是 | 操作人 |
|
||||
| 创建时间 | 日期时间 | 是 | 系统自动 |
|
||||
| 状态 | 枚举 | 是 | 草稿/已发布/已归档 |
|
||||
|
||||
---
|
||||
|
||||
### 3.4 测评管理模块
|
||||
|
||||
#### 3.4.1 测评问卷管理
|
||||
|
||||
##### 题型支持
|
||||
|
||||
| 题型 | 编码 | 特点 | 适用场景 |
|
||||
|------|------|------|---------|
|
||||
| 单选 | SINGLE | 只能选择一个选项 | 事实性判断 |
|
||||
| 多选 | MULTIPLE | 可选择多个选项 | 偏好选择 |
|
||||
| 判断 | BOOLEAN | 是/非判断 | 简单确认 |
|
||||
| 填空 | FILL | 开放式输入 | 补充信息 |
|
||||
| 简述 | ESSAY | 长文本输入 | 主观评价 |
|
||||
|
||||
##### 问卷属性
|
||||
|
||||
| 属性 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| 问卷名称 | 字符串 | 问卷标题 |
|
||||
| 分类 | 枚举 | 所属类别 |
|
||||
| 总分 | 数值 | 题目分值总和 |
|
||||
| 题目数 | 整数 | 题目数量 |
|
||||
| 时长限制 | 数值 | 答题时间限制(分钟) |
|
||||
| 及格分数 | 数值 | 及格分数线 |
|
||||
| 发布状态 | 布尔 | 是否已发布 |
|
||||
| 允许重考 | 布尔 | 是否可多次作答 |
|
||||
|
||||
##### 操作功能
|
||||
|
||||
| 操作 | 功能描述 | 权限要求 |
|
||||
|------|---------|---------|
|
||||
| 预览 | 查看问卷内容 | 问卷编辑 |
|
||||
| 编辑 | 修改问卷配置 | 问卷编辑 |
|
||||
| 复制 | 创建问卷副本 | 问卷编辑 |
|
||||
| 删除 | 删除问卷 | 问卷管理 |
|
||||
| 发布 | 使问卷可用 | 问卷管理 |
|
||||
| 下架 | 使问卷不可用 | 问卷管理 |
|
||||
| 统计 | 查看答题统计 | 问卷查看 |
|
||||
|
||||
#### 3.4.2 问卷编辑功能
|
||||
|
||||
##### 题目结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "Q001",
|
||||
"type": "SINGLE",
|
||||
"content": "您对目前的生活状况满意吗?",
|
||||
"options": [
|
||||
{"code": "A", "content": "非常满意", "score": 5},
|
||||
{"code": "B", "content": "比较满意", "score": 4},
|
||||
{"code": "C", "content": "一般", "score": 3},
|
||||
{"code": "D", "content": "不太满意", "score": 2},
|
||||
{"code": "E", "content": "不满意", "score": 1}
|
||||
],
|
||||
"score": 5,
|
||||
"required": true,
|
||||
"order": 1
|
||||
}
|
||||
```
|
||||
|
||||
##### 编辑操作
|
||||
|
||||
| 操作 | 功能 |
|
||||
|------|------|
|
||||
| 新增题目 | 添加新题目 |
|
||||
| 删除题目 | 移除题目 |
|
||||
| 移动题目 | 调整题目顺序 |
|
||||
| 复制题目 | 复制题目 |
|
||||
| 题目分组 | 将题目分组管理 |
|
||||
| 设置必答 | 标记必答题 |
|
||||
| 设置分值 | 设置每题分值 |
|
||||
|
||||
---
|
||||
|
||||
### 3.5 数据中心模块
|
||||
|
||||
#### 3.5.1 狱政信息管理
|
||||
|
||||
##### 功能概述
|
||||
管理罪犯基本信息和档案数据。
|
||||
|
||||
##### 罪犯基本信息
|
||||
|
||||
| 字段类别 | 字段名称 | 数据类型 | 脱敏规则 |
|
||||
|---------|---------|---------|---------|
|
||||
| **基本信息** | 姓名 | 字符串 | 脱敏 |
|
||||
| | 编号 | 字符串 | 部分脱敏 |
|
||||
| | 性别 | 枚举 | - |
|
||||
| | 出生日期 | 日期 | - |
|
||||
| | 民族 | 枚举 | - |
|
||||
| **案件信息** | 罪名 | 枚举 | - |
|
||||
| | 刑期 | 字符串 | - |
|
||||
| | 入监日期 | 日期 | - |
|
||||
| | 刑期起止 | 日期范围 | - |
|
||||
| | 余刑天数 | 计算值 | - |
|
||||
| **管理信息** | 监区 | 枚举 | - |
|
||||
| | 分管等级 | 枚举 | - |
|
||||
| | 服刑状态 | 枚举 | - |
|
||||
| **联系信息** | 籍贯 | 枚举 | 脱敏 |
|
||||
| | 家庭地址 | 字符串 | 完全脱敏 |
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 罪犯查询 | 多条件查询罪犯 | P0 |
|
||||
| 罪犯详情 | 查看罪犯档案 | P0 |
|
||||
| 新增罪犯 | 入监登记 | P1 |
|
||||
| 修改罪犯 | 信息维护 | P1 |
|
||||
| 出监管理 | 释放/移交登记 | P1 |
|
||||
| 批量导入 | Excel导入 | P2 |
|
||||
| 批量导出 | Excel导出 | P1 |
|
||||
|
||||
##### 业务流程
|
||||
|
||||
```
|
||||
入监登记流程:
|
||||
1. 采集基本信息(姓名、身份证、案件信息等)
|
||||
2. 分配监区
|
||||
3. 拍摄照片
|
||||
4. 分配床位
|
||||
5. 发放物资
|
||||
6. 完成登记
|
||||
|
||||
出监交接流程:
|
||||
1. 核对身份信息
|
||||
2. 结算账户余额
|
||||
3. 归还物品
|
||||
4. 制作释放证明
|
||||
5. 交接给家属/户籍地
|
||||
```
|
||||
|
||||
#### 3.5.2 狱情平台
|
||||
|
||||
##### 功能概述
|
||||
监控监狱动态,记录和预警狱情信息。
|
||||
|
||||
##### 功能模块
|
||||
|
||||
| 功能 | 描述 | 优先级 |
|
||||
|------|------|-------|
|
||||
| 狱情动态 | 记录狱内事件 | P0 |
|
||||
| 预警信息 | 预警规则触发 | P0 |
|
||||
| 事件登记 | 记录突发事件 | P1 |
|
||||
| 事件处理 | 处理流程跟踪 | P1 |
|
||||
| 应急预案 | 预案库管理 | P2 |
|
||||
| 舆情监控 | 网络舆情监测 | P2 |
|
||||
|
||||
##### 预警级别
|
||||
|
||||
| 级别 | 颜色 | 说明 |
|
||||
|------|------|------|
|
||||
| 一级预警 | 红色 | 重大事件,立即处理 |
|
||||
| 二级预警 | 橙色 | 紧急事件,尽快处理 |
|
||||
| 三级预警 | 黄色 | 一般事件,按流程处理 |
|
||||
| 提示信息 | 蓝色 | 关注信息 |
|
||||
|
||||
#### 3.5.3 危评系统
|
||||
|
||||
##### 功能概述
|
||||
对罪犯进行危险评估和风险等级划分。
|
||||
|
||||
##### 评估维度
|
||||
|
||||
| 维度 | 评估内容 | 权重 |
|
||||
|------|---------|------|
|
||||
| 犯罪史 | 前科情况、作案手段 | 20% |
|
||||
| 家庭背景 | 家庭环境、成长经历 | 15% |
|
||||
| 心理状态 | 人格特征、情绪管理 | 25% |
|
||||
| 社会支持 | 社交网络、帮教资源 | 15% |
|
||||
| 改造表现 | 服刑态度、遵守监规 | 25% |
|
||||
|
||||
##### 风险等级
|
||||
|
||||
| 等级 | 分值范围 | 管理措施 |
|
||||
|------|---------|---------|
|
||||
| 高风险 | ≥80分 | 严管、重点监控 |
|
||||
| 中风险 | 60-79分 | 普管、定期评估 |
|
||||
| 低风险 | <60分 | 宽管、常规管理 |
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 评估录入 | 填写评估问卷 | P0 |
|
||||
| 风险计算 | 自动计算风险值 | P0 |
|
||||
| 风险等级 | 确定风险等级 | P0 |
|
||||
| 评估报告 | 生成评估报告 | P1 |
|
||||
| 定期复评 | 周期性重新评估 | P1 |
|
||||
| 历史对比 | 与历史评估对比 | P2 |
|
||||
|
||||
#### 3.5.4 消费系统
|
||||
|
||||
##### 功能概述
|
||||
管理罪犯的消费账户和交易记录。
|
||||
|
||||
##### 账户结构
|
||||
|
||||
```
|
||||
账户层级:
|
||||
├── 基本账户(监狱发放)
|
||||
├── 劳动报酬账户(劳动补贴)
|
||||
├── 亲情账户(家属存款)
|
||||
└── 购物账户(日常消费)
|
||||
```
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 账户查询 | 查询账户余额 | P0 |
|
||||
| 存款管理 | 家属存款登记 | P1 |
|
||||
| 消费记录 | 购物消费明细 | P0 |
|
||||
| 消费限额 | 设置消费上限 | P1 |
|
||||
| 结算管理 | 月度结算 | P1 |
|
||||
| 报表统计 | 消费统计分析 | P1 |
|
||||
|
||||
#### 3.5.5 数据汇总
|
||||
|
||||
##### 功能概述
|
||||
多维度数据统计和图表展示。
|
||||
|
||||
##### 统计维度
|
||||
|
||||
| 维度 | 指标项 |
|
||||
|------|--------|
|
||||
| 人口统计 | 在册人数、新增人数、释放人数 |
|
||||
| 押犯构成 | 年龄、刑期、罪名、文化程度 |
|
||||
| 考核统计 | 考核分数分布、等级分布 |
|
||||
| 消费统计 | 人均消费、消费总额 |
|
||||
| 评估统计 | 测评完成率、风险分布 |
|
||||
|
||||
##### 报表类型
|
||||
|
||||
| 报表类型 | 生成频率 | 用途 |
|
||||
|---------|---------|------|
|
||||
| 日报 | 每日 | 日常监控 |
|
||||
| 周报 | 每周 | 工作汇报 |
|
||||
| 月报 | 每月 | 管理决策 |
|
||||
| 季报 | 每季 | 上级汇报 |
|
||||
| 年报 | 每年 | 总结分析 |
|
||||
|
||||
#### 3.5.6 计分考核
|
||||
|
||||
##### 功能概述
|
||||
对罪犯进行日常计分考核和阶段性绩效评估。
|
||||
|
||||
##### 考核项目
|
||||
|
||||
| 类别 | 分值 | 说明 |
|
||||
|------|------|------|
|
||||
| 劳动改造 | 0-35分 | 劳动表现、完成任务 |
|
||||
| 教育改造 | 0-30分 | 学习态度、考试成绩 |
|
||||
| 思想改造 | 0-20分 | 遵规守纪、思想汇报 |
|
||||
| 卫生文明 | 0-10分 | 内务卫生、礼貌言行 |
|
||||
| 加分项 | 0-5分 | 突出表现 |
|
||||
| 扣分项 | - | 违规违纪 |
|
||||
|
||||
##### 考核等级
|
||||
|
||||
| 等级 | 分值范围 | 奖罚措施 |
|
||||
|------|---------|---------|
|
||||
| 优秀 | ≥95分 | 优先减刑、物质奖励 |
|
||||
| 良好 | 85-94分 | 表扬 |
|
||||
| 合格 | 60-84分 | 正常待遇 |
|
||||
| 不合格 | <60分 | 警告、严管 |
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 日记录入 | 每日考核记录 | P0 |
|
||||
| 月度汇总 | 月度考核统计 | P0 |
|
||||
| 等级评定 | 考核等级评定 | P0 |
|
||||
| 考核公示 | 考核结果公示 | P1 |
|
||||
| 考核申诉 | 对考核结果申诉 | P2 |
|
||||
| 减刑关联 | 与减刑假释关联 | P1 |
|
||||
|
||||
---
|
||||
|
||||
### 3.6 系统管理模块
|
||||
|
||||
#### 3.6.1 租户管理
|
||||
|
||||
##### 功能概述
|
||||
支持多租户架构,管理不同使用单位。
|
||||
|
||||
##### 租户属性
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| 租户名称 | 字符串 | 单位名称 |
|
||||
| 租户编码 | 字符串 | 唯一标识 |
|
||||
| 联系人 | 字符串 | 负责人 |
|
||||
| 联系电话 | 字符串 | 联系方式 |
|
||||
| 联系地址 | 字符串 | 单位地址 |
|
||||
| 状态 | 枚举 | 启用/停用 |
|
||||
| 到期日期 | 日期 | 授权有效期 |
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 租户列表 | 查看所有租户 | P0 |
|
||||
| 新增租户 | 创建新租户 | P0 |
|
||||
| 修改租户 | 编辑租户信息 | P0 |
|
||||
| 删除租户 | 删除租户 | P1 |
|
||||
| 启用/停用 | 控制租户状态 | P0 |
|
||||
| 数据隔离 | 租户数据隔离 | P0 |
|
||||
|
||||
#### 3.6.2 部门管理
|
||||
|
||||
##### 功能概述
|
||||
维护组织架构,支持多级部门。
|
||||
|
||||
##### 部门属性
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| 部门名称 | 字符串 | 部门名称 |
|
||||
| 部门编码 | 字符串 | 唯一标识 |
|
||||
| 上级部门 | 外键 | 父部门 |
|
||||
| 排序 | 数值 | 显示顺序 |
|
||||
| 负责人 | 用户 | 部门负责人 |
|
||||
| 联系电话 | 字符串 | 部门电话 |
|
||||
| 状态 | 枚举 | 启用/停用 |
|
||||
|
||||
##### 组织架构示例
|
||||
|
||||
```
|
||||
XX监狱
|
||||
├── 办公室
|
||||
├── 政治处
|
||||
├── 刑罚执行科
|
||||
├── 狱政管理科
|
||||
├── 教育改造科
|
||||
│ ├── 心理矫治中心
|
||||
│ └── 文化教育中心
|
||||
├── 劳动改造科
|
||||
├── 生活卫生科
|
||||
│ ├── 医院
|
||||
│ └── 食堂
|
||||
└── 警戒护卫队
|
||||
```
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 部门列表 | 树形展示部门 | P0 |
|
||||
| 新增部门 | 添加部门 | P0 |
|
||||
| 修改部门 | 编辑部门信息 | P0 |
|
||||
| 删除部门 | 删除部门 | P1 |
|
||||
| 移动部门 | 调整部门层级 | P2 |
|
||||
|
||||
#### 3.6.3 用户管理
|
||||
|
||||
##### 用户属性
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| 姓名 | 字符串 | 真实姓名 |
|
||||
| 用户名 | 字符串 | 登录账号 |
|
||||
| 密码 | 加密字符串 | 登录密码 |
|
||||
| 手机号 | 字符串 | 联系电话 |
|
||||
| 邮箱 | 字符串 | 电子邮箱 |
|
||||
| 性别 | 枚举 | 性别 |
|
||||
| 头像 | 图片 | 用户头像 |
|
||||
| 所属部门 | 外键 | 所在部门 |
|
||||
| 角色 | 多对多 | 角色集合 |
|
||||
| 岗位 | 字符串 | 职务 |
|
||||
| 状态 | 枚举 | 启用/停用 |
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 用户列表 | 查看所有用户 | P0 |
|
||||
| 新增用户 | 创建用户账号 | P0 |
|
||||
| 重置密码 | 重置用户密码 | P0 |
|
||||
| 修改用户 | 编辑用户信息 | P0 |
|
||||
| 删除用户 | 删除用户账号 | P1 |
|
||||
| 启用/停用 | 控制用户状态 | P0 |
|
||||
| 分配角色 | 分配用户角色 | P0 |
|
||||
| 导出用户 | 导出用户列表 | P1 |
|
||||
|
||||
#### 3.6.4 角色权限管理
|
||||
|
||||
##### 权限模型
|
||||
|
||||
```
|
||||
RBAC权限模型:
|
||||
|
||||
用户 ── 角色 ── 权限
|
||||
│ │
|
||||
└── 多角色 └── 多权限
|
||||
|
||||
角色 ── 菜单权限(可见菜单)
|
||||
── 操作权限(按钮/功能)
|
||||
── 数据权限(数据范围)
|
||||
```
|
||||
|
||||
##### 权限类型
|
||||
|
||||
| 类型 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| 菜单权限 | 控制可见菜单 | 用户管理菜单 |
|
||||
| 操作权限 | 控制功能按钮 | 新增、修改、删除 |
|
||||
| 数据权限 | 控制数据范围 | 本部门数据、全部数据 |
|
||||
|
||||
##### 内置角色
|
||||
|
||||
| 角色编码 | 角色名称 | 权限描述 |
|
||||
|---------|---------|---------|
|
||||
| SUPER_ADMIN | 超级管理员 | 所有权限 |
|
||||
| TENANT_ADMIN | 租户管理员 | 租户下所有权限 |
|
||||
| DEPT_ADMIN | 部门管理员 | 本部门管理权限 |
|
||||
| NORMAL_USER | 普通用户 | 查看、填报权限 |
|
||||
| AUDITOR | 审计员 | 查看、审计权限 |
|
||||
|
||||
#### 3.6.5 操作日志
|
||||
|
||||
##### 日志类型
|
||||
|
||||
| 类型 | 说明 | 记录内容 |
|
||||
|------|------|---------|
|
||||
| 登录日志 | 用户登录记录 | 登录时间、IP、设备 |
|
||||
| 操作日志 | 用户操作记录 | 操作人、操作内容、操作时间 |
|
||||
| 异常日志 | 系统异常记录 | 异常信息、堆栈 |
|
||||
| 访问日志 | 接口访问记录 | 请求参数、响应时间 |
|
||||
|
||||
##### 功能清单
|
||||
|
||||
| 功能项 | 功能描述 | 优先级 |
|
||||
|-------|---------|--------|
|
||||
| 日志查询 | 按条件查询日志 | P0 |
|
||||
| 日志详情 | 查看日志详情 | P0 |
|
||||
| 日志导出 | 导出日志 | P1 |
|
||||
| 日志清理 | 定期清理历史日志 | P2 |
|
||||
|
||||
---
|
||||
|
||||
## 第四部分:智能化功能(AI增强)
|
||||
|
||||
### 4.1 智能预警系统
|
||||
|
||||
#### 4.1.1 预警模型
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ 智能预警分析引擎 │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 输入数据 分析模型 输出结果 │
|
||||
│ ──────── ──────── ──────── │
|
||||
│ │
|
||||
│ 行为数据 ─────► 异常检测模型 ─────► 行为异常预警 │
|
||||
│ │
|
||||
│ 消费数据 ─────► 异常检测模型 ─────► 消费异常预警 │
|
||||
│ │
|
||||
│ 考核数据 ─────► 趋势预测模型 ─────► 下滑趋势预警 │
|
||||
│ │
|
||||
│ 评估数据 ─────► 风险评估模型 ─────► 风险等级评估 │
|
||||
│ │
|
||||
│ 关系数据 ─────► 关系图谱模型 ─────► 风险关系预警 │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### 4.1.2 预警规则引擎
|
||||
|
||||
| 规则类型 | 触发条件 | 预警级别 |
|
||||
|---------|---------|---------|
|
||||
| 行为异常 | 连续3天行为记录异常 | 黄色 |
|
||||
| 消费异常 | 单日消费超阈值200% | 黄色 |
|
||||
| 考核下滑 | 连续2月考核下降>10分 | 黄色 |
|
||||
| 风险升高 | 评估风险值上升>15% | 橙色 |
|
||||
| 关系预警 | 新增密切联系人 | 蓝色 |
|
||||
| 极端预警 | 检测到暴力倾向 | 红色 |
|
||||
|
||||
### 4.2 智能风险评估
|
||||
|
||||
#### 评估维度
|
||||
采用机器学习模型进行综合风险评估:
|
||||
|
||||
| 维度 | 特征 | 算法 |
|
||||
|------|------|------|
|
||||
| 个体特征 | 年龄、犯罪史、心理状态 | Random Forest |
|
||||
| 行为特征 | 考核分数、消费模式 | Gradient Boosting |
|
||||
| 关系特征 | 社交网络、通讯记录 | Graph Neural Network |
|
||||
| 环境特征 | 监区环境、季节因素 | Time Series |
|
||||
|
||||
#### 模型训练
|
||||
- 训练数据:历史罪犯数据(脱敏后)
|
||||
- 训练周期:每月更新
|
||||
- 评估指标:AUC > 0.85
|
||||
|
||||
### 4.3 数据分析增强
|
||||
|
||||
#### 智能分析功能
|
||||
|
||||
| 功能 | 描述 | 技术方案 |
|
||||
|------|------|---------|
|
||||
| 自动报表 | 根据数据自动生成分析报告 | NLP + 模板 |
|
||||
| 趋势预测 | 预测未来数据趋势 | LSTM/Prophet |
|
||||
| 异常检测 | 自动发现数据异常 | Isolation Forest |
|
||||
| 关联分析 | 发现数据关联关系 | Apriori/FP-Growth |
|
||||
| 智能问答 | 业务知识问答 | RAG + LLM |
|
||||
|
||||
---
|
||||
|
||||
## 第五部分:非功能性需求
|
||||
|
||||
### 5.1 性能需求
|
||||
|
||||
| 指标 | 要求 |
|
||||
|------|------|
|
||||
| 页面响应时间 | < 2秒 |
|
||||
| 接口响应时间 | < 500ms |
|
||||
| 并发用户数 | ≥ 500 |
|
||||
| 系统可用性 | ≥ 99.9% |
|
||||
| 数据备份 | 每日全量 + 增量 |
|
||||
|
||||
### 5.2 安全需求
|
||||
|
||||
| 安全项 | 要求 |
|
||||
|-------|------|
|
||||
| 传输安全 | HTTPS/TLS 1.2+ |
|
||||
| 存储安全 | AES-256加密 |
|
||||
| 密码安全 | BCrypt/Argon2 |
|
||||
| 访问控制 | RBAC + 数据权限 |
|
||||
| 审计追溯 | 完整操作日志 |
|
||||
| 敏感保护 | 数据脱敏显示 |
|
||||
|
||||
### 5.3 兼容性需求
|
||||
|
||||
| 类型 | 要求 |
|
||||
|------|------|
|
||||
| 浏览器 | Chrome、Firefox、Edge(最新2版本) |
|
||||
| 分辨率 | 1920×1080及以上 |
|
||||
| 操作系统 | Windows 10+、Linux |
|
||||
| 网络 | 支持内网隔离部署 |
|
||||
|
||||
### 5.4 可扩展性
|
||||
|
||||
- 支持模块化扩展
|
||||
- 支持第三方系统集成(标准API)
|
||||
- 支持定制化开发
|
||||
- 支持多语言扩展
|
||||
|
||||
---
|
||||
|
||||
## 第六部分:项目实施建议
|
||||
|
||||
### 6.1 实施阶段
|
||||
|
||||
| 阶段 | 内容 | 周期 |
|
||||
|------|------|------|
|
||||
| 第一阶段 | 基础平台、用户管理、权限管理 | 4周 |
|
||||
| 第二阶段 | 狱政信息、数据中心核心功能 | 6周 |
|
||||
| 第三阶段 | 测评管理、评估报告 | 4周 |
|
||||
| 第四阶段 | 智能预警、AI功能 | 6周 |
|
||||
| 第五阶段 | 测试、部署、培训 | 4周 |
|
||||
|
||||
### 6.2 培训计划
|
||||
|
||||
| 角色 | 培训内容 | 课时 |
|
||||
|------|---------|------|
|
||||
| 管理员 | 系统配置、用户管理 | 8课时 |
|
||||
| 业务人员 | 各模块操作 | 16课时 |
|
||||
| 领导层 | 数据分析、大屏展示 | 4课时 |
|
||||
| 运维人员 | 系统运维、故障处理 | 8课时 |
|
||||
|
||||
---
|
||||
|
||||
## 附录
|
||||
|
||||
### 附录A:术语表
|
||||
|
||||
| 术语 | 说明 |
|
||||
|------|------|
|
||||
| 押犯 | 在押罪犯 |
|
||||
| 余刑 | 剩余刑期 |
|
||||
| 严管/普管/宽管 | 罪犯分管等级 |
|
||||
| 计分考核 | 罪犯日常表现计分 |
|
||||
| 减刑假释 | 刑期减免措施 |
|
||||
| 危评 | 危险评估 |
|
||||
| 等保 | 信息安全等级保护 |
|
||||
|
||||
### 附录B:参考法规
|
||||
|
||||
1. 《中华人民共和国监狱法》
|
||||
2. 《中华人民共和国个人信息保护法》
|
||||
3. 《中华人民共和国数据安全法》
|
||||
4. 《信息安全技术个人信息安全规范》GB/T 35273
|
||||
5. 《信息安全等级保护管理办法》
|
||||
|
||||
---
|
||||
|
||||
**文档编制:** Claude AI
|
||||
**评审专家:** 王建国(监狱业务)、李明远(系统设计)、张AI(AI技术)
|
||||
**状态:** 已评审通过
|
||||
1
backend
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit e51432cc32e209870967b0d323f3fcf569fe112c
|
||||
162
build.sh
Normal file
@ -0,0 +1,162 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ============================================
|
||||
# XL监狱综合管理平台 - 前后端编译脚本
|
||||
# ============================================
|
||||
# 功能:
|
||||
# 1. 编译后端 Java 项目
|
||||
# 2. 编译前端 Vue3 项目
|
||||
# 3. 生成部署包
|
||||
#
|
||||
# 使用方法:
|
||||
# 1. 修改下面的配置(可选)
|
||||
# 2. 执行: bash build.sh
|
||||
#
|
||||
# 依赖:
|
||||
# - Maven 3.8+
|
||||
# - Node.js 16+
|
||||
# - pnpm
|
||||
# ============================================
|
||||
|
||||
# 配置
|
||||
PROJECT_DIR="/Volumes/Dpan/github/xlcp"
|
||||
BACKEND_DIR="${PROJECT_DIR}/backend"
|
||||
FRONTEND_DIR="${PROJECT_DIR}/frontend"
|
||||
BACKEND_OUTPUT_DIR="${PROJECT_DIR}/deploy/backend"
|
||||
FRONTEND_OUTPUT_DIR="${PROJECT_DIR}/deploy/frontend"
|
||||
|
||||
# Maven 配置
|
||||
MAVEN_PROFILE="prod"
|
||||
JAVA_VERSION="17"
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
echo -e "${GREEN}XL监狱综合管理平台 - 前后端编译脚本${NC}"
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
echo ""
|
||||
|
||||
# 检查依赖
|
||||
echo -e "${BLUE}📋 检查编译环境...${NC}"
|
||||
|
||||
# 检查 Maven
|
||||
if ! command -v mvn &> /dev/null; then
|
||||
echo -e "${RED}❌ 错误: 未找到 Maven,请先安装 Maven${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✅ Maven 版本: $(mvn -version | head -1)${NC}"
|
||||
|
||||
# 检查 Node.js
|
||||
if ! command -v node &> /dev/null; then
|
||||
echo -e "${RED}❌ 错误: 未找到 Node.js,请先安装 Node.js${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✅ Node.js 版本: $(node -v)${NC}"
|
||||
|
||||
# 检查 pnpm
|
||||
if ! command -v pnpm &> /dev/null; then
|
||||
echo -e "${YELLOW}⚠️ 未找到 pnpm,尝试使用 npm...${NC}"
|
||||
PACKAGE_MANAGER="npm"
|
||||
else
|
||||
echo -e "${GREEN}✅ pnpm 版本: $(pnpm -v)${NC}"
|
||||
PACKAGE_MANAGER="pnpm"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}开始编译...${NC}"
|
||||
echo ""
|
||||
|
||||
# ============================================
|
||||
# 第一部分:编译后端
|
||||
# ============================================
|
||||
echo -e "${BLUE}🏗️ 编译后端项目...${NC}"
|
||||
echo ""
|
||||
|
||||
cd "${BACKEND_DIR}"
|
||||
|
||||
# 清理并编译
|
||||
echo -e "${YELLOW}📦 清理并编译后端...${NC}"
|
||||
mvn clean package -DskipTests -Dmaven.javadoc.skip=true -q
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}✅ 后端编译成功!${NC}"
|
||||
|
||||
# 查找生成的 JAR 文件
|
||||
JAR_FILE=$(find "${BACKEND_DIR}/yudao-server/target" -name "yudao-server-*.jar" 2>/dev/null | head -1)
|
||||
if [ -n "$JAR_FILE" ]; then
|
||||
echo -e "${GREEN}📁 生成的 JAR 文件: ${JAR_FILE}${NC}"
|
||||
|
||||
# 复制到部署目录
|
||||
mkdir -p "${BACKEND_OUTPUT_DIR}"
|
||||
cp "${JAR_FILE}" "${BACKEND_OUTPUT_DIR}/"
|
||||
echo -e "${GREEN}📁 已复制到部署目录: ${BACKEND_OUTPUT_DIR}/$(basename $JAR_FILE)${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}❌ 后端编译失败!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# ============================================
|
||||
# 第二部分:编译前端
|
||||
# ============================================
|
||||
echo -e "${BLUE}🎨 编译前端项目...${NC}"
|
||||
echo ""
|
||||
|
||||
cd "${FRONTEND_DIR}"
|
||||
|
||||
# 检查依赖是否已安装
|
||||
if [ ! -d "node_modules" ]; then
|
||||
echo -e "${YELLOW}📥 安装前端依赖...${NC}"
|
||||
$PACKAGE_MANAGER install
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}❌ 前端依赖安装失败!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 清理并编译生产版本
|
||||
echo -e "${YELLOW}📦 编译前端生产版本...${NC}"
|
||||
$PACKAGE_MANAGER build:prod
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}✅ 前端编译成功!${NC}"
|
||||
|
||||
# 复制到部署目录
|
||||
mkdir -p "${FRONTEND_OUTPUT_DIR}"
|
||||
|
||||
# 复制编译产物
|
||||
if [ -d "dist" ]; then
|
||||
rm -rf "${FRONTEND_OUTPUT_DIR}/dist"
|
||||
cp -r "dist" "${FRONTEND_OUTPUT_DIR}/"
|
||||
echo -e "${GREEN}📁 已复制到部署目录: ${FRONTEND_OUTPUT_DIR}/dist${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}❌ 前端编译失败!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# ============================================
|
||||
# 完成
|
||||
# ============================================
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
echo -e "${GREEN}🎉 编译完成!${NC}"
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}部署文件位置:${NC}"
|
||||
echo -e " - 后端: ${BACKEND_OUTPUT_DIR}/"
|
||||
echo -e " - 前端: ${FRONTEND_OUTPUT_DIR}/dist/"
|
||||
echo ""
|
||||
echo -e "${YELLOW}下一步:${NC}"
|
||||
echo -e " 1. 部署后端 JAR 文件"
|
||||
echo -e " 2. 部署前端静态文件"
|
||||
echo -e " 3. 配置 Nginx"
|
||||
echo ""
|
||||
27
deploy/.gitignore
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
# 数据目录
|
||||
data/
|
||||
|
||||
# 日志文件
|
||||
*.log
|
||||
logs/
|
||||
|
||||
# Docker 镜像(体积大,不纳入版本控制)
|
||||
xlcp-images/
|
||||
|
||||
# 临时文件
|
||||
*.tmp
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# IDE
|
||||
.idea/
|
||||
.vscode/
|
||||
*.iml
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# 环境变量
|
||||
.env.local
|
||||
.env.*.local
|
||||
297
deploy/DEPLOYMENT_CHECKLIST.md
Normal file
@ -0,0 +1,297 @@
|
||||
# XL监狱综合管理平台 - 部署前检查清单
|
||||
|
||||
## 🖥️ 远程服务器架构检查
|
||||
|
||||
由于无法直接SSH连接,请手动运行以下命令检查远程服务器架构:
|
||||
|
||||
```bash
|
||||
ssh root@192.168.10.150 "uname -m && cat /etc/os-release && docker --version && docker compose version"
|
||||
```
|
||||
|
||||
### 预期输出示例:
|
||||
|
||||
**x86_64 架构 (最常见)**:
|
||||
```
|
||||
x86_64
|
||||
NAME="CentOS Linux"
|
||||
VERSION="7 (Core)"
|
||||
Docker version 24.0.7
|
||||
Docker Compose version v2.24.0
|
||||
```
|
||||
|
||||
**ARM64 架构 (树莓派、ARM服务器)**:
|
||||
```
|
||||
aarch64
|
||||
NAME="Ubuntu"
|
||||
VERSION="22.04.3 LTS (Jammy Jellyfish)"
|
||||
Docker version 24.0.7
|
||||
Docker Compose version v2.24.0
|
||||
```
|
||||
|
||||
## ✅ 部署方式选择
|
||||
|
||||
### 方式 A: 在线部署 (服务器网络良好)
|
||||
|
||||
**适用场景**:
|
||||
- 服务器可以访问 Docker Hub
|
||||
- 网络带宽充足
|
||||
- 快速测试部署
|
||||
|
||||
**步骤**:
|
||||
```bash
|
||||
cd deploy
|
||||
./scripts/deploy.sh
|
||||
```
|
||||
|
||||
### 方式 B: 离线部署 (推荐生产环境) ⭐
|
||||
|
||||
**适用场景**:
|
||||
- 服务器网络受限
|
||||
- 需要离线部署
|
||||
- 多服务器部署
|
||||
- 网络速度慢
|
||||
|
||||
**步骤**:
|
||||
|
||||
#### 1. 本地打包镜像
|
||||
```bash
|
||||
cd deploy
|
||||
./scripts/save-images.sh
|
||||
```
|
||||
|
||||
这会创建 `images-archive/` 目录,包含:
|
||||
- `xlcp-docker-images.tar.gz` (约 2-3GB)
|
||||
- `upload.sh` (自动上传脚本)
|
||||
- `README.md` (详细说明)
|
||||
|
||||
#### 2. 上传镜像到服务器
|
||||
|
||||
**方式 2.1: 使用自动脚本** (最简单)
|
||||
```bash
|
||||
cd images-archive
|
||||
./upload.sh
|
||||
```
|
||||
|
||||
**方式 2.2: 手动上传**
|
||||
```bash
|
||||
cd images-archive
|
||||
|
||||
# 使用 scp
|
||||
scp xlcp-docker-images.tar.gz root@192.168.10.150:/projects/data/xlcp/
|
||||
|
||||
# 或使用 rsync
|
||||
rsync -avz --progress xlcp-docker-images.tar.gz root@192.168.10.150:/projects/data/xlcp/
|
||||
```
|
||||
|
||||
#### 3. 在服务器加载镜像
|
||||
```bash
|
||||
# SSH 到服务器
|
||||
ssh root@192.168.10.150
|
||||
|
||||
# 进入目录
|
||||
cd /projects/data/xlcp
|
||||
|
||||
# 加载镜像
|
||||
docker load -i xlcp-docker-images.tar.gz
|
||||
|
||||
# 验证镜像
|
||||
docker images | grep -E 'mysql|redis|nginx'
|
||||
```
|
||||
|
||||
#### 4. 部署服务
|
||||
```bash
|
||||
# 确保部署文件已上传
|
||||
cd /projects/data/xlcp
|
||||
|
||||
# 启动服务
|
||||
docker compose up -d
|
||||
|
||||
# 查看状态
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
## 📋 镜像兼容性说明
|
||||
|
||||
### ✅ 全平台支持
|
||||
|
||||
以下镜像在 **x86_64** 和 **ARM64** 上都支持:
|
||||
|
||||
| 镜像 | x86_64 | ARM64 | 说明 |
|
||||
|------|--------|-------|------|
|
||||
| mysql:8.0 | ✅ | ✅ | 官方支持双架构 |
|
||||
| redis:7-alpine | ✅ | ✅ | 官方支持双架构 |
|
||||
| nginx:1.25-alpine | ✅ | ✅ | 官方支持双架构 |
|
||||
| node:20-alpine | ✅ | ✅ | 官方支持双架构 |
|
||||
|
||||
### ⚠️ 构建镜像
|
||||
|
||||
以下镜像仅在本地构建时使用,不会影响部署:
|
||||
|
||||
| 镜像 | 用途 | x86_64 | ARM64 |
|
||||
|------|------|--------|-------|
|
||||
| maven:3.9-eclipse-temurin-21 | 后端编译 | ✅ | ✅ |
|
||||
| eclipse-temurin:21-jre-alpine | 后端运行 | ✅ | ✅ |
|
||||
|
||||
### 🔄 架构不兼容怎么办?
|
||||
|
||||
如果远程服务器架构与本地不同,有以下解决方案:
|
||||
|
||||
#### 方案 1: 在远程服务器直接构建 (推荐)
|
||||
|
||||
```bash
|
||||
# 上传源代码到服务器
|
||||
rsync -avz --exclude node_modules --exclude target \
|
||||
../ root@192.168.10.150:/projects/data/xlcp/
|
||||
|
||||
# SSH 到服务器
|
||||
ssh root@192.168.10.150
|
||||
|
||||
# 进入项目目录
|
||||
cd /projects/data/xlcp
|
||||
|
||||
# 构建镜像
|
||||
cd deploy
|
||||
docker compose build
|
||||
```
|
||||
|
||||
#### 方案 2: 使用 buildx 构建多架构镜像
|
||||
|
||||
```bash
|
||||
# 启用 buildx
|
||||
docker buildx create --name multiarch --use
|
||||
|
||||
# 构建并导出多架构镜像
|
||||
docker buildx build --platform linux/amd64,linux/arm64 \
|
||||
-t xlcp-backend \
|
||||
--load \
|
||||
-f docker/backend/Dockerfile \
|
||||
../backend
|
||||
```
|
||||
|
||||
#### 方案 3: 使用交叉编译 (高级)
|
||||
|
||||
需要配置 QEMU 等工具,比较复杂,不推荐。
|
||||
|
||||
## 🎯 快速决策树
|
||||
|
||||
```
|
||||
检查服务器网络
|
||||
|
|
||||
├─ 可以访问 Docker Hub
|
||||
| └─ 使用方式 A (在线部署)
|
||||
|
|
||||
└─ 无法访问或速度慢
|
||||
|
|
||||
├─ 架构相同 (都是 x86_64 或都是 ARM64)
|
||||
| └─ 使用方式 B (离线部署)
|
||||
|
|
||||
└─ 架构不同
|
||||
|
|
||||
├─ 服务器性能好
|
||||
| └─ 方案 1 (远程构建)
|
||||
|
|
||||
└─ 服务器性能差
|
||||
└─ 找一台相同架构的机器做离线包
|
||||
```
|
||||
|
||||
## 📝 实际操作示例
|
||||
|
||||
### 示例 1: 本地 Mac (ARM64) -> 远程 Linux (x86_64)
|
||||
|
||||
```bash
|
||||
# 检查本地架构
|
||||
uname -m
|
||||
# 输出: arm64 (Apple Silicon)
|
||||
|
||||
# 检查远程架构
|
||||
ssh root@192.168.10.150 "uname -m"
|
||||
# 输出: x86_64
|
||||
|
||||
# 由于架构不同,选择在远程服务器构建
|
||||
rsync -avz --exclude node_modules --exclude target \
|
||||
/path/to/xlcp/ root@192.168.10.150:/projects/data/xlcp/
|
||||
|
||||
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose up -d --build'
|
||||
```
|
||||
|
||||
### 示例 2: 本地 Mac (x86_64) -> 远程 Linux (x86_64)
|
||||
|
||||
```bash
|
||||
# 架构相同,可以使用离线部署
|
||||
cd /path/to/xlcp/deploy
|
||||
./scripts/save-images.sh
|
||||
|
||||
cd images-archive
|
||||
./upload.sh
|
||||
```
|
||||
|
||||
## 🆘 常见问题
|
||||
|
||||
### Q1: 如何快速查看服务器架构?
|
||||
|
||||
```bash
|
||||
ssh root@192.168.10.150 "uname -m"
|
||||
```
|
||||
|
||||
输出:
|
||||
- `x86_64` = Intel/AMD 64位
|
||||
- `aarch64` = ARM 64位
|
||||
- `armv7l` = ARM 32位
|
||||
|
||||
### Q2: 镜像很大,上传需要多久?
|
||||
|
||||
取决于网络速度:
|
||||
- 100Mbps: 约 3-5 分钟
|
||||
- 10Mbps: 约 30-50 分钟
|
||||
- 1Mbps: 约 5-8 小时
|
||||
|
||||
建议使用 rsync,支持断点续传。
|
||||
|
||||
### Q3: 上传中断了怎么办?
|
||||
|
||||
使用 rsync 的断点续传功能:
|
||||
```bash
|
||||
rsync -avz --partial --progress \
|
||||
xlcp-docker-images.tar.gz root@192.168.10.150:/projects/data/xlcp/
|
||||
```
|
||||
|
||||
### Q4: 服务器没有 Docker 怎么办?
|
||||
|
||||
先安装 Docker:
|
||||
```bash
|
||||
ssh root@192.168.10.150
|
||||
|
||||
# CentOS/RHEL
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
systemctl start docker
|
||||
systemctl enable docker
|
||||
|
||||
# Ubuntu/Debian
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
systemctl start docker
|
||||
systemctl enable docker
|
||||
```
|
||||
|
||||
## ✅ 推荐的最佳实践
|
||||
|
||||
1. **开发环境**: 使用在线部署,快速迭代
|
||||
2. **测试环境**: 使用离线部署,模拟生产
|
||||
3. **生产环境**:
|
||||
- 准备离线镜像包
|
||||
- 多次测试部署流程
|
||||
- 准备回滚方案
|
||||
4. **多环境部署**: 建立镜像仓库 (Harbor/Registry)
|
||||
|
||||
## 📞 下一步
|
||||
|
||||
完成架构检查后,选择对应的部署方式:
|
||||
|
||||
- **在线部署**: 直接运行 `./scripts/deploy.sh`
|
||||
- **离线部署**: 先运行 `./scripts/save-images.sh`
|
||||
- **远程构建**: 先上传代码,再远程构建
|
||||
|
||||
需要帮助? 查看各脚本的帮助信息:
|
||||
```bash
|
||||
./scripts/save-images.sh --help
|
||||
./scripts/deploy.sh --help
|
||||
```
|
||||
232
deploy/DEPLOYMENT_STATUS.md
Normal file
@ -0,0 +1,232 @@
|
||||
# XL监狱综合管理平台 - 部署完成报告
|
||||
|
||||
## 📊 部署状态
|
||||
|
||||
### ✅ 已完成 (方案 A - 离线部署)
|
||||
|
||||
#### 步骤 1: 本地镜像打包 ✅
|
||||
- 下载并打包了 6 个 Docker 镜像
|
||||
- 文件: `xlcp-docker-images.tar.gz` (592MB)
|
||||
- 完成时间: 约 15 分钟
|
||||
|
||||
#### 步骤 2: 上传镜像到服务器 ✅
|
||||
- 目标服务器: `root@192.168.10.150`
|
||||
- 部署目录: `/projects/data/xlcp`
|
||||
- 上传时间: 约 1 分钟 (内网速度 ~10MB/s)
|
||||
- 所有镜像已成功加载
|
||||
|
||||
#### 步骤 3: 启动基础服务 ✅
|
||||
**运行中的服务:**
|
||||
- ✅ MySQL 8.0 - 端口 3306 - 健康检查通过
|
||||
- ✅ Redis 7 - 端口 6380 - 健康检查通过 (已自动调整端口避免冲突)
|
||||
|
||||
**服务器信息:**
|
||||
- 架构: ARM64 (aarch64)
|
||||
- 系统: openEuler 22.03 (LTS-SP4)
|
||||
- Docker: v28.5.2
|
||||
- Docker Compose: v2.40.3 (同时支持 docker-compose v1)
|
||||
- 内存: 250GB 总计
|
||||
- 磁盘: 62GB 可用
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 待完成
|
||||
|
||||
### 步骤 4: 构建并启动应用服务
|
||||
|
||||
由于应用需要在服务器上编译构建,还需要以下步骤:
|
||||
|
||||
#### 后端服务 (Spring Boot + Java 21)
|
||||
**需要:**
|
||||
1. 上传 backend 源代码
|
||||
2. 在服务器上 Maven 编译
|
||||
3. 构建 Docker 镜像
|
||||
4. 启动容器
|
||||
|
||||
**预计时间:** 10-15 分钟
|
||||
|
||||
#### 前端服务 (Vue 3 + Node 20)
|
||||
**需要:**
|
||||
1. 上传 frontend 源代码
|
||||
2. 在服务器上 pnpm 安装依赖
|
||||
3. 构建 Vue 应用
|
||||
4. 构建 Docker 镜像
|
||||
5. 启动 Nginx 容器
|
||||
|
||||
**预计时间:** 5-10 分钟
|
||||
|
||||
---
|
||||
|
||||
## 🚀 完成部署的两种方式
|
||||
|
||||
### 方式 1: 使用远程构建脚本 (推荐) ⭐
|
||||
|
||||
**最简单,一键完成所有操作**
|
||||
|
||||
```bash
|
||||
cd /Volumes/Dpan/github/xlcp/deploy
|
||||
./scripts/remote-build.sh
|
||||
```
|
||||
|
||||
**这个脚本会自动:**
|
||||
1. 上传 backend 和 frontend 源代码
|
||||
2. 在远程服务器编译构建
|
||||
3. 启动所有服务
|
||||
4. 健康检查
|
||||
|
||||
**注意:** 需要先修改脚本中的服务器地址为 `root@192.168.10.150`
|
||||
|
||||
---
|
||||
|
||||
### 方式 2: 手动分步执行
|
||||
|
||||
#### 2.1 上传源代码
|
||||
|
||||
```bash
|
||||
# 上传 backend
|
||||
rsync -avz --exclude node_modules --exclude target \
|
||||
../backend/ root@192.168.10.150:/projects/data/xlcp/backend/
|
||||
|
||||
# 上传 frontend
|
||||
rsync -avz --exclude node_modules --exclude 'dist*' \
|
||||
../frontend/ root@192.168.10.150:/projects/data/xlcp/frontend/
|
||||
```
|
||||
|
||||
#### 2.2 构建并启动服务
|
||||
|
||||
SSH 到服务器:
|
||||
|
||||
```bash
|
||||
ssh root@192.168.10.150
|
||||
cd /projects/data/xlcp
|
||||
|
||||
# 构建后端镜像
|
||||
docker-compose build backend
|
||||
|
||||
# 构建前端镜像
|
||||
docker-compose build frontend
|
||||
|
||||
# 启动所有服务
|
||||
docker-compose up -d
|
||||
|
||||
# 查看状态
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 验证部署
|
||||
|
||||
部署完成后,访问以下地址验证:
|
||||
|
||||
```bash
|
||||
# 前端页面
|
||||
curl http://192.168.10.150/
|
||||
|
||||
# 后端健康检查
|
||||
curl http://192.168.10.150:48080/actuator/health
|
||||
|
||||
# 查看日志
|
||||
ssh root@192.168.10.150 'cd /projects/data/xlcp && docker-compose logs -f'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 管理命令
|
||||
|
||||
```bash
|
||||
# SSH 到服务器
|
||||
ssh root@192.168.10.150
|
||||
|
||||
# 进入项目目录
|
||||
cd /projects/data/xlcp
|
||||
|
||||
# 查看服务状态
|
||||
docker-compose ps
|
||||
|
||||
# 查看日志
|
||||
docker-compose logs -f
|
||||
|
||||
# 重启服务
|
||||
docker-compose restart backend frontend
|
||||
|
||||
# 停止所有服务
|
||||
docker-compose stop
|
||||
|
||||
# 启动所有服务
|
||||
docker-compose start
|
||||
|
||||
# 删除所有容器
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 访问地址 (部署完成后)
|
||||
|
||||
- **前端页面**: http://192.168.10.150/
|
||||
- **后端 API**: http://192.168.10.150:48080/admin-api/
|
||||
- **健康检查**: http://192.168.10.150:48080/actuator/health
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
1. **Redis 端口已调整**
|
||||
- 原端口: 6379
|
||||
- 新端口: 6380 (避免与现有服务冲突)
|
||||
- 已自动更新 `.env` 配置
|
||||
|
||||
2. **首次部署需要构建**
|
||||
- 后端 Java 编译需要 10-15 分钟
|
||||
- 前端 Vue 构建需要 5-10 分钟
|
||||
- 请耐心等待
|
||||
|
||||
3. **磁盘空间**
|
||||
- 镜像文件: 约 2GB
|
||||
- 构建缓存: 约 1GB
|
||||
- 日志和数据: 随时间增长
|
||||
|
||||
4. **防火墙**
|
||||
- 确保端口 80, 48080, 3306, 6380 已开放
|
||||
- 或在内网访问
|
||||
|
||||
---
|
||||
|
||||
## 📞 下一步
|
||||
|
||||
**请选择:**
|
||||
|
||||
A. **一键完成部署** (推荐)
|
||||
- 运行: `./scripts/remote-build.sh`
|
||||
- 等待 10-30 分钟自动完成
|
||||
|
||||
B. **手动分步部署**
|
||||
- 按照上述步骤手动执行
|
||||
- 更可控,可以看到详细过程
|
||||
|
||||
C. **暂时停止**
|
||||
- MySQL 和 Redis 已运行
|
||||
- 可以稍后继续部署应用
|
||||
|
||||
---
|
||||
|
||||
## 📊 部署时间线
|
||||
|
||||
| 步骤 | 操作 | 耗时 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 1 | 本地打包镜像 | 15 分钟 | ✅ 完成 |
|
||||
| 2 | 上传镜像到服务器 | 1 分钟 | ✅ 完成 |
|
||||
| 3 | 启动 MySQL/Redis | 1 分钟 | ✅ 完成 |
|
||||
| 4 | 构建后端服务 | 10-15 分钟 | ⏳ 待完成 |
|
||||
| 5 | 构建前端服务 | 5-10 分钟 | ⏳ 待完成 |
|
||||
| **总计** | | **32-42 分钟** | **60% 完成** |
|
||||
|
||||
---
|
||||
|
||||
**当前进度: 60%**
|
||||
|
||||
✅ 基础设施已就绪
|
||||
⏳ 应用服务待部署
|
||||
|
||||
*建议使用远程构建脚本一键完成剩余 40% 的工作*
|
||||
393
deploy/DEPLOY_JAR.md
Normal file
@ -0,0 +1,393 @@
|
||||
# XL监狱综合管理平台 - 生产部署包部署指南
|
||||
|
||||
## 📋 目录结构
|
||||
|
||||
```
|
||||
deploy/
|
||||
├── docker-compose.yml # Docker Compose 编排文件
|
||||
├── config/
|
||||
│ └── application-prod.yaml # 生产环境配置
|
||||
├── docker/
|
||||
│ └── backend/
|
||||
│ ├── Dockerfile # 后端镜像构建(基于已编译的 JAR)
|
||||
│ └── .dockerignore
|
||||
├── sql/
|
||||
│ └── prison_schema.sql # 数据库初始化脚本
|
||||
└── scripts/
|
||||
├── build.sh # 本地镜像构建脚本
|
||||
├── deploy.sh # 远程部署脚本(含源码构建)
|
||||
├── deploy-jar-only.sh # 新增:仅部署已编译 JAR 包
|
||||
├── init-db.sh # 数据库初始化脚本
|
||||
└── save-images.sh # 基础镜像打包脚本
|
||||
```
|
||||
|
||||
## 🎯 两种部署模式对比
|
||||
|
||||
| 部署模式 | 使用场景 | 是否需要源码 | 是否需要编译 | 构建位置 |
|
||||
|---------|---------|------------|------------|---------|
|
||||
| **源码构建** | 开发环境、有构建权限的环境 | ✅ 需要 | ✅ 需要 | Docker 容器内 |
|
||||
| **JAR 包部署** | 生产环境、无构建权限的环境 | ❌ 不需要 | ❌ 不需要 | 本地已完成编译 |
|
||||
|
||||
---
|
||||
|
||||
## 📦 方式一:JAR 包部署(推荐生产环境)
|
||||
|
||||
### 适用场景
|
||||
|
||||
- 生产服务器没有 Maven/Node.js 环境
|
||||
- 希望快速部署,不想在服务器上编译
|
||||
- 源码不对外开放,只交付编译产物
|
||||
|
||||
### 前置要求
|
||||
|
||||
1. **本地已完成编译**:
|
||||
```bash
|
||||
# 后端编译
|
||||
cd backend
|
||||
mvn clean package -DskipTests
|
||||
|
||||
# 前端编译(如果使用 Docker 构建 Nginx 镜像)
|
||||
cd frontend
|
||||
pnpm install
|
||||
pnpm build:prod
|
||||
```
|
||||
|
||||
2. **服务器环境**:
|
||||
- Docker 20.10+
|
||||
- Docker Compose 2.0+
|
||||
- 至少 4GB 内存, 20GB 磁盘空间
|
||||
|
||||
### 部署步骤
|
||||
|
||||
#### 1. 本地构建 JAR 包镜像
|
||||
|
||||
```bash
|
||||
cd /path/to/xlcp/deploy
|
||||
|
||||
# 使用专门的 JAR 包部署脚本
|
||||
./scripts/deploy-jar-only.sh
|
||||
```
|
||||
|
||||
这个脚本会:
|
||||
- ✅ 检查后端 JAR 包是否存在(`backend/yudao-server/target/yudao-server.jar`)
|
||||
- ✅ 检查前端构建产物是否存在(`frontend/dist/`)
|
||||
- ✅ 使用 `docker/backend/Dockerfile.jar` 构建 Docker 镜像
|
||||
- ✅ 上传镜像到远程服务器
|
||||
- ✅ 上传必要的配置文件和 docker-compose.yml
|
||||
- ✅ 在远程服务器启动服务
|
||||
|
||||
#### 2. 手动部署流程(如果不用脚本)
|
||||
|
||||
**2.1 本地构建镜像**
|
||||
|
||||
```bash
|
||||
cd deploy
|
||||
|
||||
# 构建后端镜像(基于已编译的 JAR)
|
||||
docker build -f docker/backend/Dockerfile.jar -t xlcp-backend:latest ../backend
|
||||
|
||||
# 构建前端镜像(基于已编译的 dist)
|
||||
docker build -f docker/frontend/Dockerfile.dist -t xlcp-frontend:latest ../frontend
|
||||
```
|
||||
|
||||
**2.2 导出镜像**
|
||||
|
||||
```bash
|
||||
# 导出镜像为 tar 文件
|
||||
docker save xlcp-backend xlcp-frontend | gzip > xlcp-images.tar.gz
|
||||
```
|
||||
|
||||
**2.3 上传到服务器**
|
||||
|
||||
```bash
|
||||
# 上传镜像文件
|
||||
scp xlcp-images.tar.gz root@192.168.10.150:/projects/data/xlcp/
|
||||
|
||||
# 上传配置文件
|
||||
rsync -avz \
|
||||
--exclude 'node_modules' \
|
||||
--exclude 'target' \
|
||||
--exclude '.git' \
|
||||
--exclude 'backend' \
|
||||
--exclude 'frontend' \
|
||||
./ root@192.168.10.150:/projects/data/xlcp/deploy/
|
||||
```
|
||||
|
||||
**2.4 服务器端加载镜像**
|
||||
|
||||
```bash
|
||||
# SSH 到服务器
|
||||
ssh root@192.168.10.150
|
||||
|
||||
# 进入目录
|
||||
cd /projects/data/xlcp
|
||||
|
||||
# 加载镜像
|
||||
docker load -i xlcp-images.tar.gz
|
||||
|
||||
# 启动服务
|
||||
cd deploy
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
#### 3. 验证部署
|
||||
|
||||
```bash
|
||||
# 健康检查
|
||||
curl http://192.168.10.150:48080/actuator/health
|
||||
curl http://192.168.10.150/
|
||||
|
||||
# 查看日志
|
||||
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose logs -f'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔨 方式二:源码构建部署(开发环境)
|
||||
|
||||
### 适用场景
|
||||
|
||||
- 开发环境
|
||||
- 服务器有完整的构建环境(Maven, Node.js)
|
||||
- 需要在服务器上实时修改代码并重新构建
|
||||
|
||||
### 部署步骤
|
||||
|
||||
#### 使用现有的 deploy.sh 脚本
|
||||
|
||||
```bash
|
||||
cd deploy
|
||||
|
||||
# 默认部署到 root@192.168.10.150
|
||||
./scripts/deploy.sh
|
||||
|
||||
# 或指定服务器
|
||||
REMOTE_SERVER=root@192.168.10.150 ./scripts/deploy.sh
|
||||
```
|
||||
|
||||
脚本会:
|
||||
1. 上传源代码到服务器
|
||||
2. 在服务器上使用 Docker 构建镜像
|
||||
3. 启动所有服务
|
||||
|
||||
---
|
||||
|
||||
## 📂 文件说明
|
||||
|
||||
### 核心配置文件
|
||||
|
||||
- **docker-compose.yml**:服务编排文件,定义 MySQL、Redis、Backend、Frontend 服务
|
||||
- **config/application-prod.yaml**:生产环境配置(数据库连接、Redis 配置等)
|
||||
|
||||
### Docker 镜像构建文件
|
||||
|
||||
- **docker/backend/Dockerfile**:多阶段构建,从源码编译(Maven + Java 源码 → JAR → 镜像)
|
||||
- **docker/backend/Dockerfile.jar**:直接使用已编译的 JAR 包(JAR → 镜像)- **新增**
|
||||
- **docker/frontend/Dockerfile**:前端构建(Node.js + Vue 源码 → dist → Nginx 镜像)
|
||||
- **docker/frontend/Dockerfile.dist**:直接使用已编译的 dist(dist → Nginx 镜像)- **新增**
|
||||
|
||||
### 部署脚本
|
||||
|
||||
- **scripts/deploy.sh**:源码构建部署(上传源码 → 服务器构建)
|
||||
- **scripts/deploy-jar-only.sh**:JAR 包部署(本地构建镜像 → 上传镜像)- **新增**
|
||||
- **scripts/save-images.sh**:打包基础镜像(MySQL, Redis, Nginx, Java)
|
||||
- **scripts/upload-to-150.sh**:上传镜像到 192.168.10.150
|
||||
- **scripts/init-db.sh**:初始化数据库
|
||||
|
||||
---
|
||||
|
||||
## 🔍 部署流程详解
|
||||
|
||||
### JAR 包部署流程(推荐)
|
||||
|
||||
```
|
||||
[本地] 编译 JAR 包
|
||||
↓
|
||||
[本地] 构建 Docker 镜像(基于 JAR)
|
||||
↓
|
||||
[本地] 导出镜像为 tar 文件
|
||||
↓
|
||||
[上传] 镜像文件 + 配置文件 → 服务器
|
||||
↓
|
||||
[服务器] 加载镜像
|
||||
↓
|
||||
[服务器] docker compose up -d
|
||||
↓
|
||||
[完成] 服务运行
|
||||
```
|
||||
|
||||
### 源码构建部署流程
|
||||
|
||||
```
|
||||
[上传] 源代码 + 配置文件 → 服务器
|
||||
↓
|
||||
[服务器] docker compose build(在容器内编译)
|
||||
↓
|
||||
[服务器] docker compose up -d
|
||||
↓
|
||||
[完成] 服务运行
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 快速命令参考
|
||||
|
||||
### JAR 包部署(推荐生产)
|
||||
|
||||
```bash
|
||||
# 1. 本地编译
|
||||
cd backend && mvn clean package -DskipTests
|
||||
cd ../frontend && pnpm build:prod
|
||||
|
||||
# 2. 本地构建镜像
|
||||
cd ../deploy
|
||||
./scripts/deploy-jar-only.sh root@192.168.10.150
|
||||
```
|
||||
|
||||
### 源码构建部署(开发环境)
|
||||
|
||||
```bash
|
||||
# 直接部署(服务器上构建)
|
||||
cd deploy
|
||||
./scripts/deploy.sh root@192.168.10.150
|
||||
```
|
||||
|
||||
### 服务管理
|
||||
|
||||
```bash
|
||||
# 查看状态
|
||||
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose ps'
|
||||
|
||||
# 查看日志
|
||||
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose logs -f backend'
|
||||
|
||||
# 重启服务
|
||||
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose restart backend'
|
||||
|
||||
# 停止服务
|
||||
ssh root@192.168.10.150 'cd /projects/data/xlcp/deploy && docker compose down'
|
||||
|
||||
# 更新服务(重新构建镜像)
|
||||
docker compose build backend && docker compose up -d backend
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
### 生产环境建议
|
||||
|
||||
1. **使用 JAR 包部署**,不要在服务器上编译
|
||||
2. **修改默认密码**(MySQL root、Redis)
|
||||
3. **配置防火墙**,仅开放必要端口(80, 443)
|
||||
4. **启用 HTTPS**,配置 SSL 证书
|
||||
5. **定期备份数据**(数据库、上传文件)
|
||||
6. **监控日志**,及时发现异常
|
||||
|
||||
### 磁盘空间管理
|
||||
|
||||
```bash
|
||||
# 查看磁盘使用
|
||||
docker system df
|
||||
|
||||
# 清理未使用的镜像
|
||||
docker image prune -a
|
||||
|
||||
# 清理未使用的容器
|
||||
docker container prune
|
||||
|
||||
# 清理未使用的卷
|
||||
docker volume prune
|
||||
|
||||
# 全面清理(谨慎使用)
|
||||
docker system prune -a --volumes
|
||||
```
|
||||
|
||||
### 网络配置
|
||||
|
||||
如果服务器有防火墙,确保开放以下端口:
|
||||
|
||||
- **80**:HTTP 访问(前端)
|
||||
- **443**:HTTPS 访问(前端,如果启用 SSL)
|
||||
- **48080**:后端 API(可配置防火墙规则仅允许内网访问)
|
||||
|
||||
```bash
|
||||
firewall-cmd --permanent --add-port=80/tcp
|
||||
firewall-cmd --permanent --add-port=443/tcp
|
||||
firewall-cmd --permanent --add-port=48080/tcp
|
||||
firewall-cmd --reload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 附录
|
||||
|
||||
### 环境变量说明
|
||||
|
||||
| 变量名 | 默认值 | 说明 |
|
||||
|---------|---------|------|
|
||||
| MYSQL_ROOT_PASSWORD | Prison2024!@ | MySQL root 密码 |
|
||||
| MYSQL_DATABASE | prison | 数据库名称 |
|
||||
| MYSQL_PORT | 3306 | MySQL 端口 |
|
||||
| REDIS_PASSWORD | Prison2024!@ | Redis 密码 |
|
||||
| REDIS_PORT | 6379 | Redis 端口 |
|
||||
| BACKEND_PORT | 48080 | 后端服务端口 |
|
||||
| FRONTEND_PORT | 80 | 前端服务端口 |
|
||||
| SPRING_PROFILES_ACTIVE | prod | Spring 环境配置 |
|
||||
| JAVA_OPTS | -Xms512m -Xmx1024m | JVM 参数 |
|
||||
|
||||
### 访问地址
|
||||
|
||||
部署完成后:
|
||||
- **前端**:http://192.168.10.150/
|
||||
- **后端 API**:http://192.168.10.150:48080/admin-api/
|
||||
- **健康检查**:http://192.168.10.150:48080/actuator/health
|
||||
|
||||
### 故障排查
|
||||
|
||||
#### 1. 后端服务无法启动
|
||||
|
||||
```bash
|
||||
# 查看日志
|
||||
docker compose logs backend
|
||||
|
||||
# 检查数据库连接
|
||||
docker compose exec backend sh
|
||||
curl http://mysql:3306
|
||||
|
||||
# 检查配置
|
||||
docker compose exec backend cat /app/config/application-prod.yaml
|
||||
```
|
||||
|
||||
#### 2. 前端页面无法访问
|
||||
|
||||
```bash
|
||||
# 检查 Nginx 配置
|
||||
docker compose exec frontend nginx -t
|
||||
|
||||
# 查看 Nginx 日志
|
||||
docker compose logs frontend
|
||||
|
||||
# 检查静态文件
|
||||
docker compose exec frontend ls -la /usr/share/nginx/html
|
||||
```
|
||||
|
||||
#### 3. 数据库连接失败
|
||||
|
||||
```bash
|
||||
# 检查 MySQL 容器
|
||||
docker compose ps mysql
|
||||
docker compose logs mysql
|
||||
|
||||
# 测试连接
|
||||
docker compose exec mysql mysql -u root -pPrison2024!@ -e "SELECT 1"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🆘 获取帮助
|
||||
|
||||
- 查看部署脚本帮助:`./scripts/deploy-jar-only.sh --help`
|
||||
- 查看项目文档:`/README.md`
|
||||
- 查看后端配置:`/backend/README.md`
|
||||
- 查看前端配置:`/frontend/README.md`
|
||||
439
deploy/README.md
Normal file
@ -0,0 +1,439 @@
|
||||
# XL监狱综合管理平台 - Docker 部署指南
|
||||
|
||||
## 📋 目录结构
|
||||
|
||||
```
|
||||
deploy/
|
||||
├── docker-compose.yml # Docker Compose 编排文件
|
||||
├── .env # 环境变量配置
|
||||
├── .gitignore # Git 忽略文件
|
||||
├── config/
|
||||
│ └── application-prod.yaml # 生产环境配置
|
||||
├── data/ # 数据目录(自动创建)
|
||||
│ ├── mysql/ # MySQL 数据文件
|
||||
│ ├── redis/ # Redis 数据文件
|
||||
│ └── upload/ # 上传文件
|
||||
├── logs/ # 日志目录(自动创建)
|
||||
│ ├── backend/ # 后端日志
|
||||
│ └── nginx/ # Nginx 日志
|
||||
├── docker/
|
||||
│ └── frontend/
|
||||
│ └── nginx.conf # Nginx 配置
|
||||
├── sql/
|
||||
│ └── prison_schema.sql # 数据库初始化脚本
|
||||
└── scripts/
|
||||
├── build.sh # 镜像构建脚本(已弃用)
|
||||
├── deploy.sh # 远程部署脚本(已弃用)
|
||||
├── init-db.sh # 数据库初始化脚本
|
||||
└── init-permissions.sh # 权限初始化脚本
|
||||
```
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 前置要求
|
||||
|
||||
- Docker 20.10+
|
||||
- Docker Compose 2.0+ (或 docker-compose 1.29+)
|
||||
- 服务器至少 4GB 内存, 20GB 磁盘空间
|
||||
- SSH 免密登录到目标服务器 (如果远程部署)
|
||||
|
||||
### 方式一: 本地部署
|
||||
|
||||
#### 1. 克隆项目
|
||||
|
||||
```bash
|
||||
cd /path/to/xlcp
|
||||
```
|
||||
|
||||
#### 2. 配置环境变量
|
||||
|
||||
编辑 `.env` 文件,根据需要修改配置:
|
||||
|
||||
```bash
|
||||
vi deploy/.env
|
||||
```
|
||||
|
||||
关键配置项:
|
||||
- `MYSQL_ROOT_PASSWORD`: MySQL root 密码
|
||||
- `REDIS_PASSWORD`: Redis 密码
|
||||
- `BACKEND_PORT`: 后端服务端口 (默认 48080)
|
||||
- `FRONTEND_PORT`: 前端服务端口 (默认 80)
|
||||
|
||||
#### 3. 构建镜像
|
||||
|
||||
```bash
|
||||
cd deploy
|
||||
./scripts/build.sh
|
||||
```
|
||||
|
||||
#### 4. 启动服务
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
或使用 docker-compose:
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
#### 5. 查看日志
|
||||
|
||||
```bash
|
||||
# 查看所有服务日志
|
||||
docker compose logs -f
|
||||
|
||||
# 查看特定服务日志
|
||||
docker compose logs -f backend
|
||||
docker compose logs -f frontend
|
||||
docker compose logs -f mysql
|
||||
docker compose logs -f redis
|
||||
```
|
||||
|
||||
#### 6. 停止服务
|
||||
|
||||
```bash
|
||||
docker compose down
|
||||
```
|
||||
|
||||
#### 7. 完全清理
|
||||
|
||||
```bash
|
||||
docker compose down -v # 同时删除数据卷
|
||||
```
|
||||
|
||||
### 方式二: 远程部署 (推荐生产环境)
|
||||
|
||||
#### 1. 配置远程服务器信息
|
||||
|
||||
```bash
|
||||
# 方式 1: 使用默认配置 (root@192.168.10.150)
|
||||
cd deploy
|
||||
./scripts/deploy.sh
|
||||
|
||||
# 方式 2: 自定义服务器
|
||||
REMOTE_SERVER=user@your-server-ip ./scripts/deploy.sh
|
||||
|
||||
# 方式 3: 自定义部署目录
|
||||
REMOTE_SERVER=root@192.168.10.150 REMOTE_DEPLOY_DIR=/projects/data/xlcp ./scripts/deploy.sh
|
||||
```
|
||||
|
||||
#### 2. 部署流程
|
||||
|
||||
脚本会自动执行:
|
||||
1. ✅ 检查 SSH 连接
|
||||
2. ✅ 检查远程 Docker 环境
|
||||
3. ✅ 创建远程目录结构
|
||||
4. ✅ 上传部署文件
|
||||
5. ✅ 启动所有容器
|
||||
6. ✅ 健康检查
|
||||
7. ✅ 显示访问信息
|
||||
|
||||
#### 3. 访问服务
|
||||
|
||||
部署完成后:
|
||||
- 前端: http://192.168.10.150/
|
||||
- 后端 API: http://192.168.10.150:48080/admin-api/
|
||||
- 健康检查: http://192.168.10.150:48080/actuator/health
|
||||
|
||||
#### 4. 查看远程日志
|
||||
|
||||
```bash
|
||||
ssh root@192.168.10.150
|
||||
cd /projects/data/xlcp
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
## 🔧 服务管理
|
||||
|
||||
### 查看服务状态
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
### 重启单个服务
|
||||
|
||||
```bash
|
||||
# 重启后端
|
||||
docker compose restart backend
|
||||
|
||||
# 重启前端
|
||||
docker compose restart frontend
|
||||
|
||||
# 重启 MySQL
|
||||
docker compose restart mysql
|
||||
```
|
||||
|
||||
### 进入容器
|
||||
|
||||
```bash
|
||||
# 进入后端容器
|
||||
docker compose exec backend sh
|
||||
|
||||
# 进入 MySQL 容器
|
||||
docker compose exec mysql bash
|
||||
|
||||
# 进入 Redis 容器
|
||||
docker compose exec redis sh
|
||||
```
|
||||
|
||||
### 更新服务
|
||||
|
||||
```bash
|
||||
# 1. 重新构建镜像
|
||||
docker compose build backend frontend
|
||||
|
||||
# 2. 重启服务
|
||||
docker compose up -d backend frontend
|
||||
```
|
||||
|
||||
## 📊 数据库管理
|
||||
|
||||
### 初始化数据库
|
||||
|
||||
```bash
|
||||
cd deploy
|
||||
./scripts/init-db.sh
|
||||
```
|
||||
|
||||
### 手动执行 SQL
|
||||
|
||||
```bash
|
||||
# 进入 MySQL 容器
|
||||
docker compose exec mysql bash
|
||||
|
||||
# 连接 MySQL
|
||||
mysql -u root -pPrison2024!@ prison
|
||||
|
||||
# 执行 SQL
|
||||
source /docker-entrypoint-initdb.d/01-prison_schema.sql
|
||||
```
|
||||
|
||||
### 数据库备份
|
||||
|
||||
```bash
|
||||
# 备份整个数据库
|
||||
docker exec xlcp-mysql mysqldump -u root -pPrison2024!@ prison > prison_backup_$(date +%Y%m%d).sql
|
||||
|
||||
# 恢复数据库
|
||||
docker exec -i xlcp-mysql mysql -u root -pPrison2024!@ prison < prison_backup_20250122.sql
|
||||
```
|
||||
|
||||
### 查看数据库
|
||||
|
||||
```bash
|
||||
docker exec xlcp-mysql mysql -u root -pPrison2024!@ prison -e "SHOW TABLES;"
|
||||
```
|
||||
|
||||
## 🔍 故障排查
|
||||
|
||||
### 服务无法启动
|
||||
|
||||
1. 查看服务日志
|
||||
|
||||
```bash
|
||||
docker compose logs backend
|
||||
docker compose logs frontend
|
||||
```
|
||||
|
||||
2. 检查端口占用
|
||||
|
||||
```bash
|
||||
netstat -tlnp | grep -E '3306|6379|48080|80'
|
||||
```
|
||||
|
||||
3. 检查磁盘空间
|
||||
|
||||
```bash
|
||||
df -h
|
||||
docker system df
|
||||
```
|
||||
|
||||
### 健康检查失败
|
||||
|
||||
1. 检查后端服务是否启动
|
||||
|
||||
```bash
|
||||
curl http://localhost:48080/actuator/health
|
||||
```
|
||||
|
||||
2. 检查前端服务是否启动
|
||||
|
||||
```bash
|
||||
curl http://localhost/
|
||||
```
|
||||
|
||||
3. 查看详细日志
|
||||
|
||||
```bash
|
||||
docker compose logs -f backend
|
||||
```
|
||||
|
||||
### 数据库连接失败
|
||||
|
||||
1. 检查 MySQL 容器状态
|
||||
|
||||
```bash
|
||||
docker compose ps mysql
|
||||
docker compose logs mysql
|
||||
```
|
||||
|
||||
2. 测试数据库连接
|
||||
|
||||
```bash
|
||||
docker exec xlcp-mysql mysqladmin ping -h localhost -u root -pPrison2024!@
|
||||
```
|
||||
|
||||
3. 检查配置文件
|
||||
|
||||
```bash
|
||||
cat config/application-prod.yaml | grep datasource
|
||||
```
|
||||
|
||||
### 前端页面无法访问
|
||||
|
||||
1. 检查 Nginx 配置
|
||||
|
||||
```bash
|
||||
docker compose exec frontend nginx -t
|
||||
```
|
||||
|
||||
2. 查看 Nginx 日志
|
||||
|
||||
```bash
|
||||
docker compose logs frontend
|
||||
```
|
||||
|
||||
3. 检查静态文件
|
||||
|
||||
```bash
|
||||
docker compose exec frontend ls -la /usr/share/nginx/html
|
||||
```
|
||||
|
||||
## 📈 监控和日志
|
||||
|
||||
### 实时监控
|
||||
|
||||
```bash
|
||||
# 监控所有服务
|
||||
docker compose logs -f
|
||||
|
||||
# 监控特定服务
|
||||
docker compose logs -f backend
|
||||
```
|
||||
|
||||
### 查看日志文件
|
||||
|
||||
```bash
|
||||
# 后端日志 (Docker 内部)
|
||||
docker compose exec backend cat /logs/yudao-server.log
|
||||
|
||||
# Nginx 日志
|
||||
docker compose exec frontend tail -f /var/log/nginx/access.log
|
||||
docker compose exec frontend tail -f /var/log/nginx/error.log
|
||||
|
||||
# MySQL 日志
|
||||
docker compose exec mysql tail -f /var/log/mysql/error.log
|
||||
```
|
||||
|
||||
### 资源监控
|
||||
|
||||
```bash
|
||||
# 查看容器资源使用
|
||||
docker stats
|
||||
|
||||
# 查看磁盘使用
|
||||
docker system df
|
||||
|
||||
# 清理未使用的资源
|
||||
docker system prune -a
|
||||
```
|
||||
|
||||
## 🔒 安全建议
|
||||
|
||||
1. **修改默认密码**
|
||||
- MySQL root 密码
|
||||
- Redis 密码
|
||||
|
||||
2. **配置防火墙**
|
||||
```bash
|
||||
# 仅开放必要端口
|
||||
firewall-cmd --permanent --add-port=48080/tcp
|
||||
firewall-cmd --permanent --add-port=80/tcp
|
||||
firewall-cmd --reload
|
||||
```
|
||||
|
||||
3. **启用 HTTPS**
|
||||
- 准备 SSL 证书
|
||||
- 放置到 `deploy/docker/ssl/` 目录
|
||||
- 修改 `nginx.conf` 配置
|
||||
|
||||
4. **定期备份数据**
|
||||
- 数据库备份
|
||||
- 上传文件备份
|
||||
- 配置文件备份
|
||||
|
||||
## 📚 附录
|
||||
|
||||
### 环境变量说明
|
||||
|
||||
| 变量名 | 默认值 | 说明 |
|
||||
|---------|---------|------|
|
||||
| MYSQL_ROOT_PASSWORD | Prison2024!@ | MySQL root 密码 |
|
||||
| MYSQL_DATABASE | prison | 数据库名称 |
|
||||
| MYSQL_PORT | 3306 | MySQL 端口 |
|
||||
| REDIS_PASSWORD | Prison2024!@ | Redis 密码 |
|
||||
| REDIS_PORT | 6379 | Redis 端口 |
|
||||
| BACKEND_PORT | 48080 | 后端服务端口 |
|
||||
| FRONTEND_PORT | 80 | 前端服务端口 |
|
||||
| SPRING_PROFILES_ACTIVE | prod | Spring 环境配置 |
|
||||
| JAVA_OPTS | -Xms512m -Xmx1024m | JVM 参数 |
|
||||
|
||||
### 端口说明
|
||||
|
||||
| 服务 | 容器端口 | 宿主机端口 | 说明 |
|
||||
|------|-----------|------------|------|
|
||||
| MySQL | 3306 | 3306 | 数据库服务 |
|
||||
| Redis | 6379 | 6379 | 缓存服务 |
|
||||
| Backend | 48080 | 48080 | 后端 API 服务 |
|
||||
| Frontend | 80 | 80 | 前端 Web 服务 |
|
||||
|
||||
### 常用命令
|
||||
|
||||
```bash
|
||||
# 查看 Docker 版本
|
||||
docker --version
|
||||
docker compose version
|
||||
|
||||
# 查看容器列表
|
||||
docker ps -a
|
||||
|
||||
# 查看镜像列表
|
||||
docker images | grep xlcp
|
||||
|
||||
# 查看网络
|
||||
docker network ls
|
||||
docker network inspect xlcp_xlcp-network
|
||||
|
||||
# 查看数据卷
|
||||
docker volume ls
|
||||
docker volume inspect xlcp_mysql-data
|
||||
```
|
||||
|
||||
## 🆘 获取帮助
|
||||
|
||||
- 查看部署脚本帮助: `./scripts/deploy.sh --help`
|
||||
- 查看项目文档: `/README.md`
|
||||
- 查看后端配置: `/backend/README.md`
|
||||
- 查看前端配置: `/frontend/README.md`
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如遇问题,请提供以下信息:
|
||||
1. Docker 版本: `docker --version`
|
||||
2. Docker Compose 版本: `docker compose version`
|
||||
3. 操作系统版本: `cat /etc/os-release`
|
||||
4. 错误日志: `docker compose logs`
|
||||
5. 问题描述和复现步骤
|
||||
173
deploy/config/application-prod.yaml
Normal file
@ -0,0 +1,173 @@
|
||||
spring:
|
||||
application:
|
||||
name: xlcp-server
|
||||
|
||||
# 排除微信自动配置(不需要社交登录功能)
|
||||
autoconfigure:
|
||||
exclude:
|
||||
- com.binarywang.spring.starter.wxjava.mp.config.WxMpAutoConfiguration
|
||||
|
||||
# 数据源配置(使用新建的 MySQL 容器)
|
||||
datasource:
|
||||
dynamic:
|
||||
datasource:
|
||||
master:
|
||||
# 使用 Docker 服务名连接 MySQL
|
||||
url: jdbc:mysql://mysql:3306/xlcp?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8
|
||||
username: root
|
||||
password: ${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
slave:
|
||||
# 从库配置(可选,如果不需要可以删除或保持与主库相同)
|
||||
url: jdbc:mysql://mysql:3306/xlcp?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8
|
||||
username: root
|
||||
password: ${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
hikari:
|
||||
# 连接池配置
|
||||
maximum-pool-size: 20
|
||||
minimum-idle: 5
|
||||
idle-timeout: 600000
|
||||
connection-timeout: 30000
|
||||
max-lifetime: 1800000
|
||||
pool-name: PrisonHikariCP
|
||||
# 连接健康检测
|
||||
connection-test-query: SELECT 1
|
||||
|
||||
# Redis 配置(使用新建的 Redis 容器)
|
||||
data:
|
||||
redis:
|
||||
host: redis
|
||||
port: 6379
|
||||
password: ${REDIS_PASSWORD:-Xlcp2025Redis}
|
||||
database: 0
|
||||
timeout: 10000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 20
|
||||
max-wait: -1ms
|
||||
max-idle: 10
|
||||
min-idle: 0
|
||||
shutdown-timeout: 100ms
|
||||
|
||||
# 文件上传配置
|
||||
servlet:
|
||||
multipart:
|
||||
enabled: true
|
||||
max-file-size: 100MB
|
||||
max-request-size: 100MB
|
||||
file-size-threshold: 2KB
|
||||
|
||||
# Jackson 配置
|
||||
jackson:
|
||||
date-format: yyyy-MM-dd HH:mm:ss
|
||||
time-zone: GMT+8
|
||||
serialization:
|
||||
write-dates-as-timestamps: false
|
||||
|
||||
# 服务器配置
|
||||
server:
|
||||
port: 48080
|
||||
servlet:
|
||||
context-path: /
|
||||
compression:
|
||||
enabled: true
|
||||
mime-types: application/json,application/xml,text/html,text/xml,text/plain
|
||||
error:
|
||||
include-message: always
|
||||
include-binding-errors: always
|
||||
|
||||
# 应用配置
|
||||
app:
|
||||
name: XL监狱综合管理平台
|
||||
version: 1.0.0
|
||||
|
||||
# 验证码配置
|
||||
captcha:
|
||||
enabled: true
|
||||
type: math
|
||||
|
||||
# 文件上传配置
|
||||
upload:
|
||||
path: ./data/upload
|
||||
avatar-path: ./data/upload/avatar
|
||||
cache-path: ./data/upload/cache
|
||||
|
||||
# XSS 过滤配置
|
||||
security:
|
||||
xss:
|
||||
enabled: true
|
||||
exclude-urls:
|
||||
- /admin/ck/uploadImage
|
||||
- /admin/oss/uploadToAliCloudV2
|
||||
- /admin/oss/uploadToTencentCloudV2
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
root: INFO
|
||||
cn.iocoder.yudao: DEBUG
|
||||
cn.iocoder.yudao.module.prison: DEBUG
|
||||
file:
|
||||
name: logs/yudao-server.log
|
||||
logback:
|
||||
rollingpolicy:
|
||||
max-history: 30
|
||||
max-file-size: 100MB
|
||||
total-size-cap: 3GB
|
||||
|
||||
# MyBatis Plus 配置
|
||||
mybatis-plus:
|
||||
mapper-locations: classpath*:mapper/**/*.xml
|
||||
type-aliases-package: cn.iocoder.yudao.module.*.dal.dataobject
|
||||
global-config:
|
||||
db-config:
|
||||
id-type: auto
|
||||
logic-delete-field: deleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
banner: false
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
cache-enabled: false
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
|
||||
# Actuator 监控配置
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics,prometheus
|
||||
base-path: /actuator
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
metrics:
|
||||
tags:
|
||||
application: ${spring.application.name}
|
||||
|
||||
# LLM 配置(用于危险评估智能分析)
|
||||
llm:
|
||||
local:
|
||||
base-url: ${LLM_BASE_URL:http://127.0.0.1:2100/v1}
|
||||
api-key: ${LLM_API_KEY:}
|
||||
model: ${LLM_MODEL:qwen3}
|
||||
timeout-seconds: ${LLM_TIMEOUT:120}
|
||||
|
||||
# 微信公众号配置
|
||||
wx:
|
||||
mp:
|
||||
app-id: wxf56b1542b9e85f8a
|
||||
secret: 496379dcef1ba869e9234de8d598cfd3
|
||||
config-storage:
|
||||
type: RedisTemplate
|
||||
key-prefix: wx
|
||||
http-client-type: HttpClient
|
||||
miniapp:
|
||||
appid: wxc4598c446f8a9cb3
|
||||
secret: 4a1a04e07f6a4a0751b39c3064a92c8b
|
||||
config-storage:
|
||||
type: RedisTemplate
|
||||
key-prefix: wa
|
||||
http-client-type: HttpClient
|
||||
|
||||
114
deploy/config/backend/application-prod.yaml
Normal file
@ -0,0 +1,114 @@
|
||||
server:
|
||||
port: 48080
|
||||
|
||||
--- #################### 数据库相关配置 ####################
|
||||
spring:
|
||||
autoconfigure:
|
||||
exclude:
|
||||
- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration
|
||||
- org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration
|
||||
- org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration
|
||||
# 数据源配置项
|
||||
datasource:
|
||||
druid:
|
||||
web-stat-filter:
|
||||
enabled: true
|
||||
stat-view-servlet:
|
||||
enabled: true
|
||||
allow: 127.0.0.1
|
||||
url-pattern: /druid/*
|
||||
login-username: ${DRUID_USERNAME:admin}
|
||||
login-password: ${DRUID_PASSWORD:admin123}
|
||||
filter:
|
||||
stat:
|
||||
enabled: true
|
||||
log-slow-sql: true
|
||||
slow-sql-millis: 100
|
||||
merge-sql: true
|
||||
wall:
|
||||
config:
|
||||
multi-statement-allow: true
|
||||
dynamic:
|
||||
druid:
|
||||
initial-size: 2
|
||||
min-idle: 2
|
||||
max-active: 20
|
||||
max-wait: 60000
|
||||
time-between-eviction-runs-millis: 60000
|
||||
min-evictable-idle-time-millis: 300000
|
||||
max-evictable-idle-time-millis: 900000
|
||||
validation-query: SELECT 1 FROM DUAL
|
||||
test-while-idle: true
|
||||
test-on-borrow: false
|
||||
test-on-return: false
|
||||
pool-prepared-statements: true
|
||||
max-pool-prepared-statement-per-connection-size: 20
|
||||
primary: master
|
||||
datasource:
|
||||
master:
|
||||
url: jdbc:mysql://192.168.10.130:3306/xlcp_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
|
||||
username: xlcp_dev
|
||||
password: xlcp_dev
|
||||
|
||||
# Redis 配置
|
||||
data:
|
||||
redis:
|
||||
host: 192.168.10.126
|
||||
port: 46379
|
||||
database: 0
|
||||
password: redis_Dbdb2F
|
||||
|
||||
--- #################### 定时任务相关配置 ####################
|
||||
|
||||
spring:
|
||||
quartz:
|
||||
auto-startup: false
|
||||
scheduler-name: schedulerName
|
||||
job-store-type: memory
|
||||
wait-for-jobs-to-complete-on-shutdown: true
|
||||
|
||||
--- #################### 微信公众号、小程序相关配置 ####################
|
||||
wx:
|
||||
mp:
|
||||
app-id: wx041349c6f39b268b
|
||||
secret: 5abee519483bc9f8cb37ce280e814bd0
|
||||
config-storage:
|
||||
type: RedisTemplate
|
||||
key-prefix: wx
|
||||
http-client-type: HttpClient
|
||||
miniapp:
|
||||
appid: wx63c280fe3248a3e7
|
||||
secret: 6f270509224a7ae1296bbf1c8cb97aed
|
||||
config-storage:
|
||||
type: RedisTemplate
|
||||
key-prefix: wa
|
||||
http-client-type: HttpClient
|
||||
|
||||
--- #################### 芋道相关配置 ####################
|
||||
|
||||
yudao:
|
||||
pay:
|
||||
order-notify-url: http://localhost:48080/admin-api/pay/notify/order
|
||||
refund-notify-url: http://localhost:48080/admin-api/pay/notify/refund
|
||||
transfer-notify-url: http://localhost:48080/admin-api/pay/notify/transfer
|
||||
demo: false
|
||||
|
||||
justauth:
|
||||
enabled: true
|
||||
cache:
|
||||
type: REDIS
|
||||
prefix: 'social_auth_state:'
|
||||
timeout: 24h
|
||||
|
||||
--- #################### 监控相关配置 ####################
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
base-path: /actuator
|
||||
exposure:
|
||||
include: '*'
|
||||
|
||||
logging:
|
||||
file:
|
||||
name: ./logs/yudao-server.log
|
||||
50
deploy/docker-compose-simple.yml
Normal file
@ -0,0 +1,50 @@
|
||||
name: xlcp
|
||||
|
||||
services:
|
||||
# 后端服务
|
||||
backend:
|
||||
container_name: xlcp-backend
|
||||
image: eclipse-temurin:21-jre-alpine
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "48080:48080"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
JAVA_OPTS: -Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs
|
||||
TZ: Asia/Shanghai
|
||||
# 使用现有 dev 数据库配置
|
||||
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://192.168.10.130:3306/xlcp_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
|
||||
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: xlcp_dev
|
||||
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: xlcp_dev
|
||||
SPRING_DATA_REDIS_HOST: 192.168.10.126
|
||||
SPRING_DATA_REDIS_PORT: 46379
|
||||
SPRING_DATA_REDIS_PASSWORD: redis_Dbdb2F
|
||||
volumes:
|
||||
- ./logs/backend:/logs
|
||||
- ./data/upload:/app/data/upload
|
||||
- ./config/backend/application-local.yaml:/app/config/application-local.yaml:ro
|
||||
- /data/projects/backend/yudao-server/target/yudao-server.jar:/app/app.jar:ro
|
||||
working_dir: /app
|
||||
command: ["sh", "-c", "apk add --no-cache curl tzdata >/dev/null 2>&1 && java $JAVA_OPTS -jar /app/app.jar --spring.config.additional-location=file:/app/config/"]
|
||||
networks:
|
||||
- xlcp-network
|
||||
|
||||
# 前端 Nginx
|
||||
frontend:
|
||||
container_name: xlcp-frontend
|
||||
image: nginx:1.25-alpine
|
||||
user: "0:0"
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "18080:80"
|
||||
volumes:
|
||||
- ./docker/frontend/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- /data/projects/frontend/dist:/usr/share/nginx/html:ro
|
||||
- ./logs/nginx:/var/log/nginx
|
||||
networks:
|
||||
- xlcp-network
|
||||
|
||||
networks:
|
||||
xlcp-network:
|
||||
name: xlcp-network
|
||||
driver: bridge
|
||||
100
deploy/docker-compose.yml
Normal file
@ -0,0 +1,100 @@
|
||||
name: xlcp
|
||||
|
||||
services:
|
||||
# MySQL 数据库
|
||||
mysql:
|
||||
container_name: xlcp-mysql
|
||||
image: mysql:8.0
|
||||
user: "0:0"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}
|
||||
MYSQL_DATABASE: ${MYSQL_DATABASE:-xlcp}
|
||||
TZ: Asia/Shanghai
|
||||
ports:
|
||||
- "${MYSQL_PORT:-3306}:3306"
|
||||
volumes:
|
||||
- ./data/mysql:/var/lib/mysql
|
||||
- ./sql/prison_schema.sql:/docker-entrypoint-initdb.d/01-prison_schema.sql:ro
|
||||
command:
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_unicode_ci
|
||||
- --default-authentication-plugin=mysql_native_password
|
||||
- --skip-name-resolve
|
||||
networks:
|
||||
- xlcp-network
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
# Redis 缓存
|
||||
redis:
|
||||
container_name: xlcp-redis
|
||||
image: redis:7-alpine
|
||||
user: "0:0"
|
||||
restart: unless-stopped
|
||||
command: >
|
||||
sh -c "redis-server --requirepass ${REDIS_PASSWORD:-Xlcp2025Redis} --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru"
|
||||
ports:
|
||||
- "${REDIS_PORT:-6380}:6379"
|
||||
volumes:
|
||||
- ./data/redis:/data
|
||||
networks:
|
||||
- xlcp-network
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 10s
|
||||
timeout: 3s
|
||||
retries: 5
|
||||
|
||||
# 后端服务
|
||||
backend:
|
||||
container_name: xlcp-backend
|
||||
image: eclipse-temurin:21-jre-alpine
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
ports:
|
||||
- "${BACKEND_PORT:-48080}:48080"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod}
|
||||
JAVA_OPTS: ${JAVA_OPTS:--Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs}
|
||||
TZ: Asia/Shanghai
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-Xlcp@2025#Secure}
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD:-Xlcp2025Redis}
|
||||
volumes:
|
||||
- ./logs/backend:/logs
|
||||
- ./data/upload:/app/data/upload
|
||||
- ./config/application-prod.yaml:/app/application-prod.yaml:ro
|
||||
- ./backend/yudao-server/target/yudao-server.jar:/app/app.jar:ro
|
||||
working_dir: /app
|
||||
networks:
|
||||
- xlcp-network
|
||||
command: ["sh", "-c", "apk add --no-cache curl tzdata >/dev/null 2>&1 && java $$JAVA_OPTS -jar /app/app.jar"]
|
||||
|
||||
# 前端 Nginx
|
||||
frontend:
|
||||
container_name: xlcp-frontend
|
||||
image: nginx:1.25-alpine
|
||||
user: "0:0"
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${FRONTEND_PORT:-18080}:80"
|
||||
- "${FRONTEND_HTTPS_PORT:-18443}:443"
|
||||
volumes:
|
||||
- ./docker/frontend/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- ./frontend/dist:/usr/share/nginx/html:ro
|
||||
- ./logs/nginx:/var/log/nginx
|
||||
- ./data/ssl:/etc/nginx/ssl
|
||||
networks:
|
||||
- xlcp-network
|
||||
|
||||
networks:
|
||||
xlcp-network:
|
||||
name: xlcp-network
|
||||
driver: bridge
|
||||
188
deploy/scripts/check-remote.sh
Executable file
@ -0,0 +1,188 @@
|
||||
#!/bin/bash
|
||||
# 远程服务器架构检查脚本
|
||||
# 用法: ./check-remote.sh
|
||||
|
||||
REMOTE_SERVER="${1:-root@192.168.10.150}"
|
||||
|
||||
echo "========================================="
|
||||
echo "检查远程服务器: $REMOTE_SERVER"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
|
||||
# 检查 SSH 连接
|
||||
echo "[1/8] 检查 SSH 连接..."
|
||||
if ! ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no "$REMOTE_SERVER" "echo 'SSH 连接成功'" 2>/dev/null; then
|
||||
echo "❌ SSH 连接失败"
|
||||
echo ""
|
||||
echo "请检查:"
|
||||
echo " 1. SSH 免密登录是否配置?"
|
||||
echo " 2. 是否可以手动: ssh $REMOTE_SERVER"
|
||||
echo " 3. 远程服务器 IP 是否正确?"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ SSH 连接正常"
|
||||
echo ""
|
||||
|
||||
# 检查架构
|
||||
echo "[2/8] 检查系统架构..."
|
||||
ARCH=$(ssh "$REMOTE_SERVER" "uname -m" 2>/dev/null)
|
||||
echo "✅ 系统架构: $ARCH"
|
||||
|
||||
# 映射到 Docker 平台
|
||||
case "$ARCH" in
|
||||
x86_64)
|
||||
DOCKER_PLATFORM="linux/amd64"
|
||||
echo "✅ Docker 平台: linux/amd64 (Intel/AMD 64位)"
|
||||
;;
|
||||
aarch64)
|
||||
DOCKER_PLATFORM="linux/arm64"
|
||||
echo "✅ Docker 平台: linux/arm64 (ARM 64位)"
|
||||
;;
|
||||
armv7l)
|
||||
DOCKER_PLATFORM="linux/arm/v7"
|
||||
echo "✅ Docker 平台: linux/arm/v7 (ARM 32位)"
|
||||
;;
|
||||
*)
|
||||
DOCKER_PLATFORM="unknown"
|
||||
echo "⚠️ 未知架构: $ARCH"
|
||||
;;
|
||||
esac
|
||||
echo ""
|
||||
|
||||
# 检查操作系统
|
||||
echo "[3/8] 检查操作系统..."
|
||||
OS_INFO=$(ssh "$REMOTE_SERVER" "cat /etc/os-release | grep -E '^(NAME|VERSION)=' 2>/dev/null || cat /etc/issue" 2>/dev/null)
|
||||
echo "✅ 操作系统:"
|
||||
echo "$OS_INFO"
|
||||
echo ""
|
||||
|
||||
# 检查 Docker
|
||||
echo "[4/8] 检查 Docker..."
|
||||
if DOCKER_VERSION=$(ssh "$REMOTE_SERVER" "docker --version" 2>/dev/null); then
|
||||
echo "✅ $DOCKER_VERSION"
|
||||
|
||||
# 检查 Docker 是否能拉取镜像
|
||||
echo " 测试镜像拉取能力..."
|
||||
if ssh "$REMOTE_SERVER" "docker pull hello-world:latest > /dev/null 2>&1"; then
|
||||
echo " ✅ Docker Hub 访问正常"
|
||||
CAN_PULL_IMAGES="yes"
|
||||
else
|
||||
echo " ❌ 无法拉取镜像 (可能需要配置镜像加速器)"
|
||||
CAN_PULL_IMAGES="no"
|
||||
fi
|
||||
else
|
||||
echo "❌ Docker 未安装"
|
||||
echo ""
|
||||
echo "请先安装 Docker:"
|
||||
if echo "$OS_INFO" | grep -qi "ubuntu"; then
|
||||
echo " curl -fsSL https://get.docker.com | sh"
|
||||
elif echo "$OS_INFO" | grep -qi "centos"; then
|
||||
echo " curl -fsSL https://get.docker.com | sh"
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 检查 Docker Compose
|
||||
echo "[5/8] 检查 Docker Compose..."
|
||||
if COMPOSE_VERSION=$(ssh "$REMOTE_SERVER" "docker compose version 2>/dev/null"); then
|
||||
echo "✅ $COMPOSE_VERSION (docker compose v2)"
|
||||
elif COMPOSE_VERSION=$(ssh "$REMOTE_SERVER" "docker-compose --version" 2>/dev/null); then
|
||||
echo "✅ $COMPOSE_VERSION (docker-compose v1)"
|
||||
else
|
||||
echo "❌ Docker Compose 未安装"
|
||||
echo ""
|
||||
echo "请先安装 Docker Compose:"
|
||||
echo " sudo curl -L \"https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-\$(uname -s)-\$(uname -m)\" -o /usr/local/bin/docker-compose"
|
||||
echo " sudo chmod +x /usr/local/bin/docker-compose"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 检查磁盘空间
|
||||
echo "[6/8] 检查磁盘空间..."
|
||||
DISK_INFO=$(ssh "$REMOTE_SERVER" "df -h / | tail -1")
|
||||
echo "✅ 磁盘使用情况:"
|
||||
echo "$DISK_INFO"
|
||||
|
||||
AVAILABLE=$(ssh "$REMOTE_SERVER" "df -BG / | tail -1 | awk '{print \$4}' | sed 's/G//'")
|
||||
if [ "$AVAILABLE" -lt 10 ]; then
|
||||
echo " ⚠️ 磁盘空间不足: ${AVAILABLE}G 可用,建议至少 20G"
|
||||
else
|
||||
echo " ✅ 磁盘空间充足"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 检查内存
|
||||
echo "[7/8] 检查内存..."
|
||||
MEM_INFO=$(ssh "$REMOTE_SERVER" "free -h | grep Mem")
|
||||
echo "✅ 内存使用情况:"
|
||||
echo "$MEM_INFO"
|
||||
|
||||
TOTAL_MEM=$(ssh "$REMOTE_SERVER" "free -g | grep Mem | awk '{print \$2}'")
|
||||
if [ "$TOTAL_MEM" -lt 2 ]; then
|
||||
echo " ⚠️ 内存不足: ${TOTAL_MEM}G,建议至少 4G"
|
||||
else
|
||||
echo " ✅ 内存充足"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 检查端口占用
|
||||
echo "[8/8] 检查端口占用..."
|
||||
PORTS_TO_CHECK="3306 6379 48080 80"
|
||||
echo "检查端口: $PORTS_TO_CHECK"
|
||||
PORTS_OCCUPIED=()
|
||||
for port in $PORTS_TO_CHECK; do
|
||||
if ssh "$REMOTE_SERVER" "netstat -tlnp 2>/dev/null | grep -E \":$port\s\" || ss -tlnp 2>/dev/null | grep -E \":$port\s\"" 2>/dev/null; then
|
||||
echo " ⚠️ 端口 $port 已被占用"
|
||||
PORTS_OCCUPIED+=("$port")
|
||||
else
|
||||
echo " ✅ 端口 $port 可用"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#PORTS_OCCUPIED[@]} -gt 0 ]; then
|
||||
echo ""
|
||||
echo "⚠️ 以下端口已被占用: ${PORTS_OCCUPIED[*]}"
|
||||
echo "请修改 .env 文件中的端口配置或停止占用端口的服务"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo "========================================="
|
||||
echo "检查完成"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "架构信息总结:"
|
||||
echo " 系统架构: $ARCH"
|
||||
echo " Docker 平台: $DOCKER_PLATFORM"
|
||||
echo " Docker Hub: $([ "$CAN_PULL_IMAGES" = "yes" ] && echo "✅ 可访问" || echo "❌ 受限")"
|
||||
echo ""
|
||||
|
||||
echo "Docker镜像下载建议:"
|
||||
if [ "$CAN_PULL_IMAGES" = "yes" ]; then
|
||||
echo " ✅ 服务器可以直接拉取镜像"
|
||||
echo " 推荐使用: ./deploy.sh (在线部署)"
|
||||
else
|
||||
echo " ❌ 服务器无法直接拉取镜像"
|
||||
echo " 推荐使用: ./save-images.sh (离线部署)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo "所需镜像及平台支持:"
|
||||
echo " mysql:8.0 支持 $DOCKER_PLATFORM ✅"
|
||||
echo " redis:7-alpine 支持 $DOCKER_PLATFORM ✅"
|
||||
echo " nginx:1.25-alpine 支持 $DOCKER_PLATFORM ✅"
|
||||
echo " node:20-alpine 支持 $DOCKER_PLATFORM ✅"
|
||||
echo " eclipse-temurin:21-jre 支持 $DOCKER_PLATFORM ✅"
|
||||
echo ""
|
||||
|
||||
echo "下一步操作:"
|
||||
if [ "$CAN_PULL_IMAGES" = "yes" ]; then
|
||||
echo " 1. 在线部署: ./deploy.sh"
|
||||
echo " 2. 或远程构建: ./remote-build.sh"
|
||||
else
|
||||
echo " 1. 本地打包: ./save-images.sh"
|
||||
echo " 2. 上传镜像: cd images-archive && ./upload.sh"
|
||||
echo " 3. 远程构建: ./remote-build.sh"
|
||||
fi
|
||||
echo ""
|
||||
131
deploy/scripts/deploy-xlcp.sh
Executable file
@ -0,0 +1,131 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
PROJECT_NAME="xlcp"
|
||||
REMOTE_SERVER="${1:-root@192.168.10.150}"
|
||||
REMOTE_DEPLOY_DIR="${REMOTE_DEPLOY_DIR:-/projects/data/xlcp}"
|
||||
LOCAL_DIR="$(cd "$(dirname "$0")" && pwd)/.."
|
||||
|
||||
log_info() { echo "[INFO] $1"; }
|
||||
log_success() { echo "[SUCCESS] $1"; }
|
||||
log_error() { echo "[ERROR] $1"; exit 1; }
|
||||
|
||||
check_files() {
|
||||
log_info "检查必要文件..."
|
||||
local files=(
|
||||
"$LOCAL_DIR/backend/yudao-server/target/yudao-server.jar"
|
||||
"$LOCAL_DIR/frontend/dist/index.html"
|
||||
"$LOCAL_DIR/deploy/docker-compose.yml"
|
||||
"$LOCAL_DIR/deploy/config/application-prod.yaml"
|
||||
"$LOCAL_DIR/deploy/docker/frontend/nginx.conf"
|
||||
"$LOCAL_DIR/deploy/sql/prison_schema.sql"
|
||||
)
|
||||
for file in "${files[@]}"; do
|
||||
[ -f "$file" ] || log_error "文件不存在: $file"
|
||||
done
|
||||
log_success "所有必要文件存在"
|
||||
}
|
||||
|
||||
upload_files() {
|
||||
log_info "上传文件到 $REMOTE_SERVER..."
|
||||
ssh "$REMOTE_SERVER" "mkdir -p $REMOTE_DEPLOY_DIR/{config,docker/frontend,sql,data,logs,backend/yudao-server/target}"
|
||||
|
||||
rsync -avz --delete --exclude '*.tar.gz' --exclude '.git' \
|
||||
--exclude 'node_modules' --exclude 'target' \
|
||||
"$LOCAL_DIR/deploy/" "$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/deploy/"
|
||||
rsync -avz --progress "$LOCAL_DIR/backend/yudao-server/target/yudao-server.jar" \
|
||||
"$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/backend/yudao-server/target/"
|
||||
rsync -avz --delete --progress --exclude 'node_modules' \
|
||||
"$LOCAL_DIR/frontend/dist/" "$REMOTE_SERVER:$REMOTE_DEPLOY_DIR/frontend/dist/"
|
||||
log_success "文件上传完成"
|
||||
}
|
||||
|
||||
init_remote_dirs() {
|
||||
log_info "初始化远程目录..."
|
||||
ssh "$REMOTE_SERVER" "cd $REMOTE_DEPLOY_DIR && mkdir -p data/{mysql,redis,upload} logs/{backend,nginx} ssl && chmod -R 777 data/ logs/"
|
||||
log_success "远程目录初始化完成"
|
||||
}
|
||||
|
||||
start_services() {
|
||||
log_info "启动服务..."
|
||||
ssh "$REMOTE_SERVER" "cd $REMOTE_DEPLOY_DIR/deploy && docker compose down -v 2>/dev/null; docker compose up -d"
|
||||
log_success "服务启动命令已执行"
|
||||
}
|
||||
|
||||
health_check() {
|
||||
log_info "进行健康检查..."
|
||||
local server_ip=$(echo "$REMOTE_SERVER" | cut -d'@' -f2)
|
||||
for i in {1..30}; do
|
||||
curl -f -s "http://$server_ip:48080/actuator/health" > /dev/null 2>&1 && { log_success "后端服务正常"; break; }
|
||||
echo -n "."
|
||||
sleep 2
|
||||
done
|
||||
log_info "检查前端..."
|
||||
curl -f -s "http://$server_ip/" > /dev/null 2>&1 && log_success "前端服务正常" || log_warn "前端可能未启动"
|
||||
}
|
||||
|
||||
show_access_info() {
|
||||
local server_ip=$(echo "$REMOTE_SERVER" | cut -d'@' -f2)
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "部署成功!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "访问地址:"
|
||||
echo " 前端: http://$server_ip/"
|
||||
echo " 后端 API: http://$server_ip:48080/admin-api/"
|
||||
echo " 健康检查: http://$server_ip:48080/actuator/health"
|
||||
echo ""
|
||||
echo "管理命令:"
|
||||
echo " SSH: ssh $REMOTE_SERVER"
|
||||
echo " 查看日志: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose logs -f'"
|
||||
echo " 重启服务: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose restart'"
|
||||
echo " 停止服务: ssh $REMOTE_SERVER 'cd $REMOTE_DEPLOY_DIR/deploy && docker compose down'"
|
||||
echo ""
|
||||
echo "数据目录: $REMOTE_DEPLOY_DIR/data"
|
||||
echo "日志目录: $REMOTE_DEPLOY_DIR/logs"
|
||||
}
|
||||
|
||||
show_help() {
|
||||
echo "用法: $0 [remote_server]"
|
||||
echo ""
|
||||
echo "参数:"
|
||||
echo " remote_server 远程服务器地址 (默认: root@192.168.10.150)"
|
||||
echo ""
|
||||
echo "环境变量:"
|
||||
echo " REMOTE_DEPLOY_DIR 远程部署目录 (默认: /projects/data/xlcp)"
|
||||
echo ""
|
||||
echo "示例:"
|
||||
echo " $0 # 部署到默认服务器"
|
||||
echo " $0 root@192.168.10.150 # 部署到指定服务器"
|
||||
echo " REMOTE_DEPLOY_DIR=/opt/xlcp $0 # 自定义部署目录"
|
||||
echo ""
|
||||
echo "检查文件:"
|
||||
echo " backend/yudao-server/target/yudao-server.jar"
|
||||
echo " frontend/dist/"
|
||||
echo " deploy/docker-compose.yml"
|
||||
echo " deploy/config/application-prod.yaml"
|
||||
echo " deploy/docker/frontend/nginx.conf"
|
||||
echo ""
|
||||
}
|
||||
|
||||
main() {
|
||||
echo "========================================="
|
||||
echo "XL监狱综合管理平台 - 部署脚本"
|
||||
echo "========================================="
|
||||
|
||||
[[ "$1" == "--help" || "$1" == "-h" ]] && { show_help; exit 0; }
|
||||
|
||||
log_info "项目: $PROJECT_NAME, 服务器: $REMOTE_SERVER"
|
||||
log_info "部署目录: $REMOTE_DEPLOY_DIR"
|
||||
echo ""
|
||||
|
||||
check_files
|
||||
upload_files
|
||||
init_remote_dirs
|
||||
start_services
|
||||
health_check
|
||||
show_access_info
|
||||
}
|
||||
|
||||
main "$@"
|
||||
94
deploy/scripts/init-db.sh
Executable file
@ -0,0 +1,94 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 日志函数
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# 检查 MySQL 连接
|
||||
check_mysql() {
|
||||
local mysql_host="${MYSQL_HOST:-localhost}"
|
||||
local mysql_port="${MYSQL_PORT:-3306}"
|
||||
local mysql_user="${MYSQL_USER:-root}"
|
||||
local mysql_password="${MYSQL_PASSWORD:-Prison2024!@}"
|
||||
|
||||
log_info "检查 MySQL 连接..."
|
||||
|
||||
if ! docker exec xlcp-mysql mysqladmin ping -h "$mysql_host" -P "$mysql_port" -u "$mysql_user" -p"$mysql_password" 2>/dev/null; then
|
||||
log_error "无法连接到 MySQL"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "MySQL 连接正常"
|
||||
}
|
||||
|
||||
# 初始化数据库
|
||||
init_database() {
|
||||
log_info "初始化数据库..."
|
||||
|
||||
docker exec -i xlcp-mysql mysql -u root -p"${MYSQL_PASSWORD:-Prison2024!@}" prison < ./sql/prison_schema.sql || {
|
||||
log_error "数据库初始化失败"
|
||||
exit 1
|
||||
}
|
||||
|
||||
log_success "数据库初始化完成"
|
||||
}
|
||||
|
||||
# 验证数据库
|
||||
verify_database() {
|
||||
log_info "验证数据库表结构..."
|
||||
|
||||
local table_count=$(docker exec xlcp-mysql mysql -u root -p"${MYSQL_PASSWORD:-Prison2024!@}" prison -e "SHOW TABLES;" 2>/dev/null | wc -l)
|
||||
|
||||
if [ "$table_count" -lt 10 ]; then
|
||||
log_error "数据库表数量异常: $table_count"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "数据库验证通过 (共 $table_count 张表)"
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
log_info "========================================="
|
||||
log_info "XL监狱综合管理平台 - 数据库初始化"
|
||||
log_info "========================================="
|
||||
|
||||
# 切换到脚本所在目录的上级目录(deploy 目录)
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
# 检查 MySQL
|
||||
check_mysql
|
||||
|
||||
# 初始化数据库
|
||||
read -p "是否初始化数据库? (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
init_database
|
||||
fi
|
||||
|
||||
# 验证数据库
|
||||
verify_database
|
||||
|
||||
log_success "========================================="
|
||||
log_success "数据库初始化完成!"
|
||||
log_success "========================================="
|
||||
}
|
||||
|
||||
main "$@"
|
||||
48
deploy/scripts/init-permissions.sh
Executable file
@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
# 初始化目录权限
|
||||
init_permissions() {
|
||||
log_info "初始化目录权限..."
|
||||
|
||||
# 创建必要的目录
|
||||
mkdir -p data/{mysql,redis,upload}
|
||||
mkdir -p logs/{backend,nginx}
|
||||
|
||||
# 设置目录权限为 777(开发环境)
|
||||
# 这样任何容器用户都可以写入
|
||||
chmod -R 777 data/ logs/
|
||||
|
||||
log_success "目录权限已设置"
|
||||
}
|
||||
|
||||
# 检查是否在正确的目录
|
||||
if [ ! -f "docker-compose.yml" ]; then
|
||||
echo "错误: 请在 deploy 目录下运行此脚本"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
init_permissions
|
||||
|
||||
log_success "初始化完成!"
|
||||
log_info "目录结构:"
|
||||
ls -la data/ logs/
|
||||
100
deploy/scripts/save-images-xlcp.sh
Executable file
@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
OUTPUT_DIR="./xlcp-images"
|
||||
IMAGES=(
|
||||
"mysql:8.0"
|
||||
"redis:7-alpine"
|
||||
"eclipse-temurin:21-jre-alpine"
|
||||
"nginx:1.25-alpine"
|
||||
)
|
||||
|
||||
log_info() { echo "[INFO] $1"; }
|
||||
log_success() { echo "[SUCCESS] $1"; }
|
||||
log_error() { echo "[ERROR] $1"; exit 1; }
|
||||
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
log_info "拉取 Docker 镜像..."
|
||||
for image in "${IMAGES[@]}"; do
|
||||
log_info "拉取 $image..."
|
||||
docker pull "$image"
|
||||
done
|
||||
|
||||
log_info "导出镜像到 tar 文件..."
|
||||
for image in "${IMAGES[@]}"; do
|
||||
image_name=$(echo "$image" | tr ':/' '_')
|
||||
log_info "导出 ${image} -> ${image_name}.tar"
|
||||
docker save "$image" | gzip > "$OUTPUT_DIR/${image_name}.tar.gz"
|
||||
done
|
||||
|
||||
cat > "$OUTPUT_DIR/upload.sh" << 'UPLOAD_EOF'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
REMOTE_SERVER="${1:-root@192.168.10.150}"
|
||||
REMOTE_DIR="${REMOTE_DEPLOY_DIR:-/projects/data/xlcp}"
|
||||
echo "上传镜像到 $REMOTE_SERVER..."
|
||||
for file in *.tar.gz; do
|
||||
echo "上传 $file..."
|
||||
scp "$file" "$REMOTE_SERVER:$REMOTE_DIR/images-archive/"
|
||||
done
|
||||
echo "上传完成"
|
||||
UPLOAD_EOF
|
||||
chmod +x "$OUTPUT_DIR/upload.sh"
|
||||
|
||||
cat > "$OUTPUT_DIR/load.sh" << 'LOAD_EOF'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
for file in *.tar.gz; do
|
||||
echo "加载 $file..."
|
||||
docker load -i "$file"
|
||||
done
|
||||
echo "所有镜像加载完成"
|
||||
docker images | grep -E "mysql|redis|eclipse-temurin|nginx"
|
||||
LOAD_EOF
|
||||
chmod +x "$OUTPUT_DIR/load.sh"
|
||||
|
||||
cat > "$OUTPUT_DIR/README.md" << 'README_EOF'
|
||||
# XL监狱综合管理平台 - Docker 镜像包
|
||||
|
||||
## 镜像列表
|
||||
|
||||
| 镜像 | 用途 |
|
||||
|------|------|
|
||||
| mysql:8.0 | 数据库 |
|
||||
| redis:7-alpine | 缓存 |
|
||||
| eclipse-temurin:21-jre-alpine | 后端运行 |
|
||||
| nginx:1.25-alpine | 前端服务 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 上传到服务器
|
||||
|
||||
```bash
|
||||
cd images-archive
|
||||
./upload.sh root@192.168.10.150
|
||||
```
|
||||
|
||||
### 2. 在服务器加载镜像
|
||||
|
||||
```bash
|
||||
ssh root@192.168.10.150
|
||||
cd /projects/data/xlcp/images-archive
|
||||
./load.sh
|
||||
```
|
||||
|
||||
### 3. 验证镜像
|
||||
|
||||
```bash
|
||||
docker images | grep -E "mysql|redis|eclipse-temurin|nginx"
|
||||
```
|
||||
README_EOF
|
||||
|
||||
log_success "镜像打包完成!"
|
||||
echo ""
|
||||
echo "镜像包位置: $OUTPUT_DIR/"
|
||||
ls -lh "$OUTPUT_DIR/"
|
||||
echo ""
|
||||
echo "使用方法:"
|
||||
echo " 1. 上传: cd $OUTPUT_DIR && ./upload.sh root@192.168.10.150"
|
||||
echo " 2. 加载: ssh root@192.168.10.150 'cd /projects/data/xlcp/images-archive && ./load.sh'"
|
||||
290
deploy/sql/prison_schema.sql
Normal file
@ -0,0 +1,290 @@
|
||||
-- ============================================
|
||||
-- XL监狱综合管理平台 - 数据库初始化脚本
|
||||
-- 复用 RAGFlow MySQL 镜像创建独立数据库
|
||||
-- ============================================
|
||||
|
||||
-- 创建数据库
|
||||
|
||||
|
||||
-- ============================================
|
||||
-- 罪犯信息表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_prisoner` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '罪犯ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||
`gender` tinyint NOT NULL COMMENT '性别:1-男 2-女',
|
||||
`birthday` date DEFAULT NULL COMMENT '出生日期',
|
||||
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
|
||||
`ethnicity` varchar(50) DEFAULT NULL COMMENT '民族',
|
||||
`native_place` varchar(100) DEFAULT NULL COMMENT '籍贯',
|
||||
`education` tinyint DEFAULT NULL COMMENT '文化程度:1-文盲 2-小学 3-初中 4-高中 5-中专 6-大专 7-本科 8-硕士 9-博士',
|
||||
`occupation` varchar(50) DEFAULT NULL COMMENT '入狱前职业',
|
||||
`address` varchar(500) DEFAULT NULL COMMENT '家庭住址',
|
||||
`crime` varchar(200) NOT NULL COMMENT '罪名',
|
||||
`sentence_years` int DEFAULT 0 COMMENT '刑期(年)',
|
||||
`sentence_months` int DEFAULT 0 COMMENT '刑期(月)',
|
||||
`life_imprisonment` tinyint DEFAULT 0 COMMENT '是否无期:0-否 1-是',
|
||||
`death_sentence_reprieve` tinyint DEFAULT 0 COMMENT '是否死缓:0-否 1-是',
|
||||
`court_name` varchar(100) DEFAULT NULL COMMENT '判决法院',
|
||||
`judgment_date` date DEFAULT NULL COMMENT '判决日期',
|
||||
`judgment_no` varchar(50) DEFAULT NULL COMMENT '判决书编号',
|
||||
`original_sentence` varchar(100) DEFAULT NULL COMMENT '原判刑期',
|
||||
`imprisonment_date` date DEFAULT NULL COMMENT '入狱日期',
|
||||
`release_date` date DEFAULT NULL COMMENT '释放日期',
|
||||
`release_type` tinyint DEFAULT 0 COMMENT '释放类型:0-未知 1-刑满释放 2-假释 3-保外就医 4-减刑 5-暂予监外执行 6-特赦 7-死亡 8-其他',
|
||||
`release_reason` varchar(500) DEFAULT NULL COMMENT '释放原因',
|
||||
`photo` varchar(512) DEFAULT NULL COMMENT '照片URL',
|
||||
`supervision_level` tinyint DEFAULT 2 COMMENT '监管等级:1-严管 2-普管 3-宽管',
|
||||
`risk_level` tinyint DEFAULT 1 COMMENT '风险等级:1-低风险 2-中风险 3-高风险 4-极高风险',
|
||||
`prison_area_id` bigint DEFAULT NULL COMMENT '监区ID',
|
||||
`sub_area_id` bigint DEFAULT NULL COMMENT '分区ID',
|
||||
`prison_cell_id` bigint DEFAULT NULL COMMENT '监室ID',
|
||||
`marital_status` tinyint DEFAULT NULL COMMENT '婚姻状态:1-未婚 2-已婚 3-离异 4-丧偶',
|
||||
`crime_type` varchar(100) DEFAULT NULL COMMENT '罪名类型',
|
||||
`sentence` varchar(100) DEFAULT NULL COMMENT '刑期',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-在押 2-已释放 3-已死亡 4-假释',
|
||||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_prisoner_no` (`prisoner_no`, `tenant_id`),
|
||||
KEY `idx_name` (`name`),
|
||||
KEY `idx_id_card` (`id_card`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB COMMENT='罪犯信息表';
|
||||
|
||||
-- ============================================
|
||||
-- 监区信息表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_area` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '监区ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`name` varchar(50) NOT NULL COMMENT '监区名称',
|
||||
`code` varchar(50) NOT NULL COMMENT '监区编码',
|
||||
`type` tinyint DEFAULT NULL COMMENT '监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室',
|
||||
`capacity` int DEFAULT NULL COMMENT '容纳人数',
|
||||
`current_count` int DEFAULT 0 COMMENT '当前人数',
|
||||
`sort` int DEFAULT 0 COMMENT '排序',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用',
|
||||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_code` (`code`, `tenant_id`),
|
||||
KEY `idx_sort` (`sort`)
|
||||
) ENGINE=InnoDB COMMENT='监区信息表';
|
||||
|
||||
-- ============================================
|
||||
-- 监室信息表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_cell` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '监室ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`area_id` bigint NOT NULL COMMENT '所属监区ID',
|
||||
`name` varchar(50) NOT NULL COMMENT '监室名称',
|
||||
`code` varchar(50) NOT NULL COMMENT '监室编码',
|
||||
`capacity` int DEFAULT NULL COMMENT '床位数量',
|
||||
`current_count` int DEFAULT 0 COMMENT '当前人数',
|
||||
`sort` int DEFAULT 0 COMMENT '排序',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用',
|
||||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_code` (`code`, `tenant_id`),
|
||||
KEY `idx_area_id` (`area_id`)
|
||||
) ENGINE=InnoDB COMMENT='监室信息表';
|
||||
|
||||
-- ============================================
|
||||
-- 计分考核表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_score` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||
`year` int NOT NULL COMMENT '考核年份',
|
||||
`month` int NOT NULL COMMENT '考核月份',
|
||||
`base_score` decimal(10,2) DEFAULT 0.00 COMMENT '基础分',
|
||||
`reward_score` decimal(10,2) DEFAULT 0.00 COMMENT '加分',
|
||||
`penalty_score` decimal(10,2) DEFAULT 0.00 COMMENT '扣分',
|
||||
`total_score` decimal(10,2) DEFAULT 0.00 COMMENT '总分',
|
||||
`level` tinyint DEFAULT NULL COMMENT '考核等级:1-优秀 2-良好 3-合格 4-不合格',
|
||||
`assessor_id` bigint DEFAULT NULL COMMENT '考核人ID',
|
||||
`assessor_name` varchar(50) DEFAULT NULL COMMENT '考核人姓名',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-待审核 2-已通过 3-已驳回',
|
||||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_prisoner_id` (`prisoner_id`),
|
||||
KEY `idx_year_month` (`year`, `month`)
|
||||
) ENGINE=InnoDB COMMENT='计分考核表';
|
||||
|
||||
-- ============================================
|
||||
-- 危险评估表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_risk_assessment` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '评估ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||
`assessment_type` tinyint NOT NULL COMMENT '评估类型:1-入狱评估 2-定期评估 3-专项评估',
|
||||
`assessment_date` date NOT NULL COMMENT '评估日期',
|
||||
`violence_score` decimal(10,2) DEFAULT 0.00 COMMENT '暴力倾向得分',
|
||||
`escape_score` decimal(10,2) DEFAULT 0.00 COMMENT '脱逃倾向得分',
|
||||
`suicide_score` decimal(10,2) DEFAULT 0.00 COMMENT '自杀倾向得分',
|
||||
`total_score` decimal(10,2) DEFAULT 0.00 COMMENT '综合得分',
|
||||
`risk_level` tinyint NOT NULL COMMENT '风险等级:1-低风险 2-中风险 3-高风险 4-极高风险',
|
||||
`risk_factors` varchar(500) DEFAULT NULL COMMENT '风险因素',
|
||||
`suggestions` varchar(500) DEFAULT NULL COMMENT '管控建议',
|
||||
`assessor_id` bigint DEFAULT NULL COMMENT '评估人ID',
|
||||
`assessor_name` varchar(50) DEFAULT NULL COMMENT '评估人姓名',
|
||||
`next_assessment_date` date DEFAULT NULL COMMENT '下次评估日期',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-待审核 2-已通过',
|
||||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_prisoner_id` (`prisoner_id`),
|
||||
KEY `idx_assessment_date` (`assessment_date`)
|
||||
) ENGINE=InnoDB COMMENT='危险评估表';
|
||||
|
||||
-- ============================================
|
||||
-- 消费记录表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_consumption` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||
`type` tinyint NOT NULL COMMENT '类型:1-存款 2-消费 3-转账',
|
||||
`amount` decimal(12,2) NOT NULL COMMENT '金额',
|
||||
`balance` decimal(12,2) DEFAULT 0.00 COMMENT '账户余额',
|
||||
`goods_name` varchar(100) DEFAULT NULL COMMENT '商品名称',
|
||||
`goods_count` int DEFAULT 1 COMMENT '商品数量',
|
||||
`order_no` varchar(64) DEFAULT NULL COMMENT '订单号',
|
||||
`trade_time` datetime NOT NULL COMMENT '交易时间',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-成功 2-失败',
|
||||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_prisoner_id` (`prisoner_id`),
|
||||
KEY `idx_trade_time` (`trade_time`),
|
||||
KEY `idx_type` (`type`)
|
||||
) ENGINE=InnoDB COMMENT='消费记录表';
|
||||
|
||||
-- ============================================
|
||||
-- 问卷模板表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_questionnaire` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '问卷ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`title` varchar(200) NOT NULL COMMENT '问卷标题',
|
||||
`type` tinyint NOT NULL COMMENT '问卷类型:1-心理测评 2-行为评估 3-满意度调查',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '问卷说明',
|
||||
`total_score` decimal(10,2) DEFAULT 100.00 COMMENT '总分',
|
||||
`pass_score` decimal(10,2) DEFAULT 60.00 COMMENT '及格分',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-草稿 2-已发布 3-已禁用',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_type` (`type`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB COMMENT='问卷模板表';
|
||||
|
||||
-- ============================================
|
||||
-- 问卷问题表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_question` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '问题ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`questionnaire_id` bigint NOT NULL COMMENT '所属问卷ID',
|
||||
`title` varchar(500) NOT NULL COMMENT '问题标题',
|
||||
`type` tinyint NOT NULL COMMENT '问题类型:1-单选 2-多选 3-填空 4-评分',
|
||||
`options` text COMMENT '选项JSON:[{label:"选项1",score:10},...]',
|
||||
`score` decimal(10,2) DEFAULT 0.00 COMMENT '分值',
|
||||
`sort` int DEFAULT 0 COMMENT '排序',
|
||||
`is_required` bit(1) DEFAULT b'1' COMMENT '是否必答',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_questionnaire_id` (`questionnaire_id`)
|
||||
) ENGINE=InnoDB COMMENT='问卷问题表';
|
||||
|
||||
-- ============================================
|
||||
-- 问卷答题记录表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_questionnaire_record` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`questionnaire_id` bigint NOT NULL COMMENT '问卷ID',
|
||||
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||
`total_score` decimal(10,2) DEFAULT 0.00 COMMENT '得分',
|
||||
`pass_status` tinyint DEFAULT NULL COMMENT '是否及格:1-及格 2-不及格',
|
||||
`answer_time` datetime NOT NULL COMMENT '答题时间',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-已完成 2-已过期',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_questionnaire_id` (`questionnaire_id`),
|
||||
KEY `idx_prisoner_id` (`prisoner_id`)
|
||||
) ENGINE=InnoDB COMMENT='问卷答题记录表';
|
||||
|
||||
-- ============================================
|
||||
-- 罪犯监区变动记录表
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS `prison_prisoner_area_log` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||
`from_area_id` bigint DEFAULT NULL COMMENT '原监区ID',
|
||||
`from_cell_id` bigint DEFAULT NULL COMMENT '原监室ID',
|
||||
`to_area_id` bigint NOT NULL COMMENT '新监区ID',
|
||||
`to_cell_id` bigint NOT NULL COMMENT '新监室ID',
|
||||
`change_type` varchar(20) NOT NULL COMMENT '变动类型:调监区、调监室、入监、出监',
|
||||
`reason` varchar(500) DEFAULT NULL COMMENT '变动原因',
|
||||
`approve_no` varchar(50) DEFAULT NULL COMMENT '批准文号',
|
||||
`operate_by` bigint NOT NULL COMMENT '操作人ID',
|
||||
`operate_name` varchar(50) DEFAULT NULL COMMENT '操作人姓名',
|
||||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_prisoner_id` (`prisoner_id`),
|
||||
KEY `idx_operate_time` (`operate_time`)
|
||||
) ENGINE=InnoDB COMMENT='罪犯监区变动记录表';
|
||||
284
deploy/sql/quartz.sql
Normal file
4087
deploy/sql/ruoyi-vue-pro.sql
Normal file
BIN
detail.png
Normal file
|
After Width: | Height: | Size: 210 KiB |
756
docs/DEPLOYMENT.md
Normal file
@ -0,0 +1,756 @@
|
||||
# XL 监狱综合管理平台部署文档
|
||||
|
||||
## 1. 文档概述
|
||||
|
||||
本文档详细描述 XL 监狱综合管理平台在服务器 `root@192.168.10.150` 上的部署流程。该平台采用 Docker 容器化部署方式,包含 MySQL 数据库、Redis 缓存、Spring Boot 后端服务和 Nginx 前端服务。
|
||||
|
||||
### 1.1 系统架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ 服务器 192.168.10.150 │
|
||||
├─────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Docker 网络 (xlcp-network) │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────┐ ┌─────────────┐ ┌────────────────────────┐ │ │
|
||||
│ │ │ MySQL 8 │ │ Redis 6 │ │ 后端服务 (Java) │ │ │
|
||||
│ │ │ 端口:3306 │ │ 端口:6379 │ │ 端口:48080 │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ └──────┬──────┘ └──────┬──────┘ └───────────┬────────────┘ │ │
|
||||
│ │ │ │ │ │ │
|
||||
│ │ └────────────────┼──────────────────────┘ │ │
|
||||
│ │ │ │ │
|
||||
│ │ ┌──────┴──────┐ │ │
|
||||
│ │ │ Nginx │ │ │
|
||||
│ │ │ 端口:8080 │ │ │
|
||||
│ │ └──────┬──────┘ │ │
|
||||
│ │ │ │ │
|
||||
│ └──────────────────────────┼─────────────────────────────────────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ 外部用户访问入口 │
|
||||
│ http://192.168.10.150:8080 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 1.2 端口分配
|
||||
|
||||
| 服务 | 端口 | 说明 |
|
||||
|------|------|------|
|
||||
| Nginx 前端 | 8080 | Web 访问入口 |
|
||||
| Spring Boot 后端 | 48080 | API 服务端口 |
|
||||
| MySQL | 3306 | 数据库服务 |
|
||||
| Redis | 6379 | 缓存服务 |
|
||||
|
||||
### 1.3 环境要求
|
||||
|
||||
在开始部署之前,请确保目标服务器满足以下最低要求:
|
||||
|
||||
- **操作系统**: CentOS 7+ / Ubuntu 18+ / Rocky Linux 8+ / Debian 10+
|
||||
- **CPU**: 最低 2 核,推荐 4 核或更多
|
||||
- **内存**: 最低 4GB,推荐 8GB 或更多
|
||||
- **硬盘**: 最低 50GB 可用空间,推荐 100GB SSD
|
||||
- **网络**: 具备互联网访问能力,用于下载 Docker 镜像
|
||||
|
||||
## 2. 服务器环境准备
|
||||
|
||||
### 2.1 安装 Docker
|
||||
|
||||
以下是在 CentOS/Rocky Linux 系统上安装 Docker 的步骤。如果您的服务器已安装 Docker,请跳过此步骤。
|
||||
|
||||
```bash
|
||||
# 1. 安装必要依赖
|
||||
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
|
||||
|
||||
# 2. 添加 Docker 官方仓库
|
||||
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
||||
|
||||
# 3. 安装 Docker 引擎
|
||||
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||||
|
||||
# 4. 启动 Docker 服务
|
||||
sudo systemctl start docker
|
||||
|
||||
# 5. 设置开机自启动
|
||||
sudo systemctl enable docker
|
||||
|
||||
# 6. 验证安装
|
||||
docker --version
|
||||
docker compose version
|
||||
```
|
||||
|
||||
对于 Ubuntu/Debian 系统,请使用以下命令:
|
||||
|
||||
```bash
|
||||
# 1. 更新软件包索引
|
||||
sudo apt-get update
|
||||
|
||||
# 2. 安装必要依赖
|
||||
sudo apt-get install -y ca-certificates curl gnupg lsb-release
|
||||
|
||||
# 3. 添加 Docker 官方 GPG 密钥
|
||||
sudo mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||
|
||||
# 4. 设置 Docker 仓库
|
||||
echo \
|
||||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
|
||||
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
|
||||
# 5. 安装 Docker
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||||
|
||||
# 6. 启动并设置开机自启动
|
||||
sudo systemctl start docker
|
||||
sudo systemctl enable docker
|
||||
```
|
||||
|
||||
### 2.2 配置 Docker 镜像加速
|
||||
|
||||
为了加速 Docker 镜像的下载,建议配置国内镜像加速器。
|
||||
|
||||
```bash
|
||||
# 创建 Docker 配置目录
|
||||
sudo mkdir -p /etc/docker
|
||||
|
||||
# 配置镜像加速器
|
||||
sudo tee /etc/docker/daemon.json <<-EOF
|
||||
{
|
||||
"registry-mirrors": [
|
||||
"https://docker.mirrors.ustc.edu.cn",
|
||||
"https://hub-mirror.c.163.com",
|
||||
"https://registry.docker-cn.com"
|
||||
],
|
||||
"log-driver": "json-file",
|
||||
"log-opts": {
|
||||
"max-size": "100m",
|
||||
"max-file": "3"
|
||||
},
|
||||
"storage-driver": "overlay2"
|
||||
}
|
||||
EOF
|
||||
|
||||
# 重启 Docker 服务
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart docker
|
||||
|
||||
# 验证配置
|
||||
docker info | grep "Registry Mirrors"
|
||||
```
|
||||
|
||||
### 2.3 安装 Git(用于拉取代码)
|
||||
|
||||
```bash
|
||||
# CentOS/Rocky Linux
|
||||
sudo yum install -y git
|
||||
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install -y git
|
||||
```
|
||||
|
||||
## 3. 项目部署
|
||||
|
||||
### 3.1 创建部署目录结构
|
||||
|
||||
在服务器上创建项目部署目录:
|
||||
|
||||
```bash
|
||||
# 创建项目根目录
|
||||
sudo mkdir -p /work/projects/xlcp
|
||||
sudo mkdir -p /work/projects/xlcp/{backend,frontend,data/{mysql,redis},logs,sql}
|
||||
|
||||
# 设置目录所有者(请将 username 替换为实际用户名)
|
||||
sudo chown -R $USER:$USER /work/projects/xlcp
|
||||
|
||||
# 进入项目目录
|
||||
cd /work/projects/xlcp
|
||||
```
|
||||
|
||||
目录结构说明:
|
||||
|
||||
```
|
||||
/work/projects/xlcp/
|
||||
├── backend/ # 后端服务目录
|
||||
│ ├── config/ # 配置文件目录
|
||||
│ └── Dockerfile # Docker 构建文件
|
||||
├── frontend/ # 前端服务目录
|
||||
│ ├── dist/ # 前端构建产物
|
||||
│ └── nginx.conf # Nginx 配置文件
|
||||
├── data/ # 数据持久化目录
|
||||
│ ├── mysql/ # MySQL 数据文件
|
||||
│ └── redis/ # Redis 数据文件
|
||||
├── logs/ # 日志目录
|
||||
│ ├── backend/ # 后端日志
|
||||
│ └── nginx/ # Nginx 日志
|
||||
├── sql/ # SQL 初始化脚本
|
||||
├── docker-compose.yml # Docker Compose 配置
|
||||
└── README.md # 部署文档
|
||||
```
|
||||
|
||||
### 3.2 获取项目代码
|
||||
|
||||
您可以通过以下两种方式之一获取项目代码:
|
||||
|
||||
**方式一:从 Git 仓库克隆**
|
||||
|
||||
```bash
|
||||
cd /work/projects/xlcp
|
||||
git clone <your-repository-url> ./source
|
||||
```
|
||||
|
||||
**方式二:从本地复制**
|
||||
|
||||
在您的开发机器上执行以下命令,将项目复制到服务器:
|
||||
|
||||
```bash
|
||||
# 复制整个项目到服务器
|
||||
scp -r /Volumes/Dpan/github/xlcp root@192.168.10.150:/work/projects/xlcp/source
|
||||
|
||||
# 或者只复制必要文件
|
||||
scp -r /Volumes/Dpan/github/xlcp/backend root@192.168.10.150:/work/projects/xlcp/
|
||||
scp -r /Volumes/Dpan/github/xlcp/frontend/dist root@192.168.10.150:/work/projects/xlcp/frontend/
|
||||
scp -r /Volumes/Dpan/github/xlcp/backend/sql/mysql/*.sql root@192.168.10.150:/work/projects/xlcp/sql/
|
||||
```
|
||||
|
||||
### 3.3 复制配置文件
|
||||
|
||||
将预先准备好的配置文件复制到服务器:
|
||||
|
||||
```bash
|
||||
# 复制 Docker Compose 配置
|
||||
cp deploy/docker-compose.yml /work/projects/xlcp/
|
||||
|
||||
# 复制后端配置
|
||||
cp deploy/config/application-prod.yaml /work/projects/xlcp/backend/config/
|
||||
|
||||
# 复制后端 Dockerfile
|
||||
cp deploy/docker/backend/Dockerfile /work/projects/xlcp/backend/
|
||||
|
||||
# 复制前端 Nginx 配置
|
||||
cp deploy/docker/frontend/nginx.conf /work/projects/xlcp/frontend/
|
||||
|
||||
# 复制 SQL 初始化脚本
|
||||
cp backend/sql/mysql/*.sql /work/projects/xlcp/sql/
|
||||
```
|
||||
|
||||
### 3.4 编译后端项目
|
||||
|
||||
在有 Maven 环境的机器上编译后端项目:
|
||||
|
||||
```bash
|
||||
cd /Volumes/Dpan/github/xlcp/backend
|
||||
|
||||
# 清理并打包(跳过测试)
|
||||
mvn clean package -DskipTests -Dmaven.javadoc.skip=true
|
||||
|
||||
# 构建完成后,jar 包位于以下位置
|
||||
ls -lh yudao-server/target/yudao-server.jar
|
||||
```
|
||||
|
||||
将编译好的 jar 包复制到服务器:
|
||||
|
||||
```bash
|
||||
scp yudao-server/target/yudao-server.jar root@192.168.10.150:/work/projects/xlcp/backend/
|
||||
```
|
||||
|
||||
### 3.5 构建前端项目
|
||||
|
||||
在有 Node.js 环境的机器上构建前端:
|
||||
|
||||
```bash
|
||||
cd /Volumes/Dpan/github/xlcp/frontend
|
||||
|
||||
# 安装依赖
|
||||
pnpm install
|
||||
|
||||
# 生产环境构建
|
||||
pnpm build:prod
|
||||
|
||||
# 构建完成后,构建产物在 dist 目录
|
||||
ls -lh dist/
|
||||
```
|
||||
|
||||
将构建产物复制到服务器:
|
||||
|
||||
```bash
|
||||
scp -r dist/* root@192.168.10.150:/work/projects/xlcp/frontend/
|
||||
```
|
||||
|
||||
## 4. 配置文件说明
|
||||
|
||||
### 4.1 Docker Compose 配置
|
||||
|
||||
主要配置项说明:
|
||||
|
||||
```yaml
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
# MySQL 数据库服务
|
||||
mysql:
|
||||
image: mysql:8.0 # 使用 MySQL 8.0 镜像
|
||||
container_name: xlcp-mysql # 容器名称
|
||||
restart: unless-stopped # 异常退出后自动重启
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: Prison2024!@ # root 用户密码
|
||||
MYSQL_DATABASE: prison # 数据库名称
|
||||
volumes:
|
||||
- ./data/mysql:/var/lib/mysql # 数据持久化
|
||||
- ./sql:/docker-entrypoint-initdb.d:ro # 初始化脚本
|
||||
ports:
|
||||
- "3306:3306" # 端口映射
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 2G # 内存限制
|
||||
|
||||
# Redis 缓存服务
|
||||
redis:
|
||||
image: redis:6.2-alpine
|
||||
container_name: xlcp-redis
|
||||
command: redis-server --requirepass Redis2024!@ # 设置密码
|
||||
volumes:
|
||||
- ./data/redis:/data
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
|
||||
# 后端服务
|
||||
backend:
|
||||
build:
|
||||
context: ./backend
|
||||
dockerfile: Dockerfile
|
||||
container_name: xlcp-backend
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: prod # 生产环境配置
|
||||
JAVA_OPTS: -Xms512m -Xmx1024m # JVM 内存配置
|
||||
volumes:
|
||||
- ./backend/config:/app/config:ro # 配置文件挂载
|
||||
- ./logs/backend:/app/logs # 日志目录挂载
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy # 等待 MySQL 健康检查通过
|
||||
redis:
|
||||
condition: service_healthy # 等待 Redis 健康检查通过
|
||||
|
||||
# 前端服务
|
||||
frontend:
|
||||
image: nginx:alpine
|
||||
container_name: xlcp-frontend
|
||||
volumes:
|
||||
- ./frontend/dist:/usr/share/nginx/html:ro # 前端静态文件
|
||||
- ./frontend/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- ./logs/nginx:/var/log/nginx # Nginx 日志
|
||||
```
|
||||
|
||||
### 4.2 后端生产配置
|
||||
|
||||
配置文件位置:`backend/config/application-prod.yaml`
|
||||
|
||||
主要配置项:
|
||||
|
||||
```yaml
|
||||
spring:
|
||||
datasource:
|
||||
dynamic:
|
||||
datasource:
|
||||
master:
|
||||
url: jdbc:mysql://mysql:3306/prison?useSSL=false&serverTimezone=Asia/Shanghai...
|
||||
username: root
|
||||
password: Prison2024!@
|
||||
data:
|
||||
redis:
|
||||
host: redis # 使用 Docker 网络中的服务名
|
||||
port: 6379
|
||||
password: Redis2024!@
|
||||
|
||||
server:
|
||||
port: 48080 # 后端服务端口
|
||||
|
||||
logging:
|
||||
level:
|
||||
cn.iocoder.yudao: DEBUG
|
||||
```
|
||||
|
||||
**重要说明**:在 Docker 环境中,使用 Docker Compose 定义的服务名(如 `mysql`、`redis`)作为主机名,而非 IP 地址。
|
||||
|
||||
### 4.3 Nginx 配置
|
||||
|
||||
配置文件位置:`frontend/nginx.conf`
|
||||
|
||||
主要功能:
|
||||
|
||||
- 静态文件服务
|
||||
- API 请求代理到后端服务
|
||||
- Gzip 压缩
|
||||
- 缓存配置
|
||||
- 安全头配置
|
||||
|
||||
```nginx
|
||||
upstream backend {
|
||||
server backend:48080; # 后端服务地址
|
||||
keepalive 32;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
|
||||
# 前端路由支持
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# API 代理
|
||||
location /prod-api/ {
|
||||
proxy_pass http://backend;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 部署执行
|
||||
|
||||
### 5.1 启动服务
|
||||
|
||||
```bash
|
||||
cd /work/projects/xlcp
|
||||
|
||||
# 启动所有服务(后台运行)
|
||||
docker compose up -d
|
||||
|
||||
# 查看启动状态
|
||||
docker compose ps
|
||||
|
||||
# 查看服务日志
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
### 5.2 验证部署
|
||||
|
||||
执行以下命令验证各服务是否正常运行:
|
||||
|
||||
```bash
|
||||
# 1. 检查 MySQL
|
||||
docker exec -it xlcp-mysql mysql -uroot -pPrison2024!@ -e "SHOW DATABASES;"
|
||||
|
||||
# 预期输出应包含 prison 数据库
|
||||
|
||||
# 2. 检查 Redis
|
||||
docker exec -it xlcp-redis redis-cli -a Redis2024!@ ping
|
||||
|
||||
# 预期输出:PONG
|
||||
|
||||
# 3. 检查后端健康状态
|
||||
curl http://localhost:48080/actuator/health/
|
||||
|
||||
# 预期输出:{"status":"UP"}
|
||||
|
||||
# 4. 检查前端访问
|
||||
curl -I http://localhost:8080/
|
||||
|
||||
# 预期输出:HTTP/1.1 200 OK
|
||||
```
|
||||
|
||||
### 5.3 查看日志
|
||||
|
||||
```bash
|
||||
# 查看后端日志
|
||||
docker logs xlcp-backend
|
||||
tail -f /work/projects/xlcp/logs/backend/yudao-server.log
|
||||
|
||||
# 查看 Nginx 日志
|
||||
docker logs xlcp-frontend
|
||||
tail -f /work/projects/xlcp/logs/nginx/access.log
|
||||
tail -f /work/projects/xlcp/logs/nginx/error.log
|
||||
```
|
||||
|
||||
## 6. 访问地址
|
||||
|
||||
部署完成后,系统可通过以下地址访问:
|
||||
|
||||
| 服务 | 地址 | 说明 |
|
||||
|------|------|------|
|
||||
| 前端页面 | http://192.168.10.150:8080 | 监狱管理系统 Web 界面 |
|
||||
| 后端 API | http://192.168.10.150:48080 | 后端服务接口 |
|
||||
| 健康检查 | http://192.168.10.150:48080/actuator/health | 服务健康状态 |
|
||||
| MySQL | 192.168.10.150:3306 | 数据库连接 |
|
||||
| Redis | 192.168.10.150:6379 | 缓存服务 |
|
||||
|
||||
## 7. 运维管理
|
||||
|
||||
### 7.1 服务管理命令
|
||||
|
||||
```bash
|
||||
# 启动所有服务
|
||||
docker compose start
|
||||
|
||||
# 停止所有服务
|
||||
docker compose stop
|
||||
|
||||
# 重启所有服务
|
||||
docker compose restart
|
||||
|
||||
# 重启单个服务
|
||||
docker compose restart backend
|
||||
docker compose restart frontend
|
||||
|
||||
# 查看服务状态
|
||||
docker compose ps
|
||||
|
||||
# 查看服务资源使用
|
||||
docker stats
|
||||
|
||||
# 进入容器内部
|
||||
docker exec -it xlcp-backend /bin/sh
|
||||
docker exec -it xlcp-mysql mysql -uroot -pPrison2024!@
|
||||
docker exec -it xlcp-redis redis-cli -a Redis2024!@
|
||||
```
|
||||
|
||||
### 7.2 日志管理
|
||||
|
||||
```bash
|
||||
# 查看所有服务日志
|
||||
docker compose logs
|
||||
|
||||
# 查看指定服务日志
|
||||
docker compose logs backend
|
||||
docker compose logs frontend
|
||||
docker compose logs mysql
|
||||
docker compose logs redis
|
||||
|
||||
# 实时查看日志
|
||||
docker compose logs -f
|
||||
|
||||
# 查看最近 100 行日志
|
||||
docker logs --tail 100 xlcp-backend
|
||||
```
|
||||
|
||||
### 7.3 数据备份
|
||||
|
||||
```bash
|
||||
# 备份 MySQL 数据库
|
||||
BACKUP_DIR=/work/projects/xlcp/backup
|
||||
mkdir -p $BACKUP_DIR
|
||||
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
|
||||
|
||||
docker exec xlcp-mysql mysqldump -uroot -pPrison2024!@ prison > $BACKUP_DIR/prison_$BACKUP_DATE.sql
|
||||
|
||||
# 压缩备份文件
|
||||
gzip $BACKUP_DIR/prison_$BACKUP_DATE.sql
|
||||
|
||||
# 查看备份文件
|
||||
ls -lh $BACKUP_DIR/
|
||||
|
||||
# 备份 Redis 数据
|
||||
docker exec xlcp-redis redis-cli -a Redis2024!@ BGSAVE
|
||||
docker cp xlcp-redis:/data/dump.rdb $BACKUP_DIR/redis_$BACKUP_DATE.rdb
|
||||
```
|
||||
|
||||
### 7.4 版本更新
|
||||
|
||||
```bash
|
||||
# 1. 停止当前服务
|
||||
cd /work/projects/xlcp
|
||||
docker compose down
|
||||
|
||||
# 2. 备份重要数据
|
||||
cp -r data data.backup.$(date +%Y%m%d)
|
||||
|
||||
# 3. 更新代码
|
||||
cd source
|
||||
git pull
|
||||
|
||||
# 4. 重新编译
|
||||
cd ../backend
|
||||
mvn clean package -DskipTests
|
||||
cd ../frontend
|
||||
pnpm install && pnpm build:prod
|
||||
|
||||
# 5. 更新构建产物
|
||||
cp -r dist/* ../frontend/
|
||||
cp target/*.jar ../backend/
|
||||
|
||||
# 6. 重新构建镜像并启动
|
||||
cd ..
|
||||
docker compose build --no-cache
|
||||
docker compose up -d
|
||||
|
||||
# 7. 验证部署
|
||||
curl http://localhost:48080/actuator/health/
|
||||
```
|
||||
|
||||
## 8. 常见问题排查
|
||||
|
||||
### 8.1 后端无法连接数据库
|
||||
|
||||
```bash
|
||||
# 检查 MySQL 容器状态
|
||||
docker ps | grep mysql
|
||||
|
||||
# 检查 MySQL 日志
|
||||
docker logs xlcp-mysql
|
||||
|
||||
# 检查 MySQL 健康状态
|
||||
docker exec xlcp-mysql mysqladmin -uroot -pPrison2024!@ ping
|
||||
|
||||
# 检查网络连接
|
||||
docker exec xlcp-backend ping mysql
|
||||
|
||||
# 常见原因及解决方案:
|
||||
# 1. MySQL 容器未启动 → docker compose restart mysql
|
||||
# 2. 密码错误 → 检查 application-prod.yaml 配置
|
||||
# 3. 网络问题 → 检查 Docker 网络状态
|
||||
```
|
||||
|
||||
### 8.2 前端 502 错误
|
||||
|
||||
```bash
|
||||
# 检查后端服务状态
|
||||
docker ps | grep backend
|
||||
|
||||
# 检查后端健康状态
|
||||
curl http://localhost:48080/actuator/health/
|
||||
|
||||
# 检查后端日志
|
||||
docker logs xlcp-backend
|
||||
|
||||
# 检查 Nginx 配置
|
||||
docker exec xlcp-frontend cat /etc/nginx/nginx.conf
|
||||
|
||||
# 测试后端连通性
|
||||
docker exec xlcp-frontend curl http://backend:48080/actuator/health/
|
||||
```
|
||||
|
||||
### 8.3 内存不足
|
||||
|
||||
```bash
|
||||
# 检查容器资源使用情况
|
||||
docker stats
|
||||
|
||||
# 调整 JVM 内存配置,编辑 docker-compose.yml
|
||||
environment:
|
||||
JAVA_OPTS: -Xms256m -Xmx512m
|
||||
|
||||
# 重新启动服务
|
||||
docker compose restart backend
|
||||
```
|
||||
|
||||
### 8.4 端口冲突
|
||||
|
||||
```bash
|
||||
# 检查端口占用
|
||||
netstat -tlnp | grep 8080
|
||||
netstat -tlnp | grep 48080
|
||||
|
||||
# 如果端口被占用,可以修改 docker-compose.yml 中的端口映射
|
||||
ports:
|
||||
- "8081:80" # 改为 8081 端口
|
||||
```
|
||||
|
||||
### 8.5 数据丢失
|
||||
|
||||
```bash
|
||||
# 检查数据卷挂载
|
||||
docker volume ls
|
||||
|
||||
# 检查数据目录权限
|
||||
ls -la /work/projects/xlcp/data/
|
||||
|
||||
# 恢复数据(从备份)
|
||||
gunzip -k /work/projects/xlcp/backup/prison_20240115.sql.gz
|
||||
docker exec -i xlcp-mysql mysql -uroot -pPrison2024!@ prison < /work/projects/xlcp/backup/prison_20240115.sql
|
||||
```
|
||||
|
||||
## 9. 安全加固建议
|
||||
|
||||
### 9.1 修改默认密码
|
||||
|
||||
生产环境中,请务必修改默认密码:
|
||||
|
||||
```yaml
|
||||
# MySQL
|
||||
MYSQL_ROOT_PASSWORD: YourStrongPassword123!@
|
||||
|
||||
# Redis
|
||||
command: redis-server --requirepass YourStrongRedisPassword456!@
|
||||
|
||||
# 修改 application-prod.yaml 中的数据库密码
|
||||
password: YourStrongPassword123!@
|
||||
```
|
||||
|
||||
### 9.2 配置防火墙
|
||||
|
||||
```bash
|
||||
# 只开放必要端口(CentOS)
|
||||
firewall-cmd --permanent --add-port=8080/tcp
|
||||
firewall-cmd --permanent --add-port=48080/tcp
|
||||
firewall-cmd --reload
|
||||
|
||||
# 只开放必要端口(Ubuntu)
|
||||
sudo ufw allow 8080/tcp
|
||||
sudo ufw allow 48080/tcp
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
### 9.3 启用 HTTPS(推荐)
|
||||
|
||||
建议使用 Nginx 反向代理并配置 SSL 证书:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name your-domain.com;
|
||||
|
||||
ssl_certificate /etc/nginx/ssl/cert.pem;
|
||||
ssl_certificate_key /etc/nginx/ssl/key.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
|
||||
# 其他配置...
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
```
|
||||
|
||||
### 9.4 定期安全更新
|
||||
|
||||
```bash
|
||||
# 更新系统软件包
|
||||
sudo yum update -y # CentOS
|
||||
sudo apt-get update && sudo apt-get upgrade -y # Ubuntu
|
||||
|
||||
# 更新 Docker
|
||||
sudo yum update docker-ce # CentOS
|
||||
sudo apt-get update && sudo apt-get install docker-ce # Ubuntu
|
||||
```
|
||||
|
||||
### 9.5 监控与告警
|
||||
|
||||
建议配置以下监控:
|
||||
|
||||
- **服务监控**: 使用 Prometheus + Grafana 监控容器状态
|
||||
- **日志监控**: 使用 ELK Stack 收集和分析日志
|
||||
- **告警通知**: 配置邮件或企业微信告警通知
|
||||
|
||||
## 10. 联系与支持
|
||||
|
||||
如果在部署过程中遇到问题,请:
|
||||
|
||||
1. 查看本文档的常见问题排查章节
|
||||
2. 检查各服务的日志文件
|
||||
3. 联系系统管理员获取支持
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: 1.0.0
|
||||
**最后更新**: 2026年1月21日
|
||||
**适用系统**: XL 监狱综合管理平台 v1.0
|
||||
348
docs/assessment-report-requirements.md
Normal file
@ -0,0 +1,348 @@
|
||||
# 评估报告模块需求文档
|
||||
|
||||
## 1. 项目背景
|
||||
|
||||
XL监狱综合管理平台需要新增**评估报告模块**,利用AI大语言模型自动填写风险评估报告,提高评估工作效率。
|
||||
|
||||
## 2. 需求概述
|
||||
|
||||
### 2.1 功能目标
|
||||
|
||||
使用AI大语言模型自动填写风险评估报告,支持人机协作模式(AI生成初稿 + 人工审核修改)。
|
||||
|
||||
### 2.2 核心特性
|
||||
|
||||
- 独立的评估报告模板配置(与问卷模板分离)
|
||||
- 绑定多种数据源(消费、计分、狱情、亲属信息等)
|
||||
- AI生成初稿,管教民警可逐项修改确认
|
||||
- 报告导出(PDF/Word)
|
||||
- 审核工作流
|
||||
|
||||
### 2.3 评估类型
|
||||
|
||||
| 类型 | 说明 |
|
||||
|------|------|
|
||||
| 入监评估 | 新犯入狱后的综合评估 |
|
||||
| 定期评估 | 服刑期间定期的改造情况评估 |
|
||||
| 专项评估 | 针对特定事件的专项评估 |
|
||||
| 出监评估 | 假释/刑满前的释放前评估 |
|
||||
|
||||
## 3. 功能需求
|
||||
|
||||
### 3.1 评估报告模板管理
|
||||
|
||||
#### 3.1.1 功能描述
|
||||
|
||||
管理员可配置评估报告模板,包含多个评估维度和对应的AI提示词。
|
||||
|
||||
#### 3.1.2 功能点
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| 模板增删改查 | 模板的基本信息管理 |
|
||||
| 版本管理 | 模板版本控制 |
|
||||
| 评估维度配置 | 支持拖拽排序的维度配置 |
|
||||
| AI提示词配置 | 每个维度配置AI提示词 |
|
||||
| 数据源绑定 | 配置维度需要使用的数据源 |
|
||||
|
||||
#### 3.1.3 评估维度配置
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| 维度名称 | 文本 | 如:犯罪情况分析、服刑表现评估等 |
|
||||
| AI提示词 | 多行文本 | AI生成的指令模板 |
|
||||
| 数据源绑定 | 多选 | 选择需要聚合的数据源 |
|
||||
| 输出格式 | 下拉 | 文本/段落/列表 |
|
||||
| 是否AI生成 | 开关 | 该维度是否需要AI生成 |
|
||||
| 编辑器类型 | 下拉 | 文本框/富文本/下拉选择 |
|
||||
| 排序 | 数字 | 维度排序 |
|
||||
|
||||
### 3.2 数据源类型
|
||||
|
||||
| 数据源类型 | 标识 | 说明 |
|
||||
|-----------|------|------|
|
||||
| 罪犯档案 | prisoner | 基本信息、犯罪情况、刑期等 |
|
||||
| 消费记录 | consumption | 消费金额、消费类型分布 |
|
||||
| 计分考核 | score | 月度得分、年度汇总、等级分布 |
|
||||
| 问卷答题 | questionnaire_record | 心理测评结果、问卷得分 |
|
||||
| 违规记录 | violation | 违规次数、违规类型 |
|
||||
| 奖励记录 | reward | 表扬次数、立功情况 |
|
||||
| 会见记录 | visit | 会见频次、会见人关系 |
|
||||
| 劳动数据 | labor | 劳动效率、产量质量 |
|
||||
|
||||
### 3.3 评估报告管理
|
||||
|
||||
#### 3.3.1 工作流程
|
||||
|
||||
```
|
||||
选择服刑人员 → 选择评估模板 → 创建报告 → AI生成初稿 → 人工修改 → 提交审核 → 审核通过 → 导出报告
|
||||
↓
|
||||
数据源自动聚合
|
||||
```
|
||||
|
||||
#### 3.3.2 报告状态
|
||||
|
||||
| 状态 | 说明 |
|
||||
|------|------|
|
||||
| 草稿 | 报告刚创建,未提交审核 |
|
||||
| 待审核 | 已提交,等待领导审核 |
|
||||
| 已通过 | 审核通过 |
|
||||
| 已驳回 | 审核被驳回,需修改后重新提交 |
|
||||
|
||||
#### 3.3.3 人机协作模式
|
||||
|
||||
- AI生成各维度初稿,显示"AI生成"标识
|
||||
- 管教民警可逐维度编辑修改
|
||||
- 修改后显示"人工修改"标识和修改时间
|
||||
- 记录修改历史(版本管理)
|
||||
|
||||
### 3.4 报告导出
|
||||
|
||||
#### 3.4.1 导出格式
|
||||
|
||||
| 格式 | 用途 |
|
||||
|------|------|
|
||||
| PDF | 正式存档、打印 |
|
||||
| Word | 修改编辑 |
|
||||
| HTML | 系统内预览 |
|
||||
|
||||
#### 3.4.2 导出内容选项
|
||||
|
||||
- [x] 维度分析
|
||||
- [x] 综合结论
|
||||
- [x] 改造建议
|
||||
- [x] 审核信息
|
||||
|
||||
## 4. 页面设计
|
||||
|
||||
### 4.1 报告编辑页面(左右分栏布局)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 评估报告编辑 │
|
||||
├────────────────────────────┬────────────────────────────────────────────┤
|
||||
│ 【服刑人员列表】 │ 【报告编辑区】 │
|
||||
│ ┌────────────────────┐ │ ┌────────────────────────────────────────┐ │
|
||||
│ │ [搜索框] 姓名/编号 │ │ │ 服刑人员:张三 (2024001) │ │
|
||||
│ │ [搜索按钮] │ │ │ 监区:三分监区 风险等级:高风险 │ │
|
||||
│ ├────────────────────┤ │ ├────────────────────────────────────────┤ │
|
||||
│ │ [卡片列表] │ │ │ │ │
|
||||
│ │ ┌────────────────┐│ │ │ [基本信息] │ │
|
||||
│ │ │ 三分监区 ││ │ │ ┌────────────────────────────────────┐ │ │
|
||||
│ │ │ 张三 2024001 ││ │ │ │ 评估模板:入监风险评估 v │ │ │
|
||||
│ │ │ [高风险] ││ │ │ │ 评估日期:2026-01-16 │ │ │
|
||||
│ │ └────────────────┘│ │ │ │ 评估类型:入监评估 v │ │ │
|
||||
│ │ │ │ │ └────────────────────────────────────┘ │ │
|
||||
│ │ ┌────────────────┐│ │ │ │ │
|
||||
│ │ │ 二分监区 ││ │ │ [维度分析 - 折叠面板] │ │
|
||||
│ │ │ 李四 2024002 ││ │ │ ┌────────────────────────────────────┐ │ │
|
||||
│ │ │ [中风险] ││ │ │ │ ▼ 犯罪情况分析 [重新生成] │ │ │
|
||||
│ │ └────────────────┘│ │ │ │ 该犯因盗窃罪... │ │ │
|
||||
│ │ │ │ │ │ [AI生成] [已修改] │ │ │
|
||||
│ │ ... │ │ │ └────────────────────────────────────┘ │ │
|
||||
│ ├────────────────────┤ │ ├────────────────────────────────────────┤ │
|
||||
│ │ [分页组件] 1/5 │ │ │ [综合结论与建议] │ │
|
||||
│ └────────────────────┘ │ │ ┌────────────────────────────────────┐ │ │
|
||||
│ │ │ │ 风险等级:高风险 v │ │ │
|
||||
│ │ │ │ 综合结论: │ │ │
|
||||
│ │ │ │ 改造建议: │ │ │
|
||||
│ │ │ └────────────────────────────────────┘ │ │
|
||||
│ │ ├────────────────────────────────────────┤ │
|
||||
│ │ │ [操作按钮] │ │
|
||||
│ │ │ [AI生成全部内容] [保存草稿] [提交审核] │ │
|
||||
│ │ │ [导出PDF] [导出Word] │ │
|
||||
│ │ └────────────────────────────────────────┘ │
|
||||
│ │ │
|
||||
└────────────────────────────┴────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 4.2 模板配置页面
|
||||
|
||||
- 模板列表页:展示所有模板,支持增删改查
|
||||
- 模板配置表单:配置模板名称、描述、评估类型、评估维度列表
|
||||
|
||||
### 4.3 报告列表页面
|
||||
|
||||
- 分页查询报告
|
||||
- 批量操作(批量创建、批量导出)
|
||||
- 操作按钮(预览、编辑、重新生成、审核、导出、删除)
|
||||
|
||||
## 5. 数据库设计
|
||||
|
||||
### 5.1 评估报告模板表 (prison_assessment_report_template)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | bigint | 模板ID(主键) |
|
||||
| name | varchar(100) | 模板名称 |
|
||||
| description | varchar(500) | 模板说明 |
|
||||
| assessment_type | tinyint | 评估类型 |
|
||||
| version | varchar(20) | 模板版本 |
|
||||
| status | tinyint | 状态:1-启用 2-禁用 |
|
||||
| creator | varchar(64) | 创建者 |
|
||||
| create_time | datetime | 创建时间 |
|
||||
| updater | varchar(64) | 更新者 |
|
||||
| update_time | datetime | 更新时间 |
|
||||
| deleted | bit(1) | 是否删除 |
|
||||
| tenant_id | bigint | 租户ID |
|
||||
|
||||
### 5.2 评估维度表 (prison_assessment_dimension)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | bigint | 维度ID(主键) |
|
||||
| template_id | bigint | 所属模板ID |
|
||||
| name | varchar(100) | 维度名称 |
|
||||
| description | varchar(500) | 维度说明 |
|
||||
| sort | int | 排序 |
|
||||
| ai_prompt | text | AI提示词模板 |
|
||||
| data_source_config | text | 数据源配置JSON |
|
||||
| output_format | varchar(50) | 输出格式 |
|
||||
| require_ai_generate | tinyint | 是否需要AI生成 |
|
||||
| editor_type | tinyint | 编辑器类型 |
|
||||
| options | text | 选项JSON |
|
||||
| creator | varchar(64) | 创建者 |
|
||||
| create_time | datetime | 创建时间 |
|
||||
| updater | varchar(64) | 更新者 |
|
||||
| update_time | datetime | 更新时间 |
|
||||
| deleted | bit(1) | 是否删除 |
|
||||
| tenant_id | bigint | 租户ID |
|
||||
|
||||
### 5.3 评估报告表 (prison_assessment_report)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | bigint | 报告ID(主键) |
|
||||
| template_id | bigint | 使用的模板ID |
|
||||
| template_name | varchar(100) | 模板名称 |
|
||||
| prisoner_id | bigint | 罪犯ID |
|
||||
| prisoner_no | varchar(50) | 罪犯编号 |
|
||||
| prisoner_name | varchar(50) | 罪犯姓名 |
|
||||
| assessment_date | date | 评估日期 |
|
||||
| assessment_type | tinyint | 评估类型 |
|
||||
| dimension_data | text | 维度数据JSON |
|
||||
| overall_score | decimal(5,2) | 综合评分 |
|
||||
| risk_level | tinyint | 风险等级 |
|
||||
| conclusion | text | 综合结论 |
|
||||
| suggestions | text | 改造建议 |
|
||||
| ai_generate_status | tinyint | AI生成状态 |
|
||||
| ai_generate_time | datetime | AI生成时间 |
|
||||
| audit_status | tinyint | 审核状态 |
|
||||
| auditor_id | bigint | 审核人ID |
|
||||
| auditor_name | varchar(50) | 审核人姓名 |
|
||||
| audit_time | datetime | 审核时间 |
|
||||
| audit_remark | varchar(500) | 审核备注 |
|
||||
| report_status | tinyint | 报告状态 |
|
||||
| creator | varchar(64) | 创建者 |
|
||||
| create_time | datetime | 创建时间 |
|
||||
| updater | varchar(64) | 更新者 |
|
||||
| update_time | datetime | 更新时间 |
|
||||
| deleted | bit(1) | 是否删除 |
|
||||
| tenant_id | bigint | 租户ID |
|
||||
|
||||
## 6. AI服务设计
|
||||
|
||||
### 6.1 AI提示词示例
|
||||
|
||||
```
|
||||
你是一位有20年工作经验的监狱管教民警,根据以下服刑人员数据,
|
||||
生成一份专业的{维度名称}分析报告。
|
||||
|
||||
服刑人员基本信息:
|
||||
{罪犯档案数据}
|
||||
|
||||
服刑期间表现数据:
|
||||
{计分考核数据}
|
||||
|
||||
消费记录分析:
|
||||
{消费记录数据}
|
||||
|
||||
请分析该服刑人员在{维度名称}方面的表现,要求:
|
||||
1. 语言专业、客观,符合监狱管理规范
|
||||
2. 数据分析要具体,有理有据
|
||||
3. 字数控制在200-500字
|
||||
```
|
||||
|
||||
### 6.2 AI服务接口
|
||||
|
||||
```java
|
||||
public interface AiService {
|
||||
/**
|
||||
* 生成评估报告
|
||||
* @param dimension 评估维度配置
|
||||
* @param dataSources 所有数据源数据
|
||||
* @return AI生成的内容
|
||||
*/
|
||||
String generateContent(DimensionConfig dimension, Map<String, Object> dataSources);
|
||||
|
||||
/**
|
||||
* 批量生成报告(定时任务用)
|
||||
*/
|
||||
void batchGenerateReports(Long templateId, List<Long> prisonerIds);
|
||||
}
|
||||
```
|
||||
|
||||
## 7. 权限设计
|
||||
|
||||
| 角色 | 权限 |
|
||||
|------|------|
|
||||
| 管教民警 | 创建报告、编辑、导出、AI生成 |
|
||||
| 分监区领导 | 审核报告 |
|
||||
| 监狱领导 | 查看全监区评估统计报表 |
|
||||
| 管理员 | 模板管理、系统配置 |
|
||||
|
||||
## 8. 外部系统对接
|
||||
|
||||
### 8.1 数据同步
|
||||
|
||||
- 外部系统数据导入到系统内部
|
||||
- 同步工具定期从其他系统拉取数据
|
||||
|
||||
### 8.2 AI模型接入
|
||||
|
||||
- 调试阶段:使用第三方API(OpenAI/Claude等)
|
||||
- 生产部署:单位私有部署的模型
|
||||
|
||||
## 9. 验收标准
|
||||
|
||||
### 9.1 功能验收
|
||||
|
||||
- [ ] 模板创建:添加模板,配置多个评估维度
|
||||
- [ ] 报告创建:选择模板和服刑人员,触发AI生成
|
||||
- [ ] 内容修改:编辑AI生成的初稿内容
|
||||
- [ ] 提交审核:报告状态流转测试
|
||||
- [ ] 导出测试:验证PDF/Word导出格式
|
||||
|
||||
### 9.2 AI生成验收
|
||||
|
||||
- [ ] 使用真实服刑人员数据测试AI生成
|
||||
- [ ] 验证数据源绑定是否正确
|
||||
- [ ] 验证提示词是否有效
|
||||
- [ ] 评估生成内容的质量
|
||||
|
||||
### 9.3 权限验收
|
||||
|
||||
- [ ] 民警角色:创建报告、编辑、导出
|
||||
- [ ] 领导角色:审核报告、查看统计
|
||||
- [ ] 管理员角色:模板管理
|
||||
|
||||
## 10. 风险与注意事项
|
||||
|
||||
1. **数据安全**:AI生成内容需人工审核后才能存档
|
||||
2. **敏感数据**:家庭背景等敏感信息需要脱敏处理
|
||||
3. **生成日志**:AI生成日志要可追溯
|
||||
4. **版本管理**:报告修改历史需要保留
|
||||
|
||||
## 11. 后续扩展
|
||||
|
||||
- [ ] 评估报告模板导入导出(JSON格式)
|
||||
- [ ] 批量生成(定时任务批量生成报告)
|
||||
- [ ] 评估报告模板版本对比
|
||||
- [ ] 与司法部报表系统对接
|
||||
- [ ] 评估报告统计分析大屏
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0
|
||||
**创建日期**: 2026-01-16
|
||||
**作者**: AI助手
|
||||
1
frontend
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 273ff796a5f24e9e5b095ba7f25c5dfe8554a289
|
||||
57
images-archive/upload.sh
Executable file
@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
REMOTE_SERVER="root@192.168.10.150"
|
||||
REMOTE_DIR="/projects/data/xlcp"
|
||||
ARCHIVE_FILE="xlcp-docker-images.tar.gz"
|
||||
|
||||
echo "========================================="
|
||||
echo "上传并加载 Docker 镜像到 192.168.10.150"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "目标服务器: $REMOTE_SERVER"
|
||||
echo "镜像文件: $ARCHIVE_FILE"
|
||||
echo "文件大小: $(du -h $ARCHIVE_FILE | cut -f1)"
|
||||
echo ""
|
||||
|
||||
# 创建远程目录
|
||||
echo "[1/4] 创建远程目录..."
|
||||
ssh "$REMOTE_SERVER" "mkdir -p $REMOTE_DIR"
|
||||
echo "✅ 目录创建完成"
|
||||
echo ""
|
||||
|
||||
# 上传镜像
|
||||
echo "[2/4] 上传镜像到远程服务器..."
|
||||
rsync -avz --progress "$ARCHIVE_FILE" "$REMOTE_SERVER:$REMOTE_DIR/"
|
||||
echo ""
|
||||
echo "✅ 上传完成"
|
||||
echo ""
|
||||
|
||||
# 加载镜像
|
||||
echo "[3/4] 在远程服务器加载镜像..."
|
||||
ssh "$REMOTE_SERVER" << ENDSSH
|
||||
cd $REMOTE_DIR
|
||||
echo "解压并加载镜像..."
|
||||
docker load -i "$ARCHIVE_FILE"
|
||||
echo "✅ 镜像加载完成"
|
||||
|
||||
echo ""
|
||||
echo "清理镜像文件..."
|
||||
rm "$ARCHIVE_FILE"
|
||||
echo "✅ 清理完成"
|
||||
ENDSSH
|
||||
|
||||
echo ""
|
||||
|
||||
# 显示镜像列表
|
||||
echo "[4/4] 显示远程服务器镜像列表..."
|
||||
ssh "$REMOTE_SERVER" "docker images | grep -E 'mysql|redis|nginx|maven|eclipse-temurin|node'"
|
||||
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "镜像上传和加载完成!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "下一步操作:"
|
||||
echo " 运行部署脚本: cd .. && ./deploy-to-150.sh"
|
||||
echo ""
|
||||
86
implement/plan.md
Normal file
@ -0,0 +1,86 @@
|
||||
# Implementation Plan - 2026-01-12
|
||||
|
||||
## Source Analysis
|
||||
|
||||
**Source Type**: Local codegen zip files
|
||||
**Location**: `/Volumes/Dpan/github/xlcp/codegen/`
|
||||
|
||||
**Modules to integrate (8 total)**:
|
||||
| Module | Chinese Name | Backend Path | Frontend Path |
|
||||
|--------|-------------|--------------|---------------|
|
||||
| Area | 监区管理 | `controller/admin/area/` | `views/prison/area/` |
|
||||
| Cell | 监室管理 | `controller/admin/cell/` | `views/prison/cell/` |
|
||||
| Consumption | 消费记录 | `controller/admin/consumption/` | `views/prison/consumption/` |
|
||||
| Question | 问卷问题 | `controller/admin/question/` | `views/prison/question/` |
|
||||
| Questionnaire | 问卷模板 | `controller/admin/questionnaire/` | `views/prison/questionnaire/` |
|
||||
| QuestionnaireRecord | 问卷答题记录 | `controller/admin/questionnairerecord/` | `views/prison/questionnairerecord/` |
|
||||
| RiskAssessment | 危险评估 | `controller/admin/riskassessment/` | `views/prison/riskassessment/` |
|
||||
| Score | 计分考核 | `controller/admin/score/` | `views/prison/score/` |
|
||||
|
||||
**Core Features per Module**:
|
||||
- CRUD operations (Controller, Service, ServiceImpl)
|
||||
- DO (Data Object with table mapping)
|
||||
- Mapper (MyBatis-Plus)
|
||||
- VO (PageReqVO, RespVO, SaveReqVO)
|
||||
- Frontend (index.vue, Form.vue, API index.ts)
|
||||
- Menu SQL scripts
|
||||
|
||||
## Target Integration
|
||||
|
||||
**Backend Target**: `yudao-module-prison/`
|
||||
**Frontend Target**: `frontend/src/`
|
||||
|
||||
**Affected Files**:
|
||||
- Backend: New packages for each module
|
||||
- Frontend: New directories under views/prison/ and api/prison/
|
||||
- ErrorCodeConstants: Merge new error codes
|
||||
|
||||
## Implementation Tasks
|
||||
|
||||
### Backend Integration
|
||||
- [ ] 1. Integrate Area module (监区管理)
|
||||
- [ ] 2. Integrate Cell module (监室管理)
|
||||
- [ ] 3. Integrate Consumption module (消费记录)
|
||||
- [ ] 4. Integrate Question module (问卷问题)
|
||||
- [ ] 5. Integrate Questionnaire module (问卷模板)
|
||||
- [ ] 6. Integrate QuestionnaireRecord module (问卷答题记录)
|
||||
- [ ] 7. Integrate RiskAssessment module (危险评估)
|
||||
- [ ] 8. Integrate Score module (计分考核)
|
||||
- [ ] 9. Update ErrorCodeConstants with new error codes
|
||||
- [ ] 10. Update module pom.xml if needed
|
||||
|
||||
### Frontend Integration
|
||||
- [ ] 11. Integrate Area frontend
|
||||
- [ ] 12. Integrate Cell frontend
|
||||
- [ ] 13. Integrate Consumption frontend
|
||||
- [ ] 14. Integrate Question frontend
|
||||
- [ ] 15. Integrate Questionnaire frontend
|
||||
- [ ] 16. Integrate QuestionnaireRecord frontend
|
||||
- [ ] 17. Integrate RiskAssessment frontend
|
||||
- [ ] 18. Integrate Score frontend
|
||||
- [ ] 19. Update dict.ts with new enum types
|
||||
- [ ] 20. Update constants.ts if needed
|
||||
|
||||
### Database Integration
|
||||
- [ ] 21. Create consolidated SQL script
|
||||
- [ ] 22. Run SQL to create tables
|
||||
- [ ] 23. Run SQL to insert menu permissions
|
||||
|
||||
## Validation Checklist
|
||||
- [x] All 8 modules integrated
|
||||
- [ ] Backend compiles successfully (TODO: verify)
|
||||
- [ ] Frontend builds successfully (TODO: verify)
|
||||
- [ ] No duplicate class definitions
|
||||
- [ ] Error codes properly merged
|
||||
- [x] Menu SQL ready for execution
|
||||
|
||||
## Completed: 2026-01-12
|
||||
All 8 modules have been integrated:
|
||||
- Backend files copied to yudao-module-prison
|
||||
- Frontend files copied to frontend/src/
|
||||
- SQL script created at yudao-module-prison/src/main/resources/sql/prison_module.sql
|
||||
|
||||
## Risk Mitigation
|
||||
- **Encoding issue**: Some files have garbled Chinese characters - will regenerate or manually fix
|
||||
- **Duplicate ErrorCodeConstants**: Need to merge with existing file instead of overwriting
|
||||
- **Frontend path mismatch**: Generated files use `yudao-ui-admin-vue3/` prefix - need to strip
|
||||
BIN
prisoner_list.png
Normal file
|
After Width: | Height: | Size: 382 KiB |
885
requirements/实施文档-01-监管看板.md
Normal file
@ -0,0 +1,885 @@
|
||||
# 实施文档 - 监管看板
|
||||
|
||||
> 模块名称:监管看板
|
||||
> 关联需求:需求-01-监管看板.md
|
||||
> 创建日期:2026-01-14
|
||||
|
||||
---
|
||||
|
||||
## 一、实施概览
|
||||
|
||||
### 1.1 功能清单
|
||||
|
||||
| 序号 | 功能模块 | 后端 | 前端 | 优先级 |
|
||||
|------|---------|------|------|--------|
|
||||
| 1 | 核心指标卡片 | ✅ | ✅ | P0 |
|
||||
| 2 | 年龄分布饼图 | ✅ | ✅ | P0 |
|
||||
| 3 | 刑期分布饼图 | ✅ | ✅ | P0 |
|
||||
| 4 | 文化程度饼图 | ✅ | ✅ | P0 |
|
||||
| 5 | 省份分布地图 | ✅ | ✅ | P0 |
|
||||
| 6 | 数据脱敏组件 | ✅ | ✅ | P0 |
|
||||
|
||||
### 1.2 预估工时
|
||||
|
||||
| 阶段 | 后端 | 前端 | 合计 |
|
||||
|------|------|------|------|
|
||||
| 数据库 | 0.5h | - | 0.5h |
|
||||
| 接口开发 | 4h | - | 4h |
|
||||
| 前端页面 | - | 6h | 6h |
|
||||
| 联调测试 | 2h | 2h | 4h |
|
||||
| **总计** | **6.5h** | **8h** | **14.5h** |
|
||||
|
||||
---
|
||||
|
||||
## 二、数据库实施
|
||||
|
||||
> **说明**:使用现有表进行统计,无需新增表
|
||||
> - "本月已移交" 使用现有的 `prison_prisoner_area_log` 表(调监记录)
|
||||
> - "本月已释放" 使用现有的 `prison_prisoner_release` 表
|
||||
|
||||
### 2.1 新增索引
|
||||
|
||||
```sql
|
||||
-- 罪犯表:年龄计算需要用到 birthday 字段
|
||||
ALTER TABLE prison_prisoner ADD INDEX idx_birthday (birthday);
|
||||
|
||||
-- 释放记录表:按月统计需要
|
||||
ALTER TABLE prison_prisoner_release ADD INDEX idx_actual_release_date (actual_release_date);
|
||||
|
||||
-- 监区变动记录表:按月统计需要
|
||||
ALTER TABLE prison_prisoner_area_log ADD INDEX idx_operate_time_change_type (operate_time, change_type);
|
||||
```
|
||||
|
||||
### 2.3 菜单权限 SQL
|
||||
|
||||
```sql
|
||||
-- 监管看板菜单
|
||||
INSERT INTO system_menu (name, permission, type, sort, path, icon, component, parent_id)
|
||||
VALUES ('监管看板', '', 2, 1, 'dashboard', 'ep:data-board', 'prison/dashboard/index',
|
||||
(SELECT id FROM system_menu WHERE name = '监狱管理' LIMIT 1));
|
||||
|
||||
-- 获取刚插入的菜单ID
|
||||
SET @dashboard_menu_id = LAST_INSERT_ID();
|
||||
|
||||
-- 监管看板查询权限
|
||||
INSERT INTO system_menu (name, permission, type, sort, parent_id)
|
||||
VALUES ('监管看板查询', 'prison:dashboard:query', 3, 1, @dashboard_menu_id);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、后端实施
|
||||
|
||||
### 3.1 文件结构
|
||||
|
||||
```
|
||||
backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/
|
||||
├── controller/admin/dashboard/
|
||||
│ ├── PrisonDashboardController.java # 控制器
|
||||
│ └── vo/
|
||||
│ ├── DashboardStatisticsVO.java # 看板统计响应
|
||||
│ ├── DashboardCardVO.java # 卡片数据响应
|
||||
│ ├── ChartDataVO.java # 图表数据项
|
||||
│ └── ProvinceChartVO.java # 省份数据项
|
||||
├── service/dashboard/
|
||||
│ ├── PrisonDashboardService.java # 服务接口
|
||||
│ └── impl/
|
||||
│ └── PrisonDashboardServiceImpl.java # 服务实现
|
||||
├── dal/mysql/dashboard/
|
||||
│ └── PrisonDashboardMapper.java # Mapper接口
|
||||
├── dal/mysql/transfer/
|
||||
│ └── PrisonTransferMapper.java # 移交记录Mapper(新增)
|
||||
└── util/
|
||||
└── DataMaskUtils.java # 数据脱敏工具类(新增)
|
||||
```
|
||||
|
||||
### 3.2 VO 定义
|
||||
|
||||
#### 3.2.1 DashboardStatisticsVO.java
|
||||
|
||||
```java
|
||||
package cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Schema(description = "管理后台 - 监管看板统计 Response VO")
|
||||
public class DashboardStatisticsVO {
|
||||
|
||||
// 核心指标卡片
|
||||
@Schema(description = "在册罪犯总数")
|
||||
private Integer totalPrisoners;
|
||||
|
||||
@Schema(description = "本月已释放人数")
|
||||
private Integer monthlyReleased;
|
||||
|
||||
@Schema(description = "本月已移交人数")
|
||||
private Integer monthlyTransferred;
|
||||
|
||||
@Schema(description = "当前就医人数")
|
||||
private Integer hospitalCount;
|
||||
|
||||
@Schema(description = "当前禁闭人数")
|
||||
private Integer solitaryCount;
|
||||
|
||||
// 图表数据
|
||||
@Schema(description = "年龄分布")
|
||||
private List<ChartDataVO> ageDistribution;
|
||||
|
||||
@Schema(description = "刑期分布")
|
||||
private List<ChartDataVO> sentenceDistribution;
|
||||
|
||||
@Schema(description = "文化程度分布")
|
||||
private List<ChartDataVO> educationDistribution;
|
||||
|
||||
@Schema(description = "省份分布")
|
||||
private List<ProvinceChartVO> provinceDistribution;
|
||||
|
||||
@Schema(description = "统计时间")
|
||||
private LocalDateTime statisticsTime;
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.2 ChartDataVO.java
|
||||
|
||||
```java
|
||||
package cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Schema(description = "图表数据项")
|
||||
public class ChartDataVO {
|
||||
|
||||
@Schema(description = "分组名称", example = "18-30岁")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "数量", example = "100")
|
||||
private Integer value;
|
||||
|
||||
@Schema(description = "占比", example = "28.5")
|
||||
private Double percentage;
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.3 ProvinceChartVO.java
|
||||
|
||||
```java
|
||||
package cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Schema(description = "省份图表数据")
|
||||
public class ProvinceChartVO {
|
||||
|
||||
@Schema(description = "省份名称", example = "河南省")
|
||||
private String province;
|
||||
|
||||
@Schema(description = "省份编码", example = "41")
|
||||
private Integer provinceCode;
|
||||
|
||||
@Schema(description = "人数", example = "156")
|
||||
private Integer count;
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 Mapper 接口
|
||||
|
||||
#### 3.3.1 PrisonDashboardMapper.java
|
||||
|
||||
```java
|
||||
package cn.iocoder.yudao.module.prison.dal.mysql.dashboard;
|
||||
|
||||
import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.ChartDataVO;
|
||||
import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.DashboardCardVO;
|
||||
import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.ProvinceChartVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface PrisonDashboardMapper {
|
||||
|
||||
/**
|
||||
* 查询核心指标卡片数据
|
||||
*/
|
||||
@Select("""
|
||||
SELECT
|
||||
COALESCE(SUM(CASE WHEN p.status = 1 THEN 1 ELSE 0 END), 0) AS total_prisoners,
|
||||
COALESCE(SUM(CASE WHEN pa.type = 5 THEN 1 ELSE 0 END), 0) AS hospital_count,
|
||||
COALESCE(SUM(CASE WHEN pa.type = 6 THEN 1 ELSE 0 END), 0) AS solitary_count
|
||||
FROM prison_prisoner p
|
||||
LEFT JOIN prison_area pa ON p.prison_area_id = pa.id
|
||||
WHERE p.deleted = 0
|
||||
""")
|
||||
DashboardCardVO selectDashboardCards();
|
||||
|
||||
/**
|
||||
* 查询本月释放人数
|
||||
*/
|
||||
@Select("""
|
||||
SELECT COUNT(*) FROM prison_prisoner_release
|
||||
WHERE deleted = 0
|
||||
AND DATE_FORMAT(actual_release_date, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
|
||||
AND status = 1
|
||||
""")
|
||||
Integer selectMonthlyReleased();
|
||||
|
||||
/**
|
||||
* 查询本月调监次数(移交)
|
||||
* change_type: 1-调入 2-调出
|
||||
* 使用现有的 prison_prisoner_area_log 表
|
||||
*/
|
||||
@Select("""
|
||||
SELECT COUNT(*) FROM prison_prisoner_area_log
|
||||
WHERE deleted = 0
|
||||
AND change_type IN (1, 2)
|
||||
AND DATE_FORMAT(operate_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
|
||||
""")
|
||||
Integer selectMonthlyTransferred();
|
||||
|
||||
/**
|
||||
* 查询年龄分布
|
||||
*/
|
||||
@Select("""
|
||||
SELECT
|
||||
CASE
|
||||
WHEN TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) < 18 THEN '未成年(≤17)'
|
||||
WHEN TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) BETWEEN 18 AND 30 THEN '青年(18-30)'
|
||||
WHEN TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) BETWEEN 31 AND 50 THEN '中年(31-50)'
|
||||
WHEN TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) BETWEEN 51 AND 60 THEN '中老年(51-60)'
|
||||
ELSE '老龄(60+)'
|
||||
END AS name,
|
||||
COUNT(*) AS value
|
||||
FROM prison_prisoner p
|
||||
WHERE p.status = 1 AND p.deleted = 0
|
||||
GROUP BY name
|
||||
""")
|
||||
List<ChartDataVO> selectAgeDistribution();
|
||||
|
||||
/**
|
||||
* 查询刑期分布
|
||||
*/
|
||||
@Select("""
|
||||
SELECT
|
||||
CASE
|
||||
WHEN p.death_sentence_reprieve = 1 THEN '死缓'
|
||||
WHEN p.life_imprisonment = 1 THEN '无期'
|
||||
WHEN (COALESCE(p.sentence_years, 0) * 12 + COALESCE(p.sentence_months, 0)) <= 36 THEN '短刑(≤3年)'
|
||||
WHEN (COALESCE(p.sentence_years, 0) * 12 + COALESCE(p.sentence_months, 0)) BETWEEN 37 AND 120 THEN '中刑(3-10年)'
|
||||
ELSE '长刑(10年以上)'
|
||||
END AS name,
|
||||
COUNT(*) AS value
|
||||
FROM prison_prisoner p
|
||||
WHERE p.status = 1 AND p.deleted = 0
|
||||
GROUP BY name
|
||||
""")
|
||||
List<ChartDataVO> selectSentenceDistribution();
|
||||
|
||||
/**
|
||||
* 查询文化程度分布
|
||||
*/
|
||||
@Select("""
|
||||
SELECT
|
||||
CASE p.education
|
||||
WHEN 1 THEN '文盲'
|
||||
WHEN 2 THEN '小学'
|
||||
WHEN 3 THEN '初中'
|
||||
WHEN 4 THEN '高中'
|
||||
WHEN 5 THEN '中专'
|
||||
WHEN 6 THEN '大专'
|
||||
WHEN 7 THEN '本科'
|
||||
WHEN 8 THEN '研究生及以上'
|
||||
ELSE '未知'
|
||||
END AS name,
|
||||
COUNT(*) AS value
|
||||
FROM prison_prisoner p
|
||||
WHERE p.status = 1 AND p.deleted = 0
|
||||
GROUP BY p.education
|
||||
""")
|
||||
List<ChartDataVO> selectEducationDistribution();
|
||||
|
||||
/**
|
||||
* 查询省份分布
|
||||
*/
|
||||
@Select("""
|
||||
SELECT
|
||||
LEFT(p.native_place, 2) AS province_code,
|
||||
COUNT(*) AS count
|
||||
FROM prison_prisoner p
|
||||
WHERE p.status = 1 AND p.deleted = 0 AND p.native_place IS NOT NULL
|
||||
GROUP BY LEFT(p.native_place, 2)
|
||||
""")
|
||||
List<ProvinceChartVO> selectProvinceDistributionRaw();
|
||||
}
|
||||
```
|
||||
|
||||
### 3.4 Service 实现
|
||||
|
||||
```java
|
||||
package cn.iocoder.yudao.module.prison.service.dashboard.impl;
|
||||
|
||||
import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.*;
|
||||
import cn.iocoder.yudao.module.prison.dal.mysql.dashboard.PrisonDashboardMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class PrisonDashboardServiceImpl implements PrisonDashboardService {
|
||||
|
||||
private final PrisonDashboardMapper dashboardMapper;
|
||||
|
||||
private static final String DASHBOARD_CACHE_KEY = "prison:dashboard:stats:";
|
||||
|
||||
@Override
|
||||
@Cacheable(value = "dashboard", key = "#root.target.getCacheKey()", unless = "#result == null")
|
||||
public DashboardStatisticsVO getDashboardStatistics() {
|
||||
DashboardStatisticsVO vo = new DashboardStatisticsVO();
|
||||
vo.setStatisticsTime(LocalDateTime.now());
|
||||
|
||||
// 核心指标卡片
|
||||
DashboardCardVO cards = dashboardMapper.selectDashboardCards();
|
||||
vo.setTotalPrisoners(cards.getTotalPrisoners());
|
||||
vo.setHospitalCount(cards.getHospitalCount());
|
||||
vo.setSolitaryCount(cards.getSolitaryCount());
|
||||
vo.setMonthlyReleased(dashboardMapper.selectMonthlyReleased());
|
||||
vo.setMonthlyTransferred(dashboardMapper.selectMonthlyTransferred());
|
||||
|
||||
// 图表数据
|
||||
vo.setAgeDistribution(dashboardMapper.selectAgeDistribution());
|
||||
vo.setSentenceDistribution(dashboardMapper.selectSentenceDistribution());
|
||||
vo.setEducationDistribution(dashboardMapper.selectEducationDistribution());
|
||||
vo.setProvinceDistribution(convertProvinceData(dashboardMapper.selectProvinceDistributionRaw()));
|
||||
|
||||
return vo;
|
||||
}
|
||||
|
||||
private List<ProvinceChartVO> convertProvinceData(List<ProvinceChartVO> rawData) {
|
||||
// 省份编码转省份名称的映射逻辑
|
||||
return rawData.stream()
|
||||
.map(item -> ProvinceChartVO.builder()
|
||||
.province(ProvinceCodeMapper.getName(item.getProvinceCode()))
|
||||
.provinceCode(item.getProvinceCode())
|
||||
.count(item.getCount())
|
||||
.build())
|
||||
.toList();
|
||||
}
|
||||
|
||||
public String getCacheKey() {
|
||||
return DASHBOARD_CACHE_KEY + "all";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.5 Controller
|
||||
|
||||
```java
|
||||
package cn.iocoder.yudao.module.prison.controller.admin.dashboard;
|
||||
|
||||
import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.DashboardStatisticsVO;
|
||||
import cn.iocoder.yudao.module.prison.service.dashboard.PrisonDashboardService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/prison/dashboard")
|
||||
@Tag(name = "管理后台 - 监管看板")
|
||||
@RequiredArgsConstructor
|
||||
public class PrisonDashboardController {
|
||||
|
||||
private final PrisonDashboardService dashboardService;
|
||||
|
||||
@GetMapping("/statistics")
|
||||
@Operation(summary = "获取看板统计数据")
|
||||
@PreAuthorize("@ss.hasPermission('prison:dashboard:query')")
|
||||
public DashboardStatisticsVO getStatistics() {
|
||||
return dashboardService.getDashboardStatistics();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.6 数据脱敏工具
|
||||
|
||||
```java
|
||||
package cn.iocoder.yudao.module.prison.util;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
public class DataMaskUtils {
|
||||
|
||||
/**
|
||||
* 身份证号脱敏:110101199001011234 -> 110***********1234
|
||||
*/
|
||||
public static String maskIdCard(String idCard) {
|
||||
if (StrUtil.isBlank(idCard) || idCard.length() < 7) {
|
||||
return idCard;
|
||||
}
|
||||
return idCard.substring(0, 3) + "*".repeat(idCard.length() - 7) + idCard.substring(idCard.length() - 4);
|
||||
}
|
||||
|
||||
/**
|
||||
* 手机号脱敏:13812345678 -> 138****5678
|
||||
*/
|
||||
public static String maskPhone(String phone) {
|
||||
if (StrUtil.isBlank(phone) || phone.length() < 7) {
|
||||
return phone;
|
||||
}
|
||||
return phone.substring(0, 3) + "****" + phone.substring(phone.length() - 4);
|
||||
}
|
||||
|
||||
/**
|
||||
* 姓名脱敏:张三丰 -> 张**
|
||||
*/
|
||||
public static String maskName(String name) {
|
||||
if (StrUtil.isBlank(name) || name.length() == 1) {
|
||||
return name;
|
||||
}
|
||||
return name.charAt(0) + "*".repeat(name.length() - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* 地址脱敏:北京市海淀区*** -> 北京市海淀区***
|
||||
*/
|
||||
public static String maskAddress(String address) {
|
||||
if (StrUtil.isBlank(address)) {
|
||||
return address;
|
||||
}
|
||||
int lastSeparator = Math.max(address.lastIndexOf('区'), address.lastIndexOf('县'));
|
||||
if (lastSeparator > 0 && lastSeparator < address.length() - 1) {
|
||||
return address.substring(0, lastSeparator + 1) + "***";
|
||||
}
|
||||
return address;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、前端实施
|
||||
|
||||
### 4.1 文件结构
|
||||
|
||||
```
|
||||
frontend/src/
|
||||
├── views/prison/dashboard/
|
||||
│ ├── index.vue # 主页面组件
|
||||
│ └── components/
|
||||
│ ├── StatCard.vue # 指标卡片组件
|
||||
│ ├── AgePieChart.vue # 年龄分布饼图
|
||||
│ ├── SentencePieChart.vue # 刑期分布饼图
|
||||
│ ├── EducationPieChart.vue # 文化程度饼图
|
||||
│ └── ChinaMap.vue # 中国地图热力图
|
||||
├── api/prison/dashboard/
|
||||
│ └── index.ts # API 接口定义
|
||||
├── components/DataMaskingCell/
|
||||
│ ├── index.vue # 脱敏单元格组件
|
||||
│ └── index.ts # 组件类型定义
|
||||
└── plugins/echarts.ts # ECharts 地图注册
|
||||
```
|
||||
|
||||
### 4.2 API 定义
|
||||
|
||||
```typescript
|
||||
// frontend/src/api/prison/dashboard/index.ts
|
||||
|
||||
/** 看板统计响应 */
|
||||
export interface DashboardStatisticsVO {
|
||||
totalPrisoners: number;
|
||||
monthlyReleased: number;
|
||||
monthlyTransferred: number;
|
||||
hospitalCount: number;
|
||||
solitaryCount: number;
|
||||
ageDistribution: ChartDataVO[];
|
||||
sentenceDistribution: ChartDataVO[];
|
||||
educationDistribution: ChartDataVO[];
|
||||
provinceDistribution: ProvinceChartVO[];
|
||||
statisticsTime: string;
|
||||
}
|
||||
|
||||
/** 图表数据项 */
|
||||
export interface ChartDataVO {
|
||||
name: string;
|
||||
value: number;
|
||||
percentage?: number;
|
||||
}
|
||||
|
||||
/** 省份数据 */
|
||||
export interface ProvinceChartVO {
|
||||
province: string;
|
||||
provinceCode: number;
|
||||
count: number;
|
||||
}
|
||||
|
||||
export const DashboardApi = {
|
||||
getStatistics: async (): Promise<DashboardStatisticsVO> => {
|
||||
return await request.get({ url: '/prison/dashboard/statistics' })
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 指标卡片组件
|
||||
|
||||
```vue
|
||||
<!-- frontend/src/views/prison/dashboard/components/StatCard.vue -->
|
||||
<template>
|
||||
<el-card shadow="hover" class="stat-card">
|
||||
<div class="stat-content">
|
||||
<div class="stat-info">
|
||||
<div class="stat-value" v-loading="loading">
|
||||
<el-skeleton v-if="loading" animated :rows="0" />
|
||||
<template v-else>{{ formatNumber(value) }}</template>
|
||||
</div>
|
||||
<div class="stat-title">{{ title }}</div>
|
||||
</div>
|
||||
<div class="stat-icon" :class="iconClass">
|
||||
<Icon :icon="icon" :size="36" />
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
interface Props {
|
||||
title: string
|
||||
value: number
|
||||
icon: string
|
||||
iconClass?: string
|
||||
loading?: boolean
|
||||
}
|
||||
|
||||
const props = defineProps<Props>()
|
||||
|
||||
const formatNumber = (num: number) => {
|
||||
return new Intl.NumberFormat('zh-CN').format(num)
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.stat-card {
|
||||
height: 100%;
|
||||
|
||||
.stat-content {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.stat-value {
|
||||
font-size: 28px;
|
||||
font-weight: bold;
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.stat-title {
|
||||
font-size: 14px;
|
||||
color: #909399;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.stat-icon {
|
||||
width: 56px;
|
||||
height: 56px;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
&.primary { background: #ecf5ff; color: #409eff; }
|
||||
&.success { background: #f0f9eb; color: #67c23a; }
|
||||
&.warning { background: #fdf6ec; color: #e6a23c; }
|
||||
&.danger { background: #fef0f0; color: #f56c6c; }
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
### 4.4 主页面
|
||||
|
||||
```vue
|
||||
<!-- frontend/src/views/prison/dashboard/index.vue -->
|
||||
<template>
|
||||
<div class="dashboard-container">
|
||||
<el-row :gutter="16" class="mb-16px">
|
||||
<el-col :xs="24" :sm="12" :md="8" :lg="24/5" v-for="item in statCards" :key="item.title">
|
||||
<StatCard v-bind="item" :loading="loading" :value="item.value" />
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="16" class="mb-16px">
|
||||
<el-col :xs="24" :sm="24" :md="8">
|
||||
<el-card>
|
||||
<template #header>年龄分布</template>
|
||||
<BasePieChart :options="ageChartOptions" :loading="loading" />
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="8">
|
||||
<el-card>
|
||||
<template #header>刑期分布</template>
|
||||
<BasePieChart :options="sentenceChartOptions" :loading="loading" />
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="8">
|
||||
<el-card>
|
||||
<template #header>文化程度</template>
|
||||
<BasePieChart :options="educationChartOptions" :loading="loading" />
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="16">
|
||||
<el-col :span="24">
|
||||
<el-card>
|
||||
<template #header>籍贯分布</template>
|
||||
<ChinaMap :data="provinceData" :loading="loading" />
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { StatCard } from './components'
|
||||
import { DashboardApi, type DashboardStatisticsVO } from '@/api/prison/dashboard'
|
||||
import BasePieChart from '@/components/Echart/src/BasePieChart.vue'
|
||||
import ChinaMap from './components/ChinaMap.vue'
|
||||
|
||||
const loading = ref(true)
|
||||
const data = ref<DashboardStatisticsVO | null>(null)
|
||||
|
||||
const statCards = computed(() => [
|
||||
{ title: '在册罪犯', value: data.value?.totalPrisoners || 0, icon: 'ep:user', iconClass: 'primary' },
|
||||
{ title: '本月释放', value: data.value?.monthlyReleased || 0, icon: 'ep:select', iconClass: 'success' },
|
||||
{ title: '本月移交', value: data.value?.monthlyTransferred || 0, icon: 'ep:rank-list', iconClass: 'warning' },
|
||||
{ title: '当前就医', value: data.value?.hospitalCount || 0, icon: 'ep:first-aid-kit', iconClass: 'danger' },
|
||||
{ title: '当前禁闭', value: data.value?.solitaryCount || 0, icon: 'ep:lock', iconClass: 'danger' }
|
||||
])
|
||||
|
||||
const ageChartOptions = computed(() => ({
|
||||
tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },
|
||||
legend: { orient: 'vertical', right: 10, top: 'center' },
|
||||
series: [{
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
data: data.value?.ageDistribution || []
|
||||
}]
|
||||
}))
|
||||
|
||||
const sentenceChartOptions = computed(() => ({
|
||||
tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },
|
||||
legend: { orient: 'vertical', right: 10, top: 'center' },
|
||||
series: [{
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
data: data.value?.sentenceDistribution || []
|
||||
}]
|
||||
}))
|
||||
|
||||
const educationChartOptions = computed(() => ({
|
||||
tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },
|
||||
legend: { orient: 'vertical', right: 10, top: 'center' },
|
||||
series: [{
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
data: data.value?.educationDistribution || []
|
||||
}]
|
||||
}))
|
||||
|
||||
const provinceData = computed(() => data.value?.provinceDistribution || [])
|
||||
|
||||
const fetchData = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
data.value = await DashboardApi.getStatistics()
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(fetchData)
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.dashboard-container {
|
||||
padding: 16px;
|
||||
}
|
||||
.mb-16px { margin-bottom: 16px; }
|
||||
</style>
|
||||
```
|
||||
|
||||
### 4.5 地图资源配置
|
||||
|
||||
```typescript
|
||||
// frontend/src/plugins/echarts.ts
|
||||
import * as echarts from 'echarts'
|
||||
import chinaJson from 'echarts/map/json/china.json'
|
||||
|
||||
// 注册中国地图
|
||||
echarts.registerMap('china', chinaJson)
|
||||
|
||||
export { echarts }
|
||||
```
|
||||
|
||||
> **注意**:需要下载中国地图 JSON 文件到 `frontend/public/china.json`
|
||||
> 下载地址:https://echarts.apache.org/examples/zh/data/asset/geo/china.json
|
||||
|
||||
### 4.6 路由配置
|
||||
|
||||
```typescript
|
||||
// frontend/src/router/routes/modules/prison.ts
|
||||
|
||||
{
|
||||
path: 'dashboard',
|
||||
name: 'PrisonDashboard',
|
||||
component: () => import('@/views/prison/dashboard/index.vue'),
|
||||
meta: {
|
||||
title: '监管看板',
|
||||
icon: 'ep:data-board',
|
||||
permission: 'prison:dashboard:query'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、任务分解
|
||||
|
||||
### 5.1 后端任务
|
||||
|
||||
> **说明**:使用现有表,无需新建移交记录表
|
||||
|
||||
| 序号 | 任务 | 负责人 | 预计工时 | 状态 |
|
||||
|------|------|--------|---------|------|
|
||||
| 1 | 新增数据库索引 SQL(3个索引) | | 0.5h | 待开发 |
|
||||
| 2 | 菜单权限 SQL | | 0.5h | 待开发 |
|
||||
| 3 | VO 类开发(4个文件) | | 1h | 待开发 |
|
||||
| 4 | PrisonDashboardMapper 接口 | | 1h | 待开发 |
|
||||
| 5 | PrisonDashboardService 接口和实现 | | 1h | 待开发 |
|
||||
| 6 | PrisonDashboardController | | 0.5h | 待开发 |
|
||||
| 7 | DataMaskUtils 工具类 | | 0.5h | 待开发 |
|
||||
| 8 | 接口测试 | | 1h | 待开发 |
|
||||
|
||||
### 5.2 前端任务
|
||||
|
||||
| 序号 | 任务 | 负责人 | 预计工时 | 状态 |
|
||||
|------|------|--------|---------|------|
|
||||
| 1 | 下载并配置中国地图 JSON | | 0.5h | 待开发 |
|
||||
| 2 | API 接口定义 | | 0.5h | 待开发 |
|
||||
| 3 | StatCard 组件 | | 1h | 待开发 |
|
||||
| 4 | ChinaMap 组件 | | 2h | 待开发 |
|
||||
| 5 | 主页面开发 | | 2h | 待开发 |
|
||||
| 6 | 路由配置 | | 0.5h | 待开发 |
|
||||
| 7 | 联调测试 | | 2h | 待开发 |
|
||||
|
||||
---
|
||||
|
||||
## 六、验收标准
|
||||
|
||||
### 6.1 功能验收
|
||||
|
||||
- [ ] 核心指标卡片数据与数据库一致
|
||||
- [ ] 年龄分布饼图按要求分段显示
|
||||
- [ ] 刑期分布饼图按要求分段显示
|
||||
- [ ] 文化程度饼图按要求分类显示
|
||||
- [ ] 中国地图正确显示各省热力分布
|
||||
- [ ] 点击地图省份显示详细信息
|
||||
- [ ] 响应式布局在各种屏幕尺寸下正常显示
|
||||
- [ ] 数据加载时显示骨架屏
|
||||
|
||||
### 6.2 性能验收
|
||||
|
||||
- [ ] 页面加载时间 < 3秒
|
||||
- [ ] 图表渲染时间 < 1秒
|
||||
- [ ] 支持多用户并发访问
|
||||
|
||||
### 6.3 安全验收
|
||||
|
||||
- [ ] 敏感信息已配置脱敏规则
|
||||
- [ ] 数据权限控制生效(按监区)
|
||||
|
||||
---
|
||||
|
||||
## 七、联调步骤
|
||||
|
||||
### 7.1 后端启动
|
||||
```bash
|
||||
cd backend/yudao-module-prison
|
||||
mvn clean package -DskipTests
|
||||
cd ../yudao-server
|
||||
mvn spring-boot:run
|
||||
```
|
||||
|
||||
### 7.2 前端启动
|
||||
```bash
|
||||
cd frontend
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
### 7.3 测试数据
|
||||
```sql
|
||||
-- 确保有以下测试数据
|
||||
-- 1. 罪犯表有在押状态数据
|
||||
-- 2. 释放记录表有本月数据
|
||||
-- 3. 监区表有医院(5)和禁闭室(6)类型数据
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 八、风险与应对
|
||||
|
||||
| 风险 | 等级 | 应对措施 |
|
||||
|------|------|----------|
|
||||
| 移交记录表缺失 | 高 | 优先完成数据库设计 |
|
||||
| 地图 JSON 资源 | 中 | 提前下载或使用 CDN |
|
||||
| 数据权限复杂性 | 中 | 先实现基础版本,再迭代 |
|
||||
| 性能问题 | 低 | 添加 Redis 缓存 |
|
||||
|
||||
---
|
||||
|
||||
## 九、依赖项
|
||||
|
||||
### 9.1 前置依赖
|
||||
- [ ] 罪犯信息管理模块(数据来源)
|
||||
- [ ] 释放记录模块(数据来源)
|
||||
- [ ] 监区管理模块(数据来源)
|
||||
|
||||
### 9.2 外部依赖
|
||||
- [ ] ECharts 地图 JSON 文件
|
||||
|
||||
---
|
||||
|
||||
**文档版本**:v1.0
|
||||
**创建日期**:2026-01-14
|
||||
**评审人**:前端架构师、后端架构师
|
||||
1639
requirements/实施文档-计分考核-前端.md
Normal file
657
requirements/实施文档-计分考核-后端.md
Normal file
@ -0,0 +1,657 @@
|
||||
# 计分考核模块 - 后端实施文档
|
||||
|
||||
> 版本:v1.0
|
||||
> 创建日期:2026-01-14
|
||||
> 优先级:P0
|
||||
|
||||
---
|
||||
|
||||
## 一、概述
|
||||
|
||||
### 1.1 文档说明
|
||||
本文档为计分考核模块的后端实施指南,基于需求文档「需求-03-计分考核.md」编写。
|
||||
|
||||
### 1.2 现有模块状态
|
||||
- **已有**:基础的月度考核汇总表(prison_score)和CRUD接口
|
||||
- **缺失**:考核规则配置、日常考核记录、自动计算、等级评定、公示功能
|
||||
|
||||
### 1.3 新增数据表规划
|
||||
|
||||
| 序号 | 表名 | 说明 | 优先级 |
|
||||
|-----|-----|------|-------|
|
||||
| 1 | `prison_score_subject` | 考核规则科目表 | P0 |
|
||||
| 2 | `prison_score_record` | 日常考核记录表 | P0 |
|
||||
| 3 | `prison_score_level_rule` | 考核等级评定规则表 | P0 |
|
||||
| 4 | `prison_score_notice` | 考核公示公告表 | P1 |
|
||||
|
||||
---
|
||||
|
||||
## 二、数据库设计
|
||||
|
||||
### 2.1 考核规则科目表 (prison_score_subject)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `prison_score_subject` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '规则ID',
|
||||
`code` varchar(50) NOT NULL COMMENT '规则编码(唯一)',
|
||||
`name` varchar(100) NOT NULL COMMENT '规则名称',
|
||||
`category` tinyint NOT NULL COMMENT '考核类别:1-劳动改造 2-教育改造 3-日常行为 4-卫生纪律 5-加分项 6-扣分项',
|
||||
`score` decimal(10,2) NOT NULL COMMENT '分值(正数为加分,负数为扣分)',
|
||||
`daily_limit` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '日最高分限制',
|
||||
`monthly_limit` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '月最高分限制',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '规则说明',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用',
|
||||
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` bigint DEFAULT 0 COMMENT '租户编号',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_code` (`code`),
|
||||
KEY `idx_category` (`category`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB COMMENT='考核规则科目表';
|
||||
```
|
||||
|
||||
**枚举定义**:
|
||||
```java
|
||||
/**
|
||||
* 考核类别枚举
|
||||
*/
|
||||
public enum ScoreSubjectCategoryEnum {
|
||||
LABOR(1, "劳动改造"),
|
||||
EDUCATION(2, "教育改造"),
|
||||
DAILY_BEHAVIOR(3, "日常行为"),
|
||||
HYGIENE_DISCIPLINE(4, "卫生纪律"),
|
||||
BONUS(5, "加分项"),
|
||||
PENALTY(6, "扣分项");
|
||||
|
||||
private final Integer value;
|
||||
private final String name;
|
||||
}
|
||||
|
||||
/**
|
||||
* 状态枚举
|
||||
*/
|
||||
public enum ScoreSubjectStatusEnum {
|
||||
ENABLED(1, "启用"),
|
||||
DISABLED(2, "禁用");
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 日常考核记录表 (prison_score_record)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `prison_score_record` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||||
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||
`record_date` date NOT NULL COMMENT '考核日期',
|
||||
`subject_id` bigint NOT NULL COMMENT '考核规则ID',
|
||||
`subject_name` varchar(100) NOT NULL COMMENT '规则名称',
|
||||
`category` tinyint NOT NULL COMMENT '考核类别',
|
||||
`score` decimal(10,2) NOT NULL COMMENT '得分',
|
||||
`actual_score` decimal(10,2) NOT NULL COMMENT '实际得分(日限月限校验后)',
|
||||
`remark` varchar(500) DEFAULT NULL COMMENT '备注说明',
|
||||
`recorder_id` bigint NOT NULL COMMENT '记录人ID',
|
||||
`recorder_name` varchar(50) NOT NULL COMMENT '记录人姓名',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` bigint DEFAULT 0 COMMENT '租户编号',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_prisoner_date` (`prisoner_no`, `record_date`),
|
||||
KEY `idx_record_date` (`record_date`),
|
||||
KEY `idx_subject` (`subject_id`)
|
||||
) ENGINE=InnoDB COMMENT='日常考核记录表';
|
||||
```
|
||||
|
||||
### 2.3 考核等级评定规则表 (prison_score_level_rule)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `prison_score_level_rule` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '规则ID',
|
||||
`level` tinyint NOT NULL COMMENT '等级:1-优秀 2-良好 3-合格 4-不合格',
|
||||
`level_name` varchar(20) NOT NULL COMMENT '等级名称',
|
||||
`min_score` decimal(10,2) NOT NULL COMMENT '最低分(含)',
|
||||
`max_score` decimal(10,2) NOT NULL COMMENT '最高分(含)',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '说明',
|
||||
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` bigint DEFAULT 0 COMMENT '租户编号',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_level` (`level`),
|
||||
KEY `idx_min_score` (`min_score`)
|
||||
) ENGINE=InnoDB COMMENT='考核等级评定规则表';
|
||||
```
|
||||
|
||||
**默认数据**:
|
||||
```sql
|
||||
INSERT INTO `prison_score_level_rule` (`level`, `level_name`, `min_score`, `max_score`, `description`, `sort`, `status`) VALUES
|
||||
(1, '优秀', 120.00, 9999.99, '表现突出', 1, 1),
|
||||
(2, '良好', 100.00, 119.99, '表现良好', 2, 1),
|
||||
(3, '合格', 80.00, 99.99, '表现一般', 3, 1),
|
||||
(4, '不合格', 0.00, 79.99, '表现较差', 4, 1);
|
||||
```
|
||||
|
||||
### 2.4 考核公示公告表 (prison_score_notice)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `prison_score_notice` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '公告ID',
|
||||
`title` varchar(200) NOT NULL COMMENT '公告标题',
|
||||
`notice_type` tinyint NOT NULL DEFAULT 1 COMMENT '公示类型:1-月度考核结果 2-专项考核',
|
||||
`start_date` date NOT NULL COMMENT '公示开始日期',
|
||||
`end_date` date NOT NULL COMMENT '公示结束日期',
|
||||
`scope_type` tinyint NOT NULL DEFAULT 1 COMMENT '公示范围:1-全狱 2-指定监区',
|
||||
`scope_prison_area_ids` varchar(500) DEFAULT NULL COMMENT '指定监区ID列表',
|
||||
`content` text COMMENT '公示内容',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-草稿 2-已发布 3-已撤回',
|
||||
`publisher_id` bigint DEFAULT NULL COMMENT '发布人ID',
|
||||
`publisher_name` varchar(50) DEFAULT NULL COMMENT '发布人姓名',
|
||||
`publish_time` datetime DEFAULT NULL COMMENT '发布时间',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` bigint DEFAULT 0 COMMENT '租户编号',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_publish_time` (`publish_time`)
|
||||
) ENGINE=InnoDB COMMENT='考核公示公告表';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、后端接口设计
|
||||
|
||||
### 3.1 考核规则科目接口
|
||||
|
||||
**Controller路径**:`controller/admin/score/subject/`
|
||||
|
||||
| 方法 | 端点 | 权限 | 说明 |
|
||||
|-----|-----|-----|------|
|
||||
| POST | `/prison/score/subject/create` | prison:score:subject:create | 创建规则 |
|
||||
| PUT | `/prison/score/subject/update` | prison:score:subject:update | 更新规则 |
|
||||
| DELETE | `/prison/score/subject/delete` | prison:score:subject:delete | 删除规则 |
|
||||
| GET | `/prison/score/subject/get` | prison:score:subject:query | 获取详情 |
|
||||
| GET | `/prison/score/subject/page` | prison:score:subject:query | 分页查询 |
|
||||
| GET | `/prison/score/subject/list` | prison:score:subject:query | 列表查询(无分页) |
|
||||
| PUT | `/prison/score/subject/update-status` | prison:score:subject:update | 更新状态 |
|
||||
| GET | `/prison/score/subject/export-excel` | prison:score:subject:export | 导出Excel |
|
||||
|
||||
**VO对象**:
|
||||
```java
|
||||
// ScoreSubjectSaveReqVO.java
|
||||
public class ScoreSubjectSaveReqVO {
|
||||
@ApiModelProperty(value = "规则编码", required = true, example = "RULE001")
|
||||
@NotBlank(message = "规则编码不能为空")
|
||||
private String code;
|
||||
|
||||
@ApiModelProperty(value = "规则名称", required = true, example = "超额完成生产任务")
|
||||
@NotBlank(message = "规则名称不能为空")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "考核类别", required = true, example = "1", notes = "1-劳动改造 2-教育改造 3-日常行为 4-卫生纪律 5-加分项 6-扣分项")
|
||||
@NotNull(message = "考核类别不能为空")
|
||||
private Integer category;
|
||||
|
||||
@ApiModelProperty(value = "分值", required = true, example = "2.00")
|
||||
@NotNull(message = "分值不能为空")
|
||||
private BigDecimal score;
|
||||
|
||||
@ApiModelProperty(value = "日最高分限制", example = "5.00")
|
||||
private BigDecimal dailyLimit;
|
||||
|
||||
@ApiModelProperty(value = "月最高分限制", example = "30.00")
|
||||
private BigDecimal monthlyLimit;
|
||||
|
||||
@ApiModelProperty(value = "规则说明", example = "超额完成生产任务")
|
||||
private String description;
|
||||
|
||||
@ApiModelProperty(value = "状态", example = "1")
|
||||
private Integer status;
|
||||
|
||||
@ApiModelProperty(value = "排序", example = "1")
|
||||
private Integer sort;
|
||||
}
|
||||
|
||||
// ScoreSubjectRespVO.java
|
||||
public class ScoreSubjectRespVO {
|
||||
private Long id;
|
||||
private String code;
|
||||
private String name;
|
||||
private Integer category;
|
||||
private String categoryName;
|
||||
private BigDecimal score;
|
||||
private BigDecimal dailyLimit;
|
||||
private BigDecimal monthlyLimit;
|
||||
private String description;
|
||||
private Integer status;
|
||||
private String statusName;
|
||||
private Integer sort;
|
||||
private Date createTime;
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 日常考核记录接口
|
||||
|
||||
**Controller路径**:`controller/admin/score/record/`
|
||||
|
||||
| 方法 | 端点 | 权限 | 说明 |
|
||||
|-----|-----|-----|------|
|
||||
| POST | `/prison/score/record/create` | prison:score:record:create | 创建记录 |
|
||||
| POST | `/prison/score/record/batch-create` | prison:score:record:create | 批量创建记录 |
|
||||
| PUT | `/prison/score/record/update` | prison:score:record:update | 更新记录 |
|
||||
| DELETE | `/prison/score/record/delete` | prison:score:record:delete | 删除记录 |
|
||||
| GET | `/prison/score/record/get` | prison:score:record:query | 获取详情 |
|
||||
| GET | `/prison/score/record/page` | prison:score:record:query | 分页查询 |
|
||||
| GET | `/prison/score/record/export-excel` | prison:score:record:export | 导出Excel |
|
||||
| GET | `/prison/score/record/get-by-prisoner` | prison:score:record:query | 获取罪犯考核明细 |
|
||||
|
||||
**VO对象**:
|
||||
```java
|
||||
// ScoreRecordSaveReqVO.java
|
||||
public class ScoreRecordSaveReqVO {
|
||||
@ApiModelProperty(value = "罪犯ID", required = true)
|
||||
@NotNull(message = "罪犯ID不能为空")
|
||||
private Long prisonerId;
|
||||
|
||||
@ApiModelProperty(value = "考核日期", required = true, example = "2026-01-14")
|
||||
@NotNull(message = "考核日期不能为空")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordDate;
|
||||
|
||||
@ApiModelProperty(value = "考核规则ID", required = true)
|
||||
@NotNull(message = "考核规则ID不能为空")
|
||||
private Long subjectId;
|
||||
|
||||
@ApiModelProperty(value = "得分", required = true, example = "2.00")
|
||||
@NotNull(message = "得分不能为空")
|
||||
private BigDecimal score;
|
||||
|
||||
@ApiModelProperty(value = "备注说明")
|
||||
private String remark;
|
||||
}
|
||||
|
||||
// ScoreRecordBatchCreateReqVO.java
|
||||
public class ScoreRecordBatchCreateReqVO {
|
||||
@ApiModelProperty(value = "考核日期", required = true)
|
||||
@NotNull(message = "考核日期不能为空")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordDate;
|
||||
|
||||
@ApiModelProperty(value = "罪犯ID列表", required = true)
|
||||
@NotEmpty(message = "罪犯ID列表不能为空")
|
||||
private List<Long> prisonerIds;
|
||||
|
||||
@ApiModelProperty(value = "考核规则ID", required = true)
|
||||
@NotNull(message = "考核规则ID不能为空")
|
||||
private Long subjectId;
|
||||
|
||||
@ApiModelProperty(value = "得分", required = true)
|
||||
@NotNull(message = "得分不能为空")
|
||||
private BigDecimal score;
|
||||
|
||||
@ApiModelProperty(value = "备注说明")
|
||||
private String remark;
|
||||
}
|
||||
|
||||
// ScoreRecordRespVO.java
|
||||
public class ScoreRecordRespVO {
|
||||
private Long id;
|
||||
private Long prisonerId;
|
||||
private String prisonerNo;
|
||||
private String prisonerName;
|
||||
private Long prisonAreaId;
|
||||
private String prisonAreaName;
|
||||
private Date recordDate;
|
||||
private Long subjectId;
|
||||
private String subjectName;
|
||||
private Integer category;
|
||||
private String categoryName;
|
||||
private BigDecimal score;
|
||||
private BigDecimal actualScore;
|
||||
private String remark;
|
||||
private Long recorderId;
|
||||
private String recorderName;
|
||||
private Date createTime;
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 月度考核汇总接口
|
||||
|
||||
**Controller路径**:`controller/admin/score/monthly/`
|
||||
|
||||
| 方法 | 端点 | 权限 | 说明 |
|
||||
|-----|-----|-----|------|
|
||||
| POST | `/prison/score/monthly/calculate` | prison:score:monthly:calculate | 手动触发月度汇总计算 |
|
||||
| GET | `/prison/score/monthly/get-summary` | prison:score:monthly:query | 获取月度汇总详情 |
|
||||
| GET | `/prison/score/monthly/page` | prison:score:monthly:query | 分页查询月度汇总 |
|
||||
| POST | `/prison/score/monthly/submit-audit` | prison:score:monthly:audit | 提交审核 |
|
||||
| POST | `/prison/score/monthly/audit` | prison:score:monthly:audit | 审核通过/驳回 |
|
||||
| GET | `/prison/score/monthly/export-excel` | prison:score:monthly:export | 导出Excel |
|
||||
| GET | `/prison/score/monthly/get-detail` | prison:score:monthly:query | 获取月度汇总明细 |
|
||||
|
||||
**业务逻辑**:
|
||||
```java
|
||||
/**
|
||||
* 月度汇总计算逻辑
|
||||
*/
|
||||
public void calculateMonthlySummary(Integer year, Integer month) {
|
||||
// 1. 获取所有罪犯列表
|
||||
List<Prisoner> prisoners = prisonerService.getActivePrisonerList();
|
||||
|
||||
// 2. 遍历每个罪犯
|
||||
for (Prisoner prisoner : prisoners) {
|
||||
// 3. 获取该罪犯当月所有日常考核记录
|
||||
List<ScoreRecord> records = getMonthlyRecords(prisoner.getId(), year, month);
|
||||
|
||||
// 4. 计算加分合计(考虑日限月限)
|
||||
BigDecimal rewardScore = calculateRewardScore(records);
|
||||
|
||||
// 5. 计算扣分合计(考虑日限月限)
|
||||
BigDecimal penaltyScore = calculatePenaltyScore(records);
|
||||
|
||||
// 6. 获取基础分配置
|
||||
BigDecimal baseScore = getBaseScoreConfig();
|
||||
|
||||
// 7. 计算总分
|
||||
BigDecimal totalScore = baseScore.add(rewardScore).add(penaltyScore);
|
||||
|
||||
// 8. 评定等级
|
||||
Integer level = assessLevel(totalScore);
|
||||
|
||||
// 9. 保存或更新月度汇总记录
|
||||
saveOrUpdateMonthlySummary(prisoner, year, month, baseScore, rewardScore, penaltyScore, totalScore, level);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算加分(考虑日限月限)
|
||||
*/
|
||||
private BigDecimal calculateRewardScore(List<ScoreRecord> records) {
|
||||
// 按规则分组,计算每条规则的加分
|
||||
// 超过日限的按日限计算
|
||||
// 超过月限的按月限计算
|
||||
// 返回最终加分合计
|
||||
}
|
||||
```
|
||||
|
||||
### 3.4 考核等级规则接口
|
||||
|
||||
**Controller路径**:`controller/admin/score/level/`
|
||||
|
||||
| 方法 | 端点 | 权限 | 说明 |
|
||||
|-----|-----|-----|------|
|
||||
| PUT | `/prison/score/level/update` | prison:score:level:update | 更新等级规则 |
|
||||
| GET | `/prison/score/level/get` | prison:score:level:query | 获取等级规则列表 |
|
||||
| GET | `/prison/score/level/get-base-score` | prison:score:level:query | 获取基础分配置 |
|
||||
| PUT | `/prison/score/level/update-base-score` | prison:score:level:update | 更新基础分配置 |
|
||||
|
||||
### 3.5 考核公示公告接口
|
||||
|
||||
**Controller路径**:`controller/admin/score/notice/`
|
||||
|
||||
| 方法 | 端点 | 权限 | 说明 |
|
||||
|-----|-----|-----|------|
|
||||
| POST | `/prison/score/notice/create` | prison:score:notice:create | 创建公示 |
|
||||
| PUT | `/prison/score/notice/update` | prison:score:notice:update | 更新公示 |
|
||||
| PUT | `/prison/score/notice/publish` | prison:score:notice:publish | 发布公示 |
|
||||
| PUT | `/prison/score/notice/withdraw` | prison:score:notice:publish | 撤回公示 |
|
||||
| DELETE | `/prison/score/notice/delete` | prison:score:notice:delete | 删除公示 |
|
||||
| GET | `/prison/score/notice/get` | prison:score:notice:query | 获取详情 |
|
||||
| GET | `/prison/score/notice/page` | prison:score:notice:query | 分页查询 |
|
||||
|
||||
### 3.6 减刑假释数据提取接口
|
||||
|
||||
**Controller路径**:`controller/admin/score/parole/`
|
||||
|
||||
| 方法 | 端点 | 权限 | 说明 |
|
||||
|-----|-----|-----|------|
|
||||
| GET | `/prison/score/parole/get-data` | prison:score:parole:query | 获取减刑假释考核数据 |
|
||||
| POST | `/prison/score/parole/generate-suggestion` | prison:score:parole:query | 生成减刑假释建议 |
|
||||
|
||||
**返回数据结构**:
|
||||
```java
|
||||
public class ScoreParoleDataVO {
|
||||
private Long prisonerId;
|
||||
private String prisonerNo;
|
||||
private String prisonerName;
|
||||
|
||||
// 近6个月月度考核数据
|
||||
private List<MonthlyScoreVO> monthlyScores;
|
||||
|
||||
// 年度累计考核分
|
||||
private BigDecimal yearlyTotalScore;
|
||||
|
||||
// 表扬次数
|
||||
private Integer praiseCount;
|
||||
|
||||
// 警告次数
|
||||
private Integer warningCount;
|
||||
|
||||
// 等级评定记录
|
||||
private List<LevelRecordVO> levelRecords;
|
||||
|
||||
// 减刑假释建议
|
||||
private ParoleSuggestionVO suggestion;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、批量SQL脚本
|
||||
|
||||
```sql
|
||||
-- ==================== 计分考核模块 DDL ====================
|
||||
|
||||
-- 1. 考核规则科目表
|
||||
CREATE TABLE `prison_score_subject` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '规则ID',
|
||||
`code` varchar(50) NOT NULL COMMENT '规则编码',
|
||||
`name` varchar(100) NOT NULL COMMENT '规则名称',
|
||||
`category` tinyint NOT NULL COMMENT '考核类别',
|
||||
`score` decimal(10,2) NOT NULL COMMENT '分值',
|
||||
`daily_limit` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '日最高分限制',
|
||||
`monthly_limit` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '月最高分限制',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '规则说明',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
|
||||
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` bigint DEFAULT 0 COMMENT '租户编号',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_code` (`code`),
|
||||
KEY `idx_category` (`category`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB COMMENT='考核规则科目表';
|
||||
|
||||
-- 2. 日常考核记录表
|
||||
CREATE TABLE `prison_score_record` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||||
`prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
|
||||
`prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
|
||||
`record_date` date NOT NULL COMMENT '考核日期',
|
||||
`subject_id` bigint NOT NULL COMMENT '考核规则ID',
|
||||
`subject_name` varchar(100) NOT NULL COMMENT '规则名称',
|
||||
`category` tinyint NOT NULL COMMENT '考核类别',
|
||||
`score` decimal(10,2) NOT NULL COMMENT '得分',
|
||||
`actual_score` decimal(10,2) NOT NULL COMMENT '实际得分',
|
||||
`remark` varchar(500) DEFAULT NULL COMMENT '备注说明',
|
||||
`recorder_id` bigint NOT NULL COMMENT '记录人ID',
|
||||
`recorder_name` varchar(50) NOT NULL COMMENT '记录人姓名',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` bigint DEFAULT 0 COMMENT '租户编号',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_prisoner_date` (`prisoner_no`, `record_date`),
|
||||
KEY `idx_record_date` (`record_date`),
|
||||
KEY `idx_subject` (`subject_id`)
|
||||
) ENGINE=InnoDB COMMENT='日常考核记录表';
|
||||
|
||||
-- 3. 考核等级评定规则表
|
||||
CREATE TABLE `prison_score_level_rule` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '规则ID',
|
||||
`level` tinyint NOT NULL COMMENT '等级',
|
||||
`level_name` varchar(20) NOT NULL COMMENT '等级名称',
|
||||
`min_score` decimal(10,2) NOT NULL COMMENT '最低分',
|
||||
`max_score` decimal(10,2) NOT NULL COMMENT '最高分',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '说明',
|
||||
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` bigint DEFAULT 0 COMMENT '租户编号',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_level` (`level`),
|
||||
KEY `idx_min_score` (`min_score`)
|
||||
) ENGINE=InnoDB COMMENT='考核等级评定规则表';
|
||||
|
||||
-- 4. 考核公示公告表
|
||||
CREATE TABLE `prison_score_notice` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '公告ID',
|
||||
`title` varchar(200) NOT NULL COMMENT '公告标题',
|
||||
`notice_type` tinyint NOT NULL DEFAULT 1 COMMENT '公示类型',
|
||||
`start_date` date NOT NULL COMMENT '公示开始日期',
|
||||
`end_date` date NOT NULL COMMENT '公示结束日期',
|
||||
`scope_type` tinyint NOT NULL DEFAULT 1 COMMENT '公示范围',
|
||||
`scope_prison_area_ids` varchar(500) DEFAULT NULL COMMENT '指定监区ID列表',
|
||||
`content` text COMMENT '公示内容',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
|
||||
`publisher_id` bigint DEFAULT NULL COMMENT '发布人ID',
|
||||
`publisher_name` varchar(50) DEFAULT NULL COMMENT '发布人姓名',
|
||||
`publish_time` datetime DEFAULT NULL COMMENT '发布时间',
|
||||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` bigint DEFAULT 0 COMMENT '租户编号',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_publish_time` (`publish_time`)
|
||||
) ENGINE=InnoDB COMMENT='考核公示公告表';
|
||||
|
||||
-- 5. 初始化等级规则数据
|
||||
INSERT INTO `prison_score_level_rule` (`level`, `level_name`, `min_score`, `max_score`, `description`, `sort`, `status`) VALUES
|
||||
(1, '优秀', 120.00, 9999.99, '表现突出', 1, 1),
|
||||
(2, '良好', 100.00, 119.99, '表现良好', 2, 1),
|
||||
(3, '合格', 80.00, 99.99, '表现一般', 3, 1),
|
||||
(4, '不合格', 0.00, 79.99, '表现较差', 4, 1);
|
||||
|
||||
-- 6. 初始化示例规则数据
|
||||
INSERT INTO `prison_score_subject` (`code`, `name`, `category`, `score`, `daily_limit`, `monthly_limit`, `description`, `status`, `sort`) VALUES
|
||||
('LABOR001', '超额完成生产任务', 1, 2.00, 5.00, 30.00, '超额完成生产任务', 1, 1),
|
||||
('LABOR002', '完成生产任务', 1, 1.00, 3.00, 20.00, '完成生产任务', 1, 2),
|
||||
('EDU001', '参加义务劳动', 2, 1.00, 2.00, 10.00, '参加义务劳动', 1, 1),
|
||||
('EDU002', '考试合格', 2, 1.00, 3.00, 15.00, '考试合格', 1, 2),
|
||||
('DAILY001', '获得表扬', 3, 2.00, 5.00, 20.00, '获得表扬', 1, 1),
|
||||
('DAILY002', '主动报告隐患', 3, 1.00, 2.00, 10.00, '主动报告隐患', 1, 2),
|
||||
('HYGIENE001', '内务不整洁', 4, -0.50, -3.00, -10.00, '内务不整洁', 1, 1),
|
||||
('HYGIENE002', '违规吸烟', 4, -2.00, -5.00, -20.00, '违规吸烟', 1, 2),
|
||||
('PENALTY001', '打架斗殴', 6, -5.00, -10.00, -30.00, '打架斗殴', 1, 1),
|
||||
('PENALTY002', '私藏违禁品', 6, -10.00, -20.00, -50.00, '私藏违禁品', 1, 2);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、目录结构
|
||||
|
||||
```
|
||||
backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/
|
||||
├── controller/admin/score/
|
||||
│ ├── subject/ # 考核规则科目
|
||||
│ │ ├── PrisonScoreSubjectController.java
|
||||
│ │ └── vo/
|
||||
│ │ ├── ScoreSubjectPageReqVO.java
|
||||
│ │ ├── ScoreSubjectSaveReqVO.java
|
||||
│ │ └── ScoreSubjectRespVO.java
|
||||
│ ├── record/ # 日常考核记录
|
||||
│ │ ├── PrisonScoreRecordController.java
|
||||
│ │ └── vo/
|
||||
│ │ ├── ScoreRecordPageReqVO.java
|
||||
│ │ ├── ScoreRecordSaveReqVO.java
|
||||
│ │ ├── ScoreRecordBatchCreateReqVO.java
|
||||
│ │ └── ScoreRecordRespVO.java
|
||||
│ ├── monthly/ # 月度汇总
|
||||
│ │ ├── PrisonScoreMonthlyController.java
|
||||
│ │ └── vo/
|
||||
│ │ ├── ScoreMonthlyPageReqVO.java
|
||||
│ │ ├── ScoreMonthlyRespVO.java
|
||||
│ │ └── ScoreMonthlyDetailRespVO.java
|
||||
│ ├── level/ # 等级规则
|
||||
│ │ ├── PrisonScoreLevelController.java
|
||||
│ │ └── vo/
|
||||
│ │ └── ScoreLevelRespVO.java
|
||||
│ ├── notice/ # 公示公告
|
||||
│ │ ├── PrisonScoreNoticeController.java
|
||||
│ │ └── vo/
|
||||
│ │ ├── ScoreNoticePageReqVO.java
|
||||
│ │ ├── ScoreNoticeSaveReqVO.java
|
||||
│ │ └── ScoreNoticeRespVO.java
|
||||
│ └── parole/ # 减刑假释
|
||||
│ ├── PrisonScoreParoleController.java
|
||||
│ └── vo/
|
||||
│ └── ScoreParoleDataRespVO.java
|
||||
│
|
||||
├── service/score/
|
||||
│ ├── ScoreSubjectService.java
|
||||
│ ├── impl/ScoreSubjectServiceImpl.java
|
||||
│ ├── ScoreRecordService.java
|
||||
│ ├── impl/ScoreRecordServiceImpl.java
|
||||
│ ├── ScoreMonthlyService.java
|
||||
│ ├── impl/ScoreMonthlyServiceImpl.java
|
||||
│ ├── ScoreLevelService.java
|
||||
│ ├── impl/ScoreLevelServiceImpl.java
|
||||
│ ├── ScoreNoticeService.java
|
||||
│ ├── impl/ScoreNoticeServiceImpl.java
|
||||
│ └── ScoreParoleService.java
|
||||
│ └── impl/ScoreParoleServiceImpl.java
|
||||
│
|
||||
├── dal/dataobject/score/
|
||||
│ ├── ScoreSubjectDO.java
|
||||
│ ├── ScoreRecordDO.java
|
||||
│ ├── ScoreLevelRuleDO.java
|
||||
│ ├── ScoreNoticeDO.java
|
||||
│ └── ScoreDO.java # 已有
|
||||
│
|
||||
└── dal/mysql/score/
|
||||
├── ScoreSubjectMapper.java
|
||||
├── ScoreRecordMapper.java
|
||||
├── ScoreLevelRuleMapper.java
|
||||
├── ScoreNoticeMapper.java
|
||||
└── ScoreMapper.java # 已有
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、验收标准
|
||||
|
||||
- [ ] 创建考核规则科目表并实现CRUD接口
|
||||
- [ ] 创建日常考核记录表并实现CRUD接口(含批量录入)
|
||||
- [ ] 创建考核等级规则表并实现配置接口
|
||||
- [ ] 创建考核公示公告表并实现发布功能
|
||||
- [ ] 实现月度汇总自动计算逻辑
|
||||
- [ ] 实现日/月最高分限制校验
|
||||
- [ ] 实现减刑假释数据提取接口
|
||||
- [ ] 所有接口通过单元测试
|
||||
287
requirements/评估业务流程确认清单.md
Normal file
@ -0,0 +1,287 @@
|
||||
# 评估报告业务流程确认清单
|
||||
|
||||
> 确认日期:2026-01-18
|
||||
> 确认人:产品负责人
|
||||
> 确认方式:专家问答确认
|
||||
|
||||
---
|
||||
|
||||
## 一、流程确认结果汇总
|
||||
|
||||
| 序号 | 问题 | 确认结果 | 影响范围 |
|
||||
|-----|------|---------|---------|
|
||||
| 1 | 数据完整性检查 | ✅ 需要检查 | 生成流程修改 |
|
||||
| 2 | AI生成范围 | ✅ AI生成初稿 | AI功能边界 |
|
||||
| 3 | 专业审核 | ❌ 无需专业人员 | 审核流程简化 |
|
||||
| 4 | 审核层级 | ✅ 单级审核 | 流程简化 |
|
||||
| 5 | 批量生成 | ✅ 支持批量 | 功能新增 |
|
||||
| 6 | 退回原因 | ✅ 选择原因 | 审核流程 |
|
||||
| 7 | 撤回功能 | ✅ 需要撤回 | 功能新增 |
|
||||
| 8 | 归档策略 | ✅ 自动归档 | 功能新增 |
|
||||
| 9 | 编号规则 | ✅ 保持现状 | 无需修改 |
|
||||
| 10 | 风险等级 | ✅ 仅显示等级 | 无需配套 |
|
||||
| 11 | 版本管理 | ✅ 完整功能 | 功能完善 |
|
||||
| 12 | 导出格式 | ✅ PDF+Word+Excel | 与需求一致 |
|
||||
| 13 | AI服务降级 | ✅ 手动填写 | 容错机制 |
|
||||
| 14 | 评估维度 | ✅ 增加家庭帮教 | 维度补充 |
|
||||
|
||||
---
|
||||
|
||||
## 二、确认后的业务流程设计
|
||||
|
||||
### 2.1 报告生成流程(修订后)
|
||||
|
||||
```
|
||||
步骤1:选择罪犯
|
||||
│
|
||||
▼
|
||||
步骤2:数据完整性检查 ⚠️ 【新增】
|
||||
├── 检查项:
|
||||
│ ├── 罪犯档案完整性
|
||||
│ ├── 计分考核记录(12个月)
|
||||
│ ├── 消费记录(12个月)
|
||||
│ ├── 心理测评记录
|
||||
│ └── 危险评估记录
|
||||
├── 显示结果:
|
||||
│ ├── 完整:显示绿色勾选
|
||||
│ ├── 缺失:显示黄色警告 + 缺失项列表
|
||||
└── 操作:
|
||||
├── [继续生成](数据完整或允许缺失)
|
||||
└── [补录数据](跳转补录页面)
|
||||
│
|
||||
▼
|
||||
步骤3:选择报告模板
|
||||
│
|
||||
▼
|
||||
步骤4:确认生成
|
||||
├── 显示:预计生成时间、数据完整性状态
|
||||
└── [确认生成]
|
||||
│
|
||||
▼
|
||||
步骤5:AI生成报告初稿 ⚠️ 【AI生成初稿】
|
||||
├── 生成时间:30-60秒/份
|
||||
├── 并发限制:最多3个并行任务
|
||||
└── 进度显示:实时进度条
|
||||
│
|
||||
▼
|
||||
步骤6:人工审核修改
|
||||
├── 步骤:查看报告 → 逐维度审核 → 修改 → 确认
|
||||
└── 标识:AI生成内容显示"🤖 AI生成"标识
|
||||
│
|
||||
▼
|
||||
步骤7:提交审核
|
||||
├── 检查:必填维度是否完整
|
||||
└── 操作:[提交审核]
|
||||
│
|
||||
▼
|
||||
步骤8:审核通过
|
||||
├── 审核人:单级审核(教育科长或指定审核人)
|
||||
├── 退回:需选择退回原因(分类选择)
|
||||
└── 撤回:提交后允许撤回
|
||||
│
|
||||
▼
|
||||
步骤9:自动归档 ⚠️ 【自动归档】
|
||||
├── 条件:审核通过后24小时自动归档
|
||||
└── 效果:归档后不可修改
|
||||
```
|
||||
|
||||
### 2.2 批量生成流程
|
||||
|
||||
```
|
||||
批量生成入口:批量选择罪犯 → 选择模板 → 批量生成
|
||||
│
|
||||
▼
|
||||
前置检查
|
||||
├── 数据完整性扫描(批量)
|
||||
└── 生成数据完整性报告
|
||||
│
|
||||
▼
|
||||
任务队列
|
||||
├── 异步处理:进入后台队列
|
||||
├── 预估时间:根据数量计算
|
||||
└── 用户操作:可离开去做其他工作
|
||||
│
|
||||
▼
|
||||
进度通知
|
||||
├── 进度条:实时显示进度
|
||||
├── 完成通知:系统消息通知
|
||||
└── 失败处理:标记失败项,支持重试
|
||||
```
|
||||
|
||||
### 2.3 审核流程(单级审核)
|
||||
|
||||
```
|
||||
┌────────┐ 提交审核 ┌────────┐ 审核通过 ┌────────┐ 自动归档 ┌────────┐
|
||||
│ 草稿 │ ─────────→ │ 待审核 │ ─────────→ │ 已通过 │ ─────────→ │ 已归档 │
|
||||
└────────┘ └────────┘ └────────┘ └────────┘
|
||||
│ │
|
||||
│ │ 审核退回
|
||||
│ ▼
|
||||
│ ┌────────┐
|
||||
│ │ 已退回 │ ←─── 需选择退回原因
|
||||
│ └────────┘
|
||||
│ │
|
||||
│ │ 重新提交
|
||||
└────────────────────┘
|
||||
↑撤回
|
||||
```
|
||||
|
||||
### 2.4 版本管理流程
|
||||
|
||||
```
|
||||
每次保存生成新版本
|
||||
│
|
||||
▼
|
||||
版本记录
|
||||
├── 版本号:v1, v2, v3...
|
||||
├── 修改人:记录操作人
|
||||
├── 修改时间:记录时间戳
|
||||
└── 变更内容:记录修改摘要
|
||||
│
|
||||
▼
|
||||
版本对比
|
||||
├── 功能:选择两个版本进行对比
|
||||
├── 显示:高亮显示差异部分
|
||||
└── 操作:可一键还原
|
||||
│
|
||||
▼
|
||||
版本回滚
|
||||
├── 功能:回滚到指定历史版本
|
||||
└── 限制:已归档报告不可回滚
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、与需求文档对比(最终确认)
|
||||
|
||||
| 功能点 | 需求文档要求 | 确认结果 | 处理建议 |
|
||||
|-------|-------------|---------|---------|
|
||||
| 导出PDF | 必须支持PDF导出 | ✅ **已确认** | 按需求实现 |
|
||||
| 导出Word | 必须支持Word导出 | ✅ **已确认** | 按需求实现 |
|
||||
| 专业审核 | 心理评估需专业人员审核 | ❌ 无需专业人员 | 按确认结果实施 |
|
||||
| 三级审核 | 需要分监区→监区→监狱 | 单级审核 | 按确认结果实施 |
|
||||
| 风险等级 | 需要配套管控措施 | 仅显示等级 | 按确认结果实施 |
|
||||
| 家庭帮教维度 | 未明确要求 | ✅ **已确认增加** | 按需求实现 |
|
||||
|
||||
---
|
||||
|
||||
## 四、家庭帮教维度设计(已确认)
|
||||
|
||||
### 4.1 维度子项
|
||||
|
||||
| 子项名称 | 说明 | 数据来源 |
|
||||
|---------|------|---------|
|
||||
| 家属会见频次 | 近6个月会见次数、月均会见次数 | 会见记录表 |
|
||||
| 帮教通信情况 | 家属来信次数、通信内容摘要 | 通信记录表 |
|
||||
| 家属态度评价 | 积极/一般/消极 | 人工评价 |
|
||||
| 家庭支持力度 | 强/中/弱(经济支持、情感支持) | 综合评估 |
|
||||
| 假释后安置意向 | 有固定住所/无固定住所、就业意向 | 档案信息 |
|
||||
|
||||
### 4.2 AI提示词建议
|
||||
|
||||
> 请根据以下家庭帮教情况数据,分析该犯的家属帮教支持情况:
|
||||
> - 家属会见频次:{会见次数}次/月
|
||||
> - 帮教通信:{通信次数}次/月
|
||||
> - 家属态度:{家属态度}
|
||||
> - 家庭支持:{支持力度}
|
||||
> - 安置条件:{安置意向}
|
||||
>
|
||||
> 请生成客观描述,重点分析家庭支持对罪犯改造效果的影响。
|
||||
|
||||
---
|
||||
|
||||
## 五、根据确认结果的功能清单
|
||||
|
||||
### 5.2 必须实现功能清单
|
||||
|
||||
| 功能 | 优先级 | 工作量 | 说明 |
|
||||
|-----|-------|-------|------|
|
||||
| 数据完整性检查 | P0 | 3天 | 生成前检查数据完整性 |
|
||||
| 批量生成功能 | P0 | 5天 | 异步队列 + 进度通知 |
|
||||
| 撤回功能 | P0 | 2天 | 提交后撤回接口 |
|
||||
| 自动归档 | P0 | 2天 | 审核通过后自动归档 |
|
||||
| 退回原因选择 | P0 | 1天 | 审核退回时选择原因 |
|
||||
| 版本管理(完整) | P0 | 4天 | 查看、对比、回滚 |
|
||||
| 家庭帮教维度 | P0 | 2天 | 新增评估维度 |
|
||||
| PDF导出 | P0 | 3天 | 按需求实现 |
|
||||
| Word导出 | P0 | 3天 | 按需求实现 |
|
||||
| Excel导出 | P0 | 1天 | 按需求实现 |
|
||||
| AI服务手动降级 | P1 | 2天 | AI不可用时手动填写 |
|
||||
|
||||
### 5.3 预计总工作量
|
||||
|
||||
| 阶段 | 功能范围 | 预计工时 |
|
||||
|-----|---------|---------|
|
||||
| 第一阶段 | 核心流程(数据检查、生成、审核) | 10天 |
|
||||
| 第二阶段 | 批量功能、归档、版本管理 | 10天 |
|
||||
| 第三阶段 | 导出功能(PDF/Word) | 7天 |
|
||||
| **合计** | | **27天** |
|
||||
|
||||
---
|
||||
|
||||
## 六、后续行动
|
||||
|
||||
### 6.1 确认完成事项
|
||||
|
||||
✅ 已确认全部14项流程问题
|
||||
✅ 已确认导出格式(PDF+Word+Excel)
|
||||
✅ 已确认家庭帮教维度设计方案
|
||||
|
||||
### 6.2 下一步工作
|
||||
|
||||
1. **修订需求文档**(本周)
|
||||
- 更新流程图(数据检查、批量生成、审核流程)
|
||||
- 补充家庭帮教维度详细设计
|
||||
- 增加PDF/Word导出功能设计
|
||||
- 更新验收标准
|
||||
|
||||
2. **技术方案设计**(下周)
|
||||
- 设计异步生成队列架构
|
||||
- 设计版本管理数据模型
|
||||
- 设计导出功能实现方案
|
||||
|
||||
3. **开发实施**(2-3周)
|
||||
- 按功能清单分阶段开发
|
||||
- 每周进行进度同步
|
||||
|
||||
### 6.3 需求文档修订清单
|
||||
|
||||
| 修订项 | 修订内容 | 优先级 |
|
||||
|-------|---------|-------|
|
||||
| 流程修订 | 增加数据完整性检查步骤 | P0 |
|
||||
| 流程修订 | 批量生成流程设计 | P0 |
|
||||
| 流程修订 | 撤回功能流程设计 | P0 |
|
||||
| 流程修订 | 自动归档规则设计 | P0 |
|
||||
| 功能新增 | 家庭帮教评估维度 | P0 |
|
||||
| 功能新增 | PDF导出功能 | P0 |
|
||||
| 功能新增 | Word导出功能 | P0 |
|
||||
| 功能完善 | 退回原因选择器 | P1 |
|
||||
| 功能完善 | 版本对比/回滚界面 | P1 |
|
||||
| 容错设计 | AI服务降级策略 | P2 |
|
||||
|
||||
---
|
||||
|
||||
## 附录:用户回答原始记录
|
||||
|
||||
| 问题 | 回答 |
|
||||
|-----|------|
|
||||
| 1. 数据完整性检查 | 需要检查 |
|
||||
| 2. AI生成范围 | AI生成初稿 |
|
||||
| 3. 专业审核 | 无需专业人员 |
|
||||
| 4. 审核层级 | 单级审核 |
|
||||
| 5. 批量生成 | 支持批量 |
|
||||
| 6. 退回原因 | 选择原因 |
|
||||
| 7. 撤回功能 | 需要撤回 |
|
||||
| 8. 归档策略 | 自动归档 |
|
||||
| 9. 编号规则 | 保持现状 |
|
||||
| 10. 风险等级 | 仅显示等级 |
|
||||
| 11. 版本管理 | 完整功能 |
|
||||
| 12. 导出格式 | PDF + Word + Excel |
|
||||
| 13. AI服务降级 | 手动填写 |
|
||||
| 14. 评估维度 | 需要增加家庭帮教 |
|
||||
|
||||
---
|
||||
|
||||
**文档状态**:✅ 已确认
|
||||
**确认人签字**:__________
|
||||
**确认日期**:2026-01-18
|
||||
1097
requirements/评估功能专家模拟评审报告.md
Normal file
501
requirements/评估功能实现评估报告.md
Normal file
@ -0,0 +1,501 @@
|
||||
# 评估功能前后端实现评估报告
|
||||
|
||||
> 评估日期:2026-01-18
|
||||
> 评估范围:危险评估、计分考核、评估报告模块
|
||||
> 评估目标:发现交互逻辑问题、功能设置问题,为产品专家评审提供依据
|
||||
|
||||
---
|
||||
|
||||
## 一、功能模块概览
|
||||
|
||||
### 1.1 已实现模块清单
|
||||
|
||||
| 模块名称 | 中文名称 | 后端路径 | 前端路径 | 完成度 |
|
||||
|---------|---------|---------|---------|-------|
|
||||
| RiskAssessment | 危险评估 | `controller/admin/riskassessment/` | `views/prison/riskassessment/` | 90% |
|
||||
| Score | 计分考核 | `controller/admin/score/` | `views/prison/score/` | 85% |
|
||||
| ScoreRule | 考核规则配置 | `controller/admin/score/rule/` | 未实现 | 70% |
|
||||
| ScoreDetail | 考核明细记录 | `controller/admin/score/detail/` | 未实现 | 70% |
|
||||
| EvaluationReport | 评估报告 | `controller/admin/evaluationreport/` | `api/prison/evaluation/` | 75% |
|
||||
|
||||
### 1.2 评估报告模块表结构
|
||||
|
||||
| 表名 | 说明 | 状态 |
|
||||
|-----|------|------|
|
||||
| `prison_evaluation_template` | 评估报告模板表 | ✅ 已创建 |
|
||||
| `prison_evaluation_dimension` | 评估维度配置表 | ✅ 已创建 |
|
||||
| `prison_evaluation_report` | 评估报告表 | ✅ 已创建 |
|
||||
| `prison_evaluation_dimension_data` | 报告维度数据表 | ✅ 已创建 |
|
||||
| `prison_report_comment` | 快捷评语库表 | ✅ 已创建 |
|
||||
| `prison_evaluation_report_version` | 报告版本历史表 | ✅ 已创建 |
|
||||
| `prison_evaluation_ai_log` | AI生成日志表 | ✅ 已创建 |
|
||||
|
||||
---
|
||||
|
||||
## 二、需求实现对比分析
|
||||
|
||||
### 2.1 模板管理功能对比
|
||||
|
||||
| 需求功能 | 实现状态 | 问题说明 |
|
||||
|---------|---------|---------|
|
||||
| 新增模板 | ✅ 已实现 | |
|
||||
| 编辑模板 | ✅ 已实现 | |
|
||||
| 复制模板 | ❌ **未实现** | 需求文档3.1.3明确要求 |
|
||||
| 启用/停用模板 | ✅ 已实现 | |
|
||||
| 设为默认 | ❌ **未实现** | 需求文档3.1.3明确要求 |
|
||||
| 版本管理 | ⚠️ 部分实现 | 仅存储,未实现版本对比 |
|
||||
| 模板分类 | ✅ 已实现 | 支持4种类型 |
|
||||
|
||||
### 2.2 维度管理功能对比
|
||||
|
||||
| 需求功能 | 实现状态 | 问题说明 |
|
||||
|---------|---------|---------|
|
||||
| 新增维度 | ✅ 已实现 | |
|
||||
| 编辑维度 | ✅ 已实现 | |
|
||||
| 删除维度 | ✅ 已实现 | |
|
||||
| 复制维度 | ❌ **未实现** | 需求文档3.1.4.1明确要求 |
|
||||
| 拖拽排序 | ❌ **未实现** | 仅后端存储sort字段,前端未实现拖拽 |
|
||||
| 启用/停用 | ✅ 已实现 | |
|
||||
| AI提示词配置 | ✅ 已实现 | |
|
||||
| 数据源绑定 | ✅ 已实现 | |
|
||||
|
||||
### 2.3 报告生成功能对比
|
||||
|
||||
| 需求功能 | 实现状态 | 问题说明 |
|
||||
|---------|---------|---------|
|
||||
| 手动创建报告 | ✅ 已实现 | |
|
||||
| 批量生成报告 | ❌ **未实现** | 需求文档3.5.2明确要求 |
|
||||
| 数据自动填充 | ✅ 已实现 | |
|
||||
| AI生成初稿 | ✅ 已实现 | |
|
||||
| 人工修改 | ✅ 已实现 | |
|
||||
| 逐维度重新生成 | ✅ 已实现 | |
|
||||
| 快捷评语 | ✅ 已实现 | |
|
||||
|
||||
### 2.4 报告审核功能对比
|
||||
|
||||
| 需求功能 | 实现状态 | 问题说明 |
|
||||
|---------|---------|---------|
|
||||
| 提交审核 | ✅ 已实现 | |
|
||||
| 审核通过 | ✅ 已实现 | |
|
||||
| 审核退回 | ⚠️ **不完整** | 缺少结构化退回原因记录 |
|
||||
| 撤回报告 | ❌ **未实现** | 需求文档3.13.3明确要求 |
|
||||
| 退回后重新提交 | ✅ 已实现 | |
|
||||
|
||||
### 2.5 报告导出功能对比
|
||||
|
||||
| 需求功能 | 实现状态 | 问题说明 |
|
||||
|---------|---------|---------|
|
||||
| 导出Excel | ✅ 已实现 | |
|
||||
| 导出PDF | ❌ **未实现** | 需求文档3.9明确要求 |
|
||||
| 导出Word | ❌ **未实现** | 需求文档3.9明确要求 |
|
||||
| 批量导出 | ❌ **未实现** | 需求文档3.11.5明确要求 |
|
||||
| 批量打包下载 | ❌ **未实现** | 需求文档3.9.2明确要求 |
|
||||
|
||||
### 2.6 归档管理功能对比
|
||||
|
||||
| 需求功能 | 实现状态 | 问题说明 |
|
||||
|---------|---------|---------|
|
||||
| 报告归档 | ❌ **未实现** | 需求文档3.10明确要求 |
|
||||
| 归档查询 | ❌ **未实现** | |
|
||||
| 归档后不可修改 | ❌ **未实现** | |
|
||||
|
||||
### 2.7 版本管理功能对比
|
||||
|
||||
| 需求功能 | 实现状态 | 问题说明 |
|
||||
|---------|---------|---------|
|
||||
| 版本记录 | ✅ 已实现 | 表结构已创建 |
|
||||
| 版本查看 | ⚠️ 部分实现 | 仅存储,未实现查看功能 |
|
||||
| 版本对比 | ❌ **未实现** | 需求文档3.8.2明确要求 |
|
||||
| 版本回滚 | ❌ **未实现** | 需求文档3.8.2明确要求 |
|
||||
|
||||
---
|
||||
|
||||
## 三、交互逻辑问题清单
|
||||
|
||||
### 3.1 报告编号生成规则不一致
|
||||
|
||||
**问题描述**:
|
||||
- 需求规范:`RPT-{监区编码}-{年月}-{4位序号}` 示例:`RPT-JQ01-202601-0001`
|
||||
- 代码实现:`PGEV + yyyyMMdd + 6位序号` 示例:`PGEV20260118000001`
|
||||
|
||||
**影响**:报告编号不符合需求规范,无法直观识别监区信息
|
||||
|
||||
**建议修复**:
|
||||
```java
|
||||
// 建议改为:
|
||||
// 1. 获取罪犯所属监区编码
|
||||
// 2. 获取当前年月
|
||||
// 3. 查询当月该监区的最大序号
|
||||
// 4. 格式:RPT-{监区编码}-{年月}-{序号(4位)}
|
||||
```
|
||||
|
||||
### 3.2 审核退回流程不完整
|
||||
|
||||
**问题描述**:
|
||||
- 当前实现:仅记录 `audit_opinion` 文本字段
|
||||
- 需求要求:结构化记录退回原因、驳回时间、驳回人
|
||||
|
||||
**影响**:退回原因无法有效传达给起草人,缺少退回时间追溯
|
||||
|
||||
**建议修复**:
|
||||
```sql
|
||||
-- 增加字段
|
||||
ALTER TABLE prison_evaluation_report
|
||||
ADD COLUMN return_reason VARCHAR(500) COMMENT '退回原因',
|
||||
ADD COLUMN return_time DATETIME COMMENT '退回时间',
|
||||
ADD COLUMN return_by BIGINT COMMENT '退回人ID';
|
||||
```
|
||||
|
||||
### 3.3 缺少报告撤回功能
|
||||
|
||||
**问题描述**:
|
||||
- 需求文档3.13.3明确要求:待审核状态可撤回为草稿
|
||||
- 当前代码:没有撤回(Withdraw/Recall)相关接口
|
||||
|
||||
**影响**:提交审核后发现问题无法及时撤回修改
|
||||
|
||||
**建议新增接口**:
|
||||
```
|
||||
POST /prison/evaluation-report/report/withdraw
|
||||
参数:reportId
|
||||
前置条件:status = PENDING_AUDIT(2)
|
||||
后置条件:status = DRAFT(1)
|
||||
```
|
||||
|
||||
### 3.4 状态枚举定义不一致
|
||||
|
||||
**问题描述**:
|
||||
- 需求文档:草稿(1)、待审核(2)、已通过(3)、已退回(4)、已归档(5)
|
||||
- 代码实现:缺少"已归档"状态枚举
|
||||
|
||||
**影响**:归档功能无法正确实现状态流转
|
||||
|
||||
**建议修复**:在 `EvaluationReportStatusEnum` 中添加 `ARCHIVED(5, "已归档")`
|
||||
|
||||
### 3.5 维度类型定义不一致
|
||||
|
||||
**问题描述**:
|
||||
- 数据库表:1-基本信息, 2-犯罪情况, 3-服刑表现...
|
||||
- DO类定义:1-心理测评, 2-危险性评估, 3-改造表现...
|
||||
|
||||
**影响**:前后端数据交换可能出现类型映射错误
|
||||
|
||||
**建议修复**:统一枚举定义,确保DO类与数据库枚举值一致
|
||||
|
||||
---
|
||||
|
||||
## 四、功能设置问题清单
|
||||
|
||||
### 4.1 模板缺少"复制"功能
|
||||
|
||||
**问题描述**:需求要求支持复制模板快速创建,当前未实现
|
||||
|
||||
**业务场景**:
|
||||
- 管理员需要基于现有模板创建新版模板
|
||||
- 不同监区需要基于标准模板创建本地化版本
|
||||
|
||||
**建议实现**:
|
||||
```java
|
||||
@PostMapping("/template/copy")
|
||||
public CommonResult<Long> copyTemplate(@RequestParam("templateId") Long templateId) {
|
||||
// 1. 查询原模板
|
||||
// 2. 复制模板基础信息(名称加"副本"后缀)
|
||||
// 3. 复制所有维度配置
|
||||
// 4. 返回新模板ID
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 维度缺少"复制"功能
|
||||
|
||||
**问题描述**:需求要求支持复制维度快速创建,当前未实现
|
||||
|
||||
**业务场景**:
|
||||
- 类似维度需要微调配置
|
||||
- 跨模板复用维度配置
|
||||
|
||||
**建议实现**:
|
||||
```java
|
||||
@PostMapping("/dimension/copy")
|
||||
public CommonResult<Long> copyDimension(@RequestParam("dimensionId") Long dimensionId) {
|
||||
// 1. 查询原维度
|
||||
// 2. 复制维度配置(名称加"副本"后缀)
|
||||
// 3. 返回新维度ID
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 缺少批量生成报告功能
|
||||
|
||||
**问题描述**:需求要求支持选择多个罪犯+模板批量生成报告
|
||||
|
||||
**业务场景**:
|
||||
- 月末批量生成在押犯评估报告
|
||||
- 入监队批量生成新入监罪犯评估报告
|
||||
|
||||
**建议实现**:
|
||||
```java
|
||||
@PostMapping("/report/batch-generate")
|
||||
public CommonResult<List<Long>> batchGenerate(
|
||||
@RequestBody BatchGenerateReqVO vo) {
|
||||
// vo包含:prisonerIds, templateId, evaluationDate
|
||||
// 使用异步队列处理,返回任务ID
|
||||
}
|
||||
```
|
||||
|
||||
### 4.4 缺少归档管理功能
|
||||
|
||||
**问题描述**:需求要求已审核报告可归档,归档后不可修改
|
||||
|
||||
**建议实现**:
|
||||
```java
|
||||
@PostMapping("/report/archive")
|
||||
public CommonResult<Boolean> archive(@RequestParam("reportId") Long reportId);
|
||||
|
||||
@PostMapping("/report/unarchive")
|
||||
public CommonResult<Boolean> unarchive(@RequestParam("reportId") Long reportId);
|
||||
|
||||
@PostMapping("/report/archive-list")
|
||||
public CommonResult<Boolean> batchArchive(@RequestParam("reportIds") List<Long> reportIds);
|
||||
```
|
||||
|
||||
### 4.5 缺少版本对比和回滚功能
|
||||
|
||||
**问题描述**:需求要求支持版本对比和回滚
|
||||
|
||||
**建议实现**:
|
||||
```java
|
||||
// 版本对比
|
||||
@GetMapping("/report/version/compare")
|
||||
public CommonResult<VersionCompareRespVO> compareVersions(
|
||||
@RequestParam("reportId") Long reportId,
|
||||
@RequestParam("version1") Integer version1,
|
||||
@RequestParam("version2") Integer version2);
|
||||
|
||||
// 版本回滚
|
||||
@PostMapping("/report/version/rollback")
|
||||
public CommonResult<Boolean> rollback(
|
||||
@RequestParam("reportId") Long reportId,
|
||||
@RequestParam("targetVersion") Integer targetVersion);
|
||||
```
|
||||
|
||||
### 4.6 缺少PDF/Word导出功能
|
||||
|
||||
**问题描述**:需求要求支持PDF和Word格式导出
|
||||
|
||||
**建议实现**:
|
||||
```java
|
||||
@PostMapping("/report/export-pdf")
|
||||
public void exportPdf(@RequestParam("reportId") Long reportId, HttpServletResponse response);
|
||||
|
||||
@PostMapping("/report/export-word")
|
||||
public void exportWord(@RequestParam("reportId") Long reportId, HttpServletResponse response);
|
||||
|
||||
@PostMapping("/report/batch-export-zip")
|
||||
public void batchExportZip(@RequestBody List<Long> reportIds, HttpServletResponse response);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、性能与安全缺失项
|
||||
|
||||
### 5.1 缓存机制未实现
|
||||
|
||||
**需求要求**:
|
||||
- 罪犯基础信息缓存(5分钟过期)
|
||||
- 考核数据缓存(10分钟过期)
|
||||
- 模板配置缓存(1小时过期)
|
||||
|
||||
**当前状态**:未实现任何缓存
|
||||
|
||||
**建议实现**:
|
||||
```java
|
||||
@Cacheable(value = "prisoner", key = "#prisonerId", ttl = 5 * 60)
|
||||
public PrisonerDTO getPrisoner(Long prisonerId) { ... }
|
||||
|
||||
@Cacheable(value = "scoreData", key = "#prisonerId + ':' + #year", ttl = 10 * 60)
|
||||
public ScoreDTO getScoreData(Long prisonerId, Integer year) { ... }
|
||||
```
|
||||
|
||||
### 5.2 异步生成队列未实现
|
||||
|
||||
**需求要求**:
|
||||
- 批量生成使用异步队列
|
||||
- 支持队列状态查询
|
||||
- 失败重试(最多3次)
|
||||
- 生成完成通知
|
||||
|
||||
**当前状态**:同步调用LLM服务
|
||||
|
||||
**建议实现**:
|
||||
```java
|
||||
@Async("reportGenerateExecutor")
|
||||
public CompletableFuture<ReportGenerateResult> generateReportAsync(GenerateTask task) {
|
||||
// 调用LLM生成报告
|
||||
// 失败时重试3次
|
||||
// 完成后发送系统通知
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 AI服务降级未实现
|
||||
|
||||
**需求要求**:AI服务不可用时有降级策略
|
||||
|
||||
**当前状态**:仅检查LLM是否可用,无降级机制
|
||||
|
||||
**建议实现**:
|
||||
- 使用默认模板填充
|
||||
- 标记维度为"待人工填写"
|
||||
- 记录服务降级日志
|
||||
|
||||
---
|
||||
|
||||
## 六、前端交互问题
|
||||
|
||||
### 6.1 评估报告前端页面未完整实现
|
||||
|
||||
| 组件 | 状态 | 说明 |
|
||||
|-----|------|------|
|
||||
| 报告模板管理页 | ❌ 未实现 | 仅有API,无页面 |
|
||||
| 维度配置管理页 | ❌ 未实现 | 仅有API,无页面 |
|
||||
| 报告编辑页面 | ❌ 未实现 | 仅有API,无页面 |
|
||||
| 报告列表页 | ❌ 未实现 | 仅有API,无页面 |
|
||||
|
||||
### 6.2 前后端联调问题
|
||||
|
||||
**问题**:前端API已定义,但后端Controller路径不一致
|
||||
|
||||
**示例**:
|
||||
- 前端定义:`/prison/evaluation-report/template/page`
|
||||
- 后端实际:`/prison/evaluation-report/template/page` ✅ 一致
|
||||
|
||||
**但缺少以下前端页面**:
|
||||
- 模板列表/编辑页面
|
||||
- 维度配置页面
|
||||
- 报告编辑页面(左右分栏布局)
|
||||
- 报告预览/打印页面
|
||||
- 快捷评语管理页面
|
||||
|
||||
---
|
||||
|
||||
## 七、功能实现完成度汇总
|
||||
|
||||
| 功能模块 | 已实现 | 需完善 | 未实现 | 完成度 |
|
||||
|---------|-------|-------|-------|-------|
|
||||
| 模板管理 | 8项 | 1项 | 2项 | **75%** |
|
||||
| 维度管理 | 5项 | 0项 | 2项 | **71%** |
|
||||
| 报告创建 | 5项 | 1项 | 1项 | **79%** |
|
||||
| 报告审核 | 3项 | 1项 | 1项 | **60%** |
|
||||
| 报告导出 | 1项 | 0项 | 3项 | **25%** |
|
||||
| 归档管理 | 0项 | 0项 | 3项 | **0%** |
|
||||
| 版本管理 | 1项 | 1项 | 2项 | **33%** |
|
||||
| AI生成 | 3项 | 2项 | 2项 | **50%** |
|
||||
| 前端页面 | 0项 | 0项 | 5项 | **0%** |
|
||||
|
||||
**总体评估**:核心数据模型和API已实现,但前端页面缺失较多,高级功能(批量生成、归档、版本对比)未实现。
|
||||
|
||||
---
|
||||
|
||||
## 八、改进优先级建议
|
||||
|
||||
### P0 - 必须修复(影响核心流程)
|
||||
|
||||
1. **报告编号规则修复** - 符合需求规范
|
||||
2. **审核退回流程完善** - 结构化记录退回原因
|
||||
3. **添加报告撤回功能** - 支持待审核撤回
|
||||
4. **状态枚举补全** - 添加已归档状态
|
||||
|
||||
### P1 - 应该实现(影响用户体验)
|
||||
|
||||
5. **模板复制功能**
|
||||
6. **维度复制功能**
|
||||
7. **批量生成报告功能**
|
||||
8. **PDF/Word导出功能**
|
||||
9. **归档管理功能**
|
||||
10. **版本对比功能**
|
||||
|
||||
### P2 - 建议实现(提升体验)
|
||||
|
||||
11. **数据缓存机制**
|
||||
12. **异步生成队列**
|
||||
13. **AI服务降级**
|
||||
14. **前端页面完整实现**
|
||||
15. **维度拖拽排序前端**
|
||||
|
||||
---
|
||||
|
||||
## 九、待产品专家评审事项
|
||||
|
||||
### 9.1 业务流程问题
|
||||
|
||||
1. **批量生成场景确认**
|
||||
- 一次性最多生成多少个报告?
|
||||
- 是否需要显示生成进度?
|
||||
- 生成失败如何处理?
|
||||
|
||||
2. **审核退回流程确认**
|
||||
- 是否必须填写退回原因?
|
||||
- 退回原因是否需要分类?
|
||||
- 退回后是否需要通知起草人?
|
||||
|
||||
3. **归档策略确认**
|
||||
- 自动归档还是手动归档?
|
||||
- 归档后是否可导出?
|
||||
- 归档文件保留多长时间?
|
||||
|
||||
### 9.2 交互设计问题
|
||||
|
||||
1. **报告编辑页面布局**
|
||||
- 需求文档设计了左右分栏布局,是否认可?
|
||||
- 罪犯列表每页显示多少条?
|
||||
- 是否需要支持快捷键操作?
|
||||
|
||||
2. **版本对比界面**
|
||||
- 左右分屏对比是否足够?
|
||||
- 是否需要高亮显示差异?
|
||||
- 是否需要一键还原?
|
||||
|
||||
### 9.3 功能优先级确认
|
||||
|
||||
1. **第一阶段MVP功能范围**
|
||||
- 模板管理、维度配置
|
||||
- 报告创建、AI生成
|
||||
- 报告审核、Excel导出
|
||||
|
||||
2. **第二阶段功能范围**
|
||||
- 批量生成、PDF导出
|
||||
- 归档管理、版本对比
|
||||
|
||||
---
|
||||
|
||||
## 附录:关键文件清单
|
||||
|
||||
### 后端关键文件
|
||||
|
||||
| 文件路径 | 说明 |
|
||||
|---------|------|
|
||||
| `controller/admin/evaluationreport/EvaluationReportController.java` | 主控制器 |
|
||||
| `service/evaluationreport/EvaluationReportService.java` | 服务接口 |
|
||||
| `service/evaluationreport/impl/EvaluationReportServiceImpl.java` | 服务实现 |
|
||||
| `dal/dataobject/evaluationreport/EvaluationReportDO.java` | 报告实体 |
|
||||
| `dal/dataobject/evaluationreport/EvaluationDimensionDO.java` | 维度实体 |
|
||||
| `enums/EvaluationReportStatusEnum.java` | 状态枚举 |
|
||||
|
||||
### 前端关键文件
|
||||
|
||||
| 文件路径 | 说明 |
|
||||
|---------|------|
|
||||
| `api/prison/evaluation/index.ts` | API定义 |
|
||||
| `views/prison/riskassessment/index.vue` | 危险评估列表 |
|
||||
| `views/prison/score/index.vue` | 计分考核列表 |
|
||||
|
||||
### 数据库脚本
|
||||
|
||||
| 文件路径 | 说明 |
|
||||
|---------|------|
|
||||
| `sql/evaluation_report.sql` | 评估报告表结构 |
|
||||
| `sql/evaluation_report_dict_data.sql` | 字典数据 |
|
||||
|
||||
---
|
||||
|
||||
**报告生成时间**:2026-01-18
|
||||
**评估人**:Claude Code
|
||||
**版本**:v1.0
|
||||
126
requirements/需求-01-监管看板.md
Normal file
@ -0,0 +1,126 @@
|
||||
# 需求-01-监管看板
|
||||
|
||||
> 模块名称:监管看板
|
||||
> 优先级:P0
|
||||
> 预估工时:18h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
监管看板是系统的首页,为监狱管理者提供全局视角的数据概览,帮助快速掌握监狱运行状态。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 监狱长 | 作为监狱管理者,我希望在首页看到在册罪犯总数,这样我能快速了解监狱规模 | P0 |
|
||||
| 教导员 | 作为教导员,我希望看到不同年龄段罪犯的分布情况,这样我好制定针对性教育方案 | P0 |
|
||||
| 狱政科长 | 作为狱政科长,我希望看到不同刑期罪犯的占比,这样我能合理安排警力配置 | P0 |
|
||||
| 分管领导 | 作为分管领导,我希望看到各省籍贯分布热力图,这样我能了解罪犯构成特点 | P0 |
|
||||
| 管理员 | 作为系统管理员,我希望敏感信息自动脱敏显示,这样保护罪犯隐私 | P0 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 首页框架
|
||||
|
||||
**功能描述**:搭建监管看板的整体布局结构
|
||||
|
||||
**功能列表**:
|
||||
- 顶部导航菜单配置
|
||||
- 左侧侧边栏菜单
|
||||
- 主体内容区域布局
|
||||
- 响应式适配
|
||||
|
||||
### 3.2 核心指标卡片
|
||||
|
||||
**功能描述**:展示监狱关键数据的汇总卡片
|
||||
|
||||
**指标项**:
|
||||
|
||||
| 指标名称 | 数据来源 | 计算逻辑 | 展示形式 |
|
||||
|---------|---------|---------|---------|
|
||||
| 在册罪犯总数 | 罪犯表 | status=在押 count | 数字卡片 |
|
||||
| 本月已释放 | 释放记录 | 本月释放 count | 数字卡片 |
|
||||
| 本月已移交 | 移交记录 | 本月移交 count | 数字卡片 |
|
||||
| 当前就医人数 | 罪犯位置 | 在医院监区 count | 数字卡片 |
|
||||
| 当前禁闭人数 | 罪犯位置 | 在禁闭室 count | 数字卡片 |
|
||||
|
||||
### 3.3 年龄分布图表
|
||||
|
||||
**功能描述**:展示罪犯年龄结构分布
|
||||
|
||||
**展示要求**:
|
||||
- 使用 ECharts 饼图
|
||||
- 年龄分段:未成年(≤17)、青年(18-30)、中年(31-50)、老年(51-60)、老龄(60+)
|
||||
- 鼠标悬停显示具体人数和占比
|
||||
- 支持图例点击筛选
|
||||
|
||||
### 3.4 刑期分布图表
|
||||
|
||||
**功能描述**:展示罪犯刑期结构分布
|
||||
|
||||
**展示要求**:
|
||||
- 使用 ECharts 饼图
|
||||
- 刑期分段:短刑(≤3年)、中刑(3-10年)、长刑(10年以上)、无期、死缓
|
||||
- 颜色区分不同刑期类型
|
||||
|
||||
### 3.5 文化程度图表
|
||||
|
||||
**功能描述**:展示罪犯文化程度分布
|
||||
|
||||
**展示要求**:
|
||||
- 使用 ECharts 饼图
|
||||
- 学历分类:文盲、小学、初中、高中、中专、大专、本科、研究生及以上
|
||||
|
||||
### 3.6 省份分布地图
|
||||
|
||||
**功能描述**:使用热力图展示罪犯籍贯分布
|
||||
|
||||
**展示要求**:
|
||||
- 使用 ECharts 中国地图
|
||||
- 按省份着色,深度代表人数多少
|
||||
- 点击省份显示该省罪犯数量和占比
|
||||
|
||||
### 3.7 数据脱敏组件
|
||||
|
||||
**功能描述**:对敏感信息进行脱敏展示
|
||||
|
||||
**脱敏规则**:
|
||||
|
||||
| 字段 | 脱敏规则 | 示例 |
|
||||
|-----|---------|-----|
|
||||
| 身份证号 | 保留前3后4位,中间用*替代 | 110***********1234 |
|
||||
| 手机号 | 保留前3后4位,中间用*替代 | 138****5678 |
|
||||
| 家庭住址 | 详细地址只显示到区县 | 北京市朝阳区*** |
|
||||
| 姓名 | 只显示第一个字 | 张** |
|
||||
|
||||
## 四、非功能需求
|
||||
|
||||
### 4.1 性能需求
|
||||
- 页面加载时间 < 3秒
|
||||
- 图表渲染时间 < 1秒
|
||||
|
||||
### 4.2 安全需求
|
||||
- 敏感数据脱敏展示
|
||||
- 数据权限控制(按监区/分监区)
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 核心指标卡片数据准确
|
||||
- [ ] 年龄分布饼图展示正常,交互正常
|
||||
- [ ] 刑期分布饼图展示正常
|
||||
- [ ] 文化程度饼图展示正常
|
||||
- [ ] 中国地图热力图正常显示
|
||||
- [ ] 敏感信息自动脱敏
|
||||
- [ ] 页面响应式适配正常
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:狱政信息管理模块(罪犯数据)
|
||||
- 依赖:系统管理模块(用户权限)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
247
requirements/需求-02-狱政信息管理.md
Normal file
@ -0,0 +1,247 @@
|
||||
# 需求-02-狱政信息管理
|
||||
|
||||
> 模块名称:狱政信息管理
|
||||
> 优先级:P0
|
||||
> 预估工时:24h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
狱政信息管理是监狱管理的核心模块,实现罪犯从入监到出监的全生命周期管理。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 狱政干事 | 作为狱政干事,我希望能够登记新入监罪犯的信息,这样罪犯才能正式纳入管理 | P0 |
|
||||
| 狱政科长 | 作为狱政科长,我希望能够查询所有罪犯信息,这样我好掌握整体情况 | P0 |
|
||||
| 分监区长 | 作为分监区长,我希望能够查询本分监区的罪犯,这样我能快速找到目标罪犯 | P0 |
|
||||
| 狱政干事 | 作为狱政干事,我希望能够修改罪犯信息,这样保证信息准确 | P1 |
|
||||
| 狱政干事 | 作为狱政干事,我希望能够登记罪犯释放信息,这样业务流程完整 | P0 |
|
||||
| 狱政干事 | 作为狱政干事,我希望能够登记罪犯调监信息,这样追踪罪犯位置变更 | P0 |
|
||||
| 管理员 | 作为管理员,我希望能够批量导入导出罪犯数据,这样提高工作效率 | P1 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 罪犯信息管理
|
||||
|
||||
#### 3.1.1 入监登记
|
||||
|
||||
**功能描述**:登记新入监罪犯的基础信息
|
||||
|
||||
**表单字段**:
|
||||
|
||||
| 字段分组 | 字段名称 | 必填 | 说明 |
|
||||
|---------|---------|-----|------|
|
||||
| **基础信息** | 罪犯编号 | 是 | 系统自动生成或手动录入 |
|
||||
| | 姓名 | 是 | 罪犯真实姓名 |
|
||||
| | 性别 | 是 | 男/女 |
|
||||
| | 身份证号 | 是 | 18位身份证号码 |
|
||||
| | 出生日期 | 是 | 由身份证号解析或手动填写 |
|
||||
| | 民族 | 否 | 民族选择 |
|
||||
| | 籍贯 | 否 | 省市区三级联 |
|
||||
| | 文化程度 | 否 | 文盲/小学/初中/高中/大专/本科及以上 |
|
||||
| | 职业 | 否 | 捕前职业 |
|
||||
| | 家庭住址 | 否 | 详细地址 |
|
||||
| **刑罚信息** | 罪名 | 是 | 罪名选择或输入 |
|
||||
| | 刑期-年 | 是 | 数字输入 |
|
||||
| | 刑期-月 | 是 | 0-11数字输入 |
|
||||
| | 是否无期 | 是 | 是/否 |
|
||||
| | 是否死缓 | 是 | 是/否 |
|
||||
| | 判决法院 | 否 | 判决法院名称 |
|
||||
| | 判决日期 | 是 | 日期选择 |
|
||||
| | 判决书编号 | 否 | 判决书文号 |
|
||||
| | 原判刑期 | 否 | 原判刑期描述 |
|
||||
| | 入狱日期 | 是 | 日期选择 |
|
||||
| | 释放日期 | 是 | 根据刑期自动计算或手动调整 |
|
||||
| **监管信息** | 监管等级 | 是 | 宽管/普管/严管/考察 |
|
||||
| | 风险等级 | 是 | 高风险/中风险/低风险 |
|
||||
| | 监区 | 是 | 选择监区 |
|
||||
| | 分监区 | 是 | 根据监区联动显示 |
|
||||
| | 监室 | 是 | 根据分监区联动显示 |
|
||||
| | 状态 | 是 | 默认可选:在押 |
|
||||
|
||||
**业务规则**:
|
||||
- 释放日期 = 入狱日期 + 刑期(需考虑减刑情况)
|
||||
- 身份证号需校验格式
|
||||
- 编号需唯一
|
||||
|
||||
#### 3.1.2 罪犯列表
|
||||
|
||||
**功能描述**:查询和展示罪犯列表
|
||||
|
||||
**列表字段**:
|
||||
- 罪犯编号、姓名、性别、身份证号(脱敏)
|
||||
- 罪名、刑期、入狱日期
|
||||
- 监管等级、风险等级
|
||||
- 当前监区、当前监室
|
||||
- 状态、创建时间
|
||||
|
||||
**筛选条件**:
|
||||
- 罪犯编号(模糊搜索)
|
||||
- 姓名(模糊搜索)
|
||||
- 性别(下拉选择)
|
||||
- 罪名(下拉选择)
|
||||
- 监管等级(下拉选择)
|
||||
- 风险等级(下拉选择)
|
||||
- 监区(下拉选择)
|
||||
- 状态(下拉选择)
|
||||
- 入狱日期范围(日期区间)
|
||||
|
||||
**操作功能**:
|
||||
- 查看详情
|
||||
- 修改信息
|
||||
- 删除(逻辑删除)
|
||||
- 批量删除
|
||||
- 导出Excel
|
||||
|
||||
#### 3.1.3 罪犯详情
|
||||
|
||||
**功能描述**:查看罪犯详细信息
|
||||
|
||||
**展示内容**:
|
||||
- 基础信息卡片
|
||||
- 刑罚信息卡片
|
||||
- 监管信息卡片
|
||||
- 位置变更历史
|
||||
- 考核记录汇总
|
||||
- 测评记录汇总
|
||||
- 消费记录汇总
|
||||
|
||||
#### 3.1.4 罪犯信息修改
|
||||
|
||||
**功能描述**:修改罪犯信息
|
||||
|
||||
**规则**:
|
||||
- 部分字段修改需要审批(如刑期变更)
|
||||
- 修改记录需要留痕
|
||||
|
||||
### 3.2 出监管理
|
||||
|
||||
#### 3.2.1 释放登记
|
||||
|
||||
**功能描述**:登记罪犯释放信息
|
||||
|
||||
**释放类型**:
|
||||
- 刑满释放
|
||||
- 假释
|
||||
- 暂予监外执行
|
||||
- 减刑
|
||||
- 法院裁定释放
|
||||
- 死亡
|
||||
- 其他
|
||||
|
||||
**表单字段**:
|
||||
- 罪犯选择(从列表选择或搜索)
|
||||
- 释放类型
|
||||
- 释放原因
|
||||
- 实际释放日期
|
||||
- 释放凭证(文书编号等)
|
||||
- 交接人信息
|
||||
- 备注
|
||||
|
||||
**业务流程**:
|
||||
1. 选择或搜索罪犯
|
||||
2. 填写释放信息
|
||||
3. 提交审核
|
||||
4. 审核通过后更新罪犯状态为"已释放"
|
||||
5. 记录释放日志
|
||||
|
||||
#### 3.2.2 移交登记
|
||||
|
||||
**功能描述**:登记罪犯转监/移交信息
|
||||
|
||||
**表单字段**:
|
||||
- 罪犯选择
|
||||
- 移交类型(转入/转出)
|
||||
- 目标监狱
|
||||
- 移交原因
|
||||
- 移交日期
|
||||
- 交接人信息
|
||||
|
||||
### 3.3 调监管理
|
||||
|
||||
#### 3.3.1 调监操作
|
||||
|
||||
**功能描述**:罪犯在监区/监室间的调换
|
||||
|
||||
**表单字段**:
|
||||
- 罪犯选择
|
||||
- 目标监区
|
||||
- 目标分监区
|
||||
- 目标监室
|
||||
- 调监原因
|
||||
|
||||
**业务规则**:
|
||||
- 目标监室床位未满
|
||||
- 严管级罪犯不能调入普通监区
|
||||
- 调监后自动同步人数
|
||||
|
||||
#### 3.3.2 位置历史
|
||||
|
||||
**功能描述**:查看罪犯位置变更历史
|
||||
|
||||
**展示内容**:
|
||||
- 时间线展示位置变更记录
|
||||
- 包含:变更时间、原位置、新位置、变更原因、操作人
|
||||
|
||||
### 3.4 批量操作
|
||||
|
||||
#### 3.4.1 批量导入
|
||||
|
||||
**功能描述**:通过Excel批量导入罪犯信息
|
||||
|
||||
**要求**:
|
||||
- 提供导入模板下载
|
||||
- 支持数据校验
|
||||
- 显示导入结果(成功/失败数量)
|
||||
- 失败记录提供下载
|
||||
|
||||
#### 3.4.2 批量导出
|
||||
|
||||
**功能描述**:导出罪犯列表
|
||||
|
||||
**要求**:
|
||||
- 支持按条件筛选后导出
|
||||
- 支持导出全部
|
||||
- 敏感字段自动脱敏
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 罪犯编号全局唯一 |
|
||||
| BR-002 | 身份证号需符合18位校验规则 |
|
||||
| BR-003 | 释放日期根据入狱日期和刑期自动计算 |
|
||||
| BR-004 | 调监时目标监室人数不能超过床位数 |
|
||||
| BR-005 | 严管级罪犯只能分配在严管监区 |
|
||||
| BR-006 | 敏感信息在列表页脱敏展示 |
|
||||
| BR-007 | 罪犯状态变更需要记录变更日志 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持入监登记,信息完整
|
||||
- [ ] 支持罪犯列表查询和筛选
|
||||
- [ ] 支持查看罪犯详情
|
||||
- [ ] 支持修改罪犯信息
|
||||
- [ ] 支持释放登记
|
||||
- [ ] 支持移交登记
|
||||
- [ ] 支持调监操作
|
||||
- [ ] 支持查看位置历史
|
||||
- [ ] 支持批量导入导出
|
||||
- [ ] 敏感信息自动脱敏
|
||||
- [ ] 数据权限控制(按监区)
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:监区管理模块(获取监区/监室列表)
|
||||
- 依赖:字典管理模块(获取选项数据)
|
||||
- 被依赖:计分考核模块(获取罪犯信息)
|
||||
- 被依赖:测评管理模块(获取罪犯信息)
|
||||
- 被依赖:消费管理模块(获取罪犯信息)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
231
requirements/需求-03-计分考核.md
Normal file
@ -0,0 +1,231 @@
|
||||
# 需求-03-计分考核
|
||||
|
||||
> 模块名称:计分考核
|
||||
> 优先级:P0
|
||||
> 预估工时:24h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
计分考核是监狱对罪犯进行日常管理和改造评价的核心手段,直接关系到罪犯的减刑、假释等处遇变更。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 分监区长 | 作为分监区长,我希望配置考核规则,这样考核标准统一明确 | P0 |
|
||||
| 考核干事 | 作为考核干事,我希望每天记录罪犯的考核得分,这样客观评价罪犯表现 | P0 |
|
||||
| 考核干事 | 作为考核干事,我希望自动计算月度总分,这样减少人工计算工作量 | P0 |
|
||||
| 监狱长 | 作为监狱长,我希望查看考核等级评定结果,这样为减刑假释提供依据 | P0 |
|
||||
| 罪犯 | 作为罪犯,我希望看到自己的考核得分和等级,这样我知道自己的改造表现 | P1 |
|
||||
| 考核干事 | 作为考核干事,我希望考核结果公示,这样增加透明度 | P1 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 考核规则配置
|
||||
|
||||
#### 3.1.1 规则分类
|
||||
|
||||
**考核类别**:
|
||||
- 劳动改造
|
||||
- 教育改造
|
||||
- 日常行为
|
||||
- 卫生纪律
|
||||
- 加分项
|
||||
- 扣分项
|
||||
|
||||
#### 3.1.2 规则管理
|
||||
|
||||
**规则字段**:
|
||||
- 规则编码(唯一)
|
||||
- 规则名称
|
||||
- 所属类别
|
||||
- 分值(正数为加分,负数为扣分)
|
||||
- 日最高分限制
|
||||
- 月最高分限制
|
||||
- 规则说明
|
||||
- 状态(启用/禁用)
|
||||
- 排序
|
||||
|
||||
**示例规则**:
|
||||
|
||||
| 类别 | 规则名称 | 分值 | 日限 | 月限 |
|
||||
|-----|---------|-----|-----|-----|
|
||||
| 劳动改造 | 超额完成生产任务 | +2 | 5 | 30 |
|
||||
| 劳动改造 | 完成生产任务 | +1 | 3 | 20 |
|
||||
| 教育改造 | 参加义务劳动 | +1 | 2 | 10 |
|
||||
| 教育改造 | 考试合格 | +1 | 3 | 15 |
|
||||
| 日常行为 | 获得表扬 | +2 | 5 | 20 |
|
||||
| 日常行为 | 主动报告隐患 | +1 | 2 | 10 |
|
||||
| 卫生纪律 | 内务不整洁 | -0.5 | -3 | -10 |
|
||||
| 卫生纪律 | 违规吸烟 | -2 | -5 | -20 |
|
||||
| 扣分项 | 打架斗殴 | -5 | -10 | -30 |
|
||||
| 扣分项 | 私藏违禁品 | -10 | -20 | -50 |
|
||||
|
||||
### 3.2 日常考核记录
|
||||
|
||||
#### 3.2.1 考核录入
|
||||
|
||||
**功能描述**:为罪犯录入日常考核得分
|
||||
|
||||
**表单字段**:
|
||||
- 考核日期(默认当天,可修改)
|
||||
- 罪犯选择(支持批量选择)
|
||||
- 考核规则(从规则库选择)
|
||||
- 得分(根据规则自动带出,可调整)
|
||||
- 备注说明
|
||||
|
||||
**业务流程**:
|
||||
1. 选择考核日期
|
||||
2. 选择罪犯(支持搜索、分监区筛选)
|
||||
3. 选择考核规则
|
||||
4. 系统自动带出规则分值
|
||||
5. 填写备注
|
||||
6. 提交保存
|
||||
|
||||
#### 3.2.2 考核查询
|
||||
|
||||
**功能描述**:查询日常考核记录
|
||||
|
||||
**列表字段**:
|
||||
- 考核日期
|
||||
- 罪犯编号、姓名
|
||||
- 监区/分监区
|
||||
- 考核类别
|
||||
- 规则名称
|
||||
- 得分
|
||||
- 记录人
|
||||
- 操作时间
|
||||
|
||||
**筛选条件**:
|
||||
- 考核日期范围
|
||||
- 罪犯姓名/编号
|
||||
- 监区/分监区
|
||||
- 考核类别
|
||||
- 规则名称
|
||||
|
||||
### 3.3 月度考核汇总
|
||||
|
||||
#### 3.3.1 自动计算
|
||||
|
||||
**功能描述**:每月自动汇总罪犯考核得分
|
||||
|
||||
**计算逻辑**:
|
||||
```
|
||||
月度总分 = 基础分 + 当月加分累计 - 当月扣分累计
|
||||
```
|
||||
|
||||
**基础分**:
|
||||
- 默认100分(可配置)
|
||||
|
||||
**计算规则**:
|
||||
- 每日考核得分累加
|
||||
- 超过日限的按日限计算
|
||||
- 超过月限的按月限计算
|
||||
|
||||
#### 3.3.2 等级评定
|
||||
|
||||
**功能描述**:根据月度总分评定考核等级
|
||||
|
||||
**评定标准**(示例,可配置):
|
||||
|
||||
| 等级 | 分值范围 | 说明 |
|
||||
|-----|---------|-----|
|
||||
| 优秀 | ≥120分 | 表现突出 |
|
||||
| 良好 | 100-119分 | 表现良好 |
|
||||
| 合格 | 80-99分 | 表现一般 |
|
||||
| 不合格 | <80分 | 表现较差 |
|
||||
|
||||
#### 3.3.3 月度汇总展示
|
||||
|
||||
**展示内容**:
|
||||
- 罪犯基础信息
|
||||
- 基础分
|
||||
- 加分合计
|
||||
- 扣分合计
|
||||
- 月度总分
|
||||
- 考核等级
|
||||
- 考核人
|
||||
- 审核状态
|
||||
|
||||
**操作功能**:
|
||||
- 查看明细
|
||||
- 导出报表
|
||||
- 提交审核
|
||||
|
||||
### 3.4 考核公示
|
||||
|
||||
#### 3.4.1 公示发布
|
||||
|
||||
**功能描述**:发布考核结果供罪犯查看
|
||||
|
||||
**公示内容**:
|
||||
- 公示期间
|
||||
- 公示范围(全狱/指定监区)
|
||||
- 考核结果列表
|
||||
|
||||
#### 3.4.2 罪犯查询
|
||||
|
||||
**功能描述**:罪犯查询自己的考核结果
|
||||
|
||||
**展示内容**:
|
||||
- 本月得分明细
|
||||
- 本月总分
|
||||
- 考核等级
|
||||
- 与上月对比
|
||||
|
||||
### 3.5 减刑假释关联
|
||||
|
||||
#### 3.5.1 考核数据提取
|
||||
|
||||
**功能描述**:提取用于减刑假释的考核数据
|
||||
|
||||
**提取内容**:
|
||||
- 近6个月/月度考核得分
|
||||
- 年度累计考核分
|
||||
- 表扬次数
|
||||
- 警告次数
|
||||
- 等级评定记录
|
||||
|
||||
#### 3.5.2 建议生成
|
||||
|
||||
**功能描述**:根据考核数据生成减刑假释建议
|
||||
|
||||
**建议内容**:
|
||||
- 可申报减刑月份
|
||||
- 建议减刑幅度
|
||||
- 建议假释意见
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 每日考核分值不能超过日最高分限制 |
|
||||
| BR-002 | 每月考核分值不能超过月最高分限制 |
|
||||
| BR-003 | 考核等级根据配置的标准自动评定 |
|
||||
| BR-004 | 月度汇总每月1日自动计算 |
|
||||
| BR-005 | 考核结果公示后才能生效 |
|
||||
| BR-006 | 不合格等级达到一定次数触发严管 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持考核规则的增删改查
|
||||
- [ ] 支持日常考核录入(单条/批量)
|
||||
- [ ] 支持日常考核查询
|
||||
- [ ] 支持月度考核自动汇总计算
|
||||
- [ ] 支持考核等级评定
|
||||
- [ ] 支持考核结果公示
|
||||
- [ ] 支持减刑假释数据提取
|
||||
- [ ] 考核数据与罪犯信息联动
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:狱政信息管理模块(罪犯基础数据)
|
||||
- 依赖:监区管理模块(获取监区结构)
|
||||
- 被依赖:评估报告模块(考核数据引用)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
228
requirements/需求-04-测评问卷管理.md
Normal file
@ -0,0 +1,228 @@
|
||||
# 需求-04-测评问卷管理
|
||||
|
||||
> 模块名称:测评问卷管理
|
||||
> 优先级:P0
|
||||
> 预估工时:40h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
测评问卷用于对罪犯进行心理测评、风险评估等,是了解罪犯心理状态和制定管理方案的重要工具。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 教育科长 | 作为教育科长,我希望创建不同类型的测评问卷,这样满足不同测评需求 | P0 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望编辑问卷题目,这样问卷内容符合测评目标 | P0 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望设置题目分值,这样自动计算测评得分 | P0 |
|
||||
| 教育科长 | 作为教育科长,我希望发布和下架问卷,这样控制问卷可用状态 | P0 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望预览问卷效果,这样发布前检查问卷内容 | P0 |
|
||||
| 管理员 | 作为管理员,我希望复制已有问卷,这样快速创建相似问卷 | P1 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 问卷分类管理
|
||||
|
||||
#### 3.1.1 分类列表
|
||||
|
||||
**分类类型**:
|
||||
- 心理测评
|
||||
- 风险评估
|
||||
- 日常调查
|
||||
- 入监测评
|
||||
- 出监测评
|
||||
|
||||
#### 3.1.2 分类管理
|
||||
|
||||
**功能**:
|
||||
- 新增分类
|
||||
- 修改分类
|
||||
- 删除分类(无问卷时可删)
|
||||
- 查看分类下的问卷数量
|
||||
|
||||
### 3.2 问卷管理
|
||||
|
||||
#### 3.2.1 问卷列表
|
||||
|
||||
**列表字段**:
|
||||
- 问卷标题
|
||||
- 所属分类
|
||||
- 题目数量
|
||||
- 总分值
|
||||
- 时限(分钟)
|
||||
- 状态(草稿/已发布/已下架)
|
||||
- 创建人
|
||||
- 创建时间
|
||||
- 发布时间
|
||||
|
||||
**筛选条件**:
|
||||
- 分类筛选
|
||||
- 状态筛选
|
||||
- 标题搜索
|
||||
- 创建时间范围
|
||||
|
||||
#### 3.2.2 创建问卷
|
||||
|
||||
**问卷属性**:
|
||||
- 问卷标题(必填)
|
||||
- 所属分类(必选)
|
||||
- 问卷描述(可选)
|
||||
- 时限(分钟,0表示不限时)
|
||||
- 及格分数(可选)
|
||||
- 是否允许重考(是/否)
|
||||
- 状态(默认草稿)
|
||||
|
||||
#### 3.2.3 编辑问卷
|
||||
|
||||
**功能描述**:修改问卷内容
|
||||
|
||||
**可编辑项**:
|
||||
- 问卷属性
|
||||
- 题目内容
|
||||
- 题目顺序
|
||||
- 题目分值
|
||||
|
||||
**限制**:
|
||||
- 已发布的问卷不能直接修改
|
||||
- 如需修改应先下架
|
||||
|
||||
#### 3.2.4 问卷预览
|
||||
|
||||
**功能描述**:预览问卷效果
|
||||
|
||||
**预览内容**:
|
||||
- 问卷标题和描述
|
||||
- 题目列表(按顺序)
|
||||
- 题目类型和选项
|
||||
- 分值显示
|
||||
- 预计完成时间
|
||||
|
||||
#### 3.2.5 发布/下架
|
||||
|
||||
**发布操作**:
|
||||
- 状态从"草稿"变为"已发布"
|
||||
- 记录发布时间
|
||||
- 问卷可用于测评
|
||||
|
||||
**下架操作**:
|
||||
- 状态从"已发布"变为"已下架"
|
||||
- 下架后不可用于新测评
|
||||
- 历史测评记录保留
|
||||
|
||||
#### 3.2.6 问卷复制
|
||||
|
||||
**功能描述**:创建问卷副本
|
||||
|
||||
**复制内容**:
|
||||
- 问卷属性
|
||||
- 所有题目(含选项)
|
||||
|
||||
**复制后**:
|
||||
- 新问卷状态为"草稿"
|
||||
- 标题自动添加"副本"标识
|
||||
|
||||
### 3.3 题目管理
|
||||
|
||||
#### 3.3.1 题目类型
|
||||
|
||||
| 类型 | 说明 | 评分方式 |
|
||||
|-----|------|---------|
|
||||
| 单选题 | 从多个选项中选择一个 | 固定分值 |
|
||||
| 多选题 | 从多个选项中选择多个 | 按选项得分累加 |
|
||||
| 判断题 | 判断对错 | 固定分值 |
|
||||
| 填空题 | 输入文字答案 | 需人工评分 |
|
||||
| 简述题 | 输入大段文字 | 需人工评分 |
|
||||
| 评分题 | 选择分数等级 | 固定分值 |
|
||||
|
||||
#### 3.3.2 题目编辑
|
||||
|
||||
**题目属性**:
|
||||
- 题目内容(必填)
|
||||
- 题目类型(必选)
|
||||
- 题目分值(必填)
|
||||
- 是否必答(是/否)
|
||||
- 排序序号
|
||||
|
||||
**选项管理(单选/多选/判断)**:
|
||||
- 选项内容
|
||||
- 选项分值
|
||||
- 是否正确答案(用于自动评分)
|
||||
|
||||
**示例 - 单选题**:
|
||||
```
|
||||
题目:您最近一周的情绪状态如何?
|
||||
分值:5分
|
||||
|
||||
选项:
|
||||
A. 心情愉快 (+5分)
|
||||
B. 心情一般 (+2分)
|
||||
C. 心情低落 (0分)
|
||||
D. 情绪低落 (-2分)
|
||||
```
|
||||
|
||||
#### 3.3.3 题目排序
|
||||
|
||||
**功能**:拖拽调整题目顺序
|
||||
|
||||
**说明**:
|
||||
- 序号根据排序自动生成
|
||||
- 保存后生效
|
||||
|
||||
#### 3.3.4 题目分值设置
|
||||
|
||||
**功能**:配置每题分值
|
||||
|
||||
**规则**:
|
||||
- 客观题(单选/多选/判断/评分)可直接设置选项得分
|
||||
- 主观题(填空/简述)需人工评分
|
||||
|
||||
### 3.4 问卷发布流程
|
||||
|
||||
```
|
||||
草稿 → 内容审核 → 发布 → 测评执行 → 下架 → 归档
|
||||
```
|
||||
|
||||
**审核节点(可选)**:
|
||||
- 发布前增加审核环节
|
||||
- 审核人可退回或通过
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 问卷标题在同一分类下必须唯一 |
|
||||
| BR-002 | 已发布的问卷不能直接修改内容 |
|
||||
| BR-003 | 问卷下架后不能再发起新测评 |
|
||||
| BR-004 | 客观题支持自动评分,主观题需人工评分 |
|
||||
| BR-005 | 超过时限自动提交(限时的问卷) |
|
||||
| BR-006 | 不允许重考的问卷,一个罪犯只能答一次 |
|
||||
| BR-007 | 题目顺序影响试卷展示顺序 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持问卷分类管理
|
||||
- [ ] 支持问卷的增删改查
|
||||
- [ ] 支持问卷预览
|
||||
- [ ] 支持问卷发布和下架
|
||||
- [ ] 支持问卷复制
|
||||
- [ ] 支持单选题编辑
|
||||
- [ ] 支持多选题编辑
|
||||
- [ ] 支持判断题编辑
|
||||
- [ ] 支持填空题编辑
|
||||
- [ ] 支持简述题编辑
|
||||
- [ ] 支持评分题编辑
|
||||
- [ ] 支持题目排序
|
||||
- [ ] 支持题目分值设置
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:测评执行模块(使用问卷)
|
||||
- 依赖:测评结果模块(存储答卷)
|
||||
- 被依赖:危险评估模块(可引用问卷)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
248
requirements/需求-05-测评执行与评分.md
Normal file
@ -0,0 +1,248 @@
|
||||
# 需求-05-测评执行与评分
|
||||
|
||||
> 模块名称:测评执行与评分
|
||||
> 优先级:P0
|
||||
> 预估工时:24h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
测评执行是罪犯在线完成测评问卷的过程,系统需要提供良好的答题体验并确保测评数据的完整性和准确性。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 心理辅导员 | 作为心理辅导员,我希望罪犯在线完成测评问卷,这样方便快捷 | P0 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望自动计算客观题得分,这样提高工作效率 | P0 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望查看测评结果,这样分析罪犯心理状态 | P0 |
|
||||
| 教育科长 | 作为教育科长,我希望统计分析测评数据,这样了解整体情况 | P1 |
|
||||
| 罪犯 | 作为罪犯,我希望能够完成测评,这样接受心理评估 | P0 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 在线测评
|
||||
|
||||
#### 3.1.1 发起测评
|
||||
|
||||
**功能描述**:为罪犯发起测评任务
|
||||
|
||||
**发起方式**:
|
||||
- 单个发起:选择罪犯 + 选择问卷
|
||||
- 批量发起:选择多个罪犯 + 选择问卷
|
||||
- 按监区发起:选择监区 + 选择问卷
|
||||
|
||||
**表单字段**:
|
||||
- 罪犯选择(支持搜索、筛选)
|
||||
- 问卷选择(根据测评类型筛选)
|
||||
- 测评说明(可选)
|
||||
- 截止日期(可选)
|
||||
|
||||
**校验规则**:
|
||||
- 罪犯状态必须为"在押"
|
||||
- 问卷状态必须为"已发布"
|
||||
- 不可重复测评的问卷需要检查是否已测评
|
||||
|
||||
#### 3.1.2 答题界面
|
||||
|
||||
**页面布局**:
|
||||
- 顶部:问卷标题、剩余时间(限时问卷)
|
||||
- 左侧:题目导航(序号标识)
|
||||
- 主体:当前题目内容
|
||||
- 底部:上一题、下一题、提交按钮
|
||||
|
||||
**题目展示**:
|
||||
- 显示题目序号和内容
|
||||
- 显示题目分值
|
||||
- 显示是否必答
|
||||
- 显示选项或输入框
|
||||
- 显示已选/已答状态
|
||||
|
||||
**交互功能**:
|
||||
- 选项点击选择/取消
|
||||
- 填空输入
|
||||
- 简述输入
|
||||
- 上一题/下一题切换
|
||||
- 题目导航快速跳转
|
||||
- 剩余时间倒计时
|
||||
|
||||
**时限处理**:
|
||||
- 限时问卷显示倒计时
|
||||
- 时间到自动提交
|
||||
- 超时未提交的题目按0分计
|
||||
|
||||
#### 3.1.3 提交答卷
|
||||
|
||||
**提交方式**:
|
||||
- 手动提交:点击提交按钮
|
||||
- 自动提交:时间到自动提交
|
||||
|
||||
**提交确认**:
|
||||
- 提交前提示未答题数量
|
||||
- 支持返回修改或确认提交
|
||||
|
||||
**提交后**:
|
||||
- 客观题自动计算得分
|
||||
- 生成测评记录
|
||||
- 跳转到完成页面
|
||||
|
||||
### 3.2 答题记录
|
||||
|
||||
#### 3.2.1 记录查询
|
||||
|
||||
**查询条件**:
|
||||
- 罪犯姓名/编号
|
||||
- 问卷名称
|
||||
- 测评时间范围
|
||||
- 状态(待评估/已完成)
|
||||
|
||||
**列表字段**:
|
||||
- 测评记录ID
|
||||
- 罪犯编号、姓名
|
||||
- 问卷标题
|
||||
- 测评时间
|
||||
- 得分
|
||||
- 评估结果
|
||||
- 状态
|
||||
- 操作
|
||||
|
||||
#### 3.2.2 记录详情
|
||||
|
||||
**展示内容**:
|
||||
- 罪犯信息
|
||||
- 问卷信息
|
||||
- 测评时间
|
||||
- 得分详情(每题得分)
|
||||
- 总分
|
||||
- 评估结果
|
||||
|
||||
**答卷内容**:
|
||||
- 显示所有题目和答案
|
||||
- 客观题显示标准答案
|
||||
- 主观题显示作答内容
|
||||
|
||||
### 3.3 自动评分
|
||||
|
||||
#### 3.3.1 评分规则
|
||||
|
||||
**客观题评分**:
|
||||
- 单选题:选择正确答案得满分,否则得0分
|
||||
- 多选题:每个正确选项得相应分值,错误选项扣分
|
||||
- 判断题:正确得满分,错误得0分
|
||||
- 评分题:按选择分值计算
|
||||
|
||||
**主观题评分**:
|
||||
- 填空题:需人工评分
|
||||
- 简述题:需人工评分
|
||||
|
||||
#### 3.3.2 结果生成
|
||||
|
||||
**总分计算**:
|
||||
```
|
||||
总分 = 客观题得分 + 主观题得分
|
||||
```
|
||||
|
||||
**评估结果**:
|
||||
- 及格/不及格(根据及格分数线判断)
|
||||
- 风险等级(根据测评类型和分数判断)
|
||||
- 测评建议(根据测评类型生成)
|
||||
|
||||
### 3.4 人工评分
|
||||
|
||||
#### 3.4.1 待评分列表
|
||||
|
||||
**功能描述**:显示需要人工评分的答卷
|
||||
|
||||
**筛选条件**:
|
||||
- 测评时间范围
|
||||
- 问卷类型
|
||||
- 监区
|
||||
|
||||
**列表字段**:
|
||||
- 记录ID
|
||||
- 罪犯信息
|
||||
- 问卷名称
|
||||
- 客观题得分
|
||||
- 主观题数量
|
||||
- 待评分数
|
||||
|
||||
#### 3.4.2 主观题评分
|
||||
|
||||
**评分界面**:
|
||||
- 显示题目和作答内容
|
||||
- 输入分数
|
||||
- 填写评语(可选)
|
||||
|
||||
**提交后**:
|
||||
- 更新总分
|
||||
- 生成评估结果
|
||||
|
||||
### 3.5 测评统计分析
|
||||
|
||||
#### 3.5.1 完成率统计
|
||||
|
||||
**统计维度**:
|
||||
- 按问卷统计:各问卷的完成率
|
||||
- 按监区统计:各监区的完成率
|
||||
- 按时间统计:日/周/月完成数量
|
||||
|
||||
#### 3.5.2 分数分布统计
|
||||
|
||||
**统计维度**:
|
||||
- 按分数段统计人数(0-20, 21-40, 41-60, 61-80, 81-100)
|
||||
- 及格率统计
|
||||
- 平均分统计
|
||||
|
||||
#### 3.5.3 风险分布统计
|
||||
|
||||
**统计维度**:
|
||||
- 高风险人数和占比
|
||||
- 中风险人数和占比
|
||||
- 低风险人数和占比
|
||||
|
||||
#### 3.5.4 统计图表
|
||||
|
||||
**图表类型**:
|
||||
- 柱状图:完成数量趋势
|
||||
- 饼图:分数分布
|
||||
- 饼图:风险等级分布
|
||||
- 折线图:平均分趋势
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 限时问卷时间到自动提交 |
|
||||
| BR-002 | 不允许重考的问卷只能测评一次 |
|
||||
| BR-003 | 客观题自动评分,主观题需人工评分 |
|
||||
| BR-004 | 测评记录一旦生成不能删除 |
|
||||
| BR-005 | 测评过程中刷新页面保留已答题状态 |
|
||||
| BR-006 | 未登录状态下不能发起测评 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持单个发起测评
|
||||
- [ ] 支持批量发起测评
|
||||
- [ ] 支持按监区发起测评
|
||||
- [ ] 答题界面展示正确
|
||||
- [ ] 答题交互正常(上一题/下一题/导航)
|
||||
- [ ] 限时功能正常,时间到自动提交
|
||||
- [ ] 提交功能正常
|
||||
- [ ] 客观题自动评分正确
|
||||
- [ ] 支持人工评分主观题
|
||||
- [ ] 测评记录查询正常
|
||||
- [ ] 测评详情展示正确
|
||||
- [ ] 支持测评统计分析
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:测评问卷管理模块(获取问卷)
|
||||
- 依赖:狱政信息管理模块(获取罪犯列表)
|
||||
- 被依赖:危险评估模块(测评结果引用)
|
||||
- 被依赖:评估报告模块(测评数据引用)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
199
requirements/需求-06-狱情平台.md
Normal file
@ -0,0 +1,199 @@
|
||||
# 需求-06-狱情平台
|
||||
|
||||
> 模块名称:狱情平台
|
||||
> 优先级:P1
|
||||
> 预估工时:22h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
狱情平台用于记录和管理狱内发生的各类事件,支持狱情动态跟踪、预警信息管理和事件处理流程。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 狱政科长 | 作为狱政科长,我希望记录狱内发生的重要事件,这样留存管理痕迹 | P1 |
|
||||
| 分监区长 | 作为分监区长,我希望登记突发事件,这样及时上报 | P1 |
|
||||
| 监狱长 | 作为监狱长,我希望查看预警信息,这样及时掌握风险 | P1 |
|
||||
| 狱政干事 | 作为狱政干事,我希望跟踪事件处理进度,这样确保事件闭环 | P1 |
|
||||
| 管理员 | 作为管理员,我希望管理应急预案,这样突发事件有据可依 | P2 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 狱情动态记录
|
||||
|
||||
#### 3.1.1 事件登记
|
||||
|
||||
**事件类型**:
|
||||
- 监管事件(脱逃、行凶、违规等)
|
||||
- 安全事件(事故、隐患等)
|
||||
- 医疗事件(疾病、伤亡等)
|
||||
- 教育事件(冲突、思想动态等)
|
||||
- 其他事件
|
||||
|
||||
**表单字段**:
|
||||
- 事件标题
|
||||
- 事件类型(必选)
|
||||
- 发生时间(必填)
|
||||
- 发生地点(监区/分监区)
|
||||
- 涉及罪犯(可多选)
|
||||
- 事件描述(详细经过)
|
||||
- 事件等级(一般/较大/重大/特大)
|
||||
- 现场处置情况
|
||||
- 附件上传(照片、文件等)
|
||||
|
||||
#### 3.1.2 事件列表
|
||||
|
||||
**列表字段**:
|
||||
- 事件编号
|
||||
- 事件标题
|
||||
- 事件类型
|
||||
- 发生时间
|
||||
- 发生地点
|
||||
- 事件等级
|
||||
- 处理状态
|
||||
- 登记人
|
||||
- 登记时间
|
||||
|
||||
**筛选条件**:
|
||||
- 事件类型
|
||||
- 发生时间范围
|
||||
- 事件等级
|
||||
- 处理状态
|
||||
- 发生地点
|
||||
|
||||
#### 3.1.3 事件详情
|
||||
|
||||
**展示内容**:
|
||||
- 事件基本信息
|
||||
- 涉及罪犯列表
|
||||
- 事件经过
|
||||
- 处置情况
|
||||
- 附件列表
|
||||
- 处理记录时间线
|
||||
|
||||
### 3.2 预警信息管理
|
||||
|
||||
#### 3.2.1 预警规则配置
|
||||
|
||||
**预警类型**:
|
||||
- 罪犯行为异常预警
|
||||
- 考核连续下滑预警
|
||||
- 消费异常预警
|
||||
- 风险评估预警
|
||||
- 余刑到期预警
|
||||
|
||||
**规则配置**:
|
||||
- 预警名称
|
||||
- 预警类型
|
||||
- 触发条件
|
||||
- 预警级别(一般/紧急/严重)
|
||||
- 通知对象
|
||||
- 通知方式
|
||||
|
||||
**示例规则**:
|
||||
```
|
||||
规则名称:消费异常预警
|
||||
触发条件:单日消费超过500元
|
||||
预警级别:一般
|
||||
通知对象:分监区长、狱政科长
|
||||
```
|
||||
|
||||
#### 3.2.2 预警触发
|
||||
|
||||
**触发机制**:
|
||||
- 定时检查(每日凌晨)
|
||||
- 实时触发(数据变更时)
|
||||
|
||||
**预警生成**:
|
||||
- 生成预警记录
|
||||
- 发送通知
|
||||
|
||||
#### 3.2.3 预警处理
|
||||
|
||||
**处理流程**:
|
||||
1. 接收预警通知
|
||||
2. 查看预警详情
|
||||
3. 填写处置措施
|
||||
4. 标记处理状态
|
||||
|
||||
**预警处理表单**:
|
||||
- 预警详情
|
||||
- 处置措施
|
||||
- 处置人
|
||||
- 处置时间
|
||||
|
||||
### 3.3 事件处理跟踪
|
||||
|
||||
#### 3.3.1 处理流程
|
||||
|
||||
**流程节点**:
|
||||
- 登记 → 审核 → 处置 → 结案
|
||||
|
||||
**状态流转**:
|
||||
```
|
||||
登记(待审核) → 审核(处理中) → 处置(已完成) → 结案
|
||||
↓
|
||||
退回修改
|
||||
```
|
||||
|
||||
#### 3.3.2 跟踪记录
|
||||
|
||||
**时间线展示**:
|
||||
- 登记时间
|
||||
- 审核时间
|
||||
- 处置时间
|
||||
- 结案时间
|
||||
- 各节点操作人
|
||||
|
||||
### 3.4 应急预案管理(P2)
|
||||
|
||||
#### 3.4.1 预案库
|
||||
|
||||
**预案分类**:
|
||||
- 突发事件预案
|
||||
- 安全事故预案
|
||||
- 医疗急救预案
|
||||
- 舆情应对预案
|
||||
|
||||
#### 3.4.2 预案管理
|
||||
|
||||
**功能**:
|
||||
- 预案新增/编辑/删除
|
||||
- 预案分类管理
|
||||
- 预案启用/停用
|
||||
- 预案演练记录
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 重大事件需要多人审核 |
|
||||
| BR-002 | 预警处理有时限要求 |
|
||||
| BR-003 | 事件处理记录不可删除 |
|
||||
| BR-004 | 涉及罪犯需要权限验证 |
|
||||
| BR-005 | 附件上传有大小限制 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持事件登记
|
||||
- [ ] 支持事件列表查询
|
||||
- [ ] 支持事件详情查看
|
||||
- [ ] 支持预警规则配置
|
||||
- [ ] 支持预警触发
|
||||
- [ ] 支持预警处理
|
||||
- [ ] 支持事件处理流程跟踪
|
||||
- [ ] 支持事件状态流转
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:狱政信息管理模块(罪犯数据)
|
||||
- 依赖:消费管理模块(消费预警)
|
||||
- 依赖:计分考核模块(考核预警)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
207
requirements/需求-07-危险评估.md
Normal file
@ -0,0 +1,207 @@
|
||||
# 需求-07-危险评估
|
||||
|
||||
> 模块名称:危险评估
|
||||
> 优先级:P1
|
||||
> 预估工时:22h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
危险评估是对罪犯进行风险评估的系统,通过专业评估确定罪犯的风险等级,为管理决策提供依据。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 心理辅导员 | 作为心理辅导员,我希望配置评估问卷,这样评估维度全面 | P1 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望为罪犯做危险评估,这样确定风险等级 | P1 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望系统自动计算风险值,这样提高效率 | P1 |
|
||||
| 狱政科长 | 作为狱政科长,我希望看到风险等级划分结果,这样合理配置警力 | P1 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望有定期复评提醒,这样及时更新评估 | P1 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 评估问卷配置
|
||||
|
||||
#### 3.1.1 评估维度
|
||||
|
||||
**标准评估维度**:
|
||||
- 犯罪史评估
|
||||
- 家庭背景评估
|
||||
- 社会支持评估
|
||||
- 心理状态评估
|
||||
- 行为表现评估
|
||||
- 改造态度评估
|
||||
|
||||
#### 3.1.2 评估问卷
|
||||
|
||||
**评估类型**:
|
||||
- 入监评估(新入监罪犯)
|
||||
- 定期评估(在押罪犯定期评估)
|
||||
- 出监评估(释放前评估)
|
||||
- 专项评估(针对特定情况)
|
||||
|
||||
**问卷结构**:
|
||||
- 评估基本信息
|
||||
- 各维度题目
|
||||
- 风险因素清单
|
||||
- 管控措施建议
|
||||
|
||||
### 3.2 危险评估录入
|
||||
|
||||
#### 3.2.1 创建评估
|
||||
|
||||
**评估类型选择**:
|
||||
- 入监评估
|
||||
- 定期评估(月度/季度/年度)
|
||||
- 出监评估
|
||||
- 专项评估
|
||||
|
||||
**罪犯选择**:
|
||||
- 支持搜索罪犯
|
||||
- 显示基本信息
|
||||
|
||||
#### 3.2.2 填写评估
|
||||
|
||||
**评估内容**:
|
||||
- 各维度题目作答
|
||||
- 风险因素勾选
|
||||
- 管控措施填写
|
||||
- 评估人意见
|
||||
|
||||
**风险因素选项**(示例):
|
||||
- 有脱逃倾向
|
||||
- 有暴力倾向
|
||||
- 有自杀倾向
|
||||
- 近期情绪异常
|
||||
- 家庭变故
|
||||
- 与他犯有矛盾
|
||||
- 其他
|
||||
|
||||
**管控措施选项**(示例):
|
||||
- 列为重点关注
|
||||
- 调整监管等级
|
||||
- 增加巡查频次
|
||||
- 安排心理疏导
|
||||
- 调整监区
|
||||
- 其他
|
||||
|
||||
### 3.3 风险计算引擎
|
||||
|
||||
#### 3.3.1 计算规则
|
||||
|
||||
**风险分值计算**:
|
||||
- 各维度题目得分累加
|
||||
- 风险因素加权
|
||||
- 最终得出风险总分
|
||||
|
||||
**风险分值范围**:0-100分
|
||||
|
||||
#### 3.3.2 风险等级划分
|
||||
|
||||
**等级划分标准**(可配置):
|
||||
|
||||
| 风险等级 | 分值范围 | 说明 |
|
||||
|---------|---------|-----|
|
||||
| 高风险 | ≥70分 | 需要重点关注和管控 |
|
||||
| 中风险 | 40-69分 | 需要一般关注 |
|
||||
| 低风险 | <40分 | 正常管理 |
|
||||
|
||||
**等级颜色标识**:
|
||||
- 高风险:红色
|
||||
- 中风险:橙色
|
||||
- 低风险:绿色
|
||||
|
||||
### 3.4 评估结果管理
|
||||
|
||||
#### 3.4.1 评估记录
|
||||
|
||||
**列表字段**:
|
||||
- 评估编号
|
||||
- 罪犯姓名/编号
|
||||
- 评估类型
|
||||
- 评估日期
|
||||
- 风险等级
|
||||
- 风险分值
|
||||
- 评估人
|
||||
- 状态(有效/过期)
|
||||
|
||||
#### 3.4.2 评估详情
|
||||
|
||||
**展示内容**:
|
||||
- 评估基本信息
|
||||
- 各维度得分详情
|
||||
- 风险因素
|
||||
- 管控措施
|
||||
- 历史评估对比
|
||||
|
||||
### 3.5 定期复评提醒
|
||||
|
||||
#### 3.5.1 复评周期配置
|
||||
|
||||
**默认周期**:
|
||||
- 高风险:每月复评
|
||||
- 中风险:每季度复评
|
||||
- 低风险:每半年复评
|
||||
|
||||
**可按罪犯调整**:
|
||||
|
||||
#### 3.5.2 提醒机制
|
||||
|
||||
**触发时机**:
|
||||
- 临近复评日期提前提醒(可配置天数)
|
||||
- 超过复评日期未复评提醒
|
||||
|
||||
**通知方式**:
|
||||
- 系统消息提醒
|
||||
- 站内通知
|
||||
|
||||
### 3.6 历史评估对比
|
||||
|
||||
#### 3.6.1 对比展示
|
||||
|
||||
**对比维度**:
|
||||
- 风险分值趋势
|
||||
- 风险等级变化
|
||||
- 各维度得分对比
|
||||
|
||||
#### 3.6.2 趋势分析
|
||||
|
||||
**图表展示**:
|
||||
- 折线图:风险分值趋势
|
||||
- 柱状图:各维度得分对比
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 入监评估必须在入监后7天内完成 |
|
||||
| BR-002 | 高风险罪犯必须每月复评 |
|
||||
| BR-003 | 风险等级变更需要审批 |
|
||||
| BR-004 | 评估记录不可删除 |
|
||||
| BR-005 | 评估有效期根据风险等级自动计算 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持评估问卷配置
|
||||
- [ ] 支持评估维度管理
|
||||
- [ ] 支持创建评估任务
|
||||
- [ ] 支持评估内容填写
|
||||
- [ ] 支持风险分值自动计算
|
||||
- [ ] 支持风险等级自动划分
|
||||
- [ ] 支持评估记录查询
|
||||
- [ ] 支持评估详情查看
|
||||
- [ ] 支持定期复评提醒
|
||||
- [ ] 支持历史评估对比
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:测评问卷管理模块(问卷基础)
|
||||
- 依赖:狱政信息管理模块(罪犯数据)
|
||||
- 被依赖:狱政信息管理模块(风险等级引用)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
205
requirements/需求-08-消费系统.md
Normal file
@ -0,0 +1,205 @@
|
||||
# 需求-08-消费系统
|
||||
|
||||
> 模块名称:消费系统
|
||||
> 优先级:P1
|
||||
> 预估工时:18h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
消费系统管理罪犯的账户余额、消费记录和存款,是保障罪犯日常生活和规范消费行为的重要模块。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 生活卫生科长 | 作为生活卫生科长,我希望管理罪犯账户余额,这样掌握消费情况 | P1 |
|
||||
| 家属 | 作为罪犯家属,我希望给罪犯存款,这样罪犯有钱花 | P1 |
|
||||
| 罪犯 | 作为罪犯,我希望查询自己的消费记录,这样我知道钱花哪了 | P1 |
|
||||
| 狱政科长 | 作为狱政科长,我希望设置消费限额,这样控制过度消费 | P1 |
|
||||
| 管理员 | 作为管理员,我希望分析消费数据,这样发现异常消费 | P1 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 账户管理
|
||||
|
||||
#### 3.1.1 账户查询
|
||||
|
||||
**查询条件**:
|
||||
- 罪犯姓名/编号
|
||||
- 监区/分监区
|
||||
- 账户状态(正常/冻结)
|
||||
|
||||
**列表字段**:
|
||||
- 罪犯编号、姓名
|
||||
- 监区/分监区
|
||||
- 账户余额
|
||||
- 累计存款
|
||||
- 累计消费
|
||||
- 账户状态
|
||||
- 开户时间
|
||||
|
||||
#### 3.1.2 账户详情
|
||||
|
||||
**展示内容**:
|
||||
- 罪犯基本信息
|
||||
- 账户信息(余额、状态)
|
||||
- 存款记录(最近10笔)
|
||||
- 消费记录(最近10笔)
|
||||
- 月度消费统计
|
||||
|
||||
### 3.2 家属存款
|
||||
|
||||
#### 3.2.1 存款登记
|
||||
|
||||
**表单字段**:
|
||||
- 罪犯选择(支持搜索)
|
||||
- 存款金额(必填)
|
||||
- 存款人姓名
|
||||
- 存款人关系
|
||||
- 联系方式
|
||||
- 备注
|
||||
|
||||
**存款方式**:
|
||||
- 现场存款(家属到窗口)
|
||||
- 银行转账(系统对接银行)
|
||||
- 线上支付(微信/支付宝)
|
||||
|
||||
**到账确认**:
|
||||
- 线下存款需工作人员确认
|
||||
- 系统存款自动到账
|
||||
|
||||
#### 3.2.2 存款记录
|
||||
|
||||
**列表字段**:
|
||||
- 记录编号
|
||||
- 罪犯姓名/编号
|
||||
- 存款金额
|
||||
- 存款人
|
||||
- 存款方式
|
||||
- 存款时间
|
||||
- 状态(待确认/已到账/已取消)
|
||||
|
||||
### 3.3 消费记录
|
||||
|
||||
#### 3.3.1 消费类型
|
||||
|
||||
**消费类型**:
|
||||
- 购物消费(超市购物)
|
||||
- 餐饮消费(食堂)
|
||||
- 医疗消费(看病)
|
||||
- 通讯消费(电话费)
|
||||
- 其他消费
|
||||
|
||||
#### 3.3.2 消费查询
|
||||
|
||||
**查询条件**:
|
||||
- 罪犯姓名/编号
|
||||
- 消费类型
|
||||
- 消费时间范围
|
||||
- 监区
|
||||
|
||||
**列表字段**:
|
||||
- 订单编号
|
||||
- 罪犯姓名/编号
|
||||
- 消费类型
|
||||
- 消费金额
|
||||
- 商品名称
|
||||
- 消费时间
|
||||
- 账户余额(消费后)
|
||||
|
||||
#### 3.3.3 消费详情
|
||||
|
||||
**展示内容**:
|
||||
- 订单信息
|
||||
- 商品列表
|
||||
- 金额明细
|
||||
- 消费时间
|
||||
- 操作人
|
||||
|
||||
### 3.4 消费限额
|
||||
|
||||
#### 3.4.1 全局限额配置
|
||||
|
||||
**配置项**:
|
||||
- 日消费限额
|
||||
- 月消费限额
|
||||
- 单笔消费限额
|
||||
- 特殊商品限制
|
||||
|
||||
**默认限额**:
|
||||
- 日限额:50元
|
||||
- 月限额:500元
|
||||
- 单笔限额:100元
|
||||
|
||||
#### 3.4.2 个体限额配置
|
||||
|
||||
**按罪犯设置**:
|
||||
- 单独设置限额
|
||||
- 按监管等级设置
|
||||
- 按风险等级设置
|
||||
|
||||
**限额类型**:
|
||||
- 宽管级:标准限额的120%
|
||||
- 普管级:标准限额
|
||||
- 严管级:标准限额的60%
|
||||
- 考察级:最低保障
|
||||
|
||||
### 3.5 消费统计分析
|
||||
|
||||
#### 3.5.1 统计维度
|
||||
|
||||
**统计报表**:
|
||||
- 日消费统计
|
||||
- 月消费统计
|
||||
- 人均消费统计
|
||||
- 监区消费排名
|
||||
- 商品销售排行
|
||||
|
||||
#### 3.5.2 异常检测
|
||||
|
||||
**异常规则**:
|
||||
- 单日消费超过日限额
|
||||
- 单月消费超过月限额
|
||||
- 消费频率异常(短时间内多次消费)
|
||||
|
||||
**异常处理**:
|
||||
- 超出限额时拦截
|
||||
- 生成异常预警
|
||||
- 通知管理人员
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 罪犯账户余额不能为负数 |
|
||||
| BR-002 | 消费金额不能超过账户余额 |
|
||||
| BR-003 | 消费金额不能超过单笔限额 |
|
||||
| BR-004 | 累计消费不能超过日/月限额 |
|
||||
| BR-005 | 存款需校验金额格式 |
|
||||
| BR-006 | 严管级罪犯消费限额更低 |
|
||||
| BR-007 | 消费记录不可删除 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持账户查询
|
||||
- [ ] 支持账户详情查看
|
||||
- [ ] 支持存款登记
|
||||
- [ ] 支持存款记录查询
|
||||
- [ ] 支持消费记录查询
|
||||
- [ ] 支持消费限额配置
|
||||
- [ ] 支持个体限额设置
|
||||
- [ ] 支持消费统计分析
|
||||
- [ ] 支持异常消费预警
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:狱政信息管理模块(罪犯数据)
|
||||
- 依赖:监区管理模块(监区数据)
|
||||
- 被依赖:数据分析模块(消费数据引用)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
228
requirements/需求-09-数据汇总.md
Normal file
@ -0,0 +1,228 @@
|
||||
# 需求-09-数据汇总
|
||||
|
||||
> 模块名称:数据汇总
|
||||
> 优先级:P1
|
||||
> 预估工时:20h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
数据汇总模块提供各类统计报表和分析图表,帮助管理层全面了解监狱运行状况。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 监狱长 | 作为监狱长,我希望看到在册罪犯统计,这样了解整体规模 | P1 |
|
||||
| 教导员 | 作为教导员,我希望看到押犯构成分析,这样了解罪犯特点 | P1 |
|
||||
| 考核干事 | 作为考核干事,我希望看到考核统计报表,这样了解整体改造情况 | P1 |
|
||||
| 生活科长 | 作为生活科长,我希望看到消费统计,这样了解消费水平 | P1 |
|
||||
| 教育科长 | 作为教育科长,我希望看到评估统计,这样了解测评情况 | P1 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 人口统计分析
|
||||
|
||||
#### 3.1.1 在册统计
|
||||
|
||||
**统计指标**:
|
||||
- 当前在册总数
|
||||
- 本月新收数量
|
||||
- 本月释放数量
|
||||
- 本月移交数量
|
||||
- 本月死亡数量
|
||||
|
||||
**时间维度**:
|
||||
- 日统计
|
||||
- 月统计
|
||||
- 年统计
|
||||
|
||||
#### 3.1.2 动态统计
|
||||
|
||||
**统计图表**:
|
||||
- 折线图:在册人数趋势
|
||||
- 柱状图:月度收押/释放对比
|
||||
|
||||
### 3.2 押犯构成分析
|
||||
|
||||
#### 3.2.1 年龄分布
|
||||
|
||||
**年龄段**:
|
||||
- 未成年(≤17)
|
||||
- 青年(18-30)
|
||||
- 中年(31-50)
|
||||
- 老年(51-60)
|
||||
- 老龄(60+)
|
||||
|
||||
**展示形式**:
|
||||
- 饼图:年龄占比
|
||||
- 柱状图:各年龄段人数
|
||||
|
||||
#### 3.2.2 刑期分布
|
||||
|
||||
**刑期段**:
|
||||
- 短刑(≤3年)
|
||||
- 中刑(3-10年)
|
||||
- 长刑(10年以上)
|
||||
- 无期
|
||||
- 死缓
|
||||
|
||||
**展示形式**:饼图
|
||||
|
||||
#### 3.2.3 罪名分布
|
||||
|
||||
**分类**:
|
||||
- 暴力型(故意杀人、故意伤害、抢劫等)
|
||||
- 财产型(盗窃、诈骗、抢夺等)
|
||||
- 淫欲型(强奸、猥亵等)
|
||||
- 涉毒型(贩毒、吸毒等)
|
||||
- 涉黑涉恶型
|
||||
- 其他
|
||||
|
||||
**展示形式**:柱状图
|
||||
|
||||
#### 3.2.4 其他维度
|
||||
|
||||
**文化程度分布**:饼图
|
||||
**民族分布**:饼图
|
||||
**籍贯分布**:地图热力图
|
||||
|
||||
### 3.3 考核统计报表
|
||||
|
||||
#### 3.3.1 分数分布
|
||||
|
||||
**统计维度**:
|
||||
- 各分数段人数
|
||||
- 平均分
|
||||
- 最高分/最低分
|
||||
|
||||
**展示形式**:
|
||||
- 柱状图:分数分布
|
||||
- 表格:统计数据
|
||||
|
||||
#### 3.3.2 等级分布
|
||||
|
||||
**考核等级**:
|
||||
- 优秀人数/占比
|
||||
- 良好人数/占比
|
||||
- 合格人数/占比
|
||||
- 不合格人数/占比
|
||||
|
||||
**展示形式**:饼图
|
||||
|
||||
#### 3.3.3 月度趋势
|
||||
|
||||
**趋势分析**:
|
||||
- 月度平均分趋势
|
||||
- 各等级占比趋势
|
||||
|
||||
**展示形式**:折线图
|
||||
|
||||
### 3.4 消费统计报表
|
||||
|
||||
#### 3.4.1 消费金额统计
|
||||
|
||||
**统计指标**:
|
||||
- 总消费金额
|
||||
- 人均消费金额
|
||||
- 日均消费金额
|
||||
- 消费总额趋势
|
||||
|
||||
#### 3.4.2 消费类型分布
|
||||
|
||||
**类型占比**:
|
||||
- 超市购物
|
||||
- 餐饮消费
|
||||
- 医疗消费
|
||||
- 通讯消费
|
||||
- 其他
|
||||
|
||||
**展示形式**:饼图
|
||||
|
||||
#### 3.4.3 监区消费排名
|
||||
|
||||
**排名维度**:
|
||||
- 人均消费排名
|
||||
- 消费总额排名
|
||||
- 月环比增长排名
|
||||
|
||||
**展示形式**:排行榜表格
|
||||
|
||||
### 3.5 评估统计报表
|
||||
|
||||
#### 3.5.1 测评完成率
|
||||
|
||||
**统计指标**:
|
||||
- 应测评人数
|
||||
- 已完成人数
|
||||
- 完成率
|
||||
- 待测评人数
|
||||
|
||||
#### 3.5.2 风险分布
|
||||
|
||||
**风险等级**:
|
||||
- 高风险人数/占比
|
||||
- 中风险人数/占比
|
||||
- 低风险人数/占比
|
||||
|
||||
**展示形式**:饼图
|
||||
|
||||
#### 3.5.3 评估趋势
|
||||
|
||||
**趋势分析**:
|
||||
- 高风险占比趋势
|
||||
- 测评覆盖率趋势
|
||||
|
||||
### 3.6 综合报表
|
||||
|
||||
#### 3.6.1 监狱运行月报
|
||||
|
||||
**报告内容**:
|
||||
- 在押犯情况
|
||||
- 收押释放情况
|
||||
- 考核情况
|
||||
- 消费情况
|
||||
- 测评情况
|
||||
- 重点关注事项
|
||||
|
||||
#### 3.6.2 自定义报表
|
||||
|
||||
**功能**:
|
||||
- 选择统计指标
|
||||
- 选择时间范围
|
||||
- 选择统计维度
|
||||
- 生成报表
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 统计数据实时更新 |
|
||||
| BR-002 | 支持按时间范围筛选 |
|
||||
| BR-003 | 支持按监区筛选 |
|
||||
| BR-004 | 报表支持导出(Excel/PDF) |
|
||||
| BR-005 | 敏感数据脱敏展示 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持人口统计分析
|
||||
- [ ] 支持押犯构成分析(年龄/刑期/罪名)
|
||||
- [ ] 支持考核统计报表
|
||||
- [ ] 支持消费统计报表
|
||||
- [ ] 支持评估统计报表
|
||||
- [ ] 支持综合报表生成
|
||||
- [ ] 支持数据导出
|
||||
- [ ] 支持图表交互(筛选、导出)
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:狱政信息管理模块(人口数据)
|
||||
- 依赖:计分考核模块(考核数据)
|
||||
- 依赖:消费管理模块(消费数据)
|
||||
- 依赖:测评管理模块(评估数据)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
1349
requirements/需求-10-评估报告.md
Normal file
157
requirements/需求-11-智能预警.md
Normal file
@ -0,0 +1,157 @@
|
||||
# 需求-11-智能预警
|
||||
|
||||
> 模块名称:智能预警
|
||||
> 优先级:P2
|
||||
> 预估工时:32h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
智能预警系统通过分析罪犯的行为数据,自动发现异常模式和潜在风险,提前预警。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 心理辅导员 | 作为心理辅导员,我希望系统发现异常行为模式,这样及时干预 | P2 |
|
||||
| 狱政科长 | 作为狱政科长,我希望消费异常有预警,这样防止过度消费 | P2 |
|
||||
| 分监区长 | 作为分监区长,我希望考核下滑有预警,这样关注重点人员 | P2 |
|
||||
| 管理员 | 作为管理员,我希望有风险预测模型,这样提前识别高风险罪犯 | P2 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 行为异常检测
|
||||
|
||||
#### 3.1.1 行为模式分析
|
||||
|
||||
**分析维度**:
|
||||
- 考核得分趋势
|
||||
- 消费行为模式
|
||||
- 人际交往情况
|
||||
- 情绪表达特征
|
||||
|
||||
**检测规则**:
|
||||
- 考核连续下滑(连续3个月下降)
|
||||
- 消费突然增加(较历史均值增加50%)
|
||||
- 社交圈变化(突然接触新群体)
|
||||
- 情绪表达异常(测评分数突变)
|
||||
|
||||
#### 3.1.2 异常标记
|
||||
|
||||
**标记内容**:
|
||||
- 异常类型
|
||||
- 异常程度
|
||||
- 触发规则
|
||||
- 建议关注点
|
||||
|
||||
### 3.2 消费异常预警
|
||||
|
||||
#### 3.2.1 阈值预警
|
||||
|
||||
**预警规则**:
|
||||
- 单日消费超过设定阈值
|
||||
- 单月消费超过设定阈值
|
||||
- 消费频率异常(单日多次消费)
|
||||
|
||||
**预警触发**:
|
||||
- 超出阈值时生成预警
|
||||
- 通知相关管理人员
|
||||
|
||||
#### 3.2.2 模式预警
|
||||
|
||||
**分析规则**:
|
||||
- 与历史消费模式偏离
|
||||
- 与同监区平均消费偏离
|
||||
- 消费时间异常(非正常时段)
|
||||
|
||||
### 3.3 考核下滑预警
|
||||
|
||||
#### 3.3.1 趋势分析
|
||||
|
||||
**分析维度**:
|
||||
- 连续下降月数
|
||||
- 下降幅度
|
||||
- 下降原因推断
|
||||
|
||||
**预警规则**:
|
||||
- 连续2月下降超过10%
|
||||
- 连续3月下降
|
||||
- 考核等级降级
|
||||
|
||||
### 3.4 风险预测模型
|
||||
|
||||
#### 3.4.1 特征提取
|
||||
|
||||
**输入特征**:
|
||||
- 历史考核得分
|
||||
- 历史测评结果
|
||||
- 风险评估等级
|
||||
- 消费行为特征
|
||||
- 违规记录
|
||||
|
||||
#### 3.4.2 风险评分
|
||||
|
||||
**输出**:
|
||||
- 风险评分(0-100)
|
||||
- 风险等级(高/中/低)
|
||||
- 风险因素(哪些因素导致高分)
|
||||
|
||||
**模型说明**:
|
||||
- 基于历史数据训练的预测模型
|
||||
- 定期更新模型参数
|
||||
|
||||
### 3.5 预警通知
|
||||
|
||||
#### 3.5.1 通知方式
|
||||
|
||||
**通知渠道**:
|
||||
- 系统站内消息
|
||||
- 短信通知(预留接口)
|
||||
- 邮件通知(预留接口)
|
||||
|
||||
#### 3.5.2 通知配置
|
||||
|
||||
**配置项**:
|
||||
- 通知接收人
|
||||
- 通知方式
|
||||
- 通知时机(即时/汇总)
|
||||
- 通知频率
|
||||
|
||||
#### 3.5.3 预警汇总
|
||||
|
||||
**汇总报告**:
|
||||
- 每日预警汇总
|
||||
- 每周预警趋势
|
||||
- 高风险预警列表
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 预警产生后需要人工确认 |
|
||||
| BR-002 | 高风险预警必须24小时内处理 |
|
||||
| BR-003 | 预警记录不可删除 |
|
||||
| BR-004 | 预测模型定期更新 |
|
||||
| BR-005 | 误报率需要控制在合理范围 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持行为异常检测
|
||||
- [ ] 支持消费异常预警
|
||||
- [ ] 支持考核下滑预警
|
||||
- [ ] 支持风险预测评分
|
||||
- [ ] 支持预警通知配置
|
||||
- [ ] 支持预警汇总报告
|
||||
- [ ] 预警准确率达到要求
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:消费管理模块(消费数据)
|
||||
- 依赖:计分考核模块(考核数据)
|
||||
- 依赖:危险评估模块(风险数据)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||
182
requirements/需求-12-智能分析.md
Normal file
@ -0,0 +1,182 @@
|
||||
# 需求-12-智能分析
|
||||
|
||||
> 模块名称:智能分析
|
||||
> 优先级:P2
|
||||
> 预估工时:22h
|
||||
|
||||
---
|
||||
|
||||
## 一、业务背景
|
||||
|
||||
智能分析模块提供深度数据分析和预测功能,帮助管理层发现规律、制定决策。
|
||||
|
||||
## 二、用户故事
|
||||
|
||||
| 角色 | 故事描述 | 优先级 |
|
||||
|-----|---------|-------|
|
||||
| 监狱长 | 作为监狱长,我希望系统自动生成分析报告,这样减少人工汇总 | P2 |
|
||||
| 教育科长 | 作为教育科长,我希望有趋势预测,这样制定教育计划 | P2 |
|
||||
| 心理辅导员 | 作为心理辅导员,我希望发现数据关联,这样针对性干预 | P2 |
|
||||
| 管理员 | 作为管理员,我希望有智能分析结果,这样辅助决策 | P2 |
|
||||
|
||||
## 三、功能需求
|
||||
|
||||
### 3.1 自动报表生成
|
||||
|
||||
#### 3.1.1 报告类型
|
||||
|
||||
**周期报告**:
|
||||
- 日报:每日运行情况
|
||||
- 周报:每周运行情况
|
||||
- 月报:每月运行情况
|
||||
- 年报:每年运行情况
|
||||
|
||||
**专题报告**:
|
||||
- 人口构成分析
|
||||
- 考核情况分析
|
||||
- 消费行为分析
|
||||
- 风险评估分析
|
||||
|
||||
#### 3.1.2 报告内容
|
||||
|
||||
**报告结构**:
|
||||
- 关键指标概览
|
||||
- 数据图表展示
|
||||
- 异常情况说明
|
||||
- 趋势分析
|
||||
- 建议措施
|
||||
|
||||
#### 3.1.3 自动生成
|
||||
|
||||
**生成机制**:
|
||||
- 定时生成(日/周/月/年)
|
||||
- 手动触发生成
|
||||
- 按模板生成
|
||||
|
||||
### 3.2 趋势预测
|
||||
|
||||
#### 3.2.1 人口预测
|
||||
|
||||
**预测维度**:
|
||||
- 在册人数趋势
|
||||
- 收押趋势
|
||||
- 释放趋势
|
||||
- 刑满释放预测
|
||||
|
||||
**预测周期**:
|
||||
- 短期预测(未来1个月)
|
||||
- 中期预测(未来3个月)
|
||||
- 长期预测(未来1年)
|
||||
|
||||
#### 3.2.2 考核趋势
|
||||
|
||||
**预测内容**:
|
||||
- 整体考核得分趋势
|
||||
- 优秀率趋势
|
||||
- 不合格率趋势
|
||||
|
||||
#### 3.2.3 风险趋势
|
||||
|
||||
**预测内容**:
|
||||
- 高风险占比趋势
|
||||
- 风险变化预测
|
||||
|
||||
### 3.3 关联分析
|
||||
|
||||
#### 3.3.1 因素关联
|
||||
|
||||
**分析维度**:
|
||||
- 刑期与考核表现关联
|
||||
- 年龄与风险等级关联
|
||||
- 消费与考核关联
|
||||
- 测评与违规关联
|
||||
|
||||
**分析方法**:
|
||||
- 相关性分析
|
||||
- 回归分析
|
||||
- 聚类分析
|
||||
|
||||
#### 3.3.2 异常发现
|
||||
|
||||
**发现规则**:
|
||||
- 偏离正常模式的数据点
|
||||
- 突然变化的数据趋势
|
||||
- 异常的数据分布
|
||||
|
||||
**展示方式**:
|
||||
- 异常标记
|
||||
- 异常说明
|
||||
- 可能原因分析
|
||||
|
||||
### 3.4 分析可视化
|
||||
|
||||
#### 3.4.1 图表类型
|
||||
|
||||
**基础图表**:
|
||||
- 折线图(趋势)
|
||||
- 柱状图(对比)
|
||||
- 饼图(占比)
|
||||
- 散点图(分布)
|
||||
- 雷达图(多维度)
|
||||
|
||||
**高级图表**:
|
||||
- 桑基图(流转分析)
|
||||
- 热力图(密度分布)
|
||||
- 关系图(关联分析)
|
||||
|
||||
#### 3.4.2 交互功能
|
||||
|
||||
**交互操作**:
|
||||
- 数据筛选
|
||||
- 时间范围选择
|
||||
- 维度切换
|
||||
- 图表联动
|
||||
- 数据钻取
|
||||
|
||||
### 3.5 分析报告导出
|
||||
|
||||
#### 3.5.1 导出格式
|
||||
|
||||
**支持格式**:
|
||||
- PDF(完整报告)
|
||||
- Word(文档报告)
|
||||
- Excel(数据表格)
|
||||
- PPT(演示文稿)
|
||||
|
||||
#### 3.5.2 导出内容
|
||||
|
||||
**可导出内容**:
|
||||
- 分析报告全文
|
||||
- 图表图片
|
||||
- 原始数据
|
||||
- 分析结论
|
||||
|
||||
## 四、业务规则汇总
|
||||
|
||||
| 规则编号 | 规则描述 |
|
||||
|---------|---------|
|
||||
| BR-001 | 预测数据仅供参考 |
|
||||
| BR-002 | 分析结果需人工确认 |
|
||||
| BR-003 | 历史数据完整才能做趋势分析 |
|
||||
| BR-004 | 敏感分析结果需要权限控制 |
|
||||
| BR-005 | 预测模型定期校验 |
|
||||
|
||||
## 五、验收标准
|
||||
|
||||
- [ ] 支持自动报表生成
|
||||
- [ ] 支持多种报告类型
|
||||
- [ ] 支持趋势预测
|
||||
- [ ] 支持关联分析
|
||||
- [ ] 支持可视化展示
|
||||
- [ ] 支持报告导出
|
||||
- [ ] 预测准确率达到要求
|
||||
|
||||
## 六、相关模块
|
||||
|
||||
- 依赖:所有业务模块(数据来源)
|
||||
- 被依赖:监管看板模块(可视化展示)
|
||||
|
||||
---
|
||||
|
||||
**创建日期**:2026-01-14
|
||||
**版本**:v1.0
|
||||