提交代码

This commit is contained in:
zlwu committed 2025-07-27 13:09:34 +08:00
1 parent eda12ddf59
commit 7896877bc7
9 files changed
+499 -148

No files matched your search

@@ -0,0 +1,145 @@
# 学生可参与批次查询API参数优化记录
**日期**: 2025-01-17
**开发者**: Cursor AI
**变更类型**: 参数优化
**影响范围**: 后端API接口、XML映射文件
## 📋 变更概述
优化了 `getStudentAvailableBatches` API接口,将 `batchName` 参数改为可选参数,支持不传参数时查询所有可参与的批次信息。
## 🔧 具体变更
### 1. Controller层变更
**文件**: `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStuColBatchClassController.java`
#### 修改内容
- 将 `@RequestParam("batchName")` 改为 `@RequestParam(value = "batchName", required = false)`
- 使 `batchName` 参数变为可选参数
#### 修改前
```java
public R<List<Map<String, Object>>> getStudentAvailableBatches(@RequestParam("batchName") String batchName)
```
#### 修改后
```java
public R<List<Map<String, Object>>> getStudentAvailableBatches(
@RequestParam(value = "batchName", required = false) String batchName)
```
### 2. XML映射文件变更
**文件**: `backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/stuColBatchClass/XgStuColBatchClassMapper.xml`
#### 修改内容
- 在 `selectStudentAvailableBatches` SQL查询中添加条件判断
- 只有当 `batchName` 不为空时才添加模糊查询条件
#### 修改前
```xml
WHERE s.id = #{studentId}
AND b.batch_name LIKE CONCAT('%', #{batchName}, '%')
AND b.deleted = 0
```
#### 修改后
```xml
WHERE s.id = #{studentId}
<if test="batchName != null and batchName != ''">
AND b.batch_name LIKE CONCAT('%', #{batchName}, '%')
</if>
AND b.deleted = 0
```
## 🎯 优化效果
### 功能改进
1. **参数灵活性**: `batchName` 参数现在可以为空,支持查询所有批次
2. **向后兼容**: 保持原有功能不变,仍然支持按批次名称筛选
3. **错误处理**: 避免了 `batchName` 为 `null` 时导致的 SQL 查询错误
### 使用场景
1. **查询所有批次**: 不传 `batchName` 参数,返回学生可参与的所有批次
2. **按名称筛选**: 传入 `batchName` 参数,返回匹配的批次信息
3. **前端搜索**: 支持前端搜索框为空时显示所有数据
## 📊 API接口规范
### 请求信息
- **请求方法**: GET
- **请求路径**: `/stuColBatchClass/stuColBatchClass/getStudentAvailableBatches`
- **请求参数**:
- `batchName` (可选): 批次名称,支持模糊查询
- **请求头**: 需要包含有效的Token
### 请求示例
```bash
# 查询所有批次
GET /stuColBatchClass/stuColBatchClass/getStudentAvailableBatches
# 按名称筛选
GET /stuColBatchClass/stuColBatchClass/getStudentAvailableBatches?batchName=春季学期
```
### 响应格式
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"batchId": 1,
"batchName": "2025年春季学期信息收集",
"description": "收集学生基本信息",
"startTime": "2025-01-01 00:00:00",
"endTime": "2025-01-31 23:59:59",
"status": "0",
"collectionType": "1",
"remark": "新学期信息收集",
"classId": 101,
"className": "计算机科学与技术2021级1班",
"majorId": 1,
"majorName": "计算机科学与技术",
"collegeId": 1,
"collegeName": "信息工程学院"
}
]
}
```
## 🧪 测试建议
### 功能测试
1. **无参数查询**: 不传 `batchName` 参数,验证返回所有批次
2. **空字符串查询**: 传入空字符串,验证返回所有批次
3. **模糊查询**: 传入部分批次名称,验证返回匹配结果
4. **精确查询**: 传入完整批次名称,验证返回精确结果
5. **无匹配结果**: 传入不存在的批次名称,验证返回空列表
### 异常测试
1. **参数为null**: 验证SQL查询正常执行
2. **参数为空字符串**: 验证SQL查询正常执行
3. **特殊字符**: 验证包含特殊字符的批次名称查询
## 📚 相关文档
- **原API文档**: 学生信息收集批次管理API
- **前端调用**: `web/src/views/stuMsgSupply/index.vue`
- **数据库设计**: 学生信息收集批次管理表设计
## 🔄 后续优化建议
1. **分页支持**: 如果批次数量较多,可以考虑添加分页功能
2. **状态过滤**: 可以添加参数支持按批次状态过滤
3. **时间范围**: 可以添加参数支持按时间范围查询
4. **排序选项**: 可以添加参数支持自定义排序
---
**开发完成时间**: 2025-01-17
**代码审查**: 待审查
**测试状态**: 待测试
**部署状态**: 待部署
@@ -0,0 +1,161 @@
# 学生可参与批次信息查询API开发记录
**日期**: 2025-01-17
**开发者**: Cursor AI
**变更类型**: 新增功能
**影响范围**: 后端API接口
## 📋 变更概述
在 `XgStuColBatchClassController.java` 中新增了 `getStudentAvailableBatches` API接口,用于查询学生可以参与的批次信息。
## 🔧 具体变更
### 1. Controller层变更
**文件**: `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStuColBatchClassController.java`
#### 新增内容
- 添加了 `getStudentAvailableBatches` API接口
- 接口路径: `GET /stuColBatchClass/stuColBatchClass/getStudentAvailableBatches`
- 无入参,自动获取当前登录用户ID
- 返回类型: `R<List<Map<String, Object>>>`
- 添加了权限注解 `@SaCheckPermission("stuColBatchClass:stuColBatchClass:query")`
#### 实现逻辑
1. **获取当前用户ID**: 使用 `LoginHelper.getUserId()` 获取当前登录用户ID
2. **权限校验**: 检查用户是否已登录
3. **数据查询**: 调用Mapper方法查询学生可参与的批次信息
4. **异常处理**: 捕获并处理查询过程中的异常
### 2. Mapper层变更
**文件**: `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStuColBatchClassMapper.java`
#### 新增方法
- `selectStudentAvailableBatches(Long studentId)`: 查询学生可参与的批次信息
- 返回类型: `List<Map<String, Object>>`
### 3. XML映射文件变更
**文件**: `backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/stuColBatchClass/XgStuColBatchClassMapper.xml`
#### 新增SQL查询
- 实现了 `selectStudentAvailableBatches` 的SQL查询语句
- 通过三张表关联查询:`xg_stu_col_batch`、`xg_stu_col_batch_class`、`xg_student_msg`
- 查询条件:
- `xg_student_msg.id = 当前登录用户ID`
- `xg_student_msg.class_id = xg_stu_col_batch_class.class_id`
- `xg_stu_col_batch_class.batch_id = xg_stu_col_batch.id`
- `deleted = 0` (所有表)
- `xg_stu_col_batch.status = '0'` (批次状态正常)
#### 返回字段
- 批次信息:`batchId`、`batchName`、`description`、`startTime`、`endTime`、`status`、`collectionType`、`remark`
- 班级信息:`classId`、`className`、`majorId`、`majorName`、`collegeId`、`collegeName`
## 📊 数据库关联逻辑
### 表关联关系
```
xg_student_msg (学生信息表)
↓ class_id
xg_stu_col_batch_class (批次班级权限表)
↓ batch_id
xg_stu_col_batch (批次信息表)
```
### 查询条件
1. **学生匹配**: `xg_student_msg.id = 当前登录用户ID`
2. **班级匹配**: `xg_student_msg.class_id = xg_stu_col_batch_class.class_id`
3. **批次匹配**: `xg_stu_col_batch_class.batch_id = xg_stu_col_batch.id`
4. **数据有效性**: 所有表的 `deleted = 0`
5. **批次状态**: `xg_stu_col_batch.status = '0'` (正常状态)
## 🔐 权限控制
### 接口权限
- **权限标识**: `stuColBatchClass:stuColBatchClass:query`
- **访问控制**: 需要登录用户
- **数据范围**: 只能查询当前登录用户对应的学生信息
### 安全考虑
- 使用 `LoginHelper.getUserId()` 获取当前用户ID,确保数据安全
- 通过表关联确保用户只能查看自己班级的批次信息
- 添加异常处理,避免敏感信息泄露
## 📝 API接口规范
### 请求信息
- **请求方法**: GET
- **请求路径**: `/stuColBatchClass/stuColBatchClass/getStudentAvailableBatches`
- **请求参数**: 无
- **请求头**: 需要包含有效的Token
### 响应格式
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"batchId": 1,
"batchName": "2025年春季学期信息收集",
"description": "收集学生基本信息",
"startTime": "2025-01-01 00:00:00",
"endTime": "2025-01-31 23:59:59",
"status": "0",
"collectionType": "1",
"remark": "新学期信息收集",
"classId": 101,
"className": "计算机科学与技术2021级1班",
"majorId": 1,
"majorName": "计算机科学与技术",
"collegeId": 1,
"collegeName": "信息工程学院"
}
]
}
```
### 错误响应
```json
{
"code": 500,
"msg": "查询学生可参与批次信息失败:具体错误信息"
}
```
## 🧪 测试建议
### 功能测试
1. **正常场景**: 登录学生用户,查询可参与的批次信息
2. **无权限场景**: 未登录用户访问接口
3. **无数据场景**: 学生没有可参与的批次
4. **异常场景**: 数据库连接异常
### 数据验证
1. 验证返回的批次信息是否正确
2. 验证班级信息是否与当前用户匹配
3. 验证批次状态是否为正常状态
4. 验证数据排序是否正确(按开始时间倒序)
## 📚 相关文档
- **API文档**: 学生信息收集批次管理API
- **数据库设计**: 学生信息收集批次管理表设计
- **权限配置**: 菜单权限配置指南
## 🔄 后续优化建议
1. **缓存优化**: 考虑对批次信息进行缓存,提高查询性能
2. **分页支持**: 如果批次数量较多,可以考虑添加分页功能
3. **状态过滤**: 可以添加参数支持按批次状态过滤
4. **时间范围**: 可以添加参数支持按时间范围查询
---
**开发完成时间**: 2025-01-17
**代码审查**: 待审查
**测试状态**: 待测试
**部署状态**: 待部署
@@ -1,149 +1,58 @@
# 学生信息收集批次管理页面收集范围功能修复
# 代码调整记录 - 2025-01-27
**修改时间**: 2025-01-27 15:30:00
**修改人**: wuzilong
**修改文件**: `web/src/views/XgStuColBatch/stuColBatch/index.vue`
## 修改时间
2025-01-27 10:30:00
## 问题描述
## 修改人员
wuzilong
在学生信息收集批次管理页面的收集范围功能中,存在以下问题:
## 修改内容
1. **现象**: 第一次配置收集范围后(如配置11个权限),第二次配置时去掉其中一个勾选,第三次打开收集范围弹窗时,发现之前去掉勾选的权限又重新被勾选了
2. **后台数据**: 从后台API接口看,数据只返回了10条(正确的),但前端显示仍然包含已取消的权限
3. **根本原因**: 树形组件的勾选状态管理存在问题,历史勾选状态没有正确清空
### 1. 学生信息完善页面 - 信息完善按钮显示逻辑优化
## 解决方案
**文件路径**: `web/src/views/stuMsgSupply/index.vue`
### 核心修改思路
每次打开收集范围弹窗界面时,首先清空部门树的勾选项目,然后再将选择的内容回显。
**修改内容**:
- 为信息完善按钮添加了条件显示逻辑
- 新增 `isBatchValid` 方法用于检查批次有效性
- 按钮只在以下条件同时满足时才显示:
- 批次状态为正常(status === '0')
- 当前时间在批次的有效时间范围内(startTime <= now <= endTime)
### 具体修改内容
**具体修改**:
1. 在信息完善按钮的 `el-tooltip` 组件上添加 `v-if="isBatchValid(scope.row)"` 条件
2. 新增 `isBatchValid` 方法:
```javascript
const isBatchValid = (row: StuColBatchVO): boolean => {
// 检查状态是否为正常
if (row.status !== '0') {
return false;
}
// 检查是否在有效时间内
const now = new Date();
const startTime = new Date(row.startTime);
const endTime = new Date(row.endTime);
return now >= startTime && now <= endTime;
};
```
#### 1. 修改 `handleScope` 方法
```javascript
/** 收集范围按钮操作 */
const handleScope = async (row: StuColBatchVO) => {
currentBatch.value = row;
// 先清空勾选状态
checkedDeptIds.value = [];
await loadDeptTree();
await loadCurrentScope(row.id);
scopeDialog.visible = true;
// 使用nextTick确保DOM更新完成后再设置勾选状态
await nextTick();
if (scopeTreeRef.value && checkedDeptIds.value.length > 0) {
scopeTreeRef.value.setCheckedKeys(checkedDeptIds.value);
}
};
```
**业务价值**:
- 提升用户体验:避免用户在无效时间段内进行信息完善操作
- 数据一致性:确保只有在有效批次内才能进行信息收集
- 界面清晰:减少用户困惑,明确操作时机
#### 2. 移除树形组件的 `:default-checked-keys` 属性
```vue
<!-- 修改前 -->
<el-tree
ref="scopeTreeRef"
:data="deptTreeData"
show-checkbox
default-expand-all
node-key="id"
:default-checked-keys="checkedDeptIds"
:props="{ children: 'children', label: 'label' }"
:check-strictly="false"
/>
**影响范围**:
- 学生信息完善页面的操作按钮显示逻辑
- 不影响其他功能模块
<!-- 修改后 -->
<el-tree
ref="scopeTreeRef"
:data="deptTreeData"
show-checkbox
default-expand-all
node-key="id"
:props="{ children: 'children', label: 'label' }"
:check-strictly="false"
/>
```
## 测试建议
1. 测试正常状态且在有效时间内的批次 - 按钮应正常显示
2. 测试停用状态的批次 - 按钮应不显示
3. 测试已过期的批次 - 按钮应不显示
4. 测试未开始的批次 - 按钮应不显示
#### 3. 添加弹窗关闭事件处理
```vue
<el-dialog title="设置收集范围" v-model="scopeDialog.visible" width="500px" append-to-body @close="handleScopeDialogClose">
```
#### 4. 新增 `handleScopeDialogClose` 方法
```javascript
/** 处理收集范围弹窗关闭 */
const handleScopeDialogClose = () => {
// 清空相关状态
currentBatch.value = null;
checkedDeptIds.value = [];
// 清空树形组件的勾选状态
if (scopeTreeRef.value) {
scopeTreeRef.value.setCheckedKeys([]);
}
};
```
#### 5. 修改 `cancelScope` 方法
```javascript
/** 取消收集范围设置 */
const cancelScope = () => {
scopeDialog.visible = false;
currentBatch.value = null;
checkedDeptIds.value = [];
// 清空树形组件的勾选状态
if (scopeTreeRef.value) {
scopeTreeRef.value.setCheckedKeys([]);
}
};
```
#### 6. 修改 `submitScope` 方法
```javascript
if (response && response.code === 200) {
ElMessage.success(response.msg || '收集范围设置成功');
scopeDialog.visible = false;
// 提交成功后清空状态
handleScopeDialogClose();
} else {
ElMessage.error(response?.msg || '设置收集范围失败');
}
```
## 技术要点
### 1. 状态管理优化
- **问题**: 使用 `:default-checked-keys` 只在组件初始化时生效
- **解决**: 改为手动调用 `setCheckedKeys()` 方法控制勾选状态
### 2. 时序控制
- **问题**: DOM更新和状态设置的时序问题
- **解决**: 使用 `nextTick()` 确保DOM更新完成后再设置勾选状态
### 3. 状态清理
- **问题**: 弹窗关闭时状态没有完全清理
- **解决**: 在弹窗关闭、取消、提交成功时都进行状态清理
## 测试验证
### 测试场景
1. **首次配置**: 配置11个权限,保存成功
2. **修改配置**: 去掉1个权限,保存成功
3. **再次打开**: 验证只显示10个勾选,不包含已取消的权限
4. **多次操作**: 重复上述操作,确保状态正确
### 预期结果
- 每次打开弹窗时,勾选状态与后台数据完全一致
- 历史勾选状态不会影响当前显示
- 弹窗关闭后状态完全清理
## 影响范围
- **功能影响**: 仅影响收集范围功能的显示逻辑,不影响数据保存
- **用户体验**: 修复了勾选状态显示错误的问题,提升用户体验
- **代码质量**: 优化了状态管理逻辑,提高了代码的健壮性
## 相关文档
- 前端开发规范: `.cursor/cursorrules-frontend.md`
- 学生信息收集批次管理API文档: `docs/开发文档/API/学生信息收集批次管理API.md`
## 备注
- 该修改为前端显示逻辑优化,不影响后端API
- 建议后续可以考虑添加提示信息,告知用户为什么按钮不显示