# 学生操行分管理模块 ## 📋 模块基本信息 **模块名称**: 学生操行分管理 / Student Conduct Score Management **负责人**: 开发团队 **开发状态**: 🟡 待开发 **技术栈**: Spring Boot 3.4.6 + Vue 3 + TypeScript + Element Plus **依赖模块**: 用户管理、班级管理、学生管理 **开发周期**: 待定 --- ## 🎯 模块概述 ### 业务价值 为学校提供完整的学生操行分管理解决方案,实现班主任每月对班级学生操行表现的量化评价和管理,帮助学生处管理员掌握学生的学期表现情况,为学生综合素质评价提供数据支持。 ### 核心功能 - **班主任月度评分**: 班主任每月为班级学生录入操行分数 - **学期平均分统计**: 自动计算学生的学期操行平均分 - **多维度数据展示**: 按学年、学期、月份等维度展示学生操行表现 - **权限分级管理**: 班主任只能管理本班学生,管理员可查看全校数据 ### 技术特点 - **数据完整性**: 严格的数据验证和业务规则约束 - **性能优化**: 支持大数据量查询和统计分析 - **权限安全**: 基于角色的精细化权限控制 - **用户体验**: 友好的批量录入和数据展示界面 --- ## 📁 文档结构 ``` 学生操行分管理/ ├── README.md # 本文件 - 模块总览 ├── 需求分析/ │ ├── 业务需求说明.md # 详细业务需求 │ ├── 功能需求清单.md # 功能点清单 │ ├── 用户故事.md # 用户使用场景 │ └── 非功能需求.md # 性能、安全要求 ├── 技术设计/ │ ├── 数据库设计.md # 表结构设计 │ ├── API接口设计.md # 接口定义 │ ├── 架构设计.md # 模块架构 │ └── 技术选型.md # 技术决策说明 ├── 实现文档/ │ ├── 后端实现说明.md # 后端代码结构 │ ├── 前端实现说明.md # 前端代码结构 │ ├── 关键业务逻辑.md # 核心算法逻辑 │ └── 代码规范.md # 编码规范 ├── 测试文档/ │ ├── 测试计划.md # 测试策略 │ ├── 测试用例.md # 具体测试用例 │ └── 测试报告.md # 测试结果 └── 运维文档/ ├── 部署指南.md # 部署步骤 ├── 监控配置.md # 监控指标 └── 故障处理.md # 常见问题 ``` --- ## 🏗️ 系统架构 ### 模块架构图 ```mermaid graph TB subgraph "前端层" A1[操行分录入页面
ConductScoreInput.vue] A2[学期统计页面
SemesterStatistics.vue] A3[操行分查询页面
ConductScoreQuery.vue] end subgraph "接口层" B1[操行分Controller
ConductScoreController] B2[统计Controller
StatisticsController] end subgraph "业务层" C1[操行分Service
IConductScoreService] C2[统计Service
IStatisticsService] C3[权限Service
IPermissionService] end subgraph "数据层" D1[操行分Mapper
ConductScoreMapper] D2[统计SQL
统计查询语句] D3[Redis缓存
缓存统计结果] end A1 --> B1 A2 --> B2 A3 --> B1 B1 --> C1 B2 --> C2 C1 --> C3 C2 --> C3 C1 --> D1 C2 --> D1 C2 --> D2 D2 --> D3 ``` ### 数据流向 ```mermaid sequenceDiagram participant T as 班主任 participant F as 前端 participant C as Controller participant S as Service participant M as Mapper participant D as Database T->>F: 选择月份录入操行分 F->>C: POST /api/conduct-score/batch C->>S: 批量保存操行分 S->>M: 插入/更新分数数据 M->>D: SQL执行 D-->>M: 返回结果 M-->>S: 返回成功 S-->>C: 返回结果 C-->>F: JSON响应 F-->>T: 显示保存成功 Note over T,D: 学生处管理员查询学期统计 T->>F: 选择学年学期查询 F->>C: GET /api/statistics/semester-average C->>S: 计算学期平均分 S->>M: 查询统计数据 M->>D: SQL执行 D-->>M: 返回原始数据 M-->>S: 计算平均分 S-->>C: 返回统计结果 C-->>F: JSON响应 F-->>T: 显示统计表格 ``` --- ## 🎯 核心功能模块 ### 1. 操行分录入管理 #### 业务描述 班主任每月为负责的班级学生录入操行分数,包含分数和备注信息。如果班主任负责多个班级,则通过多Tab页方式展示。系统需要验证班主任权限、检查数据完整性、防止重复录入等。 #### 技术实现 - **前端实现**: Vue 3 多Tab页组件,支持批量录入和数据验证,每个Tab页独立管理一个班级 - **后端实现**: Spring Boot Controller + Service,通过`xg_class_msg.class_teacher_id`获取班主任负责的班级 - **数据存储**: MySQL 数据库,支持历史数据追溯 - **Tab页逻辑**: 根据班主任负责的班级数量动态生成Tab页,每个Tab页独立保存状态 #### 关键流程 1. 系统根据当前用户ID查询`xg_class_msg`表获取负责的班级 2. 动态生成Tab页,每个Tab对应一个班级 3. 班主任选择录入月份 4. 系统加载对应班级学生列表 5. 班主任为每位学生录入分数和备注 6. 系统验证数据完整性和合理性 7. 批量保存到数据库(支持跨Tab页批量保存) 8. 更新录入状态记录 ### 2. 学期统计分析 #### 业务描述 学生处管理员查看学生的学期操行平均分,系统自动计算每个学生的学期平均表现,并提供导出功能。 #### 技术实现 - **前端实现**: 数据表格组件,支持排序、筛选和导出 - **后端实现**: 统计查询接口,包含缓存优化 - **数据处理**: SQL聚合查询或Java计算逻辑 #### 关键流程 1. 管理员选择学年和学期 2. 系统查询该学期所有学生的分数记录 3. 计算每个学生的平均分 4. 按班级或专业分组展示 5. 支持数据导出功能 --- ## 🔌 API 接口概览 ### 接口分类 #### 基础 CRUD 接口 | 接口名称 | 请求方式 | 路径 | 功能描述 | | -------------- | -------- | --------------------------- | ---------------------- | | 查询操行分列表 | GET | /api/conduct-score/list | 分页查询操行分记录 | | 查询操行分详情 | GET | /api/conduct-score/{id} | 根据 ID 查询操行分详情 | | 新增操行分 | POST | /api/conduct-score | 创建新的操行分记录 | | 更新操行分 | PUT | /api/conduct-score/{id} | 更新指定操行分记录 | | 删除操行分 | DELETE | /api/conduct-score/{id} | 删除指定操行分记录 | #### 业务逻辑接口 | 接口名称 | 请求方式 | 路径 | 功能描述 | | ---------------- | -------- | ----------------------------- | ------------------------ | | 批量录入操行分 | POST | /api/conduct-score/batch | 批量保存操行分 | | 班主任班级学生 | GET | /api/conduct-score/class-students | 获取班主任班级学生列表 | | 学期平均分统计 | GET | /api/statistics/semester-average | 查询学期平均分 | | 导出学期统计 | GET | /api/statistics/export | 导出学期统计数据 | | 验证录入权限 | GET | /api/conduct-score/check-permission | 检查班主任录入权限 | ### 接口规范 - **请求格式**: JSON - **响应格式**: 统一响应体结构 - **认证方式**: JWT Token - **权限控制**: 基于角色的权限验证 --- ## 🗄️ 数据模型 ### 核心实体 #### 操行分表 (xg_conduct_score) | 字段名 | 类型 | 长度 | 非空 | 默认值 | 说明 | | --------------- | ----------- | ------ | ----- | -------- | ------------------------------ | | id | BIGINT | - | Y | - | 主键 ID | | tenant_id | VARCHAR | 20 | Y | 000000 | 租户编号 | | academic_year | INT | 4 | Y | - | 学年(如:2024) | | semester | TINYINT | 1 | Y | - | 学期(1-第一学期,2-第二学期) | | month | TINYINT | 2 | Y | - | 月份(1-12) | | student_id | BIGINT | - | Y | - | 学生ID,关联xg_student_msg.id | | class_id | BIGINT | - | Y | - | 班级ID,关联xg_class_msg.id | | class_teacher_id| BIGINT | - | Y | - | 班主任ID,关联sys_user.id | | score | DECIMAL | 5,2 | Y | - | 操行分数(0.00-100.00) | | remark | VARCHAR | 500 | N | NULL | 备注信息 | | create_dept | BIGINT | - | N | NULL | 创建部门 | | create_by | BIGINT | - | N | NULL | 创建者 | | create_time | DATETIME | - | N | NULL | 创建时间 | | update_by | BIGINT | - | N | NULL | 更新者 | | update_time | DATETIME | - | N | NULL | 更新时间 | | deleted | TINYINT | 1 | Y | 0 | 删除标志(0代表存在 1代表删除)| ### 实体关系图 ```mermaid erDiagram xg_conduct_score ||--o{ xg_student_msg : "关联学生" xg_conduct_score }o--|| xg_class_msg : "关联班级" xg_conduct_score }o--|| sys_user : "关联班主任" xg_class_msg ||--o{ xg_student_msg : "班级包含学生" xg_class_msg }o--|| sys_user : "班级有班主任" xg_conduct_score { bigint id PK int academic_year tinyint semester tinyint month bigint student_id FK bigint class_id FK bigint class_teacher_id FK decimal score varchar remark datetime create_time } xg_student_msg { bigint id PK varchar student_no varchar name varchar class_name } xg_class_msg { bigint id PK varchar class_name bigint class_teacher_id FK } sys_user { bigint id PK varchar user_name varchar nick_name } ``` --- ## 🔄 业务流程 ### 主要业务流程 #### 班主任录入操行分流程 ```mermaid flowchart TD A[班主任登录] --> B{选择录入月份} B --> C[加载班级学生列表] C --> D{学生列表为空?} D -->|是| E[提示无学生数据] D -->|否| F[显示学生列表和录入表单] F --> G[录入分数和备注] G --> H{数据验证通过?} H -->|否| I[显示错误提示] I --> G H -->|是| J[批量保存数据] J --> K{保存成功?} K -->|否| L[显示保存失败信息] L --> J K -->|是| M[更新录入状态] M --> N[显示保存成功] N --> O[结束] ``` #### 学期统计查询流程 ```mermaid flowchart TD A[管理员选择学年学期] --> B[查询该学期操行分数据] B --> C{有数据?} C -->|否| D[显示无数据提示] C -->|是| E[按学生分组计算平均分] E --> F[按班级排序展示] F --> G{需要导出?} G -->|否| H[显示统计表格] G -->|是| I[生成Excel文件] I --> J[下载文件] J --> H H --> K[结束] ``` --- ## 🎨 前端设计 ### 页面结构 #### 操行分录入页面 (ConductScoreInput.vue) - **功能**: 班主任每月录入负责班级学生操行分 - **组件**: 月份选择器、多Tab页、学生列表表格、批量编辑表单 - **交互**: 多Tab页展示不同班级,支持批量保存、数据验证提示 - **数据**: 通过`xg_class_msg.class_teacher_id`获取班主任负责的所有班级及学生信息 - **特性**: 一个老师负责多个班级的场景,每个班级一个Tab页,Tab间独立录入 #### 学期统计页面 (SemesterStatistics.vue) - **功能**: 学生处管理员查看学期平均分 - **组件**: 学年学期选择器、统计数据表格、导出按钮 - **交互**: 支持筛选排序、数据导出 - **数据**: 学期平均分统计、学生基本信息 #### 操行分查询页面 (ConductScoreQuery.vue) - **功能**: 查询历史操行分记录 - **组件**: 查询条件表单、数据表格、分页组件 - **交互**: 支持多条件筛选、详情查看 - **数据**: 操行分历史记录、关联的学生和班级信息 ### 组件设计 #### 批量录入组件 (BatchScoreInput.vue) ```typescript // 组件属性接口 interface BatchScoreInputProps { academicYear: number; // 学年 semester: number; // 学期 month: number; // 月份 classId: string; // 班级ID students: StudentInfo[]; // 学生列表 } // 组件事件接口 interface BatchScoreInputEmits { save: [scores: ConductScore[]]; // 保存分数 cancel: []; // 取消操作 } ``` #### 统计表格组件 (StatisticsTable.vue) ```typescript // 组件属性接口 interface StatisticsTableProps { data: SemesterAverage[]; // 统计数据 loading: boolean; // 加载状态 showExport: boolean; // 是否显示导出按钮 } // 组件事件接口 interface StatisticsTableEmits { export: [format: 'excel' | 'pdf']; // 导出数据 sort: [field: string, order: 'asc' | 'desc']; // 排序 } ``` --- ## 📝 开发规范 ### 代码结构 #### 后端代码结构 ``` src/main/java/org/dromara/modules/conduct/ ├── controller/ │ ├── ConductScoreController.java │ └── StatisticsController.java ├── domain/ │ ├── bo/ │ │ ├── ConductScoreBo.java │ │ └── ConductScoreQueryBo.java │ └── vo/ │ ├── ConductScoreVo.java │ ├── SemesterAverageVo.java │ └── ConductScoreDetailVo.java ├── mapper/ │ ├── ConductScoreMapper.java │ └── ConductScoreMapper.xml ├── service/ │ ├── IConductScoreService.java │ ├── IStatisticsService.java │ └── impl/ │ ├── ConductScoreServiceImpl.java │ └── StatisticsServiceImpl.java └── utils/ └── ConductScoreUtils.java ``` #### 前端代码结构 ``` src/views/conduct/ ├── index.vue # 主页面 ├── components/ │ ├── ConductScoreInput.vue # 录入组件 │ ├── SemesterStatistics.vue # 统计组件 │ └── ConductScoreQuery.vue # 查询组件 ├── types/ │ └── index.ts # 类型定义 └── api/ └── index.ts # API接口 ``` ### 命名规范 #### 后端命名规范 - **类名**: PascalCase (如: ConductScoreController, ConductScoreService) - **方法名**: camelCase (如: getConductScoreList, createConductScore) - **常量**: UPPER_SNAKE_CASE (如: MAX_SCORE_VALUE) - **包名**: 全小写 (如: com.example.module) #### 前端命名规范 - **组件名**: PascalCase (如: ConductScoreList, ConductScoreForm) - **方法名**: camelCase (如: handleSubmit, getConductScoreInfo) - **变量名**: camelCase (如: conductScoreList, isLoading) - **常量**: UPPER_SNAKE_CASE (如: API_BASE_URL) #### 数据库命名规范 - **表名**: 下划线命名 (如: xg_conduct_score) - **字段名**: 下划线命名 (如: academic_year, semester) - **索引名**: idx_表名_字段名 (如: idx_conduct_score_student_id) --- ## 🧪 测试策略 ### 测试分类 #### 单元测试 - **覆盖范围**: Service 层业务逻辑、数据验证逻辑 - **测试框架**: JUnit 5 + Mockito - **覆盖率要求**: > 80% #### 集成测试 - **覆盖范围**: Controller 层 API 接口、数据库操作 - **测试框架**: Spring Boot Test - **测试数据**: 测试数据库 #### 前端测试 - **覆盖范围**: 组件功能测试、表单验证 - **测试框架**: Vue Test Utils + Jest - **测试类型**: 组件渲染、用户交互、数据绑定 ### 测试用例设计 #### 功能测试用例 - **正常流程测试**: 验证正常的操行分录入和查询流程 - **边界值测试**: 验证分数范围、日期范围等边界条件 - **异常流程测试**: 验证错误处理和权限控制 #### 性能测试用例 - **响应时间测试**: 验证接口响应时间 < 200ms - **并发测试**: 验证批量录入时的并发处理能力 - **大数据量测试**: 验证万人规模数据查询性能 --- ## 🚀 部署运维 ### 部署环境 #### 开发环境 - **部署方式**: 本地 Docker 容器 - **数据库**: MySQL 8.0 - **缓存**: Redis 7.0 - **配置**: application-dev.yml #### 生产环境 - **部署方式**: Kubernetes - **数据库**: MySQL 8.0(集群) - **缓存**: Redis 7.0(集群) - **配置**: application-prod.yml ### 监控指标 #### 业务指标 - **录入成功率**: 操行分录入操作的成功率 - **查询响应时间**: 统计查询的平均响应时间 - **数据完整性**: 操行分数据的完整性检查 #### 技术指标 - **接口响应时间**: 平均响应时间 < 200ms - **系统可用性**: 99.9%可用性 - **错误率**: 错误率 < 0.1% --- ## 📅 开发计划 ### 开发阶段 #### 第一阶段:基础框架(1周) - [ ] 数据库表结构设计和创建 - [ ] 基础 CRUD 接口开发 - [ ] 基础页面和组件开发 - [ ] 单元测试编写 #### 第二阶段:核心功能(2周) - [ ] 操行分录入功能开发 - [ ] 学期统计功能开发 - [ ] 权限控制逻辑实现 - [ ] 集成测试 #### 第三阶段:完善优化(1周) - [ ] 功能完善和用户体验优化 - [ ] 性能测试和优化 - [ ] 文档完善 - [ ] 验收测试 ### 里程碑 - **里程碑 1**: 基础框架完成 - **里程碑 2**: 核心功能完成 - **里程碑 3**: 测试完成,准备发布 - **里程碑 4**: 正式发布上线 --- ## 🔧 开发工具 ### 后端开发工具 - **IDE**: IntelliJ IDEA - **构建工具**: Maven - **代码质量**: SonarQube - **API 测试**: Postman ### 前端开发工具 - **IDE**: VSCode - **构建工具**: Vite - **代码规范**: ESLint + Prettier - **组件预览**: Storybook ### 数据库工具 - **管理工具**: Navicat Premium - **版本控制**: Flyway - **性能监控**: MySQL Performance Schema --- ## 📖 相关文档 - **项目总览**: `../项目总览/README.md` - **开发规范**: `../开发文档/README.md` - **API 接口**: `../开发文档/API.md` - **数据库设计**: `../设计文档/database/` - **变更记录**: `../变更管理/README.md` --- ## 📝 开发注意事项 ### 重要提醒 1. **数据完整性**: 操行分数据关系到学生评价,必须确保数据准确性和完整性 2. **权限控制**: 班主任只能录入本班学生,管理员查看权限需严格控制 3. **性能优化**: 统计查询涉及大量数据计算,需要合理设计索引和缓存策略 4. **用户体验**: 批量录入功能需要良好的交互设计和数据验证 5. **业务规则**: 每月只能录入一次,不可重复录入同一学生的当月分数 ### 技术要点 1. **雪花ID**: 主键使用雪花ID,确保分布式环境下的唯一性 2. **逻辑删除**: 所有删除操作使用逻辑删除,保留历史数据 3. **多租户**: 支持多租户数据隔离 4. **审计字段**: 完整记录数据的创建和更新信息 5. **数据验证**: 前后端都需进行数据验证,确保数据质量