wuzhen 招生完成

This commit is contained in:
wuzhen committed 2025-07-24 16:27:26 +08:00
1 parent 6fb55c7723
commit b215f7b9b3
23 files changed
+125633 -998

No files matched your search

@@ -1,250 +1,52 @@
# 代码调整记录 - 2025-07-12 - wuzhen
# 招生就业模块代码调整记录
## 📋 变更概述
**变更日期**: 2025-07-12 14:52:00
**变更人员**: wuzhen
**变更类型**: 功能修复
**变更模块**: 班级干部管理模块
## 修复招生报名信息学院和专业字段显示问题
## 🎯 变更目标
1. 解决"职务级别不能为空"的验证错误
2. 修复"cannot find converter from XgClassCadreBo to XgClassCadre"的转换器错误
**时间**: 2025-07-12 09:22:15
## 🔍 问题分析
### 问题1: 职务级别必填验证错误
- **错误现象**: 前台提示"职务级别不能为空",但界面没有该字段输入框
- **根本原因**: 后端 `positionLevel` 字段被标记为必填(`@NotNull`),但前端未提供输入
- **设计缺陷**: 职务级别应该根据职务编码自动确定,不需要用户手动输入
### 问题描述
在"招生就业》报名信息》查看招生报名信息"页面中,所属学院和学院代码字段、报考专业和专业代码字段没有正确显示后台数据。
### 问题2: MapStruct转换器缺失
- **错误现象**: 添加班干部时报错"cannot find converter from XgClassCadreBo to XgClassCadre"
- **根本原因**: `XgClassCadreBo` 类缺少 `@AutoMapper` 注解配置
- **技术问题**: MapStruct无法自动生成转换器代码
### 原因分析
1. 过于复杂的数据处理逻辑反而造成了显示问题
2. 计算属性和额外处理方法干扰了原始数据的直接显示
3. 缓存和异步加载问题导致数据无法及时显示
## 🛠️ 解决方案
### 修复方案
采用"极简化"策略,直接显示原始数据,完全移除复杂的计算属性和数据处理逻辑:
1. 直接从viewForm对象中显示原始数据,不进行任何额外处理
2. 移除不必要的计算属性和方法调用
3. 添加完善的日志记录和调试工具
### 解决方案1: 取消职务级别必填验证 + 自动设置逻辑
1. **移除必填验证注解**
```java
// 移除 @NotNull 注解
@Min(value = 1, message = "职务级别最小值为1")
@Max(value = 9, message = "职务级别最大值为9")
private Integer positionLevel;
```
### 修改内容
1. 修改视图显示部分:
- 学院名称:直接使用`viewForm.collegeName`
- 学院代码:直接使用`viewForm.collegeId`
- 报考专业:直接使用`viewForm.appliedMajor`
- 专业代码:直接使用`viewForm.majorCode`
2. 简化代码结构:
- 移除复杂的collegeDisplayName和collegeDisplayCode计算属性
- 移除不必要的数据处理和转换逻辑
- 简化对话框底部按钮,只保留必要功能
3. 添加调试功能:
- 添加"查看原始数据"按钮,显示完整的学生信息
- 优化控制台日志,方便排查问题
2. **添加自动设置逻辑**
```java
// 在 validEntityBeforeSave 方法中添加
if (StringUtils.isNotBlank(entity.getPositionCode()) && entity.getPositionLevel() == null) {
entity.setPositionLevel(determinePositionLevel(entity.getPositionCode()));
}
```
3. **职务级别映射规则**
- 班长类职务 (monitor, class_monitor) → 级别1
- 副班长类职务 (deputy, deputy_monitor) → 级别2
- 委员类职务 (secretary, study_secretary等) → 级别3
- 其他职务 → 级别9
### 解决方案2: 添加MapStruct转换器配置
```java
@AutoMapper(target = XgClassCadre.class, reverseConvertGenerate = false)
public class XgClassCadreBo extends BaseEntity {
### 执行步骤
前端代码修改已完成,重新构建前端:
```bash
# 在web目录执行
npm run build:prod
```
## 📝 具体修改内容
### 验证方法
1. 登录系统,进入"招生就业》报名信息"模块
2. 点击查看按钮,检查所属学院和学院代码、报考专业和专业代码字段是否正确显示
3. 如需查看更详细的信息,可点击"查看原始数据"按钮
### 1. 修改实体类验证规则
- **文件**: `backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/domain/XgClassCadre.java`
- **修改**: 移除 `positionLevel` 字段的 `@NotNull` 验证注解
### 2. 修改业务对象验证规则
- **文件**: `backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/domain/bo/XgClassCadreBo.java`
- **修改**: 移除 `positionLevel` 字段的 `@NotNull` 验证注解
- **新增**: 添加 `@AutoMapper` 注解配置转换器
### 3. 修改业务逻辑
- **文件**: `backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/service/impl/XgClassCadreServiceImpl.java`
- **新增**: `determinePositionLevel()` 方法,根据职务编码自动确定职务级别
- **修改**: `validEntityBeforeSave()` 方法,添加自动设置职务级别的逻辑
## ✅ 验证结果
1. **编译成功**: Maven编译通过,无语法错误
2. **转换器生成**: MapStruct自动生成 `XgClassCadreBo` 到 `XgClassCadre` 的转换器
3. **验证逻辑优化**: 职务级别不再是必填字段,系统自动设置
## 🔄 影响范围
- **前端**: 不需要修改,职务级别字段自动处理
- **后端**: 班级干部管理相关功能
- **数据库**: 无影响,字段保持不变
- **API**: 接口行为保持一致,但验证规则更宽松
## 📋 测试建议
1. **功能测试**: 验证添加班级干部功能正常
2. **数据验证**: 确认职务级别自动设置正确
3. **边界测试**: 测试各种职务编码的级别映射
4. **兼容性测试**: 确认现有数据不受影响
## 📝 备注
- 此次修改提升了用户体验,减少了手动输入错误
- 职务级别的自动设置逻辑可根据实际需求调整
- 建议在生产环境部署前进行充分测试
---
## 📋 变更概述
**变更日期**: 2025-07-12 16:33:00
**变更人员**: wuzhen
**变更类型**: 功能修复
**变更模块**: 班级干部管理模块
## 🎯 变更目标
修复"cannot find converter from XgClassCadre to XgClassCadreVo"的转换器错误
## 🔍 问题分析
### 问题现象
- 添加班干部成功,但列表页面不显示数据
- 刷新页面后报错"cannot find converter from XgClassCadre to XgClassCadreVo"
- 查询列表时无法将实体对象转换为视图对象
### 根本原因
- `XgClassCadreVo` 类缺少 `@AutoMapper` 注解配置
- MapStruct无法自动生成从 `XgClassCadre` 到 `XgClassCadreVo` 的转换器
- 列表查询时需要将实体对象转换为视图对象用于前端展示
## 🛠️ 解决方案
**添加MapStruct转换器配置**
```java
@AutoMapper(target = XgClassCadre.class, reverseConvertGenerate = false)
public class XgClassCadreVo extends XgClassCadre {
```
## 📝 具体修改内容
### 修改视图对象配置
- **文件**: `backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/domain/vo/XgClassCadreVo.java`
- **新增**: 添加 `@AutoMapper` 注解和相应的import语句
- **目的**: 启用自动转换器生成,支持实体对象到视图对象的转换
## ✅ 验证结果
1. **编译成功**: Maven编译通过,转换器自动生成
2. **转换器生成**: MapStruct自动生成 `XgClassCadre` 到 `XgClassCadreVo` 的转换器
3. **功能完整**: 添加班干部后列表页面可以正常显示数据
## 🔄 影响范围
- **列表查询**: 班级干部列表页面可以正常显示数据
- **数据转换**: 实体对象与视图对象之间的转换正常
- **前端展示**: 解决了数据不显示的问题
## 📋 测试验证
1. **添加功能**: 验证添加班级干部功能正常
2. **列表显示**: 确认添加后列表页面立即显示新数据
3. **页面刷新**: 验证刷新页面后不再报转换器错误
4. **数据完整性**: 确认显示的数据字段完整正确
## 📝 备注
- 此次修复解决了数据显示问题,完善了班级干部管理功能
- 转换器配置是RuoYi框架的标准做法,确保了代码的一致性
- 建议在创建新的VO类时,及时添加转换器配置
---
## 📋 变更概述
**变更日期**: 2025-07-12 13:52:00
**变更人员**: wuzhen
**变更类型**: 功能优化
**变更模块**: 学生信息管理模块
## 🎯 变更目标
解决学生信息查询功能中的参数传递和字段匹配问题,优化用户搜索体验。
## 🔍 问题分析
### 原始问题
- 前端传递的参数格式错误:`{"name":["王"],"studentNo":["王"]}` (数组格式)
- 后端查询条件过于严格:同时使用学号精确匹配和姓名模糊匹配(AND条件)
- 用户输入"王"无法查询到相关学生信息
### 根本原因
1. **参数格式不匹配**: 前端传递数组,后端期望字符串
2. **查询逻辑不合理**: 用户输入关键字时,应该支持同时搜索学号和姓名
3. **用户体验差**: 查询条件过于严格,难以找到想要的结果
## 🛠️ 解决方案
采用**方案3:添加通用搜索字段**的方式来优化查询功能。
### 具体实现
1. **在 `XgStudentInfoBo` 中添加通用搜索字段**
```java
/**
* 通用搜索关键字(同时搜索学号和姓名)
*/
private String keyword;
```
2. **修改 `XgStudentInfoServiceImpl` 查询逻辑**
```java
// 通用搜索关键字:同时搜索学号和姓名(OR条件)
if (StringUtils.isNotBlank(bo.getKeyword())) {
lqw.and(wrapper -> wrapper
.like(XgStudentInfo::getStudentNo, bo.getKeyword())
.or()
.like(XgStudentInfo::getName, bo.getKeyword())
);
} else {
// 兼容原有的分别搜索逻辑
if (StringUtils.isNotBlank(bo.getStudentNo()) && StringUtils.isNotBlank(bo.getName())) {
lqw.and(wrapper -> wrapper
.like(XgStudentInfo::getStudentNo, bo.getStudentNo())
.or()
.like(XgStudentInfo::getName, bo.getName())
);
} else {
lqw.like(StringUtils.isNotBlank(bo.getStudentNo()), XgStudentInfo::getStudentNo, bo.getStudentNo());
lqw.like(StringUtils.isNotBlank(bo.getName()), XgStudentInfo::getName, bo.getName());
}
}
```
## 📝 具体修改内容
### 1. 业务对象字段扩展
- **文件**: `backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/domain/bo/XgStudentInfoBo.java`
- **新增**: `keyword` 字段用于通用搜索
### 2. 查询逻辑优化
- **文件**: `backend/ruoyi-modules/ruoyi-xg-xx/src/main/java/org/dromara/xg/service/impl/XgStudentInfoServiceImpl.java`
- **修改**: `buildQueryWrapper()` 方法,支持通用搜索和兼容原有逻辑
## ✅ 验证结果
1. **编译成功**: Maven编译通过,无语法错误
2. **查询优化**: 支持OR条件查询,提升搜索命中率
3. **向下兼容**: 原有的分别搜索逻辑仍然有效
## 🔄 优化效果对比
**优化前**:
- 用户输入"王"
- 查询条件:`student_no = '王' AND name LIKE '%王%'`
- 结果:0条记录(因为没有学号为"王"的学生)
**优化后**:
- 用户输入"王"
- 查询条件:`student_no LIKE '%王%' OR name LIKE '%王%'`
- 结果:返回所有学号或姓名包含"王"的学生
## 📋 使用方式
前端现在可以通过以下方式调用:
```javascript
// 方式1:使用新的keyword参数(推荐)
GET /xg/studentInfo/list?keyword=王&pageSize=20
// 方式2:继续使用原有参数(兼容)
GET /xg/studentInfo/list?name=王&pageSize=20
```
## 📝 备注
- 新增的通用搜索功能提升了用户体验
- 保持了向下兼容,不影响现有功能
- 建议前端逐步迁移到使用 `keyword` 参数进行搜索
### 责任人
- 开发: 吴振
- 测试: 待定
- 审核: 待定