feat(device): 新增设备管理模块全栈实现并拆分菜单 - 客户设备台账(customer_equipment)与智电设备型号目录(smart_device)CRUD,JWT+RBAC鉴权、参数绑定防SQL注入;设备监控改目录挂台账(/device/equipment),新建基础数据目录挂型号(/base/smart-device);前端防XSS样式对齐客户模块;远程库菜单迁移20261007_device_menu_split_fix.sql(id 58-60)

This commit is contained in:
wk committed 2026-10-07 08:58:34 +08:00
1 parent 91aa3c06f0
commit 09f7345e8a
18 files changed
+2482 -7

No files matched your search

+31 -2
View File
@@ -49,7 +49,7 @@ INSERT INTO sys_menu (id, parent_id, menu_name, menu_path, component, icon, sort
(1, NULL, '客户管理', '/customer', NULL, 'TeamOutlined', 1, 1, 'customer:list', 1),
(2, NULL, '项目管理', '/project', NULL, 'ProjectOutlined', 2, 1, 'project:list', 1),
(3, NULL, '运营派单', '/dispatch', NULL, 'ScheduleOutlined', 3, 1, 'dispatch:list', 1),
(4, NULL, '设备监控', '/device', NULL, 'MonitorOutlined', 4, 2, 'device:list', 1),
(4, NULL, '设备监控', '/device', NULL, 'MonitorOutlined', 4, 1, 'device:list', 1),
(5, NULL, '统计报表', '/report', NULL, 'BarChartOutlined', 5, 2, 'report:list', 1),
(6, NULL, '系统管理', '/system', NULL, 'SettingOutlined', 6, 1, 'system:list', 1)
ON CONFLICT (id) DO UPDATE SET
@@ -292,7 +292,36 @@ INSERT INTO sys_role_menu (role_id, menu_id) VALUES
ON CONFLICT (role_id, menu_id) DO NOTHING;
-- ------------------------------------------------------------
-- 8. 定时任务种子(sys_job,按 job_key 幂等)
-- 8. 设备域菜单拆分(设备监控目录 + 设备管理台账子菜单 / 基础数据目录 + 智电设备型号子菜单)
-- 设备监控(id=4)由菜单项改为目录 menu_type=1;台账子菜单挂在设备监控下
-- 基础数据为新一级目录,智电设备型号(基础数据,与客户无关)挂其下
-- 注:id 用 58-60(55-57 已被生产库报修派单/维保派单/重置电工密码占用,避免重跑冲突)
-- ------------------------------------------------------------
INSERT INTO sys_menu (id, parent_id, menu_name, menu_path, component, icon, sort_order, menu_type, permission, visible) VALUES
(58, 4, '设备管理台账', '/device/equipment', 'device/equipment/index', 'MonitorOutlined', 1, 2, 'device:list', 1),
(59, NULL, '基础数据', '/base', NULL, 'DatabaseOutlined', 5, 1, 'base:list', 1),
(60, 59, '智电设备型号', '/base/smart-device', 'device/smart-device/index', 'ApartmentOutlined', 1, 2, 'device:model', 1)
ON CONFLICT (id) DO UPDATE SET
parent_id = EXCLUDED.parent_id,
menu_name = EXCLUDED.menu_name,
menu_path = EXCLUDED.menu_path,
component = EXCLUDED.component,
icon = EXCLUDED.icon,
sort_order = EXCLUDED.sort_order,
menu_type = EXCLUDED.menu_type,
permission = EXCLUDED.permission,
visible = EXCLUDED.visible;
-- 角色-菜单绑定:ADMIN(role_id=1)拥有 58-60
INSERT INTO sys_role_menu (role_id, menu_id) VALUES
(1, 58), (1, 59), (1, 60)
ON CONFLICT (role_id, menu_id) DO NOTHING;
-- 重置 sys_menu 自增序列(覆盖到 60)
SELECT setval('sys_menu_id_seq', 60, true);
-- ------------------------------------------------------------
-- 9. 定时任务种子(sys_job,按 job_key 幂等)
-- ------------------------------------------------------------
INSERT INTO sys_job (job_key, job_name, cron_expression, params, retry_times, retry_interval, status, remark) VALUES
('demo_heartbeat', '示例心跳', '*/5 * * * *', '{"message":"heartbeat"}'::jsonb, 0, 60, 1,
@@ -0,0 +1,88 @@
-- 设备域菜单拆分-恢复版:先恢复被误覆盖的 55/56/57(报修派单/维保派单/重置电工密码),
-- 再用空闲 id 58-60 创建设备域菜单。修复由 20261007_device_menu_split.sql 引入的覆盖事故。
BEGIN;
-- ------------------------------------------------------------
-- 1) 恢复 id=55 报修派单(原字段:parent=3 /dispatch/repair dispatch:repair)
-- ------------------------------------------------------------
UPDATE sys_menu SET
parent_id = 3,
menu_name = '报修派单',
menu_path = '/dispatch/repair',
component = 'dispatch/repair/index',
icon = 'ToolOutlined',
sort_order = 3,
menu_type = 2,
permission = 'dispatch:repair',
visible = 1
WHERE id = 55;
-- ------------------------------------------------------------
-- 2) 恢复 id=56 维保派单(原字段:parent=3 /dispatch/maintenance dispatch:maintenance)
-- ------------------------------------------------------------
UPDATE sys_menu SET
parent_id = 3,
menu_name = '维保派单',
menu_path = '/dispatch/maintenance',
component = 'dispatch/maintenance/index',
icon = 'ToolOutlined',
sort_order = 4,
menu_type = 2,
permission = 'dispatch:maintenance',
visible = 1
WHERE id = 56;
-- ------------------------------------------------------------
-- 3) 恢复 id=57 重置电工密码(原字段:parent=3 按钮权限 worker:reset-password)
-- ------------------------------------------------------------
UPDATE sys_menu SET
parent_id = 3,
menu_name = '重置电工密码',
menu_path = NULL,
component = NULL,
icon = NULL,
sort_order = 11,
menu_type = 3,
permission = 'worker:reset-password',
visible = 1
WHERE id = 57;
-- 清理误绑定的角色菜单:(1,57) 保留给 ADMIN(重置电工密码按钮),并确保绑定存在
-- (2,55)(2,56) 语义已随恢复回到报修/维保派单,保留即可,无需改动
INSERT INTO sys_role_menu (role_id, menu_id) VALUES (1, 57)
ON CONFLICT (role_id, menu_id) DO NOTHING;
-- ------------------------------------------------------------
-- 4) 设备监控(id=4):菜单项 → 目录(menu_type=2→1),保持 /device 与 device:list
-- ------------------------------------------------------------
UPDATE sys_menu SET menu_type = 1 WHERE id = 4 AND menu_type = 2;
-- ------------------------------------------------------------
-- 5) 设备域菜单使用空闲 id 58-60
-- ------------------------------------------------------------
INSERT INTO sys_menu (id, parent_id, menu_name, menu_path, component, icon, sort_order, menu_type, permission, visible) VALUES
(58, 4, '设备管理台账', '/device/equipment', 'device/equipment/index', 'MonitorOutlined', 1, 2, 'device:list', 1),
(59, NULL, '基础数据', '/base', NULL, 'DatabaseOutlined', 5, 1, 'base:list', 1),
(60, 59, '智电设备型号', '/base/smart-device', 'device/smart-device/index', 'ApartmentOutlined', 1, 2, 'device:model', 1)
ON CONFLICT (id) DO UPDATE SET
parent_id = EXCLUDED.parent_id,
menu_name = EXCLUDED.menu_name,
menu_path = EXCLUDED.menu_path,
component = EXCLUDED.component,
icon = EXCLUDED.icon,
sort_order = EXCLUDED.sort_order,
menu_type = EXCLUDED.menu_type,
permission = EXCLUDED.permission,
visible = EXCLUDED.visible;
-- ------------------------------------------------------------
-- 6) 角色-菜单绑定:ADMIN(role_id=1) 拥有 58-60;SALESMAN 不给设备/基础数据权限
-- ------------------------------------------------------------
INSERT INTO sys_role_menu (role_id, menu_id) VALUES
(1, 58), (1, 59), (1, 60)
ON CONFLICT (role_id, menu_id) DO NOTHING;
-- 重置序列(覆盖到 60,避免后续手动插入冲突)
SELECT setval('sys_menu_id_seq', GREATEST((SELECT MAX(id) FROM sys_menu), 60), true);
COMMIT;