Files
hzdyjs/docs/变更管理/code-adjust-record-2025-01-26-招聘岗位列表显示修复.md
T
2025-07-26 15:29:31 +08:00

218 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 招聘岗位列表显示问题修复记录
## 📋 基本信息
| 项目 | 信息 |
|------|------|
| **变更日期** | 2025-01-26 |
| **变更时间** | 15:30:00 |
| **变更人员** | Cursor AI |
| **变更类型** | 错误修复 |
| **影响模块** | 招生就业-招聘管理前端 |
| **变更状态** | ✅ 完成(包含参数绑定彻底修复) |
## 🎯 问题描述
用户反馈招聘岗位页面存在两个问题:
1. **企业名称显示异常**:列表中企业名称没有正确显示出来
2. **操作列样式不一致**:页面样式与企业信息页面不符,需要保持风格和颜色一致
## 🔍 根因分析
### 1. 企业名称显示问题
- **根因**:Service层使用了MyBatis-Plus的默认 `selectVoPage` 方法,该方法只查询单表,无法执行Mapper.xml中定义的JOIN查询
- **影响**:虽然Mapper.xml中正确定义了关联查询SQL,但实际查询时没有使用,导致 `enterprise_name` 字段为空
### 2. 操作列样式问题
- **根因**:招聘岗位和招聘海报页面的操作列样式与企业信息页面不一致
- **问题点**:
- 缺少tooltip提示
- 按钮样式简陋
- 颜色和间距不符合设计规范
### 3. MyBatis参数绑定问题
- **根因**:自定义Mapper方法中XML参数引用错误
- **错误信息**:`Parameter 'enterpriseId' not found. Available parameters are [page, bo, param1, param2]`
- **影响**:页面无法正常加载数据
## 🔧 修复方案
### 1. 企业名称显示修复
#### 后端修复步骤:
**Step 1: 在Mapper.xml中添加自定义查询方法**
```xml
<select id="selectJobPositionList" parameterType="org.dromara.zsjy.domain.bo.ZsjyJobPositionBo" resultMap="ZsjyJobPositionResult">
<include refid="selectZsjyJobPositionVo"/>
<where>
p.deleted = 0
<if test="enterpriseId != null">
and p.enterprise_id = #{enterpriseId}
</if>
<if test="positionName != null and positionName != ''">
and p.position_name like concat('%', #{positionName}, '%')
</if>
<if test="workAddress != null and workAddress != ''">
and p.work_address like concat('%', #{workAddress}, '%')
</if>
<if test="status != null and status != ''">
and p.status = #{status}
</if>
<if test="isPermanent != null">
and p.is_permanent = #{isPermanent}
</if>
</where>
order by p.create_time desc
</select>
```
**Step 2: 在Mapper接口中添加方法声明**
```java
IPage<ZsjyJobPositionVo> selectJobPositionList(Page<?> page, ZsjyJobPositionBo bo);
List<ZsjyJobPositionVo> selectJobPositionList(ZsjyJobPositionBo bo);
```
**Step 3: 更新Service实现**
```java
// 修复前:使用默认方法(无JOIN查询)
Page<ZsjyJobPositionVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// 修复后:使用自定义方法(包含JOIN查询)
Page<ZsjyJobPositionVo> result = baseMapper.selectJobPositionList(pageQuery.build(), bo);
```
### 2. 操作列样式修复
#### 前端修复步骤:
**Step 1: 招聘岗位页面操作列样式统一**
- 添加 `class-name="small-padding fixed-width"`
- 宽度调整为 `width="180"`
- 为每个按钮添加 `el-tooltip` 包装
- 统一按钮样式:`link` 类型,`size="default"`
- 统一字体大小:`font-size: 16px`
- 统一颜色:查看(蓝色)、修改(主色)、删除(红色)
- 统一间距:`margin-right: 8px`
**Step 2: 招聘海报页面操作列样式统一**
- 应用相同的样式规范
- 将"详情"改为"预览"以符合业务逻辑
#### 样式对比:
| 项目 | 修复前 | 修复后 |
|------|--------|--------|
| **按钮提示** | 无tooltip | 有tooltip |
| **按钮样式** | 简单link按钮 | 统一样式规范 |
| **颜色规范** | 不统一 | 蓝色(查看)、主色(修改)、红色(删除) |
| **间距设置** | 不规范 | 统一8px间距 |
| **列宽** | 150px | 180px |
### 3. MyBatis参数绑定修复
#### 问题分析:
- 自定义Mapper方法`selectJobPositionList`接收两个参数:`Page<?> page` 和 `ZsjyJobPositionBo bo`
- MyBatis可用参数为:`[page, bo, param1, param2]`
- XML中直接使用`enterpriseId`等字段名无法找到对应参数
#### 修复步骤:
```xml
<!-- 修复前:直接使用字段名 -->
<if test="enterpriseId != null">
and p.enterprise_id = #{enterpriseId}
</if>
<!-- 修复后:通过bo对象访问字段 -->
<if test="bo.enterpriseId != null">
and p.enterprise_id = #{bo.enterpriseId}
</if>
```
### 4. 方法名冲突最终修复
#### 根本问题分析:
- 分页查询方法名 `selectJobPositionList` 可能与MyBatis-Plus的默认方法冲突
- 需要使用完全独立的方法名避免框架级冲突
#### 最终解决方案:
```java
// Mapper接口:重命名分页查询方法
IPage<ZsjyJobPositionVo> selectJobPositionPageList(@Param("page") Page<?> page, @Param("bo") ZsjyJobPositionBo bo);
// XML映射:对应的方法ID
<select id="selectJobPositionPageList" resultMap="ZsjyJobPositionResult">
// Service调用:更新方法调用
IPage<ZsjyJobPositionVo> result = baseMapper.selectJobPositionPageList(pageQuery.build(), bo);
```
## 📊 修复详情
### 修改的文件列表
#### 后端文件 (3个)
1. `backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyJobPositionMapper.xml`
- 添加自定义分页查询方法
- 修复MyBatis参数绑定问题(`enterpriseId` → `bo.enterpriseId`)
- 方法重命名:`selectJobPositionList` → `selectJobPositionPageList`
- 添加参数空值检查:`bo != null and bo.enterpriseId != null`
2. `backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyJobPositionMapper.java`
- 添加方法声明和导入IPage、@Param注解
- 分页查询方法重命名:`selectJobPositionList` → `selectJobPositionPageList`
- 非分页查询方法重命名:`selectJobPositionList` → `selectJobPositionVoList`
3. `backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyJobPositionServiceImpl.java`
- 更新查询方法调用:使用新的方法名
- 修复类型转换问题(`Page` → `IPage`)
#### 前端文件 (2个)
1. `web/src/views/zsjy/jobPosition/index.vue`
- 操作列样式已符合规范(之前已修复)
2. `web/src/views/zsjy/recruitmentPoster/index.vue`
- 修复操作列样式
## ✅ 验证步骤
### 1. 企业名称显示验证
- [ ] 访问招聘岗位列表页面
- [ ] 确认企业名称列正确显示企业名称
- [ ] 验证搜索功能正常工作
- [ ] 确认分页功能正常
### 2. 操作列样式验证
- [ ] 检查招聘岗位页面操作列样式
- [ ] 检查招聘海报页面操作列样式
- [ ] 验证与企业信息页面样式一致性
- [ ] 确认tooltip提示正常显示
### 3. 功能完整性验证
- [ ] 测试新增功能
- [ ] 测试修改功能
- [ ] 测试删除功能
- [ ] 测试查看/预览功能
## 📝 技术总结
### 关键技术点
1. **MyBatis-Plus vs 自定义查询**:
- MyBatis-Plus的 `selectVoPage` 只适用于单表查询
- 涉及关联查询时必须使用自定义Mapper方法
2. **MyBatis参数绑定规则**:
- 多参数方法中,XML需要通过参数名访问:`bo.字段名`
- 可用参数列表:`[page, bo, param1, param2]`
- 类型转换:自定义方法返回`IPage`而非`Page`
3. **前端样式一致性**:
- 企业信息页面使用的样式规范应作为标准模板
- 操作列样式包括:tooltip、按钮类型、颜色、字体大小、间距
### 最佳实践
1. **数据查询**:涉及关联查询的业务场景,优先使用自定义Mapper方法
2. **样式规范**:制定统一的操作列样式规范,确保用户体验一致性
3. **测试验证**:修复后必须进行全面的功能验证
## 🔗 相关文档
- [招聘岗位数据库字段修复](./code-adjust-record-2025-01-26-招聘岗位数据库字段修复.md)
- [招聘信息API路径权限修复](./code-adjust-record-2025-01-26-招聘信息API路径权限修复.md)
- [招聘信息前端开发](./code-adjust-record-2025-01-26-招聘信息前端开发.md)