17 KiB
17 KiB
学生操行分管理API
📋 文档说明
版本: v1.0 制定时间: 2025-01-13 适用范围: 学生操行分管理模块API接口 重要性: ⚠️ 强制性规范 - API设计必须遵循项目统一接口规范
🎯 设计原则
1. RESTful设计
- 使用标准的HTTP方法(GET、POST、PUT、DELETE)
- 资源路径清晰,层次分明
- 状态码规范,返回信息明确
2. 统一响应格式
- 所有接口返回统一的JSON格式
- 包含状态码、消息、数据三个部分
- 分页查询使用统一的TableDataInfo格式
3. 权限控制
- 每个接口必须有@SaCheckPermission注解
- 班主任只能操作自己班级的学生
- 学生处管理员可查看全校数据
🔌 接口概览
接口分类
基础CRUD接口
| 接口名称 | 请求方式 | 路径 | 权限字符 | 功能描述 |
|---|---|---|---|---|
| 查询操行分列表 | GET | /api/xg/conduct-score/list | xg:conduct:score:list | 分页查询操行分记录 |
| 查询操行分详情 | GET | /api/xg/conduct-score/{id} | xg:conduct:score:query | 根据ID查询操行分详情 |
| 新增操行分 | POST | /api/xg/conduct-score | xg:conduct:score:add | 创建新的操行分记录 |
| 更新操行分 | PUT | /api/xg/conduct-score/{id} | xg:conductScore:update | 更新指定操行分记录 |
| 删除操行分 | DELETE | /api/xg/conduct-score/{ids} | xg:conduct:score:remove | 删除指定操行分记录 |
业务逻辑接口
| 接口名称 | 请求方式 | 路径 | 权限字符 | 功能描述 |
|---|---|---|---|---|
| 批量录入操行分 | POST | /api/xg/conduct-score/batch | xg:conduct:score:batchAdd | 批量保存操行分 |
| 班主任班级学生 | GET | /api/xg/conduct-score/class-students | xg:conduct:score:classStudents | 获取班主任班级学生列表 |
| 学期平均分统计 | GET | /api/xg/conduct-score/semester-average | xg:conduct:score:semester | 查询学期平均分 |
| 导出学期统计 | GET | /api/xg/conduct-score/export-semester | xg:conduct:score:export | 导出学期统计数据 |
| 验证录入权限 | GET | /api/xg/conduct-score/check-permission | xg:conduct:score:checkPermission | 检查班主任录入权限 |
| 获取学生详细记录 | GET | /api/xg/conduct-score/student-records/{studentId} | xg:conduct:score:studentRecords | 获取学生学期内每月操行分详情 |
📝 接口详细设计
1. 查询操行分列表
接口信息
- 请求方式: GET
- 接口路径:
/api/xg/conduct-score/list - 权限字符:
xg:conduct:score:list - 接口描述: 分页查询操行分记录列表
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| academicYear | Integer | 否 | 学年(如:2024) |
| semester | Integer | 否 | 学期(1-第一学期,2-第二学期) |
| month | Integer | 否 | 月份(1-12) |
| studentName | String | 否 | 学生姓名 |
| className | String | 否 | 班级名称 |
| scoreMin | BigDecimal | 否 | 最低分数 |
| scoreMax | BigDecimal | 否 | 最高分数 |
| pageNum | Integer | 否 | 当前页码(默认1) |
| pageSize | Integer | 否 | 每页显示数量(默认10) |
响应格式
{
"code": 200,
"msg": "查询成功",
"data": {
"total": 100,
"rows": [
{
"id": 1234567890123456789,
"academicYear": 2024,
"semester": 1,
"month": 9,
"studentId": 987654321098765432,
"studentName": "张三",
"studentNo": "2024001",
"classId": 876543210987654321,
"className": "计算机应用1班",
"classTeacherId": 765432109876543210,
"classTeacherName": "李老师",
"score": 95.50,
"remark": "表现优秀,积极参加班级活动",
"createTime": "2024-09-01 10:00:00",
"createBy": "李老师"
}
],
"code": 200,
"msg": "查询成功"
}
}
2. 批量录入操行分
接口信息
- 请求方式: POST
- 接口路径:
/api/xg/conduct-score/batch - 权限字符:
xg:conduct:score:batchAdd - 接口描述: 批量保存操行分记录
请求参数
{
"academicYear": 2024,
"semester": 1,
"month": 9,
"classId": 876543210987654321,
"scores": [
{
"studentId": 987654321098765432,
"score": 95.50,
"remark": "表现优秀,积极参加班级活动"
},
{
"studentId": 987654321098765433,
"score": 88.00,
"remark": "表现良好,需要继续努力"
}
]
}
参数说明
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| academicYear | Integer | 是 | 学年(如:2024) |
| semester | Integer | 是 | 学期(1-第一学期,2-第二学期) |
| month | Integer | 是 | 月份(1-12) |
| classId | Long | 是 | 班级ID |
| scores | Array | 是 | 操行分记录数组 |
| └─studentId | Long | 是 | 学生ID |
| └─score | BigDecimal | 是 | 操行分数(0.00-100.00) |
| └─remark | String | 否 | 备注信息 |
响应格式
{
"code": 200,
"msg": "批量录入成功",
"data": {
"successCount": 45,
"failCount": 0,
"failList": []
}
}
3. 班主任班级学生列表
接口信息
- 请求方式: GET
- 接口路径:
/api/xg/conduct-score/class-students - 权限字符:
xg:conduct:score:classStudents - 接口描述: 获取班主任负责的所有班级及学生列表,用于多Tab页展示
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| academicYear | Integer | 否 | 学年(如:2024) |
| semester | Integer | 否 | 学期(1-第一学期,2-第二学期) |
| month | Integer | 否 | 月份(1-12) |
响应格式
{
"code": 200,
"msg": "查询成功",
"data": {
"classes": [
{
"classId": 876543210987654321,
"className": "计算机1班",
"classCode": "JSJ202401",
"studentCount": 45,
"enrollmentYear": 2024,
"majorName": "计算机应用技术",
"students": [
{
"studentId": 987654321098765432,
"studentNo": "2024001",
"studentName": "张三",
"gender": "0",
"existingScore": null,
"lastScore": 95.50,
"lastMonth": 8
},
{
"studentId": 987654321098765433,
"studentNo": "2024002",
"studentName": "李四",
"gender": "1",
"existingScore": {
"id": 1234567890123456789,
"score": 88.00,
"remark": "表现良好",
"createTime": "2024-09-01 09:00:00"
},
"lastScore": 90.00,
"lastMonth": 8
}
]
}
],
"summary": {
"totalClasses": 3,
"totalStudents": 125,
"recordedStudents": 87,
"pendingStudents": 38,
"completionRate": 69.6
}
}
}
4. 学期平均分统计
接口信息
- 请求方式: GET
- 接口路径:
/api/xg/conduct-score/semester-average - 权限字符:
xg:conduct:score:semester - 接口描述: 查询学生的学期操行平均分
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| academicYear | Integer | 是 | 学年(如:2024) |
| semester | Integer | 是 | 学期(1-第一学期,2-第二学期) |
| className | String | 否 | 班级名称筛选 |
| studentName | String | 否 | 学生姓名筛选 |
| pageNum | Integer | 否 | 当前页码(默认1) |
| pageSize | Integer | 否 | 每页显示数量(默认10) |
响应格式
{
"code": 200,
"msg": "查询成功",
"data": {
"total": 500,
"rows": [
{
"studentId": 987654321098765432,
"studentNo": "2024001",
"studentName": "张三",
"gender": "0",
"classId": 876543210987654321,
"className": "计算机应用1班",
"academicYear": 2024,
"semester": 1,
"avgScore": 92.83,
"recordCount": 6,
"maxScore": 98.00,
"minScore": 88.00,
"scoreRange": "88.00-98.00",
"lastUpdateTime": "2024-09-30 16:00:00"
}
],
"summary": {
"totalStudents": 500,
"avgScore": 85.67,
"excellentCount": 120,
"goodCount": 280,
"averageCount": 85,
"needImprovementCount": 15
},
"code": 200,
"msg": "查询成功"
}
}
5. 获取学生详细记录
接口信息
- 请求方式: GET
- 接口路径:
/api/xg/conduct-score/student-records/{studentId} - 权限字符:
xg:conduct:score:studentRecords - 接口描述: 获取指定学生在某学期内1-12月份的操行分详细记录,没有数据的月份显示为空
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| studentId | Long | 是 | 学生ID(路径参数) |
| academicYear | Integer | 否 | 学年(如:2024) |
| semester | Integer | 否 | 学期(1-第一学期,2-第二学期) |
| tenantId | String | 是 | 租户ID(多租户支持) |
响应格式
{
"code": 200,
"msg": "查询成功",
"data": {
"studentId": 987654321098765432,
"studentNo": "2024001",
"studentName": "张三",
"gender": "0",
"classId": 876543210987654321,
"className": "计算机应用1班",
"classTeacherId": 765432109876543210,
"classTeacherName": "李老师",
"semesterAverage": 92.83,
"totalRecords": 6,
"records": [
{
"id": 1234567890123456789,
"academicYear": 2024,
"semester": 1,
"month": 9,
"score": 95.50,
"remark": "表现优秀,积极参加班级活动",
"createBy": 765432109876543210,
"createByName": "李老师",
"createTime": "2024-09-01 10:00:00",
"updateBy": 765432109876543210,
"updateByName": "李老师",
"updateTime": "2024-09-01 10:00:00"
},
{
"id": 1234567890123456790,
"academicYear": 2024,
"semester": 1,
"month": 10,
"score": 92.00,
"remark": "表现良好,继续保持",
"createBy": 765432109876543210,
"createByName": "李老师",
"createTime": "2024-10-01 09:30:00",
"updateBy": 765432109876543210,
"updateByName": "李老师",
"updateTime": "2024-10-01 09:30:00"
}
]
}
}
数据说明
records数组:包含该学生该学期内所有有数据的月份记录- 没有数据的月份不会出现在
records数组中,前端需要生成1-12月的完整列表 semesterAverage:该学生该学期的平均分totalRecords:该学生该学期录入的总记录数
🔒 权限控制设计
权限字符定义
// 操行分管理权限
xg:conductScore:list // 查看操行分列表
xg:conductScore:list // 查看操行分列表(按部门)
xg:conductScore:batchAdd // 批量录入操行分
xg:conductScore:batchUpdate // 批量更新操行分
xg:conductScore:classStudents // 查看班主任班级学生
xg:conductScore:export // 导出操行分数据
xg:conductScore:semesterAverage // 学期平均分统计
xg:conductScore:exportSemester // 导出学期统计
xg:conductScore:studentRecords // 获取学生详细记录
xg:conductScore:classDetail // 查看班级详情
xg:conductScore:update // 更新操行分
xg:conductScore:remove // 删除操行分
xg:conductScore:checkPermission // 验证录入权限
xg:conductScore:importTemplate // 导入模板
xg:conductScore:importData // 导入数据
xg:conduct:score:export // 数据导出
xg:conduct:score:studentRecords // 获取学生详细记录
权限控制逻辑
班主任权限控制
@SaCheckPermission("xg:conduct:score:classStudents")
@GetMapping("/class-students")
public AjaxResult getClassStudents(@RequestParam Integer academicYear,
@RequestParam Integer semester,
@RequestParam Integer month) {
// 获取当前登录用户ID
Long userId = SecurityUtils.getUserId();
// 从 xg_class_msg 表查询该用户作为班主任的所有班级
// WHERE class_teacher_id = #{userId} AND deleted = 0
List<Long> classIds = conductScoreService.getTeacherClassIds(userId);
// 返回按班级分组的学生信息,用于前端生成Tab页
return AjaxResult.success(conductScoreService.getClassStudentsByTeacher(academicYear, semester, month));
}
管理员权限控制
@SaCheckPermission("xg:conduct:score:semester")
@GetMapping("/semester-average")
public TableDataInfo getSemesterAverage(@RequestParam Integer academicYear,
@RequestParam Integer semester,
XgConductScoreQueryBo queryBo,
PageQuery pageQuery) {
// 管理员可以查看全校数据,无班级限制
return xgConductScoreService.getSemesterAverage(academicYear, semester, queryBo, pageQuery);
}
📊 数据验证规则
请求参数验证
public class XgConductScoreBatchBo {
@NotNull(message = "学年不能为空")
@Min(value = 2020, message = "学年不能小于2020")
@Max(value = 2030, message = "学年不能大于2030")
private Integer academicYear;
@NotNull(message = "学期不能为空")
@Min(value = 1, message = "学期只能是1或2")
@Max(value = 2, message = "学期只能是1或2")
private Integer semester;
@NotNull(message = "月份不能为空")
@Min(value = 1, message = "月份范围为1-12")
@Max(value = 12, message = "月份范围为1-12")
private Integer month;
@NotNull(message = "班级ID不能为空")
private Long classId;
@NotEmpty(message = "操行分记录不能为空")
@Size(min = 1, max = 100, message = "一次最多录入100条记录")
@Valid
private List<XgConductScoreItemBo> scores;
}
业务逻辑验证
班主任权限验证
private void validateTeacherPermission(Long classId, Long teacherId) {
// 验证班主任是否负责该班级
boolean isResponsible = conductScoreService.checkTeacherClass(teacherId, classId);
if (!isResponsible) {
throw new ServiceException("您不是该班级的班主任,无权录入操行分");
}
}
重复录入验证
private void validateNoDuplicate(Long studentId, Integer academicYear,
Integer semester, Integer month) {
// 检查是否已存在该学生的当月记录
boolean exists = conductScoreService.existsByStudentAndMonth(
studentId, academicYear, semester, month);
if (exists) {
throw new ServiceException("该学生当月操行分已录入,不可重复录入");
}
}
🔄 错误码设计
业务级错误码
| 错误码 | 说明 |
|---|---|
| 1001 | 班主任权限不足 |
| 1002 | 学生不存在 |
| 1003 | 班级不存在 |
| 1004 | 操行分已存在,不可重复录入 |
| 1005 | 分数范围错误 |
| 1006 | 时间参数错误 |
错误响应格式
{
"code": 1001,
"msg": "您不是该班级的班主任,无权录入操行分",
"data": null
}
📈 性能优化
接口性能指标
- 响应时间: 平均 < 200ms,95% < 500ms
- 并发处理: 支持 100+ 并发请求
- 数据量: 支持万人规模数据查询
缓存策略
// 学期统计缓存
@Cacheable(value = "conductScoreStats", key = "#academicYear + '_' + #semester")
public List<XgConductScoreSemesterAverageVo> getSemesterAverage(Integer academicYear, Integer semester) {
// 查询逻辑
}
🧪 接口测试
测试用例设计
正常流程测试
# 批量录入操行分
curl -X POST "http://localhost:8080/api/xg/conduct-score/batch" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"academicYear": 2024,
"semester": 1,
"month": 9,
"classId": 876543210987654321,
"scores": [
{"studentId": 987654321098765432, "score": 95.5, "remark": "优秀"}
]
}'
异常流程测试
# 权限不足测试
curl -X GET "http://localhost:8080/api/xg/conduct-score/class-students" \
-H "Authorization: Bearer {invalid_token}"
# 响应: {"code": 403, "msg": "权限不足", "data": null}
📚 相关文档
- 数据库设计:
../技术设计/数据库设计.md - 前端设计:
../前端设计/界面原型图.md - 项目API总览:
API文档总览.md
最后更新: 2025-01-13 接口版本: v1.0 兼容性: 向后兼容