学生操行分管理模块
📋 模块基本信息
模块名称: 学生操行分管理 / 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 # 常见问题
🏗️ 系统架构
模块架构图
graph TB
subgraph "前端层"
A1[操行分录入页面<br/>ConductScoreInput.vue]
A2[学期统计页面<br/>SemesterStatistics.vue]
A3[操行分查询页面<br/>ConductScoreQuery.vue]
end
subgraph "接口层"
B1[操行分Controller<br/>ConductScoreController]
B2[统计Controller<br/>StatisticsController]
end
subgraph "业务层"
C1[操行分Service<br/>IConductScoreService]
C2[统计Service<br/>IStatisticsService]
C3[权限Service<br/>IPermissionService]
end
subgraph "数据层"
D1[操行分Mapper<br/>ConductScoreMapper]
D2[统计SQL<br/>统计查询语句]
D3[Redis缓存<br/>缓存统计结果]
end
A1 --> B1
A2 --> B2
A3 --> B1
B1 --> C1
B2 --> C2
C1 --> C3
C2 --> C3
C1 --> D1
C2 --> D1
C2 --> D2
D2 --> D3
数据流向
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页独立保存状态
关键流程
- 系统根据当前用户ID查询
xg_class_msg表获取负责的班级 - 动态生成Tab页,每个Tab对应一个班级
- 班主任选择录入月份
- 系统加载对应班级学生列表
- 班主任为每位学生录入分数和备注
- 系统验证数据完整性和合理性
- 批量保存到数据库(支持跨Tab页批量保存)
- 更新录入状态记录
2. 学期统计分析
业务描述
学生处管理员查看学生的学期操行平均分,系统自动计算每个学生的学期平均表现,并提供导出功能。
技术实现
- 前端实现: 数据表格组件,支持排序、筛选和导出
- 后端实现: 统计查询接口,包含缓存优化
- 数据处理: SQL聚合查询或Java计算逻辑
关键流程
- 管理员选择学年和学期
- 系统查询该学期所有学生的分数记录
- 计算每个学生的平均分
- 按班级或专业分组展示
- 支持数据导出功能
🔌 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代表删除) |
实体关系图
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
}
🔄 业务流程
主要业务流程
班主任录入操行分流程
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[结束]
学期统计查询流程
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)
// 组件属性接口
interface BatchScoreInputProps {
academicYear: number; // 学年
semester: number; // 学期
month: number; // 月份
classId: string; // 班级ID
students: StudentInfo[]; // 学生列表
}
// 组件事件接口
interface BatchScoreInputEmits {
save: [scores: ConductScore[]]; // 保存分数
cancel: []; // 取消操作
}
统计表格组件 (StatisticsTable.vue)
// 组件属性接口
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
📝 开发注意事项
重要提醒
- 数据完整性: 操行分数据关系到学生评价,必须确保数据准确性和完整性
- 权限控制: 班主任只能录入本班学生,管理员查看权限需严格控制
- 性能优化: 统计查询涉及大量数据计算,需要合理设计索引和缓存策略
- 用户体验: 批量录入功能需要良好的交互设计和数据验证
- 业务规则: 每月只能录入一次,不可重复录入同一学生的当月分数
技术要点
- 雪花ID: 主键使用雪花ID,确保分布式环境下的唯一性
- 逻辑删除: 所有删除操作使用逻辑删除,保留历史数据
- 多租户: 支持多租户数据隔离
- 审计字段: 完整记录数据的创建和更新信息
- 数据验证: 前后端都需进行数据验证,确保数据质量