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

8.0 KiB
Raw Blame History

招聘岗位列表显示问题修复记录

📋 基本信息

项目 信息
变更日期 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中添加自定义查询方法

<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个)

  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. 测试验证:修复后必须进行全面的功能验证

🔗 相关文档