8.0 KiB
8.0 KiB
招聘岗位列表显示问题修复记录
📋 基本信息
| 项目 | 信息 |
|---|---|
| 变更日期 | 2025-01-26 |
| 变更时间 | 15:30:00 |
| 变更人员 | Cursor AI |
| 变更类型 | 错误修复 |
| 影响模块 | 招生就业-招聘管理前端 |
| 变更状态 | ✅ 完成(包含参数绑定彻底修复) |
🎯 问题描述
用户反馈招聘岗位页面存在两个问题:
- 企业名称显示异常:列表中企业名称没有正确显示出来
- 操作列样式不一致:页面样式与企业信息页面不符,需要保持风格和颜色一致
🔍 根因分析
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中添加自定义查询方法
<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接口中添加方法声明
IPage<ZsjyJobPositionVo> selectJobPositionList(Page<?> page, ZsjyJobPositionBo bo);
List<ZsjyJobPositionVo> selectJobPositionList(ZsjyJobPositionBo bo);
Step 3: 更新Service实现
// 修复前:使用默认方法(无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等字段名无法找到对应参数
修复步骤:
<!-- 修复前:直接使用字段名 -->
<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的默认方法冲突 - 需要使用完全独立的方法名避免框架级冲突
最终解决方案:
// 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个)
backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyJobPositionMapper.xml- 添加自定义分页查询方法
- 修复MyBatis参数绑定问题(
enterpriseId→bo.enterpriseId) - 方法重命名:
selectJobPositionList→selectJobPositionPageList - 添加参数空值检查:
bo != null and bo.enterpriseId != null
backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyJobPositionMapper.java- 添加方法声明和导入IPage、@Param注解
- 分页查询方法重命名:
selectJobPositionList→selectJobPositionPageList - 非分页查询方法重命名:
selectJobPositionList→selectJobPositionVoList
backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyJobPositionServiceImpl.java- 更新查询方法调用:使用新的方法名
- 修复类型转换问题(
Page→IPage)
前端文件 (2个)
web/src/views/zsjy/jobPosition/index.vue- 操作列样式已符合规范(之前已修复)
web/src/views/zsjy/recruitmentPoster/index.vue- 修复操作列样式
✅ 验证步骤
1. 企业名称显示验证
- 访问招聘岗位列表页面
- 确认企业名称列正确显示企业名称
- 验证搜索功能正常工作
- 确认分页功能正常
2. 操作列样式验证
- 检查招聘岗位页面操作列样式
- 检查招聘海报页面操作列样式
- 验证与企业信息页面样式一致性
- 确认tooltip提示正常显示
3. 功能完整性验证
- 测试新增功能
- 测试修改功能
- 测试删除功能
- 测试查看/预览功能
📝 技术总结
关键技术点
-
MyBatis-Plus vs 自定义查询:
- MyBatis-Plus的
selectVoPage只适用于单表查询 - 涉及关联查询时必须使用自定义Mapper方法
- MyBatis-Plus的
-
MyBatis参数绑定规则:
- 多参数方法中,XML需要通过参数名访问:
bo.字段名 - 可用参数列表:
[page, bo, param1, param2] - 类型转换:自定义方法返回
IPage而非Page
- 多参数方法中,XML需要通过参数名访问:
-
前端样式一致性:
- 企业信息页面使用的样式规范应作为标准模板
- 操作列样式包括:tooltip、按钮类型、颜色、字体大小、间距
最佳实践
- 数据查询:涉及关联查询的业务场景,优先使用自定义Mapper方法
- 样式规范:制定统一的操作列样式规范,确保用户体验一致性
- 测试验证:修复后必须进行全面的功能验证