Files
2026-01-04 10:00:08 +08:00

637 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 学生操行分管理模块
## 📋 模块基本信息
**模块名称**: 学生操行分管理 / 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[操行分录入页面<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
```
### 数据流向
```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. **数据验证**: 前后端都需进行数据验证,确保数据质量