diff --git a/urbanLifelineServ/.bin/database/postgres/sql/admin_routes_architecture.md b/urbanLifelineServ/.bin/database/postgres/sql/admin_routes_architecture.md index 77895c6e..f4f8823a 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/admin_routes_architecture.md +++ b/urbanLifelineServ/.bin/database/postgres/sql/admin_routes_architecture.md @@ -30,10 +30,10 @@ --- -### 第二层:AdminSidebarLayout (各服务内部) -每个管理后台的内部二级菜单,使用 `AdminSidebarLayout` 布局。 +### 第二层:SubSidebarLayout (各服务内部) +每个管理后台的内部二级菜单,使用 `SubSidebarLayout` 布局。 -**布局**: `AdminSidebarLayout` +**布局**: `SubSidebarLayout` **类型**: `route`(非 iframe) --- @@ -41,7 +41,7 @@ ## Platform 管理后台(第二层) **服务**: `platform` -**布局**: `AdminSidebarLayout` +**布局**: `SubSidebarLayout` ### 视图列表 @@ -69,7 +69,7 @@ PERM-0605: perm_platform_admin_config (platform:admin:config) ## Bidding 管理后台(第二层) **服务**: `bidding` -**布局**: `AdminSidebarLayout` +**布局**: `SubSidebarLayout` ### 权限配置 ```sql @@ -84,7 +84,7 @@ PERM-0611: perm_bidding_admin (bidding:admin:view) ## Workcase 管理后台(第二层) **服务**: `workcase` -**布局**: `AdminSidebarLayout` +**布局**: `SubSidebarLayout` ### 视图列表 @@ -123,27 +123,27 @@ PERM-0627: perm_workcase_log (workcase:log:view) - 用户应用入口(普通路由和iframe) - 管理后台入口(iframe类型) -### 内层 AdminSidebarLayout -各服务内部,显示 `layout='AdminSidebarLayout'` 且 `url.startsWith('/admin')` 的视图: +### 内层 SubSidebarLayout +各服务内部,显示 `layout='SubSidebarLayout'` 且 `url.startsWith('/admin')` 的视图: #### Platform AdminSidebar ```typescript service === 'platform' && -layout === 'AdminSidebarLayout' && +layout === 'SubSidebarLayout' && url.startsWith('/admin') ``` #### Bidding AdminSidebar ```typescript service === 'bidding' && -layout === 'AdminSidebarLayout' && +layout === 'SubSidebarLayout' && url.startsWith('/admin') ``` #### Workcase AdminSidebar ```typescript service === 'workcase' && -layout === 'AdminSidebarLayout' && +layout === 'SubSidebarLayout' && url.startsWith('/admin') ``` @@ -176,12 +176,12 @@ url.startsWith('/admin') ### 1. Layout 组件 - **SidebarLayout**: 外层主侧边栏(platform 主界面) -- **AdminSidebarLayout**: 内层管理侧边栏(各管理后台内部) +- **SubSidebarLayout**: 内层管理侧边栏(各管理后台内部) - **BlankLayout**: 空白布局(如智能客服首页) ### 2. iframe 嵌套 - 外层 platform 的 iframe 菜单 → 加载各服务的管理后台 -- 各服务内部使用 AdminSidebarLayout 渲染二级菜单 +- 各服务内部使用 SubSidebarLayout 渲染二级菜单 - iframe_url 必须正确指向实际服务地址 ### 3. 路由配置 @@ -203,7 +203,7 @@ url.startsWith('/admin') 如果从旧的单层架构迁移到三层架构: 1. **视图迁移** - - 将原 platform 的管理视图改为 `layout='AdminSidebarLayout'` + - 将原 platform 的管理视图改为 `layout='SubSidebarLayout'` - URL 统一改为 `/admin/*` 格式 - 在 platform 主侧边栏添加 iframe 入口 @@ -213,7 +213,7 @@ url.startsWith('/admin') - 更新视图权限关联 3. **前端组件** - - 创建 AdminSidebarLayout 组件(参考 workcase 实现) + - 创建 SubSidebarLayout 组件(参考 workcase 实现) - 更新 platform 路由配置支持 `/admin/*` 路径 - 配置 iframe 路由指向各服务管理后台 diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql b/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql index 706fc597..bb8f42f0 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql @@ -201,38 +201,31 @@ INSERT INTO sys.tb_sys_view ( -- ========================= -- 平台应用菜单 (platform) -- ========================= --- 一级菜单 -('VIEW-P002', 'view_platform_chat', '泰豪AI助手', NULL, '/aichat', 'public/Chat/AIChatView.vue', 'ChatDotRound', 1, +-- 一级菜单 (图标使用 lucide-vue-next) +('VIEW-P002', 'view_platform_chat', '泰豪AI助手', NULL, '/aichat', 'public/Chat/AIChatView.vue', 'MessageCircle', 1, 'route', NULL, 'platform', 'SidebarLayout', 10, '泰豪AI助手-直接智能体对话', 'system', now(), false), -('VIEW-P001', 'view_platform_home', '全部应用', NULL, '/agents', 'public/Agents/AgentPlatformView.vue', 'Grid', 1, +('VIEW-P001', 'view_platform_home', '全部应用', NULL, '/agents', 'public/Agents/AgentPlatformView.vue', 'LayoutGrid', 1, 'route', NULL, 'platform', 'SidebarLayout', 20, '全部智能体', 'system', now(), false), -- iframe 嵌入菜单 -- url: platform中的路由路径(用于sidebar定位和路由跳转) -- iframe_url: iframe的src地址(实际内容的URL) -('VIEW-P005', 'view_platform_workflow', '智能体编排', NULL, '/app/workflow', NULL, 'Connection', 1, +('VIEW-P005', 'view_platform_workflow', '智能体编排', NULL, '/app/workflow', NULL, 'Workflow', 1, 'iframe', 'http://localhost:3000', 'platform', 'SidebarLayout', 30, 'Dify智能体编排(iframe)', 'system', now(), false), -('VIEW-P003', 'view_platform_bidding', '招标助手', NULL, '/app/bidding', NULL, 'Document', 1, +('VIEW-P003', 'view_platform_bidding', '招标助手', NULL, '/app/bidding', NULL, 'FileText', 1, 'iframe', '/bidding/', 'platform', 'SidebarLayout', 40, '招标应用(iframe)', 'system', now(), false), -('VIEW-P004', 'view_platform_workcase', '泰豪小电', NULL, '/app/workcase', NULL, 'Service', 1, +('VIEW-P004', 'view_platform_workcase', '泰豪小电', NULL, '/app/workcase', NULL, 'Headphones', 1, 'iframe', '/workcase/', 'platform', 'SidebarLayout', 50, '客服应用(iframe)', 'system', now(), false), --- 管理后台入口(iframe类型,显示在外层主sidebar) -('VIEW-P101', 'view_platform_admin_entry', '平台管理后台', NULL, '/admin/platform', NULL, 'Setting', 1, - 'iframe', '/platform/admin', 'platform', 'AdminIframeSidebarLayout', 100, '平台管理后台入口', 'system', now(), false), -('VIEW-P102', 'view_bidding_admin_entry', '智能标书管理后台', NULL, '/admin/bidding', NULL, 'Document', 1, - 'iframe', '/bidding/admin', 'platform', 'AdminIframeSidebarLayout', 110, '智能标书管理后台入口', 'system', now(), false), -('VIEW-P103', 'view_workcase_admin_entry', '泰豪小电管理后台', NULL, '/admin/workcase', NULL, 'Service', 1, - 'iframe', '/workcase/admin', 'platform', 'AdminIframeSidebarLayout', 120, '泰豪小电管理后台入口', 'system', now(), false), --- 平台管理后台内部视图(AdminSidebarLayout布局,在platform服务内) -('VIEW-P201', 'view_platform_admin_overview', '数据概览', NULL, '/admin/overview', 'admin/overview/OverviewView.vue', 'DataLine', 1, - 'route', NULL, 'platform', 'AdminSidebarLayout', 210, '平台数据概览', 'system', now(), false), -('VIEW-P202', 'view_platform_admin_user', '用户管理', NULL, '/admin/userManagement', 'admin/userManagement/UserManagementView.vue', 'User', 1, - 'route', NULL, 'platform', 'AdminSidebarLayout', 220, '平台用户管理', 'system', now(), false), -('VIEW-P203', 'view_platform_admin_knowledge', '知识库', NULL, '/admin/knowledge', 'admin/knowledge/KnowledgeView.vue', 'Document', 1, - 'route', NULL, 'platform', 'AdminSidebarLayout', 230, '平台知识库管理', 'system', now(), false), -('VIEW-P204', 'view_platform_admin_config', '系统配置', NULL, '/admin/config', 'admin/config/ConfigView.vue', 'Setting', 1, - 'route', NULL, 'platform', 'AdminSidebarLayout', 240, '平台系统配置', 'system', now(), false), +-- 平台管理后台内部视图(SubSidebarLayout布局,在platform服务内) +('VIEW-P201', 'view_platform_admin_overview', '数据概览', NULL, '/admin/overview', 'admin/overview/OverviewView.vue', 'BarChart3', 1, + 'route', NULL, 'platform', 'SubSidebarLayout', 210, '平台数据概览', 'system', now(), false), +('VIEW-P202', 'view_platform_admin_user', '用户管理', NULL, '/admin/userManagement', 'admin/userManagement/UserManagementView.vue', 'Users', 1, + 'route', NULL, 'platform', 'SubSidebarLayout', 220, '平台用户管理', 'system', now(), false), +('VIEW-P203', 'view_platform_admin_knowledge', '知识库', NULL, '/admin/knowledge', 'admin/knowledge/KnowledgeView.vue', 'FileText', 1, + 'route', NULL, 'platform', 'SubSidebarLayout', 230, '平台知识库管理', 'system', now(), false), +('VIEW-P204', 'view_platform_admin_config', '系统配置', NULL, '/admin/config', 'admin/config/ConfigView.vue', 'Settings', 1, + 'route', NULL, 'platform', 'SubSidebarLayout', 240, '平台系统配置', 'system', now(), false), -- -- 系统管理目录 -- ('VIEW-P100', 'view_system', '系统管理', NULL, '/system', NULL, 'Settings', 0, @@ -276,40 +269,40 @@ INSERT INTO sys.tb_sys_view ( -- 'route', NULL, 'bidding', 'DefaultLayout', 40, '投标管理页面', 'system', now(), false), -- ========================= --- 客服应用菜单 (workcase) +-- 客服应用菜单 (workcase) - 图标使用 lucide-vue-next -- ========================= -- 用户端视图 -('VIEW-W001', 'view_workcase_home', '智能客服', NULL, '/aichat', 'public/AIChat/AIChatView.vue', 'House', 3, - 'route', NULL, 'workcase', 'BlankLayout', 10, '智能客服首页', 'system', now(), false), +('VIEW-W001', 'view_workcase_home', '智能客服', NULL, '/aichat', 'public/AIChat/AIChatView.vue', 'Home', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 10, '智能客服首页', 'system', now(), false), --- 管理端视图(使用 AdminSidebarLayout 布局) -('VIEW-W101', 'view_workcase_admin_overview', '数据概览', NULL, '/admin/overview', 'admin/overview/OverviewView.vue', 'DataLine', 1, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 110, '泰豪小电数据概览', 'system', now(), false), +-- 管理端视图(使用 SubSidebarLayout 布局) +('VIEW-W101', 'view_workcase_admin_overview', '数据概览', NULL, '/admin/overview', 'admin/overview/OverviewView.vue', 'BarChart3', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 110, '泰豪小电数据概览', 'system', now(), false), -('VIEW-W102', 'view_workcase_admin_knowledge', '知识库管理', NULL, '/admin/knowledge', 'admin/knowledge/KnowLedgeView.vue', 'Document', 1, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 120, '知识库文档管理', 'system', now(), false), +('VIEW-W102', 'view_workcase_admin_knowledge', '知识库管理', NULL, '/admin/knowledge', 'admin/knowledge/KnowLedgeView.vue', 'FileText', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 120, '知识库文档管理', 'system', now(), false), -('VIEW-W103', 'view_workcase_admin_tickets', '工单管理', NULL, '/admin/workcase', 'admin/workcase/WorkcaseView.vue', 'Tickets', 1, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 130, '客服工单管理', 'system', now(), false), +('VIEW-W103', 'view_workcase_admin_tickets', '工单管理', NULL, '/admin/workcase', 'admin/workcase/WorkcaseView.vue', 'Ticket', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 130, '客服工单管理', 'system', now(), false), -('VIEW-W104', 'view_workcase_admin_conversation', '对话数据', NULL, '/admin/customerChat', 'admin/customerChat/CustomerChatView.vue', 'ChatDotRound', 1, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 140, '客户对话数据管理', 'system', now(), false), +('VIEW-W104', 'view_workcase_admin_conversation', '对话数据', NULL, '/admin/customerChat', 'admin/customerChat/CustomerChatView.vue', 'MessageCircle', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 140, '客户对话数据管理', 'system', now(), false), -('VIEW-W105', 'view_workcase_admin_agent', '智能体管理', NULL, '/admin/agent', 'admin/agent/AgentView.vue', 'Service', 1, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 150, '智能体配置管理', 'system', now(), false), +('VIEW-W105', 'view_workcase_admin_agent', '智能体管理', NULL, '/admin/agent', 'admin/agent/AgentView.vue', 'Bot', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 150, '智能体配置管理', 'system', now(), false), -- 日志管理(带子级的目录) -('VIEW-W106', 'view_workcase_admin_log', '日志管理', NULL, '/admin/log', NULL, 'List', 0, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 160, '日志管理目录', 'system', now(), false), +('VIEW-W106', 'view_workcase_admin_log', '日志管理', NULL, '/admin/log', NULL, 'ScrollText', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 160, '日志管理目录', 'system', now(), false), -('VIEW-W107', 'view_workcase_admin_log_knowledge', '知识库日志', 'view_workcase_admin_log', '/admin/log/knowledge', 'admin/log/knowledgeLog/KnowledgeLogView.vue', 'Document', 1, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 161, '知识库操作日志', 'system', now(), false), +('VIEW-W107', 'view_workcase_admin_log_knowledge', '知识库日志', 'view_workcase_admin_log', '/admin/log/knowledge', 'admin/log/knowledgeLog/KnowledgeLogView.vue', 'FileText', 1, + 'route', NULL, 'workcase', NULL, 161, '知识库操作日志', 'system', now(), false), -('VIEW-W108', 'view_workcase_admin_log_workcase', '工单日志', 'view_workcase_admin_log', '/admin/log/workcase', 'admin/log/workcaseLog/WorkcaseLogView.vue', 'Tickets', 1, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 162, '工单操作日志', 'system', now(), false), +('VIEW-W108', 'view_workcase_admin_log_workcase', '工单日志', 'view_workcase_admin_log', '/admin/log/workcase', 'admin/log/workcaseLog/WorkcaseLogView.vue', 'Ticket', 1, + 'route', NULL, 'workcase', NULL, 162, '工单操作日志', 'system', now(), false), -('VIEW-W109', 'view_workcase_admin_log_system', '系统日志', 'view_workcase_admin_log', '/admin/log/system', 'admin/log/systemLog/SystemLogView.vue', 'Setting', 1, - 'route', NULL, 'workcase', 'AdminSidebarLayout', 163, '系统运行日志', 'system', now(), false); +('VIEW-W109', 'view_workcase_admin_log_system', '系统日志', 'view_workcase_admin_log', '/admin/log/system', 'admin/log/systemLog/SystemLogView.vue', 'Settings', 1, + 'route', NULL, 'workcase', NULL, 163, '系统运行日志', 'system', now(), false); -- ============================= -- 6. 角色权限关联(超级管理员拥有所有权限) @@ -397,7 +390,7 @@ INSERT INTO sys.tb_sys_view_permission ( ('VP-P102', 'view_bidding_admin_entry', 'perm_bidding_admin', 'system', NULL, now(), false), ('VP-P103', 'view_workcase_admin_entry', 'perm_workcase_admin', 'system', NULL, now(), false), --- 平台管理后台内部视图权限关联(AdminSidebarLayout) +-- 平台管理后台内部视图权限关联(SubSidebarLayout) ('VP-P201', 'view_platform_admin_overview', 'perm_platform_admin_overview', 'system', NULL, now(), false), ('VP-P202', 'view_platform_admin_user', 'perm_platform_admin_user', 'system', NULL, now(), false), ('VP-P203', 'view_platform_admin_knowledge', 'perm_platform_admin_knowledge', 'system', NULL, now(), false), diff --git a/urbanLifelineServ/.bin/database/postgres/sql/workcase_admin_routes_summary.md b/urbanLifelineServ/.bin/database/postgres/sql/workcase_admin_routes_summary.md index 129959ce..efebe5f2 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/workcase_admin_routes_summary.md +++ b/urbanLifelineServ/.bin/database/postgres/sql/workcase_admin_routes_summary.md @@ -94,7 +94,7 @@ - VP-W106 ~ VP-W109: 日志管理视图(含父级和3个子级) ## 布局配置 -- **Layout**: `AdminSidebarLayout` +- **Layout**: `SubSidebarLayout` - **Service**: `workcase` - **Type**: 1 (菜单项) / 0 (目录) - **View Type**: `route` @@ -111,7 +111,7 @@ - 163: 系统日志 ## 路由过滤规则 -在 `AdminSidebarLayout.vue` 的 `loadMenuFromStorage()` 中: +在 `SubSidebarLayout.vue` 的 `loadMenuFromStorage()` 中: ```typescript const sidebarViews = userViews.filter((view: any) => view.layout === 'SidebarLayout' && // 使用 SidebarLayout 布局 @@ -125,6 +125,6 @@ const sidebarViews = userViews.filter((view: any) => ## 注意事项 1. 所有管理端路由都以 `/admin/` 开头 2. 日志管理使用父子级结构(type=0 的目录 + type=1 的子菜单) -3. 所有视图都使用 `AdminSidebarLayout` 布局 +3. 所有视图都使用 `SubSidebarLayout` 布局 4. 权限都归属于 `module_workcase` 模块 5. 超级管理员和系统管理员默认拥有所有 workcase 管理端权限 diff --git a/urbanLifelineWeb/.windsurf/workflows/urban-lifeline-web.md b/urbanLifelineWeb/.windsurf/workflows/urban-lifeline-web.md new file mode 100644 index 00000000..93a66856 --- /dev/null +++ b/urbanLifelineWeb/.windsurf/workflows/urban-lifeline-web.md @@ -0,0 +1 @@ +lucide-vue-next 使用这个图标库替代elementplus的图标库 \ No newline at end of file diff --git a/urbanLifelineWeb/package-lock.json b/urbanLifelineWeb/package-lock.json index 28383f67..132c5333 100644 --- a/urbanLifelineWeb/package-lock.json +++ b/urbanLifelineWeb/package-lock.json @@ -3507,6 +3507,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-vue-next": { + "version": "0.561.0", + "resolved": "https://registry.npmmirror.com/lucide-vue-next/-/lucide-vue-next-0.561.0.tgz", + "integrity": "sha512-c5HUckO0qHklVSOf/0vaSR3pEb8fYImRDCRDLde56uqS9js0D/e3RAvq0/YFWjkmyOBKCb0/IdskdoHZQEkT5g==", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", @@ -5394,6 +5403,7 @@ "@vueuse/core": "^11.3.0", "axios": "^1.7.9", "element-plus": "^2.12.0", + "lucide-vue-next": "^0.561.0", "pinia": "^2.2.8", "vue": "^3.5.13", "vue-router": "^4.5.0" @@ -5416,6 +5426,7 @@ "cors": "^2.8.5", "element-plus": "^2.12.0", "express": "^4.18.2", + "lucide-vue-next": "^0.561.0", "ofetch": "^1.4.1", "vue": "^3.5.13", "vue-router": "^4.5.0" @@ -6896,6 +6907,7 @@ "@vueuse/core": "^11.3.0", "axios": "^1.7.9", "element-plus": "^2.8.6", + "lucide-vue-next": "^0.561.0", "pinia": "^2.2.8", "vue": "^3.5.13", "vue-router": "^4.5.0" diff --git a/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.vue b/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.vue index 782e93ee..8ac1572d 100644 --- a/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.vue +++ b/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.vue @@ -8,10 +8,8 @@ 城市生命线