-- 房源知识库后台菜单与权限。 -- 执行前请确认目标租户;当前开发环境为 10550,部署到其他租户时须改为对应租户 ID。 -- 脚本按“房源管理”父菜单动态挂载;若最后的校验结果显示 parent_menu_id 为 NULL, -- 请先检查该租户的 sys_menu 数据后再执行。 SET @house_knowledge_tenant_id := 10550; SET @house_knowledge_advisor_role_code := NULL; -- 示例:SET @house_knowledge_advisor_role_code := 'consultant'; START TRANSACTION; SET @house_knowledge_parent_menu_id := ( SELECT menu_id FROM sys_menu WHERE tenant_id = @house_knowledge_tenant_id AND deleted = 0 AND menu_type = 0 AND (title = '房源管理' OR path IN ('/house', 'house')) ORDER BY CASE WHEN title = '房源管理' THEN 0 ELSE 1 END, menu_id LIMIT 1 ); INSERT INTO sys_menu ( parent_id, title, path, component, menu_type, sort_number, authority, icon, hide, meta, app_id, tenant_id, deleted ) SELECT parent.menu_id, '房源知识库', '/house/knowledge', 'house/knowledge/index', 0, 90, 'house:knowledge', '', 0, '{}', parent.app_id, @house_knowledge_tenant_id, 0 FROM sys_menu parent WHERE parent.menu_id = @house_knowledge_parent_menu_id AND NOT EXISTS ( SELECT 1 FROM sys_menu existing WHERE existing.tenant_id = @house_knowledge_tenant_id AND existing.deleted = 0 AND existing.path = '/house/knowledge' ); SET @house_knowledge_menu_id := ( SELECT menu_id FROM sys_menu WHERE tenant_id = @house_knowledge_tenant_id AND deleted = 0 AND path = '/house/knowledge' ORDER BY menu_id LIMIT 1 ); -- 地点档案和标签字典由租户管理员维护;知识条目可单独授予顾问维护。 INSERT INTO sys_menu ( parent_id, title, path, component, menu_type, sort_number, authority, icon, hide, meta, app_id, tenant_id, deleted ) SELECT @house_knowledge_menu_id, permission.title, '', '', 1, permission.sort_number, permission.authority, '', 0, '{}', menu.app_id, @house_knowledge_tenant_id, 0 FROM sys_menu menu JOIN ( SELECT '查看地点档案' AS title, 'house:knowledge:location:list' AS authority, 10 AS sort_number UNION ALL SELECT '维护地点档案', 'house:knowledge:location:manage', 20 UNION ALL SELECT '查看知识标签', 'house:knowledge:tag:list', 30 UNION ALL SELECT '维护知识标签', 'house:knowledge:tag:manage', 40 UNION ALL SELECT '查看知识条目', 'house:knowledge:entry:list', 50 UNION ALL SELECT '新增知识条目', 'house:knowledge:entry:save', 60 UNION ALL SELECT '编辑知识条目', 'house:knowledge:entry:update', 70 UNION ALL SELECT '删除知识条目', 'house:knowledge:entry:remove', 80 ) permission WHERE menu.menu_id = @house_knowledge_menu_id AND NOT EXISTS ( SELECT 1 FROM sys_menu existing WHERE existing.tenant_id = @house_knowledge_tenant_id AND existing.deleted = 0 AND existing.authority = permission.authority ); -- 管理员拥有菜单及全部知识库维护权限。 INSERT INTO sys_role_menu (role_id, menu_id, tenant_id) SELECT role.role_id, menu.menu_id, @house_knowledge_tenant_id FROM sys_role role JOIN sys_menu menu ON menu.tenant_id = @house_knowledge_tenant_id AND menu.deleted = 0 WHERE role.tenant_id = @house_knowledge_tenant_id AND role.deleted = 0 AND role.role_code IN ('admin', 'superAdmin') AND (menu.menu_id = @house_knowledge_menu_id OR menu.parent_id = @house_knowledge_menu_id) AND NOT EXISTS ( SELECT 1 FROM sys_role_menu existing WHERE existing.role_id = role.role_id AND existing.menu_id = menu.menu_id AND existing.tenant_id = @house_knowledge_tenant_id ); -- 顾问仅获得查看地点/标签及知识条目维护权限。 -- 将 @house_knowledge_advisor_role_code 设为实际角色编码后才会生效。 INSERT INTO sys_role_menu (role_id, menu_id, tenant_id) SELECT role.role_id, menu.menu_id, @house_knowledge_tenant_id FROM sys_role role JOIN sys_menu menu ON menu.tenant_id = @house_knowledge_tenant_id AND menu.deleted = 0 WHERE @house_knowledge_advisor_role_code IS NOT NULL AND role.tenant_id = @house_knowledge_tenant_id AND role.deleted = 0 AND role.role_code = @house_knowledge_advisor_role_code AND menu.authority IN ( 'house:knowledge', 'house:knowledge:location:list', 'house:knowledge:tag:list', 'house:knowledge:entry:list', 'house:knowledge:entry:save', 'house:knowledge:entry:update', 'house:knowledge:entry:remove' ) AND NOT EXISTS ( SELECT 1 FROM sys_role_menu existing WHERE existing.role_id = role.role_id AND existing.menu_id = menu.menu_id AND existing.tenant_id = @house_knowledge_tenant_id ); COMMIT; -- 执行后校验:应返回一个父菜单、一个知识库菜单和 8 个按钮权限。 SELECT @house_knowledge_parent_menu_id AS parent_menu_id, @house_knowledge_menu_id AS house_knowledge_menu_id; SELECT menu_id, parent_id, title, path, component, menu_type, authority, sort_number FROM sys_menu WHERE tenant_id = @house_knowledge_tenant_id AND deleted = 0 AND (menu_id = @house_knowledge_menu_id OR parent_id = @house_knowledge_menu_id) ORDER BY menu_type, sort_number, menu_id; SELECT role.role_code, role.role_name, menu.title, menu.authority FROM sys_role_menu role_menu JOIN sys_role role ON role.role_id = role_menu.role_id JOIN sys_menu menu ON menu.menu_id = role_menu.menu_id WHERE role_menu.tenant_id = @house_knowledge_tenant_id AND menu.deleted = 0 AND (menu.menu_id = @house_knowledge_menu_id OR menu.parent_id = @house_knowledge_menu_id) ORDER BY role.role_code, menu.menu_type, menu.sort_number, menu.menu_id;