# 招聘会管理模块开发记录 ## 开发日期 2026-06-12 ## 模块概述 本次开发实现了"招聘会管理"模块的完整后端+前端代码,参考 InternshipPost(见习岗位管理)模块的代码模式,采用单表CRUD架构。 ## 数据来源 1. 省系统:省一体化平台(粤就业小程序)数据回流 2. 市系统:本地招聘会数据录入 3. 其他:第三方数据导入或同步 ## 业务逻辑 - 招聘会信息以省一体化平台回流为准,点击查看页面链接跳转到省一体化平台招聘会页面 - 前端操作栏仅保留"查看"按钮(符合需求),后台管理端可进行新增操作 --- ## 一、后端代码 | 文件 | 路径 | 说明 | |------|------|------| | RecruitmentFair.java | org.jeecg.modules.zjrs.recruitmentfair.entity | 实体类,@TableName("recruitment_fair"),继承JeecgEntity,包含11个业务字段 | | RecruitmentFairMapper.java | org.jeecg.modules.zjrs.recruitmentfair.mapper | Mapper接口,继承BaseMapper(此表不需要自定义JOIN查询) | | RecruitmentFairMapper.xml | org.jeecg.modules.zjrs.recruitmentfair.mapper.xml | Mapper XML,基础配置(空mapper) | | IRecruitmentFairService.java | org.jeecg.modules.zjrs.recruitmentfair.service | Service接口,继承IService | | RecruitmentFairServiceImpl.java | org.jeecg.modules.zjrs.recruitmentfair.service.impl | Service实现类 | | RecruitmentFairController.java | org.jeecg.modules.zjrs.recruitmentfair.controller | Controller,继承JeecgController,使用QueryGenerator自动构建查询条件 | **关键设计:** - /list 接口使用 QueryGenerator 自动构建查询条件(不需要自定义queryPageList) - 权限前缀:recruitment_fair - 实体类继承 JeecgEntity(id, createBy, createTime, updateBy, updateTime) - 日期字段使用VARCHAR(需求文档标注为"短文本",因省平台回流数据日期格式不统一) ### 1.1 实体字段设计 | 字段 | Java属性 | DB列 | 类型 | 必填 | 字典 | 说明 | |------|---------|------|------|------|------|------| | 招聘会名称 | fairName | FAIR_NAME | String | 否 | — | — | | 招聘会类型 | fairType | FAIR_TYPE | String | 否 | — | — | | 招聘会主体 | fairSubject | FAIR_SUBJECT | String | 否 | — | — | | 举办方式 | holdMethod | HOLD_METHOD | String | 否 | fair_hold_method | 现场/网络 | | 线上举办日期 | onlineHoldDate | ONLINE_HOLD_DATE | String | 否 | — | 短文本格式 | | 线下举办日期 | offlineHoldDate | OFFLINE_HOLD_DATE | String | 否 | — | 短文本格式 | | 主办单位 | hostUnit | HOST_UNIT | String | 否 | — | — | | 举办地点 | holdLocation | HOLD_LOCATION | String | **是** | — | — | | 数据来源 | dataSource | DATA_SOURCE | String | 否 | fair_data_source | 省系统/市系统/其他 | | 状态 | status | STATUS | String | 否 | fair_status | 未开始/进行中/已结束 | | 省平台链接 | provinceLink | PROVINCE_LINK | String | 否 | — | 省平台详情页URL | ### 1.2 Controller API | 方法 | URL | 权限 | 说明 | |------|-----|------|------| | GET | /recruitmentFair/list | — | 分页列表查询 | | POST | /recruitmentFair/add | recruitment_fair:add | 新增 | | PUT/POST | /recruitmentFair/edit | recruitment_fair:edit | 编辑 | | DELETE | /recruitmentFair/delete | recruitment_fair:delete | 删除 | | DELETE | /recruitmentFair/deleteBatch | recruitment_fair:deleteBatch | 批量删除 | | GET | /recruitmentFair/queryById | — | 通过id查询 | | GET | /recruitmentFair/exportXls | recruitment_fair:exportXls | 导出Excel | | POST | /recruitmentFair/importExcel | recruitment_fair:importExcel | 导入Excel | --- ## 二、前端代码 | 文件 | 路径 | 说明 | |------|------|------| | RecruitmentFair.api.ts | views/recruitmentfair/ | API定义,基础路径 /recruitmentFair | | RecruitmentFair.data.ts | views/recruitmentfair/ | 列定义(7列)和高级查询配置(3个查询条件) | | RecruitmentFairList.vue | views/recruitmentfair/ | 列表页面 | | RecruitmentFairForm.vue | views/recruitmentfair/components/ | 表单组件,单卡片布局 | | RecruitmentFairModal.vue | views/recruitmentfair/components/ | 弹窗组件 | **关键设计:** - 查询区域:招聘会名称(a-input)、举办方式(a-select,字典fair_hold_method)、状态(a-select,字典fair_status) - 表单单卡片布局:包含11个业务字段,2列排列 - 仅"举办地点"为必填验证字段 - 列表字典翻译:holdMethod、status、dataSource - 操作栏仅"查看"按钮(符合需求文档功能范围:查看、新增) - 表格标题区:新增按钮(v-auth="recruitment_fair:add")、导出按钮(v-auth="recruitment_fair:exportXls") --- ## 三、SQL文件 | 文件 | 路径 | 说明 | |------|------|------| | 招聘会管理-建表.sql | .docs/sql/ | DDL建表语句,达梦数据库 | | 招聘会管理-字典数据.sql | .docs/sql/ | 字典数据初始化(fair_hold_method、fair_status、fair_data_source) | | 招聘会管理-菜单权限.sql | .docs/sql/ | 菜单及按钮权限初始化,达梦数据库 | | 招聘会管理-测试数据.sql | .docs/sql/ | 6条测试数据,覆盖不同来源/方式/状态 | | V20260612_1__menu_insert_RecruitmentFair.sql | flyway/sql/mysql/ | Flyway迁移脚本,MySQL语法 | ### 3.1 Flyway菜单结构 - 一级菜单"招聘会管理":id=178060100000600, sort_no=2.30 - 二级菜单"招聘会管理":id=178060100000610, component=recruitmentfair/RecruitmentFairList - 按钮权限:add(611), edit(612), delete(613), deleteBatch(614), exportXls(615), importExcel(616) - 角色授权(admin):ID从178060100000620开始 ### 3.2 字典数据 | 字典编码 | 名称 | 字典项 | |---------|------|--------| | fair_hold_method | 举办方式 | 现场、网络 | | fair_status | 招聘会状态 | 未开始、进行中、已结束 | | fair_data_source | 数据来源 | 省系统、市系统、其他 | ### 3.3 测试数据 6条测试数据覆盖以下场景: - 3种数据来源:省系统(3条)、市系统(2条)、其他(1条) - 2种举办方式:现场(4条)、网络(2条) - 3种状态:进行中(2条)、未开始(2条)、已结束(2条) - 省系统数据附带省平台链接(provinceLink),市系统和其他数据无链接 --- ## 四、部署步骤 1. **数据库初始化(达梦DM8):** ```sql -- 依次执行 @招聘会管理-建表.sql @招聘会管理-字典数据.sql @招聘会管理-菜单权限.sql @招聘会管理-测试数据.sql ``` 2. **后端启动:** - 重新编译并启动 jeecg-system-start 模块 - 验证 Swagger UI 中 /recruitmentFair 路径的API可正常调用 3. **前端启动:** - Vite自动发现 views/recruitmentfair/ 目录下的组件 - 菜单通过后台接口加载,无需前端额外配置 4. **验证:** - 登录管理后台,确认"招聘会管理"一级菜单显示 - 测试列表查询、新增、查看功能 - 测试Excel导出功能 --- ## 五、避坑记录 1. **日期字段类型选择:** 需求文档明确标注日期字段类型为"短文本",而非日期选择器。原因是省一体化平台回流的数据日期格式不统一(可能为"2026年6月"、"2026-06-01至2026-06-30"等格式),使用VARCHAR类型更灵活。 2. **操作栏按钮限制:** 需求文档仅列出"查看"和"新增"功能,因此前端操作栏仅展示"查看"按钮,"新增"按钮放在表格标题区。后端仍提供完整CRUD能力以备后用。 3. **省平台链接展示:** 仅省系统来源的数据显示省平台链接,市系统和其他来源不显示。详情页面可根据dataSource字段动态控制链接的展示。 4. **菜单sort_no选择:** 招聘会管理在需求文档中列在第3.5节(就业指导之后、深度分析之前),因此sort_no设为2.30,位于两者之间。 --- ## 五、Bug 修复(2026-06-13) ### 5.1 RecruitmentFairModal.add() 表单禁用残留 - 问题:先点击"查看"(`disableSubmit=true`)再点击"新增"(`add()` 未重置 `disableSubmit`),表单仍处于禁用状态无法输入 - 修复:`add()` 方法开头增加 `disableSubmit.value = false;` ### 5.2 RecruitmentFairForm.vue 表单验证 - 验证规则 `validatorRules` 仅包含 `holdLocation` 必填,其他字段无校验