From 5ee9770747713d18508eb466cd0146b278f83474 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Thu, 11 Dec 2025 14:21:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=9C=8D=E5=8A=A1=E5=85=B1?= =?UTF-8?q?=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.bin/database/postgres/bin.sh | 2 +- .../.bin/database/postgres/sql/createDB.sql | 3 +- .../postgres/sql/createTablePermission.sql | 18 +- .../.bin/database/postgres/sql/initAll.sql | 2 +- .../postgres/sql/initDataPermission.sql | 221 ++- .../auth/src/main/resources/application.yml | 2 +- .../org/xyzh/common/dto/sys/TbSysViewDTO.java | 11 +- .../src/main/resources/application.yml | 42 +- .../resources/mapper/view/TbSysViewMapper.xml | 40 +- urbanLifelineWeb/README.md | 198 ++- urbanLifelineWeb/package-lock.json | 1410 ++--------------- .../packages/bidding/vite.config.ts | 16 +- .../platform/localSharedImportMap.js | 130 ++ .../packages/platform/.env.example | 9 + urbanLifelineWeb/packages/platform/index.html | 18 +- .../packages/platform/package.json | 1 + .../packages/platform/pnpm-lock.yaml | 62 + .../packages/platform/public/avatar.svg | 8 + .../packages/platform/public/favicon.svg | 5 + .../packages/platform/public/logo.jpg | Bin 0 -> 33240 bytes .../packages/platform/src/App.vue | 27 + .../packages/platform/src/config/README.md | 254 +++ .../packages/platform/src/config/index.ts | 24 + .../src/layouts/SidebarLayout/README.md | 214 +++ .../layouts/SidebarLayout/SidebarLayout.scss | 264 +++ .../layouts/SidebarLayout/SidebarLayout.vue | 248 +++ .../packages/platform/src/layouts/index.ts | 1 + .../packages/platform/src/main.ts | 47 + .../packages/platform/src/router/index.ts | 60 + .../packages/platform/src/types/shared.d.ts | 54 + .../platform/src/views/ImportMapsExample.vue | 156 -- .../platform/src/views/public/Login.vue | 248 ++- .../packages/platform/tsconfig.json | 3 +- .../packages/platform/vite.config.ts | 39 +- .../shared/localSharedImportMap.js | 192 +++ urbanLifelineWeb/packages/shared/package.json | 26 +- .../packages/shared/pnpm-lock.yaml | 509 +++++- urbanLifelineWeb/packages/shared/server.js | 73 + .../packages/shared/src/api/auth/auth.ts | 88 +- .../shared/src/utils/crypto/README.md | 274 ++++ .../packages/shared/src/utils/crypto/aes.ts | 322 ++++ .../packages/shared/src/utils/crypto/index.ts | 1 + .../packages/shared/src/utils/index.ts | 1 + .../packages/shared/vite.config.ts | 173 +- .../packages/workcase/vite.config.ts | 16 +- urbanLifelineWeb/start-all.bat | 2 +- 46 files changed, 3732 insertions(+), 1782 deletions(-) create mode 100644 urbanLifelineWeb/packages/platform/.__mf__temp/platform/localSharedImportMap.js create mode 100644 urbanLifelineWeb/packages/platform/.env.example create mode 100644 urbanLifelineWeb/packages/platform/public/avatar.svg create mode 100644 urbanLifelineWeb/packages/platform/public/favicon.svg create mode 100644 urbanLifelineWeb/packages/platform/public/logo.jpg create mode 100644 urbanLifelineWeb/packages/platform/src/App.vue create mode 100644 urbanLifelineWeb/packages/platform/src/config/README.md create mode 100644 urbanLifelineWeb/packages/platform/src/config/index.ts create mode 100644 urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/README.md create mode 100644 urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.scss create mode 100644 urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.vue create mode 100644 urbanLifelineWeb/packages/platform/src/layouts/index.ts create mode 100644 urbanLifelineWeb/packages/platform/src/main.ts create mode 100644 urbanLifelineWeb/packages/platform/src/router/index.ts create mode 100644 urbanLifelineWeb/packages/platform/src/types/shared.d.ts delete mode 100644 urbanLifelineWeb/packages/platform/src/views/ImportMapsExample.vue create mode 100644 urbanLifelineWeb/packages/shared/.__mf__temp/shared/localSharedImportMap.js create mode 100644 urbanLifelineWeb/packages/shared/server.js create mode 100644 urbanLifelineWeb/packages/shared/src/utils/crypto/README.md create mode 100644 urbanLifelineWeb/packages/shared/src/utils/crypto/aes.ts create mode 100644 urbanLifelineWeb/packages/shared/src/utils/crypto/index.ts diff --git a/urbanLifelineServ/.bin/database/postgres/bin.sh b/urbanLifelineServ/.bin/database/postgres/bin.sh index 36740189..c9e21826 100644 --- a/urbanLifelineServ/.bin/database/postgres/bin.sh +++ b/urbanLifelineServ/.bin/database/postgres/bin.sh @@ -31,7 +31,7 @@ log() { # 数据库连接信息(可通过环境变量覆盖) DB_HOST=${POSTGRES_HOST:-"localhost"} DB_PORT=${POSTGRES_PORT:-"5432"} -DB_NAME=${POSTGRES_DB:-"urban-lifeline"} +DB_NAME=${POSTGRES_DB:-"urban_lifeline"} DB_USER=${POSTGRES_USER:-"postgres"} DB_PASSWORD=${POSTGRES_PASSWORD:-"postgres"} diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createDB.sql b/urbanLifelineServ/.bin/database/postgres/sql/createDB.sql index 19ad6024..5ff18039 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createDB.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createDB.sql @@ -12,12 +12,13 @@ CREATE DATABASE urban_lifeline LC_CTYPE 'zh_CN.UTF-8'; -- 连接到新创建的数据库 -\c urban-lifeline; +\c urban_lifeline; -- -- 创建扩展(如果需要) CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- UUID 支持 CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- 文本搜索支持 CREATE EXTENSION IF NOT EXISTS "btree_gist"; -- GiST 索引支持 +CREATE EXTENSION IF NOT EXISTS "vector"; -- 向量 -- 设置搜索路径(可选,但建议设置) -- ALTER DATABASE urban-lifeline SET search_path TO sys, public; diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTablePermission.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTablePermission.sql index d319fb35..134b5dfd 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTablePermission.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTablePermission.sql @@ -158,8 +158,11 @@ CREATE TABLE sys.tb_sys_view ( url VARCHAR(255) DEFAULT NULL, -- 视图URL component VARCHAR(255) DEFAULT NULL, -- 视图组件 icon VARCHAR(100) DEFAULT NULL, -- 视图图标 - type INTEGER DEFAULT 0, -- 视图类型 - layout VARCHAR(100) DEFAULT NULL, -- 布局组件路径名称 + type INTEGER DEFAULT 0, -- 视图类型:0=目录 1=菜单页面 2=按钮 + view_type VARCHAR(20) DEFAULT 'route', -- 页面类型:route=路由页面 iframe=嵌入页面 + iframe_url VARCHAR(500) DEFAULT NULL, -- iframe URL(仅当view_type=iframe时有效) + service VARCHAR(20) DEFAULT 'platform', -- 所属服务:platform=平台应用 bidding=招标应用 workcase=客服应用 + layout VARCHAR(100) DEFAULT NULL, -- 布局组件路径名称 order_num INTEGER DEFAULT 0, -- 视图排序号 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 description VARCHAR(255) DEFAULT NULL, -- 视图描述 @@ -172,7 +175,11 @@ CREATE TABLE sys.tb_sys_view ( PRIMARY KEY (view_id), UNIQUE (optsn) ); -COMMENT ON TABLE sys.tb_sys_view IS '视图表'; +-- 创建索引 +CREATE INDEX idx_sys_view_parent ON sys.tb_sys_view USING btree (parent_id) WHERE deleted = false; +CREATE INDEX idx_sys_view_service ON sys.tb_sys_view USING btree (service) WHERE deleted = false; +CREATE INDEX idx_sys_view_type ON sys.tb_sys_view USING btree (view_type) WHERE deleted = false; +COMMENT ON TABLE sys.tb_sys_view IS '视图表(菜单表)'; COMMENT ON COLUMN sys.tb_sys_view.optsn IS '流水号'; COMMENT ON COLUMN sys.tb_sys_view.view_id IS '视图ID'; COMMENT ON COLUMN sys.tb_sys_view.name IS '视图名称'; @@ -180,7 +187,10 @@ COMMENT ON COLUMN sys.tb_sys_view.parent_id IS '父视图ID'; COMMENT ON COLUMN sys.tb_sys_view.url IS '视图URL'; COMMENT ON COLUMN sys.tb_sys_view.component IS '视图组件'; COMMENT ON COLUMN sys.tb_sys_view.icon IS '视图图标'; -COMMENT ON COLUMN sys.tb_sys_view.type IS '视图类型'; +COMMENT ON COLUMN sys.tb_sys_view.type IS '视图类型:0=目录 1=菜单页面 2=按钮'; +COMMENT ON COLUMN sys.tb_sys_view.view_type IS '页面类型:route=路由页面 iframe=嵌入页面'; +COMMENT ON COLUMN sys.tb_sys_view.iframe_url IS 'iframe URL(仅当view_type=iframe时有效)'; +COMMENT ON COLUMN sys.tb_sys_view.service IS '所属服务:platform=平台应用 bidding=招标应用 workcase=客服应用'; COMMENT ON COLUMN sys.tb_sys_view.layout IS '布局组件路径名称'; COMMENT ON COLUMN sys.tb_sys_view.order_num IS '视图排序号'; COMMENT ON COLUMN sys.tb_sys_view.description IS '视图描述'; diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql b/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql index 4ba996b9..c0d81b5b 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql @@ -31,7 +31,7 @@ \i createTableBidding.sql -- 8. 智能客服业务模块 -\i createTableCustomerService.sql +\i createTableWorkcase.sql -- 9. 智能体模块(暂不启用) -- \i createTableAgent.sql diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql b/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql index 3fc279fe..41802fc3 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql @@ -59,7 +59,7 @@ INSERT INTO sys.tb_sys_module ( ('MODULE-0006', 'module_bidding', '招投标', '招投标业务管理', 'system', NULL, now(), false), -('MODULE-0007', 'module_customer_service', '智能客服', '客服工单管理', +('MODULE-0007', 'module_workcase', '智能客服', '客服工单管理', 'system', NULL, now(), false); -- ============================= @@ -144,6 +144,18 @@ INSERT INTO sys.tb_sys_permission ( ('PERM-0401', 'perm_log_view', '日志查看', 'log:log:view', '查看系统日志', 'module_system', true, 'system', NULL, now(), false), ('PERM-0402', 'perm_log_export', '日志导出', 'log:log:export', '导出系统日志数据', 'module_system', + true, 'system', NULL, now(), false), + +-- 平台基础菜单访问权限(所有登录用户都有) +('PERM-0501', 'perm_platform_home', '工作台访问', 'platform:home:view', '访问平台工作台', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0502', 'perm_platform_chat', 'AI助手访问', 'platform:chat:view', '访问AI助手', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0503', 'perm_platform_bidding', '招标助手访问', 'platform:bidding:view', '访问招标助手(iframe)', 'module_bidding', + true, 'system', NULL, now(), false), +('PERM-0504', 'perm_platform_workcase', '泰豪小电访问', 'platform:workcase:view', '访问泰豪小电客服(iframe)', 'module_workcase', + true, 'system', NULL, now(), false), +('PERM-0505', 'perm_platform_workflow', '智能体编排访问', 'platform:workflow:view', '访问智能体编排(iframe)', 'module_system', true, 'system', NULL, now(), false); -- ============================= @@ -151,36 +163,84 @@ INSERT INTO sys.tb_sys_permission ( -- ============================= INSERT INTO sys.tb_sys_view ( optsn, view_id, name, parent_id, url, component, icon, type, - layout, order_num, description, creator, create_time, deleted + view_type, iframe_url, service, layout, order_num, description, + creator, create_time, deleted ) VALUES +-- ========================= +-- 平台应用菜单 (platform) +-- ========================= -- 一级菜单 -('VIEW-0001', 'view_system', '系统管理', NULL, '/system', NULL, 'Settings', 0, - 'MainLayout', 100, '系统管理菜单', 'system', now(), false), +('VIEW-P001', 'view_platform_home', '工作台', NULL, '/home', 'Home', 'Grid', 1, + 'route', NULL, 'platform', 'SidebarLayout', 10, '平台工作台首页', 'system', now(), false), -('VIEW-0002', 'view_business', '业务管理', NULL, '/business', NULL, 'Briefcase', 0, - 'MainLayout', 200, '业务管理菜单', 'system', now(), false), +('VIEW-P002', 'view_platform_chat', 'AI助手', NULL, '/chat', 'Chat', 'ChatDotRound', 1, + 'route', NULL, 'platform', 'SidebarLayout', 20, 'AI智能对话助手', 'system', now(), false), + +-- iframe 嵌入菜单 +('VIEW-P003', 'view_platform_bidding', '招标助手', NULL, NULL, NULL, 'Document', 1, + 'iframe', 'http://localhost:5002', 'platform', 'SidebarLayout', 30, '招标应用(iframe)', 'system', now(), false), + +('VIEW-P004', 'view_platform_workcase', '泰豪小电', NULL, NULL, NULL, 'Service', 1, + 'iframe', 'http://localhost:5003', 'platform', 'SidebarLayout', 40, '客服应用(iframe)', 'system', now(), false), + +('VIEW-P005', 'view_platform_workflow', '智能体编排', NULL, NULL, NULL, 'Connection', 1, + 'iframe', 'http://localhost:3000', 'platform', 'SidebarLayout', 50, 'Dify智能体编排(iframe)', 'system', now(), false), + +-- 系统管理目录 +('VIEW-P100', 'view_system', '系统管理', NULL, '/system', NULL, 'Settings', 0, + 'route', NULL, 'platform', 'SidebarLayout', 100, '系统管理目录', 'system', now(), false), -- 系统管理子菜单 -('VIEW-0101', 'view_user', '用户管理', 'view_system', '/system/user', 'system/UserList', 'Users', 1, - 'MainLayout', 10, '用户管理页面', 'system', now(), false), +('VIEW-P101', 'view_user', '用户管理', 'view_system', '/system/user', 'system/UserList', 'Users', 1, + 'route', NULL, 'platform', 'SidebarLayout', 10, '用户管理页面', 'system', now(), false), -('VIEW-0102', 'view_role', '角色管理', 'view_system', '/system/role', 'system/RoleList', 'Shield', 1, - 'MainLayout', 20, '角色管理页面', 'system', now(), false), +('VIEW-P102', 'view_role', '角色管理', 'view_system', '/system/role', 'system/RoleList', 'Shield', 1, + 'route', NULL, 'platform', 'SidebarLayout', 20, '角色管理页面', 'system', now(), false), -('VIEW-0103', 'view_dept', '部门管理', 'view_system', '/system/dept', 'system/DeptList', 'Building', 1, - 'MainLayout', 30, '部门管理页面', 'system', now(), false), +('VIEW-P103', 'view_dept', '部门管理', 'view_system', '/system/dept', 'system/DeptList', 'Building', 1, + 'route', NULL, 'platform', 'SidebarLayout', 30, '部门管理页面', 'system', now(), false), -('VIEW-0104', 'view_permission', '权限管理', 'view_system', '/system/permission', 'system/PermissionList', 'Lock', 1, - 'MainLayout', 40, '权限管理页面', 'system', now(), false), +('VIEW-P104', 'view_permission', '权限管理', 'view_system', '/system/permission', 'system/PermissionList', 'Lock', 1, + 'route', NULL, 'platform', 'SidebarLayout', 40, '权限管理页面', 'system', now(), false), -('VIEW-0105', 'view_config', '配置管理', 'view_system', '/system/config', 'system/ConfigList', 'Settings', 1, - 'MainLayout', 50, '配置管理页面', 'system', now(), false), +('VIEW-P105', 'view_config', '配置管理', 'view_system', '/system/config', 'system/ConfigList', 'Settings', 1, + 'route', NULL, 'platform', 'SidebarLayout', 50, '配置管理页面', 'system', now(), false), -('VIEW-0106', 'view_file', '文件管理', 'view_system', '/system/file', 'system/FileList', 'FileText', 1, - 'MainLayout', 60, '文件管理页面', 'system', now(), false), +('VIEW-P106', 'view_file', '文件管理', 'view_system', '/system/file', 'system/FileList', 'FileText', 1, + 'route', NULL, 'platform', 'SidebarLayout', 60, '文件管理页面', 'system', now(), false), -('VIEW-0107', 'view_message', '消息管理', 'view_system', '/system/message', 'system/MessageList', 'Mail', 1, - 'MainLayout', 70, '消息管理页面', 'system', now(), false); +('VIEW-P107', 'view_message', '消息管理', 'view_system', '/system/message', 'system/MessageList', 'Mail', 1, + 'route', NULL, 'platform', 'SidebarLayout', 70, '消息管理页面', 'system', now(), false), + +-- ========================= +-- 招标应用菜单 (bidding) +-- ========================= +('VIEW-B001', 'view_bidding_home', '首页', NULL, '/home', 'Home', 'House', 1, + 'route', NULL, 'bidding', 'DefaultLayout', 10, '招标应用首页', 'system', now(), false), + +('VIEW-B002', 'view_bidding_list', '招标列表', NULL, '/bidding/list', 'bidding/List', 'List', 1, + 'route', NULL, 'bidding', 'DefaultLayout', 20, '招标项目列表', 'system', now(), false), + +('VIEW-B003', 'view_bidding_detail', '招标详情', NULL, '/bidding/detail', 'bidding/Detail', 'Document', 1, + 'route', NULL, 'bidding', 'DefaultLayout', 30, '招标项目详情', 'system', now(), false), + +('VIEW-B004', 'view_bidding_offer', '投标管理', NULL, '/bidding/offer', 'bidding/Offer', 'Edit', 1, + 'route', NULL, 'bidding', 'DefaultLayout', 40, '投标管理页面', 'system', now(), false), + +-- ========================= +-- 客服应用菜单 (workcase) +-- ========================= +('VIEW-W001', 'view_workcase_home', '首页', NULL, '/home', 'Home', 'House', 1, + 'route', NULL, 'workcase', 'DefaultLayout', 10, '客服应用首页', 'system', now(), false), + +('VIEW-W002', 'view_workcase_list', '工单列表', NULL, '/workcase/list', 'workcase/List', 'Tickets', 1, + 'route', NULL, 'workcase', 'DefaultLayout', 20, '工单列表页面', 'system', now(), false), + +('VIEW-W003', 'view_workcase_detail', '工单详情', NULL, '/workcase/detail', 'workcase/Detail', 'Document', 1, + 'route', NULL, 'workcase', 'DefaultLayout', 30, '工单详情页面', 'system', now(), false), + +('VIEW-W004', 'view_workcase_chat', '智能客服', NULL, '/workcase/chat', 'workcase/Chat', 'ChatDotRound', 1, + 'route', NULL, 'workcase', 'DefaultLayout', 40, '智能客服聊天', 'system', now(), false); -- ============================= -- 6. 角色权限关联(超级管理员拥有所有权限) @@ -199,7 +259,7 @@ SELECT FROM sys.tb_sys_permission WHERE deleted = false; --- 系统管理员权限(除了用户删除外的系统管理权限) +-- 系统管理员权限(除了用户删除外的系统管理权限 + 所有平台基础菜单) INSERT INTO sys.tb_sys_role_permission ( optsn, role_id, permission_id, creator, dept_path, create_time, deleted ) @@ -214,73 +274,94 @@ SELECT FROM sys.tb_sys_permission WHERE deleted = false AND code NOT IN ('system:user:delete', 'system:role:delete', 'system:dept:delete') - AND module_id IN ('module_system', 'module_file', 'module_message', 'module_config'); + AND ( + module_id IN ('module_system', 'module_file', 'module_message', 'module_config', 'module_bidding', 'module_workcase') + OR code LIKE 'platform:%:view' -- 包含所有平台基础菜单权限 + ); --- 普通用户权限(基础查看和文件操作) +-- 普通用户权限(基础查看和文件操作 + 平台基础菜单访问) INSERT INTO sys.tb_sys_role_permission ( optsn, role_id, permission_id, creator, dept_path, create_time, deleted ) VALUES -('RP-U-0001', 'role_user', 'perm_user_view', 'system', NULL, now(), false), -('RP-U-0002', 'role_user', 'perm_file_view', 'system', NULL, now(), false), -('RP-U-0003', 'role_user', 'perm_file_upload', 'system', NULL, now(), false), -('RP-U-0004', 'role_user', 'perm_file_download', 'system', NULL, now(), false), -('RP-U-0005', 'role_user', 'perm_message_view', 'system', NULL, now(), false), -('RP-U-0006', 'role_user', 'perm_config_view', 'system', NULL, now(), false); +-- 平台基础菜单访问权限 +('RP-U-0001', 'role_user', 'perm_platform_home', 'system', NULL, now(), false), +('RP-U-0002', 'role_user', 'perm_platform_chat', 'system', NULL, now(), false), +('RP-U-0003', 'role_user', 'perm_platform_bidding', 'system', NULL, now(), false), +('RP-U-0004', 'role_user', 'perm_platform_workcase', 'system', NULL, now(), false), +('RP-U-0005', 'role_user', 'perm_platform_workflow', 'system', NULL, now(), false), +-- 系统功能权限 +('RP-U-0011', 'role_user', 'perm_user_view', 'system', NULL, now(), false), +('RP-U-0012', 'role_user', 'perm_file_view', 'system', NULL, now(), false), +('RP-U-0013', 'role_user', 'perm_file_upload', 'system', NULL, now(), false), +('RP-U-0014', 'role_user', 'perm_file_download', 'system', NULL, now(), false), +('RP-U-0015', 'role_user', 'perm_message_view', 'system', NULL, now(), false), +('RP-U-0016', 'role_user', 'perm_config_view', 'system', NULL, now(), false); --- 访客权限(仅查看) +-- 访客权限(仅查看 + 基础菜单访问) INSERT INTO sys.tb_sys_role_permission ( optsn, role_id, permission_id, creator, dept_path, create_time, deleted ) VALUES -('RP-G-0001', 'role_guest', 'perm_user_view', 'system', NULL, now(), false), -('RP-G-0002', 'role_guest', 'perm_file_view', 'system', NULL, now(), false), -('RP-G-0003', 'role_guest', 'perm_message_view', 'system', NULL, now(), false); +-- 平台基础菜单访问权限 +('RP-G-0001', 'role_guest', 'perm_platform_home', 'system', NULL, now(), false), +('RP-G-0002', 'role_guest', 'perm_platform_chat', 'system', NULL, now(), false), +-- 系统功能权限(仅查看) +('RP-G-0011', 'role_guest', 'perm_user_view', 'system', NULL, now(), false), +('RP-G-0012', 'role_guest', 'perm_file_view', 'system', NULL, now(), false), +('RP-G-0013', 'role_guest', 'perm_message_view', 'system', NULL, now(), false); -- ============================= -- 7. 视图权限关联 -- ============================= --- 将视图与对应模块的权限关联 +-- 将视图与对应模块的权限关联(使用新的 view_id) INSERT INTO sys.tb_sys_view_permission ( optsn, view_id, permission_id, creator, dept_path, create_time, deleted ) VALUES --- 用户管理视图关联用户权限 -('VP-0001', 'view_user', 'perm_user_view', 'system', NULL, now(), false), -('VP-0002', 'view_user', 'perm_user_create', 'system', NULL, now(), false), -('VP-0003', 'view_user', 'perm_user_edit', 'system', NULL, now(), false), -('VP-0004', 'view_user', 'perm_user_delete', 'system', NULL, now(), false), -('VP-0005', 'view_user', 'perm_user_export', 'system', NULL, now(), false), +-- 平台基础菜单权限关联(所有登录用户都可访问) +('VP-P001', 'VIEW-P001', 'perm_platform_home', 'system', NULL, now(), false), +('VP-P002', 'VIEW-P002', 'perm_platform_chat', 'system', NULL, now(), false), +('VP-P003', 'VIEW-P003', 'perm_platform_bidding', 'system', NULL, now(), false), +('VP-P004', 'VIEW-P004', 'perm_platform_workcase', 'system', NULL, now(), false), +('VP-P005', 'VIEW-P005', 'perm_platform_workflow', 'system', NULL, now(), false), --- 角色管理视图关联角色权限 -('VP-0011', 'view_role', 'perm_role_view', 'system', NULL, now(), false), -('VP-0012', 'view_role', 'perm_role_create', 'system', NULL, now(), false), -('VP-0013', 'view_role', 'perm_role_edit', 'system', NULL, now(), false), -('VP-0014', 'view_role', 'perm_role_delete', 'system', NULL, now(), false), -('VP-0015', 'view_role', 'perm_role_export', 'system', NULL, now(), false), +-- 用户管理视图关联用户权限(VIEW-P101) +('VP-0001', 'VIEW-P101', 'perm_user_view', 'system', NULL, now(), false), +('VP-0002', 'VIEW-P101', 'perm_user_create', 'system', NULL, now(), false), +('VP-0003', 'VIEW-P101', 'perm_user_edit', 'system', NULL, now(), false), +('VP-0004', 'VIEW-P101', 'perm_user_delete', 'system', NULL, now(), false), +('VP-0005', 'VIEW-P101', 'perm_user_export', 'system', NULL, now(), false), --- 部门管理视图关联部门权限 -('VP-0021', 'view_dept', 'perm_dept_view', 'system', NULL, now(), false), -('VP-0022', 'view_dept', 'perm_dept_create', 'system', NULL, now(), false), -('VP-0023', 'view_dept', 'perm_dept_edit', 'system', NULL, now(), false), -('VP-0024', 'view_dept', 'perm_dept_delete', 'system', NULL, now(), false), -('VP-0025', 'view_dept', 'perm_dept_export', 'system', NULL, now(), false), +-- 角色管理视图关联角色权限(VIEW-P102) +('VP-0011', 'VIEW-P102', 'perm_role_view', 'system', NULL, now(), false), +('VP-0012', 'VIEW-P102', 'perm_role_create', 'system', NULL, now(), false), +('VP-0013', 'VIEW-P102', 'perm_role_edit', 'system', NULL, now(), false), +('VP-0014', 'VIEW-P102', 'perm_role_delete', 'system', NULL, now(), false), +('VP-0015', 'VIEW-P102', 'perm_role_export', 'system', NULL, now(), false), --- 权限管理视图关联权限管理权限 -('VP-0031', 'view_permission', 'perm_permission_view', 'system', NULL, now(), false), -('VP-0032', 'view_permission', 'perm_permission_manage', 'system', NULL, now(), false), +-- 部门管理视图关联部门权限(VIEW-P103) +('VP-0021', 'VIEW-P103', 'perm_dept_view', 'system', NULL, now(), false), +('VP-0022', 'VIEW-P103', 'perm_dept_create', 'system', NULL, now(), false), +('VP-0023', 'VIEW-P103', 'perm_dept_edit', 'system', NULL, now(), false), +('VP-0024', 'VIEW-P103', 'perm_dept_delete', 'system', NULL, now(), false), +('VP-0025', 'VIEW-P103', 'perm_dept_export', 'system', NULL, now(), false), --- 配置管理视图关联配置权限 -('VP-0041', 'view_config', 'perm_config_view', 'system', NULL, now(), false), -('VP-0042', 'view_config', 'perm_config_edit', 'system', NULL, now(), false), -('VP-0043', 'view_config', 'perm_config_export', 'system', NULL, now(), false), +-- 权限管理视图关联权限管理权限(VIEW-P104) +('VP-0031', 'VIEW-P104', 'perm_permission_view', 'system', NULL, now(), false), +('VP-0032', 'VIEW-P104', 'perm_permission_manage', 'system', NULL, now(), false), --- 文件管理视图关联文件权限 -('VP-0051', 'view_file', 'perm_file_view', 'system', NULL, now(), false), -('VP-0052', 'view_file', 'perm_file_upload', 'system', NULL, now(), false), -('VP-0053', 'view_file', 'perm_file_download', 'system', NULL, now(), false), -('VP-0054', 'view_file', 'perm_file_delete', 'system', NULL, now(), false), -('VP-0055', 'view_file', 'perm_file_export', 'system', NULL, now(), false), +-- 配置管理视图关联配置权限(VIEW-P105) +('VP-0041', 'VIEW-P105', 'perm_config_view', 'system', NULL, now(), false), +('VP-0042', 'VIEW-P105', 'perm_config_edit', 'system', NULL, now(), false), +('VP-0043', 'VIEW-P105', 'perm_config_export', 'system', NULL, now(), false), --- 消息管理视图关联消息权限 -('VP-0061', 'view_message', 'perm_message_view', 'system', NULL, now(), false), -('VP-0062', 'view_message', 'perm_message_send', 'system', NULL, now(), false), -('VP-0063', 'view_message', 'perm_message_manage', 'system', NULL, now(), false), -('VP-0064', 'view_message', 'perm_message_export', 'system', NULL, now(), false); +-- 文件管理视图关联文件权限(VIEW-P106) +('VP-0051', 'VIEW-P106', 'perm_file_view', 'system', NULL, now(), false), +('VP-0052', 'VIEW-P106', 'perm_file_upload', 'system', NULL, now(), false), +('VP-0053', 'VIEW-P106', 'perm_file_download', 'system', NULL, now(), false), +('VP-0054', 'VIEW-P106', 'perm_file_delete', 'system', NULL, now(), false), +('VP-0055', 'VIEW-P106', 'perm_file_export', 'system', NULL, now(), false), + +-- 消息管理视图关联消息权限(VIEW-P107) +('VP-0061', 'VIEW-P107', 'perm_message_view', 'system', NULL, now(), false), +('VP-0062', 'VIEW-P107', 'perm_message_send', 'system', NULL, now(), false), +('VP-0063', 'VIEW-P107', 'perm_message_manage', 'system', NULL, now(), false), +('VP-0064', 'VIEW-P107', 'perm_message_export', 'system', NULL, now(), false); diff --git a/urbanLifelineServ/auth/src/main/resources/application.yml b/urbanLifelineServ/auth/src/main/resources/application.yml index 26597671..4c3c285f 100644 --- a/urbanLifelineServ/auth/src/main/resources/application.yml +++ b/urbanLifelineServ/auth/src/main/resources/application.yml @@ -12,7 +12,7 @@ urban-lifeline: - /** # 认证服务的所有接口都放行 security: aes: - secret-key: 1234567890qwer + secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= # Base64 编码,32字节(256位) # ================== Spring ================== spring: application: diff --git a/urbanLifelineServ/common/common-dto/src/main/java/org/xyzh/common/dto/sys/TbSysViewDTO.java b/urbanLifelineServ/common/common-dto/src/main/java/org/xyzh/common/dto/sys/TbSysViewDTO.java index 1991bcf6..0ee70783 100644 --- a/urbanLifelineServ/common/common-dto/src/main/java/org/xyzh/common/dto/sys/TbSysViewDTO.java +++ b/urbanLifelineServ/common/common-dto/src/main/java/org/xyzh/common/dto/sys/TbSysViewDTO.java @@ -36,9 +36,18 @@ public class TbSysViewDTO extends BaseDTO { @Schema(description = "图标") private String icon; - @Schema(description = "类型") + @Schema(description = "类型:0=目录 1=菜单页面 2=按钮") private Integer type; + @Schema(description = "页面类型:route=路由页面 iframe=嵌入页面") + private String viewType; + + @Schema(description = "iframe URL(仅当viewType=iframe时有效)") + private String iframeUrl; + + @Schema(description = "所属服务:platform=平台应用 bidding=招标应用 workcase=客服应用") + private String service; + @Schema(description = "布局") private String layout; diff --git a/urbanLifelineServ/gateway/src/main/resources/application.yml b/urbanLifelineServ/gateway/src/main/resources/application.yml index 88c78a9b..1d5cef06 100644 --- a/urbanLifelineServ/gateway/src/main/resources/application.yml +++ b/urbanLifelineServ/gateway/src/main/resources/application.yml @@ -37,9 +37,9 @@ spring: - id: auth-service uri: lb://auth-service predicates: - - Path=/auth/** + - Path=/urban-lifeline/auth/** filters: - - RewritePath=/auth/(?.*), /urban-lifeline/auth/$\{segment} + # 不需要重写,直接转发保持原路径 - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 100 @@ -49,73 +49,55 @@ spring: - id: system-service uri: lb://system-service predicates: - - Path=/system/** - filters: - - RewritePath=/system/(?.*), /urban-lifeline/system/$\{segment} + - Path=/urban-lifeline/system/** # ==================== 日志服务路由 ==================== - id: log-service uri: lb://log-service predicates: - - Path=/log/** - filters: - - RewritePath=/log/(?.*), /urban-lifeline/log/$\{segment} + - Path=/urban-lifeline/log/** # ==================== 文件服务路由 ==================== - id: file-service uri: lb://file-service predicates: - - Path=/file/** - filters: - - RewritePath=/file/(?.*), /urban-lifeline/file/$\{segment} + - Path=/urban-lifeline/file/** # ==================== 消息服务路由 ==================== - id: message-service uri: lb://message-service predicates: - - Path=/message/** - filters: - - RewritePath=/message/(?.*), /urban-lifeline/message/$\{segment} + - Path=/urban-lifeline/message/** # ==================== 招投标服务路由 ==================== - id: bidding-service uri: lb://bidding-service predicates: - - Path=/bidding/** - filters: - - RewritePath=/bidding/(?.*), /urban-lifeline/bidding/$\{segment} + - Path=/urban-lifeline/bidding/** # ==================== 平台服务路由 ==================== - id: platform-service uri: lb://platform-service predicates: - - Path=/platform/** - filters: - - RewritePath=/platform/(?.*), /urban-lifeline/platform/$\{segment} + - Path=/urban-lifeline/platform/** # ==================== 工单服务路由 ==================== - id: workcase-service uri: lb://workcase-service predicates: - - Path=/workcase/** - filters: - - RewritePath=/workcase/(?.*), /urban-lifeline/workcase/$\{segment} + - Path=/urban-lifeline/workcase/** # ==================== 定时任务服务路由 ==================== - id: crontab-service uri: lb://crontab-service predicates: - - Path=/crontab/** - filters: - - RewritePath=/crontab/(?.*), /urban-lifeline/crontab/$\{segment} + - Path=/urban-lifeline/crontab/** # ==================== AI Agent 服务路由 ==================== - id: agent-service uri: lb://agent-service predicates: - - Path=/agent/** - filters: - - RewritePath=/agent/(?.*), /urban-lifeline/agent/$\{segment} + - Path=/urban-lifeline/agent/** # 全局跨域配置 globalcors: @@ -175,7 +157,7 @@ auth: - /error security: aes: - secret-key: 1234567890qwer + secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= # Base64 编码,32字节(256位) # Actuator 监控端点 management: endpoints: diff --git a/urbanLifelineServ/system/src/main/resources/mapper/view/TbSysViewMapper.xml b/urbanLifelineServ/system/src/main/resources/mapper/view/TbSysViewMapper.xml index 90ca9ce5..5dbcba88 100644 --- a/urbanLifelineServ/system/src/main/resources/mapper/view/TbSysViewMapper.xml +++ b/urbanLifelineServ/system/src/main/resources/mapper/view/TbSysViewMapper.xml @@ -12,6 +12,9 @@ + + + @@ -29,7 +32,7 @@ - view_id, name, parent_id, url, component, icon, type, layout, order_num, description, + view_id, name, parent_id, url, component, icon, type, view_type, iframe_url, service, layout, order_num, description, optsn, creator, updater, dept_path, remark, create_time, update_time, delete_time, deleted @@ -44,11 +47,14 @@ layout, order_num, optsn, - + parent_id, url, component, icon, + view_type, + iframe_url, + service, description, creator, dept_path, @@ -72,6 +78,9 @@ #{url}, #{component}, #{icon}, + #{viewType}, + #{iframeUrl}, + #{service}, #{description}, #{creator}, #{deptPath}, @@ -105,6 +114,15 @@ type = #{type}, + + view_type = #{viewType}, + + + iframe_url = #{iframeUrl}, + + + service = #{service}, + layout = #{layout}, @@ -168,6 +186,12 @@ AND type = #{filter.type} + + AND view_type = #{filter.viewType} + + + AND service = #{filter.service} + AND dept_path LIKE CONCAT(#{filter.deptPath}, '%') @@ -194,6 +218,12 @@ AND type = #{filter.type} + + AND view_type = #{filter.viewType} + + + AND service = #{filter.service} + AND dept_path LIKE CONCAT(#{filter.deptPath}, '%') @@ -220,6 +250,12 @@ AND type = #{filter.type} + + AND view_type = #{filter.viewType} + + + AND service = #{filter.service} + AND dept_path LIKE CONCAT(#{filter.deptPath}, '%') diff --git a/urbanLifelineWeb/README.md b/urbanLifelineWeb/README.md index 4bf4f0c0..6be7dfc7 100644 --- a/urbanLifelineWeb/README.md +++ b/urbanLifelineWeb/README.md @@ -1,6 +1,8 @@ # Urban Lifeline Web 微前端项目 -基于 Import Maps 的微前端架构,包含共享模块和多个业务应用。 +基于 **@module-federation/vite** 的微前端架构,包含共享模块和多个业务应用。 + +> ✨ **v2.0 升级**:已从 `@originjs/vite-plugin-federation` 迁移到官方维护的 `@module-federation/vite`,获得更好的开发体验和稳定性! ## 📦 项目结构 @@ -19,40 +21,43 @@ urbanLifelineWeb/ ### 1. 安装依赖 ```bash -# 一键安装所有包的依赖 -npm run install:all +# 使用 pnpm 安装(推荐) +pnpm install -# 或单独安装 -npm run install:shared -npm run install:platform -npm run install:bidding -npm run install:workcase +# 或使用 install.bat 脚本 +install.bat ``` ### 2. 启动开发服务器 ```bash -# 同时启动所有服务 -npm run dev:all +# 方式1: 使用启动脚本(Windows,推荐) +start-all.bat -# 或单独启动 -npm run dev:shared # http://localhost:5000 -npm run dev:platform # http://localhost:5001 -npm run dev:bidding # http://localhost:5002 -npm run dev:workcase # http://localhost:5003 +# 方式2: 使用 pnpm 并行启动所有服务 +pnpm run dev + +# 方式3: 手动启动(需要两个终端) +# 终端1 - 启动 shared +cd packages/shared +pnpm run dev # http://localhost:5000 + +# 终端2 - 启动 platform +cd packages/platform +pnpm run dev # http://localhost:5001 ``` ### 3. 构建生产版本 ```bash # 构建所有应用 -npm run build:all +pnpm run build # 或单独构建 -npm run build:shared -npm run build:platform -npm run build:bidding -npm run build:workcase +cd packages/shared && pnpm run build +cd packages/platform && pnpm run build +cd packages/bidding && pnpm run build +cd packages/workcase && pnpm run build ``` ## 🌐 端口分配 @@ -73,24 +78,144 @@ npm run build:workcase - **路由**: Vue Router 4.5 - **工具库**: VueUse -## 📝 开发说明 +## 📝 Module Federation 配置 -### Import Maps +### Shared 配置 (packages/shared/vite.config.ts) -本项目使用 Import Maps 实现模块共享: +```typescript +import { federation } from '@module-federation/vite' -```html - ``` +### 优势 + +- ✅ **开发模式直接支持**:无需构建,直接 dev 即可 +- ✅ **完整的热更新**:修改 shared 代码自动更新到 platform +- ✅ **自动路径处理**:无需关心 shared 内部的 `@/` 路径 +- ✅ **依赖去重**:vue、element-plus 等只加载一次 +- ✅ **企业级稳定**:官方维护,支持 Vite 6 + +## 🎯 开发工作流 + +### 日常开发 + +1. **启动服务**(每天开始) + ```bash + # 使用脚本一键启动 + start-all.bat + + # 或手动启动 + cd packages/shared && pnpm run dev # 终端1 + cd packages/platform && pnpm run dev # 终端2 + ``` + +2. **修改代码** + - 修改 shared 组件 → 保存 → 自动热更新 ✨ + - 修改 platform 页面 → 保存 → 自动热更新 ✨ + +3. **结束开发** + - 按 Ctrl+C 停止所有服务 + +### 添加新的共享模块 + +1. **在 shared 中创建组件** + ```bash + # 例如创建新组件 + packages/shared/src/components/mynew/MyNewComponent.vue + ``` + +2. **在 shared/vite.config.ts 中暴露** + ```typescript + exposes: { + './MyNewComponent': './src/components/mynew/MyNewComponent.vue' + } + ``` + +3. **在 platform 中使用** + ```typescript + import MyNewComponent from 'shared/MyNewComponent' + ``` + ### API 代理 所有应用的 `/api` 请求会代理到后端服务 `http://localhost:8080` @@ -101,7 +226,8 @@ npm run build:workcase ## 🔥 注意事项 -1. **启动顺序**: 建议先启动 `shared` 服务,再启动其他应用 -2. **端口占用**: 确保 5000-5003 端口未被占用 -3. **Node 版本**: 建议使用 Node.js 18+ -4. **依赖安装**: 首次运行前必须执行 `npm run install:all` +1. **包管理器**: 必须使用 pnpm(项目使用 pnpm workspace) +2. **启动顺序**: 必须先启动 `shared` 服务(5000端口),再启动其他应用 +3. **端口占用**: 确保 5000-5003 端口未被占用,shared 使用 strictPort 模式 +4. **Node 版本**: 建议使用 Node.js 18+ +5. **Module Federation**: remoteEntry.js 路径为 `http://localhost:5000/remoteEntry.js`(不是 /assets/) diff --git a/urbanLifelineWeb/package-lock.json b/urbanLifelineWeb/package-lock.json index 0780fdc5..f6092b79 100644 --- a/urbanLifelineWeb/package-lock.json +++ b/urbanLifelineWeb/package-lock.json @@ -429,22 +429,6 @@ "node": ">=10" } }, - "node_modules/@dcloudio/uni-cli-shared": { - "version": "2.0.2-4080420251103001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-2.0.2-4080420251103001.tgz", - "integrity": "sha512-HZOtk1aufvntxfm8tkT4dFrWbLWaG8KetbOyDzlRQ/bEgPur0FQiQZux0KeLjq6HWGB/YgXDqsfoFp+rs3u28g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "escape-string-regexp": "^4.0.0", - "fast-glob": "^3.2.11", - "fs-extra": "^10.0.0", - "glob-escape": "^0.0.2", - "hash-sum": "^1.0.2", - "postcss-urlrewrite": "^0.2.2", - "strip-json-comments": "^2.0.1" - } - }, "node_modules/@element-plus/icons-vue": { "version": "2.3.2", "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", @@ -1073,42 +1057,57 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@module-federation/error-codes": { + "version": "0.21.6", + "resolved": "https://registry.npmmirror.com/@module-federation/error-codes/-/error-codes-0.21.6.tgz", + "integrity": "sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.21.6", + "resolved": "https://registry.npmmirror.com/@module-federation/runtime/-/runtime-0.21.6.tgz", + "integrity": "sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" + "@module-federation/error-codes": "0.21.6", + "@module-federation/runtime-core": "0.21.6", + "@module-federation/sdk": "0.21.6" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@module-federation/runtime-core": { + "version": "0.21.6", + "resolved": "https://registry.npmmirror.com/@module-federation/runtime-core/-/runtime-core-0.21.6.tgz", + "integrity": "sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "@module-federation/error-codes": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.21.6", + "resolved": "https://registry.npmmirror.com/@module-federation/sdk/-/sdk-0.21.6.tgz", + "integrity": "sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/vite": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/@module-federation/vite/-/vite-1.9.3.tgz", + "integrity": "sha512-MV6XI3FX6okEMJ7FdmvFmYuu7DygRoLljKT8atrBwFhlttsgBbswpqMj4P4Fs/X+pFmbIi/ntFzVhsrG0qQnGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "^0.21.6", + "@module-federation/sdk": "^0.21.6", + "@rollup/pluginutils": "^5.1.0", + "defu": "^6.1.4", + "estree-walker": "^2", + "magic-string": "^0.30.11", + "pathe": "^1.1.2" } }, "node_modules/@parcel/watcher": { @@ -1451,30 +1450,26 @@ "license": "MIT" }, "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" }, "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -1796,27 +1791,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, "node_modules/@types/lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.21.tgz", @@ -1832,13 +1806,6 @@ "@types/lodash": "*" } }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { "version": "22.19.1", "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.19.1.tgz", @@ -2165,7 +2132,6 @@ "version": "1.3.8", "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -2212,19 +2178,8 @@ "version": "1.1.1", "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, "license": "MIT" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", @@ -2237,54 +2192,6 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", - "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/axios": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.2.tgz", @@ -2317,7 +2224,6 @@ "version": "1.20.4", "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.4.tgz", "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "dev": true, "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -2342,7 +2248,6 @@ "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -2352,7 +2257,6 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { @@ -2371,6 +2275,7 @@ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -2423,22 +2328,11 @@ "version": "3.1.2", "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -2456,7 +2350,6 @@ "version": "1.0.4", "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2571,13 +2464,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "license": "MIT" - }, "node_modules/colorjs.io": { "version": "0.5.2", "resolved": "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz", @@ -2633,7 +2519,6 @@ "version": "0.5.4", "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -2646,7 +2531,6 @@ "version": "1.0.5", "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -2663,7 +2547,6 @@ "version": "0.7.2", "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -2673,9 +2556,21 @@ "version": "1.0.7", "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.7.tgz", "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "dev": true, "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2691,19 +2586,6 @@ "node": ">= 8" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", @@ -2741,6 +2623,13 @@ } } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true, + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2754,7 +2643,6 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -2770,7 +2658,6 @@ "version": "1.2.0", "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8", @@ -2791,19 +2678,6 @@ "node": ">=0.10" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2829,7 +2703,6 @@ "version": "1.1.1", "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, "license": "MIT" }, "node_modules/electron-to-chromium": { @@ -2917,7 +2790,6 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -3022,346 +2894,6 @@ "@esbuild/win32-x64": "0.25.12" } }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", @@ -3376,22 +2908,8 @@ "version": "1.0.3", "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, "license": "MIT" }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", @@ -3402,7 +2920,6 @@ "version": "1.8.1", "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -3412,7 +2929,6 @@ "version": "4.22.1", "resolved": "https://registry.npmmirror.com/express/-/express-4.22.1.tgz", "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -3459,7 +2975,6 @@ "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -3469,36 +2984,8 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", @@ -3523,6 +3010,7 @@ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3534,7 +3022,6 @@ "version": "1.3.2", "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.2.tgz", "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -3553,7 +3040,6 @@ "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -3563,7 +3049,6 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, "license": "MIT" }, "node_modules/follow-redirects": { @@ -3623,58 +3108,20 @@ "version": "0.2.0", "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", @@ -3777,95 +3224,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-escape": { - "version": "0.0.2", - "resolved": "https://registry.npmmirror.com/glob-escape/-/glob-escape-0.0.2.tgz", - "integrity": "sha512-L/cXYz8x7qer1HAyUQ+mbjcUsJVdpRxpAf7CwqHoNBs9vTpABlGfNN4tzkDxt+u3Z7ZncVyKlCNPtzb0R/7WbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "10.0.1", - "resolved": "https://registry.npmmirror.com/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globby/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/globby/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globby/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", @@ -3922,13 +3280,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true, - "license": "MIT" - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", @@ -3955,7 +3306,6 @@ "version": "2.0.1", "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "dev": true, "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -3976,7 +3326,6 @@ "version": "0.4.24", "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -3985,16 +3334,6 @@ "node": ">=0.10.0" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/immutable": { "version": "5.1.4", "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.4.tgz", @@ -4002,30 +3341,16 @@ "dev": true, "license": "MIT" }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" @@ -4053,6 +3378,7 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -4073,6 +3399,7 @@ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -4086,20 +3413,11 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.12.0" } }, - "node_modules/is-plain-object": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", - "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", @@ -4156,26 +3474,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", @@ -4231,7 +3529,6 @@ "version": "0.3.0", "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -4247,27 +3544,15 @@ "version": "1.0.3", "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -4279,6 +3564,7 @@ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4293,6 +3579,7 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=8.6" }, @@ -4300,19 +3587,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", @@ -4360,18 +3634,10 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/module-alias": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz", - "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/muggle-string": { @@ -4403,7 +3669,6 @@ "version": "0.6.3", "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -4430,27 +3695,25 @@ "dev": true, "license": "MIT" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-wheel-es": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", "license": "BSD-3-Clause" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4474,7 +3737,6 @@ "version": "2.4.1", "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -4483,16 +3745,6 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -4504,7 +3756,6 @@ "version": "1.3.3", "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -4517,16 +3768,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", @@ -4572,18 +3813,14 @@ "version": "0.1.12", "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", @@ -4654,58 +3891,10 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-helpers": { - "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/postcss-helpers/-/postcss-helpers-0.3.3.tgz", - "integrity": "sha512-VumiUcrpbxGlTBNQj6fUOkb/HNRUk/xYz8bNlhgVOdvk3yWEy4B+0nlDUZZM9mTVZ5bJoxUy7WT6z/4E7oMTgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "urijs": "^1.18.12" - }, - "engines": { - "node": ">=0.12.9" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-urlrewrite": { - "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/postcss-urlrewrite/-/postcss-urlrewrite-0.2.2.tgz", - "integrity": "sha512-DxPSgykgHjoV4Z+ygvq2C5HkiuiKQQD74xpoNQSQuyi8zab9nODVtNKfnCN6BEv9VZrjpOGLGAf8BDvgG6EtHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-helpers": "^0.3.2" - }, - "engines": { - "node": ">=0.12.9" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -4725,7 +3914,6 @@ "version": "6.14.0", "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -4737,32 +3925,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -4772,7 +3938,6 @@ "version": "2.5.3", "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.3.tgz", "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "dev": true, "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -4829,17 +3994,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "5.0.10", "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-5.0.10.tgz", @@ -4898,82 +4052,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-copy": { - "version": "3.5.0", - "resolved": "https://registry.npmmirror.com/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", - "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^8.0.1", - "colorette": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "10.0.1", - "is-plain-object": "^3.0.0" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/rollup-plugin-copy/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/rollup-plugin-copy/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/rollup-plugin-copy/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", @@ -4988,7 +4066,6 @@ "version": "5.2.1", "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -5009,7 +4086,6 @@ "version": "2.1.2", "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, "node_modules/sass": { @@ -5440,7 +4516,6 @@ "version": "0.19.1", "resolved": "https://registry.npmmirror.com/send/-/send-0.19.1.tgz", "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", - "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -5465,7 +4540,6 @@ "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -5475,14 +4549,12 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, "license": "MIT" }, "node_modules/send/node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -5499,7 +4571,6 @@ "version": "1.6.0", "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -5512,7 +4583,6 @@ "version": "2.0.1", "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -5522,7 +4592,6 @@ "version": "1.16.2", "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", @@ -5538,7 +4607,6 @@ "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -5548,14 +4616,12 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, "license": "MIT" }, "node_modules/serve-static/node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -5572,7 +4638,6 @@ "version": "1.6.0", "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -5585,7 +4650,6 @@ "version": "0.19.0", "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -5610,7 +4674,6 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -5620,7 +4683,6 @@ "version": "2.0.1", "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -5630,7 +4692,6 @@ "version": "1.2.0", "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, "license": "ISC" }, "node_modules/shebang-command": { @@ -5673,7 +4734,6 @@ "version": "1.1.0", "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5693,7 +4753,6 @@ "version": "1.0.0", "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5710,7 +4769,6 @@ "version": "1.0.1", "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -5729,7 +4787,6 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -5758,16 +4815,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5781,7 +4828,6 @@ "version": "2.0.2", "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -5845,16 +4891,6 @@ "node": ">=8" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", @@ -5930,6 +4966,7 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "is-number": "^7.0.0" }, @@ -5941,7 +4978,6 @@ "version": "1.0.1", "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.6" @@ -5968,7 +5004,6 @@ "version": "1.6.18", "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -6005,21 +5040,10 @@ "dev": true, "license": "MIT" }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -6056,25 +5080,10 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmmirror.com/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -6091,7 +5100,6 @@ "version": "1.1.2", "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -6274,10 +5282,6 @@ "node": ">= 8" } }, - "node_modules/workcase-wechat": { - "resolved": "packages/workcase_wechat", - "link": true - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6315,13 +5319,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", @@ -6402,6 +5399,7 @@ "vue-router": "^4.5.0" }, "devDependencies": { + "@module-federation/vite": "^1.0.10", "@types/node": "^22.0.0", "@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue-jsx": "^4.1.1", @@ -6415,13 +5413,15 @@ "version": "1.0.0", "dependencies": { "@element-plus/icons-vue": "^2.3.2", + "cors": "^2.8.5", "element-plus": "^2.12.0", + "express": "^4.18.2", "ofetch": "^1.4.1", "vue": "^3.5.13", "vue-router": "^4.5.0" }, "devDependencies": { - "@originjs/vite-plugin-federation": "^1.3.6", + "@module-federation/vite": "^1.9.3", "@types/node": "^20.10.0", "@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue-jsx": "^4.1.1", @@ -6436,19 +5436,6 @@ "vue": "^3.5.13" } }, - "packages/shared/node_modules/@originjs/vite-plugin-federation": { - "version": "1.4.1", - "dev": true, - "license": "MulanPSL-2.0", - "dependencies": { - "estree-walker": "^3.0.2", - "magic-string": "^0.27.0" - }, - "engines": { - "node": ">=14.0.0", - "pnpm": ">=7.0.1" - } - }, "packages/shared/node_modules/@types/node": { "version": "20.19.25", "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.25.tgz", @@ -6781,14 +5768,6 @@ "node": ">=0.8.0" } }, - "packages/shared/node_modules/estree-walker": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "packages/shared/node_modules/for-each": { "version": "0.3.5", "dev": true, @@ -7261,17 +6240,6 @@ "node": ">=4" } }, - "packages/shared/node_modules/magic-string": { - "version": "0.27.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, "packages/shared/node_modules/memorystream": { "version": "0.3.1", "dev": true, @@ -7944,6 +6912,7 @@ "packages/workcase_wechat": { "name": "workcase-wechat", "version": "1.0.0", + "extraneous": true, "dependencies": { "vue": "^3.0.0" }, @@ -7952,177 +6921,6 @@ "@dcloudio/vite-plugin-uni": "latest", "vite": "latest" } - }, - "packages/workcase_wechat/node_modules/@dcloudio/vite-plugin-uni": { - "version": "3.0.0-alpha-3000020210521001", - "resolved": "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-alpha-3000020210521001.tgz", - "integrity": "sha512-wJn71UxgqH55aFEiw0NOGFbEIGpAdp3NPiSPhMTqtJMhZSkQkfN3KnLEWm+/CFBVlqA2TCmjehFeO9U3Z3JQKQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@rollup/pluginutils": "^4.1.0", - "autoprefixer": "^10.2.5", - "cac": "^6.7.3", - "chalk": "^4.1.1", - "debug": "^4.3.1", - "estree-walker": "^2.0.1", - "express": "^4.17.1", - "fs-extra": "^9.0.1", - "jsonc-parser": "^3.0.0", - "mime": "^2.5.2", - "module-alias": "^2.2.2", - "postcss-selector-parser": "^6.0.4", - "rollup-plugin-copy": "^3.4.0", - "slash": "^3.0.0" - }, - "bin": { - "uni": "bin/uni.js" - }, - "peerDependencies": { - "@vitejs/plugin-vue": "^1.2.2", - "@vue/compiler-sfc": "^3.1.0-beta.3", - "@vue/server-renderer": "^3.1.0-beta.3", - "@vue/shared": "^3.1.0-beta.3", - "vite": "^2.3.0" - } - }, - "packages/workcase_wechat/node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/workcase_wechat/node_modules/@vitejs/plugin-vue": { - "version": "1.10.2", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz", - "integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "vite": "^2.5.10" - } - }, - "packages/workcase_wechat/node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "packages/workcase_wechat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/workcase_wechat/node_modules/rollup": { - "version": "2.77.3", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.77.3.tgz", - "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", - "dev": true, - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "packages/workcase_wechat/node_modules/vite": { - "version": "2.9.18", - "resolved": "https://registry.npmmirror.com/vite/-/vite-2.9.18.tgz", - "integrity": "sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.14.27", - "postcss": "^8.4.13", - "resolve": "^1.22.0", - "rollup": ">=2.59.0 <2.78.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": ">=12.2.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "less": "*", - "sass": "*", - "stylus": "*" - }, - "peerDependenciesMeta": { - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - } - } } } } diff --git a/urbanLifelineWeb/packages/bidding/vite.config.ts b/urbanLifelineWeb/packages/bidding/vite.config.ts index cf436296..9097c969 100644 --- a/urbanLifelineWeb/packages/bidding/vite.config.ts +++ b/urbanLifelineWeb/packages/bidding/vite.config.ts @@ -8,7 +8,21 @@ const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) export default defineConfig({ - plugins: [vue(), vueJsx()], + plugins: [ + vue({ + script: { + defineModel: true, + propsDestructure: true + } + }), + vueJsx() + ], + + define: { + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: true, + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true + }, resolve: { alias: { diff --git a/urbanLifelineWeb/packages/platform/.__mf__temp/platform/localSharedImportMap.js b/urbanLifelineWeb/packages/platform/.__mf__temp/platform/localSharedImportMap.js new file mode 100644 index 00000000..f8c1e80b --- /dev/null +++ b/urbanLifelineWeb/packages/platform/.__mf__temp/platform/localSharedImportMap.js @@ -0,0 +1,130 @@ + +// Windows temporarily needs this file, https://github.com/module-federation/vite/issues/68 + + import {loadShare} from "@module-federation/runtime"; + const importMap = { + + "element-plus": async () => { + let pkg = await import("__mf__virtual/platform__prebuild__element_mf_2_plus__prebuild__.js"); + return pkg; + } + , + "vue": async () => { + let pkg = await import("__mf__virtual/platform__prebuild__vue__prebuild__.js"); + return pkg; + } + , + "vue-router": async () => { + let pkg = await import("__mf__virtual/platform__prebuild__vue_mf_2_router__prebuild__.js"); + return pkg; + } + + } + const usedShared = { + + "element-plus": { + name: "element-plus", + version: "2.12.0", + scope: ["default"], + loaded: false, + from: "platform", + async get () { + if (false) { + throw new Error(`Shared module '${"element-plus"}' must be provided by host`); + } + usedShared["element-plus"].loaded = true + const {"element-plus": pkgDynamicImport} = importMap + const res = await pkgDynamicImport() + const exportModule = {...res} + // All npm packages pre-built by vite will be converted to esm + Object.defineProperty(exportModule, "__esModule", { + value: true, + enumerable: false + }) + return function () { + return exportModule + } + }, + shareConfig: { + singleton: false, + requiredVersion: "^2.12.0", + + } + } + , + "vue": { + name: "vue", + version: "3.5.25", + scope: ["default"], + loaded: false, + from: "platform", + async get () { + if (false) { + throw new Error(`Shared module '${"vue"}' must be provided by host`); + } + usedShared["vue"].loaded = true + const {"vue": pkgDynamicImport} = importMap + const res = await pkgDynamicImport() + const exportModule = {...res} + // All npm packages pre-built by vite will be converted to esm + Object.defineProperty(exportModule, "__esModule", { + value: true, + enumerable: false + }) + return function () { + return exportModule + } + }, + shareConfig: { + singleton: false, + requiredVersion: "^3.5.25", + + } + } + , + "vue-router": { + name: "vue-router", + version: "4.6.3", + scope: ["default"], + loaded: false, + from: "platform", + async get () { + if (false) { + throw new Error(`Shared module '${"vue-router"}' must be provided by host`); + } + usedShared["vue-router"].loaded = true + const {"vue-router": pkgDynamicImport} = importMap + const res = await pkgDynamicImport() + const exportModule = {...res} + // All npm packages pre-built by vite will be converted to esm + Object.defineProperty(exportModule, "__esModule", { + value: true, + enumerable: false + }) + return function () { + return exportModule + } + }, + shareConfig: { + singleton: false, + requiredVersion: "^4.6.3", + + } + } + + } + const usedRemotes = [ + { + entryGlobalName: "http://localhost:5000/remoteEntry.js", + name: "shared", + type: "var", + entry: "http://localhost:5000/remoteEntry.js", + shareScope: "default", + } + + ] + export { + usedShared, + usedRemotes + } + \ No newline at end of file diff --git a/urbanLifelineWeb/packages/platform/.env.example b/urbanLifelineWeb/packages/platform/.env.example new file mode 100644 index 00000000..7f7cbc86 --- /dev/null +++ b/urbanLifelineWeb/packages/platform/.env.example @@ -0,0 +1,9 @@ +# Platform 应用环境变量示例 +# 复制此文件为 .env.local 或 .env.production 使用 + +# API 基础地址(Gateway 地址) +VITE_API_BASE_URL=http://localhost:8180 + +# AES 加密密钥(可选,默认使用配置文件中的密钥) +# 生产环境建议通过环境变量配置 +# VUE_APP_AES_SECRET_KEY=1234567890qwer diff --git a/urbanLifelineWeb/packages/platform/index.html b/urbanLifelineWeb/packages/platform/index.html index ea947660..7c36ba4d 100644 --- a/urbanLifelineWeb/packages/platform/index.html +++ b/urbanLifelineWeb/packages/platform/index.html @@ -9,22 +9,8 @@ - - - - - - + +
diff --git a/urbanLifelineWeb/packages/platform/package.json b/urbanLifelineWeb/packages/platform/package.json index 2bc8f391..e7d3f995 100644 --- a/urbanLifelineWeb/packages/platform/package.json +++ b/urbanLifelineWeb/packages/platform/package.json @@ -21,6 +21,7 @@ "@types/node": "^22.0.0", "@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue-jsx": "^4.1.1", + "@module-federation/vite": "^1.9.3", "typescript": "^5.7.2", "vite": "^6.0.3", "vue-tsc": "^2.2.0" diff --git a/urbanLifelineWeb/packages/platform/pnpm-lock.yaml b/urbanLifelineWeb/packages/platform/pnpm-lock.yaml index 6b03b240..5a1c1253 100644 --- a/urbanLifelineWeb/packages/platform/pnpm-lock.yaml +++ b/urbanLifelineWeb/packages/platform/pnpm-lock.yaml @@ -28,6 +28,9 @@ dependencies: version: 4.6.3(vue@3.5.25) devDependencies: + '@module-federation/vite': + specifier: ^1.9.3 + version: 1.9.3 '@types/node': specifier: ^22.0.0 version: 22.19.1 @@ -596,10 +599,61 @@ packages: '@jridgewell/sourcemap-codec': 1.5.5 dev: true + /@module-federation/error-codes@0.21.6: + resolution: {integrity: sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==} + dev: true + + /@module-federation/runtime-core@0.21.6: + resolution: {integrity: sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==} + dependencies: + '@module-federation/error-codes': 0.21.6 + '@module-federation/sdk': 0.21.6 + dev: true + + /@module-federation/runtime@0.21.6: + resolution: {integrity: sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==} + dependencies: + '@module-federation/error-codes': 0.21.6 + '@module-federation/runtime-core': 0.21.6 + '@module-federation/sdk': 0.21.6 + dev: true + + /@module-federation/sdk@0.21.6: + resolution: {integrity: sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==} + dev: true + + /@module-federation/vite@1.9.3: + resolution: {integrity: sha512-MV6XI3FX6okEMJ7FdmvFmYuu7DygRoLljKT8atrBwFhlttsgBbswpqMj4P4Fs/X+pFmbIi/ntFzVhsrG0qQnGQ==} + dependencies: + '@module-federation/runtime': 0.21.6 + '@module-federation/sdk': 0.21.6 + '@rollup/pluginutils': 5.3.0 + defu: 6.1.4 + estree-walker: 2.0.2 + magic-string: 0.30.21 + pathe: 1.1.2 + transitivePeerDependencies: + - rollup + dev: true + /@rolldown/pluginutils@1.0.0-beta.53: resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} dev: true + /@rollup/pluginutils@5.3.0: + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + dev: true + /@rollup/rollup-android-arm-eabi@4.53.3: resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] @@ -1146,6 +1200,10 @@ packages: ms: 2.1.3 dev: true + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: true + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1464,6 +1522,10 @@ packages: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} diff --git a/urbanLifelineWeb/packages/platform/public/avatar.svg b/urbanLifelineWeb/packages/platform/public/avatar.svg new file mode 100644 index 00000000..b537ce1d --- /dev/null +++ b/urbanLifelineWeb/packages/platform/public/avatar.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/urbanLifelineWeb/packages/platform/public/favicon.svg b/urbanLifelineWeb/packages/platform/public/favicon.svg new file mode 100644 index 00000000..0064d6fc --- /dev/null +++ b/urbanLifelineWeb/packages/platform/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/urbanLifelineWeb/packages/platform/public/logo.jpg b/urbanLifelineWeb/packages/platform/public/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18b5da66cc063dfe01fb3d76330d033153403f40 GIT binary patch literal 33240 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 + + + + + + diff --git a/urbanLifelineWeb/packages/platform/src/config/README.md b/urbanLifelineWeb/packages/platform/src/config/README.md new file mode 100644 index 00000000..41b691da --- /dev/null +++ b/urbanLifelineWeb/packages/platform/src/config/README.md @@ -0,0 +1,254 @@ +# Platform 应用配置说明 + +## AES 加密配置 + +### 密钥配置 + +**配置文件**:`src/config/index.ts` + +```typescript +export const AES_SECRET_KEY = '1234567890qwer' +``` + +**注意事项**: +1. ✅ 密钥已配置为 `1234567890qwer`,与后端保持一致 +2. ⚠️ 该密钥与后端 `application.yml` 中的 `security.aes.secret-key` 必须相同 +3. 🔒 生产环境应从环境变量或配置中心获取,不要硬编码 + +### 对应后端配置 + +**Gateway** (`gateway/src/main/resources/application.yml`): +```yaml +security: + aes: + secret-key: 1234567890qwer +``` + +**Auth Service** (`auth/src/main/resources/application.yml`): +```yaml +security: + aes: + secret-key: 1234567890qwer +``` + +## 使用示例 + +### 1. 登录时加密密码 + +```typescript +import { authAPI } from '@shared/api/auth' +import { getAesInstance } from '@shared/utils' + +async function handleLogin(username: string, password: string) { + try { + // 1. 获取 AES 加密实例 + const aes = getAesInstance() + + // 2. 加密密码 + const encryptedPassword = await aes.encryptPassword(password) + + // 3. 发送登录请求 + const response = await authAPI.login({ + username, + password: encryptedPassword, // 使用加密后的密码 + loginType: 'password' + }) + + if (response.data.success) { + console.log('登录成功') + // 保存 token 等操作 + } + } catch (error) { + console.error('登录失败:', error) + } +} +``` + +### 2. 注册时加密手机号和密码 + +```typescript +import { authAPI } from '@shared/api/auth' +import { getAesInstance } from '@shared/utils' + +async function handleRegister(phone: string, password: string, smsCode: string, sessionId: string) { + try { + const aes = getAesInstance() + + // 加密敏感信息 + const encryptedPhone = await aes.encryptPhone(phone) + const encryptedPassword = await aes.encryptPassword(password) + + // 发送注册请求 + const response = await authAPI.register({ + registerType: 'phone', + phone: encryptedPhone, + password: encryptedPassword, + confirmPassword: encryptedPassword, + smsCode, + smsSessionId: sessionId + }) + + if (response.data.success) { + console.log('注册成功') + } + } catch (error) { + console.error('注册失败:', error) + } +} +``` + +### 3. 数据脱敏显示 + +```typescript +import { AesUtils } from '@shared/utils' + +// 显示脱敏手机号 +const phone = '13812345678' +const maskedPhone = AesUtils.maskPhone(phone) +console.log(maskedPhone) // 输出:138****5678 + +// 显示脱敏身份证号 +const idCard = '110101199001011234' +const maskedIdCard = AesUtils.maskIdCard(idCard) +console.log(maskedIdCard) // 输出:110101********1234 +``` + +## 初始化流程 + +### 应用启动时自动初始化 + +**文件**:`src/main.ts` + +```typescript +import { AES_SECRET_KEY } from './config' +import { initAesEncrypt } from '@shared/utils' + +async function initApp() { + // 初始化 AES 加密工具 + await initAesEncrypt(AES_SECRET_KEY) + + // ... 其他初始化操作 +} + +initApp() +``` + +### 初始化状态检查 + +```typescript +import { getAesInstance } from '@shared/utils' + +try { + const aes = getAesInstance() + console.log('✅ AES 加密工具已初始化') +} catch (error) { + console.error('❌ AES 加密工具未初始化:', error) +} +``` + +## 加密流程图 + +``` +用户输入密码 + ↓ +前端 AES 加密 (1234567890qwer) + ↓ +发送加密后的密码 + ↓ +Gateway (不解密,直接转发) + ↓ +Auth Service 接收 + ↓ +AES 解密 (1234567890qwer) + ↓ +BCrypt 再次加密 + ↓ +存入数据库 +``` + +## 安全建议 + +### 开发环境 +- ✅ 使用固定密钥 `1234567890qwer` +- ✅ 密钥在代码中配置 + +### 生产环境 +- 🔒 从环境变量获取密钥 +- 🔒 使用配置中心(Nacos) +- 🔒 定期轮换密钥 +- 🔒 密钥长度至少 32 字符 + +### 示例:从环境变量获取 + +```typescript +// 生产环境配置 +export const AES_SECRET_KEY = process.env.VUE_APP_AES_SECRET_KEY || '1234567890qwer' +``` + +## 故障排查 + +### 问题:登录时提示"密码错误" + +**可能原因**:前后端密钥不一致 + +**排查步骤**: +1. 检查前端配置:`src/config/index.ts` 中的 `AES_SECRET_KEY` +2. 检查后端配置:`application.yml` 中的 `security.aes.secret-key` +3. 确保两者完全一致 + +**解决方案**: +```bash +# 前端 +export const AES_SECRET_KEY = '1234567890qwer' + +# 后端 +security: + aes: + secret-key: 1234567890qwer +``` + +### 问题:"AES 加密工具未初始化" + +**原因**:`initAesEncrypt()` 未被调用 + +**解决**:检查 `main.ts` 中是否正确调用初始化函数 + +### 问题:加密后的数据无法解密 + +**可能原因**: +1. 密钥不正确 +2. 数据被篡改 +3. Base64 编码问题 + +**调试方法**: +```typescript +const aes = getAesInstance() +const original = 'test123' +const encrypted = await aes.encrypt(original) +const decrypted = await aes.decrypt(encrypted) +console.log(original === decrypted) // 应该输出 true +``` + +## API 参考 + +### 配置项 + +| 配置项 | 类型 | 默认值 | 说明 | +|--------|------|--------|------| +| `AES_SECRET_KEY` | `string` | `'1234567890qwer'` | AES 加密密钥 | +| `API_BASE_URL` | `string` | `'http://localhost:8180'` | API 基础地址 | +| `APP_CONFIG.name` | `string` | `'泰豪电源 AI 数智化平台'` | 应用名称 | +| `APP_CONFIG.version` | `string` | `'1.0.0'` | 应用版本 | + +### 环境变量 + +| 变量名 | 说明 | 示例 | +|--------|------|------| +| `VITE_API_BASE_URL` | API 基础地址 | `https://api.example.com` | +| `VUE_APP_AES_SECRET_KEY` | AES 密钥(生产) | `your-secret-key-32-chars-long` | + +## 更多信息 + +- AES 加密工具详细文档:`@shared/utils/crypto/README.md` +- Auth API 文档:`@shared/api/auth/auth.ts` +- 后端 AES 实现:`urbanLifelineServ/common/common-utils/src/main/java/org/xyzh/common/utils/crypto/AesEncryptUtil.java` diff --git a/urbanLifelineWeb/packages/platform/src/config/index.ts b/urbanLifelineWeb/packages/platform/src/config/index.ts new file mode 100644 index 00000000..49490d2f --- /dev/null +++ b/urbanLifelineWeb/packages/platform/src/config/index.ts @@ -0,0 +1,24 @@ +/** + * Platform 应用配置 + */ + +/** + * AES 加密密钥(与后端保持一致) + * 对应后端配置:security.aes.secret-key + * Base64 编码的 32 字节密钥(256 位) + */ +export const AES_SECRET_KEY = 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=' // Base64 编码,解码后是 "12345678901234567890123456789012" (32字节) + +/** + * API 基础地址 + */ +export const API_BASE_URL = (import.meta as any).env?.VITE_API_BASE_URL || 'http://localhost:8180' + +/** + * 应用配置 + */ +export const APP_CONFIG = { + name: '泰豪电源 AI 数智化平台', + version: '1.0.0', + copyright: '泰豪电源' +} diff --git a/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/README.md b/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/README.md new file mode 100644 index 00000000..c05051ff --- /dev/null +++ b/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/README.md @@ -0,0 +1,214 @@ +# SidebarLayout 侧边栏布局组件 + +## 功能特性 + +### 🎯 核心功能 +- **侧边栏菜单导航**:左侧固定侧边栏,支持折叠/展开 +- **双模式内容区**: + - **路由模式**:普通路由页面渲染 + - **iframe 模式**:嵌入外部应用(招标助手、泰豪小电、智能体编排) +- **用户信息展示**:底部用户头像和下拉菜单 +- **响应式设计**:支持移动端适配 + +### 📱 菜单配置 + +```typescript +const menuItems: MenuItem[] = [ + { + key: 'home', + label: '工作台', + icon: 'Grid', + path: '/home', + type: 'route' + }, + { + key: 'bidding', + label: '招标助手', + icon: 'Document', + iframeUrl: 'http://localhost:5002', + type: 'iframe' + }, + { + key: 'service', + label: '泰豪小电', + icon: 'Service', + iframeUrl: 'http://localhost:5003', + type: 'iframe' + }, + { + key: 'workflow', + label: '智能体编排', + icon: 'Connection', + iframeUrl: 'http://localhost:3000', // Dify 地址 + type: 'iframe' + } +] +``` + +## 使用方式 + +### 在路由中使用 + +```typescript +// router/index.ts +import { SidebarLayout } from '@/layouts' + +const routes = [ + { + path: '/', + component: SidebarLayout, + children: [ + { + path: '/home', + component: () => import('@/views/Home.vue') + }, + { + path: '/chat', + component: () => import('@/views/Chat.vue') + } + ] + } +] +``` + +### 在 App.vue 中使用 + +```vue + + + +``` + +## 菜单项类型 + +```typescript +interface MenuItem { + key: string // 唯一标识 + label: string // 显示名称 + icon: string // Element Plus 图标组件名 + path?: string // 路由路径(route 类型必需) + iframeUrl?: string // iframe URL(iframe 类型必需) + type: 'route' | 'iframe' // 菜单类型 +} +``` + +## iframe 应用说明 + +### 1. 招标助手 (Bidding) +- **端口**:5002 +- **URL**:http://localhost:5002 +- **说明**:招投标业务管理系统 + +### 2. 泰豪小电 (Service) +- **端口**:5003 +- **URL**:http://localhost:5003 +- **说明**:智能客服工单管理系统 + +### 3. 智能体编排 (Workflow) +- **端口**:3000 +- **URL**:http://localhost:3000 +- **说明**:Dify 智能体编排界面 + +## 样式自定义 + +### 主题色调整 + +```scss +// 修改侧边栏背景色 +.sidebar { + background: #F0EAF4; // 当前淡紫色背景 +} + +// 修改激活项颜色 +.nav-item.active { + background: rgba(124, 58, 237, 0.15); + color: #7c3aed; +} +``` + +### 侧边栏宽度 + +```scss +.sidebar { + width: 220px; // 展开宽度 + + &.collapsed { + width: 64px; // 折叠宽度 + } +} +``` + +## 功能说明 + +### 侧边栏折叠 +- 点击头部箭头图标可切换折叠/展开状态 +- 折叠后只显示图标,展开后显示图标+文字 + +### iframe 加载 +- 自动显示加载中状态 +- 支持刷新按钮重新加载 +- 显示当前应用标题 + +### 用户操作 +- **个人中心**:跳转到 /profile +- **系统设置**:跳转到 /settings +- **退出登录**:跳转到 /login + +## 注意事项 + +1. **跨域问题**:确保 iframe 应用允许被嵌入 + ```nginx + # nginx 配置 + add_header X-Frame-Options "SAMEORIGIN"; + # 或者 + add_header Content-Security-Policy "frame-ancestors 'self' http://localhost:5001"; + ``` + +2. **端口配置**:确保对应服务已启动 + - platform: 5001 + - bidding: 5002 + - workcase: 5003 + - dify: 3000 + +3. **路由同步**:iframe 模式不会改变浏览器 URL + +4. **通信机制**:如需与 iframe 通信,使用 postMessage API + +## 扩展建议 + +### 添加新菜单项 + +```typescript +// 在 menuItems 数组中添加 +{ + key: 'new-app', + label: '新应用', + icon: 'Plus', + iframeUrl: 'http://localhost:5004', + type: 'iframe' +} +``` + +### 动态菜单加载 + +```typescript +// 从 API 获取菜单配置 +const loadMenus = async () => { + const response = await fetch('/api/menus') + menuItems.value = await response.json() +} +``` + +### 权限控制 + +```typescript +const menuItems = computed(() => { + return allMenuItems.filter(item => + hasPermission(item.key) + ) +}) +``` diff --git a/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.scss b/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.scss new file mode 100644 index 00000000..c3a40ef7 --- /dev/null +++ b/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.scss @@ -0,0 +1,264 @@ +.sidebar-layout { + display: flex; + width: 100%; + height: 100vh; + overflow: hidden; +} + +// ==================== 侧边栏 ==================== +.sidebar { + width: 220px; + height: 100%; + background: #F0EAF4; + display: flex; + flex-direction: column; + color: #333; + flex-shrink: 0; + transition: width 0.3s ease; + border-right: 1px solid rgba(0, 0, 0, 0.08); + + &.collapsed { + width: 64px; + + .sidebar-header { + padding: 16px 12px; + justify-content: center; + + .logo { + justify-content: center; + } + + .collapse-btn { + position: static; + margin-left: 0; + } + } + + .nav-item { + justify-content: center; + padding: 12px; + } + + .user-section { + justify-content: center; + padding: 16px 12px; + } + } +} + +// 侧边栏头部 +.sidebar-header { + padding: 16px 20px; + border-bottom: 1px solid rgba(0, 0, 0, 0.08); + display: flex; + align-items: center; + justify-content: space-between; +} + +.collapse-btn { + width: 28px; + height: 28px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 6px; + cursor: pointer; + color: #888; + transition: all 0.2s; + + &:hover { + background: rgba(124, 58, 237, 0.1); + color: #7c3aed; + } +} + +.logo { + display: flex; + align-items: center; + gap: 10px; + + .logo-img { + width: 40px; + height: 40px; + border-radius: 6px; + object-fit: contain; + background: #fff; + padding: 2px; + } + + .logo-text { + font-size: 16px; + font-weight: 600; + color: #333; + } +} + +// 导航菜单 +.nav-menu { + flex: 1; + overflow-y: auto; + padding: 12px 0; + + &::-webkit-scrollbar { + width: 4px; + } + + &::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.2); + border-radius: 4px; + } +} + +.nav-section { + padding: 8px 0; +} + +.nav-item { + display: flex; + align-items: center; + gap: 12px; + padding: 14px 20px; + margin-bottom: 4px; + cursor: pointer; + transition: all 0.2s ease; + color: #555; + font-size: 14px; + + &:hover { + background: rgba(124, 58, 237, 0.1); + color: #7c3aed; + } + + &.active { + background: rgba(124, 58, 237, 0.15); + color: #7c3aed; + font-weight: 500; + } + + .el-icon { + font-size: 18px; + flex-shrink: 0; + } + + span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +// 用户信息 +.user-section { + padding: 16px 20px; + border-top: 1px solid rgba(0, 0, 0, 0.08); + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: rgba(124, 58, 237, 0.05); + } + + .user-info-wrapper { + display: flex; + align-items: center; + gap: 12px; + } + + .user-avatar { + flex-shrink: 0; + } + + .user-name { + font-size: 14px; + font-weight: 500; + color: #333; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +// ==================== 主内容区 ==================== +.main-content { + flex: 1; + height: 100%; + overflow: hidden; + background: #fff; + position: relative; +} + +// iframe 容器 +.iframe-container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + position: relative; +} + +.iframe-header { + height: 56px; + padding: 0 24px; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid #e5e7eb; + background: #fafafa; + flex-shrink: 0; +} + +.iframe-title { + font-size: 16px; + font-weight: 600; + color: #333; +} + +.content-iframe { + flex: 1; + width: 100%; + height: 100%; + border: none; + background: #fff; +} + +.iframe-loading { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + color: #7c3aed; + font-size: 14px; + z-index: 10; + + .el-icon { + font-size: 32px; + } +} + +// ==================== 响应式 ==================== +@media (max-width: 768px) { + .sidebar { + width: 64px; + + &:not(.collapsed) { + width: 220px; + position: fixed; + left: 0; + top: 0; + z-index: 1000; + box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); + } + } + + .iframe-header { + padding: 0 16px; + + .iframe-title { + font-size: 14px; + } + } +} diff --git a/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.vue b/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.vue new file mode 100644 index 00000000..ce24499a --- /dev/null +++ b/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.vue @@ -0,0 +1,248 @@ +