diff --git a/docs/cms-public-job-fair-api.md b/docs/cms-public-job-fair-api.md index 5023bd4..6ac4aa3 100644 --- a/docs/cms-public-job-fair-api.md +++ b/docs/cms-public-job-fair-api.md @@ -339,6 +339,8 @@ ### 9. 添加岗位到招聘会 - **URL**: `POST /cms/publicJobFair/job` +- **权限**: `cms:publicJobFair:edit` +- **说明**: CMS 后台将已有岗位关联到招聘会;该接口不是企业端报名接口。 - **请求体**: ```json { @@ -352,6 +354,8 @@ ### 10. 批量添加岗位 - **URL**: `POST /cms/publicJobFair/job/batch` +- **权限**: `cms:publicJobFair:edit` +- **说明**: CMS 后台批量将已有岗位关联到招聘会;该接口不是企业端报名接口。 - **请求体**: ```json [ @@ -364,6 +368,7 @@ ### 11. 移除招聘会岗位 - **URL**: `DELETE /cms/publicJobFair/job/{id}` +- **权限**: `cms:publicJobFair:edit` --- @@ -396,6 +401,37 @@ --- +## 企业端报名并添加岗位 + +企业用户报名公共招聘会并填写参会岗位,使用以下企业端接口,不调用 CMS 的岗位关联接口: + +- **URL**: `POST /app/fair/company/signUp` +- **认证**: 企业端 `Bearer` token +- **请求体**: + +```json +{ + "jobFairId": "1051", + "jobList": [ + { + "jobTitle": "Java开发工程师", + "minSalary": 8000, + "maxSalary": 15000, + "education": "本科", + "experience": "1-3年", + "vacancies": 5, + "jobAddress": "石河子市", + "description": "负责核心系统开发", + "type": "0" + } + ] +} +``` + +该接口会校验企业身份、企业信息和重复报名,并在一次事务中完成企业报名、岗位创建及招聘会-岗位关联。完整字段和错误响应见 [企业报名招聘会接口文档](app-company-job-fair-signup-api.md)。 + +--- + ## 数据字典 ### 招聘会类型 (jobFairType) diff --git a/sql/migration_public_job_fair_permissions.sql b/sql/migration_public_job_fair_permissions.sql new file mode 100644 index 0000000..7434715 --- /dev/null +++ b/sql/migration_public_job_fair_permissions.sql @@ -0,0 +1,95 @@ +-- 公共招聘会权限补充 +-- +-- 目的: +-- 1. 补充 CMS 公共招聘会详情/报名列表/企业岗位关联查询权限; +-- 2. 将查询权限授予已经拥有公共招聘会列表权限的角色(包括“企业”角色)。 +-- +-- 说明: +-- - 当前 CMS 详情、报名列表、企业及岗位关联接口统一使用 +-- cms:publicJobFair:query。 +-- - 企业端“报名并填写岗位”使用 POST /app/fair/company/signUp,服务层会校验 +-- 企业身份并创建岗位及招聘会-岗位关联,不需要 CMS 菜单权限。 +-- - 不将 cms:publicJobFair:edit 授予企业角色。该权限同时控制修改招聘会、 +-- 添加/移除企业和添加/移除岗位,属于后台管理权限。 +-- +-- 本脚本可重复执行:菜单和角色菜单关联均通过权限标识/关联关系幂等处理。 + +-- Step 1: 在“线上招聘会”菜单下补充按钮权限。 +-- 使用 MAX(menu_id)+1,避免依赖某个固定的菜单 ID;当前生产 2056 为列表菜单。 +INSERT INTO "shz"."sys_menu" ( + "menu_id", "menu_name", "parent_id", "order_num", "path", "component", + "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", + "status", "perms", "icon", "create_by", "create_time", "update_by", + "update_time", "remark" +) +SELECT + (SELECT COALESCE(MAX("menu_id"), 0) + 1 FROM "shz"."sys_menu"), + '公共招聘会查询', + parent_menu."menu_id", + 1, + '', + '', + '', + '', + 1, + 0, + 'F', + '0', + '0', + 'cms:publicJobFair:query', + '#', + 'admin', + CURRENT_TIMESTAMP, + '', + NULL, + '公共招聘会详情、报名及企业岗位关联查询权限' +FROM ( + SELECT "menu_id" + FROM "shz"."sys_menu" + WHERE "perms" = 'cms:publicJobFair:list' + AND "path" = '/jobfair/public-job-fair' + ORDER BY "menu_id" + LIMIT 1 +) parent_menu +WHERE NOT EXISTS ( + SELECT 1 + FROM "shz"."sys_menu" + WHERE "perms" = 'cms:publicJobFair:query' +); + +-- Step 2: 给已经有列表权限的角色补充查询权限。 +-- 这样企业角色(当前 role_id=1102)以及其他已有列表权限的角色都会生效。 +INSERT INTO "shz"."sys_role_menu" ("role_id", "menu_id") +SELECT DISTINCT + list_role."role_id", + query_menu."menu_id" +FROM "shz"."sys_role_menu" list_role +JOIN "shz"."sys_menu" list_menu + ON list_menu."menu_id" = list_role."menu_id" + AND list_menu."perms" = 'cms:publicJobFair:list' +CROSS JOIN ( + SELECT "menu_id" + FROM "shz"."sys_menu" + WHERE "perms" = 'cms:publicJobFair:query' + ORDER BY "menu_id" + LIMIT 1 +) query_menu +WHERE NOT EXISTS ( + SELECT 1 + FROM "shz"."sys_role_menu" existing_role_menu + WHERE existing_role_menu."role_id" = list_role."role_id" + AND existing_role_menu."menu_id" = query_menu."menu_id" +); + +-- 可选验证: +-- SELECT menu_id, menu_name, perms +-- FROM shz.sys_menu +-- WHERE perms LIKE 'cms:publicJobFair:%' +-- ORDER BY menu_id; +-- +-- SELECT r.role_id, r.role_name, m.menu_name, m.perms +-- FROM shz.sys_role_menu rm +-- JOIN shz.sys_role r ON r.role_id = rm.role_id +-- JOIN shz.sys_menu m ON m.menu_id = rm.menu_id +-- WHERE m.perms = 'cms:publicJobFair:query' +-- ORDER BY r.role_id;