27 KiB
27 KiB
学生信息批次收集API文档
📋 文档信息
| 项目 | 信息 |
|---|---|
| 项目名称 | 校园管理系统 - 学生信息批次收集 |
| API模块 | 学生信息批次收集管理 |
| 文档版本 | V1.0.0 |
| 创建时间 | 2025-01-27 |
| 基础路径 | /studentMsgBatch/studentMsgBatch |
🎯 API概述
模块说明
学生信息批次收集系统提供学生信息收集、查询、历史记录管理等API接口,支持学生提交个人信息、管理员查询和审核学生信息等功能。
技术规范
- 认证方式: Bearer Token (Sa-Token)
- 数据格式: JSON
- 响应格式: 统一使用R类型或TableDataInfo分页格式
- 权限控制: 基于角色的权限管理(RBAC)
权限角色
- 学生: 查看和提交个人信息
- 班主任: 查看所带班级学生信息
- 学工管理员: 查看权限范围内的学生信息
- 系统管理员: 完整的学生信息管理权限
📊 数据模型
学生信息批次VO (XgStudentMsgBatchVo)
{
"id": 1, // 主键ID(雪花ID)
"deleted": 0, // 删除标志(0存在 1删除)
"studentNo": "2025001", // 学号
"idCard": "110101199901011234", // 身份证号
"name": "张三", // 姓名
"nameEnglish": "Zhang San", // 英文姓名
"formerName": "", // 曾用名
"gender": "0", // 性别(0-男,1-女)
"birthDate": "1999-01-01", // 出生日期
"nationality": "汉族", // 民族
"nativePlace": "北京市", // 籍贯
"politicalStatus": "团员", // 政治面貌
"hukouLocation": "北京市海淀区", // 户籍所在地
"homeAddress": "北京市海淀区中关村南大街1号", // 家庭地址
"currentAddress": "北京市海淀区学院路8号", // 现住址
"postalCode": "100081", // 邮政编码
"photoUrl": "http://example.com/photo.jpg", // 照片URL
"photoPath": "/upload/photo/2025/01/photo.jpg", // 照片存储路径
"phone": "13800138000", // 手机号码
"isBoarder": 1, // 是否住校(0-否,1-是)
"educationLevel": "本科", // 文化程度
"householdRegisterType": "城镇", // 户口类型
"religion": "无", // 宗教信仰
"sourceRegion": "北京市", // 生源地区
"graduateSchool": "北京市第一中学", // 毕业院校
"email": "zhangsan@example.com", // 电子邮箱
"qq": "123456789", // QQ号码
"wechat": "zhangsan_wx", // 微信号
"maritalStatus": "1", // 婚姻状况(1未婚 2已婚 3离异 4丧偶)
"emergencyContactName": "张父亲", // 紧急联系人姓名
"emergencyContactPhone": "13900139000", // 紧急联系人电话
"emergencyContactRelation": "父亲", // 紧急联系人关系
"isPoorStudent": 0, // 是否贫困生(0-否,1-是)
"isMinority": 0, // 是否少数民族(0-否,1-是)
"isDisabled": 0, // 是否残疾(0-否,1-是)
"isOrphan": 0, // 是否孤儿(0-否,1-是)
"isLeftBehindChild": 0, // 是否留守儿童(0-否,1-是)
"isSingleChild": 1, // 是否独生子女(0-否,1-是)
"isLowIncome": 0, // 是否低保(0-否,1-是)
"hasLoan": 0, // 是否有助学贷款(0-否,1-是)
"loanAmount": 0.0, // 助学贷款金额
"specialties": "篮球、编程", // 特长爱好
"awards": "三好学生", // 获奖情况
"violations": "", // 违纪记录
"socialActivities": "志愿服务活动", // 社会活动
"fatherName": "张父亲", // 父亲姓名
"fatherPhone": "13900139001", // 父亲电话
"fatherWorkUnit": "北京某公司", // 父亲工作单位
"motherName": "张母亲", // 母亲姓名
"motherPhone": "13900139002", // 母亲电话
"motherWorkUnit": "北京某事业单位", // 母亲工作单位
"guardianName": "张父亲", // 监护人姓名
"guardianPhone": "13900139001", // 监护人电话
"guardianRelation": "父亲", // 监护人关系
"familyIncome": 100000.0, // 家庭年收入
"perCapitaIncome": 33333.33, // 人均收入
"incomeSource": "工资收入", // 收入来源
"familyEconomicStatus": "一般", // 家庭经济状况
"familyMembers": 3, // 家庭成员数量
"height": 175.5, // 身高(cm)
"weight": 65.0, // 体重(kg)
"bloodType": "A", // 血型
"healthStatus": "健康", // 健康状况
"specialCondition": "", // 特殊体质或疾病
"medicalHistory": "", // 病史
"allergies": "", // 过敏史
"disabilityType": "", // 残疾类型
"disabilityLevel": "", // 残疾等级
"admissionCategory": "统招", // 录取类别
"studentStatus": "1", // 学籍状态(1在籍 2休学 3复学 4退学 5毕业)
"enrollmentYear": 2025, // 入学年份
"enrollmentDate": "2025-09-01", // 入学日期
"bankCardNo": "6222081234567890123", // 银行卡号
"bankName": "中国工商银行", // 开户银行
"bankBranch": "北京中关村支行", // 开户支行
"cardHolderName": "张三", // 持卡人姓名
"infoStatus": "3", // 信息状态(1正常 2待审核 3审核中 4已驳回 5已锁定)
"dataSource": "manual", // 数据来源(manual手工录入 import批量导入 sync系统同步)
"lastBatchId": 1, // 最后修改批次ID
"lastAuditTime": "2025-01-27 10:00:00", // 最后审核时间
"isComplete": 1, // 信息是否完整(0不完整 1完整)
"completionRate": 95.5, // 完整度百分比
"schoolSystem": 4, // 学制(年)
"academicLevel": "本科", // 学历层次
"trainingType": "全日制", // 培养方式
"majorId": "10001", // 专业ID
"majorName": "计算机科学与技术", // 专业名称
"classId": "20250101", // 班级ID
"className": "计算机2025-1班", // 班级名称
"grade": "2025", // 年级
"collegeId": "1001", // 学院ID
"collegeName": "计算机学院", // 学院名称
"counselorId": 1001, // 辅导员ID
"counselorName": "李辅导员", // 辅导员姓名
"classTeacherId": 1002, // 班主任ID
"classTeacherName": "王老师", // 班主任姓名
"dormitoryBuilding": "1号楼", // 宿舍楼栋
"dormitoryRoom": "101", // 宿舍房间号
"extField1": "", // 扩展字段1
"extField2": "", // 扩展字段2
"extField3": "", // 扩展字段3
"extField4": "", // 扩展字段4
"extField5": "", // 扩展字段5
"remark": "备注信息", // 备注信息
"batchId": 1, // 正在进行中的批次ID
"createBy": 1, // 创建者
"createTime": "2025-01-27 10:00:00", // 创建时间
"updateBy": 1, // 更新者
"updateTime": "2025-01-27 10:00:00" // 更新时间
}
🔧 API接口列表
1. 分页查询学生信息批次收集列表
- 接口路径: GET
/studentMsgBatch/studentMsgBatch/list - 接口功能: 分页查询学生信息批次收集列表
- 权限要求:
studentMsgBatch:studentMsgBatch:list
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| pageNum | Integer | 否 | 页码,默认1 |
| pageSize | Integer | 否 | 每页条数,默认10 |
| batchId | Long | 否 | 批次ID |
| studentNo | String | 否 | 学号 |
| name | String | 否 | 姓名(模糊查询) |
| phone | String | 否 | 手机号码 |
| infoStatus | String | 否 | 信息状态 |
| classId | String | 否 | 班级ID |
响应数据
{
"code": 200,
"msg": "操作成功",
"rows": [
{
"id": 1,
"studentNo": "2025001",
"name": "张三",
"phone": "13800138000",
"infoStatus": "3",
"className": "计算机2025-1班",
"createTime": "2025-01-27 10:00:00"
}
],
"total": 100
}
📌 排序说明:分页列表默认按照学号
studentNo降序排序;若学号相同,则继续按照createTime降序排列,确保最新学号优先展示。
2. 导出学生信息批次收集列表
- 接口路径: POST
/studentMsgBatch/studentMsgBatch/export - 接口功能: 导出学生信息批次收集列表到Excel
- 权限要求:
studentMsgBatch:studentMsgBatch:export
请求参数
同查询列表接口,用于筛选导出数据。
响应数据
返回Excel文件流。
3. 获取学生信息批次收集详细信息
- 接口路径: GET
/studentMsgBatch/studentMsgBatch/{id} - 接口功能: 根据主键ID获取学生信息详细信息
- 权限要求:
studentMsgBatch:studentMsgBatch:query
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | Long | 是 | 主键ID |
响应数据
{
"code": 200,
"msg": "操作成功",
"data": {
"id": 1,
"studentNo": "2025001",
"name": "张三",
// ... 完整的学生信息字段
}
}
4. 新增学生信息批次收集
- 接口路径: POST
/studentMsgBatch/studentMsgBatch - 接口功能: 新增学生信息批次收集记录
- 权限要求:
studentMsgBatch:studentMsgBatch:add
请求参数
{
"studentNo": "2025001",
"name": "张三",
"gender": "0",
"phone": "13800138000",
"batchId": 1
// ... 其他学生信息字段
}
响应数据
{
"code": 200,
"msg": "操作成功"
}
5. 修改学生信息批次收集
- 接口路径: PUT
/studentMsgBatch/studentMsgBatch - 接口功能: 修改学生信息批次收集记录
- 权限要求:
studentMsgBatch:studentMsgBatch:edit
请求参数
{
"id": 1,
"studentNo": "2025001",
"name": "张三",
"gender": "0",
"phone": "13800138000",
"batchId": 1
// ... 其他学生信息字段
}
响应数据
{
"code": 200,
"msg": "操作成功"
}
6. 删除学生信息批次收集
- 接口路径: DELETE
/studentMsgBatch/studentMsgBatch/{ids} - 接口功能: 批量删除学生信息批次收集记录
- 权限要求:
studentMsgBatch:studentMsgBatch:remove
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ids | Long[] | 是 | 主键ID数组 |
响应数据
{
"code": 200,
"msg": "操作成功"
}
7. 查询学生信息完善历史记录
- 接口路径: GET
/studentMsgBatch/studentMsgBatch/history/{batchId} - 接口功能: 查询学生信息完善的历史记录信息及最后一次提交的信息状态
- 权限要求:
studentMsgBatch:studentMsgBatch:query
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| batchId | Long | 是 | 批次ID |
响应数据
{
"code": 200,
"msg": "操作成功",
"data": {
"historyMsg": [
{
"id": 1,
"name": "张三",
"createTime": "2025-01-27 10:00:00",
"createBy": 1,
"createByName": "张三",
"infoStatus": "3",
"remark": "信息已提交"
}
],
"currentMsg": [
{
"id": 1,
"studentNo": "2025001",
"name": "张三",
// ... 完整的当前信息
}
]
}
}
8. 获取用户该批次的历史已填写数据
- 接口路径: GET
/studentMsgBatch/studentMsgBatch/userHistoryData/{batchId} - 接口功能: 获取当前用户在指定批次的历史已填写数据
- 权限要求:
studentMsgBatch:studentMsgBatch:query
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| batchId | Long | 是 | 批次ID |
响应数据
{
"code": 200,
"msg": "操作成功",
"data": {
"id": 1,
"studentNo": "2025001",
"name": "张三",
// ... 完整的学生信息字段
}
}
9. 学生提交信息完善数据
- 接口路径: POST
/studentMsgBatch/studentMsgBatch/submitStudentMsg - 接口功能: 学生提交信息完善数据
- 权限要求:
studentMsgBatch:studentMsgBatch:add
请求参数
{
"id": 1,
"studentNo": "2025001",
"name": "张三",
"gender": "0",
"phone": "13800138000",
"batchId": 1
// ... 其他学生信息字段
}
响应数据
{
"code": 200,
"msg": "操作成功"
}
10. 驳回学生信息提交
- 接口路径: POST
/studentMsgBatch/studentMsgBatch/rejectStudentMsg - 接口功能: 驳回学生信息提交,设置驳回状态并记录驳回原因
- 权限要求:
studentMsgBatch:studentMsgBatch:edit
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| batchId | Long | 是 | 批次ID |
| userId | Long | 是 | 用户ID(学生ID) |
| remark | String | 是 | 驳回原因 |
响应数据
{
"code": 200,
"msg": "操作成功"
}
业务逻辑说明
-
更新
xg_student_msg_batch表中符合条件的记录:- 更新条件:
batch_id = #{batchId} AND id = #{userId} AND deleted = 0 - 更新字段:
remark = #{remark}(驳回原因)info_status = '4'(驳回状态)update_by = #{currentUserId}(当前登录人ID)update_time = NOW()(当前时间)
- 更新条件:
-
记录操作日志,便于审计追踪
使用示例
// 驳回学生信息提交
fetch('/studentMsgBatch/studentMsgBatch/rejectStudentMsg', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: 'batchId=123&userId=456&remark=信息填写不完整,请重新提交'
})
.then(response => response.json())
.then(data => {
if (data.code === 200) {
console.log('驳回成功');
}
});
状态说明
| 状态值 | 状态名称 | 说明 |
|---|---|---|
| 1 | 待填写 | 学生尚未开始填写信息 |
| 2 | 填写中 | 学生正在填写信息 |
| 3 | 已提交 | 学生已提交信息,等待审核 |
| 4 | 审核不通过 | 管理员驳回,学生需要重新填写 |
| 5 | 审核通过 | 管理员审核通过 |
11. 根据部门ID查询学生数据(新增)
- 接口路径: GET
/studentMsgBatch/studentMsgBatch/listByDept - 接口功能: 根据部门ID查询该组织下所有已完善信息的学生数据
- 权限要求:
studentMsgBatch:studentMsgBatch:query
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| batchId | Long | 是 | 批次ID |
| deptId | Long | 是 | 部门ID |
| name | String | 否 | 学生姓名(模糊查询) |
| studentNo | String | 否 | 学号(精确查询) |
| phone | String | 否 | 手机号码(精确查询) |
| infoStatus | String | 否 | 信息状态 |
| pageNum | Integer | 否 | 页码,默认1 |
| pageSize | Integer | 否 | 每页条数,默认10 |
响应数据
{
"code": 200,
"msg": "操作成功",
"rows": [
{
"id": 1,
"studentNo": "2025001",
"name": "张三",
"phone": "13800138000",
"infoStatus": "3",
"className": "计算机2025-1班",
"collegeName": "计算机学院",
"createTime": "2025-01-27 10:00:00"
}
],
"total": 50
}
业务逻辑说明
- 根据
deptId在sys_dept表中查询该部门及其所有子部门的ID列表 - 在
xg_student_msg_batch表中查询:batch_id = 入参的batchIddeleted = 0class_id IN 部门ID列表(班级ID等于部门ID)- 支持按姓名、学号、手机号、信息状态等条件过滤
- 分页查询
使用示例
// 查询部门ID为101下的所有学生数据
fetch('/studentMsgBatch/studentMsgBatch/listByDept?batchId=1&deptId=101&pageNum=1&pageSize=10')
.then(response => response.json())
.then(data => {
console.log('查询结果:', data);
});
12. 比较学生信息变更详情(新增)
- 接口路径: GET
/studentMsgBatch/studentMsgBatch/compareStudentMsg - 接口功能: 比较学生提交信息与原始信息的字段变更详情
- 权限要求:
studentMsgBatch:studentMsgBatch:query
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| batchId | Long | 是 | 批次ID |
| userId | Long | 是 | 用户ID(学生ID) |
响应数据
{
"code": 200,
"msg": "操作成功",
"data": {
"hasOriginalData": true,
"hasBatchData": true,
"changedFields": [
{
"fieldLabel": "姓名",
"fieldName": "name",
"originalValue": "张三",
"newValue": "张三丰"
},
{
"fieldLabel": "手机号码",
"fieldName": "phone",
"originalValue": "13800138000",
"newValue": "13900139000"
},
{
"fieldLabel": "家庭地址",
"fieldName": "homeAddress",
"originalValue": "北京市海淀区中关村南大街1号",
"newValue": "北京市朝阳区建国门外大街1号"
}
],
"totalChanges": 3,
"originalData": {...},
"batchData": {...}
}
}
返回字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
| hasOriginalData | Boolean | 是否找到原始学生信息 |
| hasBatchData | Boolean | 是否找到批次提交信息 |
| changedFields | Array | 变更字段列表 |
| totalChanges | Integer | 变更字段总数 |
| originalData | Object | 完整的原始数据 |
| batchData | Object | 完整的批次数据 |
changedFields字段结构
| 字段名 | 类型 | 说明 |
|---|---|---|
| fieldLabel | String | 字段中文名称 |
| fieldName | String | 字段英文名称 |
| originalValue | Object | 原始值(可能为null) |
| newValue | Object | 修改后的值(可能为null) |
业务逻辑说明
-
数据查询:
- 原始数据:从
xg_student_msg表查询,条件:id = userId AND deleted = 0 - 批次数据:从
xg_student_msg_batch表查询,条件:id = userId AND batch_id = batchId AND deleted = 0
- 原始数据:从
-
字段比较:
- 比较两个对象的所有业务字段(70+个字段)
- 支持空值安全比较,正确处理null值情况
- 只返回有变更的字段,提高性能和可读性
-
异常处理:
- 当原始数据不存在时,返回
hasOriginalData: false - 当批次数据不存在时,返回
hasBatchData: false - 查询异常时返回友好的错误信息
- 当原始数据不存在时,返回
涵盖字段范围
- 基本信息: 姓名、性别、出生日期、民族、籍贯、政治面貌等
- 联系信息: 手机号码、邮箱、家庭地址、现住址等
- 家庭信息: 父母信息、监护人信息、家庭经济状况等
- 健康信息: 身高、体重、血型、健康状况、过敏史等
- 学籍信息: 录取类别、学籍状态、入学信息等
- 银行信息: 银行卡号、开户银行、开户支行等
- 扩展字段: 5个自定义扩展字段
使用场景
- 审核前查看: 管理员审核前查看学生修改了哪些信息
- 变更记录: 记录学生信息的变更历史
- 数据核实: 对比确认学生提交的修改内容
- 审计追踪: 提供完整的信息变更审计轨迹
使用示例
// 比较学生ID为1001在批次ID为1中的信息变更
fetch('/studentMsgBatch/studentMsgBatch/compareStudentMsg?batchId=1&userId=1001')
.then(response => response.json())
.then(data => {
console.log('变更详情:', data);
if (data.data.totalChanges > 0) {
console.log('共有', data.data.totalChanges, '个字段发生变更');
data.data.changedFields.forEach(change => {
console.log(`${change.fieldLabel}: ${change.originalValue} → ${change.newValue}`);
});
} else {
console.log('没有字段变更');
}
});
📝 使用示例
前端调用示例
import { request } from '@/utils/request';
// 查询学生信息列表
export function getStudentMsgBatchList(params: any) {
return request({
url: '/studentMsgBatch/studentMsgBatch/list',
method: 'get',
params
});
}
// 根据部门查询学生信息
export function getStudentMsgBatchByDept(params: any) {
return request({
url: '/studentMsgBatch/studentMsgBatch/listByDept',
method: 'get',
params
});
}
// 获取学生详细信息
export function getStudentMsgBatchDetail(id: number) {
return request({
url: `/studentMsgBatch/studentMsgBatch/${id}`,
method: 'get'
});
}
// 学生提交信息
export function submitStudentMsg(data: any) {
return request({
url: '/studentMsgBatch/studentMsgBatch/submitStudentMsg',
method: 'post',
data
});
}
后端测试示例
@Test
public void testQueryByDeptId() {
// 测试根据部门ID查询学生数据
PageQuery pageQuery = new PageQuery();
pageQuery.setPageNum(1);
pageQuery.setPageSize(10);
TableDataInfo<XgStudentMsgBatchVo> result =
xgStudentMsgBatchService.queryPageListByDeptId(
1L, // batchId
101L, // deptId
"张", // name
null, // studentNo
null, // phone
"3", // infoStatus
pageQuery // pageQuery
);
Assert.assertNotNull(result);
Assert.assertTrue(result.getTotal() >= 0);
}
⚠️ 注意事项
数据安全
- 权限验证: 所有接口都进行严格的权限验证
- 数据过滤: 用户只能查看权限范围内的数据
- SQL注入防护: 使用参数绑定防止SQL注入
性能优化
- 查询优化: 使用索引优化大数据量查询
- 部门树查询: 使用FIND_IN_SET优化部门层级查询
- 分页查询: 大列表数据支持分页
业务规则
- 数据关联: 班级ID等于部门ID的设计规则
- 状态管理: 信息状态流转(正常→待审核→审核中→已驳回/已锁定)
- 逻辑删除: 支持数据的逻辑删除和恢复
错误处理
- 参数验证: 对所有输入参数进行验证
- 异常捕获: 完善的异常处理机制
- 友好提示: 提供用户友好的错误信息
📈 版本更新记录
V1.0.0 (2025-01-27)
- 🆕 新增
listByDept根据部门ID查询学生数据接口 - 🔧 完善学生信息批次收集的完整API接口
- 📝 完善API文档和使用示例
- 🔐 完善权限控制策略
- ✨ 支持部门层级查询和分页功能
V1.1.0 (2025-01-27)
- 🎯 审核功能优化: 审核按钮集成学生信息详情弹窗
- 🔧 前端集成: 在学生信息审核界面(
auditDialog.vue)中集成学生信息完善弹窗(stuMsgDialog.vue) - 📊 参数传递优化: 优化batchId和用户ID的传递机制
- 🎨 用户体验提升: 从简单审核升级为完整信息查看和编辑
V1.2.0 (2025-01-27)
- 🆕 新增比较接口:
compareStudentMsg学生信息变更详情比较接口 - 🔍 字段对比功能: 支持70+个字段的全面比较,包括基本信息、家庭信息、健康信息等
- 📋 变更记录: 提供详细的字段变更记录,支持原值与新值对比
- 🔒 权限复用: 复用现有查询权限,无需额外权限配置
- 📝 完善文档: 更新API文档,添加接口使用示例和业务说明
🎯 前端审核功能集成
审核界面优化说明
文件路径: web/src/views/stuMsgAudit/auditDialog.vue
功能升级
- 原有功能: 简单的通过/不通过审核弹窗
- 升级后: 完整的学生信息查看和编辑界面,包含历史记录、基础信息、扩展信息等
技术实现
<!-- 审核按钮点击触发 -->
<el-button link type="primary" icon="View" @click="handleAuditStudent(scope.row)">
审核
</el-button>
<!-- 学生信息详情弹窗 -->
<component
:is="StuMsgDialogComponent"
:visible="stuMsgDialogVisible"
:title="stuMsgDialogTitle"
:batchInfo="stuMsgBatchInfo"
@update:visible="stuMsgDialogVisible = $event"
@confirm="handleStuMsgConfirm"
v-if="StuMsgDialogComponent"
/>
参数传递
const handleAuditStudent = (row: StudentAuditInfo) => {
// 构建传递给学生信息弹窗的批次信息
stuMsgBatchInfo.value = {
batchId: props.batchInfo?.id, // 批次ID
userId: row.id, // 学生用户ID
...props.batchInfo // 其他批次信息
};
stuMsgDialogTitle.value = `学生信息审核 - ${row.name}`;
stuMsgDialogVisible.value = true;
};
组件加载
- 使用
defineAsyncComponent动态加载组件 - 避免静态导入可能的类型错误
- 支持按需加载,优化性能
const StuMsgDialogComponent = defineAsyncComponent(() => import('./stuMsgDialog.vue'));
集成效果
-
操作流程:
- 点击学生列表中的"审核"按钮
- 弹出完整的学生信息详情界面
- 包含历史记录、基础信息、扩展信息、家庭信息等多个tab页
- 支持信息查看和编辑
- 确认后自动刷新学生列表
-
数据传递:
- 自动传入当前批次的
batchId - 传入当前学生的
userId - 包含完整的批次配置信息
- 自动传入当前批次的
-
用户体验:
- 无缝的界面切换
- 丰富的学生信息展示
- 完整的操作历史追踪
这次优化显著提升了审核功能的实用性和用户体验,从简单的审核操作升级为完整的学生信息管理功能。