From 2f099710cab59e7e3366f199a8abdecb032fde11 Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Sat, 21 Dec 2024 23:27:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/im-admin.sql | 229 +-- im-admin-ui/.env.development | 14 +- im-admin-ui/bin/build.bat | 12 - im-admin-ui/bin/package.bat | 12 - im-admin-ui/bin/run-web.bat | 12 - im-admin-ui/package.json | 12 +- im-admin-ui/public/favicon.ico | Bin 8131 -> 34383 bytes im-admin-ui/src/api/demo/demo/index.ts | 62 - im-admin-ui/src/api/demo/demo/types.ts | 90 -- im-admin-ui/src/api/demo/tree/index.ts | 62 - im-admin-ui/src/api/demo/tree/types.ts | 80 -- .../src/api/workflow/category/index.ts | 63 - .../src/api/workflow/category/types.ts | 67 - .../api/workflow/definitionConfig/index.ts | 49 - .../api/workflow/definitionConfig/types.ts | 102 -- .../src/api/workflow/formManage/index.ts | 76 - .../src/api/workflow/formManage/types.ts | 69 - im-admin-ui/src/api/workflow/leave/index.ts | 63 - im-admin-ui/src/api/workflow/leave/types.ts | 24 - im-admin-ui/src/api/workflow/model/index.ts | 104 -- im-admin-ui/src/api/workflow/model/types.ts | 66 - .../src/api/workflow/nodeConfig/types.ts | 38 - .../api/workflow/processDefinition/index.ts | 114 -- .../api/workflow/processDefinition/types.ts | 24 - .../src/api/workflow/processInstance/index.ts | 136 -- .../src/api/workflow/processInstance/types.ts | 27 - im-admin-ui/src/api/workflow/task/index.ts | 264 ---- im-admin-ui/src/api/workflow/task/types.ts | 49 - .../src/api/workflow/workflowCommon/index.ts | 29 - .../src/api/workflow/workflowCommon/types.ts | 16 - im-admin-ui/src/assets/logo/logo.png | Bin 8131 -> 34383 bytes im-admin-ui/src/bpmn/assets/defaultXML.ts | 23 - im-admin-ui/src/bpmn/assets/lang/zh.ts | 126 -- .../src/bpmn/assets/moddle/flowable.ts | 1250 ----------------- .../ContextPad/CustomContextPadProvider.ts | 138 -- .../module/Palette/CustomPaletteProvider.ts | 109 -- .../assets/module/Renderer/CustomRenderer.ts | 56 - .../src/bpmn/assets/module/Translate/index.ts | 15 - im-admin-ui/src/bpmn/assets/module/index.ts | 17 - im-admin-ui/src/bpmn/assets/showConfig.ts | 50 - im-admin-ui/src/bpmn/assets/style/index.scss | 284 ---- im-admin-ui/src/bpmn/hooks/usePanel.ts | 145 -- im-admin-ui/src/bpmn/hooks/useParseElement.ts | 34 - im-admin-ui/src/bpmn/index.vue | 496 ------- im-admin-ui/src/bpmn/panel/GatewayPanel.vue | 68 - .../src/bpmn/panel/ParticipantPanel.vue | 68 - im-admin-ui/src/bpmn/panel/ProcessPanel.vue | 71 - .../src/bpmn/panel/SequenceFlowPanel.vue | 95 -- im-admin-ui/src/bpmn/panel/StartEndPanel.vue | 67 - .../src/bpmn/panel/SubProcessPanel.vue | 193 --- im-admin-ui/src/bpmn/panel/TaskPanel.vue | 491 ------- im-admin-ui/src/bpmn/panel/index.vue | 110 -- .../src/bpmn/panel/property/DueDate.vue | 252 ---- .../bpmn/panel/property/ExecutionListener.vue | 308 ---- .../src/bpmn/panel/property/ListenerParam.vue | 121 -- .../src/bpmn/panel/property/TaskListener.vue | 310 ---- .../src/components/BpmnDesign/index.vue | 71 - im-admin-ui/src/components/BpmnView/index.vue | 411 ------ im-admin-ui/src/components/RuoYiDoc/index.vue | 13 - im-admin-ui/src/components/RuoYiGit/index.vue | 13 - im-admin-ui/src/layout/components/Navbar.vue | 8 - im-admin-ui/src/router/index.ts | 14 - im-admin-ui/src/views/demo/demo/index.vue | 254 ---- im-admin-ui/src/views/demo/tree/index.vue | 258 ---- im-admin-ui/src/views/login.vue | 38 +- im-admin-ui/src/views/monitor/admin/index.vue | 9 - .../src/views/monitor/snailjob/index.vue | 9 - .../src/views/workflow/category/index.vue | 263 ---- .../src/views/workflow/formManage/index.vue | 243 ---- .../src/views/workflow/leave/index.vue | 242 ---- .../src/views/workflow/leave/leaveEdit.vue | 252 ---- .../src/views/workflow/model/index.vue | 383 ----- .../components/processPreview.vue | 45 - .../workflow/processDefinition/index.vue | 517 ------- .../views/workflow/processInstance/index.vue | 364 ----- .../views/workflow/task/allTaskWaiting.vue | 286 ---- .../src/views/workflow/task/myDocument.vue | 255 ---- .../src/views/workflow/task/taskCopyList.vue | 150 -- .../src/views/workflow/task/taskFinish.vue | 136 -- .../src/views/workflow/task/taskWaiting.vue | 149 -- im-admin-ui/vite.config.ts | 2 +- im-admin/.editorconfig | 18 - im-admin/.gitignore | 48 - im-admin/README.md | 182 --- im-admin/pom.xml | 26 - .../java/org/dromara/DromaraApplication.java | 23 - .../dromara/DromaraServletInitializer.java | 18 - .../src/main/resources/application.yml | 15 +- 88 files changed, 14 insertions(+), 11563 deletions(-) delete mode 100644 im-admin-ui/bin/build.bat delete mode 100644 im-admin-ui/bin/package.bat delete mode 100644 im-admin-ui/bin/run-web.bat delete mode 100644 im-admin-ui/src/api/demo/demo/index.ts delete mode 100644 im-admin-ui/src/api/demo/demo/types.ts delete mode 100644 im-admin-ui/src/api/demo/tree/index.ts delete mode 100644 im-admin-ui/src/api/demo/tree/types.ts delete mode 100644 im-admin-ui/src/api/workflow/category/index.ts delete mode 100644 im-admin-ui/src/api/workflow/category/types.ts delete mode 100644 im-admin-ui/src/api/workflow/definitionConfig/index.ts delete mode 100644 im-admin-ui/src/api/workflow/definitionConfig/types.ts delete mode 100644 im-admin-ui/src/api/workflow/formManage/index.ts delete mode 100644 im-admin-ui/src/api/workflow/formManage/types.ts delete mode 100644 im-admin-ui/src/api/workflow/leave/index.ts delete mode 100644 im-admin-ui/src/api/workflow/leave/types.ts delete mode 100644 im-admin-ui/src/api/workflow/model/index.ts delete mode 100644 im-admin-ui/src/api/workflow/model/types.ts delete mode 100644 im-admin-ui/src/api/workflow/nodeConfig/types.ts delete mode 100644 im-admin-ui/src/api/workflow/processDefinition/index.ts delete mode 100644 im-admin-ui/src/api/workflow/processDefinition/types.ts delete mode 100644 im-admin-ui/src/api/workflow/processInstance/index.ts delete mode 100644 im-admin-ui/src/api/workflow/processInstance/types.ts delete mode 100644 im-admin-ui/src/api/workflow/task/index.ts delete mode 100644 im-admin-ui/src/api/workflow/task/types.ts delete mode 100644 im-admin-ui/src/api/workflow/workflowCommon/index.ts delete mode 100644 im-admin-ui/src/api/workflow/workflowCommon/types.ts delete mode 100644 im-admin-ui/src/bpmn/assets/defaultXML.ts delete mode 100644 im-admin-ui/src/bpmn/assets/lang/zh.ts delete mode 100644 im-admin-ui/src/bpmn/assets/moddle/flowable.ts delete mode 100644 im-admin-ui/src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts delete mode 100644 im-admin-ui/src/bpmn/assets/module/Palette/CustomPaletteProvider.ts delete mode 100644 im-admin-ui/src/bpmn/assets/module/Renderer/CustomRenderer.ts delete mode 100644 im-admin-ui/src/bpmn/assets/module/Translate/index.ts delete mode 100644 im-admin-ui/src/bpmn/assets/module/index.ts delete mode 100644 im-admin-ui/src/bpmn/assets/showConfig.ts delete mode 100644 im-admin-ui/src/bpmn/assets/style/index.scss delete mode 100644 im-admin-ui/src/bpmn/hooks/usePanel.ts delete mode 100644 im-admin-ui/src/bpmn/hooks/useParseElement.ts delete mode 100644 im-admin-ui/src/bpmn/index.vue delete mode 100644 im-admin-ui/src/bpmn/panel/GatewayPanel.vue delete mode 100644 im-admin-ui/src/bpmn/panel/ParticipantPanel.vue delete mode 100644 im-admin-ui/src/bpmn/panel/ProcessPanel.vue delete mode 100644 im-admin-ui/src/bpmn/panel/SequenceFlowPanel.vue delete mode 100644 im-admin-ui/src/bpmn/panel/StartEndPanel.vue delete mode 100644 im-admin-ui/src/bpmn/panel/SubProcessPanel.vue delete mode 100644 im-admin-ui/src/bpmn/panel/TaskPanel.vue delete mode 100644 im-admin-ui/src/bpmn/panel/index.vue delete mode 100644 im-admin-ui/src/bpmn/panel/property/DueDate.vue delete mode 100644 im-admin-ui/src/bpmn/panel/property/ExecutionListener.vue delete mode 100644 im-admin-ui/src/bpmn/panel/property/ListenerParam.vue delete mode 100644 im-admin-ui/src/bpmn/panel/property/TaskListener.vue delete mode 100644 im-admin-ui/src/components/BpmnDesign/index.vue delete mode 100644 im-admin-ui/src/components/BpmnView/index.vue delete mode 100644 im-admin-ui/src/components/RuoYiDoc/index.vue delete mode 100644 im-admin-ui/src/components/RuoYiGit/index.vue delete mode 100644 im-admin-ui/src/views/demo/demo/index.vue delete mode 100644 im-admin-ui/src/views/demo/tree/index.vue delete mode 100644 im-admin-ui/src/views/monitor/admin/index.vue delete mode 100644 im-admin-ui/src/views/monitor/snailjob/index.vue delete mode 100644 im-admin-ui/src/views/workflow/category/index.vue delete mode 100644 im-admin-ui/src/views/workflow/formManage/index.vue delete mode 100644 im-admin-ui/src/views/workflow/leave/index.vue delete mode 100644 im-admin-ui/src/views/workflow/leave/leaveEdit.vue delete mode 100644 im-admin-ui/src/views/workflow/model/index.vue delete mode 100644 im-admin-ui/src/views/workflow/processDefinition/components/processPreview.vue delete mode 100644 im-admin-ui/src/views/workflow/processDefinition/index.vue delete mode 100644 im-admin-ui/src/views/workflow/processInstance/index.vue delete mode 100644 im-admin-ui/src/views/workflow/task/allTaskWaiting.vue delete mode 100644 im-admin-ui/src/views/workflow/task/myDocument.vue delete mode 100644 im-admin-ui/src/views/workflow/task/taskCopyList.vue delete mode 100644 im-admin-ui/src/views/workflow/task/taskFinish.vue delete mode 100644 im-admin-ui/src/views/workflow/task/taskWaiting.vue delete mode 100644 im-admin/.editorconfig delete mode 100644 im-admin/.gitignore delete mode 100644 im-admin/README.md delete mode 100644 im-admin/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java delete mode 100644 im-admin/ruoyi-admin/src/main/java/org/dromara/DromaraServletInitializer.java diff --git a/db/im-admin.sql b/db/im-admin.sql index 3e3562d..f12bf90 100644 --- a/db/im-admin.sql +++ b/db/im-admin.sql @@ -65,13 +65,6 @@ create table sys_tenant ) engine=innodb comment = '租户表'; --- ---------------------------- --- 初始化-租户表数据 --- ---------------------------- - -insert into sys_tenant values(1, '000000', '管理组', '15888888888', 'XXX有限公司', null, null, '多租户通用后台管理管理系统', null, null, null, null, -1, '0', '0', 103, 1, sysdate(), null, null); - - -- ---------------------------- -- 租户套餐表 -- ---------------------------- @@ -121,16 +114,7 @@ create table sys_dept ( -- ---------------------------- -insert into sys_dept values(100, '000000', 0, '0', 'XXX科技', null,0, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(101, '000000', 100, '0,100', '深圳总公司', null,1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(102, '000000', 100, '0,100', '长沙分公司', null,2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(103, '000000', 101, '0,100,101', '研发部门', null,1, 1, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(104, '000000', 101, '0,100,101', '市场部门', null,2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(105, '000000', 101, '0,100,101', '测试部门', null,3, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(106, '000000', 101, '0,100,101', '财务部门', null,4, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(107, '000000', 101, '0,100,101', '运维部门', null,5, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(108, '000000', 102, '0,100,102', '市场部门', null,1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -insert into sys_dept values(109, '000000', 102, '0,100,102', '财务部门', null,2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys_dept values(100, '000000', 0, '0', '盒子科技', null,0, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); -- ---------------------------- @@ -164,9 +148,7 @@ create table sys_user ( -- ---------------------------- -- 初始化-用户信息表数据 -- ---------------------------- -insert into sys_user values(1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '管理员'); -insert into sys_user values(3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 3, sysdate(), null); -insert into sys_user values(4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 4, sysdate(), null); +insert into sys_user values(1, '000000', 100, 'admin', 'admin', 'sys_user', 'xxx@163.com', '15888888888', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '管理员'); -- ---------------------------- -- 3、岗位信息表 @@ -190,13 +172,6 @@ create table sys_post primary key (post_id) ) engine=innodb comment = '岗位信息表'; --- ---------------------------- --- 初始化-岗位信息表数据 --- ---------------------------- -insert into sys_post values(1, '000000', 103, 'ceo', null, '董事长', 1, '0', 103, 1, sysdate(), null, null, ''); -insert into sys_post values(2, '000000', 100, 'se', null, '项目经理', 2, '0', 103, 1, sysdate(), null, null, ''); -insert into sys_post values(3, '000000', 100, 'hr', null, '人力资源', 3, '0', 103, 1, sysdate(), null, null, ''); -insert into sys_post values(4, '000000', 100, 'user', null, '普通员工', 4, '0', 103, 1, sysdate(), null, null, ''); -- ---------------------------- @@ -226,8 +201,6 @@ create table sys_role ( -- 初始化-角色信息表数据 -- ---------------------------- insert into sys_role values(1, '000000', '超级管理员', 'superadmin', 1, 1, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '超级管理员'); -insert into sys_role values(3, '000000', '本部门及以下', 'test1', 3, 4, 1, 1, '0', '0', 103, 1, sysdate(), null, null, ''); -insert into sys_role values(4, '000000', '仅本人', 'test2', 4, 5, 1, 1, '0', '0', 103, 1, sysdate(), null, null, ''); -- ---------------------------- -- 5、菜单权限表 @@ -261,11 +234,9 @@ create table sys_menu ( -- ---------------------------- -- 一级菜单 insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, '', 1, 0, 'M', '0', '0', '', 'system', 103, 1, sysdate(), null, null, '系统管理目录'); -insert into sys_menu values('6', '租户管理', '0', '2', 'tenant', null, '', 1, 0, 'M', '0', '0', '', 'chart', 103, 1, sysdate(), null, null, '租户管理目录'); insert into sys_menu values('2', '系统监控', '0', '3', 'monitor', null, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), null, null, '系统监控目录'); insert into sys_menu values('3', '系统工具', '0', '4', 'tool', null, '', 1, 0, 'M', '0', '0', '', 'tool', 103, 1, sysdate(), null, null, '系统工具目录'); -insert into sys_menu values('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide', 103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址'); -insert into sys_menu values('5', '测试菜单', '0', '5', 'demo', null, '', 1, 0, 'M', '0', '0', '', 'star', 103, 1, sysdate(), null, null, '测试菜单'); + -- 二级菜单 insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 103, 1, sysdate(), null, null, '用户管理菜单'); insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 103, 1, sysdate(), null, null, '角色管理菜单'); @@ -283,12 +254,8 @@ insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate(), null, null, '客户端管理菜单'); --- springboot-admin监控 -insert into sys_menu values('117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list', 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单'); -- oss菜单 insert into sys_menu values('118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 103, 1, sysdate(), null, null, '文件管理菜单'); --- snail-job server控制台 -insert into sys_menu values('120', '任务调度中心', '2', '6', 'snailjob', 'monitor/snailjob/index', '', 1, 0, 'C', '0', '0', 'monitor:snailjob:list', 'job', 103, 1, sysdate(), null, null, 'SnailJob控制台菜单'); -- 三级菜单 insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单'); @@ -370,37 +337,13 @@ insert into sys_menu values('1621', '配置添加', '118', '6', '#', '', '', 1, insert into sys_menu values('1622', '配置编辑', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1623', '配置删除', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:remove', '#', 103, 1, sysdate(), null, null, ''); --- 租户管理相关按钮 -insert into sys_menu values ('1606', '租户查询', '121', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1607', '租户新增', '121', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1608', '租户修改', '121', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1609', '租户删除', '121', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1610', '租户导出', '121', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', '#', 103, 1, sysdate(), null, null, ''); --- 租户套餐管理相关按钮 -insert into sys_menu values ('1611', '租户套餐查询', '122', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1612', '租户套餐新增', '122', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values ('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103, 1, sysdate(), null, null, ''); -- 客户端管理按钮 insert into sys_menu values('1061', '客户端管理查询', '123', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1062', '客户端管理新增', '123', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1063', '客户端管理修改', '123', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1064', '客户端管理删除', '123', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1065', '客户端管理导出', '123', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export', '#', 103, 1, sysdate(), null, null, ''); --- 测试菜单 -insert into sys_menu values('1500', '测试单表', '5', '1', 'demo', 'demo/demo/index', '', 1, 0, 'C', '0', '0', 'demo:demo:list', '#', 103, 1, sysdate(), null, null, '测试单表菜单'); -insert into sys_menu values('1501', '测试单表查询', '1500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1502', '测试单表新增', '1500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1503', '测试单表修改', '1500', '3', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1504', '测试单表删除', '1500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:remove', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1505', '测试单表导出', '1500', '5', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:export', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1506', '测试树表', '5', '1', 'tree', 'demo/tree/index', '', 1, 0, 'C', '0', '0', 'demo:tree:list', '#', 103, 1, sysdate(), null, null, '测试树表菜单'); -insert into sys_menu values('1507', '测试树表查询', '1506', '1', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:query', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1508', '测试树表新增', '1506', '2', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:add', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1509', '测试树表修改', '1506', '3', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1510', '测试树表删除', '1506', '4', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('1511', '测试树表导出', '1506', '5', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, sysdate(), null, null, ''); + -- ---------------------------- -- 6、用户和角色关联表 用户N-1角色 @@ -415,8 +358,6 @@ create table sys_user_role ( -- 初始化-用户和角色关联表数据 -- ---------------------------- insert into sys_user_role values ('1', '1'); -insert into sys_user_role values ('3', '3'); -insert into sys_user_role values ('4', '4'); -- ---------------------------- -- 7、角色和菜单关联表 角色1-N菜单 @@ -427,93 +368,6 @@ create table sys_role_menu ( primary key(role_id, menu_id) ) engine=innodb comment = '角色和菜单关联表'; --- ---------------------------- --- 初始化-角色和菜单关联表数据 --- ---------------------------- -insert into sys_role_menu values ('3', '1'); -insert into sys_role_menu values ('3', '5'); -insert into sys_role_menu values ('3', '100'); -insert into sys_role_menu values ('3', '101'); -insert into sys_role_menu values ('3', '102'); -insert into sys_role_menu values ('3', '103'); -insert into sys_role_menu values ('3', '104'); -insert into sys_role_menu values ('3', '105'); -insert into sys_role_menu values ('3', '106'); -insert into sys_role_menu values ('3', '107'); -insert into sys_role_menu values ('3', '108'); -insert into sys_role_menu values ('3', '500'); -insert into sys_role_menu values ('3', '501'); -insert into sys_role_menu values ('3', '1001'); -insert into sys_role_menu values ('3', '1002'); -insert into sys_role_menu values ('3', '1003'); -insert into sys_role_menu values ('3', '1004'); -insert into sys_role_menu values ('3', '1005'); -insert into sys_role_menu values ('3', '1006'); -insert into sys_role_menu values ('3', '1007'); -insert into sys_role_menu values ('3', '1008'); -insert into sys_role_menu values ('3', '1009'); -insert into sys_role_menu values ('3', '1010'); -insert into sys_role_menu values ('3', '1011'); -insert into sys_role_menu values ('3', '1012'); -insert into sys_role_menu values ('3', '1013'); -insert into sys_role_menu values ('3', '1014'); -insert into sys_role_menu values ('3', '1015'); -insert into sys_role_menu values ('3', '1016'); -insert into sys_role_menu values ('3', '1017'); -insert into sys_role_menu values ('3', '1018'); -insert into sys_role_menu values ('3', '1019'); -insert into sys_role_menu values ('3', '1020'); -insert into sys_role_menu values ('3', '1021'); -insert into sys_role_menu values ('3', '1022'); -insert into sys_role_menu values ('3', '1023'); -insert into sys_role_menu values ('3', '1024'); -insert into sys_role_menu values ('3', '1025'); -insert into sys_role_menu values ('3', '1026'); -insert into sys_role_menu values ('3', '1027'); -insert into sys_role_menu values ('3', '1028'); -insert into sys_role_menu values ('3', '1029'); -insert into sys_role_menu values ('3', '1030'); -insert into sys_role_menu values ('3', '1031'); -insert into sys_role_menu values ('3', '1032'); -insert into sys_role_menu values ('3', '1033'); -insert into sys_role_menu values ('3', '1034'); -insert into sys_role_menu values ('3', '1035'); -insert into sys_role_menu values ('3', '1036'); -insert into sys_role_menu values ('3', '1037'); -insert into sys_role_menu values ('3', '1038'); -insert into sys_role_menu values ('3', '1039'); -insert into sys_role_menu values ('3', '1040'); -insert into sys_role_menu values ('3', '1041'); -insert into sys_role_menu values ('3', '1042'); -insert into sys_role_menu values ('3', '1043'); -insert into sys_role_menu values ('3', '1044'); -insert into sys_role_menu values ('3', '1045'); -insert into sys_role_menu values ('3', '1500'); -insert into sys_role_menu values ('3', '1501'); -insert into sys_role_menu values ('3', '1502'); -insert into sys_role_menu values ('3', '1503'); -insert into sys_role_menu values ('3', '1504'); -insert into sys_role_menu values ('3', '1505'); -insert into sys_role_menu values ('3', '1506'); -insert into sys_role_menu values ('3', '1507'); -insert into sys_role_menu values ('3', '1508'); -insert into sys_role_menu values ('3', '1509'); -insert into sys_role_menu values ('3', '1510'); -insert into sys_role_menu values ('3', '1511'); -insert into sys_role_menu values ('4', '5'); -insert into sys_role_menu values ('4', '1500'); -insert into sys_role_menu values ('4', '1501'); -insert into sys_role_menu values ('4', '1502'); -insert into sys_role_menu values ('4', '1503'); -insert into sys_role_menu values ('4', '1504'); -insert into sys_role_menu values ('4', '1505'); -insert into sys_role_menu values ('4', '1506'); -insert into sys_role_menu values ('4', '1507'); -insert into sys_role_menu values ('4', '1508'); -insert into sys_role_menu values ('4', '1509'); -insert into sys_role_menu values ('4', '1510'); -insert into sys_role_menu values ('4', '1511'); - -- ---------------------------- -- 8、角色和部门关联表 角色1-N部门 -- ---------------------------- @@ -724,12 +578,6 @@ create table sys_notice ( primary key (notice_id) ) engine=innodb comment = '通知公告表'; --- ---------------------------- --- 初始化-公告信息表数据 --- ---------------------------- -insert into sys_notice values('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, sysdate(), null, null, '管理员'); -insert into sys_notice values('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容', '0', 103, 1, sysdate(), null, null, '管理员'); - -- ---------------------------- -- 18、代码生成业务表 @@ -838,10 +686,6 @@ create table sys_oss_config ( ) engine=innodb comment='对象存储配置表'; insert into sys_oss_config values (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '','N', '', '1' ,'0', '', 103, 1, sysdate(), 1, sysdate(), null); -insert into sys_oss_config values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); -insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); -insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); -insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); -- ---------------------------- -- 系统授权表 @@ -869,67 +713,4 @@ insert into sys_client values (1, 'e5cd7e4891bf95d1d19206ce24a7b32e', 'pc', 'pc1 insert into sys_client values (2, '428a8310cd442757ae699df5d894f051', 'app', 'app123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 103, 1, sysdate(), 1, sysdate()); -CREATE TABLE test_demo -( - id bigint(0) NOT NULL COMMENT '主键', - tenant_id varchar(20) NULL DEFAULT '000000' COMMENT '租户编号', - dept_id bigint(0) NULL DEFAULT NULL COMMENT '部门id', - user_id bigint(0) NULL DEFAULT NULL COMMENT '用户id', - order_num int(0) NULL DEFAULT 0 COMMENT '排序号', - test_key varchar(255) NULL DEFAULT NULL COMMENT 'key键', - value varchar(255) NULL DEFAULT NULL COMMENT '值', - version int(0) NULL DEFAULT 0 COMMENT '版本', - create_dept bigint(0) NULL DEFAULT NULL COMMENT '创建部门', - create_time datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - create_by bigint(0) NULL DEFAULT NULL COMMENT '创建人', - update_time datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - update_by bigint(0) NULL DEFAULT NULL COMMENT '更新人', - del_flag int(0) NULL DEFAULT 0 COMMENT '删除标志', - PRIMARY KEY (id) USING BTREE -) ENGINE = InnoDB COMMENT = '测试单表'; - -CREATE TABLE test_tree -( - id bigint(0) NOT NULL COMMENT '主键', - tenant_id varchar(20) NULL DEFAULT '000000' COMMENT '租户编号', - parent_id bigint(0) NULL DEFAULT 0 COMMENT '父id', - dept_id bigint(0) NULL DEFAULT NULL COMMENT '部门id', - user_id bigint(0) NULL DEFAULT NULL COMMENT '用户id', - tree_name varchar(255) NULL DEFAULT NULL COMMENT '值', - version int(0) NULL DEFAULT 0 COMMENT '版本', - create_dept bigint(0) NULL DEFAULT NULL COMMENT '创建部门', - create_time datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - create_by bigint(0) NULL DEFAULT NULL COMMENT '创建人', - update_time datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - update_by bigint(0) NULL DEFAULT NULL COMMENT '更新人', - del_flag int(0) NULL DEFAULT 0 COMMENT '删除标志', - PRIMARY KEY (id) USING BTREE -) ENGINE = InnoDB COMMENT = '测试树表'; - -INSERT INTO test_demo VALUES (1, '000000', 102, 4, 1, '测试数据权限', '测试', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (2, '000000', 102, 3, 2, '子节点1', '111', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (3, '000000', 102, 3, 3, '子节点2', '222', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (4, '000000', 108, 4, 4, '测试数据', 'demo', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (5, '000000', 108, 3, 13, '子节点11', '1111', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (6, '000000', 108, 3, 12, '子节点22', '2222', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (7, '000000', 108, 3, 11, '子节点33', '3333', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (8, '000000', 108, 3, 10, '子节点44', '4444', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (9, '000000', 108, 3, 9, '子节点55', '5555', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (10, '000000', 108, 3, 8, '子节点66', '6666', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (11, '000000', 108, 3, 7, '子节点77', '7777', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (12, '000000', 108, 3, 6, '子节点88', '8888', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_demo VALUES (13, '000000', 108, 3, 5, '子节点99', '9999', 0, 103, sysdate(), 1, NULL, NULL, 0); - -INSERT INTO test_tree VALUES (1, '000000', 0, 102, 4, '测试数据权限', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (2, '000000', 1, 102, 3, '子节点1', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (3, '000000', 2, 102, 3, '子节点2', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (4, '000000', 0, 108, 4, '测试树1', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (5, '000000', 4, 108, 3, '子节点11', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (6, '000000', 4, 108, 3, '子节点22', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (7, '000000', 4, 108, 3, '子节点33', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (8, '000000', 5, 108, 3, '子节点44', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (9, '000000', 6, 108, 3, '子节点55', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (10, '000000', 7, 108, 3, '子节点66', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (11, '000000', 7, 108, 3, '子节点77', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (12, '000000', 10, 108, 3, '子节点88', 0, 103, sysdate(), 1, NULL, NULL, 0); -INSERT INTO test_tree VALUES (13, '000000', 10, 108, 3, '子节点99', 0, 103, sysdate(), 1, NULL, NULL, 0); + diff --git a/im-admin-ui/.env.development b/im-admin-ui/.env.development index 14e1335..e91c30a 100644 --- a/im-admin-ui/.env.development +++ b/im-admin-ui/.env.development @@ -1,5 +1,5 @@ # 页面标题 -VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统 +VITE_APP_TITLE = 盒子IM后台管理系统 # 开发环境配置 VITE_APP_ENV = 'development' @@ -10,20 +10,8 @@ VITE_APP_BASE_API = '/dev-api' # 应用访问路径 例如使用前缀 /admin/ VITE_APP_CONTEXT_PATH = '/' -# 监控地址 -VITE_APP_MONITOR_ADMIN = 'http://localhost:9090/admin/applications' - -# SnailJob 控制台地址 -VITE_APP_SNAILJOB_ADMIN = 'http://localhost:8800/snail-job' - VITE_APP_PORT = 80 -# 接口加密功能开关(如需关闭 后端也必须对应关闭) -VITE_APP_ENCRYPT = true -# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换 -VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' -# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换 -VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=' # 客户端id VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e' diff --git a/im-admin-ui/bin/build.bat b/im-admin-ui/bin/build.bat deleted file mode 100644 index ecbb454..0000000 --- a/im-admin-ui/bin/build.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -echo. -echo [Ϣ] Weḅdistļ -echo. - -%~d0 -cd %~dp0 - -cd .. -yarn build:prod - -pause \ No newline at end of file diff --git a/im-admin-ui/bin/package.bat b/im-admin-ui/bin/package.bat deleted file mode 100644 index f5b24e0..0000000 --- a/im-admin-ui/bin/package.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -echo. -echo [Ϣ] װWeḅnode_modulesļ -echo. - -%~d0 -cd %~dp0 - -cd .. -yarn --registry=https://registry.npmmirror.com - -pause \ No newline at end of file diff --git a/im-admin-ui/bin/run-web.bat b/im-admin-ui/bin/run-web.bat deleted file mode 100644 index d2fe397..0000000 --- a/im-admin-ui/bin/run-web.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -echo. -echo [Ϣ] ʹ Vite Web ̡ -echo. - -%~d0 -cd %~dp0 - -cd .. -yarn dev - -pause \ No newline at end of file diff --git a/im-admin-ui/package.json b/im-admin-ui/package.json index e67d60f..4f8fd8e 100644 --- a/im-admin-ui/package.json +++ b/im-admin-ui/package.json @@ -1,8 +1,8 @@ { - "name": "ruoyi-vue-plus", - "version": "5.2.3", - "description": "RuoYi-Vue-Plus多租户管理系统", - "author": "LionLi", + "name": "盒子IM", + "version": "3.0", + "description": "盒子IM后台管理系统", + "author": "Blue", "license": "MIT", "type": "module", "scripts": { @@ -13,10 +13,6 @@ "lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ", "prettier": "prettier --write ." }, - "repository": { - "type": "git", - "url": "https://gitee.com/JavaLionLi/plus-ui.git" - }, "dependencies": { "@element-plus/icons-vue": "2.3.1", "@highlightjs/vue-plugin": "2.1.0", diff --git a/im-admin-ui/public/favicon.ico b/im-admin-ui/public/favicon.ico index 3f919d85a5d1e093fd8d80ebcbe9987a3bdbb54f..36c8c2314a5ef80b6bb238c515f8a488bf5db525 100644 GIT binary patch literal 34383 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 d+2AD?_zza => { - return request({ - url: '/demo/demo/list', - method: 'get', - params: query - }); -}; - -/** - * 查询测试单详细 - * @param id - */ -export const getDemo = (id: string | number): AxiosPromise => { - return request({ - url: '/demo/demo/' + id, - method: 'get' - }); -}; - -/** - * 新增测试单 - * @param data - */ -export const addDemo = (data: DemoForm) => { - return request({ - url: '/demo/demo', - method: 'post', - data: data - }); -}; - -/** - * 修改测试单 - * @param data - */ -export const updateDemo = (data: DemoForm) => { - return request({ - url: '/demo/demo', - method: 'put', - data: data - }); -}; - -/** - * 删除测试单 - * @param id - */ -export const delDemo = (id: string | number | Array) => { - return request({ - url: '/demo/demo/' + id, - method: 'delete' - }); -}; diff --git a/im-admin-ui/src/api/demo/demo/types.ts b/im-admin-ui/src/api/demo/demo/types.ts deleted file mode 100644 index ea51d32..0000000 --- a/im-admin-ui/src/api/demo/demo/types.ts +++ /dev/null @@ -1,90 +0,0 @@ -export interface DemoVO { - /** - * 主键 - */ - id: string | number; - - /** - * 部门id - */ - deptId: string | number; - - /** - * 用户id - */ - userId: string | number; - - /** - * 排序号 - */ - orderNum: number; - - /** - * key键 - */ - testKey: string; - - /** - * 值 - */ - value: string; -} - -export interface DemoForm extends BaseEntity { - /** - * 主键 - */ - id?: string | number; - - /** - * 部门id - */ - deptId?: string | number; - - /** - * 用户id - */ - userId?: string | number; - - /** - * 排序号 - */ - orderNum?: number; - - /** - * key键 - */ - testKey?: string; - - /** - * 值 - */ - value?: string; -} - -export interface DemoQuery extends PageQuery { - /** - * 部门id - */ - deptId?: string | number; - - /** - * 用户id - */ - userId?: string | number; - - /** - * 排序号 - */ - orderNum?: number; - - /** - * key键 - */ - testKey?: string; - - /** - * 值 - */ - value?: string; -} diff --git a/im-admin-ui/src/api/demo/tree/index.ts b/im-admin-ui/src/api/demo/tree/index.ts deleted file mode 100644 index 562deb6..0000000 --- a/im-admin-ui/src/api/demo/tree/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -import request from '@/utils/request'; -import { AxiosPromise } from 'axios'; -import { TreeVO, TreeForm, TreeQuery } from '@/api/demo/tree/types'; - -/** - * 查询测试树列表 - * @param query - * @returns {*} - */ -export const listTree = (query?: TreeQuery): AxiosPromise => { - return request({ - url: '/demo/tree/list', - method: 'get', - params: query - }); -}; - -/** - * 查询测试树详细 - * @param id - */ -export const getTree = (id: string | number): AxiosPromise => { - return request({ - url: '/demo/tree/' + id, - method: 'get' - }); -}; - -/** - * 新增测试树 - * @param data - */ -export const addTree = (data: TreeForm) => { - return request({ - url: '/demo/tree', - method: 'post', - data: data - }); -}; - -/** - * 修改测试树 - * @param data - */ -export const updateTree = (data: TreeForm) => { - return request({ - url: '/demo/tree', - method: 'put', - data: data - }); -}; - -/** - * 删除测试树 - * @param id - */ -export const delTree = (id: string | number | Array) => { - return request({ - url: '/demo/tree/' + id, - method: 'delete' - }); -}; diff --git a/im-admin-ui/src/api/demo/tree/types.ts b/im-admin-ui/src/api/demo/tree/types.ts deleted file mode 100644 index e164d8b..0000000 --- a/im-admin-ui/src/api/demo/tree/types.ts +++ /dev/null @@ -1,80 +0,0 @@ -export interface TreeVO { - /** - * 主键 - */ - id: string | number; - - /** - * 父id - */ - parentId: string | number; - - /** - * 部门id - */ - deptId: string | number; - - /** - * 用户id - */ - userId: string | number; - - /** - * 值 - */ - treeName: string; - - /** - * 子对象 - */ - children: TreeVO[]; -} - -export interface TreeForm extends BaseEntity { - /** - * 主键 - */ - id?: string | number; - - /** - * 父id - */ - parentId?: string | number; - - /** - * 部门id - */ - deptId?: string | number; - - /** - * 用户id - */ - userId?: string | number; - - /** - * 值 - */ - treeName?: string; -} - -export interface TreeQuery { - /** - * 父id - */ - parentId?: string | number; - - /** - * 部门id - */ - deptId?: string | number; - - /** - * 用户id - */ - userId?: string | number; - - /** - * 值 - */ - treeName?: string; -} diff --git a/im-admin-ui/src/api/workflow/category/index.ts b/im-admin-ui/src/api/workflow/category/index.ts deleted file mode 100644 index e9723b0..0000000 --- a/im-admin-ui/src/api/workflow/category/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import request from '@/utils/request'; -import { AxiosPromise } from 'axios'; -import { CategoryVO, CategoryForm, CategoryQuery } from '@/api/workflow/category/types'; - -/** - * 查询流程分类列表 - * @param query - * @returns {*} - */ - -export const listCategory = (query?: CategoryQuery): AxiosPromise => { - return request({ - url: '/workflow/category/list', - method: 'get', - params: query - }); -}; - -/** - * 查询流程分类详细 - * @param id - */ -export const getCategory = (id: string | number): AxiosPromise => { - return request({ - url: '/workflow/category/' + id, - method: 'get' - }); -}; - -/** - * 新增流程分类 - * @param data - */ -export const addCategory = (data: CategoryForm) => { - return request({ - url: '/workflow/category', - method: 'post', - data: data - }); -}; - -/** - * 修改流程分类 - * @param data - */ -export const updateCategory = (data: CategoryForm) => { - return request({ - url: '/workflow/category', - method: 'put', - data: data - }); -}; - -/** - * 删除流程分类 - * @param id - */ -export const delCategory = (id: string | number | Array) => { - return request({ - url: '/workflow/category/' + id, - method: 'delete' - }); -}; diff --git a/im-admin-ui/src/api/workflow/category/types.ts b/im-admin-ui/src/api/workflow/category/types.ts deleted file mode 100644 index 414fa55..0000000 --- a/im-admin-ui/src/api/workflow/category/types.ts +++ /dev/null @@ -1,67 +0,0 @@ -export interface CategoryVO { - /** - * 主键 - */ - id: string; - - /** - * 分类名称 - */ - categoryName: string; - - /** - * 分类编码 - */ - categoryCode: string; - - /** - * 父级id - */ - parentId: string | number; - - /** - * 排序 - */ - sortNum: number; - - children?: CategoryVO[]; -} - -export interface CategoryForm extends BaseEntity { - /** - * 主键 - */ - id?: string | number; - - /** - * 分类名称 - */ - categoryName?: string; - - /** - * 分类编码 - */ - categoryCode?: string; - - /** - * 父级id - */ - parentId?: string | number; - - /** - * 排序 - */ - sortNum?: number; -} - -export interface CategoryQuery extends PageQuery { - /** - * 分类名称 - */ - categoryName?: string; - - /** - * 分类编码 - */ - categoryCode?: string; -} diff --git a/im-admin-ui/src/api/workflow/definitionConfig/index.ts b/im-admin-ui/src/api/workflow/definitionConfig/index.ts deleted file mode 100644 index d34bf05..0000000 --- a/im-admin-ui/src/api/workflow/definitionConfig/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -import request from '@/utils/request'; -import { AxiosPromise } from 'axios'; -import { DefinitionConfigVO, DefinitionConfigForm } from '@/api/workflow/definitionConfig/types'; - -/** - * 查询表单配置详细 - * @param definitionId - */ -export const getByDefId = (definitionId: string | number): AxiosPromise => { - return request({ - url: '/workflow/definitionConfig/getByDefId/' + definitionId, - method: 'get' - }); -}; - -/** - * 新增表单配置 - * @param data - */ -export const saveOrUpdate = (data: DefinitionConfigForm) => { - return request({ - url: '/workflow/definitionConfig/saveOrUpdate', - method: 'post', - data: data - }); -}; - -/** - * 删除表单配置 - * @param id - */ -export const deldefinitionConfig = (id: string | number | Array) => { - return request({ - url: '/workflow/definitionConfig/' + id, - method: 'delete' - }); -}; - -/** - * 查询流程定义配置排除当前查询的流程定义 - * @param tableName - * @param definitionId - */ -export const getByTableNameNotDefId = (tableName: string, definitionId: string | number) => { - return request({ - url: `/workflow/definitionConfig/getByTableNameNotDefId/${tableName}/${definitionId}`, - method: 'get' - }); -}; diff --git a/im-admin-ui/src/api/workflow/definitionConfig/types.ts b/im-admin-ui/src/api/workflow/definitionConfig/types.ts deleted file mode 100644 index 7627403..0000000 --- a/im-admin-ui/src/api/workflow/definitionConfig/types.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { FormManageVO } from '@/api/workflow/formManage/types'; - -export interface DefinitionConfigVO { - /** - * 主键 - */ - id: string | number; - - /** - * 表名 - */ - tableName?: string; - - /** - * 流程定义ID - */ - definitionId: string | number; - - /** - * 流程KEY - */ - processKey: string; - - /** - * 流程版本 - */ - version?: string | number; - - /** - * 备注 - */ - remark: string; - - /** - * 表单管理 - */ - wfFormManageVo: FormManageVO; -} - -export interface DefinitionConfigForm extends BaseEntity { - /** - * 主键 - */ - id?: string | number; - - /** - * 表名 - */ - tableName?: string; - - /** - * 流程定义ID - */ - definitionId?: string | number; - - /** - * 流程KEY - */ - processKey?: string; - - /** - * 流程版本 - */ - version?: string | number; - - /** - * 备注 - */ - remark?: string; - - /** - * 表单管理 - */ - wfFormManageVo?: FormManageVO; -} - -export interface DefinitionConfigQuery extends PageQuery { - /** - * 表名 - */ - tableName?: string; - - /** - * 流程定义ID - */ - definitionId?: string | number; - - /** - * 流程KEY - */ - processKey?: string; - - /** - * 流程版本 - */ - version?: string | number; - - /** - * 表单管理 - */ - wfFormManageVo: FormManageVO; -} diff --git a/im-admin-ui/src/api/workflow/formManage/index.ts b/im-admin-ui/src/api/workflow/formManage/index.ts deleted file mode 100644 index 6c5ec60..0000000 --- a/im-admin-ui/src/api/workflow/formManage/index.ts +++ /dev/null @@ -1,76 +0,0 @@ -import request from '@/utils/request'; -import { AxiosPromise } from 'axios'; -import { FormManageVO, FormManageForm, FormManageQuery } from '@/api/workflow/formManage/types'; - -/** - * 查询表单管理列表 - * @param query - * @returns {*} - */ - -export const listFormManage = (query?: FormManageQuery): AxiosPromise => { - return request({ - url: '/workflow/formManage/list', - method: 'get', - params: query - }); -}; - -/** - * 查询表单管理列表 - * @param query - * @returns {*} - */ - -export const selectListFormManage = (): AxiosPromise => { - return request({ - url: '/workflow/formManage/list/selectList', - method: 'get' - }); -}; - -/** - * 查询表单管理详细 - * @param id - */ -export const getFormManage = (id: string | number): AxiosPromise => { - return request({ - url: '/workflow/formManage/' + id, - method: 'get' - }); -}; - -/** - * 新增表单管理 - * @param data - */ -export const addFormManage = (data: FormManageForm) => { - return request({ - url: '/workflow/formManage', - method: 'post', - data: data - }); -}; - -/** - * 修改表单管理 - * @param data - */ -export const updateFormManage = (data: FormManageForm) => { - return request({ - url: '/workflow/formManage', - method: 'put', - data: data - }); -}; - -/** - * 删除表单管理 - * @param id - */ -export const delFormManage = (id: string | number | Array) => { - return request({ - url: '/workflow/formManage/' + id, - method: 'delete' - }); -}; diff --git a/im-admin-ui/src/api/workflow/formManage/types.ts b/im-admin-ui/src/api/workflow/formManage/types.ts deleted file mode 100644 index b9dc1d8..0000000 --- a/im-admin-ui/src/api/workflow/formManage/types.ts +++ /dev/null @@ -1,69 +0,0 @@ -export interface FormManageVO { - /** - * 主键 - */ - id: string | number; - - /** - * 表单名称 - */ - formName: string; - - /** - * 表单类型 - */ - formType: string; - /** - * 表单类型名称 - */ - formTypeName: string; - - /** - * 路由地址/表单ID - */ - router: string; - - /** - * 备注 - */ - remark: string; -} - -export interface FormManageForm extends BaseEntity { - /** - * 主键 - */ - id?: string | number; - - /** - * 表单名称 - */ - formName?: string; - - /** - * 表单类型 - */ - formType?: string; - - /** - * 路由地址/表单ID - */ - router?: string; - - /** - * 备注 - */ - remark?: string; -} - -export interface FormManageQuery extends PageQuery { - /** - * 表单名称 - */ - formName?: string; - - /** - * 表单类型 - */ - formType?: string; -} diff --git a/im-admin-ui/src/api/workflow/leave/index.ts b/im-admin-ui/src/api/workflow/leave/index.ts deleted file mode 100644 index 4e6f363..0000000 --- a/im-admin-ui/src/api/workflow/leave/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import request from '@/utils/request'; -import { AxiosPromise } from 'axios'; -import { LeaveVO, LeaveQuery, LeaveForm } from '@/api/workflow/leave/types'; - -/** - * 查询请假列表 - * @param query - * @returns {*} - */ - -export const listLeave = (query?: LeaveQuery): AxiosPromise => { - return request({ - url: '/workflow/leave/list', - method: 'get', - params: query - }); -}; - -/** - * 查询请假详细 - * @param id - */ -export const getLeave = (id: string | number): AxiosPromise => { - return request({ - url: '/workflow/leave/' + id, - method: 'get' - }); -}; - -/** - * 新增请假 - * @param data - */ -export const addLeave = (data: LeaveForm): AxiosPromise => { - return request({ - url: '/workflow/leave', - method: 'post', - data: data - }); -}; - -/** - * 修改请假 - * @param data - */ -export const updateLeave = (data: LeaveForm): AxiosPromise => { - return request({ - url: '/workflow/leave', - method: 'put', - data: data - }); -}; - -/** - * 删除请假 - * @param id - */ -export const delLeave = (id: string | number | Array) => { - return request({ - url: '/workflow/leave/' + id, - method: 'delete' - }); -}; diff --git a/im-admin-ui/src/api/workflow/leave/types.ts b/im-admin-ui/src/api/workflow/leave/types.ts deleted file mode 100644 index a44d35d..0000000 --- a/im-admin-ui/src/api/workflow/leave/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -export interface LeaveVO { - id: string | number; - leaveType: string; - startDate: string; - endDate: string; - leaveDays: number; - remark: string; - status?: string; -} - -export interface LeaveForm extends BaseEntity { - id?: string | number; - leaveType?: string; - startDate?: string; - endDate?: string; - leaveDays?: number; - remark?: string; - status?: string; -} - -export interface LeaveQuery extends PageQuery { - startLeaveDays?: number; - endLeaveDays?: number; -} diff --git a/im-admin-ui/src/api/workflow/model/index.ts b/im-admin-ui/src/api/workflow/model/index.ts deleted file mode 100644 index 1ca8b19..0000000 --- a/im-admin-ui/src/api/workflow/model/index.ts +++ /dev/null @@ -1,104 +0,0 @@ -import request from '@/utils/request'; -import { AxiosPromise } from 'axios'; -import { ModelForm, ModelQuery, ModelVO } from '@/api/workflow/model/types'; - -/** - * 查询模型列表 - * @param query - * @returns {*} - */ -export const listModel = (query: ModelQuery): AxiosPromise => { - return request({ - url: '/workflow/model/list', - method: 'get', - params: query - }); -}; - -/** - * 查询模型信息 - * @param query - * @returns {*} - */ -export const getInfo = (id: string): AxiosPromise => { - return request({ - url: '/workflow/model/getInfo/' + id, - method: 'get' - }); -}; - -/** - * 新增模型 - * @param data - * @returns {*} - */ -export const addModel = (data: ModelForm): AxiosPromise => { - return request({ - url: '/workflow/model/save', - method: 'post', - data: data - }); -}; - -/** - * 修改模型信息 - * @param data - * @returns {*} - */ -export function update(data: ModelForm): AxiosPromise { - return request({ - url: '/workflow/model/update', - method: 'put', - data: data - }); -} - -/** - * 修改模型信息 - * @param data - * @returns {*} - */ -export function editModelXml(data: ModelForm): AxiosPromise { - return request({ - url: '/workflow/model/editModelXml', - method: 'put', - data: data - }); -} - -/** - * 按id删除模型 - * @returns {*} - * @param id 模型id - */ -export function delModel(id: string | string[]): AxiosPromise { - return request({ - url: '/workflow/model/' + id, - method: 'delete' - }); -} - -/** - * 模型部署 - * @returns {*} - * @param id 模型id - */ -export const modelDeploy = (id: string): AxiosPromise => { - return request({ - url: `/workflow/model/modelDeploy/${id}`, - method: 'post' - }); -}; - -/** - * 复制模型 - * @param data - * @returns {*} - */ -export const copyModel = (data: ModelForm): AxiosPromise => { - return request({ - url: '/workflow/model/copyModel', - method: 'post', - data: data - }); -}; diff --git a/im-admin-ui/src/api/workflow/model/types.ts b/im-admin-ui/src/api/workflow/model/types.ts deleted file mode 100644 index 77f947d..0000000 --- a/im-admin-ui/src/api/workflow/model/types.ts +++ /dev/null @@ -1,66 +0,0 @@ -export interface ModelForm { - id: string; - name: string; - key: string; - categoryCode: string; - xml: string; - svg: string; - description: string; -} - -export interface ModelQuery extends PageQuery { - name?: string; - key?: string; - categoryCode?: string; -} - -export interface OriginalPersistentState { - metaInfo: string; - editorSourceValueId: string; - createTime: string; - deploymentId?: string; - name: string; - tenantId: string; - category?: string; - version: number; - editorSourceExtraValueId?: string; - key: string; - lastUpdateTime: string; -} - -export interface PersistentState { - metaInfo: string; - editorSourceValueId: string; - createTime: string; - deploymentId?: string; - name: string; - tenantId: string; - category?: string; - version: number; - editorSourceExtraValueId?: string; - key: string; - lastUpdateTime: string; -} - -export interface ModelVO { - id: string; - revision: number; - originalPersistentState: OriginalPersistentState; - name: string; - key: string; - category?: string; - createTime: string; - lastUpdateTime: string; - version: number; - metaInfo: string; - deploymentId?: string; - editorSourceValueId: string; - editorSourceExtraValueId?: string; - tenantId: string; - persistentState: PersistentState; - revisionNext: number; - idPrefix: string; - inserted: boolean; - updated: boolean; - deleted: boolean; -} diff --git a/im-admin-ui/src/api/workflow/nodeConfig/types.ts b/im-admin-ui/src/api/workflow/nodeConfig/types.ts deleted file mode 100644 index a55fc91..0000000 --- a/im-admin-ui/src/api/workflow/nodeConfig/types.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { FormManageVO } from '@/api/workflow/formManage/types'; - -export interface NodeConfigVO { - /** - * 主键 - */ - id: string | number; - - /** - * 表单id - */ - formId: string | number; - - /** - * 表单类型 - */ - formType: string; - - /** - * 节点名称 - */ - nodeName: string; - - /** - * 节点id - */ - nodeId: string | number; - - /** - * 流程定义id - */ - definitionId: string | number; - - /** - * 表单管理 - */ - wfFormManageVo: FormManageVO; -} diff --git a/im-admin-ui/src/api/workflow/processDefinition/index.ts b/im-admin-ui/src/api/workflow/processDefinition/index.ts deleted file mode 100644 index c063120..0000000 --- a/im-admin-ui/src/api/workflow/processDefinition/index.ts +++ /dev/null @@ -1,114 +0,0 @@ -import request from '@/utils/request'; -import { ProcessDefinitionQuery, ProcessDefinitionVO, definitionXmlVO } from '@/api/workflow/processDefinition/types'; -import { AxiosPromise } from 'axios'; - -/** - * 获取流程定义列表 - * @param query 流程实例id - * @returns - */ -export const listProcessDefinition = (query: ProcessDefinitionQuery): AxiosPromise => { - return request({ - url: `/workflow/processDefinition/list`, - method: 'get', - params: query - }); -}; -/** - * 按照流程定义key获取流程定义 - * @param processInstanceId 流程实例id - * @returns - */ -export const getListByKey = (key: string) => { - return request({ - url: `/workflow/processDefinition/getListByKey/${key}`, - method: 'get' - }); -}; - -/** - * 通过流程定义id获取流程图 - */ -export const definitionImage = (processDefinitionId: string): AxiosPromise => { - return request({ - url: `/workflow/processDefinition/definitionImage/${processDefinitionId}` + '?t' + Math.random(), - method: 'get' - }); -}; - -/** - * 通过流程定义id获取xml - * @param processDefinitionId 流程定义id - * @returns - */ -export const definitionXml = (processDefinitionId: string): AxiosPromise => { - return request({ - url: `/workflow/processDefinition/definitionXml/${processDefinitionId}`, - method: 'get' - }); -}; - -/** - * 删除流程定义 - * @param deploymentId 部署id - * @param processDefinitionId 流程定义id - * @returns - */ -export const deleteProcessDefinition = (deploymentId: string | string[], processDefinitionId: string | string[]) => { - return request({ - url: `/workflow/processDefinition/${deploymentId}/${processDefinitionId}`, - method: 'delete' - }); -}; - -/** - * 挂起/激活 - * @param processDefinitionId 流程定义id - * @returns - */ -export const updateDefinitionState = (processDefinitionId: string) => { - return request({ - url: `/workflow/processDefinition/updateDefinitionState/${processDefinitionId}`, - method: 'put' - }); -}; - -/** - * 流程定义转换为模型 - * @param processDefinitionId 流程定义id - * @returns - */ -export const convertToModel = (processDefinitionId: string) => { - return request({ - url: `/workflow/processDefinition/convertToModel/${processDefinitionId}`, - method: 'put' - }); -}; - -/** - * 通过zip或xml部署流程定义 - * @returns - */ -export function deployProcessFile(data: any) { - return request({ - url: '/workflow/processDefinition/deployByFile', - method: 'post', - data: data, - headers: { - repeatSubmit: false - } - }); -} - -/** - * 迁移流程 - * @param currentProcessDefinitionId - * @param fromProcessDefinitionId - * @returns - */ -export const migrationDefinition = (currentProcessDefinitionId: string, fromProcessDefinitionId: string) => { - return request({ - url: `/workflow/processDefinition/migrationDefinition/${currentProcessDefinitionId}/${fromProcessDefinitionId}`, - method: 'put' - }); -}; diff --git a/im-admin-ui/src/api/workflow/processDefinition/types.ts b/im-admin-ui/src/api/workflow/processDefinition/types.ts deleted file mode 100644 index 979ec25..0000000 --- a/im-admin-ui/src/api/workflow/processDefinition/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types'; -export interface ProcessDefinitionQuery extends PageQuery { - key?: string; - name?: string; - categoryCode?: string; -} - -export interface ProcessDefinitionVO extends BaseEntity { - id: string; - name: string; - key: string; - version: number; - suspensionState: number; - resourceName: string; - diagramResourceName: string; - deploymentId: string; - deploymentTime: string; - wfDefinitionConfigVo: DefinitionConfigVO; -} - -export interface definitionXmlVO { - xml: string[]; - xmlStr: string; -} diff --git a/im-admin-ui/src/api/workflow/processInstance/index.ts b/im-admin-ui/src/api/workflow/processInstance/index.ts deleted file mode 100644 index 6d5e53b..0000000 --- a/im-admin-ui/src/api/workflow/processInstance/index.ts +++ /dev/null @@ -1,136 +0,0 @@ -import request from '@/utils/request'; -import { ProcessInstanceQuery, ProcessInstanceVO } from '@/api/workflow/processInstance/types'; -import { AxiosPromise } from 'axios'; - -/** - * 查询运行中实例列表 - * @param query - * @returns {*} - */ -export const getPageByRunning = (query: ProcessInstanceQuery): AxiosPromise => { - return request({ - url: '/workflow/processInstance/getPageByRunning', - method: 'get', - params: query - }); -}; - -/** - * 查询已完成实例列表 - * @param query - * @returns {*} - */ -export const getPageByFinish = (query: ProcessInstanceQuery): AxiosPromise => { - return request({ - url: '/workflow/processInstance/getPageByFinish', - method: 'get', - params: query - }); -}; - -/** - * 通过业务id获取历史流程图 - */ -export const getHistoryImage = (businessKey: string) => { - return request({ - url: `/workflow/processInstance/getHistoryImage/${businessKey}` + '?t' + Math.random(), - method: 'get' - }); -}; - -/** - * 通过业务id获取历史流程图运行中,历史等节点 - */ -export const getHistoryList = (businessKey: string): AxiosPromise> => { - return request({ - url: `/workflow/processInstance/getHistoryList/${businessKey}` + '?t' + Math.random(), - method: 'get' - }); -}; - -/** - * 获取审批记录 - * @param businessKey 业务id - * @returns - */ -export const getHistoryRecord = (businessKey: string | number) => { - return request({ - url: `/workflow/processInstance/getHistoryRecord/${businessKey}`, - method: 'get' - }); -}; - -/** - * 作废 - * @param data 参数 - * @returns - */ -export const deleteRunInstance = (data: object) => { - return request({ - url: `/workflow/processInstance/deleteRunInstance`, - method: 'post', - data: data - }); -}; - -/** - * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * @param businessKey 业务id - * @returns - */ -export const deleteRunAndHisInstance = (businessKey: string | string[]) => { - return request({ - url: `/workflow/processInstance/deleteRunAndHisInstance/${businessKey}`, - method: 'delete' - }); -}; - -/** - * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 - * @param businessKey 业务id - * @returns - */ -export const deleteFinishAndHisInstance = (businessKey: string | string[]) => { - return request({ - url: `/workflow/processInstance/deleteFinishAndHisInstance/${businessKey}`, - method: 'delete' - }); -}; - -/** - * 分页查询当前登录人单据 - * @param query - * @returns {*} - */ -export const getPageByCurrent = (query: ProcessInstanceQuery): AxiosPromise => { - return request({ - url: '/workflow/processInstance/getPageByCurrent', - method: 'get', - params: query - }); -}; - -/** - * 撤销流程 - * @param businessKey 业务id - * @returns - */ -export const cancelProcessApply = (businessKey: string) => { - return request({ - url: `/workflow/processInstance/cancelProcessApply/${businessKey}`, - method: 'post' - }); -}; - -export default { - getPageByRunning, - getPageByFinish, - getHistoryImage, - getHistoryList, - getHistoryRecord, - deleteRunInstance, - deleteRunAndHisInstance, - deleteFinishAndHisInstance, - getPageByCurrent, - cancelProcessApply -}; diff --git a/im-admin-ui/src/api/workflow/processInstance/types.ts b/im-admin-ui/src/api/workflow/processInstance/types.ts deleted file mode 100644 index 99d0511..0000000 --- a/im-admin-ui/src/api/workflow/processInstance/types.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { TaskVO } from '@/api/workflow/task/types'; - -export interface ProcessInstanceQuery extends PageQuery { - categoryCode?: string; - name?: string; - key?: string; - startUserId?: string; - businessKey?: string; -} - -export interface ProcessInstanceVO extends BaseEntity { - id: string; - processDefinitionId: string; - processDefinitionName: string; - processDefinitionKey: string; - processDefinitionVersion: string; - deploymentId: string; - businessKey: string; - isSuspended?: any; - tenantId: string; - startTime: string; - endTime?: string; - startUserId: string; - businessStatus: string; - businessStatusName: string; - taskVoList: TaskVO[]; -} diff --git a/im-admin-ui/src/api/workflow/task/index.ts b/im-admin-ui/src/api/workflow/task/index.ts deleted file mode 100644 index d29de30..0000000 --- a/im-admin-ui/src/api/workflow/task/index.ts +++ /dev/null @@ -1,264 +0,0 @@ -import request from '@/utils/request'; -import { AxiosPromise } from 'axios'; -import { TaskQuery, TaskVO } from '@/api/workflow/task/types'; - -/** - * 查询待办列表 - * @param query - * @returns {*} - */ -export const getPageByTaskWait = (query: TaskQuery): AxiosPromise => { - return request({ - url: '/workflow/task/getPageByTaskWait', - method: 'get', - params: query - }); -}; - -/** - * 查询已办列表 - * @param query - * @returns {*} - */ -export const getPageByTaskFinish = (query: TaskQuery): AxiosPromise => { - return request({ - url: '/workflow/task/getPageByTaskFinish', - method: 'get', - params: query - }); -}; - -/** - * 查询当前用户的抄送列表 - * @param query - * @returns {*} - */ -export const getPageByTaskCopy = (query: TaskQuery): AxiosPromise => { - return request({ - url: '/workflow/task/getPageByTaskCopy', - method: 'get', - params: query - }); -}; - -/** - * 当前租户所有待办任务 - * @param query - * @returns {*} - */ -export const getPageByAllTaskWait = (query: TaskQuery): AxiosPromise => { - return request({ - url: '/workflow/task/getPageByAllTaskWait', - method: 'get', - params: query - }); -}; - -/** - * 当前租户所有已办任务 - * @param query - * @returns {*} - */ -export const getPageByAllTaskFinish = (query: TaskQuery): AxiosPromise => { - return request({ - url: '/workflow/task/getPageByAllTaskFinish', - method: 'get', - params: query - }); -}; - -/** - * 启动流程 - * @param data - * @returns {*} - */ -export const startWorkFlow = (data: object): any => { - return request({ - url: '/workflow/task/startWorkFlow', - method: 'post', - data: data - }); -}; - -/** - * 办理流程 - * @param data - * @returns {*} - */ -export const completeTask = (data: object) => { - return request({ - url: '/workflow/task/completeTask', - method: 'post', - data: data - }); -}; - -/** - * 认领任务 - * @param taskId - * @returns {*} - */ -export const claim = (taskId: string): any => { - return request({ - url: '/workflow/task/claim/' + taskId, - method: 'post' - }); -}; - -/** - * 归还任务 - * @param taskId - * @returns {*} - */ -export const returnTask = (taskId: string): any => { - return request({ - url: '/workflow/task/returnTask/' + taskId, - method: 'post' - }); -}; - -/** - * 任务驳回 - * @param data - * @returns {*} - */ -export const backProcess = (data: any): any => { - return request({ - url: '/workflow/task/backProcess', - method: 'post', - data: data - }); -}; - -/** - * 获取当前任务 - * @param taskId - * @returns - */ -export const getTaskById = (taskId: string) => { - return request({ - url: '/workflow/task/getTaskById/' + taskId, - method: 'get' - }); -}; - -/** - * 加签 - * @param data - * @returns - */ -export const addMultiInstanceExecution = (data: any) => { - return request({ - url: '/workflow/task/addMultiInstanceExecution', - method: 'post', - data: data - }); -}; - -/** - * 减签 - * @param data - * @returns - */ -export const deleteMultiInstanceExecution = (data: any) => { - return request({ - url: '/workflow/task/deleteMultiInstanceExecution', - method: 'post', - data: data - }); -}; - -/** - * 修改任务办理人 - * @param taskIds - * @param userId - * @returns - */ -export const updateAssignee = (taskIds: Array, userId: string) => { - return request({ - url: `/workflow/task/updateAssignee/${taskIds}/${userId}`, - method: 'put' - }); -}; - -/** - * 转办任务 - * @returns - */ -export const transferTask = (data: any) => { - return request({ - url: `/workflow/task/transferTask`, - method: 'post', - data: data - }); -}; - -/** - * 终止任务 - * @returns - */ -export const terminationTask = (data: any) => { - return request({ - url: `/workflow/task/terminationTask`, - method: 'post', - data: data - }); -}; - -/** - * 查询流程变量 - * @returns - */ -export const getInstanceVariable = (taskId: string) => { - return request({ - url: `/workflow/task/getInstanceVariable/${taskId}`, - method: 'get' - }); -}; - -/** - * 获取可驳回得任务节点 - * @returns - */ -export const getTaskNodeList = (processInstanceId: string) => { - return request({ - url: `/workflow/task/getTaskNodeList/${processInstanceId}`, - method: 'get' - }); -}; - -/** - * 委托任务 - * @returns - */ -export const delegateTask = (data: any) => { - return request({ - url: `/workflow/task/delegateTask`, - method: 'post', - data: data - }); -}; - -/** - * 查询工作流任务用户选择加签人员 - * @param taskId - * @returns {*} - */ -export const getTaskUserIdsByAddMultiInstance = (taskId: string) => { - return request({ - url: '/workflow/task/getTaskUserIdsByAddMultiInstance/' + taskId, - method: 'get' - }); -}; - -/** - * 查询工作流选择减签人员 - * @param taskId - * @returns {*} - */ -export const getListByDeleteMultiInstance = (taskId: string) => { - return request({ - url: '/workflow/task/getListByDeleteMultiInstance/' + taskId, - method: 'get' - }); -}; diff --git a/im-admin-ui/src/api/workflow/task/types.ts b/im-admin-ui/src/api/workflow/task/types.ts deleted file mode 100644 index 0425a1a..0000000 --- a/im-admin-ui/src/api/workflow/task/types.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { NodeConfigVO } from '@/api/workflow/nodeConfig/types'; -import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types'; -export interface TaskQuery extends PageQuery { - name?: string; - processDefinitionKey?: string; - processDefinitionName?: string; -} - -export interface ParticipantVo { - groupIds?: string[] | number[]; - candidate: string[] | number[]; - candidateName: string[]; - claim: boolean; -} - -export interface TaskVO extends BaseEntity { - id: string; - name: string; - description?: string; - priority: number; - owner?: string; - assignee?: string | number; - assigneeName?: string; - processInstanceId: string; - executionId: string; - taskDefinitionId?: any; - processDefinitionId: string; - endTime?: string; - taskDefinitionKey: string; - dueDate?: string; - category?: any; - parentTaskId?: any; - tenantId: string; - claimTime?: string; - businessStatus?: string; - businessStatusName?: string; - processDefinitionName?: string; - processDefinitionKey?: string; - participantVo?: ParticipantVo; - multiInstance?: boolean; - businessKey?: string; - wfNodeConfigVo?: NodeConfigVO; - wfDefinitionConfigVo?: DefinitionConfigVO; -} - -export interface VariableVo { - key: string; - value: string; -} diff --git a/im-admin-ui/src/api/workflow/workflowCommon/index.ts b/im-admin-ui/src/api/workflow/workflowCommon/index.ts deleted file mode 100644 index 63ce318..0000000 --- a/im-admin-ui/src/api/workflow/workflowCommon/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { RouterJumpVo } from '@/api/workflow/workflowCommon/types'; - -export default { - routerJump(routerJumpVo: RouterJumpVo, proxy) { - if (routerJumpVo.wfNodeConfigVo && routerJumpVo.wfNodeConfigVo.formType === 'static' && routerJumpVo.wfNodeConfigVo.wfFormManageVo) { - proxy.$tab.closePage(proxy.$route); - proxy.$router.push({ - path: `${routerJumpVo.wfNodeConfigVo.wfFormManageVo.router}`, - query: { - id: routerJumpVo.businessKey, - type: routerJumpVo.type, - taskId: routerJumpVo.taskId - } - }); - } else if (routerJumpVo.wfNodeConfigVo && routerJumpVo.wfNodeConfigVo.formType === 'dynamic' && routerJumpVo.wfNodeConfigVo.wfFormManageVo) { - proxy.$tab.closePage(proxy.$route); - proxy.$router.push({ - path: `${routerJumpVo.wfNodeConfigVo.wfFormManageVo.router}`, - query: { - id: routerJumpVo.businessKey, - type: routerJumpVo.type, - taskId: routerJumpVo.taskId - } - }); - } else { - proxy?.$modal.msgError('请到模型配置菜单!'); - } - } -}; diff --git a/im-admin-ui/src/api/workflow/workflowCommon/types.ts b/im-admin-ui/src/api/workflow/workflowCommon/types.ts deleted file mode 100644 index 0f1ef1f..0000000 --- a/im-admin-ui/src/api/workflow/workflowCommon/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NodeConfigVO } from '@/api/workflow/nodeConfig/types'; -import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types'; - -export interface RouterJumpVo { - wfNodeConfigVo: NodeConfigVO; - wfDefinitionConfigVo: DefinitionConfigVO; - businessKey: string; - taskId: string; - type: string; -} - -export interface StartProcessBo { - businessKey: string | number; - tableName: string; - variables: any; -} diff --git a/im-admin-ui/src/assets/logo/logo.png b/im-admin-ui/src/assets/logo/logo.png index 3f919d85a5d1e093fd8d80ebcbe9987a3bdbb54f..36c8c2314a5ef80b6bb238c515f8a488bf5db525 100644 GIT binary patch literal 34383 zcmXtfWmFaa_x0S%1uorPm+l5Z@`7|D-3Uqu(n!OlJCv3#Nohd|=@6uq?(Xh<`2L^u zdok-XZ)UACdrs_q&Y4IJHF+#_a&!OyuoM+!UIPH=`4$8~QJxQDmlCVz1INMwo<))$0RRRl%1CK@n(q6dBB*pOuDl#Qw9pvy!WasrU~W(ySvXwti$ba?vaFQU z14e{zgt;Rj-VPWY9UWf;l*Go!P^f^#2?8_F`qecbiMDAS&Zl2B95H1qq^}>$|8(6- zaUHqIavf=PEr#EWiL*MLCJPpzVwtq+x&P~btz)ZFs!eIiKyJ)NJjJD9d-1yTZw5N$ zntY8wBfRIQ@5^ZP&_*R>?+*sAY`v?RR`0a9r$0ztF}z+ZlU55lln#9T=KLp4dM%o@H z#JAi@$}Y}7t^?JdUE9-KkI1wNJ86q7-bk{IedU<&D^eVr%HCX0F+B~X!mToSGqxD?yFSmEMfNK1YPiaSwuJAmMBfnB@k#8C-`|YYF!{~O_ z0AdU6>l+?(q(F)Fc22R(AMXth=(To&Fs3c~Ac@KB$*RMk0Cog;jMQ zm*Ali@8Ri+OEtuBOkgKZrY5Ch``7Ed^SaV#8ZSE3pycpU7eF8F_I*~};a;2f(QRT> z=xRELO&6Q32Xb(UDC3V70G8AoGuYCo&2sO#d-c)FiV^l9zRCg{FiArW%k;8a0{Ptq ze3uD*vg{!5KsUWB4|4Lr1Duv#amM33YO=jB7CzWt`0BL4W85Flr4UF7G?^F2Ncj04 zts**8qqRlC%Nx@NeE#Z~&;TK2`^@?S5l+e`CJ*Xnj~xyZ&9G7*-((kHTZzNz_?r%e zWBmY$GFFkRfm3fyZ))UiG7;bl=_LNc94fsta^a38ne!OXJhZLEaJ1w88XKuWizltDUc2x2zXAZFE$z4=jIJaRw%Fj7=(bF6vT;r}6eMPA!qOV5kV9Sx}4T zRm}nMRyych@(8WcHdAXNk zq*1d=Nqmdsx$~h)Mp*3cH&8pp%W@g4Hlx>iK0SL&BYGs2P~ATu^OstFe+)e0axGTG zOxs;qNEXzixHH;P`yGTJ(87kxpquL4h>;_Kq$tT8{-=U+Ym@4w`~)r>HxcA#B;4@r zKn1@Z;`9Ff)3H7YnO5Yu_ao4vsik&*1---sBErRDApAf6Nj}<`<``L-@Nl69ZM0{+ z1l;&O$!EDQ%?gGVEm_b?hDMVY_AqvGPQ3&W(9;~M(3aeUuL6WS_+OfDKRgFWMMGk9 ziM(|V5}eun$*_2#X&~3XReej(q3w6}gS&pOADO!OrG^_e@J?XmU&#F`o~k`d5?7kY zR$#!!V6*-XwiIwLNvG@Ba!X+H+EeV5*<8B+CeZH7691eMyU7-U$oqMAiy# zIRmI%6#P&<4C05mP!ZU>k1Ks@+gf$KEnU$)omVr3ODvmv^+F>*B)sc3pA@o)-Q6n2Z7rYvUL^2Mf$3>Df| zaFSQy^ywr;edkpd>)j2I&^#Hz!qQ1q5x1N-dadR!pd6UCKE!lbiYAxizc+26GxW2< z_E)DsKgXOPK8g|>eP619lzsM$)Q${{p^ER#P|BR|mqSbdyH|`uzkQ-Iz`n%nGTPSq zkgvS>)LwZm3kgn;MD9NOt)SfdU*?cvoQ3p^RR-Q~Z9c(p{Z)b)!I=?syUg6r%XEVb zvBVR`Ka)=tQ|AZ(xJYouP!%jdnO^-&3T^0 zbz^817kYNlw&c+A@$!%uddq=STaUF>egDDn!cZf08zxnCFu*KaMW5C)SMuOL7PLEP z_VoC}SM)4KVGF>;dplkFWLTi?en7TAc_&w@tslIhxHC~$ZH4@)>LP&QJb5A{e-NTq zI8%WtM3=9mz>~q8|3z(r00jRA@>HL6TwMfpNt!h_u#u}DILzo>kf(k7 zyH8L@XheiDV1>o1i#i zQKME1;G&V8;z7S-uKB(auF+;FOBX;F)9ggwN%S?;t=#$@*NO5NGt1yG7SA+7?m=SG zJ|(^%(Oh&VlqH$=Q?p9S%woL_LFO2(WVxBvHb6#(N%4tea~ad}MHbFdEUQ^cF>g!J zn8g?N#+xQ&8hFK6>lFV5&L0ikMh@WZVC=5Jxzonw`{sOfnfQjJVL8@<;&-D_4GKH8 ztcokPi!m2Zs{R2TNNybt?s*RjVz`Md6hg^Yi=qdPK75kdeGN;)^EO7UB!WvncsH{g zP=V_83_?DFVx|cJR3JrO*x9O|8=1in@oD~gc>E=aE=j^T*#&r!i$SiYu0>pL5*Yalh9Jk94=jiXY$gN!RQ?@y;FgVwF1>0x>_49N&_a z*)qNEWEDd0RDxy1J7;P&#mpR}U)R(M%!p-_WN;?p5W}@LUSQzQxV)Uo-Dxe|umvxS zVcRLIkmr38XZmN?(5iULki#_afl1wuZ~bSC2cs8);E^M||4#B$MW%g-Lgmqc;_ z2aZNW(M4xo@1}o=rH+tG4pJtkbKo+pl)d1!nz(_;X?;oMZFaJ28hB@GIG*j6ngT*B z5DSvHf;(3!BIxM7ZR)4EMU*9OF(OJ~cCE-GY zH*sFfoPl!Lav^ksX{uXVy*6kEYp9$R|KgjG43<{ z_@39`^jq0%>EoBhed>U<&C0)=U^eWs{YIwOZrQ3@`RvUF>|Eg2Yr zuB@WIoOhFO4pQdBWn76QiSIQsTB^q@h*@~`+DcD@ zHER?NJay|5;7O`lUSZ@#=!}OZ{y8j*fS1Ls=75NLsugIbY8YplD<*pqv3+`$1@S})6+X`J!^go&6-&j zCMUTci8yJ_7L(iK$ewDa^3(p~96pPR#HaB&r7{G{X{tE`#U}zvamUr}8lO#H>7puT z4hXxkh<>UmbK)H#H8#*=d+?oQUDMqqiKC11EZ2)WOCWHdnl5fyq4*QCWS(NkzQc3W z(km)jU#)UXDbD8cD`m|1*MJOdGGw1EE{4@i7srRmzrx}R!=6SX6z6Xgw`SX-PW=&a z@J_dSd@ilsb}zLh#t003``Dit(&6m+$emqyKk9ObICI!Z3@*;`GLpT^lQ+$&nzYNPy2$YKm zd%bqim+k>~4eT*!Z}+X_`!zBj4?-ez7)HfSefM_k3$p+rA7g-Yqau9upk#E(g_&XS zYh%V(>FaD2=f~kUJ3`SUlctZmLLT=FNsagri&M9qU2MtAS&4tGx75G?e8gri!urAe z{czlRGKTo$M;jaDFsOk-F6WI>DE_bVH1$lNM}{b#9hZcLaqQ0;^uwoUe|Me0%jvgN zx3>-jwto$s!jp~)Gm)iFn3)R}*BL*3rq^&>^? zRSS35sIVV#V}Z9-mp|3#WrGi)nV%(T7tgRhsBVx^M}21W8sPudKk<<}`}fFwOJ%^& zKP{XYdnuMi3{<)(k1<1PU%M(SJ$Ap)sAsx;ETl;tRmSN@>>BjFAaWR+^IHPbx^c}} z2jNcbgt3h=z5A)RzOmc;Y~DoQPD{-i*4~i0;XjXT#6Pm+aq=hhj~gj#y_+FR--G|)XULga?_O_n$n%C>^U#<%g0f9{2-c6BLbvnWjF95;>>L({oNdTbXqZ~Dxh>pI0>8G+2 zTpeP_QQ_?Ehkx^)SW)8J;Dpy0N02QLwENCI!0#~0d3xx_AeFOgv%-c_sAk_%i(O5b zC#X)6dybPw{^Zkc+P3s9$DE=_2~j}fxe zUM{4X1yiP>YEScW^?SW`T3GQnsZ%xPiku6#>x1XTXxw9{7%5IBD*av)-2gfnPl5oz zj1)r(6yhw<;08)p&619|nU&Gl)9qy0qU9vE-*hW!z3b|un2b%XY z=c|N1rZm$Uyl7pBQPZ>-`VrdF|InL=a*p}*)7)ig=xFQRdy`cRd0sC%CC;Vge#@tp zmv+AU4b74SrRl0dV{bIS7me&Ug=SG1>IKqD6XV+`KMUfJBerL-6{0?Q7qR2!8y`=Z ze8Zu7O8?}x-0-S2;AnR=iHOQGU{Sisq4RCiM&yn_TZ3uHFTf54fDy17d~>Y+?|o>n z+>>+zBoIXa_(8!LSejCHQ5-3J@*DlBy8*SxuHQN{`Y&Z<8Zco>f#+`Y>sen z%5pM!0}8q<5C}r(qio{v04)6p9Tg!w!2mAccfF-1O`D31=cLY+D5*#~(o^_tbV<4= zfg?lWE#*d{DghC!alh%OOX6Mbu;eaAC`K{m_ZbE*=bwfUXTeb7EUy@m-LUT%|NdDY zd!JW1ci2H|UWY_Mse^_H>U(5H-nQL?V6P8Y2kt`e&b?Ims}@C_<~7D{_k`-atN8CK z#J#%c(r$<4-EJO6CW5sV^F=-$|BwY%NQSuEbK7_*p|6k#{EhEM0jU)VBw#HMz%P|} z@#xZV^aW`D&>{W7urt76O*M+^i`(CnCp(-4qci&`ETc1XyYWibzgQ2b+B$yGs@aaG zu6E413yA=tSy)4K!htF3&&FA_$iIq>%Q-8Std>2NS#ym&-J|bc)l;lz!@}@Yz4wrA zhpw%6B)LZl@r}T;br4FR+knN~To+*kH7Abb&ubKfc*hDi0)IRZVLJJBVl*|)kOL7n zc_@n)pRM%UB-Ixq#OwvVXYFx40bH70@yt{|H$<}*)SU%IS~#GOY&tz_>8%0n&{hW( zC&mB*2+l*I+v^hZuk=PL=Ly9d+JUrSDYlOil6os-zd8MR1Tds&J_%>NluWYmRarUs zIn#80A^sv?(+&r!dY}fKCKxSr2b)Rltb;56jR_F54gfh_(YSK_E%_29re z&^hJ=Y^B&7Pi7s*kJcR5-O!W6OJYZB5O&!7OdLOQZuT&p!Z)rjEk5QM|Ew>&-Fg!B zT}#jEL47v50+VBoGo=h?OYK^6^JHwhk)tEoR25h3T)hElbVTzzWAx?(1nooiu@b7{ zREqC+Rg1qm?}KIcO1sgk;mt7y;c5$huV#I1`YIPE(A`?wE?Qcy$4VV1-iZmMoxfw*OHdG_Yy@rPVZnPaT#%byjR`V@E(=##qBjm5FE;Da9sNzp%AdrMq{98C87k#`uB&)< z`zbsuzC1-4`1%xCr)X$KSNuIh2ENW_?eP6|i#2<@YTq&VQGLk{^FY9xv%yKU3}be} zkNwi1#oB4Bu4zA^@|G?xFCr@UiL@A^Z%8?Ujc!Bx>sCnEtS4( zkDweEpl1BdXM3($c&3uT)RbVPm`$t06gydbA|}m6YsZ=B1%)5KFoIaO>5D%nm6|jb z2PN%-6x1ov`vJi_ovQ~lf(L#7GA3HJ6pem<)yzW>AXlzpz2jdy|8Cxr^e%tLa>^`L zZR1^YbF4{fS?XHtLdw-nx2Fp!K>X`#mb!KVF} zCY!4ZfA3BkY$KIIZXJ%Y%F% zPaC$nY8bHmM2#w5{1lsqz=v(Z$?Ln5+6CidqYkr7LfwhXP~~kAlt4+zmst`9orBRU z3^5Oo7doVqcoFZ~r4NV^m{>5eYgu9`Tn8$qex6P*;X}2;M6TX5(|c4yC+DK?70DRD-@w$*9`#gJn`l`3t-jb*!56nVRH~>)JejvwyuS8iUT4}w zEQl-2N^ej6hl3eC8!66!A!REJUz_DU)caN>0AYwi_XB^Dzp|?u9wK@|u&k67rHNc< z_AP)4^L{ol)Ki@eM-~xS-4p6LSocZH5EWP!BXg3dEz}mS{jL?JIn?qZHYc3Y_u;nH zXF~F4&|JiEIErjwf@Q;hC{hDXs5FhVhbr{RqSv}xg17QVd{Nj->8S^mwWl0&A6ojF zhpF@-j{etZCW3G9AJ%TBuEmiyscTU1VaM-!K|tpy!b=m;&I#5>x5+RWT%~K1BcUJ| zWF_crZD0FAWzzpmxOJ>55d>HM6uGr?q1`&79RA_@OY;0atAkQvWH`0=Ldl|Fs1Ml( zIpmf2?L?-e1qD1dB}$tlMk}^ggSB2k4Qboy`*m3)?q**TEyq0z^4~RAY~WbtN%~KX z2}B@E@@OOy4mmc2f`OnZ$u#A*0CTzp(Hqs(Kq+Jz5M(|xjE^D07s96kEJY)t=kgprxY54C++B?>=XcE-Br8M0bCG5~;o?{#5xA04b{SBY`V%An&qwR~(((oAn z?~LcMbsq#CBIq4vb2Tb5+SkcwBL{H5m7*Io5V0+|b0W~OB`83-g1_t=&8ptd1~k9n z8#Z%fG^tv$DfT#_0D@SLd=*kp|E?4~`RFb2AMd=FrC zH?G|(S;zw0ejIZPK6@8CN#ebuCGIFJ!3tmQ^%n`-uQ0QH*2J6kJ4n1J&aOOl@~T+= zRC0wdB508i02t>(yxnoGNpl+4)5&?|7X|jXMY)>YqQQez{bJ2yTG6s@tFcYM~%K)36D-`qM!eZ z-g&~?Pn;C8MH6oa)lO?pTK{oZ#);8uRr>N2ycrv|_QHNT=Z+~-4Xfz&O;Y3Z+U!Hm z15!vNZw6Fu4<5KjW&DxGvO-Sw`uLKedA;Yf2pI5Og*NFTU*!bP+;BwKpBoyeghNYd zv(FGU(qi99p_-8-mXoDUW)9&3C9h;AudV29t922M3!=^gX@1*5L4F%WEq1H+gNJeV zyWdlJ3$xL^p;ThB2B8JBFJ9C7O*@2XWtIvFmwkpzj3^NCZ8TB=EmDdznmaB8t2k0i z{^wuZZWk?W=RO4|z08+CGoQ)>7R7vRb~7ySRMLCq((ZVG&Lgb|3uFf3zzTZYz`jwC zHB`iNVwDk-x+4b@s=eBiFuDC%kv^R^mWJqX@F0OHL!xQMhWuwoQ?t`acW_^3B4G-4 z&p(9)GUsdeaHl)R70Bf34~a2LXJkWz9U^PcG(y5byfY@9JX!eq#S+3}?%|%P9^D?BLfw0g+& zYU@qJ09!@EB0gHMV(0p{7_e-iG&t@3u!<2L=U4rjyXPPDDxCV`#j%1azsn#S zC4Q>TG&xb$0EI!e)eRCt^s1uNS+wOM2#b-t*KGV|lSHVfwZS;Yd#n74?POR9FMOlt z$#+GtX+Mu-=K)!{YZO+&h!~wqfN^m5@G~XWQ#@R}3~=%Lm~i>_f)hBW%+G?yQ!rUbj&-dfjb@ zW=_TM1?LHbAao@h!9mEH@i6M2h0=q~4-|1UrFIvUmhK! z#Pi^FMYrnt2#Ylg$ww2jW`LV}zmlTuvBX=7MEO?YYBc)!l7SVIX0&{T zZg}O~p6lIrGXLxEX3M-so(@`WBV$9AG8>=~F7nh{@~XBhq6hK$P(24n@SM9oBxbii-Qqkyz>&M;N+H zz25b%Tka1lS)?qhBE@?%CUqv?72Y9H#rT8;dx6-+gtpt_hRVM@4yUvkDsiR6)T#Yv zBiwPmUe{+a4n|)CmDm%Kh{TEYU}dRE${cf4cyJ^yJRd-{qY{ ztFB%!qP-b{fE-_!xx@04#!p=%T73HU-66Jv%)&J(}_{?G4=-1MW)H^}MuYgCK+;b0z<- ze#hUVuI7V7AqOOpbmRciwyzm9FOlDR@j6=iZ_p>&-YYxewK)=oq1>|7ju1{`f;o_A z$fpzF;b`y4Am4DP&vVdP*~pPlnOg@F3w2iNv^u9*7bgW=_`CIn`G3n3)GEw(=(Y#u z+2Hg~=j7J}80YFqh!HKsu#dhC9bjMJB?e-=%4HgcEq3=bd#ElL7p*AB1J1q6H_4ao z_#{!$0qEDE`!p`==;c7$qy94K6O8UX)NT={00a)+=QmQ-fPNYg^pCtbA45AHWFbn8 zRU7KEr4PI|3`|K*5wsULIaak==KBNIJ~4f85e+0PH_;RSX(N9Too{?z?lm#AaC7Ii zw9MMd+d{AIu=D1cck?y_`Sb@6=s!W7$l7r zfokB-v3~ug7ryvMhc?v!=>$!h|0dp=LYlNTd)zP+`^Ml@EkSm;sY$~`I8a#_hcI<~ zO7iwr%5Rt4%DI{efa_-TjwVQRtRuRpp(8yw*9UH28jJwbubUJcfQ>IbHSxiI?M{>1 z>|zE!@mUgq$N)XgCSeI2)M9=7*RF1x?{Rab&T(jSMiK?_zU5s6ZJ;5_4oTc!=k2aQ z9u?f!oEj*H+Okv%X3WON zC36Ayof3sD2EDqJ0o|QN8@3RfpZ5NRKXAav$91*p1W}zOVr87oC6MeaWMsWEE??La|6}EBp$cmXfYH zJjWlzS-*~~>Ny=7V|fGo*9o_w=sZI@nuU()v(N**oN6T@VhA zQ(ABcwHP#UxMTR+!iq>B3cqLaU0 z)HFYeivewE?J@jEVx@vYsvnnsd!1^r?F=s9u2hz6%)$ciauj{fDRQ7}X|Fb~iFBzORr{lB{A~_oGp%-F8*Br(1DAdlqx=LjdDFzMTnLQSR zBBkf@T)0z@Wp_I<{j<^aF+UEU;i=h}wYuaZ*}}~#h1?aU*@AYE;pLZFvrYse;UMCw^GbehK(Y13)zfXN5D8z$2mR|0$8;x&WW3~G7 z$89Lyw^V#(sYb726ZbAw-G=+GY&Z24kL$#%7xdiE)JY@xbKD;jneXCCfEB(gyr>ud zigEKfpc>_~ZI?nR8tz*uzzhCoGM=NhpW-1^P0Pq;GN>WLwNbc zh{xQ}I8)mp`Ev&L^=ss`Db~DC-pZiKi@zygVr&4aKfj{QZutOUkmZR!cVY;!{`p%-h?-MB)-@+9LJMHlIW}me08P5(5i_6 zLJnZ#R)c*`-&Z-~b#6y{fxF=s|DVNc10cxAOElxolGj z_1IPSy9{iKAHL{=%D-7hr3eA2Il<@G2l#bha}YxcLLUMGNFn6rc;?QZ48RtkAB^U( zcK9f@7q^{Z&2;$}L3}VVX`VsP~K)a4)_a(|9NWYB~)Za;4C@cM|7=(3KXHa8{ocET|d`g&ZLXN!9W~!M) zJ-vQnZboo6bt=DDGnd5Y@lG$ST zA$~mnpF@#vi9wg(Y=Yl?ST~6;XHmc=5TI5Xy8spSX=rhvL9}g{bu^R}w)QwHlH#Wi zyua-#3CBX%rJo4pg%u5QZ!p?{tK$Hnl`@ZL&}3kw?7*}1yl1`xxsj2h1YW_P?fL3> z8dV^<)SsrPzEp>#n*eOrlqo%ur(6gw$mi5hVU8}-N3e^cE-D{p`}tPD zd*mM~+O-fvogOYI0Q*#s4mqVSZXZwr5gT~k+1Z7b)(}Nho&=k_X5^mG-s=MpSDLjT z6k`8JMX?H$7891i2m|77)P(+!Xholr3E42fnZP1%1e7bDl_A+2#0q$Al>Q29G9>W* zadu1$4@?%#F*v5sAFW~hY2$A%rMq4V_sxMrasuqR`bCjOA5W($fGec#VK^vq(g4{6 z0O)9Oq&`%;nK>X=m~#zBJK`WKaomH!nUO7RosvY}(3ba4uf^LiyCvBse_PQv!JvjT zXMww-xGxn{EX(oN3*EsvACyS|gne>;gY5LELYbIIF+BAv9Etk|8GviZ9=~fDVFzwF zCtp*AWF!AlN`)xvo5DI{KucY2dHP_c`!}SB{aNmNm~ko+qP}wkFIU;s!}O;WYp$}N zS29g~Tg;jJ5`64-^!nmnf?5|itwMb0-OmC7B3X$2d7tEXV%TT{}RX?>suhTyvKU#aeu zFYo!ynBle^OCaL!(q%e(sYV7({(?ut-e(vsZU5$OQ+&D_+`GP5F+Km@^-H0T=2X_u z@;hiDZS3@`y8(I{90OW?$^9c?uoGrN#S(;*HzIPsS|b^GPmXGdH#D)Pgq& zr(uidjSxF`jrD7I{SUO4A)>W_%rxyh-Mzw=B)!h=YzS>iVJl?pr`Glt|Z%`LWsP3P^Ex*mBYCr-JYDtx3uNUv-(?=Xn>~Z+%%Vo zXJGh;n?4Ofp?hj=WC z&nUY-0}O=ZL;@>)ufqXw4RY=*jicGmV`ghW>XSp;6WZ)UzvBd%Fmp7lE{v;exsbU1gSV7NW9CobCvcTGPq%Hnxc~BJ73mDg z?ME}9+ACm2TQdyU#lSrn>EzCFitByMzq!$So5x+-PGYyu4CKNz*3X!uQ^y<~enfv1 zJIA~oy6_n7JKMaXlp8XdRV3_(wYxw<4l#gjwlky>!RI*>Cej}~=m8FM?n@x}(t{la zl?VoP0>~)g(yH8Fn$1~F&im$UrV85R^&T%AzO?a}na(SYf3lv7B;4)=VB<8Dh)87f zS3m|>B@^+2kY^>lJ)8!^m+l@L?Dy7&XRqMK?eNGUe}NS0&~ip=XgDXRr|Ut7vti)D zf}B!tyXEa+1|&oxx^V#J+^4tD$EVTH_u|3WMA2e(!+G#42txl_3$|)sEQ&7JR6PupH1H$jk_xPi3gCZL?KuM5#nW|IQfr&)dk zfzSZp$@7tzcBw*hxFMB7S;Fx!LX{c|T3uHj*uk%5S{yub&+2EDp}M_KfSrHvVkx4m zn((FMbH)duyO{xiv#iBNylMXceB!ZI4ggoGNxeY&O9FcY&hR3t+JW{Ihm{ExR@?-~ zCd)c``?VO(988G0A{1^ua^>y4ANn-5w$u_K(Key$w#kb+nnDquRQmh>_%!RNDySWK zFhr7A0B!CIU`AoC6$}Kwg|@?&0o?4VdpA;q_=2Y}?5=^CoW>kMW%eoF0UB8imO{cI z=#`ZCMD6R1e{eVBe12ewQy3do)kb$G$=w{Tm74*E7n!;r;H;pcq#?tsksvnCW~`() z;O?Yqx7sAFFr0+t|94rHmp~7EYEX8nU zty~Huc$iDsfzj@^AA* zO$tE8yIf{*!!-wC^CQ2|*&YnraJUlTYlXL+@&*&7!SoqZ z2@o0GaeAof6wY-sBMOsY^VkQ4#LQ0=3DjoowC8#I zwj=-Y-1*U7El`eilpo0bv{~*02hsjO@BWJ_w~WI97}TuwQ=N#Zy!Zmk!bK}04%EuV6U2fQ!f0D z@S73I%$wpWx(s(%730;XE6m}?i;McZ6Up4UYw_Uw&;on2&8ZJX@OThn0OFD-6gcG^ zi1teoPnD+0vHb4@7x25kI^33{tawA*NlpZQZ;;^ zpw_&tblW-Qukhr(PF7};(&nZA)9h?I<#q1XA27q|yugRgHE=Mb9gXCXM+W}FO7 zczN(dgtTc_7xi-7e@^8fUY&pYBt)!oGyL2%G|$b&)kOzGNl8DKN)g|B8zVt^RMRSG z6(;eQ?@lky_s_}P{^IznihiiU^Sk;{HHvNIklE&>ofmLc(#x8F1YfH!^_1rX{US0z zr|r*$RZ&B6+rb*qa4WpGE4V;A2_6|KyqW%)v>Kt7oj7BC!(pbs!+)y^GD6mQ?9HoW zZ1<~p;p;nIUjIZ!GI2QfLC*T@boJW|AIl~;rOtkv7@z9%4=EwkRs+R0^yPln%XK!M zk}BnEd}2&ifrUCe)fA-U<{HbyAS0wxblwVZ9m@K5i}_Smxp`Dv^AdAnAPnsUw|z-? zeI*b9Mgqdng(dIjwY~RmO6#wR8@}?#&E~wIXbl8wYTt>aX~Dk2u>n?p1qfA;F&goB z4cB%`q=F>%U%hY;lu?C|JYtzmA7!6_<%c7p1JIRLyoc!PRveL(5SjY}ATWU^3hKTE z;Uz5M9!1~OcdE@S_b$i#lbP^roWIj*hrrvcXK&`ZO#TnHT;+-ldW)YLdS7WU8qvf< zGI6ND49?he2nYzQh{R0WNr?n=lBaD4cRIGi>M$(O+Sw3QFhe!tqPVWN5$(DF4#~1u zH-@}28T9dTbmIKF+tzK4`Sf9Y29~Sq_{Xip>&J~z z#aARg`bgJOb7xd&YZaTn4yAHujUnmZn=-YQnA-{S9W=h!tH+f}RS+E)b?ZO3M#9GO z=?ZfMt!cTrf6cv5&2d35WKA#vl7%}Vl$Neze>eXGcMl2<)?{|)S(CxI29yKaJERk& z9swk`GTae*dJu!<%y0+?;pBxx)bT_Klpmv@=FL7T zI$%SI!f@ZCrMZs6L6)c>N-1bkvM@Rkracy@&6{!(R~Q!nJQXz1eQ-;(G%~|mw10ME ze0mn3@R!Kw4=#XtnSD#gtlPeX=){lM@G-=rpUrR(qrl0<%=t*MX+b2v1bzo$hX*H? zQdA~6>GDUX`r5b)%%e!zkkJ)t0 zJu;dp`+c>707ML{<`wV!Aybc0YqEpYNcdJdL92Qu?(Q-MMNrZ}1Hul^-a0=fId)%V zSr-MU5MV$)GiVdWVJ?EF3j_zg!~sETbEL2V>9PCgf)$T~7?Q`y%kg~}{M+d94$DBx zME350C+Y=d3kua!GpfzyJtJEJUE1hhTz>*Rw60?G1dTuxhGj!R@rWuIEDnyQobb1(-&3I0zf-C4-A30QweR~78wr^M`=yO(reF;JYF_MxM92h0C#mWE$H+Ryj`vvbM7dCTqEnN)eaLVBvpoftrxyNP z48u%PNXK&%YFvDpKqJT@O#)G<1P7ug;s2YA3I?<~c$Q5T-|yv@A6a;XDLFh| zkF1k%95L+!L43;a?`^+k%U?n8JnK-pHCez%*wUzwOihVla^?}mLfuKuAPBC-9so}u zBkuohgz^#)SZWsMmyM^PT=YGfsJ|^k+TN$X%9m)R@JLY&uzO+Rvvg*$xYmwqQoJV& zTf*VcbaxL7t7>KYz-vLZyVOY1D&)c2dVbk=zH(p0HeK725Wuq*9H%GFosLHNs!kN9 z&z4kFG%yN#oQ?#LicuXD)G`}GE+))W=>Jtrpo1sfwdS_#Abvc$YAFAR z>O08?Q7e`~4TW~)Am#JvXva~nDKWU~)|nG%yeAym#t;l8w%Il;9}n$2l*(DOCw-$> zLxVv)H7?HGqL>;N@X2b}q%a6GxGT$-MR~V-3x&uE8EIHhK@k1#>3Lx&JFp|3&I<@1 zOG4h^;Yk~(Tx0#0laSHR#Q+w1a5Ujlz-iIcPJ(My5ido>pw9tTfsU8r@n^%uk9!*) zwgWL&UiYPBjbX8 zZVYI!;z#0t`#m){{YL0rua7|TkRP-mBBxAOt(e{gPjcc9odd_a;=^V?*_HU;;-2OK zO}q8t+s9^c#Z!{{=HP*w=1Cl4U_fRA)@>}LPy?-vY6wAw!j`ddZGr`49SoH!Md(&v zEc-uqC=^%{%29~21k`_|kJPYTGM#hXpT_h!&n`5O|D($$7s$oQa&K?o7<9tCUCrD7 z6F5vB@-M98jg6YrC%2>zb{G|0pkk*vDj=dhhfC(Yrr?>3c*OH>xAjeRvfzK{<|{`- zRX8{irVQ`7noWc#q$w(9%(5bD^Kqji-QH`4E)o;}mZrlFCko{_evy@Co&wTj`TJdb z4)}UM#8J)0pXr?C%41WR>OK5G3H)_%$nWc^)Kx7D+-`y^dkU_E-=kHfP`6$q7krSb z=&?g}tHYk@RIUJ-X|HQVdQ<5VqO1skUQl*A$y5+NIts>?fng@3$Nzsq&`EImW}E0B#e0&=AS0hB8FLMy;mEeJu7@Q6EFF-hw}) z#L{&;hQMBdy5S$nqd(cj+TmuMpWZcQT3s?nZ&$D%<=sSk zcBu3Bg=b#w>^SlR@Q8&!ePryI1mU^plIr43)q}XeD`c@$uRdTB#DOG))*ZQ{E5&!n zjTE6`;%b+hKD-y!=yNEL>+#iV&}|@w-tUh+xkO|ilE`s`0bH%zB1|-1-77=w_Cj*o zn%OTq>|3k1tggXpBYBdAdlo+d4=EQKFHfrD12{@5XZSa%W`|m8Q4G}M-A*=dM}JQ7 zhhF2yp}Zb<+>id0qp?`8-i_h=1JLglO0`>nd|v)0y^T^=_zT?%cj}p}XJG?sCkmJ` z2vt<|!$yL);$XdBJTS%|rubEYR3_r$$eH2_zjWcIUT zakuT+dRy!oaU_=IG4gw9hg0it-1h}|3m<&Hx&7O$hjp}N(36ogIXZn&Zd)~kGV#aj z`+0M?Y2MRt8j=tq5ZH|ro90^)L_W5O(86^##m=Faeh)qP9CQJv+$9KxUy3MYqc)Qv zd&2;R*GII8FuZP0UvBAl#DRrGszc#W&Tf@L6&Y+VxYH(wu~Go(6XnCs;#MgRhUET+ z>iPe60jN6$<)ZEE{`tzkRvc;TPeNQS+Uz+sZ6px7~T1U=sPa>6pv_Id@d?y5*(aaQqV0R1cl#u@ioIx@=agM=4OMJcF3^0g=ikDm%T&(IBp2Ct!4Kng#PN3I{36jF zW7lC#UC%$>6PPtNem*YuaPOKTefNu-(mNk7qDk+}<@%$poCW`U{l9*#*eaz65G()) zzgq*ALQXjd#MJ0HVT>eu@L>Y&a_!ol&#L)h0bm%Ae$_U9%@$wt(O>$XzlVJ9`blt7N>r03{_#=U$!-wuOo1WBGS~0CE=hF14~?1 z4`zfO+w>l40k}A7zl(snCE#Kj%zpy`+&71t2(rjD{+I<|LaVVFCt4LA`_zGJ*yaAb z*##bjyU^Or99s?>MC-57m)`u)9E$SNPXaOFO+nAn4Rsxtc)v&|SNpg$9}%!UHP+|6~|oKoG412wQd|PJX&hK-UfE z8iC|Ppl(T6T3b`#!-Tr}5#wt;?r&op}fliD%>03f(EfO_2d%&Rn$mmll4 zrv{gJAmG5@8ua*wDa1Al|*#XBRN5pz%ds?6ZW<`P)Q#WcmkG$K_X7 zR|^=p@MCCl_p`6jZ|?f9YX7i2*xn|@wFy0|e(^)N6EN2PvH8E;xGgWJ%Tb_PIsvOh zNE6W(s;39~h=@8vr`>cxPr8qEB;crQU?Bbhq_cQ2<5@J}_%qL*;DtK_eKjFpINL}2teNvG1tg2X~#mvV6%~`f(IQa#;*1Jb z5Go{e0TW?{R!yE3F^++NFWf;VYXzY3<;>)jApp)g=4X4JucI&cARZs^h!zyd&_Lce zpw3A+i!^~^bv?3fLXnKeSE<03M z)j4Qk2(Nkh1q8%V7_A(1Ffc$!9EJ)Uavi1%6EKjX<0^!@p`N&BZH?;aLZ7X6WARc% z)aLAS`E?5^5XpY(i6HM8!7sysvWONI+_Gfd768!vHC9`N&N%h}dg3p?qVJt_Fs-rb zDk2>6PlOtpUmay~#<*JImHC5km_P;1DhU7**~5fX1YdvtK0zYfW(mmDAuItt;}^{q zgr&wN{5nXS?nA4s(pQ1NyyS`S0}OOCPI%DeXXZ5Cs1xuoJ~0D>?|MMFDF93<5B)Z~z@dYq<^#{-KgE zOz9L>$}`PU0DN1!tX85`=B>}P=QMdN=b=wMr%E7DDK1-b%dfj807Pwk^Sw{xqZ}P^ ztTSkJI{)j3(?i!>NXH$p8};FL?i1nX=`$HGt0kbj@p{-T1=IWv25KsB)l}2Ez$HDK z)!IHSr~>YQkowHG0|A5|Ul_85MQS0yw}3bU7yt!?U3?4x0|f*Hiv)NOAFn7x{oK>v z6e#4g0qx_u8Sl=bMT?g}1%TrA^E~6Y?7h~M+de?(ng9^B|CO0@3BQg!HW<7XU2^7E z>ES<}O9$<-oxF-G=08@|2>|$hd{}0y3u(f3T{dJ;ivSjb4JUN)onS%e=d>XD&_Fe} zjq%0QcgG)uS%(R_^_U8{f(4uM;v9^I5eyPyF&Iz;pMe1d$^#(yio)#5!lar=moQT< z{O#j7@WsC-{F^fYC|h1Z&NWVG>~WF?*CA0-fnXVUMo1ck+gMf3p;wm&01)!me}9ga zVJoZ-JV5+WL)WECzke)^|J}D~@0~X#e!qr=-@f`AZP-}`0sshEfMXVc`47Z`5UZd< zMNJUHZ~%QRvjr}|dUowD0O7*`0E7s>3bG6j#DQo4f@_Jh1w{rDVi|B4LLVm-hF>IU3Kd}5`h+BS1?v3fWCok5d8~6ZD4HANHOh~_p;hDo37S% z0YDnBEuZk>+w_~;pXK%J9SZ_ZkW($@IBxM{}`i1%y5OdAHu=Q{c&a z_HHq#uKer0G6L#QnrokKsEz&9=TP2X*{qMV>= z;N}OM#%JD#3Ka@}GKhnUMo|H&{FzG6#Sc`@8`xKlY^a2*P}QaotLI*Rk6wNEV;aXR zwce@e}u%&Tf!l!KNew;1zK3mY>dxScKHLu9sl%e z^zTVC=$Jh>qoY5+B@J4&Uxx!h6?fVWV~5i%KN?O?P2taa-|+-JIrVL}K1|@@`4>~4 zH8Y2?imy~s;S(j#hjs`rv*mx<0Zw5EG5*8w;(P+(5kUTamQ1W11aEAEDK^NTc5WUWuZ%~QH*&=ZK z!!A4`xZJ5C&?fNQ!7BU;0;rmFi}j7H)%S?_hJ%1MUztXVFj`;NuavW~!9yMtD(KOp$8zWFx&@~Ru?_WK^<&&e<2{(;tK&NToK!H>1K z4asDPC%+gd5H{wJj`lEu7M5<6&TaPr*=O6r_q1wvew~(q%7YUG#T01v+{N^>n;xYb z#y>+R@#ndZ+IxHI)0?ODI{1J^uNXwwnv(AR!-2R-`=@5bu@08K1E2%tLUME>MU zLM;5)=ijbHKD8kd6Rs@+ho z;-$LqqNCfe*6OR!mESp#h7RH{`_}PSeDK4ky!>-s@i+c#>QG!h+c`)%WYh1V zwy<}s&C*shQT_;H`81z81Z@UDG)ux%VXPQA0l`>}4FQn9oBlDqa)GbRJ?O7lAIzq6 ze(`(S`b&q{qAIpa``c237iG`q!U$+XRuep!prwk$dpyA4OY)vd@ z^+DAdn;)<Gv#o`E&6DmGiFD5b%4&!-OcjIcLHH6BinI z{=&s{|C5vH{wF5U>b%l#jB?7?&!z+^{v{k7v1;tRLxZ7n!_B3UKYYlZ-%x} z^u5S(=s-ykrIMg_cpNWu*9Rq9nE?Q(An44IXpRINr7Zrf&rZPowiy;2e=hVmOI4_0g7cE`m-LVclCV|s$HF1nenT_qVjb(U;nf0@ z%4@EW0%Lw=U^w8!d}0tNuo*sm#(Q+?Pp+qJ#tfmej`ZXA zEhwERcq7eh3q7d8PLFa*d7x(jz4k7x2Dp}>NLi|9|R=`XwSFZAAQc9($< zW!#QV(4n4MW$0r#^-OTVlPt{mr9AvB+;WX`$|{J52gpDBLwV?6oI9$AO0QJ2c{qic zM87G~QTetipTM=+FkxVCp*z1+lj(c+APkSWjX;9DG6vUiI2OZTozAn<-lD_4`+NG# z)*I6IPdI?K-eiPm!1f+^k6^^QtJ3qY%;YKnbgXPHSH|01bvOWFE^5oPEulql5HT9K zFq^nblf}pp$!10pu+#QCIXoxiugqY%c;>3cX{&munDLgdS%M$2ja$b|U1M%1ZzM+8x(&4%2`-%?G{} zUJk=I&DXWQb|^YbdM)~SZ?*0W_TqddS1+ULiPZ((j84^6>vHLo)WW%zvxlw0KwPP} zp`%#+Jt~T?PLf!X@>f&=Z-TH>cb(#m-@KUswu&* zM2|{wR{d^$TFef;zm30N9DJ|6^^WvY5W)Zgps4|Z3BCY;2rqv^0OHNw{!(;xI=M9KTFuVJTOh``h~SiZNt*%s^7Z#t8+#ke(fv#^v12rq4QFs zeZssZs6MHtC4%^T7iil6LUGvq1EO^$j00!>ab9)2y!W4vJkS1tiFD9jJJFd(?@L26 zn}ygzEjr29cmM#b{YxzLGS!B&X?l8DQe_D?h-LyGYkVjp z5mYN*C|7Jiy z`k+Gpx1w*jHTNO806=}AbT=3AbrjW#JUTF`Gp%O{=7kxI8b!=3OpQ1Qi(3HvOiJb< zgq)_{n&Jc`e#yte3zyWE}%1v(We&wfD&RFb_{Ma+k)6f2J4L$zs!~mH>1N^{W zuK6*>ucYxsSY30g0PB)pjQWQmo_|;ecoxq%2=;|01LpG&pVvkAXbL7f$MGpFD(mgwI-yl zkuV+KlyEn7uWbbCx=(?g|K;`i7hm=#n(&mpV8*l!f)7Clt;Mug!FMx1O!b+gPEGc5 zvtNZ@Er6i;A>d&O5I|sp?@mH-0^;XB04+apJfegB2fohIxGW-@AZCdV>!|KwL#Z{j zb$kziz-k!#@weglXf7`ah95x6P@V5^p8)zPUcH6n_$ zAWq8j>;vGizyj9Z^Mxdl&UC`XXI{7gb6b822x7jq;TSl8R|A59giaOy; zK?2^m`NU^N9dX^$d_z|SHuC)Pju!rIq_N_Z5eJ+kl610OUL1uu+YiKK3jjj_1qYlN z5ZY(~=;okY28w2aj2gBcUHzj|Xwd2dT16fJ!QR^pr`5cdKb6?)! zw#p047}h`lAOsA6c*YFE5U`4HAdHZnVF}2Ur0H45jJMyVU-Rm{zut8ZE#$4agkEme z8*k`1-^~3W__#JxTugHXfiOl7Lhl;f1s$*YMy7oX2xVdO9hB_|t>B{$$4D7Sf156+M(yY1cpAe@Y>dR+gT(r+X488-|Ax@Pq?_Y1*LieSGgiZvq-NUx^)dFza2ggB6h0?z$4ttON%R zNgE9%pop-w8|oOX+L z#D_x4I94S^fexu(SI=bj$8+e)Ki^7!;NQIY3#GqPPBaL<2$>32GLP>X-?eh0@q>vU zw7v;_nMPN^$2xv_#-{aj*{=ft_ZjXPxad#=ajx}~J{FFT!5uPSvJm>AF;Hl4< zJb05w;@jClFhu8jobLpPN~8I#kQ+*X01XxpqM)M%8~8#rGoJ+!aE%1XkU*^gZW>zw zOW6yLZN}R2(opYS)%3e_Po*8U?D*vq{dvculRv)|9klZpx^co}x?#c;nzLxB`Y-@s zvH%L>4+S^{0)PUpBSryE0Zh@W-T0XM$$YxzuXoTDH~v-D>#HT?g06hvroMXgaSuv? z&+c>+p@g7a?BF(p$GUCbwUH&;!_4M z7k=qa@OF!jT7H4`>}={R0MHvZAN$zI!>_xY^FAn>c==tUVL{ZRV$Bl3Jt2%9qWOhz zYz@F6h%*C#ynF-AFH;2&4*t2&aCjMmLj!9_?uu3&MK0sQGmfKucI#Y2X&`TO@~!>0 zr^9yHl&-%21-j{xDYTe-k&0*&*BZkaFpmsz5LOKb> z=Fjx@%=b<3Rp6zs#b09mZnROMbKz4V1r71abkO$V;KRL)i66AS1A%FK)A-^9l=*+; zuV9h}6^_ROA}&u%ei8EItiTn4fbqDVVqv#7wy;Yf4P4OWFC8&vQudKD06>BgE&E2H zRP$M`&|29Cmfv*--J(mtK;UU7k^lxoUxx%D0Kq{RSp{MdD3ROh1GwUXZ?VH~H7+7k z$4(;7I;;1m9~|;&I&P1x=(4;2OaFN4f3yf6oB$)?LndMoAPk1mw#5LcyA^j*PoZ?Y)e#1Au9b+rS;QBlv*2ebhM=wDa^*hb5&0c_>%%z~i;I;IWBTI~2+5yyH1 zSD_ytwHqD#xh?7P@z3(i!E01o$8BPZpdee7nYIHnfvLQbXlpk(YL_jeyB>UmetG5f zG?_Qubg+wsU&DztBo-0`O@!REuZPV8Fc~~?(_NTzv z03ZP_18y||_-`!ynT~6v(qSp#H~s35=Xw7Hl~|x603hLOHy`)ckw;v+2fx;GJY=TQ z!^E zUR%@e?s}RYcyWf#N|>e*I{2^$6v5i#mH5DC%^&#pld@j_xye)6`a{2S8%3D->`pz` ztU<$?<`ufAxgSsI#SXq?2`{v}Zpa}Xd^7LU!vV|7Edkf`1~9Ja#oQOI4}p$A$?B|H zKP~*i(2WUsWATmmEpvPE{7DCI^6$oyGztLVo7!b_PVZeaXe^U^M^vk^OgcYa1v^!a z)JCf${O;9@YN@^feO7z}01YQ1pBFJU*70JRw$24~e!Ckl0h^qR9kv!-aoU&Y#W&ug zU;pE2US0SO)$eSt1!!N*w~nj#>sNj0pWQFl%68rFqRwZ3S7 z2y7VN+j!lyH+JBG;HSLy*b zGHU=#qX2<4qCB{NN-QY#um)Cg2N?iutC8!`wP);4PfmZEet*|9^xs!!vcY4T1&!wY z3Rk9s_oty}C%r^Jzv5ca{Pi-65ett3fNNHDrX_->0_aXS70R;dJP~I15<7ZcxdnxO`b7ZXdp|U zSCZqU|Gh##W9Q!85C5CLtjjYV(oqU#>d`kK5CMb0=}*V{X6l={AGEZa|02j{*2e%4 z;vztBp*O9c%-_ROa81wUA&mOjLLL|Ru>L@NF{pEeANNV{UsUR!z`vDlHW61UJ-?`a z;lZ=^8`tdHZY_qE;YVD%6>pI}o*!5*5iGR8D`J88I?i3f=`>1^zZBa503ZNKL_t)T zs3CEhkUX0&vhj=|cG=}NH4wehA`|Js}7)34%>%LJmiZUUPT$86AE9(&cS=0eVH!**VDAYI&09Cr|;hh zrF2Y|u)<#F{q=wLhimC?cR!E_z6p*FY0%L=<~N};jVr|sIIv8%SVjieaxCa;%u8uJ>tl#w=5Q_@8o6;3yI@OT3z)X z-)N@N?FRrQMz#u}d>b{&wV(lh_C;TIEUiDNAKmk#{TTq7HH0+FR{q8M^JBjAV|wU` z=d|NP=N4$)wFl8Rjyiyj+;0zFQP{tgIk!AHKCQlZ=`tG7uXoEIT8=5-;!kM*me=e5 z`S!b#Ew+Q;gNImPvQ9J?bO!))!Ua#iX>FgAcR|-NK7<*TKmq{aMV?sOo6kVr7m+Zm z3pep0IQ9O#3Xu|wG7{Tb~nnElM&k1k#M z$wAYP*@0I>wd{zqZP63Mj<|YcO|j-LT-WX7fw+>{>t-t5aRA`NaBYuzahzPL>qr|1 zD*ylhD}XJ4fqiLwCjkJqnELjGzoi@RxKFFW^$BCZh`~n;9ZcUk_A7MA-n;ULO?qiH zd%)ihKKzJ&f9=h5-EIG%x$}62%9%eUKxW<}E(n~N`67^Jio3A76%d*EsVTflV}1t% zS-1mBz=S<(QAqh(o(ewmmjHqeMNohAZ!%0V9z?q!&~lcb{z=IOUu5okvhYwUeaJ}i zlZ8H|(lyonSNrC3`>o%s*{^wqoa4)uh1Wd(>H(`StNsHQd>GeTZ5l^{P*F50$}et_ z#dkaapgc%@RJL8Jvrnx60RS5Uj6Z+B4z~bM)=w|Lfqwdj8&HgOKI){ul!jpPL3@lD zF^s-@^5L}4t~*irZC$>=Mp|y;_!4 z$T4ap3W!@2k~Wd1k!Pf?j+U0j$Q7!fY25`Tbde}KUH1N+hV^Y`sg005I;ciX?{ ztP6i*n@*syrU9h0!9ejf!pcO5-+I#x>ANQ$M!WB{HPv8hs+%11c)k9OZ07&wPdC#0 zvR+^55@;cs)Myce%}s6BysDkm3lCwnukMQAra>Ta_PJxvLBIt)P9Fh@01e9F`eZe} zfE41ju1P=Q8r=*|)NsnHpW;_ze(??1k>O|I7u*U-z&8;ia2Q&jPm>!8%Z{6L*p|;n zcUu*Vvu)Lbo_P4N*KSRx#u4w9TgUo#PIs z&uqIX^BVwS=y`{74FE!&w2qYkT>BT@>|ma-t@N7nEBMoRA|nkHOyfPC(&BaUY$O{1@zbQaBFZ5Id|I^2X_w1;UD0RfnoIIC8P!`1v!$!E9Q zg1&#^A^c&JQJStJD!LrvZR7H_iL+fY^b-lW5lO+DJvopCkVlaD+*^5831EA;7m78CI_z8sitq&7?v z23lkZ5#0>Im~is665oPK`^M6U7cd-I02sgk@JI&%z$$_S3Y9b)XC-I|qGc9DVzkFVm)@`5S*R!=zfc;x90F|G=Y9$flbw@;2Lv z#zSAnAZYY3fmd2UP#pklJPx63MB|4cK+2qO3UHOW{?N)tzjl_ErxrjchfujnDkBAsuN#sC1fVfkYmAnSwS zG;N>({Efek006v$e&9*pr78b=HOx7L8j99)jc?io3@E$4SiD?oIxs`*NsimryH^eE zzuOMpFknIE*f#Az9B_Qx8(==7I*alON|Ufc%ss$C;gLAV1?r-V9i zgYi4^hc+0GLZo%~L)0+<7b7wm9sC{X@HP=XJv4TR_X8WSwUP+J0HrwD)bc+96 zpa5_Hw*>f-aXy3{LTdC8&%6Ub1)+`>?l=IHIRRPVW1$c8`9kLibb^L=kVd^xXEa0W ztZfmdvNl+UNK_ogB|l?HHBg>L^9gs$^00DV=I>5iP}__C<~#UCPjpx?s(pv$S(eeT z<8B&RL!}?Gf8Y?NSKmZlLC}~G2&V}eu2bnUL~j!Sl-L5OYL^ADWN9s(`29=hUk^T} zZ{yke0%=h!0D9|OXXUF=`=BYS- z4%cN*b-zzzohc?SROW~DTEMB*#w z0d>!1yvfXTN%f-IYo0r09Iu7$+#{}L=a$5|k2vziEvssZ=WuX;ra`Y@E_umLoJ!YC z5VUckXDtBESiZ@ng0zYOz-n!90@m?T+wcAC4|L6~|KdG4_!|Lu-53B6>W)t4nu$s2 z+6_z{F}a(#d=6Skv=6it8XPxThc3F131MH*)Ift)?N7(;zZ)ID|L(jkdFys2PAc58 z5Ck3DZ2#(yH_+e5KS;H;*k0Zk+JH;?!%gT)7LWs;Yy8OE56-%jDW9IggU4UeaT?u) zN3DgR@l)e_SXj{R5PZ}8sHgOcX?U(HUrD+^cOk!lunD(P$l8hviI4h7ZrODdolO(y zi<@Tymj-0_o^^+x+s#no(oZY|28R2X^eP2;MHg&*=<<`=o`W;21H z$RJJ7aNPt!8z*|x001F+l%0Ts2ep1F?k}#sl`gsBCaUM1c}lV?kIpQJs)pdZFa*Yf zHd03QF={Yd-6{wSYFaZe7X%)-Wgufd488WU8))5utI{c7*^`dhXIJXqx8s-ozBB86 z5&TXF8m@p`$?OIjZqhy~y@wKML6 zhT=#>7-!T8f}IF|09dOp`YLw3x_}0apJGe2*BD*;IL)t(^P)dvnb~99t#de!-_|x% zUpoDmOz-c#YB$*z+U~0 zEC2w&uTR*S_StSki>nR|c;lT9)7h6?Ny}=Ns`du}#OA+f6V?98c+Q}ixoKf^Fsd=X zfJLO4kO$XH&1(b{0CXjzS^%=y2dshUJb2C3>C7X(L;fO1UE7ObLI`0EIS?j-TQ-mH0D!bC?3Kp&o}Yq<<{b|&QUHLu z1<$_qPXH`*7bp#|@GxHr&&i)8jLQ`N*?mjXQUGAi0sIc>kqmSEYPwt#^nJAy)j!5cM)&cfdTLC}@(om(Qt@*sm*mdcTU*C=WPl+MY z6eaF^`~^Dk+~3loMZ5x&zYi#ahi?T!I3<7K5Mj2o>F*j2^V0x=3>c&|7R*-DN>UjE zGO4$L04xp>dVHtQ%11q-`ivR2E`9T`y=k9a#!(-hL1^vqAurXv`mg`wZMOfW%XWo! zmW%g|*HeVaG_Gh~A8SJ};gB-{HP8#zP%!nK9tMi>7(a3d24NQvNkAoK;)}n5?}_FI z9nCU9y$qZaQ=c1xHlWueT|}kOMsKtBZ8}Z#0J8F%seIxz1uWe8bM3O~i>IA9_RZGz zNk^xTtJ%?cw=TbvudEqWx9UFJ2j?-9Z6$r;9e|t~C1_JbH*UqVGN+ONfcgP2z1lz* zAH5TOd8bjP1sbpRW6w{c6VAJg=FXj?!VkfdZv;XRAsqYzIEhf05Cm-p#*T!a8Qgb~ zjWwcL015!km@akhXGkmn75E_ZF#uQ?-$>YE^iVqUt6!qMcG`-k*_#Kt1&bE*M>X!I z%Wk-h*ER5NyW-$OE%Y2PTG|S2ujk-ov$h8ZoD01Ota|6e*gewpVGAzN`fe3j7~gOZ zlV5>EX@;*0|@F@`%1Cca6T`97!xdlN*&WI(VGVV2vZGzW#^3jwxXkV z--O^<&mOhQ>ga~MAE%%E=?+@3U_O<2Ywl75|HS#{=D#}t!37KeZu&X^2t(T^p<^Hr z;ovf36WKIYYzzqq*w|kzn3M(JPDnlrDESXxLeemRV7pC5(sz&9pLW_}3=gFlWHJW? z|F(N3&~L8&E4|6D=}I{cY;js?qP9~3;QzOG^}%*k)%~3N-b(@rG02w#DSeU;0WAd@ z)Cv`>TCL7FZHL5;OzT)m2ysA=M4&~Ufg&BLZS@aE>NvJz9rV$$IE-S8qt0MI)V4E( z_<+3~_$TFznLiu=`Y{Kf{W27eFjr?Z5Bm`X;P>P5G63PM zhsiKnF=jQ)N@$&Z6^ynF&`n2x8_obg=b7L);CqAuCuO|C5&Yb$mBpK1drooI%U2eQ z#1Y_EbiO5zG5_sD-!7iQlZ;X)!0-Kr-5OuUpE>~BX!DS~_Tv{m``6A1R zKlhugJa|WwZtxg$j!xPYx<(C_`GDLPQ5v7LkHELA@sUdmVu3R`qHi@_mj7!v&x^TVtk%(}NC7 zz6|cXzV89OI|8=lqrtYjul-O*9_su0K6d-zG&A4>%vql*f*%6+j2N;F)$6ciY6l?1 zU|jzwv~JzL^zjFa4I4zcgZmkH2jHqZW8?TsTAj&FGP>7`l261qYnhIRiIJu0;{aq} z^dHx>d>oj!@5JzH4gj+|XL|)ZW_~yVa{zP_9$sVS2Plmf4Lef=pnw4Q0SK)7>$AVU zrAF((@NM?j85M%%um^0T6W;{%Xu!drA^^MuG#rCFg32*?G|;i+pt_h;`fw!J|HVemg$l)>j# zI9z%8_)8ZLb*^odovUOdPCPsZ01#Oi?Mnd-l`;DR_(;PM82FK=-!y|-xE#teU@#o! zEk6ChNL}~B=-mMjAe94fgZGeHEz@ieX+FH9K#a9HKra&vu6<8HXK@ER)A&_nL zVAN3U5#+lEP7h~%=y;@G1quKlM{`ou?z^qe9r%c3;PiB9V-B!uwx^TuD8ZLNrUy6z zEQR0{5mEFD^^pf&;FS=08E;e?oD*10CSFUUy41l3_3DYp_Y$j+D{CEl1Mf~LzhnFN zpZn}w0X_u`>HKo;oY!s|KTQntTH*K#8RYZ_MEj^kETz=}M(DJ#wb?aNK8p1G0i1zy+Xl6woKF z^7|$q+Q5lqdW+oycTmRR6v_ z%ywrv()x3`mw#A)mmfSH<%ElJl)Ig|?nXD=GdfZXeLyI_N5*wYP~NWtKnFMIwN&4l z=Q_yJ8Nbu{k(~eNeW!aUCE&SP#{8Wkl>EVwizZ;v zq#ShCw^>w2GXVz%A2T9Ajv3P&K)U4@4xk$(syFFFXD}EkXEcVudG<5#n{)8ne>&?c zs9@||-#W?44KUJB8SM646~!PA@>H|9Zs;lKt4%&eILM=nu`%dNAhb!cMPDi&H~~oH zXpTxjtLt{iZL_{Pg4hc{eph6G7jP&I3-!bKnNz784Elpp1kl;Hj;-e5zaChIgbhO^ zkma@zHi5iUktCRDBq}-;P0{d=|<^pv$%6x661c&731fYBjrtk zgkP6|m&JE-09wbw=SU}mcfjbrfX|xd1mFyOV+~-@I_^wxrWN@Pes%y64l6Lk0eI-E z*EaJ-SW9E4krVnbe1(2(Lk^e7bti^$j|exMc*x5!-?`-3AF6%N2FGR%#~Yf%7j7)S^nn<+DRG|jf^P=p-qNsbB*hQ?KR51?a1 z5Jqn6UQN>ha5lp=+8YfwcF@j7Z2g%>kW$D4Uhp44Hko{XL*+4m`&pfW$zW+l3ROfz zXX1(qg%OMZojHK|ENU$rg;V7W9aDb)*jWE)z9}a-y$en+VBXy6o zjWJHDGtgokJ=UB-y}nWHs$cAthtWPG8vgK(E7$Exl;%w`t7qN_l?6Ft^Y}%>W%(h= zyI8)0Lcv3ACUpP-K?G2zuvrpI0-rI%0RUk9#_qUx=-@R6kax(dbu#t=ENph8$2HQ~ z;KKp<42PkrfJm=n(TvH%Up>n5AngtSvpx7W*>v`2grIpYdzKC9{82pNfUidZHgji( zW@$P=Iy#2>BBPd}t(-x}mlCQA(k8gQA7Ma&Tg~`nNtw})o*dkvH!HC^te7s?C zz#V|{jSlG$$h%*g1As&t(a>3ioCP`>*Wl zbZ(ot>Vj{R#{52J^~`TcA>I11MXOGJ<=b1G@`Ez==L&%EH^Nfj4nS_|0Qj-Hj{I(L z5cqTe6$Bj|4h((ATsQ!xb>>&+U_el#cSis#v~L(an1%!3IrU~^MSwEj{@4lfz@gc@ z4?UE}Bfy%U9GuGSQ9+cWy*UljjQSbJ3P7t)4tY3ZMu!|J5-{1hsp3c?%_4BS#hZt-pw-GouvBPs1G~W>jXr|PY#R^RfweZKk`yqc$TOK%$scP2r7r*j)D#m z(GS}bUDk)N5btkM8IWPl&C?M9aHdyqTO9>!t$vmjwCt-+0GD#WM^9a8t=nCkGpvne zkxsghq`qypEdEJ`{6iC)*L_6@W@VE2JU?dj%yUsgypZ{nU)gf(vQ_6@CN~SVh#{<& zSrTTUKv6(w69WTgN`;n{TWL*cZoqQpTV{ovuXWY%efFf22mqyaw0UXQW8ih;RiC9< z0I_kQvp)0UsD&<*r%fhpTSYXiiaHi8gmBh@@TBuC&cSn*OY&_wqrgw$eeCLMJ30@Q z)#(^rbQ!e0f0fhZrGlz!rc4*6BRfT#pu++_wp;8F(Qn@|-1Co0m6Be&OrbXU~>z^8Ai&lLIvpz0-yB_ z00DC3Ykj8y=|P8D&{G&bi=vQK^hlT*$UPs}mw$RAQ7ahey>>VNb0qKrzI;d&(UL3x zynX>5-2qVU%HdIVIt(+dq{g{?Io`?FHHg2>H)6w4h)%+;*25}~L#-o8=3z1IXW|7MS z2jFta+0*F8vyoQWz?<{ee^S2yj6XavRG45 zm3=Au7|7is(w+bH!n2=xdh1)}}N8JZiu(pgT#cQ$QP&!Dz6JlSjRj)+oU~ zRfqLDP7c-fSEneR7O_A6{N6=(J$c=E@^i$^Cu<;SdBG{BpX|uc`QN_pKaYPD|?$ z>h>&Ql!Oyghv80w^{Yxcby~Tcguc!HFTWLNboI#$RGfc@^tvi#GD_rCgvM!7k4X&`BN!Rn@42e|e;J)i!ryG~zx{P8!) z(|nf+aF!}&qLm~v1qBJRkZ)hFuSV@o!7?=~5zr*-IbCM;tCRWYmzFjGaPLntJP-Y* zP(M}x-A=_K9`H%&a$jktM;ErfuYq250WnPmJ5w&_3pBHg)5%Mk)|x7#!X&)!e7e&b z`pAy=zWN6!Z$A6iK+^L5D=mPMetJM&&M!wdetPxD;-&J6vKD^f=veBdGDN+0lg{r+uO=Gw06uvuco=@>b0!44GN84y*mio^1n6LWy4@;XhsvVL>-l*M>cxtvd= zafxfDyJ-fUDe7pOsOV|Sw60iO%KOU8d-t_Fw?F#6*Zynt)g-3WfT?iGIt!(6f4cDe zIIrILnR8l8juA&t+8-Px!!!VxQ5pb}!MZW$-W&i{jS80vR>x_@Ksb$BeejToX8P8U zQAtpV1f2nn-pHIt4{+IG)jfE`*Gbv6veKP8y$YKE00q%WL_t)a`gI*0KpkyWb=cLH zmhP41%@-$!hHsZpUw)vm`5cS}V(1R0(LAp^oldO$lGe*NU2*=%l4Il#j>@-+PKIdL zG<@2ulQJ*_WxG~IA{_<&4BYI$yN+F_>|Q!3bTET-?iXF>#+3u$y5B}w>r_!iJO~s` zE1DJPyLn6fD(G3R$3Aql=N_GO(JaeJ;p)M5F}dy0t1tYP)UO0J)|=Dx8VL1IUvf^HuKcx6-LB)R$JpJdQ&&B8to3w&m<}`o4<((Y>Y)J&1@-!A z6{f6Xy8zSFQESPv)OPh*Q0GUk4veNen_c`}yFIjR;=0#-UD6HkRoRF3$tpiI3iH3! zf$3=d`qt`GFMCsKq?8{&?OcfG;8Zo)$|F6Uv0FpynavU#Jv40)dH|gXfEDXEHvYP4 z*83&@-E|Jq0Vq$_ud#V35r90(gg5d0bGudi!NfCrzBJd~z2~A2+BuExps_Zv{7kL0 z^e+ReH_m#o79;Z}5TV>3Ea! zK73{|x^-f2+kHazBmS`S?C!sq*tVeoe$Rj$enuXa!>86z=+VH+>&A~+I<(|n@+Y%f zWwKo>SRoqv074r_egzr=B{j&%nUanb#;KyozPf1|1JlsV-S?+c@3$M=2e1U#-7d>N zp4`*<M;pr`el5eX)5TY;5; z>jrB#$fVsgGw~rs0DWj4K?m@R{OQ%l_OJq)00w0ESH1sler9;lz8hsg z-YrgG={#Km$YkI7vi$DJwu$R6#$&t9Lp-x=e~kl}2?T-bqJb zHwJq432f-{2u@RH7B>O+i7a1}TYI-nZ26^ccFWvc&z=Sv2QYiOpR(sy{N4lSNSJ(+ z4A5^#MfpkLG*p@#dx>%4u4h3^@mM}{lRqr`q*yK**;m6w?4LO>HWo@t=roxTaz;g8fYBAAdJER z@UZsxAGk=KD*T`f*e{C%5Jxb04nP+4GU=C($vcPdcyz_G&n@J)?H<684n&p40Sv@2 z93T_&c=6e19d}7*vbGi4;0m-gqd^zi1DRwxt&)&IN9mky>Hpd z2fugCnimgRmZrh1YM^ldv#S2X@BHjBd9twm;@bp>>m?d^y}lj*k8Hip7)1p5JP9E|I$izbMY&l`>PG zBI|N}H^CuB0MAIvU2^~aI|BS~$ggMq{mz@;xcdmO-;kUI4Kxm57L|D zNNewz#ZYThe)()vqJxuV$$q?mdWG!P%PK-r@}><*<2BkpmAL*t#a-+cXYoY4-G1!< sCWn9UWbuuk6x+7px6zu004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_ z0K*JTY>22pL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr z?{oLrd!Mx~03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE@L0LWj&=4?(nOT_siPRbOditRHZrp6?S8Agej zFG^6va$=5K|`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t z74chfY%+(L4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AW zE=!MYYHiJ+dvY?9I0Av8Ka-Wn(gPeepdb@piwLhwjRWWeSr7baCBSDM=|p zK0Q5^$>Pur|2)M1IPkCYSQ^NQ`z*p zYmq4Rp8z$=2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV z=Mor9X9@Wki)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3 zF4znTKoQsl_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZX zRY(gmfXpBUWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6qn9`(3jA6(BtSg7z~Dn z(ZN_@JTc*z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW z#Hr%UaPGJW91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5Y zU_t_6GogaeLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*C zkMxR6CTo)&$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4 z=0!`QmC#PmhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`hkG4N#KjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=? zH;57x71R{;CfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV z4H2`e-B#~iJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOj zV`f+`tbMHKY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9 zk0dT6g(bBnMJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3 zsdQ;h>DV6MJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP z-cdbwfPG-_pyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1 z@Q#ce4LsV@Xw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy z`y}IJ%XeDeRku;v3frOf?DmPgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3 ze|F(q&bit1spqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bE zTE}(E>+O9OeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$ zcQ|r*xkvZnNio#z9&IX9*nWZ zp8u5o(}(f=r{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8 z{*wQ4;n(6<@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh; zdbp6hu<#rAg!B711SuW>000SaNLh0L04^f{04^f|c%?sf0000XbVXQnLvm$dbZKvH zAXI5>WdJfTGBY|bGdeOfATlvJFf%$dGpiWfn*ab5(Md!>RCr#sn+JSUMgG8Nd+(dF z$%ep^-XJ6pfAxE-r3%T(9e1^^ZX5M@A`@Nap{AT6>TrSr`Pi%o;QCLbs7G9aR#9%UN z2m}HVuWT?Au5d6@(C~=oQf6j#QyFw8G{p0Gb^0eFk?4Bkr! zgiHCcGq(N9w~!b-PA5MsnD^qo&sk(D1(kZzQ-52tJ@+5QW`k)O5)BFuWeA9+(nmrQ zWe1=AW@8W%;bKs#0f|fo*jV>PRbHX<@~#7W>Mxi54T%Pghvox6PjsNHpj? zP!E9Pn*@JiV8XigC3vk3llx+1c6O{4m`~3ANqY&3db?QLEJ-gzZuwv0uCz04htxeqhQB3Zg$jB9Ueq4EBhO41qpO!Z7XLb9*st z*q`poet>~Z8aGIEICs+uVa(()3?d1$qjw6w+@mW$a{63HUBfIS@(FBf+~m~wf|+TF z!ks5B8dZ9u&gmk2D_5)cK>co`YPk3^Kr)?9Eqi)_RG%|V%uP<_0g({12>^FmjNsAP zmoN167$>*|0m2IwZMB)LOU5jiO-y}i230H@f*HqMrf%;7SAINXDLZsh4_siSx~u2k z?t%c|vsvH%zV;t~AD19=-%PDHf|I2+&K-Fd)m1I+WUbz~8osQr+?D&`%K#KEho-Kp z$z~!^ABM-|+l)pl9bWH5qJZIxM6;+|)=F)+d<@nbY-S6MEf$oyEcW#prLqv-Q-`Vs zM38{nTJhDoa4xe?{N(1@kG_{5x_JFvc+W49s1IJ9AiTgP7SS)))Z({g@+7ea{v_Yc zJs4_*;#hanoh-A#$S~>j9GlfjRJC`Fg7TvesyuvAAt3@D9Zz`-*b^|v^Yz`FCq8EZ zmBwaw02ZRB=dD#OX<6MqM49l6){NDQPBF zey^TXDrL%KGP?W10B|~-i4j44)?2-lH??6gNXy+EK0f0BIKCLLoA;DopMv|wq>+CD zyWNhvc)3S>e7u-LrR+*ilCl@iNgv5#P`RiGsB~ue_XkUA%4*uJupLeYohqi&NKOZA zlEGlM*zAt|rByYbLl5pX-VpNGopn1lgs|wIogiqzO1sfyreXI+A`ko-Kq`?it4oU~ z<3=#yL-K&b;qYpJiH~gVpK>X5_?c_tE1}ceOFDNuX$`F5fI3j%;^M< z1E(u49Vw`_s!Zl5>gwvW?#lh(b6ASTe{U4haTZd%C*Qzc5Vn_~MnLzqAV_b3;^G_7^b-q5#0S^F;h41Dai-9xe^{K z?n7gf5%73auWR#B@$t+5GA@QaA|`YM68U7oj1l85TyGXR`*qh*3E?Sm!-9jMugFHC zJ`hNRJ1U(K<@&N`<@4gP@sXz_Vqpz@A-E13%881wFwR9DkFJl3;?}KL5w~;4Hz{+j zUCm;@{1U!*#W;6Psp;-E?L%2NsnOBF=}Ac&#*9eGCz6QEN^9Gw`9-%b!XoeE3_*mJ z4-esKTiP`ZNYu+qb4N#!h=j!`+Xt0KfAD;D1HJ_ydsn~6zqEB_-2Xi`D<{A>zy8M`(uOA`a^alnZ&J96R%-(jCSB<0>N12O5rB$MrP0YBEy_)E zj!%soNg@)-3XM^|H?O>=vc8kG`Sls$0uJ5hlJ?Wx7tT#gmvKkMhmAy{UKXwU{Yufb zvau-JhfpD3Q}xX|Tn6oKsP2nvx0=Dxs};8V(ptmquAUkql}akITAcwakMZQZs~WZ1 zx*cUfYGPs%n??Qbt2Mc?S!u)4G37D2h{qJavS93l<$s;PUA^^qr`2ZnxioI;)={Lv z91+U)#RSyOrwSu!D!|7cMINTCcX&U>z29(%#-- zNh&I8t3hIr78@JH=hDTJAZ{cQ;W8~Vdi2fPaul(+fYWXQ4yzV8t#F2N+QIrSPThR@ z$8mosJ6o0fh1ThX?|r@hWh_jA6oUI2Bk z!yedly-ba};_K=%gH2oNY-2LdDstx(oidwkRJq*HH?ks=6QUx-UY*cA?#3G~qTSdH z%!)c-Q8faqrUi7h)q}UU9S76Wgz+Py`F&=L3)gO!tp4;*#fs-AXt%yOd(_hTne$R( zB>$f=BKdq;LP9#K<_6xstF=ctY1^T~HN*b4MsuR1+N9LskGQJlb`Z?xoW%Zi2SRYl z>wJGhY)A@R^EWq}U4`d*H#xwyn`%G|P6JWVu^^RF2uLIXa8iV}<5%R@^Dou&q!L~i z^dB&Kr1VCQ7%GiXv2ttP9i!RsR7u6ndL-@zdUz(E&ECYIQs%@*hSDb`M++X$97!1# zD#E5cuxW3eam(Jk=U{|+&}{%Nmv$INUX!?7N~vCJy{t3X&cORzg=M%4q5FaJbF@q< z+_~wsoQX)}0XDa<+jdO#XogtSskFfHZU;;{2}Ff6!5u9J7zrZqSbPtFQytiy-v)TH zNx)&~v^_I*h}V7c>W1#xjo+RwD5#jTqLi#LsYTzs^F*I6c@He4UG=YHb<7cKWwdq)q7>&+l*Oe}~U z7K)^vK*hi_tM;BPF0Yt`L;(S>!(tn3`K*Du+XJ8bynroKOlG?U{^?=KmQGFMOB)U} zPn|h0LB#cb=y5+r7-CEK01OZI-87xS0@nrvzdf`+P-zQH3QTz{|34c5!{)HpwsvY8 zQ5J02e(Kyy8xEFl`>CjF`J(Y8Yfm{U@sBK&0nU~wf!*fYub#WsR1J;ayLK2T|ML*Q z7?qs3c>eU1=bo67==K8+hsyyST5sUufG^9c^|>tX<opxrhZ6=*4kt-0VCvg@w0w<4l~qyEtVGoZ%%B+nMrpf0 zSutz8B#1Kay=sAUeWHnphr;CE zC~+HrGi1mtmL#-<#^Y+Jbh?c$5>|1<;!k0vWSD%PT_el@(JkWU^g{GeAJw>9G9_7^}<);qwphnXE1b zjb;wx3oFCZc=L2ERy-3B0$NUq1*n$YE*Xlm*}+446vE{o-NMOF2S zNbCU&i(g+bBjw55DG3jBW*8_cow?`L%}1)Q-YEAP{n3cDOcIq)ury<`ae7RGAUPC& zIHiBFQQM|gO5Ni@l%D4EIGGn83$l(M=EbgB@d7(Myd8F_BvjM~m(jTE=($=ZyeE*WjVrg%R!q$Csys%zbQpG86ip}qAFRkokhXKXj1v}y+Yl>IeDL$}8+5(N8qmf> zAk;MV)c*KKsYRhPxW6jvPY{>)VNO)yYl}xu4A}RKlt_tu7JCNKESFEI`*5qe^|$>F zZEYQ#r~U6Lv1Kv>FF9#A?CL2<)JsK0r`~L{u6*m$6LtN!xCcU2Lucid9fcaZ(K5HO zu@O!-o@h+Ql}j=v;%?vfM`tmEOU(^n^@)QHmC-l>8?4x7gM`lE%%bx7GpriTSVn{t z#I0JvmQ0)Kz6cM+m15VGMK6ADQmJsAA`FaP85%B}zwyVll!QBEMa&%!5VUxRD@y zvq9V;(lr*fX33g>Gk9V&I&IF37HEwzdj?5&7caA*e@{N zzqR$p3o4bylvi3^z0ud4A0ZSM?|*hl`VhY7?c23#@XX#FIx?C3M|DT*4yfyOnEDJ& zpP?``Lm!bpQztM%zX(-RXXQmEvQv&RlM&dW(orPC<5UDaZ> z>(7_ot~gv!O;V~&4RH9ZzgAg!3l)2XO=lSDmTzQ|(5E){^WoXNjxR5qT4Z%P-TQxd z_%r|pLn!RZDJ}{ovpn}rk3>ehY!-{(?j0K&OJh?g&%uE(mrbXN_*{mKNh8|`BqA`F zY-EkjL^c|&a=X)2=(5{?DXpz-LznsmJMC$G%N^8tko@U-gIuo@LmhE_2Zmn*F!_9S z&W&OoiRL*`9G1%b9*_42#t_8#`1lZt%jMqabXl$HipIun*v$vDDx**+u9nsK-$0Dr zzD3il?1_Xrdfhql`}VAQJ+AWD5TG!b5Bw1%RMc5jRn<{eU0sKz8};>F163Y_L!);Y ztk{m6CsH0Co6>y71wIV`eSk!e5U)nrK3EhAKw>cmv?99)ygvpHras%=4+59QC}~vo zpj=;u34^hyG#F)Z@ofMK<&n^tGjKmw!Da!M&0dSL4+N3ONDy#_I zXjGO)%!~XUHaH4Z3y2=Q=2D|lj@t!tqT-q10-?_jxqSKnu2gzt^bb2`^OHQkZ>atF z6IJ!r&t8Dn%D8wvT87E!}0{T-n#^ZdF5*M&J4_ z92!SZu~(qMWEqjeiw-S(#pC2zVbp^uJ3p!K(x{`6$OEqiz}^Id&o7yL?i7z6jT=B3K7P?AmB*0Ed0w(pIs6|t#1b128?ngS1#ThF#qTtT0eb@$W{zNngggx|nBy>;Ly2_CB14z_*Sj^mBM~QT zo|L-e^`zmC;vT^I!(dXlKG>b}6{5hLK0G+3_gi+m!wNq8b-G-o@62^N zEgoBE5g{oD;)hP3ot3)8{h<{`TTg}Qm;9wADs7wBZx9B`L+JtcP-vQS_MKVwM`PRN z-m|^We$DAo>06@ll*ef4Dxag$w7zrw<^i|&u5UfB`!)Zy;}1i5H&_pN*h$2feYf`c zQiYg5ybbz?P`o<*Q%uC9kN^JI&+THtu&?mS2P@$UA4VdRsFm*$-VOM_!$a6)GIbSR d+2AD?_zza - - - - - - - - - - - - - - -`; diff --git a/im-admin-ui/src/bpmn/assets/lang/zh.ts b/im-admin-ui/src/bpmn/assets/lang/zh.ts deleted file mode 100644 index ee0c5de..0000000 --- a/im-admin-ui/src/bpmn/assets/lang/zh.ts +++ /dev/null @@ -1,126 +0,0 @@ -export const NodeName = { - 'bpmn:Process': '流程', - 'bpmn:StartEvent': '开始事件', - 'bpmn:IntermediateThrowEvent': '中间事件', - 'bpmn:Task': '任务', - 'bpmn:SendTask': '发送任务', - 'bpmn:ReceiveTask': '接收任务', - 'bpmn:UserTask': '用户任务', - 'bpmn:ManualTask': '手工任务', - 'bpmn:BusinessRuleTask': '业务规则任务', - 'bpmn:ServiceTask': '服务任务', - 'bpmn:ScriptTask': '脚本任务', - 'bpmn:EndEvent': '结束事件', - 'bpmn:SequenceFlow': '流程线', - 'bpmn:ExclusiveGateway': '互斥网关', - 'bpmn:ParallelGateway': '并行网关', - 'bpmn:InclusiveGateway': '相容网关', - 'bpmn:ComplexGateway': '复杂网关', - 'bpmn:EventBasedGateway': '事件网关', - 'bpmn:Participant': '池/参与者', - 'bpmn:SubProcess': '子流程', - 'bpmn:DataObjectReference': '数据对象引用', - 'bpmn:DataStoreReference': '数据存储引用', - 'bpmn:Group': '组' -}; - -export default { - 'Activate hand tool': '启动手动工具', - 'Activate lasso tool': '启动 Lasso 工具', - 'Activate create/remove space tool': '启动创建/删除空间工具', - 'Activate global connect tool': '启动全局连接工具', - 'Ad-hoc': 'Ad-hoc', - 'Add lane above': '在上方添加泳道', - 'Add lane below': '在下方添加泳道', - 'Business rule task': '规则任务', - 'Call activity': '引用流程', - 'Compensation end event': '结束补偿事件', - 'Compensation intermediate throw event': '中间补偿抛出事件', - 'Complex gateway': '复杂网关', - 'Conditional intermediate catch event': '中间条件捕获事件', - 'Conditional start event (non-interrupting)': '条件启动事件 (非中断)', - 'Conditional start event': '条件启动事件', - 'Connect using association': '文本关联', - 'Connect using sequence/message flow or association': '消息关联', - 'Change element': '更改元素', - 'Change type': '更改类型', - 'Create data object reference': '创建数据对象引用', - 'Create data store reference': '创建数据存储引用', - 'Create expanded sub-process': '创建可折叠子流程', - 'Create pool/participant': '创建池/参与者', - 'Collection': '集合', - 'Connect using data input association': '数据输入关联', - 'Data store reference': '数据存储引用', - 'Data object reference': '数据对象引用', - 'Divide into two lanes': '分成两个泳道', - 'Divide into three lanes': '分成三个泳道', - 'End event': '结束事件', - 'Error end event': '结束错误事件', - 'Escalation end event': '结束升级事件', - 'Escalation intermediate throw event': '中间升级抛出事件', - 'Event sub-process': '事件子流程', - 'Event-based gateway': '事件网关', - 'Exclusive gateway': '互斥网关', - 'Empty pool/participant (removes content)': '清空池/参与者 (删除内容)', - 'Empty pool/participant': '清空池/参与者', - 'Expanded pool/participant': '展开池/参与者', - 'Inclusive gateway': '相容网关', - 'Intermediate throw event': '中间抛出事件', - 'Loop': '循环', - 'Link intermediate catch event': '中间链接捕获事件', - 'Link intermediate throw event': '中间链接抛出事件', - 'Manual task': '手动任务', - 'Message end event': '结束消息事件', - 'Message intermediate catch event': '中间消息捕获事件', - 'Message intermediate throw event': '中间消息抛出事件', - 'Message start event': '消息启动事件', - 'Parallel gateway': '并行网关', - 'Parallel multi-instance': '并行多实例', - 'Participant multiplicity': '参与者多重性', - 'Receive task': '接受任务', - 'Remove': '移除', - 'Script task': '脚本任务', - 'Send task': '发送任务', - 'Sequential multi-instance': '串行多实例', - 'Service task': '服务任务', - 'Signal end event': '结束信号事件', - 'Signal intermediate catch event': '中间信号捕获事件', - 'Signal intermediate throw event': '中间信号抛出事件', - 'Signal start event (non-interrupting)': '信号启动事件 (非中断)', - 'Signal start event': '信号启动事件', - 'Start event': '开始事件', - 'Sub-process (collapsed)': '可折叠子流程', - 'Sub-process (expanded)': '可展开子流程', - 'Sub rocess': '子流程', - 'Task': '任务', - 'Transaction': '事务', - 'Terminate end event': '终止边界事件', - 'Timer intermediate catch event': '中间定时捕获事件', - 'Timer start event (non-interrupting)': '定时启动事件 (非中断)', - 'Timer start event': '定时启动事件', - 'User task': '用户任务', - 'Create start event': '创建开始事件', - 'Create gateway': '创建网关', - 'Create intermediate/boundary event': '创建中间/边界事件', - 'Create end event': '创建结束事件', - 'Create group': '创建组', - 'Create startEvent': '开始节点', - 'Create endEvent': '结束节点', - 'Create exclusiveGateway': '互斥网关', - 'Create parallelGateway': '并行网关', - 'Create task': '任务节点', - 'Create userTask': '用户任务节点', - 'Condition type': '条件类型', - 'Append end event': '追加结束事件节点', - 'Append gateway': '追加网关节点', - 'Append task': '追加任务', - 'Append user task': '追加用户任务节点', - 'Append text annotation': '追加文本注释', - 'Append intermediate/boundary event': '追加中间或边界事件', - 'Append receive task': '追加接收任务节点', - 'Append message intermediate catch event': '追加中间消息捕获事件', - 'Append timer intermediate catch event': '追加中间定时捕获事件', - 'Append conditional intermediate catch event': '追加中间条件捕获事件', - 'Append signal intermediate catch event': '追加中间信号捕获事件', - 'flow elements must be children of pools/participants': '流程元素必须是池/参与者的子元素' -}; diff --git a/im-admin-ui/src/bpmn/assets/moddle/flowable.ts b/im-admin-ui/src/bpmn/assets/moddle/flowable.ts deleted file mode 100644 index de959a6..0000000 --- a/im-admin-ui/src/bpmn/assets/moddle/flowable.ts +++ /dev/null @@ -1,1250 +0,0 @@ -export default { - 'name': 'Flowable', - 'uri': 'http://flowable.org/bpmn', - 'prefix': 'flowable', - 'xml': { - 'tagAlias': 'lowerCase' - }, - 'associations': [], - 'types': [ - { - 'name': 'flowable:extCandidateUsers', - 'isAbstract': true, - 'extends': [], - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['*'] - }, - 'properties': [ - { - 'name': 'body', - 'type': 'String', - 'isBody': true - } - ] - }, - { - 'name': 'flowable:extAssignee', - 'isAbstract': true, - 'extends': [], - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['*'] - }, - 'properties': [ - { - 'name': 'body', - 'type': 'String', - 'isBody': true - } - ] - }, - { - 'name': 'flowable:property', - 'superClass': ['Element'], - 'properties': [ - { - 'name': 'id', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'name', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'value', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'flowable:properties', - 'isAbstract': true, - 'extends': [], - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['*'] - }, - 'properties': [ - { - 'name': 'values', - 'type': 'flowable:property', - 'isMany': true - } - ] - }, - { - 'name': 'InOutBinding', - 'superClass': ['Element'], - 'isAbstract': true, - 'properties': [ - { - 'name': 'source', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'sourceExpression', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'target', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'businessKey', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'local', - 'isAttr': true, - 'type': 'Boolean', - 'default': false - }, - { - 'name': 'variables', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'In', - 'superClass': ['InOutBinding'], - 'meta': { - 'allowedIn': ['bpmn:CallActivity'] - } - }, - { - 'name': 'Out', - 'superClass': ['InOutBinding'], - 'meta': { - 'allowedIn': ['bpmn:CallActivity'] - } - }, - { - 'name': 'AsyncCapable', - 'isAbstract': true, - 'extends': ['bpmn:Activity', 'bpmn:Gateway', 'bpmn:Event'], - 'properties': [ - { - 'name': 'async', - 'isAttr': true, - 'type': 'Boolean', - 'default': false - }, - { - 'name': 'asyncBefore', - 'isAttr': true, - 'type': 'Boolean', - 'default': false - }, - { - 'name': 'asyncAfter', - 'isAttr': true, - 'type': 'Boolean', - 'default': false - }, - { - 'name': 'exclusive', - 'isAttr': true, - 'type': 'Boolean', - 'default': true - } - ] - }, - { - 'name': 'flowable:in', - 'superClass': ['Element'], - 'properties': [ - { - 'name': 'source', - 'type': 'string', - 'isAttr': true - }, - { - 'name': 'target', - 'type': 'string', - 'isAttr': true - } - ] - }, - { - 'name': 'flowable:out', - 'superClass': ['Element'], - 'properties': [ - { - 'name': 'source', - 'type': 'string', - 'isAttr': true - }, - { - 'name': 'target', - 'type': 'string', - 'isAttr': true - } - ] - }, - { - 'name': 'BoundaryEvent', - 'superClass': ['CatchEvent'], - 'properties': [ - { - 'name': 'cancelActivity', - 'default': true, - 'isAttr': true, - 'type': 'Boolean' - }, - { - 'name': 'attachedToRef', - 'type': 'Activity', - 'isAttr': true, - 'isReference': true - } - ] - }, - { - 'name': 'JobPriorized', - 'isAbstract': true, - 'extends': ['bpmn:Process', 'flowable:AsyncCapable'], - 'properties': [ - { - 'name': 'jobPriority', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'SignalEventDefinition', - 'isAbstract': true, - 'extends': ['bpmn:SignalEventDefinition'], - 'properties': [ - { - 'name': 'async', - 'isAttr': true, - 'type': 'Boolean', - 'default': false - } - ] - }, - { - 'name': 'ErrorEventDefinition', - 'isAbstract': true, - 'extends': ['bpmn:ErrorEventDefinition'], - 'properties': [ - { - 'name': 'errorCodeVariable', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'errorMessageVariable', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'Error', - 'isAbstract': true, - 'extends': ['bpmn:Error'], - 'properties': [ - { - 'name': 'flowable:errorMessage', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'PotentialStarter', - 'superClass': ['Element'], - 'properties': [ - { - 'name': 'resourceAssignmentExpression', - 'type': 'bpmn:ResourceAssignmentExpression' - } - ] - }, - { - 'name': 'UserTask', - 'isAbstract': true, - 'extends': ['bpmn:UserTask'], - 'properties': [ - { - 'name': 'timerEventDefinition', - 'type': 'Expression' - }, - { - 'name': 'multiInstanceLoopCharacteristics', - 'type': 'MultiInstanceLoopCharacteristics' - } - ] - }, - { - 'name': 'StartEvent', - 'isAbstract': true, - 'extends': ['bpmn:StartEvent'], - 'properties': [ - { - 'name': 'timerEventDefinition', - 'type': 'Expression' - } - ] - }, - { - 'name': 'FormSupported', - 'isAbstract': true, - 'extends': ['bpmn:StartEvent', 'bpmn:UserTask'], - 'properties': [ - { - 'name': 'formHandlerClass', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'formKey', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'TemplateSupported', - 'isAbstract': true, - 'extends': ['bpmn:Process', 'bpmn:FlowElement'], - 'properties': [ - { - 'name': 'modelerTemplate', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'Initiator', - 'isAbstract': true, - 'extends': ['bpmn:StartEvent'], - 'properties': [ - { - 'name': 'initiator', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'ScriptTask', - 'isAbstract': true, - 'extends': ['bpmn:ScriptTask'], - 'properties': [ - { - 'name': 'resultVariable', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'resource', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'Process', - 'isAbstract': true, - 'extends': ['bpmn:Process'], - 'properties': [ - { - 'name': 'candidateStarterGroups', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'candidateStarterUsers', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'versionTag', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'historyTimeToLive', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'isStartableInTasklist', - 'isAttr': true, - 'type': 'Boolean', - 'default': true - } - ] - }, - { - 'name': 'EscalationEventDefinition', - 'isAbstract': true, - 'extends': ['bpmn:EscalationEventDefinition'], - 'properties': [ - { - 'name': 'escalationCodeVariable', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'FormalExpression', - 'isAbstract': true, - 'extends': ['bpmn:FormalExpression'], - 'properties': [ - { - 'name': 'resource', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'Assignable', - 'extends': ['bpmn:UserTask'], - 'properties': [ - { - 'name': 'candidateGroups', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'dueDate', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'followUpDate', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'priority', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'CallActivity', - 'extends': ['bpmn:CallActivity'], - 'properties': [ - { - 'name': 'calledElementBinding', - 'isAttr': true, - 'type': 'String', - 'default': 'latest' - }, - { - 'name': 'calledElementVersion', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'calledElementVersionTag', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'calledElementTenantId', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'caseRef', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'caseBinding', - 'isAttr': true, - 'type': 'String', - 'default': 'latest' - }, - { - 'name': 'caseVersion', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'caseTenantId', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'variableMappingClass', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'variableMappingDelegateExpression', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'ServiceTaskLike', - 'extends': ['bpmn:ServiceTask', 'bpmn:BusinessRuleTask', 'bpmn:SendTask', 'bpmn:MessageEventDefinition'], - 'properties': [ - { - 'name': 'expression', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'class', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'delegateExpression', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'resultVariable', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'ExclusiveGateway', - 'isAbstract': true, - 'extends': ['bpmn:ExclusiveGateway'], - 'properties': [ - { - 'name': 'serviceClass', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'DmnCapable', - 'extends': ['bpmn:BusinessRuleTask'], - 'properties': [ - { - 'name': 'decisionRef', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'decisionRefBinding', - 'isAttr': true, - 'type': 'String', - 'default': 'latest' - }, - { - 'name': 'decisionRefVersion', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'mapDecisionResult', - 'isAttr': true, - 'type': 'String', - 'default': 'resultList' - }, - { - 'name': 'decisionRefTenantId', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'ExternalCapable', - 'extends': ['flowable:ServiceTaskLike'], - 'properties': [ - { - 'name': 'type', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'topic', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'TaskPriorized', - 'extends': ['bpmn:Process', 'flowable:ExternalCapable'], - 'properties': [ - { - 'name': 'taskPriority', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'Properties', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['*'] - }, - 'properties': [ - { - 'name': 'values', - 'type': 'Property', - 'isMany': true - } - ] - }, - { - 'name': 'Property', - 'superClass': ['Element'], - 'properties': [ - { - 'name': 'id', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'name', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'value', - 'type': 'String', - 'isAttr': true - } - ] - }, - { - 'name': 'Connector', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['flowable:ServiceTaskLike'] - }, - 'properties': [ - { - 'name': 'inputOutput', - 'type': 'InputOutput' - }, - { - 'name': 'connectorId', - 'type': 'String' - } - ] - }, - { - 'name': 'InputOutput', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['bpmn:FlowNode', 'flowable:Connector'] - }, - 'properties': [ - { - 'name': 'inputOutput', - 'type': 'InputOutput' - }, - { - 'name': 'connectorId', - 'type': 'String' - }, - { - 'name': 'inputParameters', - 'isMany': true, - 'type': 'InputParameter' - }, - { - 'name': 'outputParameters', - 'isMany': true, - 'type': 'OutputParameter' - } - ] - }, - { - 'name': 'InputOutputParameter', - 'properties': [ - { - 'name': 'name', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'value', - 'isBody': true, - 'type': 'String' - }, - { - 'name': 'definition', - 'type': 'InputOutputParameterDefinition' - } - ] - }, - { - 'name': 'InputOutputParameterDefinition', - 'isAbstract': true - }, - { - 'name': 'List', - 'superClass': ['InputOutputParameterDefinition'], - 'properties': [ - { - 'name': 'items', - 'isMany': true, - 'type': 'InputOutputParameterDefinition' - } - ] - }, - { - 'name': 'Map', - 'superClass': ['InputOutputParameterDefinition'], - 'properties': [ - { - 'name': 'entries', - 'isMany': true, - 'type': 'Entry' - } - ] - }, - { - 'name': 'Entry', - 'properties': [ - { - 'name': 'key', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'value', - 'isBody': true, - 'type': 'String' - }, - { - 'name': 'definition', - 'type': 'InputOutputParameterDefinition' - } - ] - }, - { - 'name': 'Value', - 'superClass': ['InputOutputParameterDefinition'], - 'properties': [ - { - 'name': 'id', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'name', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'value', - 'isBody': true, - 'type': 'String' - } - ] - }, - { - 'name': 'Script', - 'superClass': ['InputOutputParameterDefinition'], - 'properties': [ - { - 'name': 'scriptFormat', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'resource', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'value', - 'isBody': true, - 'type': 'String' - } - ] - }, - { - 'name': 'Field', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['flowable:ServiceTaskLike', 'flowable:ExecutionListener', 'flowable:TaskListener'] - }, - 'properties': [ - { - 'name': 'name', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'expression', - 'isAttr': true, - 'type': 'expression' - }, - { - 'name': 'string', - 'type': 'string' - }, - { - 'name': 'stringValue', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'string', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['flowable:Field'] - }, - 'properties': [ - { - 'name': 'body', - 'isBody': true, - 'type': 'String' - } - ] - }, - { - 'name': 'expression', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['flowable:Field'] - }, - 'properties': [ - { - 'name': 'body', - 'isBody': true, - 'type': 'String' - } - ] - }, - { - 'name': 'InputParameter', - 'superClass': ['InputOutputParameter'] - }, - { - 'name': 'OutputParameter', - 'superClass': ['InputOutputParameter'] - }, - { - 'name': 'Collectable', - 'isAbstract': true, - 'extends': ['bpmn:MultiInstanceLoopCharacteristics'], - 'superClass': ['flowable:AsyncCapable'], - 'properties': [ - { - 'name': 'collection', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'elementVariable', - 'isAttr': true, - 'type': 'String' - } - ] - }, - { - 'name': 'SequenceFlow', - 'superClass': ['FlowElement'], - 'properties': [ - { - 'name': 'isImmediate', - 'isAttr': true, - 'type': 'Boolean' - }, - { - 'name': 'conditionExpression', - 'type': 'Expression' - }, - { - 'name': 'sourceRef', - 'type': 'FlowNode', - 'isAttr': true, - 'isReference': true - }, - { - 'name': 'targetRef', - 'type': 'FlowNode', - 'isAttr': true, - 'isReference': true - } - ] - }, - { - 'name': 'MultiInstanceLoopCharacteristics', - 'superClass': ['LoopCharacteristics'], - 'properties': [ - { - 'name': 'isSequential', - 'default': false, - 'isAttr': true, - 'type': 'Boolean' - }, - { - 'name': 'behavior', - 'type': 'MultiInstanceBehavior', - 'default': 'All', - 'isAttr': true - }, - { - 'name': 'loopCardinality', - 'type': 'Expression', - 'xml': { - 'serialize': 'xsi:type' - } - }, - { - 'name': 'loopDataInputRef', - 'type': 'ItemAwareElement', - 'isReference': true - }, - { - 'name': 'loopDataOutputRef', - 'type': 'ItemAwareElement', - 'isReference': true - }, - { - 'name': 'inputDataItem', - 'type': 'DataInput', - 'xml': { - 'serialize': 'property' - } - }, - { - 'name': 'outputDataItem', - 'type': 'DataOutput', - 'xml': { - 'serialize': 'property' - } - }, - { - 'name': 'complexBehaviorDefinition', - 'type': 'ComplexBehaviorDefinition', - 'isMany': true - }, - { - 'name': 'completionCondition', - 'type': 'Expression', - 'xml': { - 'serialize': 'xsi:type' - } - }, - { - 'name': 'oneBehaviorEventRef', - 'type': 'EventDefinition', - 'isAttr': true, - 'isReference': true - }, - { - 'name': 'noneBehaviorEventRef', - 'type': 'EventDefinition', - 'isAttr': true, - 'isReference': true - } - ] - }, - { - 'name': 'FailedJobRetryTimeCycle', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['flowable:AsyncCapable', 'bpmn:MultiInstanceLoopCharacteristics'] - }, - 'properties': [ - { - 'name': 'body', - 'isBody': true, - 'type': 'String' - } - ] - }, - { - 'name': 'ExecutionListener', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': [ - 'bpmn:Task', - 'bpmn:ServiceTask', - 'bpmn:UserTask', - 'bpmn:BusinessRuleTask', - 'bpmn:ScriptTask', - 'bpmn:ReceiveTask', - 'bpmn:ManualTask', - 'bpmn:ExclusiveGateway', - 'bpmn:SequenceFlow', - 'bpmn:ParallelGateway', - 'bpmn:InclusiveGateway', - 'bpmn:EventBasedGateway', - 'bpmn:StartEvent', - 'bpmn:IntermediateCatchEvent', - 'bpmn:IntermediateThrowEvent', - 'bpmn:EndEvent', - 'bpmn:BoundaryEvent', - 'bpmn:CallActivity', - 'bpmn:SubProcess', - 'bpmn:Process' - ] - }, - 'properties': [ - { - 'name': 'expression', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'class', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'delegateExpression', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'event', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'script', - 'type': 'Script' - }, - { - 'name': 'fields', - 'type': 'Field', - 'isMany': true - } - ] - }, - { - 'name': 'TaskListener', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['bpmn:UserTask'] - }, - 'properties': [ - { - 'name': 'expression', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'class', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'delegateExpression', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'event', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'script', - 'type': 'Script' - }, - { - 'name': 'fields', - 'type': 'Field', - 'isMany': true - } - ] - }, - { - 'name': 'FormProperty', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['bpmn:StartEvent', 'bpmn:UserTask'] - }, - 'properties': [ - { - 'name': 'id', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'name', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'type', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'required', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'readable', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'writable', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'variable', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'expression', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'datePattern', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'default', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'values', - 'type': 'Value', - 'isMany': true - } - ] - }, - { - 'name': 'FormData', - 'superClass': ['Element'], - 'meta': { - 'allowedIn': ['bpmn:StartEvent', 'bpmn:UserTask'] - }, - 'properties': [ - { - 'name': 'fields', - 'type': 'FormField', - 'isMany': true - }, - { - 'name': 'businessKey', - 'type': 'String', - 'isAttr': true - } - ] - }, - { - 'name': 'FormField', - 'superClass': ['Element'], - 'properties': [ - { - 'name': 'id', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'label', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'type', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'datePattern', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'defaultValue', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'properties', - 'type': 'Properties' - }, - { - 'name': 'validation', - 'type': 'Validation' - }, - { - 'name': 'values', - 'type': 'Value', - 'isMany': true - } - ] - }, - { - 'name': 'Validation', - 'superClass': ['Element'], - 'properties': [ - { - 'name': 'constraints', - 'type': 'Constraint', - 'isMany': true - } - ] - }, - { - 'name': 'Constraint', - 'superClass': ['Element'], - 'properties': [ - { - 'name': 'name', - 'type': 'String', - 'isAttr': true - }, - { - 'name': 'config', - 'type': 'String', - 'isAttr': true - } - ] - }, - { - 'name': 'ConditionalEventDefinition', - 'isAbstract': true, - 'extends': ['bpmn:ConditionalEventDefinition'], - 'properties': [ - { - 'name': 'variableName', - 'isAttr': true, - 'type': 'String' - }, - { - 'name': 'variableEvent', - 'isAttr': true, - 'type': 'String' - } - ] - } - ], - 'emumerations': [] -}; diff --git a/im-admin-ui/src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts b/im-admin-ui/src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts deleted file mode 100644 index 13ccf50..0000000 --- a/im-admin-ui/src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts +++ /dev/null @@ -1,138 +0,0 @@ -import ContextPadProvider from 'bpmn-js/lib/features/context-pad/ContextPadProvider'; -import { Injector } from 'didi'; -import EventBus from 'diagram-js/lib/core/EventBus'; -import ContextPad from 'diagram-js/lib/features/context-pad/ContextPad'; -import Modeling from 'bpmn-js/lib/features/modeling/Modeling.js'; -import ElementFactory from 'bpmn-js/lib/features/modeling/ElementFactory'; -import Connect from 'diagram-js/lib/features/connect/Connect'; -import Create from 'diagram-js/lib/features/create/Create'; -import PopupMenu from 'diagram-js/lib/features/popup-menu/PopupMenu'; -import Canvas from 'diagram-js/lib/core/Canvas'; -import Rules from 'diagram-js/lib/features/rules/Rules'; -import { Element, Shape } from 'diagram-js/lib/model/Types'; -import BpmnFactory from 'bpmn-js/lib/features/modeling/BpmnFactory'; -import modeler from '@/store/modules/modeler'; - -// @Description: 增强元素连线事件 - -class CustomContextPadProvider extends ContextPadProvider { - private _contextPad: ContextPad; - private _modeling: Modeling; - private _elementFactory: ElementFactory; - private _autoPlace: any; - private _connect: Connect; - private _create: Create; - private _popupMenu: PopupMenu; - private _canvas: Canvas; - private _rules: Rules; - - constructor( - config: any, - injector: Injector, - eventBus: EventBus, - contextPad: ContextPad, - modeling: Modeling, - elementFactory: ElementFactory, - connect: Connect, - create: Create, - popupMenu: PopupMenu, - canvas: Canvas, - rules: Rules, - translate - ) { - // @ts-expect-error 忽略异常 - super(config, injector, eventBus, contextPad, modeling, elementFactory, connect, create, popupMenu, canvas, rules, translate); - - this._contextPad = contextPad; - this._modeling = modeling; - this._elementFactory = elementFactory; - this._connect = connect; - this._create = create; - this._popupMenu = popupMenu; - this._canvas = canvas; - this._rules = rules; - - this._autoPlace = injector.get('autoPlace', false); - } - - getContextPadEntries(element: Element) { - const actions: Record = {}; - - const appendUserTask = (event: Event, element: Shape) => { - const shape = this._elementFactory.createShape({ type: 'bpmn:UserTask' }); - this._create.start(event, shape, { - source: element - }); - }; - - const appendMultiInstanceUserTask = (event: Event, element: Shape) => { - const store = modeler(); - const bpmnFactory = store.getModeler().get('bpmnFactory') as BpmnFactory; - const businessObject = bpmnFactory.create('bpmn:UserTask', { - // name: '多实例用户任务', - isForCompensation: false - }); - businessObject.loopCharacteristics = bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics'); - // 创建 Shape - const shape = this._elementFactory.createShape({ - type: 'bpmn:UserTask', - businessObject: businessObject - }); - this._create.start(event, shape, { source: element }); - }; - - const appendTask = this._autoPlace - ? (event, element) => { - const bpmnFactory: BpmnFactory | undefined = modeler().getModeler().get('bpmnFactory'); - const businessObject = bpmnFactory.create('bpmn:UserTask', { - // name: '多实例用户任务',// 右键创建显示 - isForCompensation: false - }); - - // 创建多实例属性并分配给用户任务的 loopCharacteristics - businessObject.loopCharacteristics = bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics'); - - // 创建 Shape - const shape = this._elementFactory.createShape({ - type: 'bpmn:UserTask', - businessObject: businessObject - }); - - this._autoPlace.append(element, shape); - } - : appendMultiInstanceUserTask; - - const append = this._autoPlace - ? (event: Event, element: Shape) => { - const shape = this._elementFactory.createShape({ type: 'bpmn:UserTask' }); - this._autoPlace.append(element, shape); - } - : appendUserTask; - - // // 添加创建用户任务按钮 - actions['append.append-user-task'] = { - group: 'model', - className: 'bpmn-icon-user-task', - title: '用户任务', - action: { - dragstart: appendUserTask, - click: append - } - }; - - // 添加创建多实例用户任务按钮 - actions['append.append-multi-instance-user-task'] = { - group: 'model', - className: 'bpmn-icon-user', // 你可以使用多实例用户任务的图标 bpmn-icon-user bpmn-icon-user-task - title: '多实例用户任务', - action: { - dragstart: appendMultiInstanceUserTask, - click: appendTask - } - }; - - return actions; - } -} - -export default CustomContextPadProvider; diff --git a/im-admin-ui/src/bpmn/assets/module/Palette/CustomPaletteProvider.ts b/im-admin-ui/src/bpmn/assets/module/Palette/CustomPaletteProvider.ts deleted file mode 100644 index 8556d9b..0000000 --- a/im-admin-ui/src/bpmn/assets/module/Palette/CustomPaletteProvider.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { assign } from 'min-dash'; -import PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider'; -import ElementFactory from 'bpmn-js/lib/features/modeling/ElementFactory'; -import Create from 'diagram-js/lib/features/create/Create'; -import SpaceTool from 'diagram-js/lib/features/space-tool/SpaceTool'; -import LassoTool from 'diagram-js/lib/features/lasso-tool/LassoTool'; -import HandTool from 'diagram-js/lib/features/hand-tool/HandTool'; -import GlobalConnect from 'diagram-js/lib/features/global-connect/GlobalConnect'; -import Palette from 'diagram-js/lib/features/palette/Palette'; -import modeler from '@/store/modules/modeler'; -import BpmnFactory from 'bpmn-js/lib/features/modeling/BpmnFactory'; - -// @Description: 增强左侧面板 -class CustomPaletteProvider extends PaletteProvider { - private readonly _palette: Palette; - private readonly _create: Create; - private readonly _elementFactory: ElementFactory; - private readonly _spaceTool: SpaceTool; - private readonly _lassoTool: LassoTool; - private readonly _handTool: HandTool; - private readonly _globalConnect: GlobalConnect; - private readonly _translate: any; - - constructor(palette, create, elementFactory, spaceTool, lassoTool, handTool, globalConnect, translate) { - super(palette, create, elementFactory, spaceTool, lassoTool, handTool, globalConnect, translate); - this._palette = palette; - this._create = create; - this._elementFactory = elementFactory; - this._spaceTool = spaceTool; - this._lassoTool = lassoTool; - this._handTool = handTool; - this._globalConnect = globalConnect; - this._translate = translate; - } - - getPaletteEntries() { - const actions = {}, - create = this._create, - elementFactory = this._elementFactory, - translate = this._translate; - - function createAction(type: string, group: string, className: string, title: string, options?: object) { - function createListener(event) { - const shape = elementFactory.createShape(assign({ type: type }, options)); - if (options) { - !shape.businessObject.di && (shape.businessObject.di = {}); - shape.businessObject.di.isExpanded = (options as { [key: string]: any }).isExpanded; - } - create.start(event, shape, null); - } - const shortType = type.replace(/^bpmn:/, ''); - return { - group: group, - className: className, - title: title || translate('Create {type}', { type: shortType }), - action: { - dragstart: createListener, - click: createListener - } - }; - } - - function createMultiInstanceUserTask(event) { - const bpmnFactory: BpmnFactory | undefined = modeler().getBpmnFactory(); - // 创建一个 bpmn:UserTask - const userTask = bpmnFactory.create('bpmn:UserTask', { - // name: '多实例用户任务', // 在画板中显示字段 - isForCompensation: false - }); - // 将多实例属性分配给 bpmn:UserTask 的 loopCharacteristics - userTask.loopCharacteristics = bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics'); - const customUserTask = elementFactory.createShape({ - type: 'bpmn:UserTask', - businessObject: userTask // 分配创建的 userTask 到 businessObject - }); - create.start(event, customUserTask, {}); - } - - assign(actions, { - 'create.parallel-gateway': createAction('bpmn:ParallelGateway', 'gateway', 'bpmn-icon-gateway-parallel', '并行网关'), - 'create.event-base-gateway': createAction('bpmn:EventBasedGateway', 'gateway', 'bpmn-icon-gateway-eventbased', '事件网关'), - // 分组线 - 'gateway-separator': { - group: 'gateway', - separator: true - }, - 'create.user-task': createAction('bpmn:UserTask', 'activity', 'bpmn-icon-user-task', '创建用户任务'), - 'create.multi-instance-user-task': { - group: 'activity', - type: 'bpmn:UserTask', - className: 'bpmn-icon-user task-multi-instance', - title: '创建多实例用户任务', - action: { - click: createMultiInstanceUserTask, - dragstart: createMultiInstanceUserTask - } - }, - 'task-separator': { - group: 'activity', - separator: true - } - }); - return actions; - } -} - -CustomPaletteProvider['$inject'] = ['palette', 'create', 'elementFactory', 'spaceTool', 'lassoTool', 'handTool', 'globalConnect', 'translate']; - -export default CustomPaletteProvider; diff --git a/im-admin-ui/src/bpmn/assets/module/Renderer/CustomRenderer.ts b/im-admin-ui/src/bpmn/assets/module/Renderer/CustomRenderer.ts deleted file mode 100644 index 6a4eb1a..0000000 --- a/im-admin-ui/src/bpmn/assets/module/Renderer/CustomRenderer.ts +++ /dev/null @@ -1,56 +0,0 @@ -import BaseRenderer from 'diagram-js/lib/draw/BaseRenderer'; -import { - append as svgAppend, - attr as svgAttr, - create as svgCreate, - select as svgSelect, - selectAll as svgSelectAll, - clone as svgClone, - clear as svgClear, - remove as svgRemove -} from 'tiny-svg'; - -const HIGH_PRIORITY = 1500; -export default class CustomRenderer extends BaseRenderer { - bpmnRenderer: BaseRenderer; - modeling: any; - constructor(eventBus, bpmnRenderer, modeling) { - super(eventBus, HIGH_PRIORITY); - this.bpmnRenderer = bpmnRenderer; - this.modeling = modeling; - } - canRender(element) { - // ignore labels - return !element.labelTarget; - } - - /** - * 自定义节点图形 - * @param {*} parentNode 当前元素的svgNode - * @param {*} element - * @returns - */ - drawShape(parentNode, element) { - const shape = this.bpmnRenderer.drawShape(parentNode, element); - const { type, width, height } = element; - // 开始 填充绿色 - if (type === 'bpmn:StartEvent') { - svgAttr(shape, { fill: '#77DF6D' }); - return shape; - } - if (type === 'bpmn:EndEvent') { - svgAttr(shape, { fill: '#EE7B77' }); - return shape; - } - if (type === 'bpmn:UserTask') { - svgAttr(shape, { fill: '#A9C4F8' }); - return shape; - } - return shape; - } - - getShapePath(shape) { - return this.bpmnRenderer.getShapePath(shape); - } -} -CustomRenderer['$inject'] = ['eventBus', 'bpmnRenderer']; diff --git a/im-admin-ui/src/bpmn/assets/module/Translate/index.ts b/im-admin-ui/src/bpmn/assets/module/Translate/index.ts deleted file mode 100644 index 6b52dae..0000000 --- a/im-admin-ui/src/bpmn/assets/module/Translate/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import zh from '../../lang/zh'; - -const customTranslate = (template: any, replacements: any) => { - replacements = replacements || {}; - template = zh[template] || template; - return template.replace(/{([^}]+)}/g, function (_: any, key: any) { - return replacements[key] || '{' + key + '}'; - }); -}; - -export const translateModule = { - translate: ['value', customTranslate] -}; - -export default translateModule; diff --git a/im-admin-ui/src/bpmn/assets/module/index.ts b/im-admin-ui/src/bpmn/assets/module/index.ts deleted file mode 100644 index 55f6b9f..0000000 --- a/im-admin-ui/src/bpmn/assets/module/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -// 翻译模块 -import TranslationModule from './Translate'; -import { ModuleDeclaration } from 'didi'; -import CustomPaletteProvider from './Palette/CustomPaletteProvider'; -import CustomRenderer from './Renderer/CustomRenderer'; -import CustomContextPadProvider from './ContextPad/CustomContextPadProvider'; - -const Module: ModuleDeclaration[] = [ - { - __init__: ['customPaletteProvider', 'customContextPadProvider', 'customRenderer'], - customPaletteProvider: ['type', CustomPaletteProvider], - customRenderer: ['type', CustomRenderer], - customContextPadProvider: ['type', CustomContextPadProvider] - }, - TranslationModule -]; -export default Module; diff --git a/im-admin-ui/src/bpmn/assets/showConfig.ts b/im-admin-ui/src/bpmn/assets/showConfig.ts deleted file mode 100644 index 853eb35..0000000 --- a/im-admin-ui/src/bpmn/assets/showConfig.ts +++ /dev/null @@ -1,50 +0,0 @@ -export default { - 'bpmn:EndEvent': {}, - 'bpmn:StartEvent': { - initiator: true, - formKey: true - }, - 'bpmn:UserTask': { - allocationType: true, - specifyDesc: true, - multipleUserAuditType: true, - async: true, - priority: true, - skipExpression: true, - dueDate: true, - taskListener: true, - executionListener: true - }, - 'bpmn:ServiceTask': { - async: true, - skipExpression: true, - isForCompensation: true, - triggerable: true, - class: true - }, - 'bpmn:ScriptTask': { - async: true, - isForCompensation: true, - autoStoreVariables: true - }, - 'bpmn:ManualTask': { - async: true, - isForCompensation: true - }, - 'bpmn:ReceiveTask': { - async: true, - isForCompensation: true - }, - 'bpmn:SendTask': { - async: true, - isForCompensation: true - }, - 'bpmn:BusinessRuleTask': { - async: true, - isForCompensation: true, - ruleVariablesInput: true, - rules: true, - resultVariable: true, - exclude: true - } -}; diff --git a/im-admin-ui/src/bpmn/assets/style/index.scss b/im-admin-ui/src/bpmn/assets/style/index.scss deleted file mode 100644 index 3c92792..0000000 --- a/im-admin-ui/src/bpmn/assets/style/index.scss +++ /dev/null @@ -1,284 +0,0 @@ -.djs-palette { - width: 300px; - - .bpmn-icon-hand-tool:hover { - &:after { - content: '启动手动工具'; - position: absolute; - left: 45px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-lasso-tool:hover { - &:after { - content: '启动套索工具'; - position: absolute; - left: 100px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-space-tool:hover { - &:after { - content: '启动创建/删除空间工具'; - position: absolute; - left: 45px; - width: 170px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-connection-multi:hover { - &:after { - content: '启动全局连接工具'; - position: absolute; - left: 100px; - width: 140px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-start-event-none:hover { - &:after { - content: '创建开始事件'; - position: absolute; - left: 45px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-intermediate-event-none:hover { - &:after { - content: '创建中间/边界事件'; - position: absolute; - left: 100px; - width: 140px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-end-event-none:hover { - &:after { - content: '创建结束事件'; - position: absolute; - left: 45px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-gateway-none:hover { - &:after { - content: '创建网关'; - position: absolute; - left: 100px; - width: 90px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-gateway-parallel:hover { - &:after { - content: '创建并行网关'; - position: absolute; - left: 45px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-gateway-eventbased:hover { - &:after { - content: '创建事件网关'; - position: absolute; - left: 100px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-task:hover { - &:after { - content: '创建任务'; - position: absolute; - left: 45px; - width: 80px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-subprocess-expanded:hover { - &:after { - content: '创建可折叠子流程'; - position: absolute; - left: 100px; - width: 140px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-user-task:hover { - &:after { - content: '创建用户任务'; - position: absolute; - left: 45px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - - .task-multi-instance:hover { - &:after { - content: '创建多实例用户任务'; - position: absolute; - left: 100px; - width: 160px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-participant:hover { - &:after { - content: '创建泳池/泳道'; - position: absolute; - left: 45px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - .bpmn-icon-data-object { - display: none; - &:hover { - &:after { - content: '创建数据对象'; - position: absolute; - left: 45px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - } - .bpmn-icon-data-store { - display: none; - &:hover { - &:after { - content: '创建数据存储'; - position: absolute; - left: 100px; - width: 120px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - } - .bpmn-icon-group { - display: none; - &:hover { - &:after { - content: '创建分组'; - position: absolute; - left: 100px; - width: 100px; - font-size: 15px; - font-weight: bold; - color: #3a84de; - border-radius: 2px; - border: 1px solid #cccccc; - background-color: #fafafa; - opacity: 0.8; - } - } - } -} diff --git a/im-admin-ui/src/bpmn/hooks/usePanel.ts b/im-admin-ui/src/bpmn/hooks/usePanel.ts deleted file mode 100644 index ace579b..0000000 --- a/im-admin-ui/src/bpmn/hooks/usePanel.ts +++ /dev/null @@ -1,145 +0,0 @@ -import showConfig from '../assets/showConfig'; -import type { ModdleElement } from 'bpmn'; -import useModelerStore from '@/store/modules/modeler'; -import { MultiInstanceTypeEnum } from '@/enums/bpmn/IndexEnums'; -interface Options { - element: ModdleElement; -} - -export default (ops: Options) => { - const { element } = ops; - const { getModeling, getModdle } = useModelerStore(); - const modeling = getModeling(); - const moddle = getModdle(); - - /** - * 当前节点类型 - */ - const elementType = computed(() => { - const bizObj = element.businessObject; - return bizObj.eventDefinitions ? bizObj.eventDefinitions[0].$type : bizObj.$type; - }); - - /** - * 用于控制面板字段显示与隐藏的配置 - */ - const config = computed(() => showConfig[elementType.value] || {}); - - /** - * 创建一个节点 - * @param elementType 节点类型 - * @param properties 属性 - * @param parent 父节点 - */ - const createModdleElement = (elementType: string, properties: any, parent: ModdleElement) => { - const element = moddle.create(elementType, properties); - parent && (element.$parent = parent); - return element; - }; - - /** - * 获取扩展属性,如果不存在会自动创建 - */ - const getExtensionElements = (create = true) => { - let extensionElements = element.businessObject.get('extensionElements'); - if (!extensionElements && create) { - extensionElements = createModdleElement('bpmn:ExtensionElements', { values: [] }, element.businessObject); - modeling.updateModdleProperties(element, element.businessObject, { extensionElements }); - } - return extensionElements; - }; - - /** - * 获取extensionElements下的properties - * @param extensionElements 可选参数,默认获取当前Element下的extensionElements下的Properties - */ - const getPropertiesElements = (extensionElements?: ModdleElement) => { - if (!extensionElements) { - extensionElements = getExtensionElements(); - } - let propertiesElements = extensionElements.values.find((item) => item.$type === 'flowable:properties'); - if (!propertiesElements) { - propertiesElements = createModdleElement('flowable:properties', { values: [] }, extensionElements); - modeling.updateModdleProperties(element, extensionElements, { - values: [...extensionElements.get<[]>('values'), propertiesElements] - }); - } - return propertiesElements; - }; - - /** - * 更新节点属性 - * @param properties 属性值 - */ - const updateProperties = (properties: any) => { - modeling.updateProperties(element, properties); - }; - - /** - * 更新节点信息 - * @param updateElement 需要更新的节点 - * @param properties 属性 - */ - const updateModdleProperties = (updateElement, properties: any) => { - modeling.updateModdleProperties(element, updateElement, properties); - }; - - /** - * 更新Property属性 - * @param name key值 - * @param value 值 - */ - const updateProperty = (name: string, value: string) => { - const propertiesElements = getPropertiesElements(); - - let propertyElements = propertiesElements.values.find((item) => item.name === name); - if (!propertyElements) { - propertyElements = createModdleElement('flowable:property', { name: name, value: value }, propertiesElements); - modeling.updateModdleProperties(element, propertiesElements, { - values: [...propertiesElements.get('values'), propertyElements] - }); - } else { - propertyElements.name = name; - propertyElements.value = value; - } - return propertyElements; - }; - - const idChange = (newVal: string) => { - if (newVal) { - updateProperties({ id: newVal }); - } - }; - const nameChange = (newVal: string) => { - if (newVal) { - updateProperties({ name: newVal }); - } - }; - const formKeyChange = (newVal: string) => { - updateProperties({ formKey: newVal }); - }; - const constant = { - MultiInstanceType: [ - { id: '373d4b81-a0d1-4eb8-8685-0d2fb1b468e2', label: '无', value: MultiInstanceTypeEnum.NONE }, - { id: 'b5acea7c-b7e5-46b0-8778-390db091bdab', label: '串行', value: MultiInstanceTypeEnum.SERIAL }, - { id: 'b4f0c683-1ccc-43c4-8380-e1b998986caf', label: '并行', value: MultiInstanceTypeEnum.PARALLEL } - ] - }; - - return { - elementType, - constant, - showConfig: config, - - updateProperties, - updateProperty, - updateModdleProperties, - - createModdleElement, - idChange, - nameChange, - formKeyChange, - getExtensionElements, - getPropertiesElements - }; -}; diff --git a/im-admin-ui/src/bpmn/hooks/useParseElement.ts b/im-admin-ui/src/bpmn/hooks/useParseElement.ts deleted file mode 100644 index e1a6054..0000000 --- a/im-admin-ui/src/bpmn/hooks/useParseElement.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { ModdleElement } from 'bpmn'; - -interface Options { - element: ModdleElement; -} - -interface Data { - id: string; -} - -export default (ops: Options) => { - const { element } = ops; - - const parseData = (): T => { - const result = { - ...element.businessObject, - ...element.businessObject.$attrs - }; - - // 移除flowable前缀,格式化数组 - for (const key in result) { - if (key.indexOf('flowable:') === 0) { - const newKey = key.replace('flowable:', ''); - result[newKey] = result[key]; - delete result[key]; - } - } - return { ...result } as T; - }; - - return { - parseData - }; -}; diff --git a/im-admin-ui/src/bpmn/index.vue b/im-admin-ui/src/bpmn/index.vue deleted file mode 100644 index 15437c8..0000000 --- a/im-admin-ui/src/bpmn/index.vue +++ /dev/null @@ -1,496 +0,0 @@ - - - - - diff --git a/im-admin-ui/src/bpmn/panel/GatewayPanel.vue b/im-admin-ui/src/bpmn/panel/GatewayPanel.vue deleted file mode 100644 index 20cc134..0000000 --- a/im-admin-ui/src/bpmn/panel/GatewayPanel.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - diff --git a/im-admin-ui/src/bpmn/panel/ParticipantPanel.vue b/im-admin-ui/src/bpmn/panel/ParticipantPanel.vue deleted file mode 100644 index b1d42e6..0000000 --- a/im-admin-ui/src/bpmn/panel/ParticipantPanel.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - diff --git a/im-admin-ui/src/bpmn/panel/ProcessPanel.vue b/im-admin-ui/src/bpmn/panel/ProcessPanel.vue deleted file mode 100644 index 9e118e2..0000000 --- a/im-admin-ui/src/bpmn/panel/ProcessPanel.vue +++ /dev/null @@ -1,71 +0,0 @@ - - - - - diff --git a/im-admin-ui/src/bpmn/panel/SequenceFlowPanel.vue b/im-admin-ui/src/bpmn/panel/SequenceFlowPanel.vue deleted file mode 100644 index eac8227..0000000 --- a/im-admin-ui/src/bpmn/panel/SequenceFlowPanel.vue +++ /dev/null @@ -1,95 +0,0 @@ - - - - diff --git a/im-admin-ui/src/bpmn/panel/StartEndPanel.vue b/im-admin-ui/src/bpmn/panel/StartEndPanel.vue deleted file mode 100644 index bde1212..0000000 --- a/im-admin-ui/src/bpmn/panel/StartEndPanel.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - diff --git a/im-admin-ui/src/bpmn/panel/SubProcessPanel.vue b/im-admin-ui/src/bpmn/panel/SubProcessPanel.vue deleted file mode 100644 index 3490fff..0000000 --- a/im-admin-ui/src/bpmn/panel/SubProcessPanel.vue +++ /dev/null @@ -1,193 +0,0 @@ - - - - diff --git a/im-admin-ui/src/bpmn/panel/TaskPanel.vue b/im-admin-ui/src/bpmn/panel/TaskPanel.vue deleted file mode 100644 index a42de8a..0000000 --- a/im-admin-ui/src/bpmn/panel/TaskPanel.vue +++ /dev/null @@ -1,491 +0,0 @@ - - - - diff --git a/im-admin-ui/src/bpmn/panel/index.vue b/im-admin-ui/src/bpmn/panel/index.vue deleted file mode 100644 index 445571a..0000000 --- a/im-admin-ui/src/bpmn/panel/index.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - diff --git a/im-admin-ui/src/bpmn/panel/property/DueDate.vue b/im-admin-ui/src/bpmn/panel/property/DueDate.vue deleted file mode 100644 index 882766b..0000000 --- a/im-admin-ui/src/bpmn/panel/property/DueDate.vue +++ /dev/null @@ -1,252 +0,0 @@ - - - diff --git a/im-admin-ui/src/bpmn/panel/property/ExecutionListener.vue b/im-admin-ui/src/bpmn/panel/property/ExecutionListener.vue deleted file mode 100644 index 3c584cb..0000000 --- a/im-admin-ui/src/bpmn/panel/property/ExecutionListener.vue +++ /dev/null @@ -1,308 +0,0 @@ - - - - diff --git a/im-admin-ui/src/bpmn/panel/property/ListenerParam.vue b/im-admin-ui/src/bpmn/panel/property/ListenerParam.vue deleted file mode 100644 index 21c6de1..0000000 --- a/im-admin-ui/src/bpmn/panel/property/ListenerParam.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/im-admin-ui/src/bpmn/panel/property/TaskListener.vue b/im-admin-ui/src/bpmn/panel/property/TaskListener.vue deleted file mode 100644 index 9a32c47..0000000 --- a/im-admin-ui/src/bpmn/panel/property/TaskListener.vue +++ /dev/null @@ -1,310 +0,0 @@ - - - - diff --git a/im-admin-ui/src/components/BpmnDesign/index.vue b/im-admin-ui/src/components/BpmnDesign/index.vue deleted file mode 100644 index 1f84516..0000000 --- a/im-admin-ui/src/components/BpmnDesign/index.vue +++ /dev/null @@ -1,71 +0,0 @@ - - - - - diff --git a/im-admin-ui/src/components/BpmnView/index.vue b/im-admin-ui/src/components/BpmnView/index.vue deleted file mode 100644 index c5e0c7b..0000000 --- a/im-admin-ui/src/components/BpmnView/index.vue +++ /dev/null @@ -1,411 +0,0 @@ - - - - - diff --git a/im-admin-ui/src/components/RuoYiDoc/index.vue b/im-admin-ui/src/components/RuoYiDoc/index.vue deleted file mode 100644 index 1e27d89..0000000 --- a/im-admin-ui/src/components/RuoYiDoc/index.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/im-admin-ui/src/components/RuoYiGit/index.vue b/im-admin-ui/src/components/RuoYiGit/index.vue deleted file mode 100644 index ad27808..0000000 --- a/im-admin-ui/src/components/RuoYiGit/index.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/im-admin-ui/src/layout/components/Navbar.vue b/im-admin-ui/src/layout/components/Navbar.vue index c2ed0b6..bcf6403 100644 --- a/im-admin-ui/src/layout/components/Navbar.vue +++ b/im-admin-ui/src/layout/components/Navbar.vue @@ -43,14 +43,6 @@ - - - - - - - - diff --git a/im-admin-ui/src/router/index.ts b/im-admin-ui/src/router/index.ts index 86e0092..6be5060 100644 --- a/im-admin-ui/src/router/index.ts +++ b/im-admin-ui/src/router/index.ts @@ -162,20 +162,6 @@ export const dynamicRoutes: RouteRecordRaw[] = [ meta: { title: '修改生成配置', activeMenu: '/tool/gen', icon: '', noCache: true } } ] - }, - { - path: '/workflow/leaveEdit', - component: Layout, - hidden: true, - permissions: ['workflow:leave:edit'], - children: [ - { - path: 'index', - component: () => import('@/views/workflow/leave/leaveEdit.vue'), - name: 'leaveEdit', - meta: { title: '请假申请', activeMenu: '/workflow/leave', noCache: true } - } - ] } ]; diff --git a/im-admin-ui/src/views/demo/demo/index.vue b/im-admin-ui/src/views/demo/demo/index.vue deleted file mode 100644 index 523deff..0000000 --- a/im-admin-ui/src/views/demo/demo/index.vue +++ /dev/null @@ -1,254 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/demo/tree/index.vue b/im-admin-ui/src/views/demo/tree/index.vue deleted file mode 100644 index 921ddd9..0000000 --- a/im-admin-ui/src/views/demo/tree/index.vue +++ /dev/null @@ -1,258 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/login.vue b/im-admin-ui/src/views/login.vue index db1fca6..5d5fd82 100644 --- a/im-admin-ui/src/views/login.vue +++ b/im-admin-ui/src/views/login.vue @@ -1,7 +1,7 @@ @@ -186,20 +165,7 @@ const initTenantList = async () => { } }; -/** - * 第三方登录 - * @param type - */ -const doSocialLogin = (type: string) => { - authBinding(type, loginForm.value.tenantId).then((res: any) => { - if (res.code === HttpStatus.SUCCESS) { - // 获取授权地址跳转 - window.location.href = res.data; - } else { - ElMessage.error(res.msg); - } - }); -}; + onMounted(() => { getCode(); diff --git a/im-admin-ui/src/views/monitor/admin/index.vue b/im-admin-ui/src/views/monitor/admin/index.vue deleted file mode 100644 index b71a5cc..0000000 --- a/im-admin-ui/src/views/monitor/admin/index.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/monitor/snailjob/index.vue b/im-admin-ui/src/views/monitor/snailjob/index.vue deleted file mode 100644 index 89e3b23..0000000 --- a/im-admin-ui/src/views/monitor/snailjob/index.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/category/index.vue b/im-admin-ui/src/views/workflow/category/index.vue deleted file mode 100644 index fd3bfc5..0000000 --- a/im-admin-ui/src/views/workflow/category/index.vue +++ /dev/null @@ -1,263 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/formManage/index.vue b/im-admin-ui/src/views/workflow/formManage/index.vue deleted file mode 100644 index 9b9cfe2..0000000 --- a/im-admin-ui/src/views/workflow/formManage/index.vue +++ /dev/null @@ -1,243 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/leave/index.vue b/im-admin-ui/src/views/workflow/leave/index.vue deleted file mode 100644 index f413136..0000000 --- a/im-admin-ui/src/views/workflow/leave/index.vue +++ /dev/null @@ -1,242 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/leave/leaveEdit.vue b/im-admin-ui/src/views/workflow/leave/leaveEdit.vue deleted file mode 100644 index 55556fd..0000000 --- a/im-admin-ui/src/views/workflow/leave/leaveEdit.vue +++ /dev/null @@ -1,252 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/model/index.vue b/im-admin-ui/src/views/workflow/model/index.vue deleted file mode 100644 index e83cd94..0000000 --- a/im-admin-ui/src/views/workflow/model/index.vue +++ /dev/null @@ -1,383 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/processDefinition/components/processPreview.vue b/im-admin-ui/src/views/workflow/processDefinition/components/processPreview.vue deleted file mode 100644 index 19a95df..0000000 --- a/im-admin-ui/src/views/workflow/processDefinition/components/processPreview.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/processDefinition/index.vue b/im-admin-ui/src/views/workflow/processDefinition/index.vue deleted file mode 100644 index 1dacb80..0000000 --- a/im-admin-ui/src/views/workflow/processDefinition/index.vue +++ /dev/null @@ -1,517 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/processInstance/index.vue b/im-admin-ui/src/views/workflow/processInstance/index.vue deleted file mode 100644 index 7c60880..0000000 --- a/im-admin-ui/src/views/workflow/processInstance/index.vue +++ /dev/null @@ -1,364 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/task/allTaskWaiting.vue b/im-admin-ui/src/views/workflow/task/allTaskWaiting.vue deleted file mode 100644 index fe530b8..0000000 --- a/im-admin-ui/src/views/workflow/task/allTaskWaiting.vue +++ /dev/null @@ -1,286 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/task/myDocument.vue b/im-admin-ui/src/views/workflow/task/myDocument.vue deleted file mode 100644 index 1bf5bbf..0000000 --- a/im-admin-ui/src/views/workflow/task/myDocument.vue +++ /dev/null @@ -1,255 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/task/taskCopyList.vue b/im-admin-ui/src/views/workflow/task/taskCopyList.vue deleted file mode 100644 index 7784a08..0000000 --- a/im-admin-ui/src/views/workflow/task/taskCopyList.vue +++ /dev/null @@ -1,150 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/task/taskFinish.vue b/im-admin-ui/src/views/workflow/task/taskFinish.vue deleted file mode 100644 index 155bd4f..0000000 --- a/im-admin-ui/src/views/workflow/task/taskFinish.vue +++ /dev/null @@ -1,136 +0,0 @@ - - - diff --git a/im-admin-ui/src/views/workflow/task/taskWaiting.vue b/im-admin-ui/src/views/workflow/task/taskWaiting.vue deleted file mode 100644 index dc6546a..0000000 --- a/im-admin-ui/src/views/workflow/task/taskWaiting.vue +++ /dev/null @@ -1,149 +0,0 @@ - - - diff --git a/im-admin-ui/vite.config.ts b/im-admin-ui/vite.config.ts index 97c8d9d..f75cfe4 100644 --- a/im-admin-ui/vite.config.ts +++ b/im-admin-ui/vite.config.ts @@ -25,7 +25,7 @@ export default defineConfig(({ mode, command }: ConfigEnv): UserConfig => { open: true, proxy: { [env.VITE_APP_BASE_API]: { - target: 'http://localhost:8080', + target: 'http://localhost:8889', changeOrigin: true, ws: true, rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '') diff --git a/im-admin/.editorconfig b/im-admin/.editorconfig deleted file mode 100644 index 25b312e..0000000 --- a/im-admin/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -# http://editorconfig.org -root = true - -# 空格替代Tab缩进在各种编辑工具下效果一致 -[*] -indent_style = space -indent_size = 4 -charset = utf-8 -end_of_line = lf -trim_trailing_whitespace = true -insert_final_newline = true - -[*.{json,yml,yaml}] -indent_size = 2 - -[*.md] -insert_final_newline = false -trim_trailing_whitespace = false diff --git a/im-admin/.gitignore b/im-admin/.gitignore deleted file mode 100644 index fa3ee97..0000000 --- a/im-admin/.gitignore +++ /dev/null @@ -1,48 +0,0 @@ -###################################################################### -# Build Tools - -.gradle -/build/ -!gradle/wrapper/gradle-wrapper.jar - -target/ -!.mvn/wrapper/maven-wrapper.jar - -###################################################################### -# IDE - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### JRebel ### -rebel.xml - -### NetBeans ### -nbproject/private/ -build/* -nbbuild/ -nbdist/ -.nb-gradle/ - -###################################################################### -# Others -*.log -*.xml.versionsBackup -*.swp - -!*/build/*.java -!*/build/*.html -!*/build/*.xml - -.flattened-pom.xml diff --git a/im-admin/README.md b/im-admin/README.md deleted file mode 100644 index 3ef0ea0..0000000 --- a/im-admin/README.md +++ /dev/null @@ -1,182 +0,0 @@ - -
- -- - - -## 平台简介 - -[![码云Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/dromara/RuoYi-Vue-Plus) -[![GitHub](https://img.shields.io/github/stars/dromara/RuoYi-Vue-Plus.svg?style=social&label=Stars)](https://github.com/dromara/RuoYi-Vue-Plus) -[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE) -[![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus) -
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.2.3-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) -[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.2-blue.svg)]() -[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]() -[![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]() - -> RuoYi-Vue-Plus 是重写 RuoYi-Vue 针对 `分布式集群与多租户` 场景全方位升级(不兼容原框架) - -> 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可
-活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源 - -> 系统演示: [传送门](https://plus-doc.dromara.org/#/common/demo_system) - -> 前端项目地址: [plus-ui](https://gitee.com/JavaLionLi/plus-ui) - -> 文档地址: [plus-doc](https://plus-doc.dromara.org) - -## 赞助商 - -MaxKey 业界领先单点登录产品 - https://gitee.com/dromara/MaxKey
-CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow
-数舵科技 软件定制开发APP小程序等 - http://www.shuduokeji.com/
-引迈信息 软件开发平台 - https://www.jnpfsoft.com/index.html?from=plus-doc
-[如何成为赞助商 加群联系作者详谈](https://plus-doc.dromara.org/#/common/add_group) - -# 本框架与RuoYi的功能差异 - -| 功能 | 本框架 | RuoYi | -|-------------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------| -| 前端项目 | 采用 Vue3 + TS + ElementPlus 重写 | 基于Vue2/Vue3 + JS | -| 后端项目结构 | 采用插件化 + 扩展包形式 结构解耦 易于扩展 | 模块相互注入耦合严重难以扩展 | -| 后端代码风格 | 严格遵守Alibaba规范与项目统一配置的代码格式化 | 代码书写与常规结构不同阅读障碍大 | -| Web容器 | 采用 Undertow 基于 XNIO 的高性能容器 | 采用 Tomcat | -| 权限认证 | 采用 Sa-Token、Jwt 静态使用功能齐全 低耦合 高扩展 | Spring Security 配置繁琐扩展性极差 | -| 权限注解 | 采用 Sa-Token 支持注解 登录校验、角色校验、权限校验、二级认证校验、HttpBasic校验、忽略校验
角色与权限校验支持多种条件 如 `AND` `OR` 或 `权限 OR 角色` 等复杂表达式 | 只支持是否存在匹配 | -| 三方鉴权 | 采用 JustAuth 第三方登录组件 支持微信、钉钉等数十种三方认证 | 无 | -| 关系数据库支持 | 原生支持 MySQL、Oracle、PostgreSQL、SQLServer
可同时使用异构切换(支持其他 mybatis-plus 支持的所有数据库 只需要增加jdbc依赖即可使用 达梦金仓等均有成功案例) | 支持 Mysql、Oracle 不支持同时使用、不支持异构切换 | -| 缓存数据库 | 支持 Redis 5-7 支持大部分新功能特性 如 分布式限流、分布式队列 | Redis 简单 get set 支持 | -| Redis客户端 | 采用 Redisson Redis官方推荐 基于Netty的客户端工具
支持Redis 90%以上的命令 底层优化规避很多不正确的用法 例如: keys被转换为scan
支持单机、哨兵、单主集群、多主集群等模式 | Lettuce + RedisTemplate 支持模式少 工具使用繁琐
连接池采用 common-pool Bug多经常性出问题 | -| 缓存注解 | 采用 Spring-Cache 注解 对其扩展了实现支持了更多功能
例如 过期时间 最大空闲时间 组最大长度等 只需一个注解即可完成数据自动缓存 | 需手动编写Redis代码逻辑 | -| ORM框架 | 采用 Mybatis-Plus 基于对象几乎不用写SQL全java操作 功能强大插件众多
例如多租户插件 分页插件 乐观锁插件等等 | 采用 Mybatis 基于XML需要手写SQL | -| SQL监控 | 采用 p6spy 可输出完整SQL与执行时间监控 | log输出 需手动拼接sql与参数无法快速查看调试问题 | -| 数据分页 | 采用 Mybatis-Plus 分页插件
框架对其进行了扩展 对象化分页对象 支持多种方式传参 支持前端多排序 复杂排序 | 采用 PageHelper 仅支持单查询分页 参数只能从param传 只能单排序 功能扩展性差 体验不好 | -| 数据权限 | 采用 Mybatis-Plus 插件 自行分析拼接SQL 无感式过滤
只需为Mapper设置好注解条件 支持多种自定义 不限于部门角色 | 采用 注解+aop 实现 基于部门角色 生成的sql兼容性差 不支持其他业务扩展
生成sql后需手动拼接到具体业务sql上 对于多个Mapper查询不起作用 | -| 数据脱敏 | 采用 注解 + jackson 序列化期间脱敏 支持不同模块不同的脱敏条件
支持多种策略 如身份证、手机号、地址、邮箱、银行卡等 可自行扩展 | 无 | -| 数据加解密 | 采用 注解 + mybatis 拦截器 对存取数据期间自动加解密
支持多种策略 如BASE64、AES、RSA、SM2、SM4等 | 无 | -| 接口传输加密 | 采用 动态 AES + RSA 加密请求 body 每一次请求秘钥都不同大幅度降低可破解性 | 无 | -| 数据翻译 | 采用 注解 + jackson 序列化期间动态修改数据 数据进行翻译
支持多种模式: `映射翻译` `直接翻译` `其他扩展条件翻译` 接口化两步即可完成自定义扩展 内置多种翻译实现 | 无 | -| 多数据源框架 | 采用 dynamic-datasource 支持市面大部分数据库
通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源
支持spel表达式从请求头参数等条件切换数据源 | 基于 druid 手动编写代码配置数据源 配置繁琐 支持性差 | -| 多数据源事务 | 采用 dynamic-datasource 支持多数据源不同种类的数据库事务回滚 | 不支持 | -| 数据库连接池 | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下 | 采用 druid bug众多 社区维护差 活跃度低 配置众多繁琐性能一般 | -| 数据库主键 | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁 | 采用 数据库自增ID 支持数据量有限 不支持多数据源主键唯一 | -| WebSocket协议 | 基于 Spring 封装的 WebSocket 协议 扩展了Token鉴权与分布式会话同步 不再只是基于单机的废物 | 无 | -| SSE推送 | 采用 Spring SSE 实现 扩展了Token鉴权与分布式会话同步 | 无 | -| 序列化 | 采用 Jackson Spring官方内置序列化 靠谱!!! | 采用 fastjson bugjson 远近闻名 | -| 分布式幂等 | 参考美团GTIS防重系统简化实现(细节可看文档) | 手动编写注解基于aop实现 | -| 分布式锁 | 采用 Lock4j 底层基于 Redisson | 无 | -| 分布式任务调度 | 采用 SnailJob 天生支持分布式 统一的管理中心 支持多种数据库 支持分片重试DAG任务流等 | 采用 Quartz 基于数据库锁性能差 集群需要做很多配置与改造 | -| 文件存储 | 采用 Minio 分布式文件存储 天生支持多机、多硬盘、多分片、多副本存储
支持权限管理 安全可靠 文件可加密存储 | 采用 本机文件存储 文件裸漏 易丢失泄漏 不支持集群有单点效应 | -| 云存储 | 采用 AWS S3 协议客户端 支持 七牛、阿里、腾讯 等一切支持S3协议的厂家 | 不支持 | -| 短信 | 采用 sms4j 短信融合包 支持数十种短信厂家 只需在yml配置好厂家密钥即可使用 可多厂家共用 | 不支持 | -| 邮件 | 采用 mail-api 通用协议支持大部分邮件厂商 | 不支持 | -| 接口文档 | 采用 SpringDoc、javadoc 无注解零入侵基于java注释
只需把注释写好 无需再写一大堆的文档注解了 | 采用 Springfox 已停止维护 需要编写大量的注解来支持文档生成 | -| 校验框架 | 采用 Validation 支持注解与工具类校验 注解支持国际化 | 仅支持注解 且注解不支持国际化 | -| Excel框架 | 采用 Alibaba EasyExcel 基于插件化
框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 | 基于 POI 手写实现 功能有限 复杂 扩展性差 | -| 工作流支持 | 支持各种复杂审批 转办 委派 加减签 会签 或签 票签 等功能 | 无 | -| 工具类框架 | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码 | 手写工具稳定性差易出问题 工具数量有限 代码臃肿需自己手写 get set 等 | -| 监控框架 | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制
实时监控服务状态 框架还为其扩展了在线日志查看监控 | 无 | -| 链路追踪 | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗
用了它即可实时查看请求经过的每一处每一个节点 | 无 | -| 代码生成器 | 只需设计好表结构 一键生成所有crud代码与页面
降低80%的开发量 把精力都投入到业务设计上
框架为其适配MP、SpringDoc规范化代码 同时支持动态多数据源代码生成 | 代码生成原生结构 只支持单数据源生成 | -| 部署方式 | 支持 Docker 编排 一键搭建所有环境 让开发人员从此不再为搭建环境而烦恼 | 原生jar部署 其他环境需手动下载安装 自行搭建 | -| 项目路径修改 | 提供详细的修改方案文档 并为其做了一些改动 非常简单即可修改成自己想要的 | 需要做很多改造 文档说明有限 | -| 国际化 | 基于请求头动态返回不同语种的文本内容 开发难度低 有对应的工具类 支持大部分注解内容国际化 | 只提供基础功能 其他需自行编写扩展 | -| 代码单例测试 | 提供单例测试 使用方式编写方法与maven多环境单测插件 | 只提供基础功能 其他需自行编写扩展 | -| Demo案例 | 提供框架功能的实际使用案例 单独一个模块提供了很多很全 | 无 | - - -## 本框架与RuoYi的业务差异 - -| 业务 | 功能说明 | 本框架 | RuoYi | -|--------|----------------------------------------------------------------------|-----|------------------| -| 租户管理 | 系统内租户的管理 如:租户套餐、过期时间、用户数量、企业信息等 | 支持 | 无 | -| 租户套餐管理 | 系统内租户所能使用的套餐管理 如:套餐内所包含的菜单等 | 支持 | 无 | -| 客户端管理 | 系统内对接的所有客户端管理 如: pc端、小程序端等
支持动态授权登录方式 如: 短信登录、密码登录等 支持动态控制token时效 | 支持 | 无 | -| 用户管理 | 用户的管理配置 如:新增用户、分配用户所属部门、角色、岗位等 | 支持 | 支持 | -| 部门管理 | 配置系统组织机构(公司、部门、小组) 树结构展现支持数据权限 | 支持 | 支持 | -| 岗位管理 | 配置系统用户所属担任职务 | 支持 | 支持 | -| 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等 | 支持 | 支持 | -| 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | 支持 | 支持 | -| 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | 支持 | 支持 | -| 参数管理 | 对系统动态配置常用参数 | 支持 | 支持 | -| 通知公告 | 系统通知公告信息发布维护 | 支持 | 支持 | -| 操作日志 | 系统正常操作日志记录和查询 系统异常信息日志记录和查询 | 支持 | 支持 | -| 登录日志 | 系统登录日志记录查询包含登录异常 | 支持 | 支持 | -| 文件管理 | 系统文件展示、上传、下载、删除等管理 | 支持 | 无 | -| 文件配置管理 | 系统文件上传、下载所需要的配置信息动态添加、修改、删除等管理 | 支持 | 无 | -| 在线用户管理 | 已登录系统的在线用户信息监控与强制踢出操作 | 支持 | 支持 | -| 定时任务 | 运行报表、任务管理(添加、修改、删除)、日志管理、执行器管理等 | 支持 | 仅支持任务与日志管理 | -| 代码生成 | 多数据源前后端代码的生成(java、html、xml、sql)支持CRUD下载 | 支持 | 仅支持单数据源 | -| 系统接口 | 根据业务代码自动生成相关的api接口文档 | 支持 | 支持 | -| 服务监控 | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等 | 支持 | 仅支持单机CPU、内存、磁盘监控 | -| 缓存监控 | 对系统的缓存信息查询,命令统计等。 | 支持 | 支持 | -| 在线构建器 | 拖动表单元素生成相应的HTML代码。 | 支持 | 支持 | -| 使用案例 | 系统的一些功能案例 | 支持 | 不支持 | - -## 参考文档 - -使用框架前请仔细阅读文档重点注意事项 -
->[初始化项目 必看](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init) ->>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init) -> ->[专栏与视频 入门必看](https://plus-doc.dromara.org/#/common/column) ->>[https://plus-doc.dromara.org/#/common/column](https://plus-doc.dromara.org/#/common/column) -> ->[部署项目 必看](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy) ->>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy) -> ->[如何加群](https://plus-doc.dromara.org/#/common/add_group) ->>[https://plus-doc.dromara.org/#/common/add_group](https://plus-doc.dromara.org/#/common/add_group) -> ->[参考文档 Wiki](https://plus-doc.dromara.org) ->>[https://plus-doc.dromara.org](https://plus-doc.dromara.org) - -## 软件架构图 - -![Plus部署架构图](https://foruda.gitee.com/images/1678981882624240692/ae2a3f3e_1766278.png "Plus部署架构图.png") - -## 如何参与贡献 - -[参与贡献的方式 https://plus-doc.dromara.org/#/common/contribution](https://plus-doc.dromara.org/#/common/contribution) - -## 捐献作者 -作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭 - - - -## 演示图例 - -| | | -|--------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------| -| ![输入图片说明](https://foruda.gitee.com/images/1680077524361362822/270bb429_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680077619939771291/989bf9b6_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680077681751513929/1c27c5bd_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680077721559267315/74d63e23_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680077765638904515/1b75d4a6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078026375951297/eded7a4b_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078237104531207/0eb1b6a7_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078254306078709/5931e22f_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078287971528493/0b9af60a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078308138770249/8d3b6696_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078352553634393/db5ef880_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078378238393374/601e4357_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078414983206024/2aae27c1_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078446738419874/ecce7d59_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078475971341775/149e8634_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078491666717143/3fadece7_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078558863188826/fb8ced2a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078574561685461/ae68a0b2_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078594932772013/9d8bfec6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078626493093532/fcfe4ff6_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078643608812515/0295bd4f_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078685196286463/d7612c81_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078703877318597/56fce0bc_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078716586545643/b6dbd68f_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078734103217688/eb1e6aa6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078759131415480/73c525d8_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078779416197879/75e3ed02_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078802329118061/77e10915_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078893627848351/34a1c342_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078928175016986/f126ec4a_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078941718318363/b68a0f72_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078963175518631/3bb769a1_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680078982294090567/b31c343d_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079000642440444/77ca82a9_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680079020995074177/03b7d52e_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079039367822173/76811806_1766278.png "屏幕截图") | -| ![输入图片说明](https://foruda.gitee.com/images/1680079274333484664/4dfdc7c0_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079290467458224/d6715fcf_1766278.png "屏幕截图") | - - - - - - - - - - - - diff --git a/im-admin/pom.xml b/im-admin/pom.xml index c4d24ee..228e53f 100644 --- a/im-admin/pom.xml +++ b/im-admin/pom.xml @@ -401,32 +401,6 @@ exclude - - - org.codehaus.mojo - flatten-maven-plugin - ${flatten-maven-plugin.version} - - true - resolveCiFriendliesOnly - - - - flatten - process-resources - - flatten - - - - flatten.clean - clean - - clean - - - - diff --git a/im-admin/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java b/im-admin/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java deleted file mode 100644 index afe4349..0000000 --- a/im-admin/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; - -/** - * 启动程序 - * - * @author Lion Li - */ - -@SpringBootApplication -public class DromaraApplication { - - public static void main(String[] args) { - SpringApplication application = new SpringApplication(DromaraApplication.class); - application.setApplicationStartup(new BufferingApplicationStartup(2048)); - application.run(args); - System.out.println("盒子IM后台管理服务启动成功"); - } - -} diff --git a/im-admin/ruoyi-admin/src/main/java/org/dromara/DromaraServletInitializer.java b/im-admin/ruoyi-admin/src/main/java/org/dromara/DromaraServletInitializer.java deleted file mode 100644 index 066a683..0000000 --- a/im-admin/ruoyi-admin/src/main/java/org/dromara/DromaraServletInitializer.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara; - -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -/** - * web容器中进行部署 - * - * @author Lion Li - */ -public class DromaraServletInitializer extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(DromaraApplication.class); - } - -} diff --git a/im-admin/ruoyi-admin/src/main/resources/application.yml b/im-admin/ruoyi-admin/src/main/resources/application.yml index 80083aa..65a286e 100644 --- a/im-admin/ruoyi-admin/src/main/resources/application.yml +++ b/im-admin/ruoyi-admin/src/main/resources/application.yml @@ -8,7 +8,7 @@ app: copyrightYear: 2024 captcha: - enable: true + enable: false # 页面 <参数设置> 可开启关闭 验证码校验 # 验证码类型 math 数组计算 char 字符验证 type: MATH @@ -153,19 +153,6 @@ mybatis-encryptor: publicKey: privateKey: -# api接口加密 -api-decrypt: - # 是否开启全局接口加密 - enabled: true - # AES 加密头标识 - headerFlag: encrypt-key - # 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 - # 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE= - publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ== - # 请求解密私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 - # 对应前端加密公钥 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ== - privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y= - springdoc: api-docs: # 是否开启接口文档