637 lines
20 KiB
Markdown
637 lines
20 KiB
Markdown
# 学生操行分管理模块
|
||
|
||
## 📋 模块基本信息
|
||
|
||
**模块名称**: 学生操行分管理 / 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. **数据验证**: 前后端都需进行数据验证,确保数据质量
|