11ccd4dad13a0b41c916b22b9db79495b79f0aea..811f2d080d12fec5b95ff41c5263e89741e16cf9
2024-12-11 13693261870
1
811f2d 对比 | 目录
2024-12-10 13693261870
1
700693 对比 | 目录
2024-12-09 13693261870
1
6a959e 对比 | 目录
2024-12-09 13693261870
1
3de9a7 对比 | 目录
2024-12-08 13693261870
1
864536 对比 | 目录
2024-12-08 13693261870
1
df6af1 对比 | 目录
2024-12-08 13693261870
1
ec128e 对比 | 目录
2024-12-08 13693261870
1
6a588f 对比 | 目录
2024-12-08 13693261870
1
a4610d 对比 | 目录
2024-12-08 13693261870
1
51fa04 对比 | 目录
2024-12-07 13693261870
1
2f2347 对比 | 目录
2024-12-07 13693261870
1
8243c9 对比 | 目录
已添加40个文件
已修改12个文件
6256 ■■■■■ 文件已修改
docker-compose/mysql/initdb/se_cloud_20240629.sql 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/mysql/initdb/se_cloud_20241119.sql 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/mysql/initdb/se_cloud_20241204.sql 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/pom.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/pom.xml 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/java/com/se/docker/SysDockerApplication.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/java/com/se/docker/controller/SysDockerController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/java/com/se/docker/service/SysDockerService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/java/com/se/docker/utils/DockerUtils.java 343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/resources/banner.txt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/resources/bootstrap.yml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-docker/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/HealthController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/IndexController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/SysMenuController.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/SysStatusCtrlController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/SysTaskCtrlController.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/domain/SysStatusCtrl.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/domain/SysTaskCtrl.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/mapper/SysStatusCtrlMapper.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/mapper/SysTaskCtrlMapper.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/SysMenuServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/SysStatusCtrlServiceImpl.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/SysTaskCtrlServiceImpl.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/inte/ISysMenuService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/inte/ISysStatusCtrlService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/inte/ISysTaskCtrlService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/utils/CheckPwdUtils.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/mapper/system/IndexMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/mapper/system/SysMenuMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/mapper/system/SysStatusCtrlMapper.xml 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/mapper/system/SysTaskCtrlMapper.xml 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/java/controller.java.vm 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/java/domain.java.vm 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/java/mapper.java.vm 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/java/service.java.vm 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/java/serviceImpl.java.vm 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/java/sub-domain.java.vm 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/js/api.js.vm 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/sql/sql.vm 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/vue/index-tree.vue.vm 505 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/vue/index.vue.vm 602 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/vue/v3/index-tree.vue.vm 474 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/vue/v3/index.vue.vm 590 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/vm/xml/mapper.xml.vm 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/api/system/soft.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/api/system/statusCtrl.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/api/system/taskCtrl.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/views/system/soft/index.vue 281 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/views/system/statusCtrl/index.vue 305 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/views/system/taskCtrl/index.vue 319 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
说明.txt 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/mysql/initdb/se_cloud_20240629.sql
@@ -68,14 +68,18 @@
  update_by         varchar(64)     default ''                 comment '更新者',
  update_time       datetime                                   comment '更新时间',
  remark            varchar(500)    default null               comment '备注',
  unique (user_name),
  primary key (user_id)
) engine=innodb auto_increment=3 comment = '用户信息表';
create unique index index_sys_user_name on sys_user (user_name);
-- ----------------------------
-- åˆå§‹åŒ–-用户信息表数据
-- ----------------------------
insert into sys_user values(1,  103, 'admin', '', '00', '1', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '管理员');
insert into sys_user values(2,  105, 'ry',    '', '00', '1', 'ry@qq.com',  '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '测试员');
-- insert into sys_user (user_name, nick_name) values ('admin', 'admin');
-- select * from sys_user;
-- ----------------------------
@@ -185,7 +189,7 @@
-- insert into sys_menu values('107',  '通知公告',       '1',   '8', 'notice',     'system/notice/index',               '', '', 1, 0, 'C', '0', '0', 'system:notice:list',      'message',       'admin', sysdate(), '', null, '通知公告菜单');
insert into sys_menu values('108',  '日志管理',       '1',   '9', 'log',        '',                                  '', '', 1, 0, 'M', '0', '0', '',                        'log',           'admin', sysdate(), '', null, '日志管理菜单');
-- insert into sys_menu values('109',  '在线用户',       '2',   '1', 'online',     'monitor/online/index',              '', '', 1, 0, 'C', '0', '0', 'monitor:online:list',     'online',        'admin', sysdate(), '', null, '在线用户菜单');
-- insert into sys_menu values('110',  '定时任务',       '2',   '2', 'job',        'monitor/job/index',                 '', '', 1, 0, 'C', '0', '0', 'monitor:job:list',        'job',           'admin', sysdate(), '', null, '定时任务菜单');
insert into sys_menu values('110',  '定时任务',       '1',   '11', 'job',        'monitor/job/index',                 '', '', 1, 0, 'C', '0', '0', 'monitor:job:list',        'job',           'admin', sysdate(), '', null, '定时任务菜单');
-- insert into sys_menu values('111',  'Sentinel控制台', '2',   '3', 'http://localhost:8718',        '',                '', '', 0, 0, 'C', '0', '0', 'monitor:sentinel:list',   'sentinel',      'admin', sysdate(), '', null, '流量控制菜单');
-- insert into sys_menu values('112',  'Nacos控制台',    '2',   '4', 'http://localhost:8848/nacos',  '',                '', '', 0, 0, 'C', '0', '0', 'monitor:nacos:list',      'nacos',         'admin', sysdate(), '', null, '服务治理菜单');
-- insert into sys_menu values('113',  'Admin控制台',    '2',   '5', 'http://localhost:9100/login',  '',                '', '', 0, 0, 'C', '0', '0', 'monitor:server:list',     'server',        'admin', sysdate(), '', null, '服务监控菜单');
@@ -270,20 +274,20 @@
-- insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview',           '#', 'admin', sysdate(), '', null, '');
-- insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code',              '#', 'admin', sysdate(), '', null, '');
-- é¦–页
insert into sys_menu values('1061', 'xx实验条件建设',            '0', '1', '#', '', '', '', 1, 0, 'M', '0', '0', 'system:index:sy',   '#', 'admin', sysdate(), '', null, '首页', 'index');
insert into sys_menu values('1062', 'xx概念开发与验证平台',   '1061', '1', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:glkf', '#', 'admin', sysdate(), '', null, '概念开发与验证平台', 'index');
insert into sys_menu values('1063', 'xx体系设计与评估平台',   '1061', '2', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:txsj', '#', 'admin', sysdate(), '', null, '体系设计与评估平台', 'index');
insert into sys_menu values('1064', 'xx方案推演与分析平台',   '1061', '3', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:faty', '#', 'admin', sysdate(), '', null, '方案推演与分析平台', 'index');
insert into sys_menu values('1065', 'xx创建与xx运用研究平台', '1061', '4', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:cxyyy','#', 'admin', sysdate(), '', null, '创建与运用研究平台', 'index');
insert into sys_menu values('1066', 'xx综合集成研讨厅',       '1061', '5', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:zhjc', '#', 'admin', sysdate(), '', null, '综合集成研讨厅', 'index');
insert into sys_menu values('1061', '作战实验条件建设',            '0', '1', '#', '', '', '', 1, 0, 'M', '0', '0', 'system:index:sy',   '#', 'admin', sysdate(), '', null, '首页', 'index');
insert into sys_menu values('1062', '作战概念开发与验证平台',   '1061', '1', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:glkf', '#', 'admin', sysdate(), '', null, '概念开发与验证平台', 'index');
insert into sys_menu values('1063', '作战体系设计与评估平台',   '1061', '2', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:txsj', '#', 'admin', sysdate(), '', null, '体系设计与评估平台', 'index');
insert into sys_menu values('1064', '作战方案推演与分析平台',   '1061', '3', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:faty', '#', 'admin', sysdate(), '', null, '方案推演与分析平台', 'index');
insert into sys_menu values('1065', '战法创新与作战运用研究平台', '1061', '4', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:cxyyy','#', 'admin', sysdate(), '', null, '创建与运用研究平台', 'index');
insert into sys_menu values('1066', '作战综合集成研讨厅',       '1061', '5', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:zhjc', '#', 'admin', sysdate(), '', null, '综合集成研讨厅', 'index');
insert into sys_menu values('1067', '态势显示分系统',         '1061', '6', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:tsxs', '#', 'admin', sysdate(), '', null, '态势显示分系统', 'index');
insert into sys_menu values('1068', '数据管理分系统',         '1061', '7', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:sjgl', '#', 'admin', sysdate(), '', null, '数据管理分系统', 'index');
insert into sys_menu values('1069', '装备库',                 '1061', '8', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:zbk',  '#', 'admin', sysdate(), '', null, '装备库', 'index');
insert into sys_menu values('1070', '仿真资源管理分系统',     '1061', '9', '#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:fzzy', '#', 'admin', sysdate(), '', null, '仿真资源管理分系统', 'index');
insert into sys_menu values('1071', '工具箱',                 '1061', '10','#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:gjx',  '#', 'admin', sysdate(), '', null, '工具箱', 'index');
insert into sys_menu values('1072', '用户及权限管理',         '1061', '11','#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:yhgl', '#', 'admin', sysdate(), '', null, '用户及权限管理', 'index');
insert into sys_menu values('1073', '监控及运维管理',         '1061', '12','#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:ywjk', '#', 'admin', sysdate(), '', null, '监控及运维管理', 'index');
insert into sys_menu values('1074', 'ISIM Cloud',             '1061', '13','#', '', '', '', 0, 0, 'C', '0', '0', 'system:index:isim', '#', 'admin', sysdate(), '', null, 'ISIM Cloud', 'index');
insert into sys_menu values('1071', '工具箱',                 '1061', '10','#', '', '', '', 0, 0, 'F', '0', '0', 'system:index:gjx',  '#', 'admin', sysdate(), '', null, '工具箱', 'index');
insert into sys_menu values('1072', '用户及权限管理',         '1061', '11','#', '', '', '', 0, 0, 'F', '0', '0', 'system:index:yhgl', '#', 'admin', sysdate(), '', null, '用户及权限管理', 'index');
insert into sys_menu values('1073', '监控及运维管理',         '1061', '12','#', '', '', '', 0, 0, 'F', '0', '0', 'system:index:ywjk', '#', 'admin', sysdate(), '', null, '监控及运维管理', 'index');
insert into sys_menu values('1074', 'ISIM Cloud',             '1061', '13','#', '', '', '', 0, 0, 'F', '0', '0', 'system:index:isim', '#', 'admin', sysdate(), '', null, 'ISIM Cloud', 'index');
alter table sys_menu add column mark varchar(20) comment '菜单标识';
update sys_menu set mark = 'sys' where menu_id < 1070;
@@ -633,6 +637,7 @@
insert into sys_job values(1, '系统默认(无参)', 'DEFAULT', 'ryTask.ryNoParams',        '0/10 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
insert into sys_job values(2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')',  '0/15 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
insert into sys_job values(3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)',  '0/20 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
-- select * from sys_job order by job_id;
-- ----------------------------
docker-compose/mysql/initdb/se_cloud_20241119.sql
@@ -33,6 +33,31 @@
insert into sys_soft (name, type, args) values ('se-system', 4, 'se-system');
insert into sys_soft (name, type, args) values ('se-wgcloud', 4, 'se-wgcloud');
-- èœå• SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('软件', '1', '8', 'soft', 'system/soft/index', 1, 0, 'C', '0', '0', 'system:soft:list', '#', 'admin', sysdate(), '', null, '软件菜单');
-- æŒ‰é’®çˆ¶èœå•ID
SELECT @parentId := LAST_INSERT_ID();
-- æŒ‰é’® SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('软件查询', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:soft:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('软件新增', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:soft:add',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('软件修改', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:soft:edit',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('软件删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:soft:remove',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('软件导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:soft:export',       '#', 'admin', sysdate(), '', null, '');
update sys_menu set mark = 'sys' where menu_id >= @parentId;
-- ----------------------------
-- 02、硬件表
-- ----------------------------
docker-compose/mysql/initdb/se_cloud_20241204.sql
@@ -13,23 +13,50 @@
drop table if exists sys_task_ctrl;
create table sys_task_ctrl (
  task_id           bigint(20)      not null auto_increment    comment '任务ID',
  prj_id            varchar(50)                                comment '任务ID',
  prj_name          varchar(200)                               comment '任务名称',
  task_name         varchar(200)                               comment '任务名称',
  prj_id            varchar(50)                                comment '方案ID',
  prj_name          varchar(200)                               comment '方案名称',
  think_id          varchar(50)                                comment '想定ID',
  think_name        varchar(200)                               comment '想定名称',
  begin_time        varchar(50)                                comment '开始时间',
  end_time          varchar(50)                                comment '结束时间',
  calc_node         varchar(2000)                              comment '计算节点',
  is_save           char(1)         default 0                  comment '是否保存(0正常 1停用)',
  node              varchar(2000)                              comment '节点',
  status            char(1)         default 0                  comment '状态(0正常 1停用)',
  create_by         varchar(64)     default ''                 comment '创建者',
  create_time       datetime                                   comment '创建时间',
  update_by         varchar(64)     default ''                 comment '更新者',
  update_time       datetime                                   comment '更新时间',
  remark            varchar(500)    default ''                 comment '备注',
  unique (think_id),
  primary key (task_id)
) engine=innodb auto_increment=1 comment = '分系统任务控制表';
select * from sys_task_ctrl order by task_id;
-- èœå• SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('分系统任务控制', '1', '10', 'taskCtrl', 'system/taskCtrl/index', 1, 0, 'C', '0', '0', 'system:taskCtrl:list', '#', 'admin', sysdate(), '', null, '分系统任务控制菜单');
-- æŒ‰é’®çˆ¶èœå•ID
SELECT @parentId := LAST_INSERT_ID();
-- æŒ‰é’® SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('分系统任务控制查询', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:taskCtrl:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('分系统任务控制新增', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:taskCtrl:add',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('分系统任务控制修改', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:taskCtrl:edit',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('分系统任务控制删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:taskCtrl:remove',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('分系统任务控制导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:taskCtrl:export',       '#', 'admin', sysdate(), '', null, '');
update sys_menu set mark = 'sys' where menu_id >= @parentId;
-- ----------------------------
-- 02、系统状态监控表
-- ----------------------------
@@ -53,6 +80,29 @@
insert into sys_status_ctrl (sys_name, ip, url, method, order_num) values ('分系统01', '127.0.0.1', 'http://localhost:8080/system/health', 'GET', 1);
-- èœå• SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('系统状态监控', '1', '9', 'statusCtrl', 'system/statusCtrl/index', 1, 0, 'C', '0', '0', 'system:statusCtrl:list', '#', 'admin', sysdate(), '', null, '系统状态监控菜单');
-- æŒ‰é’®çˆ¶èœå•ID
SELECT @parentId := LAST_INSERT_ID();
-- æŒ‰é’® SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('系统状态监控查询', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:statusCtrl:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('系统状态监控新增', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:statusCtrl:add',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('系统状态监控修改', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:statusCtrl:edit',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('系统状态监控删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:statusCtrl:remove',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('系统状态监控导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:statusCtrl:export',       '#', 'admin', sysdate(), '', null, '');
update sys_menu set mark = 'sys' where menu_id >= @parentId;
-- ----------------------------
se-modules/pom.xml
@@ -10,9 +10,10 @@
    <modules>
        <module>se-system</module>
        <module>se-docker</module>
        <!--<module>se-gen</module>
        <module>se-job</module>
        <module>se-file</module>-->
        <module>se-docker</module>-->
    </modules>
    <artifactId>se-modules</artifactId>
se-modules/se-docker/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.se</groupId>
        <artifactId>se-modules</artifactId>
        <version>3.6.4</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>se-modules-docker</artifactId>
    <description>
        se-modules-docker服务
    </description>
    <dependencies>
        <!-- SpringCloud Alibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringCloud Alibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- SpringCloud Alibaba Sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!-- SpringBoot Actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- SE Api System -->
        <dependency>
            <groupId>com.se</groupId>
            <artifactId>se-api-system</artifactId>
        </dependency>
        <!-- SE Common Swagger -->
        <dependency>
            <groupId>com.se</groupId>
            <artifactId>se-common-swagger</artifactId>
        </dependency>
        <!-- docker -->
        <dependency>
            <groupId>com.github.docker-java</groupId>
            <artifactId>docker-java</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.docker-java</groupId>
            <artifactId>docker-java-transport-httpclient5</artifactId>
            <version>3.4.0</version>
        </dependency>
        <!-- hutool -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.34</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
se-modules/se-docker/src/main/java/com/se/docker/SysDockerApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.se.docker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import com.se.common.swagger.annotation.EnableCustomSwagger2;
@EnableCustomSwagger2
@SuppressWarnings("ALL")
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class SysDockerApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(SysDockerApplication.class, args);
        System.out.println("    Docker模块启动成功    ");
    }
}
se-modules/se-docker/src/main/java/com/se/docker/controller/SysDockerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.se.docker.controller;
import com.se.docker.service.SysDockerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.se.common.core.domain.R;
import javax.annotation.Resource;
@RestController
@RequestMapping("/docker")
@SuppressWarnings("ALL")
public class SysDockerController {
    @Resource
    SysDockerService sysDockerService;
    private static final Logger log = LoggerFactory.getLogger(SysDockerController.class);
    @GetMapping("test")
    public R<Object> test(MultipartFile file) {
        try {
            String str = sysDockerService.test();
            return R.ok(str);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return R.fail();
        }
    }
}
se-modules/se-docker/src/main/java/com/se/docker/service/SysDockerService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.se.docker.service;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.*;
import com.github.dockerjava.api.model.PullResponseItem;
import com.github.dockerjava.core.DockerClientBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
@SuppressWarnings("ALL")
public class SysDockerService {
    //@Value("${docker.prefix}")
    public String localFilePrefix;
    private static final Logger log = LoggerFactory.getLogger(SysDockerService.class);
    public String test() throws Exception {
        return "docker: " + System.currentTimeMillis();
    }
    /**
     * java DockerClient操作
     * https://blog.csdn.net/weixin_45198228/article/details/130060333
     */
    public void t() {
        try {
            // åˆ›å»ºDocker客户端实例
            DockerClient dockerClient = DockerClientBuilder.getInstance("unix:///var/run/docker.sock").build();
            // åˆ›å»ºå¹¶å¯åŠ¨ä¸€ä¸ªæ–°çš„å®¹å™¨
            CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
                    .withCmd("echo", "Hello Docker!")
                    .exec();
            // å¯åЍ容噍
            dockerClient.startContainerCmd(container.getId()).exec();
            // æ£€æŸ¥å®¹å™¨çŠ¶æ€
            InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
            System.out.println(inspectContainerResponse.toString());
            // åœæ­¢å¹¶ç§»é™¤å®¹å™¨
            dockerClient.removeContainerCmd(container.getId()).withRemoveVolumes(true).exec();
            // å…³é—­Docker客户端
            dockerClient.close();
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    public void s() throws Exception {
        // èŽ·å–é»˜è®¤çš„ Docker Client
        DockerClient dockerClient = DockerClientBuilder.getInstance().build();
        // æ‹‰å–镜像
        String image = "openjdk:8-alpine";
        PullImageCmd pullImageCmd = dockerClient.pullImageCmd(image);
        PullImageResultCallback pullImageResultCallback = new PullImageResultCallback() {
            @Override
            public void onNext(PullResponseItem item) {
                System.out.println("下载镜像:" + item.getStatus());
                super.onNext(item);
            }
        };
        pullImageCmd
                .exec(pullImageResultCallback)
                .awaitCompletion();
        System.out.println("下载完成");
        // åˆ›å»ºå®¹å™¨
        CreateContainerCmd containerCmd = dockerClient.createContainerCmd(image);
        CreateContainerResponse createContainerResponse = containerCmd
                .withCmd("echo", "Hello Docker")
                .exec();
        System.out.println(createContainerResponse);
        // å¯åЍ容噍
        String containerId = "";
        dockerClient.startContainerCmd(containerId).exec();
        // æž„建停止容器的命令
        StopContainerCmd stopContainerCmd = dockerClient.stopContainerCmd(containerId);
        // æ‰§è¡Œå‘½ä»¤
        stopContainerCmd.exec();
        // åˆ é™¤å®¹å™¨
        dockerClient.removeContainerCmd(containerId).withForce(true).exec();
        // åˆ é™¤é•œåƒ
        dockerClient.removeImageCmd(image).exec();
        // é‡å¯å®¹å™¨
        dockerClient.restartContainerCmd(containerId).exec();
    }
}
se-modules/se-docker/src/main/java/com/se/docker/utils/DockerUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,343 @@
package com.se.docker.utils;
import cn.hutool.core.util.ObjectUtil;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.*;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.Container;
import com.github.dockerjava.api.model.PullResponseItem;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import com.github.dockerjava.transport.DockerHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.time.Duration;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@SuppressWarnings("ALL")
public class DockerUtils {
    private static volatile DockerClient dockerClient;
    private static final Logger log = LoggerFactory.getLogger(DockerUtils.class);
    /**
     * vim /lib/systemd/system/docker.service
     * <p>
     * # é…ç½®æ™®é€šæ¨¡å¼ï¼Œ-H参数指定docker应用程序监听方式,或者采用下面的安全连接方式2选1
     * ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375
     * <p>
     * # é…ç½®å®‰å…¨è¿žæŽ¥ï¼Œæ³¨æ„è¿™é‡Œçš„/home/user/certs/ æ ¹æ®è‡ªå·±æƒ…况替换为实际的的密钥存放路径
     * ExecStart=/usr/bin/dockerd -D --tlsverify=true --tlscert=/home/user/certs/server-cert.pem --tlskey=/home/user/certs/server-key.pem --tlscacert=/home/user/certs/ca.pem -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
     * <p>
     * # é‡è½½é…ç½®ï¼Œé‡å¯æœåŠ¡
     * systemctl daemon-reload
     * systemctl restart docker
     * <p>
     * # æŸ¥çœ‹ç«¯å£ç›‘听
     * netstat -nlp |grep 2375
     * <p>
     * vi /etc/docker/daemon.json
     * # é…ç½®insecure-registries
     * {
     * "insecure-registries": ["122.12.12.12:5000"],
     * "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
     * }
     * # é‡è½½é…ç½®ï¼Œé‡å¯æœåŠ¡
     * systemctl daemon-reload
     * systemctl restart docker
     */
    private DockerUtils() {
    }
    private DockerUtils(String dockerHost, String dockerApiVersion, String dockerCertPath) {
        Objects.requireNonNull(dockerHost, "Docker ä¸»æœºåœ°å€ä¸èƒ½ä¸ºç©º.");
        Objects.requireNonNull(dockerApiVersion, "Docker API ç‰ˆæœ¬ä¸èƒ½ä¸ºç©º.");
        // ä½¿ç”¨åŒé‡æ ¡éªŒé”å®žçް Docker å®¢æˆ·ç«¯å•例
        if (dockerClient == null) {
            synchronized (DockerUtils.class) {
                if (dockerClient == null) {
                    dockerClient = createDockerClient(dockerHost, dockerApiVersion, dockerCertPath);
                }
            }
        }
    }
    private DockerClient createDockerClient(String dockerHost, String dockerApiVersion, String dockerCertPath) {
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withApiVersion(dockerApiVersion)
                .withDockerHost(dockerHost)
                //如果开启安全连接,需要配置这行
                .withDockerTlsVerify(true).withDockerCertPath(dockerCertPath)
                .build();
        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
                .dockerHost(config.getDockerHost())
                .sslConfig(config.getSSLConfig())
                .maxConnections(1000)
                .connectionTimeout(Duration.ofSeconds(60))
                .responseTimeout(Duration.ofMinutes(30))
                .build();
        return DockerClientImpl.getInstance(config, httpClient);
    }
    /**
     * ç™»å½• Docker é•œåƒä»“库
     *
     * @param authConfig ç™»å½•所需的认证信息
     * @throws RuntimeException ç™»å½•失败时抛出异常
     */
    public void login(AuthConfig authConfig) {
        try {
            Objects.requireNonNull(authConfig, "认证信息不能为空.");
            log.info("开始登录镜像仓库:{};username:{};password:{}", authConfig.getRegistryAddress(), authConfig.getUsername(), authConfig.getPassword());
            dockerClient.authCmd()
                    .withAuthConfig(authConfig)
                    .exec();
            log.info("镜像仓库登录成功:{}", authConfig.getRegistryAddress());
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("镜像仓库登录失败:" + e.getMessage());
        }
    }
    /**
     * ä»Žregistry拉取Docker镜像
     *
     * @param tag é•œåƒåç§°
     * @return true表示拉取成功,false表示拉取失败
     */
    public void pullImage(AuthConfig authConfig, String tag) {
        Objects.requireNonNull(authConfig, "认证信息不能为空.");
        if (ObjectUtil.isEmpty(tag)) {
            throw new RuntimeException("镜像信息不能为空");
        }
        log.info("开始拉取 Docker é•œåƒ: {}", tag);
        try {
            PullImageResultCallback exec = new PullImageResultCallback() {
                @Override
                public void onNext(PullResponseItem item) {
                    System.out.println(item.getStatus());
                }
            };
            PullImageCmd pullImageCmd = dockerClient.pullImageCmd(tag);
            pullImageCmd.withAuthConfig(authConfig)
                    .exec(exec)
                    .awaitCompletion(30, TimeUnit.MINUTES);
            exec.close();
            log.info("镜像拉取成功:{};", tag);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("镜像拉取失败:{}" + e.getMessage());
        }
    }
    /**
     * ä¿å­˜Docker镜像
     *
     * @param imageId  é•œåƒId
     * @param filePath ä¿å­˜æ–‡ä»¶å
     * @return true表示保存成功,false表示保存失败
     */
    public void saveImage(java.lang.String imageId, String filePath) {
        if (ObjectUtil.isEmpty(filePath)) {
            throw new RuntimeException("参数错误:保存路径不能为空");
        }
        log.info("开始保存镜像:{}", imageId);
        try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filePath));
             InputStream inputStream = dockerClient.saveImageCmd(imageId)
                     .exec()) {
            if (null == inputStream) {
                throw new RuntimeException("无法获取镜像");
            }
            byte[] bytesArray = new byte[4096];
            int bytesRead = -1;
            while ((bytesRead = inputStream.read(bytesArray)) != -1) {
                outputStream.write(bytesArray, 0, bytesRead);
            }
            log.info("镜像保存成功:{}", imageId);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("保存镜像异常:" + e.getMessage());
        }
    }
    /**
     * åˆ é™¤Docker镜像
     *
     * @param imageId é•œåƒæ ‡ç­¾
     * @return true表示删除成功,false表示删除失败
     */
    public boolean removeImage(String imageId) {
        Objects.requireNonNull(imageId, "镜像 ID ä¸èƒ½ä¸ºç©º.");
        log.info("开始删除 Docker é•œåƒ: {}", imageId);
        try {
            // å¦‚果镜像当前有容器在运行,则不进行删除操作
            if (isRunContainer(imageId)) {
                log.warn("Docker é•œåƒæ­£åœ¨ä½¿ç”¨ä¸­ï¼Œæ— æ³•删除: {}", imageId);
                return false;
            }
            RemoveImageCmd removeImageCmd = dockerClient.removeImageCmd(imageId);
            removeImageCmd.exec();
            log.info("Docker é•œåƒåˆ é™¤æˆåŠŸ: {}", imageId);
            return true;
        } catch (Exception e) {
            log.error("Docker é•œåƒåˆ é™¤å¤±è´¥: {};{}", imageId, e.getMessage());
            return false;
        }
    }
    /**
     * èŽ·å–æ‰€æœ‰ Docker å®¹å™¨çš„信息
     *
     * @return æ‰€æœ‰ Docker å®¹å™¨çš„信息列表
     */
    public List<Container> listContainers() {
        log.info("开始获取所有 Docker å®¹å™¨ä¿¡æ¯.");
        try {
            ListContainersCmd listContainersCmd = dockerClient.listContainersCmd();
            return listContainersCmd.exec();
        } catch (Exception e) {
            log.error("获取所有 Docker å®¹å™¨ä¿¡æ¯å¤±è´¥: {}", e.getMessage());
            throw new RuntimeException("获取所有 Docker å®¹å™¨ä¿¡æ¯å¤±è´¥: " + e.getMessage());
        }
    }
    /**
     * æ˜¯å¦æœ‰åœ¨è¿è¡Œçš„容器
     *
     * @param imageId
     * @return
     */
    public boolean isRunContainer(String imageId) {
        Objects.requireNonNull(imageId, "镜像 ID ä¸èƒ½ä¸ºç©º.");
        log.info("检查 Docker é•œåƒæ˜¯å¦æ­£åœ¨ä½¿ç”¨ä¸­: {}", imageId);
        try {
            List<Container> containers = listContainers();
            List<String> containerNames = containers.stream()
                    .map(Container::getImageId)
                    .collect(Collectors.toList());
            log.info("列出所有容器成功,数量:{}", containerNames.size());
            if (ObjectUtil.isNotEmpty(containerNames) && containerNames.contains(imageId)) {
                return true;
            }
            return false;
        } catch (Exception e) {
            log.error("检查 Docker é•œåƒæ˜¯å¦æ­£åœ¨ä½¿ç”¨ä¸­å¤±è´¥: {}", e.getMessage());
            throw new RuntimeException("检查 Docker é•œåƒæ˜¯å¦æ­£åœ¨ä½¿ç”¨ä¸­å¤±è´¥: " + e.getMessage());
        }
    }
    /**
     * æŽ¨é€é•œåƒ
     *
     * @param authConfig
     * @param tag
     */
    public static void pushImage(AuthConfig authConfig, String tag) {
        Objects.requireNonNull(authConfig, "认证信息不能为空.");
        Objects.requireNonNull(tag, "镜像信息不能为空.");
        log.info("开始推送 Docker é•œåƒ: {}", tag);
        try {
            PushImageCmd pushImageCmd = dockerClient.pushImageCmd(tag);
            pushImageCmd.withAuthConfig(authConfig)
                    .start()
                    .awaitCompletion(30, TimeUnit.SECONDS);
            log.info("镜像push成功:{}", tag);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("镜像push失败:{}" + e.getMessage());
        }
    }
    /**
     * èŽ·å–é•œåƒId
     *
     * @param tag
     * @return
     */
    public String getImageId(String tag) {
        try {
            InspectImageCmd inspectImageCmd = dockerClient.inspectImageCmd(tag);
            InspectImageResponse image = inspectImageCmd.exec();
            if (null == image) {
                throw new RuntimeException("未获取到镜像信息:");
            }
            return image.getId();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("无法获取镜像信息:" + e.getMessage());
        }
    }
    // ä½¿ç”¨ Builder æ¨¡å¼æž„建 DockerUtil å¯¹è±¡
    public static class Builder {
        private String dockerHost;
        private String dockerApiVersion;
        private String dockerCertPath;
        public Builder withDockerHost(String dockerHost) {
            this.dockerHost = dockerHost;
            return this;
        }
        public Builder withDockerApiVersion(String dockerApiVersion) {
            this.dockerApiVersion = dockerApiVersion;
            return this;
        }
        public Builder withDockerCertPath(String dockerCertPath) {
            this.dockerCertPath = dockerCertPath;
            return this;
        }
        public DockerUtils build() {
            return new DockerUtils(dockerHost, dockerApiVersion, dockerCertPath);
        }
    }
    public static void main2(String[] args) throws InterruptedException {
        String tag = "10.20.152.16:18080/test/redis:t1";
        AuthConfig authConfig = new AuthConfig()
                .withRegistryAddress("10.20.152.16:18080")
                .withUsername("admin")
                .withPassword("admin123");
        DockerUtils dockerUtil = new DockerUtils.Builder()
                //服务器ip
                .withDockerHost("tcp://10.50.80.165:2375")
                //API版本 å¯é€šè¿‡åœ¨æœåС噍 docker version å‘½ä»¤æŸ¥çœ‹
                .withDockerApiVersion("1.41")
                //安全连接密钥文件存放路径
                .withDockerCertPath("/home/user/certs/")
                .build();
        //登录
        dockerUtil.login(authConfig);
        /* DockerUtil.pushImage(authConfig , tag); */
        //拉取镜像
        dockerUtil.pullImage(authConfig, tag);
        String imageId1 = dockerUtil.getImageId(tag);
        //保存镜像
        dockerUtil.saveImage(imageId1, "E:\\pdfTest\\docker\\redis.tar");
        //删除镜像
        dockerUtil.removeImage(imageId1);
    }
}
se-modules/se-docker/src/main/resources/banner.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}
SeDockerApplication,已经启动
se-modules/se-docker/src/main/resources/bootstrap.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
# Tomcat
server:
  port: 9299
# Spring
spring:
  application:
    # åº”用名称
    name: se-docker
  profiles:
    # çŽ¯å¢ƒé…ç½®
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        server-addr: 127.0.0.1:8848
      config:
        # é…ç½®ä¸­å¿ƒåœ°å€
        server-addr: 127.0.0.1:8848
        # é…ç½®æ–‡ä»¶æ ¼å¼
        file-extension: yml
        # å…±äº«é…ç½®
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
se-modules/se-docker/src/main/resources/logback.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- æ—¥å¿—存放路径 -->
    <property name="log.path" value="logs/se-docker" />
   <!-- æ—¥å¿—输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
    <!-- æŽ§åˆ¶å°è¾“出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- ç³»ç»Ÿæ—¥å¿—输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/info.log</file>
        <!-- å¾ªçŽ¯æ”¿ç­–ï¼šåŸºäºŽæ—¶é—´åˆ›å»ºæ—¥å¿—æ–‡ä»¶ -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- æ—¥å¿—文件名格式 -->
            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- æ—¥å¿—最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- è¿‡æ»¤çš„级别 -->
            <level>INFO</level>
            <!-- åŒ¹é…æ—¶çš„æ“ä½œï¼šæŽ¥æ”¶ï¼ˆè®°å½•) -->
            <onMatch>ACCEPT</onMatch>
            <!-- ä¸åŒ¹é…æ—¶çš„æ“ä½œï¼šæ‹’绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/error.log</file>
        <!-- å¾ªçŽ¯æ”¿ç­–ï¼šåŸºäºŽæ—¶é—´åˆ›å»ºæ—¥å¿—æ–‡ä»¶ -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- æ—¥å¿—文件名格式 -->
            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- æ—¥å¿—最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- è¿‡æ»¤çš„级别 -->
            <level>ERROR</level>
            <!-- åŒ¹é…æ—¶çš„æ“ä½œï¼šæŽ¥æ”¶ï¼ˆè®°å½•) -->
            <onMatch>ACCEPT</onMatch>
            <!-- ä¸åŒ¹é…æ—¶çš„æ“ä½œï¼šæ‹’绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- ç³»ç»Ÿæ¨¡å—日志级别控制  -->
    <logger name="com.se" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />
    <root level="info">
        <appender-ref ref="console" />
    </root>
    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
</configuration>
se-modules/se-system/src/main/java/com/se/system/controller/HealthController.java
@@ -1,6 +1,7 @@
package com.se.system.controller;
import com.se.common.core.web.controller.BaseController;
import com.se.system.utils.CheckPwdUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -8,7 +9,19 @@
@SuppressWarnings("ALL")
public class HealthController extends BaseController {
    @GetMapping("/health")
    public long test() {
    public long health() {
        return System.currentTimeMillis();
    }
    @GetMapping("/test")
    public String test() {
        int level = CheckPwdUtils.checkPwdLevel("12345A74.a");
        // å¯†ç å¿…须包含大写字母、小写字母、数字和特殊字符,且长度是8位以上
        if (level <= 2) return "密码强度过弱";
        if (level < 5) return "密码强度中等";
        return "密码强度符合标准";
    }
}
se-modules/se-system/src/main/java/com/se/system/controller/IndexController.java
@@ -1,5 +1,6 @@
package com.se.system.controller;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.ip.IpUtils;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
@@ -10,9 +11,12 @@
import com.se.system.api.domain.SysLogininfor;
import com.se.system.api.domain.SysOperLog;
import com.se.system.api.model.LoginUser;
import com.se.system.domain.SysMenu;
import com.se.system.service.IndexService;
import com.se.system.service.impl.SysMenuServiceImpl;
import com.se.system.service.inte.ISysLogininforService;
import com.se.system.service.inte.ISysOperLogService;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -31,10 +35,19 @@
    IndexService indexService;
    @Resource
    SysMenuServiceImpl menuService;
    @Resource
    ISysOperLogService operLogService;
    @Resource
    ISysLogininforService logininforService;
    private SysMenu sysMenu = new SysMenu();
    public IndexController() {
        sysMenu.setMark("index");
    }
    // â‘ PV统计:PV(Page View):页面浏览量或点击量,即网站所有页面被访问的总次数。
    // æ¯æ‰“开或刷新一个页面,PV就会增加一次,多次打开或刷新同一页面则浏览量累计。
@@ -139,13 +152,39 @@
        return map;
    }
    @GetMapping("/getAllPerms")
    public AjaxResult getAllPerms() {
        try {
            List<SysMenu> menus = menuService.selectMenuList(sysMenu, 1L);
            return success(menuService.buildMenus(menus));
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
            return error(ex.getMessage());
        }
    }
    @GetMapping("/getMyPerms")
    public AjaxResult getMyPerms() {
        try {
            Long userId = SecurityUtils.getUserId();
            List<SysMenu> menus = menuService.selectMenuList(sysMenu, userId);
            return success(menuService.buildMenus(menus));
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
            return error(ex.getMessage());
        }
    }
    @GetMapping("/addAccessLog")
    public AjaxResult addAccessLog(String title, int status) {
    public AjaxResult addAccessLog(String title, Integer status) {
        long start = System.currentTimeMillis();
        if (null == status || status < 0) status = 0;
        SysOperLog log = new SysOperLog();
        log.setTitle(title);
        // 0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据
        // 0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据,14=未授权
        log.setBusinessType(0);
        // ServletUtils.getRequest().getMethod()
        log.setMethod("com.se.system.controller.IndexController.addAccessLog()");
se-modules/se-system/src/main/java/com/se/system/controller/SysMenuController.java
@@ -30,6 +30,7 @@
 */
@RestController
@RequestMapping("/menu")
@SuppressWarnings("ALL")
public class SysMenuController extends BaseController
{
    @Autowired
@@ -41,12 +42,12 @@
    @RequiresPermissions("system:menu:list")
    @GetMapping("/list")
    public AjaxResult list(SysMenu menu) {
        if (StringUtils.isEmpty(menu.getMark())) {
        /*if (StringUtils.isEmpty(menu.getMark())) {
            menu.setMark("sys");
        }
        if ("all".equals(menu.getMark())) {
            menu.setMark(null);
        }
        }*/
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuList(menu, userId);
@@ -102,7 +103,7 @@
        }
        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
        {
            return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        //    return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        }
        menu.setCreateBy(SecurityUtils.getUsername());
        return toAjax(menuService.insertMenu(menu));
@@ -122,7 +123,7 @@
        }
        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
        {
            return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        //    return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        }
        else if (menu.getMenuId().equals(menu.getParentId()))
        {
@@ -168,19 +169,5 @@
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId, mark);
        return success(menuService.buildMenus(menus));
    }
    /**
     * æ ¹æ®æ ‡è¯†èŽ·å–èœå•
     *
     * @return èœå•
     */
    @GetMapping("getMenusByMark")
    public AjaxResult getMenusByMark(String mark)
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenusByUserIdAndMark(userId, mark);
        return success(menus);
    }
}
se-modules/se-system/src/main/java/com/se/system/controller/SysStatusCtrlController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.se.system.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import com.se.system.service.inte.ISysStatusCtrlService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.system.domain.SysStatusCtrl;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.page.TableDataInfo;
/**
 * ç³»ç»ŸçŠ¶æ€ç›‘æŽ§Controller
 *
 * @author se
 * @date 2024-12-07
 */
@RestController
@RequestMapping("/statusCtrl")
public class SysStatusCtrlController extends BaseController
{
    @Resource
    private ISysStatusCtrlService sysStatusCtrlService;
    /**
     * æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§åˆ—è¡¨
     */
    @RequiresPermissions("system:statusCtrl:list")
    @GetMapping("/list")
    public TableDataInfo list(SysStatusCtrl sysStatusCtrl)
    {
        startPage();
        List<SysStatusCtrl> list = sysStatusCtrlService.selectSysStatusCtrlList(sysStatusCtrl);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºç³»ç»ŸçŠ¶æ€ç›‘æŽ§åˆ—è¡¨
     */
    @RequiresPermissions("system:statusCtrl:export")
    @Log(title = "系统状态监控", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysStatusCtrl sysStatusCtrl)
    {
        List<SysStatusCtrl> list = sysStatusCtrlService.selectSysStatusCtrlList(sysStatusCtrl);
        ExcelUtil<SysStatusCtrl> util = new ExcelUtil<SysStatusCtrl>(SysStatusCtrl.class);
        util.exportExcel(response, list, "系统状态监控数据");
    }
    /**
     * èŽ·å–ç³»ç»ŸçŠ¶æ€ç›‘æŽ§è¯¦ç»†ä¿¡æ¯
     */
    @RequiresPermissions("system:statusCtrl:query")
    @GetMapping(value = "/{statusId}")
    public AjaxResult getInfo(@PathVariable("statusId") Long statusId)
    {
        return success(sysStatusCtrlService.selectSysStatusCtrlByStatusId(statusId));
    }
    /**
     * æ–°å¢žç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     */
    @RequiresPermissions("system:statusCtrl:add")
    @Log(title = "系统状态监控", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SysStatusCtrl sysStatusCtrl)
    {
        return toAjax(sysStatusCtrlService.insertSysStatusCtrl(sysStatusCtrl));
    }
    /**
     * ä¿®æ”¹ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     */
    @RequiresPermissions("system:statusCtrl:edit")
    @Log(title = "系统状态监控", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SysStatusCtrl sysStatusCtrl)
    {
        return toAjax(sysStatusCtrlService.updateSysStatusCtrl(sysStatusCtrl));
    }
    /**
     * åˆ é™¤ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     */
    @RequiresPermissions("system:statusCtrl:remove")
    @Log(title = "系统状态监控", businessType = BusinessType.DELETE)
    @DeleteMapping("/{statusIds}")
    public AjaxResult remove(@PathVariable Long[] statusIds)
    {
        return toAjax(sysStatusCtrlService.deleteSysStatusCtrlByStatusIds(statusIds));
    }
}
se-modules/se-system/src/main/java/com/se/system/controller/SysTaskCtrlController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.se.system.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import com.se.system.service.inte.ISysTaskCtrlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import com.se.system.domain.SysTaskCtrl;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.utils.poi.ExcelUtil;
import com.se.common.core.web.page.TableDataInfo;
/**
 * åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶Controller
 *
 * @author se
 * @date 2024-12-07
 */
@RestController
@RequestMapping("/taskCtrl")
public class SysTaskCtrlController extends BaseController
{
    @Resource
    private ISysTaskCtrlService sysTaskCtrlService;
    /**
     * æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶åˆ—è¡¨
     */
    @RequiresPermissions("system:taskCtrl:list")
    @GetMapping("/list")
    public TableDataInfo list(SysTaskCtrl sysTaskCtrl)
    {
        startPage();
        List<SysTaskCtrl> list = sysTaskCtrlService.selectSysTaskCtrlList(sysTaskCtrl);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºåˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶åˆ—è¡¨
     */
    @RequiresPermissions("system:taskCtrl:export")
    @Log(title = "分系统任务控制", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysTaskCtrl sysTaskCtrl)
    {
        List<SysTaskCtrl> list = sysTaskCtrlService.selectSysTaskCtrlList(sysTaskCtrl);
        ExcelUtil<SysTaskCtrl> util = new ExcelUtil<SysTaskCtrl>(SysTaskCtrl.class);
        util.exportExcel(response, list, "分系统任务控制数据");
    }
    /**
     * èŽ·å–åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶è¯¦ç»†ä¿¡æ¯
     */
    @RequiresPermissions("system:taskCtrl:query")
    @GetMapping(value = "/{taskId}")
    public AjaxResult getInfo(@PathVariable("taskId") Long taskId)
    {
        return success(sysTaskCtrlService.selectSysTaskCtrlByTaskId(taskId));
    }
    /**
     * æ–°å¢žåˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     */
    @RequiresPermissions("system:taskCtrl:add")
    @Log(title = "分系统任务控制", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SysTaskCtrl sysTaskCtrl)
    {
        return toAjax(sysTaskCtrlService.insertSysTaskCtrl(sysTaskCtrl));
    }
    /**
     * ä¿®æ”¹åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     */
    @RequiresPermissions("system:taskCtrl:edit")
    @Log(title = "分系统任务控制", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SysTaskCtrl sysTaskCtrl)
    {
        return toAjax(sysTaskCtrlService.updateSysTaskCtrl(sysTaskCtrl));
    }
    /**
     * åˆ é™¤åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     */
    @RequiresPermissions("system:taskCtrl:remove")
    @Log(title = "分系统任务控制", businessType = BusinessType.DELETE)
    @DeleteMapping("/{taskIds}")
    public AjaxResult remove(@PathVariable Long[] taskIds)
    {
        return toAjax(sysTaskCtrlService.deleteSysTaskCtrlByTaskIds(taskIds));
    }
}
se-modules/se-system/src/main/java/com/se/system/domain/SysStatusCtrl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
package com.se.system.domain;
import com.se.common.core.annotation.Excel;
import com.se.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * ç³»ç»ŸçŠ¶æ€ç›‘æŽ§å¯¹è±¡ sys_status_ctrl
 *
 * @author se
 * @date 2024-12-07
 */
public class SysStatusCtrl extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** çŠ¶æ€ID */
    private Long statusId;
    /** åç§° */
    @Excel(name = "名称")
    private String sysName;
    /** IP */
    @Excel(name = "IP")
    private String ip;
    /** URL */
    @Excel(name = "URL")
    private String url;
    /** è¯·æ±‚方法 */
    @Excel(name = "请求方法")
    private String method;
    /** æ˜¾ç¤ºé¡ºåº */
    @Excel(name = "显示顺序")
    private Long orderNum;
    /** çŠ¶æ€ï¼ˆ0正常 1停用) */
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    public void setStatusId(Long statusId)
    {
        this.statusId = statusId;
    }
    public Long getStatusId()
    {
        return statusId;
    }
    public void setSysName(String sysName)
    {
        this.sysName = sysName;
    }
    public String getSysName()
    {
        return sysName;
    }
    public void setIp(String ip)
    {
        this.ip = ip;
    }
    public String getIp()
    {
        return ip;
    }
    public void setUrl(String url)
    {
        this.url = url;
    }
    public String getUrl()
    {
        return url;
    }
    public void setMethod(String method)
    {
        this.method = method;
    }
    public String getMethod()
    {
        return method;
    }
    public void setOrderNum(Long orderNum)
    {
        this.orderNum = orderNum;
    }
    public Long getOrderNum()
    {
        return orderNum;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public String getStatus()
    {
        return status;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
            .append("statusId", getStatusId())
            .append("sysName", getSysName())
            .append("ip", getIp())
            .append("url", getUrl())
            .append("method", getMethod())
            .append("orderNum", getOrderNum())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
se-modules/se-system/src/main/java/com/se/system/domain/SysTaskCtrl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
package com.se.system.domain;
import com.se.common.core.annotation.Excel;
import com.se.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶å¯¹è±¡ sys_task_ctrl
 *
 * @author se
 * @date 2024-12-09
 */
public class SysTaskCtrl extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * ä»»åŠ¡ID
     */
    private Long taskId;
    /**
     * ä»»åŠ¡åç§°
     */
    @Excel(name = "任务名称")
    private String taskName;
    /**
     * æ–¹æ¡ˆID
     */
    @Excel(name = "方案ID")
    private String prjId;
    /**
     * æ–¹æ¡ˆåç§°
     */
    @Excel(name = "方案名称")
    private String prjName;
    /**
     * æƒ³å®šID
     */
    @Excel(name = "想定ID")
    private String thinkId;
    /**
     * æƒ³å®šåç§°
     */
    @Excel(name = "想定名称")
    private String thinkName;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @Excel(name = "开始时间")
    private String beginTime;
    /**
     * ç»“束时间
     */
    @Excel(name = "结束时间")
    private String endTime;
    /**
     * è®¡ç®—节点
     */
    @Excel(name = "计算节点")
    private String calcNode;
    /**
     * æ˜¯å¦ä¿å­˜ï¼ˆ0正常 1停用)
     */
    @Excel(name = "是否保存", readConverterExp = "0=正常,1=停用")
    private String isSave;
    /**
     * çŠ¶æ€ï¼ˆ0正常 1停用)
     */
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    public void setTaskId(Long taskId) {
        this.taskId = taskId;
    }
    public Long getTaskId() {
        return taskId;
    }
    public void setTaskName(String taskName) {
        this.taskName = taskName;
    }
    public String getTaskName() {
        return taskName;
    }
    public void setPrjId(String prjId) {
        this.prjId = prjId;
    }
    public String getPrjId() {
        return prjId;
    }
    public void setPrjName(String prjName) {
        this.prjName = prjName;
    }
    public String getPrjName() {
        return prjName;
    }
    public void setThinkId(String thinkId) {
        this.thinkId = thinkId;
    }
    public String getThinkId() {
        return thinkId;
    }
    public void setThinkName(String thinkName) {
        this.thinkName = thinkName;
    }
    public String getThinkName() {
        return thinkName;
    }
    public void setBeginTime(String beginTime) {
        this.beginTime = beginTime;
    }
    public String getBeginTime() {
        return beginTime;
    }
    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }
    public String getEndTime() {
        return endTime;
    }
    public void setCalcNode(String calcNode) {
        this.calcNode = calcNode;
    }
    public String getCalcNode() {
        return calcNode;
    }
    public void setIsSave(String isSave) {
        this.isSave = isSave;
    }
    public String getIsSave() {
        return isSave;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getStatus() {
        return status;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
                .append("taskId", getTaskId())
                .append("taskName", getTaskName())
                .append("prjId", getPrjId())
                .append("prjName", getPrjName())
                .append("thinkId", getThinkId())
                .append("thinkName", getThinkName())
                .append("beginTime", getBeginTime())
                .append("endTime", getEndTime())
                .append("calcNode", getCalcNode())
                .append("isSave", getIsSave())
                .append("status", getStatus())
                .append("createBy", getCreateBy())
                .append("createTime", getCreateTime())
                .append("updateBy", getUpdateBy())
                .append("updateTime", getUpdateTime())
                .append("remark", getRemark())
                .toString();
    }
}
se-modules/se-system/src/main/java/com/se/system/mapper/SysStatusCtrlMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysStatusCtrl;
/**
 * ç³»ç»ŸçŠ¶æ€ç›‘æŽ§Mapper接口
 *
 * @author se
 * @date 2024-12-07
 */
public interface SysStatusCtrlMapper
{
    /**
     * æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param statusId ç³»ç»ŸçŠ¶æ€ç›‘æŽ§ä¸»é”®
     * @return ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     */
    public SysStatusCtrl selectSysStatusCtrlByStatusId(Long statusId);
    /**
     * æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§åˆ—è¡¨
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç³»ç»ŸçŠ¶æ€ç›‘æŽ§é›†åˆ
     */
    public List<SysStatusCtrl> selectSysStatusCtrlList(SysStatusCtrl sysStatusCtrl);
    /**
     * æ–°å¢žç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç»“æžœ
     */
    public int insertSysStatusCtrl(SysStatusCtrl sysStatusCtrl);
    /**
     * ä¿®æ”¹ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç»“æžœ
     */
    public int updateSysStatusCtrl(SysStatusCtrl sysStatusCtrl);
    /**
     * åˆ é™¤ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param statusId ç³»ç»ŸçŠ¶æ€ç›‘æŽ§ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteSysStatusCtrlByStatusId(Long statusId);
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param statusIds éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int deleteSysStatusCtrlByStatusIds(Long[] statusIds);
}
se-modules/se-system/src/main/java/com/se/system/mapper/SysTaskCtrlMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.se.system.mapper;
import java.util.List;
import com.se.system.domain.SysTaskCtrl;
/**
 * åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶Mapper接口
 *
 * @author se
 * @date 2024-12-09
 */
public interface SysTaskCtrlMapper
{
    /**
     * æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param taskId åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶ä¸»é”®
     * @return åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     */
    public SysTaskCtrl selectSysTaskCtrlByTaskId(Long taskId);
    /**
     * æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶åˆ—è¡¨
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶é›†åˆ
     */
    public List<SysTaskCtrl> selectSysTaskCtrlList(SysTaskCtrl sysTaskCtrl);
    /**
     * æ–°å¢žåˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return ç»“æžœ
     */
    public int insertSysTaskCtrl(SysTaskCtrl sysTaskCtrl);
    /**
     * ä¿®æ”¹åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return ç»“æžœ
     */
    public int updateSysTaskCtrl(SysTaskCtrl sysTaskCtrl);
    /**
     * åˆ é™¤åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param taskId åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteSysTaskCtrlByTaskId(Long taskId);
    /**
     * æ‰¹é‡åˆ é™¤åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param taskIds éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int deleteSysTaskCtrlByTaskIds(Long[] taskIds);
}
se-modules/se-system/src/main/java/com/se/system/service/impl/SysMenuServiceImpl.java
@@ -71,7 +71,7 @@
        }
        //menu.setMenuId(SecurityUtils.isAdmin(userId) ? null : userId);
        return menuMapper.selectMenuListByUserId(menu);
        return menuList;
    }
    /**
@@ -127,13 +127,6 @@
            menus = menuMapper.selectMenuTreeByUserId(userId, mark);
        }
        //List<SysMenu> menus = menuMapper.selectMenuTreeByUserId(SecurityUtils.isAdmin(userId) ? null : userId, mark);
        return getChildPerms(menus, 0);
    }
    @Override
    public List<SysMenu> selectMenusByUserIdAndMark(Long userId, String mark) {
        List<SysMenu> menus = menuMapper.selectMenusByUserIdAndMark(SecurityUtils.isAdmin(userId) ? null : userId, mark);
        return getChildPerms(menus, 0);
    }
se-modules/se-system/src/main/java/com/se/system/service/impl/SysStatusCtrlServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.se.system.service.impl;
import java.util.List;
import com.se.common.core.utils.DateUtils;
import org.springframework.stereotype.Service;
import com.se.system.mapper.SysStatusCtrlMapper;
import com.se.system.domain.SysStatusCtrl;
import com.se.system.service.inte.ISysStatusCtrlService;
import javax.annotation.Resource;
/**
 * ç³»ç»ŸçŠ¶æ€ç›‘æŽ§Service业务层处理
 *
 * @author se
 * @date 2024-12-07
 */
@Service
public class SysStatusCtrlServiceImpl implements ISysStatusCtrlService
{
    @Resource
    private SysStatusCtrlMapper sysStatusCtrlMapper;
    /**
     * æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param statusId ç³»ç»ŸçŠ¶æ€ç›‘æŽ§ä¸»é”®
     * @return ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     */
    @Override
    public SysStatusCtrl selectSysStatusCtrlByStatusId(Long statusId)
    {
        return sysStatusCtrlMapper.selectSysStatusCtrlByStatusId(statusId);
    }
    /**
     * æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§åˆ—è¡¨
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     */
    @Override
    public List<SysStatusCtrl> selectSysStatusCtrlList(SysStatusCtrl sysStatusCtrl)
    {
        return sysStatusCtrlMapper.selectSysStatusCtrlList(sysStatusCtrl);
    }
    /**
     * æ–°å¢žç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç»“æžœ
     */
    @Override
    public int insertSysStatusCtrl(SysStatusCtrl sysStatusCtrl)
    {
        sysStatusCtrl.setCreateTime(DateUtils.getNowDate());
        return sysStatusCtrlMapper.insertSysStatusCtrl(sysStatusCtrl);
    }
    /**
     * ä¿®æ”¹ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç»“æžœ
     */
    @Override
    public int updateSysStatusCtrl(SysStatusCtrl sysStatusCtrl)
    {
        sysStatusCtrl.setUpdateTime(DateUtils.getNowDate());
        return sysStatusCtrlMapper.updateSysStatusCtrl(sysStatusCtrl);
    }
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param statusIds éœ€è¦åˆ é™¤çš„系统状态监控主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteSysStatusCtrlByStatusIds(Long[] statusIds)
    {
        return sysStatusCtrlMapper.deleteSysStatusCtrlByStatusIds(statusIds);
    }
    /**
     * åˆ é™¤ç³»ç»ŸçŠ¶æ€ç›‘æŽ§ä¿¡æ¯
     *
     * @param statusId ç³»ç»ŸçŠ¶æ€ç›‘æŽ§ä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public int deleteSysStatusCtrlByStatusId(Long statusId)
    {
        return sysStatusCtrlMapper.deleteSysStatusCtrlByStatusId(statusId);
    }
}
se-modules/se-system/src/main/java/com/se/system/service/impl/SysTaskCtrlServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.se.system.service.impl;
import java.util.List;
import com.se.common.core.utils.DateUtils;
import com.se.system.service.inte.ISysTaskCtrlService;
import org.springframework.stereotype.Service;
import com.se.system.mapper.SysTaskCtrlMapper;
import com.se.system.domain.SysTaskCtrl;
import javax.annotation.Resource;
/**
 * åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶Service业务层处理
 *
 * @author se
 * @date 2024-12-09
 */
@Service
public class SysTaskCtrlServiceImpl implements ISysTaskCtrlService
{
    @Resource
    private SysTaskCtrlMapper sysTaskCtrlMapper;
    /**
     * æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param taskId åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶ä¸»é”®
     * @return åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     */
    @Override
    public SysTaskCtrl selectSysTaskCtrlByTaskId(Long taskId)
    {
        return sysTaskCtrlMapper.selectSysTaskCtrlByTaskId(taskId);
    }
    /**
     * æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶åˆ—è¡¨
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     */
    @Override
    public List<SysTaskCtrl> selectSysTaskCtrlList(SysTaskCtrl sysTaskCtrl)
    {
        return sysTaskCtrlMapper.selectSysTaskCtrlList(sysTaskCtrl);
    }
    /**
     * æ–°å¢žåˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return ç»“æžœ
     */
    @Override
    public int insertSysTaskCtrl(SysTaskCtrl sysTaskCtrl)
    {
        sysTaskCtrl.setCreateTime(DateUtils.getNowDate());
        return sysTaskCtrlMapper.insertSysTaskCtrl(sysTaskCtrl);
    }
    /**
     * ä¿®æ”¹åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return ç»“æžœ
     */
    @Override
    public int updateSysTaskCtrl(SysTaskCtrl sysTaskCtrl)
    {
        sysTaskCtrl.setUpdateTime(DateUtils.getNowDate());
        return sysTaskCtrlMapper.updateSysTaskCtrl(sysTaskCtrl);
    }
    /**
     * æ‰¹é‡åˆ é™¤åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param taskIds éœ€è¦åˆ é™¤çš„分系统任务控制主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteSysTaskCtrlByTaskIds(Long[] taskIds)
    {
        return sysTaskCtrlMapper.deleteSysTaskCtrlByTaskIds(taskIds);
    }
    /**
     * åˆ é™¤åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶ä¿¡æ¯
     *
     * @param taskId åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶ä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public int deleteSysTaskCtrlByTaskId(Long taskId)
    {
        return sysTaskCtrlMapper.deleteSysTaskCtrlByTaskId(taskId);
    }
}
se-modules/se-system/src/main/java/com/se/system/service/inte/ISysMenuService.java
@@ -141,13 +141,4 @@
     * @return ç»“æžœ
     */
    public boolean checkMenuNameUnique(SysMenu menu);
    /**
     * æ ¹æ®ç”¨æˆ·ID和标识查询菜单
     *
     * @param userId ç”¨æˆ·ID
     * @param mark   èœå•标识
     * @return èœå•集合
     */
    List<SysMenu> selectMenusByUserIdAndMark(Long userId, String mark);
}
se-modules/se-system/src/main/java/com/se/system/service/inte/ISysStatusCtrlService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.se.system.service.inte;
import java.util.List;
import com.se.system.domain.SysStatusCtrl;
/**
 * ç³»ç»ŸçŠ¶æ€ç›‘æŽ§Service接口
 *
 * @author se
 * @date 2024-12-07
 */
public interface ISysStatusCtrlService
{
    /**
     * æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param statusId ç³»ç»ŸçŠ¶æ€ç›‘æŽ§ä¸»é”®
     * @return ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     */
    public SysStatusCtrl selectSysStatusCtrlByStatusId(Long statusId);
    /**
     * æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§åˆ—è¡¨
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç³»ç»ŸçŠ¶æ€ç›‘æŽ§é›†åˆ
     */
    public List<SysStatusCtrl> selectSysStatusCtrlList(SysStatusCtrl sysStatusCtrl);
    /**
     * æ–°å¢žç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç»“æžœ
     */
    public int insertSysStatusCtrl(SysStatusCtrl sysStatusCtrl);
    /**
     * ä¿®æ”¹ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param sysStatusCtrl ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     * @return ç»“æžœ
     */
    public int updateSysStatusCtrl(SysStatusCtrl sysStatusCtrl);
    /**
     * æ‰¹é‡åˆ é™¤ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
     *
     * @param statusIds éœ€è¦åˆ é™¤çš„系统状态监控主键集合
     * @return ç»“æžœ
     */
    public int deleteSysStatusCtrlByStatusIds(Long[] statusIds);
    /**
     * åˆ é™¤ç³»ç»ŸçŠ¶æ€ç›‘æŽ§ä¿¡æ¯
     *
     * @param statusId ç³»ç»ŸçŠ¶æ€ç›‘æŽ§ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteSysStatusCtrlByStatusId(Long statusId);
}
se-modules/se-system/src/main/java/com/se/system/service/inte/ISysTaskCtrlService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.se.system.service.inte;
import java.util.List;
import com.se.system.domain.SysTaskCtrl;
/**
 * åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶Service接口
 *
 * @author se
 * @date 2024-12-09
 */
public interface ISysTaskCtrlService
{
    /**
     * æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param taskId åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶ä¸»é”®
     * @return åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     */
    public SysTaskCtrl selectSysTaskCtrlByTaskId(Long taskId);
    /**
     * æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶åˆ—è¡¨
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶é›†åˆ
     */
    public List<SysTaskCtrl> selectSysTaskCtrlList(SysTaskCtrl sysTaskCtrl);
    /**
     * æ–°å¢žåˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return ç»“æžœ
     */
    public int insertSysTaskCtrl(SysTaskCtrl sysTaskCtrl);
    /**
     * ä¿®æ”¹åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param sysTaskCtrl åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     * @return ç»“æžœ
     */
    public int updateSysTaskCtrl(SysTaskCtrl sysTaskCtrl);
    /**
     * æ‰¹é‡åˆ é™¤åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
     *
     * @param taskIds éœ€è¦åˆ é™¤çš„分系统任务控制主键集合
     * @return ç»“æžœ
     */
    public int deleteSysTaskCtrlByTaskIds(Long[] taskIds);
    /**
     * åˆ é™¤åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶ä¿¡æ¯
     *
     * @param taskId åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteSysTaskCtrlByTaskId(Long taskId);
}
se-modules/se-system/src/main/java/com/se/system/utils/CheckPwdUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.se.system.utils;
@SuppressWarnings("ALL")
public class CheckPwdUtils {
    /**
     * NUM æ•°å­—
     * SMALL_LETTER å°å†™å­—母
     * CAPITAL_LETTER å¤§å†™å­—母
     * OTHER_CHAR ç‰¹æ®Šå­—符
     */
    private static final int NUM = 1;
    private static final int SMALL_LETTER = 2;
    private static final int CAPITAL_LETTER = 3;
    private static final int OTHER_CHAR = 4;
    /**
     * æ£€æŸ¥å¯†ç çš„强度
     *
     * @param passwd å¯†ç 
     * @return å¯†ç ç­‰çº§
     */
    public static int checkPwdLevel(String passwd) {
        if (null == passwd) {
            throw new IllegalArgumentException("密码不能为空");
        }
        if (passwd.length() < 8) {
            return 1;
        }
        int level = 0;
        // åˆ¤æ–­å¯†ç é•¿åº¦æ˜¯å¦å¤§äºŽç­‰äºŽ8 æ˜¯level++
        if (passwd.length() >= 8) {
            level++;
        }
        // åˆ¤æ–­å¯†ç æ˜¯å¦å«æœ‰æ•°å­— æœ‰level++
        if (countLetter(passwd, NUM) > 0) {
            level++;
        }
        // åˆ¤æ–­å¯†ç æ˜¯å¦å«æœ‰å°å†™å­—母 æœ‰level++
        if (countLetter(passwd, SMALL_LETTER) > 0) {
            level++;
        }
        // åˆ¤æ–­å¯†ç æ˜¯å¦è¿˜æœ‰å¤§å†™å­—母 æœ‰level++
        if (countLetter(passwd, CAPITAL_LETTER) > 0) {
            level++;
        }
        // åˆ¤æ–­å¯†ç æ˜¯å¦è¿˜æœ‰ç‰¹æ®Šå­—符 æœ‰level++
        if (countLetter(passwd, OTHER_CHAR) > 0) {
            level++;
        }
        return level;
    }
    /**
     * è®¡ç®—密码中指定字符类型的数量
     *
     * @param passwd å¯†ç 
     * @param type   ç±»åž‹
     * @return æ•°é‡
     */
    private static int countLetter(String passwd, int type) {
        int count = 0;
        if (null != passwd && !passwd.isEmpty()) {
            for (char c : passwd.toCharArray()) {
                if (checkCharacterType(c) == type) {
                    count++;
                }
            }
        }
        return count;
    }
    /**
     * æ£€æŸ¥å­—符类型,包括num、大写字母、小写字母和其他字符。
     *
     * @param c â€“ å­—符
     * @return ç±»åž‹
     */
    private static int checkCharacterType(char c) {
        if (c >= 48 && c <= 57) {
            return NUM;
        }
        if (c >= 65 && c <= 90) {
            return CAPITAL_LETTER;
        }
        if (c >= 97 && c <= 122) {
            return SMALL_LETTER;
        }
        return OTHER_CHAR;
    }
}
se-modules/se-system/src/main/resources/mapper/system/IndexMapper.xml
@@ -28,12 +28,21 @@
        where oper_url = '/index/addAccessLog' and oper_time >= #{createTime};
    </select>
    <select id="sysVisitList" resultType="java.util.Map">
    <!--select id="sysVisitList" resultType="java.util.Map">
        select title, count(*) count
        from sys_oper_log
        where oper_time >= #{createTime} and (title like '%平台' or title like '%分系统' or title like '%研讨厅' or title = '装备库')
        group by title
        order by count desc
        limit ${amount};
    </select-->
    <select id="sysVisitList" resultType="java.util.Map">
        select menu_name "name",
            (select count(*) from sys_oper_log b where b.title = a.menu_name and date(oper_time) = date(now())) "tcount",
            (select count(*) from sys_oper_log b where b.title = a.menu_name and week(oper_time) = week(now())) "wcount"
        from sys_menu a
        where a.mark = 'index' and a.menu_type = 'C'
        order by a.order_num;
    </select>
</mapper> 
se-modules/se-system/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -70,9 +70,7 @@
            left join sys_user_role ur on rm.role_id = ur.role_id
            left join sys_role ro on ur.role_id = ro.role_id
        <where>
            <if test="menuId != null">
                ur.user_id = #{menuId}
            </if>
            ur.user_id = #{params.userId}
            <if test="menuName != null and menuName != ''">
                AND m.menu_name like concat('%', #{menuName}, '%')
            </if>
se-modules/se-system/src/main/resources/mapper/system/SysStatusCtrlMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.se.system.mapper.SysStatusCtrlMapper">
    <resultMap type="SysStatusCtrl" id="SysStatusCtrlResult">
        <result property="statusId"    column="status_id"    />
        <result property="sysName"    column="sys_name"    />
        <result property="ip"    column="ip"    />
        <result property="url"    column="url"    />
        <result property="method"    column="method"    />
        <result property="orderNum"    column="order_num"    />
        <result property="status"    column="status"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateBy"    column="update_by"    />
        <result property="updateTime"    column="update_time"    />
        <result property="remark"    column="remark"    />
    </resultMap>
    <sql id="selectSysStatusCtrlVo">
        select status_id, sys_name, ip, url, method, order_num, status, create_by, create_time, update_by, update_time, remark from sys_status_ctrl
    </sql>
    <select id="selectSysStatusCtrlList" parameterType="SysStatusCtrl" resultMap="SysStatusCtrlResult">
        <include refid="selectSysStatusCtrlVo"/>
        <where>
            <if test="sysName != null  and sysName != ''"> and sys_name like concat('%', #{sysName}, '%')</if>
            <if test="ip != null  and ip != ''"> and ip = #{ip}</if>
            <if test="url != null  and url != ''"> and url = #{url}</if>
            <if test="method != null  and method != ''"> and method = #{method}</if>
            <if test="orderNum != null "> and order_num = #{orderNum}</if>
            <if test="status != null  and status != ''"> and status = #{status}</if>
        </where>
    </select>
    <select id="selectSysStatusCtrlByStatusId" parameterType="Long" resultMap="SysStatusCtrlResult">
        <include refid="selectSysStatusCtrlVo"/>
        where status_id = #{statusId}
    </select>
    <insert id="insertSysStatusCtrl" parameterType="SysStatusCtrl" useGeneratedKeys="true" keyProperty="statusId">
        insert into sys_status_ctrl
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="sysName != null">sys_name,</if>
            <if test="ip != null">ip,</if>
            <if test="url != null">url,</if>
            <if test="method != null">method,</if>
            <if test="orderNum != null">order_num,</if>
            <if test="status != null">status,</if>
            <if test="createBy != null">create_by,</if>
            <if test="createTime != null">create_time,</if>
            <if test="updateBy != null">update_by,</if>
            <if test="updateTime != null">update_time,</if>
            <if test="remark != null">remark,</if>
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="sysName != null">#{sysName},</if>
            <if test="ip != null">#{ip},</if>
            <if test="url != null">#{url},</if>
            <if test="method != null">#{method},</if>
            <if test="orderNum != null">#{orderNum},</if>
            <if test="status != null">#{status},</if>
            <if test="createBy != null">#{createBy},</if>
            <if test="createTime != null">#{createTime},</if>
            <if test="updateBy != null">#{updateBy},</if>
            <if test="updateTime != null">#{updateTime},</if>
            <if test="remark != null">#{remark},</if>
         </trim>
    </insert>
    <update id="updateSysStatusCtrl" parameterType="SysStatusCtrl">
        update sys_status_ctrl
        <trim prefix="SET" suffixOverrides=",">
            <if test="sysName != null">sys_name = #{sysName},</if>
            <if test="ip != null">ip = #{ip},</if>
            <if test="url != null">url = #{url},</if>
            <if test="method != null">method = #{method},</if>
            <if test="orderNum != null">order_num = #{orderNum},</if>
            <if test="status != null">status = #{status},</if>
            <if test="createBy != null">create_by = #{createBy},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="remark != null">remark = #{remark},</if>
        </trim>
        where status_id = #{statusId}
    </update>
    <delete id="deleteSysStatusCtrlByStatusId" parameterType="Long">
        delete from sys_status_ctrl where status_id = #{statusId}
    </delete>
    <delete id="deleteSysStatusCtrlByStatusIds" parameterType="String">
        delete from sys_status_ctrl where status_id in
        <foreach item="statusId" collection="array" open="(" separator="," close=")">
            #{statusId}
        </foreach>
    </delete>
</mapper>
se-modules/se-system/src/main/resources/mapper/system/SysTaskCtrlMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.se.system.mapper.SysTaskCtrlMapper">
    <resultMap type="SysTaskCtrl" id="SysTaskCtrlResult">
        <result property="taskId"    column="task_id"    />
        <result property="taskName"    column="task_name"    />
        <result property="prjId"    column="prj_id"    />
        <result property="prjName"    column="prj_name"    />
        <result property="thinkId"    column="think_id"    />
        <result property="thinkName"    column="think_name"    />
        <result property="beginTime"    column="begin_time"    />
        <result property="endTime"    column="end_time"    />
        <result property="calcNode"    column="calc_node"    />
        <result property="isSave"    column="is_save"    />
        <result property="status"    column="status"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateBy"    column="update_by"    />
        <result property="updateTime"    column="update_time"    />
        <result property="remark"    column="remark"    />
    </resultMap>
    <sql id="selectSysTaskCtrlVo">
        select task_id, task_name, prj_id, prj_name, think_id, think_name, begin_time, end_time, calc_node, is_save, status, create_by, create_time, update_by, update_time, remark from sys_task_ctrl
    </sql>
    <select id="selectSysTaskCtrlList" parameterType="SysTaskCtrl" resultMap="SysTaskCtrlResult">
        <include refid="selectSysTaskCtrlVo"/>
        <where>
            <if test="taskName != null  and taskName != ''"> and task_name like concat('%', #{taskName}, '%')</if>
            <if test="prjId != null  and prjId != ''"> and prj_id = #{prjId}</if>
            <if test="prjName != null  and prjName != ''"> and prj_name like concat('%', #{prjName}, '%')</if>
            <if test="thinkId != null  and thinkId != ''"> and think_id = #{thinkId}</if>
            <if test="thinkName != null  and thinkName != ''"> and think_name like concat('%', #{thinkName}, '%')</if>
            <if test="beginTime != null  and beginTime != ''"> and begin_time = #{beginTime}</if>
            <if test="endTime != null  and endTime != ''"> and end_time = #{endTime}</if>
            <if test="calcNode != null  and calcNode != ''"> and calc_node = #{calcNode}</if>
            <if test="isSave != null  and isSave != ''"> and is_save = #{isSave}</if>
            <if test="status != null  and status != ''"> and status = #{status}</if>
        </where>
    </select>
    <select id="selectSysTaskCtrlByTaskId" parameterType="Long" resultMap="SysTaskCtrlResult">
        <include refid="selectSysTaskCtrlVo"/>
        where task_id = #{taskId}
    </select>
    <insert id="insertSysTaskCtrl" parameterType="SysTaskCtrl" useGeneratedKeys="true" keyProperty="taskId">
        insert into sys_task_ctrl
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="taskName != null">task_name,</if>
            <if test="prjId != null">prj_id,</if>
            <if test="prjName != null">prj_name,</if>
            <if test="thinkId != null">think_id,</if>
            <if test="thinkName != null">think_name,</if>
            <if test="beginTime != null">begin_time,</if>
            <if test="endTime != null">end_time,</if>
            <if test="calcNode != null">calc_node,</if>
            <if test="isSave != null">is_save,</if>
            <if test="status != null">status,</if>
            <if test="createBy != null">create_by,</if>
            <if test="createTime != null">create_time,</if>
            <if test="updateBy != null">update_by,</if>
            <if test="updateTime != null">update_time,</if>
            <if test="remark != null">remark,</if>
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="taskName != null">#{taskName},</if>
            <if test="prjId != null">#{prjId},</if>
            <if test="prjName != null">#{prjName},</if>
            <if test="thinkId != null">#{thinkId},</if>
            <if test="thinkName != null">#{thinkName},</if>
            <if test="beginTime != null">#{beginTime},</if>
            <if test="endTime != null">#{endTime},</if>
            <if test="calcNode != null">#{calcNode},</if>
            <if test="isSave != null">#{isSave},</if>
            <if test="status != null">#{status},</if>
            <if test="createBy != null">#{createBy},</if>
            <if test="createTime != null">#{createTime},</if>
            <if test="updateBy != null">#{updateBy},</if>
            <if test="updateTime != null">#{updateTime},</if>
            <if test="remark != null">#{remark},</if>
         </trim>
    </insert>
    <update id="updateSysTaskCtrl" parameterType="SysTaskCtrl">
        update sys_task_ctrl
        <trim prefix="SET" suffixOverrides=",">
            <if test="taskName != null">task_name = #{taskName},</if>
            <if test="prjId != null">prj_id = #{prjId},</if>
            <if test="prjName != null">prj_name = #{prjName},</if>
            <if test="thinkId != null">think_id = #{thinkId},</if>
            <if test="thinkName != null">think_name = #{thinkName},</if>
            <if test="beginTime != null">begin_time = #{beginTime},</if>
            <if test="endTime != null">end_time = #{endTime},</if>
            <if test="calcNode != null">calc_node = #{calcNode},</if>
            <if test="isSave != null">is_save = #{isSave},</if>
            <if test="status != null">status = #{status},</if>
            <if test="createBy != null">create_by = #{createBy},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="remark != null">remark = #{remark},</if>
        </trim>
        where task_id = #{taskId}
    </update>
    <delete id="deleteSysTaskCtrlByTaskId" parameterType="Long">
        delete from sys_task_ctrl where task_id = #{taskId}
    </delete>
    <delete id="deleteSysTaskCtrlByTaskIds" parameterType="String">
        delete from sys_task_ctrl where task_id in
        <foreach item="taskId" collection="array" open="(" separator="," close=")">
            #{taskId}
        </foreach>
    </delete>
</mapper>
se-modules/se-system/src/main/resources/vm/java/controller.java.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package ${packageName}.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.se.common.log.annotation.Log;
import com.se.common.log.enums.BusinessType;
import com.se.common.security.annotation.RequiresPermissions;
import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service;
import com.se.common.core.web.controller.BaseController;
import com.se.common.core.web.domain.AjaxResult;
import com.se.common.core.utils.poi.ExcelUtil;
#if($table.crud || $table.sub)
import com.se.common.core.web.page.TableDataInfo;
#elseif($table.tree)
#end
/**
 * ${functionName}Controller
 *
 * @author ${author}
 * @date ${datetime}
 */
@RestController
@RequestMapping("/${businessName}")
public class ${ClassName}Controller extends BaseController
{
    @Autowired
    private I${ClassName}Service ${className}Service;
    /**
     * æŸ¥è¯¢${functionName}列表
     */
    @RequiresPermissions("${permissionPrefix}:list")
    @GetMapping("/list")
#if($table.crud || $table.sub)
    public TableDataInfo list(${ClassName} ${className})
    {
        startPage();
        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
        return getDataTable(list);
    }
#elseif($table.tree)
    public AjaxResult list(${ClassName} ${className})
    {
        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
        return success(list);
    }
#end
    /**
     * å¯¼å‡º${functionName}列表
     */
    @RequiresPermissions("${permissionPrefix}:export")
    @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ${ClassName} ${className})
    {
        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
        util.exportExcel(response, list, "${functionName}数据");
    }
    /**
     * èŽ·å–${functionName}详细信息
     */
    @RequiresPermissions("${permissionPrefix}:query")
    @GetMapping(value = "/{${pkColumn.javaField}}")
    public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
    {
        return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
    }
    /**
     * æ–°å¢ž${functionName}
     */
    @RequiresPermissions("${permissionPrefix}:add")
    @Log(title = "${functionName}", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody ${ClassName} ${className})
    {
        return toAjax(${className}Service.insert${ClassName}(${className}));
    }
    /**
     * ä¿®æ”¹${functionName}
     */
    @RequiresPermissions("${permissionPrefix}:edit")
    @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody ${ClassName} ${className})
    {
        return toAjax(${className}Service.update${ClassName}(${className}));
    }
    /**
     * åˆ é™¤${functionName}
     */
    @RequiresPermissions("${permissionPrefix}:remove")
    @Log(title = "${functionName}", businessType = BusinessType.DELETE)
    @DeleteMapping("/{${pkColumn.javaField}s}")
    public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
    {
        return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));
    }
}
se-modules/se-system/src/main/resources/vm/java/domain.java.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
package ${packageName}.domain;
#foreach ($import in $importList)
import ${import};
#end
import com.se.common.core.annotation.Excel;
#if($table.crud || $table.sub)
#elseif($table.tree)
#end
/**
 * ${functionName}对象 ${tableName}
 *
 * @author ${author}
 * @date ${datetime}
 */
#if($table.crud || $table.sub)
#set($Entity="BaseEntity")
#elseif($table.tree)
#set($Entity="TreeEntity")
#end
public class ${ClassName} extends ${Entity}
{
    private static final long serialVersionUID = 1L;
#foreach ($column in $columns)
#if(!$table.isSuperColumn($column.javaField))
    /** $column.columnComment */
#if($column.list)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($parentheseIndex != -1)
    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
#elseif($column.javaType == 'Date')
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
#else
    @Excel(name = "${comment}")
#end
#end
    private $column.javaType $column.javaField;
#end
#end
#if($table.sub)
    /** $table.subTable.functionName信息 */
    private List<${subClassName}> ${subclassName}List;
#end
#foreach ($column in $columns)
#if(!$table.isSuperColumn($column.javaField))
#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
#set($AttrName=$column.javaField)
#else
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#end
    public void set${AttrName}($column.javaType $column.javaField)
    {
        this.$column.javaField = $column.javaField;
    }
    public $column.javaType get${AttrName}()
    {
        return $column.javaField;
    }
#end
#end
#if($table.sub)
    public List<${subClassName}> get${subClassName}List()
    {
        return ${subclassName}List;
    }
    public void set${subClassName}List(List<${subClassName}> ${subclassName}List)
    {
        this.${subclassName}List = ${subclassName}List;
    }
#end
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
#foreach ($column in $columns)
#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
#set($AttrName=$column.javaField)
#else
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#end
            .append("${column.javaField}", get${AttrName}())
#end
#if($table.sub)
            .append("${subclassName}List", get${subClassName}List())
#end
            .toString();
    }
}
se-modules/se-system/src/main/resources/vm/java/mapper.java.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
package ${packageName}.mapper;
import java.util.List;
import ${packageName}.domain.${ClassName};
#if($table.sub)
import ${packageName}.domain.${subClassName};
#end
/**
 * ${functionName}Mapper接口
 *
 * @author ${author}
 * @date ${datetime}
 */
public interface ${ClassName}Mapper
{
    /**
     * æŸ¥è¯¢${functionName}
     *
     * @param ${pkColumn.javaField} ${functionName}主键
     * @return ${functionName}
     */
    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
    /**
     * æŸ¥è¯¢${functionName}列表
     *
     * @param ${className} ${functionName}
     * @return ${functionName}集合
     */
    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
    /**
     * æ–°å¢ž${functionName}
     *
     * @param ${className} ${functionName}
     * @return ç»“æžœ
     */
    public int insert${ClassName}(${ClassName} ${className});
    /**
     * ä¿®æ”¹${functionName}
     *
     * @param ${className} ${functionName}
     * @return ç»“æžœ
     */
    public int update${ClassName}(${ClassName} ${className});
    /**
     * åˆ é™¤${functionName}
     *
     * @param ${pkColumn.javaField} ${functionName}主键
     * @return ç»“æžœ
     */
    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
    /**
     * æ‰¹é‡åˆ é™¤${functionName}
     *
     * @param ${pkColumn.javaField}s éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
#if($table.sub)
    /**
     * æ‰¹é‡åˆ é™¤${subTable.functionName}
     *
     * @param ${pkColumn.javaField}s éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
    /**
     * æ‰¹é‡æ–°å¢ž${subTable.functionName}
     *
     * @param ${subclassName}List ${subTable.functionName}列表
     * @return ç»“æžœ
     */
    public int batch${subClassName}(List<${subClassName}> ${subclassName}List);
    /**
     * é€šè¿‡${functionName}主键删除${subTable.functionName}信息
     *
     * @param ${pkColumn.javaField} ${functionName}ID
     * @return ç»“æžœ
     */
    public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
#end
}
se-modules/se-system/src/main/resources/vm/java/service.java.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package ${packageName}.service;
import java.util.List;
import ${packageName}.domain.${ClassName};
/**
 * ${functionName}Service接口
 *
 * @author ${author}
 * @date ${datetime}
 */
public interface I${ClassName}Service
{
    /**
     * æŸ¥è¯¢${functionName}
     *
     * @param ${pkColumn.javaField} ${functionName}主键
     * @return ${functionName}
     */
    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
    /**
     * æŸ¥è¯¢${functionName}列表
     *
     * @param ${className} ${functionName}
     * @return ${functionName}集合
     */
    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
    /**
     * æ–°å¢ž${functionName}
     *
     * @param ${className} ${functionName}
     * @return ç»“æžœ
     */
    public int insert${ClassName}(${ClassName} ${className});
    /**
     * ä¿®æ”¹${functionName}
     *
     * @param ${className} ${functionName}
     * @return ç»“æžœ
     */
    public int update${ClassName}(${ClassName} ${className});
    /**
     * æ‰¹é‡åˆ é™¤${functionName}
     *
     * @param ${pkColumn.javaField}s éœ€è¦åˆ é™¤çš„${functionName}主键集合
     * @return ç»“æžœ
     */
    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
    /**
     * åˆ é™¤${functionName}信息
     *
     * @param ${pkColumn.javaField} ${functionName}主键
     * @return ç»“æžœ
     */
    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
}
se-modules/se-system/src/main/resources/vm/java/serviceImpl.java.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,169 @@
package ${packageName}.service.impl;
import java.util.List;
#foreach ($column in $columns)
#if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
import com.se.common.core.utils.DateUtils;
#break
#end
#end
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
#if($table.sub)
import java.util.ArrayList;
import com.se.common.core.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import ${packageName}.domain.${subClassName};
#end
import ${packageName}.mapper.${ClassName}Mapper;
import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service;
/**
 * ${functionName}Service业务层处理
 *
 * @author ${author}
 * @date ${datetime}
 */
@Service
public class ${ClassName}ServiceImpl implements I${ClassName}Service
{
    @Autowired
    private ${ClassName}Mapper ${className}Mapper;
    /**
     * æŸ¥è¯¢${functionName}
     *
     * @param ${pkColumn.javaField} ${functionName}主键
     * @return ${functionName}
     */
    @Override
    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
    {
        return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
    }
    /**
     * æŸ¥è¯¢${functionName}列表
     *
     * @param ${className} ${functionName}
     * @return ${functionName}
     */
    @Override
    public List<${ClassName}> select${ClassName}List(${ClassName} ${className})
    {
        return ${className}Mapper.select${ClassName}List(${className});
    }
    /**
     * æ–°å¢ž${functionName}
     *
     * @param ${className} ${functionName}
     * @return ç»“æžœ
     */
#if($table.sub)
    @Transactional
#end
    @Override
    public int insert${ClassName}(${ClassName} ${className})
    {
#foreach ($column in $columns)
#if($column.javaField == 'createTime')
        ${className}.setCreateTime(DateUtils.getNowDate());
#end
#end
#if($table.sub)
        int rows = ${className}Mapper.insert${ClassName}(${className});
        insert${subClassName}(${className});
        return rows;
#else
        return ${className}Mapper.insert${ClassName}(${className});
#end
    }
    /**
     * ä¿®æ”¹${functionName}
     *
     * @param ${className} ${functionName}
     * @return ç»“æžœ
     */
#if($table.sub)
    @Transactional
#end
    @Override
    public int update${ClassName}(${ClassName} ${className})
    {
#foreach ($column in $columns)
#if($column.javaField == 'updateTime')
        ${className}.setUpdateTime(DateUtils.getNowDate());
#end
#end
#if($table.sub)
        ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}());
        insert${subClassName}(${className});
#end
        return ${className}Mapper.update${ClassName}(${className});
    }
    /**
     * æ‰¹é‡åˆ é™¤${functionName}
     *
     * @param ${pkColumn.javaField}s éœ€è¦åˆ é™¤çš„${functionName}主键
     * @return ç»“æžœ
     */
#if($table.sub)
    @Transactional
#end
    @Override
    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s)
    {
#if($table.sub)
        ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s);
#end
        return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s);
    }
    /**
     * åˆ é™¤${functionName}信息
     *
     * @param ${pkColumn.javaField} ${functionName}主键
     * @return ç»“æžœ
     */
#if($table.sub)
    @Transactional
#end
    @Override
    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
    {
#if($table.sub)
        ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField});
#end
        return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
    }
#if($table.sub)
    /**
     * æ–°å¢ž${subTable.functionName}信息
     *
     * @param ${className} ${functionName}对象
     */
    public void insert${subClassName}(${ClassName} ${className})
    {
        List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List();
        ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}();
        if (StringUtils.isNotNull(${subclassName}List))
        {
            List<${subClassName}> list = new ArrayList<${subClassName}>();
            for (${subClassName} ${subclassName} : ${subclassName}List)
            {
                ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField});
                list.add(${subclassName});
            }
            if (list.size() > 0)
            {
                ${className}Mapper.batch${subClassName}(list);
            }
        }
    }
#end
}
se-modules/se-system/src/main/resources/vm/java/sub-domain.java.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package ${packageName}.domain;
#foreach ($import in $subImportList)
import ${import};
#end
import com.se.common.core.annotation.Excel;
/**
 * ${subTable.functionName}对象 ${subTableName}
 *
 * @author ${author}
 * @date ${datetime}
 */
public class ${subClassName} extends BaseEntity
{
    private static final long serialVersionUID = 1L;
#foreach ($column in $subTable.columns)
#if(!$table.isSuperColumn($column.javaField))
    /** $column.columnComment */
#if($column.list)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($parentheseIndex != -1)
    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
#elseif($column.javaType == 'Date')
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
#else
    @Excel(name = "${comment}")
#end
#end
    private $column.javaType $column.javaField;
#end
#end
#foreach ($column in $subTable.columns)
#if(!$table.isSuperColumn($column.javaField))
#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
#set($AttrName=$column.javaField)
#else
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#end
    public void set${AttrName}($column.javaType $column.javaField)
    {
        this.$column.javaField = $column.javaField;
    }
    public $column.javaType get${AttrName}()
    {
        return $column.javaField;
    }
#end
#end
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
#foreach ($column in $subTable.columns)
#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
#set($AttrName=$column.javaField)
#else
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#end
            .append("${column.javaField}", get${AttrName}())
#end
            .toString();
    }
}
se-modules/se-system/src/main/resources/vm/js/api.js.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
import request from '@/utils/request'
// æŸ¥è¯¢${functionName}列表
export function list${BusinessName}(query) {
  return request({
    url: '/${moduleName}/${businessName}/list',
    method: 'get',
    params: query
  })
}
// æŸ¥è¯¢${functionName}详细
export function get${BusinessName}(${pkColumn.javaField}) {
  return request({
    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
    method: 'get'
  })
}
// æ–°å¢ž${functionName}
export function add${BusinessName}(data) {
  return request({
    url: '/${moduleName}/${businessName}',
    method: 'post',
    data: data
  })
}
// ä¿®æ”¹${functionName}
export function update${BusinessName}(data) {
  return request({
    url: '/${moduleName}/${businessName}',
    method: 'put',
    data: data
  })
}
// åˆ é™¤${functionName}
export function del${BusinessName}(${pkColumn.javaField}) {
  return request({
    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
    method: 'delete'
  })
}
se-modules/se-system/src/main/resources/vm/sql/sql.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
-- èœå• SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单');
-- æŒ‰é’®çˆ¶èœå•ID
SELECT @parentId := LAST_INSERT_ID();
-- æŒ‰é’® SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}查询', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query',        '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}新增', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add',          '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}修改', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit',         '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove',       '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export',       '#', 'admin', sysdate(), '', null, '');
se-modules/se-system/src/main/resources/vm/vue/index-tree.vue.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,505 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
#foreach($column in $columns)
#if($column.query)
#set($dictType=$column.dictType)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.htmlType == "input")
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-input
          v-model="queryParams.${column.javaField}"
          placeholder="请输入${comment}"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
          <el-option
            v-for="dict in dict.type.${dictType}"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
          <el-option label="请选择字典生成" value="" />
        </el-select>
      </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-date-picker clearable
          v-model="queryParams.${column.javaField}"
          type="date"
          value-format="yyyy-MM-dd"
          placeholder="选择${comment}">
        </el-date-picker>
      </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
      <el-form-item label="${comment}">
        <el-date-picker
          v-model="daterange${AttrName}"
          style="width: 240px"
          value-format="yyyy-MM-dd"
          type="daterange"
          range-separator="-"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        ></el-date-picker>
      </el-form-item>
#end
#end
#end
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['${moduleName}:${businessName}:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="info"
          plain
          icon="el-icon-sort"
          size="mini"
          @click="toggleExpandAll"
        >展开/折叠</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table
      v-if="refreshTable"
      v-loading="loading"
      :data="${businessName}List"
      row-key="${treeCode}"
      :default-expand-all="isExpandAll"
      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
    >
#foreach($column in $columns)
#set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.pk)
#elseif($column.list && $column.htmlType == "datetime")
      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
        <template slot-scope="scope">
          <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
        </template>
      </el-table-column>
#elseif($column.list && $column.htmlType == "imageUpload")
      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
        <template slot-scope="scope">
          <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
        </template>
      </el-table-column>
#elseif($column.list && "" != $column.dictType)
      <el-table-column label="${comment}" align="center" prop="${javaField}">
        <template slot-scope="scope">
#if($column.htmlType == "checkbox")
          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
#else
          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}"/>
#end
        </template>
      </el-table-column>
#elseif($column.list && "" != $javaField)
#if(${foreach.index} == 1)
      <el-table-column label="${comment}" prop="${javaField}" />
#else
      <el-table-column label="${comment}" align="center" prop="${javaField}" />
#end
#end
#end
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['${moduleName}:${businessName}:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-plus"
            @click="handleAdd(scope.row)"
            v-hasPermi="['${moduleName}:${businessName}:add']"
          >新增</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['${moduleName}:${businessName}:remove']"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- æ·»åŠ æˆ–ä¿®æ”¹${functionName}对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
#foreach($column in $columns)
#set($field=$column.javaField)
#if($column.insert && !$column.pk)
#if(($column.usableColumn) || (!$column.superColumn))
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#set($dictType=$column.dictType)
#if("" != $treeParentCode && $column.javaField == $treeParentCode)
        <el-form-item label="${comment}" prop="${treeParentCode}">
          <treeselect v-model="form.${treeParentCode}" :options="${businessName}Options" :normalizer="normalizer" placeholder="请选择${comment}" />
        </el-form-item>
#elseif($column.htmlType == "input")
        <el-form-item label="${comment}" prop="${field}">
          <el-input v-model="form.${field}" placeholder="请输入${comment}" />
        </el-form-item>
#elseif($column.htmlType == "imageUpload")
        <el-form-item label="${comment}" prop="${field}">
          <image-upload v-model="form.${field}"/>
        </el-form-item>
#elseif($column.htmlType == "fileUpload")
        <el-form-item label="${comment}" prop="${field}">
          <file-upload v-model="form.${field}"/>
        </el-form-item>
#elseif($column.htmlType == "editor")
        <el-form-item label="${comment}">
          <editor v-model="form.${field}" :min-height="192"/>
        </el-form-item>
#elseif($column.htmlType == "select" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-select v-model="form.${field}" placeholder="请选择${comment}">
            <el-option
              v-for="dict in dict.type.${dictType}"
              :key="dict.value"
              :label="dict.label"
#if($column.javaType == "Integer" || $column.javaType == "Long")
              :value="parseInt(dict.value)"
#else
              :value="dict.value"
#end
            ></el-option>
          </el-select>
        </el-form-item>
#elseif($column.htmlType == "select" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-select v-model="form.${field}" placeholder="请选择${comment}">
            <el-option label="请选择字典生成" value="" />
          </el-select>
        </el-form-item>
#elseif($column.htmlType == "checkbox" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-checkbox-group v-model="form.${field}">
            <el-checkbox
              v-for="dict in dict.type.${dictType}"
              :key="dict.value"
              :label="dict.value">
              {{dict.label}}
            </el-checkbox>
          </el-checkbox-group>
        </el-form-item>
#elseif($column.htmlType == "checkbox" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-checkbox-group v-model="form.${field}">
            <el-checkbox>请选择字典生成</el-checkbox>
          </el-checkbox-group>
        </el-form-item>
#elseif($column.htmlType == "radio" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-radio-group v-model="form.${field}">
            <el-radio
              v-for="dict in dict.type.${dictType}"
              :key="dict.value"
#if($column.javaType == "Integer" || $column.javaType == "Long")
              :label="parseInt(dict.value)"
#else
              :label="dict.value"
#end
            >{{dict.label}}</el-radio>
          </el-radio-group>
        </el-form-item>
#elseif($column.htmlType == "radio" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-radio-group v-model="form.${field}">
            <el-radio label="1">请选择字典生成</el-radio>
          </el-radio-group>
        </el-form-item>
#elseif($column.htmlType == "datetime")
        <el-form-item label="${comment}" prop="${field}">
          <el-date-picker clearable
            v-model="form.${field}"
            type="date"
            value-format="yyyy-MM-dd"
            placeholder="选择${comment}">
          </el-date-picker>
        </el-form-item>
#elseif($column.htmlType == "textarea")
        <el-form-item label="${comment}" prop="${field}">
          <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
        </el-form-item>
#end
#end
#end
#end
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "${BusinessName}",
#if(${dicts} != '')
  dicts: [${dicts}],
#end
  components: {
    Treeselect
  },
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // ${functionName}表格数据
      ${businessName}List: [],
      // ${functionName}树选项
      ${businessName}Options: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æ˜¯å¦å±•开,默认全部展开
      isExpandAll: true,
      // é‡æ–°æ¸²æŸ“表格状态
      refreshTable: true,
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
      // $comment时间范围
      daterange${AttrName}: [],
#end
#end
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
#foreach ($column in $columns)
#if($column.query)
        $column.javaField: null#if($foreach.count != $columns.size()),#end
#end
#end
      },
      // è¡¨å•参数
      form: {},
      // è¡¨å•校验
      rules: {
#foreach ($column in $columns)
#if($column.required)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
        $column.javaField: [
          { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
        ]#if($foreach.count != $columns.size()),#end
#end
#end
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** æŸ¥è¯¢${functionName}列表 */
    getList() {
      this.loading = true;
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
      this.queryParams.params = {};
#break
#end
#end
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
      if (null != this.daterange${AttrName} && '' != this.daterange${AttrName}) {
        this.queryParams.params["begin${AttrName}"] = this.daterange${AttrName}[0];
        this.queryParams.params["end${AttrName}"] = this.daterange${AttrName}[1];
      }
#end
#end
      list${BusinessName}(this.queryParams).then(response => {
        this.${businessName}List = this.handleTree(response.data, "${treeCode}", "${treeParentCode}");
        this.loading = false;
      });
    },
    /** è½¬æ¢${functionName}数据结构 */
    normalizer(node) {
      if (node.children && !node.children.length) {
        delete node.children;
      }
      return {
        id: node.${treeCode},
        label: node.${treeName},
        children: node.children
      };
    },
    /** æŸ¥è¯¢${functionName}下拉树结构 */
    getTreeselect() {
      list${BusinessName}().then(response => {
        this.${businessName}Options = [];
        const data = { ${treeCode}: 0, ${treeName}: '顶级节点', children: [] };
        data.children = this.handleTree(response.data, "${treeCode}", "${treeParentCode}");
        this.${businessName}Options.push(data);
      });
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•重置
    reset() {
      this.form = {
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
        $column.javaField: []#if($foreach.count != $columns.size()),#end
#else
        $column.javaField: null#if($foreach.count != $columns.size()),#end
#end
#end
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
      this.daterange${AttrName} = [];
#end
#end
      this.resetForm("queryForm");
      this.handleQuery();
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd(row) {
      this.reset();
      this.getTreeselect();
      if (row != null && row.${treeCode}) {
        this.form.${treeParentCode} = row.${treeCode};
      } else {
        this.form.${treeParentCode} = 0;
      }
      this.open = true;
      this.title = "添加${functionName}";
    },
    /** å±•å¼€/折叠操作 */
    toggleExpandAll() {
      this.refreshTable = false;
      this.isExpandAll = !this.isExpandAll;
      this.$nextTick(() => {
        this.refreshTable = true;
      });
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.reset();
      this.getTreeselect();
      if (row != null) {
        this.form.${treeParentCode} = row.${treeCode};
      }
      get${BusinessName}(row.${pkColumn.javaField}).then(response => {
        this.form = response.data;
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
        this.form.$column.javaField = this.form.${column.javaField}.split(",");
#end
#end
        this.open = true;
        this.title = "修改${functionName}";
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm() {
      this.#[[$]]#refs["form"].validate(valid => {
        if (valid) {
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
          this.form.$column.javaField = this.form.${column.javaField}.join(",");
#end
#end
          if (this.form.${pkColumn.javaField} != null) {
            update${BusinessName}(this.form).then(response => {
              this.#[[$modal]]#.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            add${BusinessName}(this.form).then(response => {
              this.#[[$modal]]#.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      this.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + row.${pkColumn.javaField} + '"的数据项?').then(function() {
        return del${BusinessName}(row.${pkColumn.javaField});
      }).then(() => {
        this.getList();
        this.#[[$modal]]#.msgSuccess("删除成功");
      }).catch(() => {});
    }
  }
};
</script>
se-modules/se-system/src/main/resources/vm/vue/index.vue.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,602 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
#foreach($column in $columns)
#if($column.query)
#set($dictType=$column.dictType)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.htmlType == "input")
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-input
          v-model="queryParams.${column.javaField}"
          placeholder="请输入${comment}"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
          <el-option
            v-for="dict in dict.type.${dictType}"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
          <el-option label="请选择字典生成" value="" />
        </el-select>
      </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-date-picker clearable
          v-model="queryParams.${column.javaField}"
          type="date"
          value-format="yyyy-MM-dd"
          placeholder="请选择${comment}">
        </el-date-picker>
      </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
      <el-form-item label="${comment}">
        <el-date-picker
          v-model="daterange${AttrName}"
          style="width: 240px"
          value-format="yyyy-MM-dd"
          type="daterange"
          range-separator="-"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        ></el-date-picker>
      </el-form-item>
#end
#end
#end
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['${moduleName}:${businessName}:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['${moduleName}:${businessName}:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          size="mini"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['${moduleName}:${businessName}:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          @click="handleExport"
          v-hasPermi="['${moduleName}:${businessName}:export']"
        >导出</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
#foreach($column in $columns)
#set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.pk)
      <el-table-column label="${comment}" align="center" prop="${javaField}" />
#elseif($column.list && $column.htmlType == "datetime")
      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
        <template slot-scope="scope">
          <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
        </template>
      </el-table-column>
#elseif($column.list && $column.htmlType == "imageUpload")
      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
        <template slot-scope="scope">
          <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
        </template>
      </el-table-column>
#elseif($column.list && "" != $column.dictType)
      <el-table-column label="${comment}" align="center" prop="${javaField}">
        <template slot-scope="scope">
#if($column.htmlType == "checkbox")
          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
#else
          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}"/>
#end
        </template>
      </el-table-column>
#elseif($column.list && "" != $javaField)
      <el-table-column label="${comment}" align="center" prop="${javaField}" />
#end
#end
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['${moduleName}:${businessName}:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['${moduleName}:${businessName}:remove']"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ·»åŠ æˆ–ä¿®æ”¹${functionName}对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
#foreach($column in $columns)
#set($field=$column.javaField)
#if($column.insert && !$column.pk)
#if(($column.usableColumn) || (!$column.superColumn))
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#set($dictType=$column.dictType)
#if($column.htmlType == "input")
        <el-form-item label="${comment}" prop="${field}">
          <el-input v-model="form.${field}" placeholder="请输入${comment}" />
        </el-form-item>
#elseif($column.htmlType == "imageUpload")
        <el-form-item label="${comment}" prop="${field}">
          <image-upload v-model="form.${field}"/>
        </el-form-item>
#elseif($column.htmlType == "fileUpload")
        <el-form-item label="${comment}" prop="${field}">
          <file-upload v-model="form.${field}"/>
        </el-form-item>
#elseif($column.htmlType == "editor")
        <el-form-item label="${comment}">
          <editor v-model="form.${field}" :min-height="192"/>
        </el-form-item>
#elseif($column.htmlType == "select" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-select v-model="form.${field}" placeholder="请选择${comment}">
            <el-option
              v-for="dict in dict.type.${dictType}"
              :key="dict.value"
              :label="dict.label"
#if($column.javaType == "Integer" || $column.javaType == "Long")
              :value="parseInt(dict.value)"
#else
              :value="dict.value"
#end
            ></el-option>
          </el-select>
        </el-form-item>
#elseif($column.htmlType == "select" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-select v-model="form.${field}" placeholder="请选择${comment}">
            <el-option label="请选择字典生成" value="" />
          </el-select>
        </el-form-item>
#elseif($column.htmlType == "checkbox" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-checkbox-group v-model="form.${field}">
            <el-checkbox
              v-for="dict in dict.type.${dictType}"
              :key="dict.value"
              :label="dict.value">
              {{dict.label}}
            </el-checkbox>
          </el-checkbox-group>
        </el-form-item>
#elseif($column.htmlType == "checkbox" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-checkbox-group v-model="form.${field}">
            <el-checkbox>请选择字典生成</el-checkbox>
          </el-checkbox-group>
        </el-form-item>
#elseif($column.htmlType == "radio" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-radio-group v-model="form.${field}">
            <el-radio
              v-for="dict in dict.type.${dictType}"
              :key="dict.value"
#if($column.javaType == "Integer" || $column.javaType == "Long")
              :label="parseInt(dict.value)"
#else
              :label="dict.value"
#end
            >{{dict.label}}</el-radio>
          </el-radio-group>
        </el-form-item>
#elseif($column.htmlType == "radio" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-radio-group v-model="form.${field}">
            <el-radio label="1">请选择字典生成</el-radio>
          </el-radio-group>
        </el-form-item>
#elseif($column.htmlType == "datetime")
        <el-form-item label="${comment}" prop="${field}">
          <el-date-picker clearable
            v-model="form.${field}"
            type="date"
            value-format="yyyy-MM-dd"
            placeholder="请选择${comment}">
          </el-date-picker>
        </el-form-item>
#elseif($column.htmlType == "textarea")
        <el-form-item label="${comment}" prop="${field}">
          <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
        </el-form-item>
#end
#end
#end
#end
#if($table.sub)
        <el-divider content-position="center">${subTable.functionName}信息</el-divider>
        <el-row :gutter="10" class="mb8">
          <el-col :span="1.5">
            <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd${subClassName}">添加</el-button>
          </el-col>
          <el-col :span="1.5">
            <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDelete${subClassName}">删除</el-button>
          </el-col>
        </el-row>
        <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
          <el-table-column type="selection" width="50" align="center" />
          <el-table-column label="序号" align="center" prop="index" width="50"/>
#foreach($column in $subTable.columns)
#set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.pk || $javaField == ${subTableFkclassName})
#elseif($column.list && $column.htmlType == "input")
          <el-table-column label="$comment" prop="${javaField}" width="150">
            <template slot-scope="scope">
              <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
            </template>
          </el-table-column>
#elseif($column.list && $column.htmlType == "datetime")
          <el-table-column label="$comment" prop="${javaField}" width="240">
            <template slot-scope="scope">
              <el-date-picker clearable v-model="scope.row.$javaField" type="date" value-format="yyyy-MM-dd" placeholder="请选择$comment" />
            </template>
          </el-table-column>
#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
          <el-table-column label="$comment" prop="${javaField}" width="150">
            <template slot-scope="scope">
              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
                <el-option
                  v-for="dict in dict.type.$column.dictType"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </template>
          </el-table-column>
#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
          <el-table-column label="$comment" prop="${javaField}" width="150">
            <template slot-scope="scope">
              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
                <el-option label="请选择字典生成" value="" />
              </el-select>
            </template>
          </el-table-column>
#end
#end
        </el-table>
#end
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
export default {
  name: "${BusinessName}",
#if(${dicts} != '')
  dicts: [${dicts}],
#end
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
#if($table.sub)
      // å­è¡¨é€‰ä¸­æ•°æ®
      checked${subClassName}: [],
#end
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // ${functionName}表格数据
      ${businessName}List: [],
#if($table.sub)
      // ${subTable.functionName}表格数据
      ${subclassName}List: [],
#end
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
      // $comment时间范围
      daterange${AttrName}: [],
#end
#end
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
#foreach ($column in $columns)
#if($column.query)
        $column.javaField: null#if($foreach.count != $columns.size()),#end
#end
#end
      },
      // è¡¨å•参数
      form: {},
      // è¡¨å•校验
      rules: {
#foreach ($column in $columns)
#if($column.required)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
        $column.javaField: [
          { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
        ]#if($foreach.count != $columns.size()),#end
#end
#end
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** æŸ¥è¯¢${functionName}列表 */
    getList() {
      this.loading = true;
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
      this.queryParams.params = {};
#break
#end
#end
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
      if (null != this.daterange${AttrName} && '' != this.daterange${AttrName}) {
        this.queryParams.params["begin${AttrName}"] = this.daterange${AttrName}[0];
        this.queryParams.params["end${AttrName}"] = this.daterange${AttrName}[1];
      }
#end
#end
      list${BusinessName}(this.queryParams).then(response => {
        this.${businessName}List = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•重置
    reset() {
      this.form = {
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
        $column.javaField: []#if($foreach.count != $columns.size()),#end
#else
        $column.javaField: null#if($foreach.count != $columns.size()),#end
#end
#end
      };
#if($table.sub)
      this.${subclassName}List = [];
#end
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
      this.daterange${AttrName} = [];
#end
#end
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.${pkColumn.javaField})
      this.single = selection.length!==1
      this.multiple = !selection.length
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加${functionName}";
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.reset();
      const ${pkColumn.javaField} = row.${pkColumn.javaField} || this.ids
      get${BusinessName}(${pkColumn.javaField}).then(response => {
        this.form = response.data;
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
        this.form.$column.javaField = this.form.${column.javaField}.split(",");
#end
#end
#if($table.sub)
        this.${subclassName}List = response.data.${subclassName}List;
#end
        this.open = true;
        this.title = "修改${functionName}";
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm() {
      this.#[[$]]#refs["form"].validate(valid => {
        if (valid) {
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
          this.form.$column.javaField = this.form.${column.javaField}.join(",");
#end
#end
#if($table.sub)
          this.form.${subclassName}List = this.${subclassName}List;
#end
          if (this.form.${pkColumn.javaField} != null) {
            update${BusinessName}(this.form).then(response => {
              this.#[[$modal]]#.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            add${BusinessName}(this.form).then(response => {
              this.#[[$modal]]#.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const ${pkColumn.javaField}s = row.${pkColumn.javaField} || this.ids;
      this.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + ${pkColumn.javaField}s + '"的数据项?').then(function() {
        return del${BusinessName}(${pkColumn.javaField}s);
      }).then(() => {
        this.getList();
        this.#[[$modal]]#.msgSuccess("删除成功");
      }).catch(() => {});
    },
#if($table.sub)
    /** ${subTable.functionName}序号 */
    row${subClassName}Index({ row, rowIndex }) {
      row.index = rowIndex + 1;
    },
    /** ${subTable.functionName}添加按钮操作 */
    handleAdd${subClassName}() {
      let obj = {};
#foreach($column in $subTable.columns)
#if($column.pk || $column.javaField == ${subTableFkclassName})
#elseif($column.list && "" != $javaField)
      obj.$column.javaField = "";
#end
#end
      this.${subclassName}List.push(obj);
    },
    /** ${subTable.functionName}删除按钮操作 */
    handleDelete${subClassName}() {
      if (this.checked${subClassName}.length == 0) {
        this.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
      } else {
        const ${subclassName}List = this.${subclassName}List;
        const checked${subClassName} = this.checked${subClassName};
        this.${subclassName}List = ${subclassName}List.filter(function(item) {
          return checked${subClassName}.indexOf(item.index) == -1
        });
      }
    },
    /** å¤é€‰æ¡†é€‰ä¸­æ•°æ® */
    handle${subClassName}SelectionChange(selection) {
      this.checked${subClassName} = selection.map(item => item.index)
    },
#end
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.download('${moduleName}/${businessName}/export', {
        ...this.queryParams
      }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
    }
  }
};
</script>
se-modules/se-system/src/main/resources/vm/vue/v3/index-tree.vue.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,474 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
#foreach($column in $columns)
#if($column.query)
#set($dictType=$column.dictType)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.htmlType == "input")
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-input
          v-model="queryParams.${column.javaField}"
          placeholder="请输入${comment}"
          clearable
          @keyup.enter="handleQuery"
        />
      </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
          <el-option
            v-for="dict in ${dictType}"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
          <el-option label="请选择字典生成" value="" />
        </el-select>
      </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-date-picker clearable
          v-model="queryParams.${column.javaField}"
          type="date"
          value-format="YYYY-MM-DD"
          placeholder="选择${comment}">
        </el-date-picker>
      </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
      <el-form-item label="${comment}" style="width: 308px">
        <el-date-picker
          v-model="daterange${AttrName}"
          value-format="YYYY-MM-DD"
          type="daterange"
          range-separator="-"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        ></el-date-picker>
      </el-form-item>
#end
#end
#end
      <el-form-item>
        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="Plus"
          @click="handleAdd"
          v-hasPermi="['${moduleName}:${businessName}:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="info"
          plain
          icon="Sort"
          @click="toggleExpandAll"
        >展开/折叠</el-button>
      </el-col>
      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table
      v-if="refreshTable"
      v-loading="loading"
      :data="${businessName}List"
      row-key="${treeCode}"
      :default-expand-all="isExpandAll"
      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
    >
#foreach($column in $columns)
#set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.pk)
#elseif($column.list && $column.htmlType == "datetime")
      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
        <template #default="scope">
          <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
        </template>
      </el-table-column>
#elseif($column.list && $column.htmlType == "imageUpload")
      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
        <template #default="scope">
          <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
        </template>
      </el-table-column>
#elseif($column.list && "" != $column.dictType)
      <el-table-column label="${comment}" align="center" prop="${javaField}">
        <template #default="scope">
#if($column.htmlType == "checkbox")
          <dict-tag :options="${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
#else
          <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
#end
        </template>
      </el-table-column>
#elseif($column.list && "" != $javaField)
#if(${foreach.index} == 1)
      <el-table-column label="${comment}" prop="${javaField}" />
#else
      <el-table-column label="${comment}" align="center" prop="${javaField}" />
#end
#end
#end
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template #default="scope">
          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
          <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['${moduleName}:${businessName}:add']">新增</el-button>
          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- æ·»åŠ æˆ–ä¿®æ”¹${functionName}对话框 -->
    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
      <el-form ref="${businessName}Ref" :model="form" :rules="rules" label-width="80px">
#foreach($column in $columns)
#set($field=$column.javaField)
#if($column.insert && !$column.pk)
#if(($column.usableColumn) || (!$column.superColumn))
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#set($dictType=$column.dictType)
#if("" != $treeParentCode && $column.javaField == $treeParentCode)
        <el-form-item label="${comment}" prop="${treeParentCode}">
          <el-tree-select
            v-model="form.${treeParentCode}"
            :data="${businessName}Options"
            :props="{ value: '${treeCode}', label: '${treeName}', children: 'children' }"
            value-key="${treeCode}"
            placeholder="请选择${comment}"
            check-strictly
          />
        </el-form-item>
#elseif($column.htmlType == "input")
        <el-form-item label="${comment}" prop="${field}">
          <el-input v-model="form.${field}" placeholder="请输入${comment}" />
        </el-form-item>
#elseif($column.htmlType == "imageUpload")
        <el-form-item label="${comment}" prop="${field}">
          <image-upload v-model="form.${field}"/>
        </el-form-item>
#elseif($column.htmlType == "fileUpload")
        <el-form-item label="${comment}" prop="${field}">
          <file-upload v-model="form.${field}"/>
        </el-form-item>
#elseif($column.htmlType == "editor")
        <el-form-item label="${comment}">
          <editor v-model="form.${field}" :min-height="192"/>
        </el-form-item>
#elseif($column.htmlType == "select" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-select v-model="form.${field}" placeholder="请选择${comment}">
            <el-option
              v-for="dict in ${dictType}"
              :key="dict.value"
              :label="dict.label"
#if($column.javaType == "Integer" || $column.javaType == "Long")
              :value="parseInt(dict.value)"
#else
              :value="dict.value"
#end
            ></el-option>
          </el-select>
        </el-form-item>
#elseif($column.htmlType == "select" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-select v-model="form.${field}" placeholder="请选择${comment}">
            <el-option label="请选择字典生成" value="" />
          </el-select>
        </el-form-item>
#elseif($column.htmlType == "checkbox" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-checkbox-group v-model="form.${field}">
            <el-checkbox
              v-for="dict in ${dictType}"
              :key="dict.value"
              :label="dict.value">
              {{dict.label}}
            </el-checkbox>
          </el-checkbox-group>
        </el-form-item>
#elseif($column.htmlType == "checkbox" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-checkbox-group v-model="form.${field}">
            <el-checkbox>请选择字典生成</el-checkbox>
          </el-checkbox-group>
        </el-form-item>
#elseif($column.htmlType == "radio" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-radio-group v-model="form.${field}">
            <el-radio
              v-for="dict in ${dictType}"
              :key="dict.value"
#if($column.javaType == "Integer" || $column.javaType == "Long")
              :label="parseInt(dict.value)"
#else
              :label="dict.value"
#end
            >{{dict.label}}</el-radio>
          </el-radio-group>
        </el-form-item>
#elseif($column.htmlType == "radio" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-radio-group v-model="form.${field}">
            <el-radio label="1">请选择字典生成</el-radio>
          </el-radio-group>
        </el-form-item>
#elseif($column.htmlType == "datetime")
        <el-form-item label="${comment}" prop="${field}">
          <el-date-picker clearable
            v-model="form.${field}"
            type="date"
            value-format="YYYY-MM-DD"
            placeholder="选择${comment}">
          </el-date-picker>
        </el-form-item>
#elseif($column.htmlType == "textarea")
        <el-form-item label="${comment}" prop="${field}">
          <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
        </el-form-item>
#end
#end
#end
#end
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
          <el-button @click="cancel">取 æ¶ˆ</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup name="${BusinessName}">
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
const { proxy } = getCurrentInstance();
#if(${dicts} != '')
#set($dictsNoSymbol=$dicts.replace("'", ""))
const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
#end
const ${businessName}List = ref([]);
const ${businessName}Options = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const title = ref("");
const isExpandAll = ref(true);
const refreshTable = ref(true);
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
const daterange${AttrName} = ref([]);
#end
#end
const data = reactive({
  form: {},
  queryParams: {
    #foreach ($column in $columns)
#if($column.query)
    $column.javaField: null#if($foreach.count != $columns.size()),#end
#end
#end
  },
  rules: {
    #foreach ($column in $columns)
#if($column.required)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
    $column.javaField: [
      { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
    ]#if($foreach.count != $columns.size()),#end
#end
#end
  }
});
const { queryParams, form, rules } = toRefs(data);
/** æŸ¥è¯¢${functionName}列表 */
function getList() {
  loading.value = true;
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  queryParams.value.params = {};
#break
#end
#end
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  if (null != daterange${AttrName} && '' != daterange${AttrName}) {
    queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
    queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
  }
#end
#end
  list${BusinessName}(queryParams.value).then(response => {
    ${businessName}List.value = proxy.handleTree(response.data, "${treeCode}", "${treeParentCode}");
    loading.value = false;
  });
}
/** æŸ¥è¯¢${functionName}下拉树结构 */
function getTreeselect() {
  list${BusinessName}().then(response => {
    ${businessName}Options.value = [];
    const data = { ${treeCode}: 0, ${treeName}: '顶级节点', children: [] };
    data.children = proxy.handleTree(response.data, "${treeCode}", "${treeParentCode}");
    ${businessName}Options.value.push(data);
  });
}
// å–消按钮
function cancel() {
  open.value = false;
  reset();
}
// è¡¨å•重置
function reset() {
  form.value = {
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
    $column.javaField: []#if($foreach.count != $columns.size()),#end
#else
    $column.javaField: null#if($foreach.count != $columns.size()),#end
#end
#end
  };
  proxy.resetForm("${businessName}Ref");
}
/** æœç´¢æŒ‰é’®æ“ä½œ */
function handleQuery() {
  getList();
}
/** é‡ç½®æŒ‰é’®æ“ä½œ */
function resetQuery() {
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  daterange${AttrName}.value = [];
#end
#end
  proxy.resetForm("queryRef");
  handleQuery();
}
/** æ–°å¢žæŒ‰é’®æ“ä½œ */
function handleAdd(row) {
  reset();
  getTreeselect();
  if (row != null && row.${treeCode}) {
    form.value.${treeParentCode} = row.${treeCode};
  } else {
    form.value.${treeParentCode} = 0;
  }
  open.value = true;
  title.value = "添加${functionName}";
}
/** å±•å¼€/折叠操作 */
function toggleExpandAll() {
  refreshTable.value = false;
  isExpandAll.value = !isExpandAll.value;
  nextTick(() => {
    refreshTable.value = true;
  });
}
/** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
async function handleUpdate(row) {
  reset();
  await getTreeselect();
  if (row != null) {
    form.value.${treeParentCode} = row.${treeCode};
  }
  get${BusinessName}(row.${pkColumn.javaField}).then(response => {
    form.value = response.data;
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
    form.value.$column.javaField = form.value.${column.javaField}.split(",");
#end
#end
    open.value = true;
    title.value = "修改${functionName}";
  });
}
/** æäº¤æŒ‰é’® */
function submitForm() {
  proxy.#[[$]]#refs["${businessName}Ref"].validate(valid => {
    if (valid) {
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
      form.value.$column.javaField = form.value.${column.javaField}.join(",");
#end
#end
      if (form.value.${pkColumn.javaField} != null) {
        update${BusinessName}(form.value).then(response => {
          proxy.#[[$modal]]#.msgSuccess("修改成功");
          open.value = false;
          getList();
        });
      } else {
        add${BusinessName}(form.value).then(response => {
          proxy.#[[$modal]]#.msgSuccess("新增成功");
          open.value = false;
          getList();
        });
      }
    }
  });
}
/** åˆ é™¤æŒ‰é’®æ“ä½œ */
function handleDelete(row) {
  proxy.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + row.${pkColumn.javaField} + '"的数据项?').then(function() {
    return del${BusinessName}(row.${pkColumn.javaField});
  }).then(() => {
    getList();
    proxy.#[[$modal]]#.msgSuccess("删除成功");
  }).catch(() => {});
}
getList();
</script>
se-modules/se-system/src/main/resources/vm/vue/v3/index.vue.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,590 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
#foreach($column in $columns)
#if($column.query)
#set($dictType=$column.dictType)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.htmlType == "input")
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-input
          v-model="queryParams.${column.javaField}"
          placeholder="请输入${comment}"
          clearable
          @keyup.enter="handleQuery"
        />
      </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
          <el-option
            v-for="dict in ${dictType}"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
          <el-option label="请选择字典生成" value="" />
        </el-select>
      </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
      <el-form-item label="${comment}" prop="${column.javaField}">
        <el-date-picker clearable
          v-model="queryParams.${column.javaField}"
          type="date"
          value-format="YYYY-MM-DD"
          placeholder="请选择${comment}">
        </el-date-picker>
      </el-form-item>
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
      <el-form-item label="${comment}" style="width: 308px">
        <el-date-picker
          v-model="daterange${AttrName}"
          value-format="YYYY-MM-DD"
          type="daterange"
          range-separator="-"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
        ></el-date-picker>
      </el-form-item>
#end
#end
#end
      <el-form-item>
        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="Plus"
          @click="handleAdd"
          v-hasPermi="['${moduleName}:${businessName}:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="Edit"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['${moduleName}:${businessName}:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="Delete"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['${moduleName}:${businessName}:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="Download"
          @click="handleExport"
          v-hasPermi="['${moduleName}:${businessName}:export']"
        >导出</el-button>
      </el-col>
      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
#foreach($column in $columns)
#set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.pk)
      <el-table-column label="${comment}" align="center" prop="${javaField}" />
#elseif($column.list && $column.htmlType == "datetime")
      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
        <template #default="scope">
          <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
        </template>
      </el-table-column>
#elseif($column.list && $column.htmlType == "imageUpload")
      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
        <template #default="scope">
          <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
        </template>
      </el-table-column>
#elseif($column.list && "" != $column.dictType)
      <el-table-column label="${comment}" align="center" prop="${javaField}">
        <template #default="scope">
#if($column.htmlType == "checkbox")
          <dict-tag :options="${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
#else
          <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
#end
        </template>
      </el-table-column>
#elseif($column.list && "" != $javaField)
      <el-table-column label="${comment}" align="center" prop="${javaField}" />
#end
#end
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template #default="scope">
          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total>0"
      :total="total"
      v-model:page="queryParams.pageNum"
      v-model:limit="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ·»åŠ æˆ–ä¿®æ”¹${functionName}对话框 -->
    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
      <el-form ref="${businessName}Ref" :model="form" :rules="rules" label-width="80px">
#foreach($column in $columns)
#set($field=$column.javaField)
#if($column.insert && !$column.pk)
#if(($column.usableColumn) || (!$column.superColumn))
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#set($dictType=$column.dictType)
#if($column.htmlType == "input")
        <el-form-item label="${comment}" prop="${field}">
          <el-input v-model="form.${field}" placeholder="请输入${comment}" />
        </el-form-item>
#elseif($column.htmlType == "imageUpload")
        <el-form-item label="${comment}" prop="${field}">
          <image-upload v-model="form.${field}"/>
        </el-form-item>
#elseif($column.htmlType == "fileUpload")
        <el-form-item label="${comment}" prop="${field}">
          <file-upload v-model="form.${field}"/>
        </el-form-item>
#elseif($column.htmlType == "editor")
        <el-form-item label="${comment}">
          <editor v-model="form.${field}" :min-height="192"/>
        </el-form-item>
#elseif($column.htmlType == "select" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-select v-model="form.${field}" placeholder="请选择${comment}">
            <el-option
              v-for="dict in ${dictType}"
              :key="dict.value"
              :label="dict.label"
#if($column.javaType == "Integer" || $column.javaType == "Long")
              :value="parseInt(dict.value)"
#else
              :value="dict.value"
#end
            ></el-option>
          </el-select>
        </el-form-item>
#elseif($column.htmlType == "select" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-select v-model="form.${field}" placeholder="请选择${comment}">
            <el-option label="请选择字典生成" value="" />
          </el-select>
        </el-form-item>
#elseif($column.htmlType == "checkbox" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-checkbox-group v-model="form.${field}">
            <el-checkbox
              v-for="dict in ${dictType}"
              :key="dict.value"
              :label="dict.value">
              {{dict.label}}
            </el-checkbox>
          </el-checkbox-group>
        </el-form-item>
#elseif($column.htmlType == "checkbox" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-checkbox-group v-model="form.${field}">
            <el-checkbox>请选择字典生成</el-checkbox>
          </el-checkbox-group>
        </el-form-item>
#elseif($column.htmlType == "radio" && "" != $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-radio-group v-model="form.${field}">
            <el-radio
              v-for="dict in ${dictType}"
              :key="dict.value"
#if($column.javaType == "Integer" || $column.javaType == "Long")
              :label="parseInt(dict.value)"
#else
              :label="dict.value"
#end
            >{{dict.label}}</el-radio>
          </el-radio-group>
        </el-form-item>
#elseif($column.htmlType == "radio" && $dictType)
        <el-form-item label="${comment}" prop="${field}">
          <el-radio-group v-model="form.${field}">
            <el-radio label="1">请选择字典生成</el-radio>
          </el-radio-group>
        </el-form-item>
#elseif($column.htmlType == "datetime")
        <el-form-item label="${comment}" prop="${field}">
          <el-date-picker clearable
            v-model="form.${field}"
            type="date"
            value-format="YYYY-MM-DD"
            placeholder="请选择${comment}">
          </el-date-picker>
        </el-form-item>
#elseif($column.htmlType == "textarea")
        <el-form-item label="${comment}" prop="${field}">
          <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容" />
        </el-form-item>
#end
#end
#end
#end
#if($table.sub)
        <el-divider content-position="center">${subTable.functionName}信息</el-divider>
        <el-row :gutter="10" class="mb8">
          <el-col :span="1.5">
            <el-button type="primary" icon="Plus" @click="handleAdd${subClassName}">添加</el-button>
          </el-col>
          <el-col :span="1.5">
            <el-button type="danger" icon="Delete" @click="handleDelete${subClassName}">删除</el-button>
          </el-col>
        </el-row>
        <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
          <el-table-column type="selection" width="50" align="center" />
          <el-table-column label="序号" align="center" prop="index" width="50"/>
#foreach($column in $subTable.columns)
#set($javaField=$column.javaField)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($column.pk || $javaField == ${subTableFkclassName})
#elseif($column.list && $column.htmlType == "input")
          <el-table-column label="$comment" prop="${javaField}" width="150">
            <template #default="scope">
              <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
            </template>
          </el-table-column>
#elseif($column.list && $column.htmlType == "datetime")
          <el-table-column label="$comment" prop="${javaField}" width="240">
            <template #default="scope">
              <el-date-picker clearable
                v-model="scope.row.$javaField"
                type="date"
                value-format="YYYY-MM-DD"
                placeholder="请选择$comment">
              </el-date-picker>
            </template>
          </el-table-column>
#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
          <el-table-column label="$comment" prop="${javaField}" width="150">
            <template #default="scope">
              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
                <el-option
                  v-for="dict in $column.dictType"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </template>
          </el-table-column>
#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
          <el-table-column label="$comment" prop="${javaField}" width="150">
            <template #default="scope">
              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
                <el-option label="请选择字典生成" value="" />
              </el-select>
            </template>
          </el-table-column>
#end
#end
        </el-table>
#end
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
          <el-button @click="cancel">取 æ¶ˆ</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup name="${BusinessName}">
import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
const { proxy } = getCurrentInstance();
#if(${dicts} != '')
#set($dictsNoSymbol=$dicts.replace("'", ""))
const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
#end
const ${businessName}List = ref([]);
#if($table.sub)
const ${subclassName}List = ref([]);
#end
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
#if($table.sub)
const checked${subClassName} = ref([]);
#end
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
const daterange${AttrName} = ref([]);
#end
#end
const data = reactive({
  form: {},
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    #foreach ($column in $columns)
#if($column.query)
    $column.javaField: null#if($foreach.count != $columns.size()),#end
#end
#end
  },
  rules: {
    #foreach ($column in $columns)
#if($column.required)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
    $column.javaField: [
      { required: true, message: "$comment不能为空", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
    ]#if($foreach.count != $columns.size()),#end
#end
#end
  }
});
const { queryParams, form, rules } = toRefs(data);
/** æŸ¥è¯¢${functionName}列表 */
function getList() {
  loading.value = true;
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  queryParams.value.params = {};
#break
#end
#end
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  if (null != daterange${AttrName} && '' != daterange${AttrName}) {
    queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
    queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
  }
#end
#end
  list${BusinessName}(queryParams.value).then(response => {
    ${businessName}List.value = response.rows;
    total.value = response.total;
    loading.value = false;
  });
}
// å–消按钮
function cancel() {
  open.value = false;
  reset();
}
// è¡¨å•重置
function reset() {
  form.value = {
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
    $column.javaField: []#if($foreach.count != $columns.size()),#end
#else
    $column.javaField: null#if($foreach.count != $columns.size()),#end
#end
#end
  };
#if($table.sub)
  ${subclassName}List.value = [];
#end
  proxy.resetForm("${businessName}Ref");
}
/** æœç´¢æŒ‰é’®æ“ä½œ */
function handleQuery() {
  queryParams.value.pageNum = 1;
  getList();
}
/** é‡ç½®æŒ‰é’®æ“ä½œ */
function resetQuery() {
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  daterange${AttrName}.value = [];
#end
#end
  proxy.resetForm("queryRef");
  handleQuery();
}
// å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
function handleSelectionChange(selection) {
  ids.value = selection.map(item => item.${pkColumn.javaField});
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** æ–°å¢žæŒ‰é’®æ“ä½œ */
function handleAdd() {
  reset();
  open.value = true;
  title.value = "添加${functionName}";
}
/** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
function handleUpdate(row) {
  reset();
  const _${pkColumn.javaField} = row.${pkColumn.javaField} || ids.value
  get${BusinessName}(_${pkColumn.javaField}).then(response => {
    form.value = response.data;
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
    form.value.$column.javaField = form.value.${column.javaField}.split(",");
#end
#end
#if($table.sub)
    ${subclassName}List.value = response.data.${subclassName}List;
#end
    open.value = true;
    title.value = "修改${functionName}";
  });
}
/** æäº¤æŒ‰é’® */
function submitForm() {
  proxy.#[[$]]#refs["${businessName}Ref"].validate(valid => {
    if (valid) {
#foreach ($column in $columns)
#if($column.htmlType == "checkbox")
      form.value.$column.javaField = form.value.${column.javaField}.join(",");
#end
#end
#if($table.sub)
      form.value.${subclassName}List = ${subclassName}List.value;
#end
      if (form.value.${pkColumn.javaField} != null) {
        update${BusinessName}(form.value).then(response => {
          proxy.#[[$modal]]#.msgSuccess("修改成功");
          open.value = false;
          getList();
        });
      } else {
        add${BusinessName}(form.value).then(response => {
          proxy.#[[$modal]]#.msgSuccess("新增成功");
          open.value = false;
          getList();
        });
      }
    }
  });
}
/** åˆ é™¤æŒ‰é’®æ“ä½œ */
function handleDelete(row) {
  const _${pkColumn.javaField}s = row.${pkColumn.javaField} || ids.value;
  proxy.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + _${pkColumn.javaField}s + '"的数据项?').then(function() {
    return del${BusinessName}(_${pkColumn.javaField}s);
  }).then(() => {
    getList();
    proxy.#[[$modal]]#.msgSuccess("删除成功");
  }).catch(() => {});
}
#if($table.sub)
/** ${subTable.functionName}序号 */
function row${subClassName}Index({ row, rowIndex }) {
  row.index = rowIndex + 1;
}
/** ${subTable.functionName}添加按钮操作 */
function handleAdd${subClassName}() {
  let obj = {};
#foreach($column in $subTable.columns)
#if($column.pk || $column.javaField == ${subTableFkclassName})
#elseif($column.list && "" != $javaField)
  obj.$column.javaField = "";
#end
#end
  ${subclassName}List.value.push(obj);
}
/** ${subTable.functionName}删除按钮操作 */
function handleDelete${subClassName}() {
  if (checked${subClassName}.value.length == 0) {
    proxy.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
  } else {
    const ${subclassName}s = ${subclassName}List.value;
    const checked${subClassName}s = checked${subClassName}.value;
    ${subclassName}List.value = ${subclassName}s.filter(function(item) {
      return checked${subClassName}s.indexOf(item.index) == -1
    });
  }
}
/** å¤é€‰æ¡†é€‰ä¸­æ•°æ® */
function handle${subClassName}SelectionChange(selection) {
  checked${subClassName}.value = selection.map(item => item.index)
}
#end
/** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
function handleExport() {
  proxy.download('${moduleName}/${businessName}/export', {
    ...queryParams.value
  }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
}
getList();
</script>
se-modules/se-system/src/main/resources/vm/xml/mapper.xml.vm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,140 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${packageName}.mapper.${ClassName}Mapper">
    <resultMap type="${ClassName}" id="${ClassName}Result">
#foreach ($column in $columns)
        <result property="${column.javaField}"    column="${column.columnName}"    />
#end
    </resultMap>
#if($table.sub)
    <resultMap id="${ClassName}${subClassName}Result" type="${ClassName}" extends="${ClassName}Result">
        <collection property="${subclassName}List" ofType="${subClassName}" column="${pkColumn.columnName}" select="select${subClassName}List" />
    </resultMap>
    <resultMap type="${subClassName}" id="${subClassName}Result">
#foreach ($column in $subTable.columns)
        <result property="${column.javaField}"    column="${column.columnName}"    />
#end
    </resultMap>
#end
    <sql id="select${ClassName}Vo">
        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName}
    </sql>
    <select id="select${ClassName}List" parameterType="${ClassName}" resultMap="${ClassName}Result">
        <include refid="select${ClassName}Vo"/>
        <where>
#foreach($column in $columns)
#set($queryType=$column.queryType)
#set($javaField=$column.javaField)
#set($javaType=$column.javaType)
#set($columnName=$column.columnName)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#if($column.query)
#if($column.queryType == "EQ")
            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName = #{$javaField}</if>
#elseif($queryType == "NE")
            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName != #{$javaField}</if>
#elseif($queryType == "GT")
            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt; #{$javaField}</if>
#elseif($queryType == "GTE")
            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt;= #{$javaField}</if>
#elseif($queryType == "LT")
            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt; #{$javaField}</if>
#elseif($queryType == "LTE")
            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt;= #{$javaField}</if>
#elseif($queryType == "LIKE")
            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName like concat('%', #{$javaField}, '%')</if>
#elseif($queryType == "BETWEEN")
            <if test="params.begin$AttrName != null and params.begin$AttrName != '' and params.end$AttrName != null and params.end$AttrName != ''"> and $columnName between #{params.begin$AttrName} and #{params.end$AttrName}</if>
#end
#end
#end
        </where>
    </select>
    <select id="select${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}" resultMap="#if($table.sub)${ClassName}${subClassName}Result#else${ClassName}Result#end">
#if($table.crud || $table.tree)
        <include refid="select${ClassName}Vo"/>
        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
#elseif($table.sub)
        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end
        from ${tableName}
        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
#end
    </select>
#if($table.sub)
    <select id="select${subClassName}List" resultMap="${subClassName}Result">
        select#foreach ($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end
        from ${subTableName}
        where ${subTableFkName} = #{${subTableFkName}}
    </select>
#end
    <insert id="insert${ClassName}" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true" keyProperty="$pkColumn.javaField"#end>
        insert into ${tableName}
        <trim prefix="(" suffix=")" suffixOverrides=",">
#foreach($column in $columns)
#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName,</if>
#end
#end
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
#foreach($column in $columns)
#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">#{$column.javaField},</if>
#end
#end
         </trim>
    </insert>
    <update id="update${ClassName}" parameterType="${ClassName}">
        update ${tableName}
        <trim prefix="SET" suffixOverrides=",">
#foreach($column in $columns)
#if($column.columnName != $pkColumn.columnName)
            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName = #{$column.javaField},</if>
#end
#end
        </trim>
        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
    </update>
    <delete id="delete${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}">
        delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}}
    </delete>
    <delete id="delete${ClassName}By${pkColumn.capJavaField}s" parameterType="String">
        delete from ${tableName} where ${pkColumn.columnName} in
        <foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")">
            #{${pkColumn.javaField}}
        </foreach>
    </delete>
#if($table.sub)
    <delete id="delete${subClassName}By${subTableFkClassName}s" parameterType="String">
        delete from ${subTableName} where ${subTableFkName} in
        <foreach item="${subTableFkclassName}" collection="array" open="(" separator="," close=")">
            #{${subTableFkclassName}}
        </foreach>
    </delete>
    <delete id="delete${subClassName}By${subTableFkClassName}" parameterType="${pkColumn.javaType}">
        delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}}
    </delete>
    <insert id="batch${subClassName}">
        insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values
        <foreach item="item" index="index" collection="list" separator=",">
            (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end)
        </foreach>
    </insert>
#end
</mapper>
se-ui/src/api/system/soft.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
import request from '@/utils/request'
// æŸ¥è¯¢è½¯ä»¶åˆ—表
export function listSoft(query) {
  return request({
    url: '/system/soft/list',
    method: 'get',
    params: query
  })
}
// æŸ¥è¯¢è½¯ä»¶è¯¦ç»†
export function getSoft(softId) {
  return request({
    url: '/system/soft/' + softId,
    method: 'get'
  })
}
// æ–°å¢žè½¯ä»¶
export function addSoft(data) {
  return request({
    url: '/system/soft',
    method: 'post',
    data: data
  })
}
// ä¿®æ”¹è½¯ä»¶
export function updateSoft(data) {
  return request({
    url: '/system/soft',
    method: 'put',
    data: data
  })
}
// åˆ é™¤è½¯ä»¶
export function delSoft(softId) {
  return request({
    url: '/system/soft/' + softId,
    method: 'delete'
  })
}
se-ui/src/api/system/statusCtrl.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
import request from '@/utils/request'
// æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§åˆ—è¡¨
export function listStatusCtrl(query) {
  return request({
    url: '/system/statusCtrl/list',
    method: 'get',
    params: query
  })
}
// æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§è¯¦ç»†
export function getStatusCtrl(statusId) {
  return request({
    url: '/system/statusCtrl/' + statusId,
    method: 'get'
  })
}
// æ–°å¢žç³»ç»ŸçŠ¶æ€ç›‘æŽ§
export function addStatusCtrl(data) {
  return request({
    url: '/system/statusCtrl',
    method: 'post',
    data: data
  })
}
// ä¿®æ”¹ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
export function updateStatusCtrl(data) {
  return request({
    url: '/system/statusCtrl',
    method: 'put',
    data: data
  })
}
// åˆ é™¤ç³»ç»ŸçŠ¶æ€ç›‘æŽ§
export function delStatusCtrl(statusId) {
  return request({
    url: '/system/statusCtrl/' + statusId,
    method: 'delete'
  })
}
se-ui/src/api/system/taskCtrl.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
import request from '@/utils/request'
// æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶åˆ—è¡¨
export function listTaskCtrl(query) {
  return request({
    url: '/system/taskCtrl/list',
    method: 'get',
    params: query
  })
}
// æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶è¯¦ç»†
export function getTaskCtrl(taskId) {
  return request({
    url: '/system/taskCtrl/' + taskId,
    method: 'get'
  })
}
// æ–°å¢žåˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
export function addTaskCtrl(data) {
  return request({
    url: '/system/taskCtrl',
    method: 'post',
    data: data
  })
}
// ä¿®æ”¹åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
export function updateTaskCtrl(data) {
  return request({
    url: '/system/taskCtrl',
    method: 'put',
    data: data
  })
}
// åˆ é™¤åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶
export function delTaskCtrl(taskId) {
  return request({
    url: '/system/taskCtrl/' + taskId,
    method: 'delete'
  })
}
se-ui/src/views/system/soft/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,281 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="名称" prop="name">
        <el-input
          v-model="queryParams.name"
          placeholder="请输入名称"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['system:soft:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['system:soft:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          size="mini"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['system:soft:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          @click="handleExport"
          v-hasPermi="['system:soft:export']"
        >导出</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="softList" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="软件ID" align="center" prop="softId" />
      <el-table-column label="名称" align="center" prop="name" />
      <el-table-column label="类型" align="center" prop="type" />
      <el-table-column label="许可" align="center" prop="lic" />
      <el-table-column label="描述" align="center" prop="descr" />
      <el-table-column label="参数" align="center" prop="args" />
      <el-table-column label="状态" align="center" prop="status" />
      <el-table-column label="备注" align="center" prop="remark" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['system:soft:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['system:soft:remove']"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ·»åŠ æˆ–ä¿®æ”¹è½¯ä»¶å¯¹è¯æ¡† -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="名称" prop="name">
          <el-input v-model="form.name" placeholder="请输入名称" />
        </el-form-item>
        <el-form-item label="许可" prop="lic">
          <el-input v-model="form.lic" type="textarea" placeholder="请输入内容" />
        </el-form-item>
        <el-form-item label="描述" prop="descr">
          <el-input v-model="form.descr" type="textarea" placeholder="请输入内容" />
        </el-form-item>
        <el-form-item label="参数" prop="args">
          <el-input v-model="form.args" type="textarea" placeholder="请输入内容" />
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listSoft, getSoft, delSoft, addSoft, updateSoft } from "@/api/system/soft";
export default {
  name: "Soft",
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // è½¯ä»¶è¡¨æ ¼æ•°æ®
      softList: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        name: null,
        type: null,
        lic: null,
        descr: null,
        args: null,
        status: null,
      },
      // è¡¨å•参数
      form: {},
      // è¡¨å•校验
      rules: {
        name: [
          { required: true, message: "名称不能为空", trigger: "blur" }
        ],
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** æŸ¥è¯¢è½¯ä»¶åˆ—表 */
    getList() {
      this.loading = true;
      listSoft(this.queryParams).then(response => {
        this.softList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        softId: null,
        name: null,
        type: null,
        lic: null,
        descr: null,
        args: null,
        status: null,
        createBy: null,
        createTime: null,
        updateBy: null,
        updateTime: null,
        remark: null
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.softId)
      this.single = selection.length!==1
      this.multiple = !selection.length
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加软件";
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.reset();
      const softId = row.softId || this.ids
      getSoft(softId).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改软件";
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.softId != null) {
            updateSoft(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addSoft(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const softIds = row.softId || this.ids;
      this.$modal.confirm('是否确认删除软件编号为"' + softIds + '"的数据项?').then(function() {
        return delSoft(softIds);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.download('system/soft/export', {
        ...this.queryParams
      }, `soft_${new Date().getTime()}.xlsx`)
    }
  }
};
</script>
se-ui/src/views/system/statusCtrl/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,305 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="名称" prop="sysName">
        <el-input
          v-model="queryParams.sysName"
          placeholder="请输入名称"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="IP" prop="ip">
        <el-input
          v-model="queryParams.ip"
          placeholder="请输入IP"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="请求方法" prop="method">
        <el-input
          v-model="queryParams.method"
          placeholder="请输入请求方法"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="显示顺序" prop="orderNum">
        <el-input
          v-model="queryParams.orderNum"
          placeholder="请输入显示顺序"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['system:statusCtrl:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['system:statusCtrl:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          size="mini"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['system:statusCtrl:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          @click="handleExport"
          v-hasPermi="['system:statusCtrl:export']"
        >导出</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="statusCtrlList" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="状态ID" align="center" prop="statusId" />
      <el-table-column label="名称" align="center" prop="sysName" />
      <el-table-column label="IP" align="center" prop="ip" />
      <el-table-column label="URL" align="center" prop="url" />
      <el-table-column label="请求方法" align="center" prop="method" />
      <el-table-column label="显示顺序" align="center" prop="orderNum" />
      <el-table-column label="状态" align="center" prop="status" />
      <el-table-column label="备注" align="center" prop="remark" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['system:statusCtrl:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['system:statusCtrl:remove']"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ·»åŠ æˆ–ä¿®æ”¹ç³»ç»ŸçŠ¶æ€ç›‘æŽ§å¯¹è¯æ¡† -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="名称" prop="sysName">
          <el-input v-model="form.sysName" placeholder="请输入名称" />
        </el-form-item>
        <el-form-item label="IP" prop="ip">
          <el-input v-model="form.ip" placeholder="请输入IP" />
        </el-form-item>
        <el-form-item label="URL" prop="url">
          <el-input v-model="form.url" type="textarea" placeholder="请输入内容" />
        </el-form-item>
        <el-form-item label="请求方法" prop="method">
          <el-input v-model="form.method" placeholder="请输入请求方法" />
        </el-form-item>
        <el-form-item label="显示顺序" prop="orderNum">
          <el-input v-model="form.orderNum" placeholder="请输入显示顺序" />
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listStatusCtrl, getStatusCtrl, delStatusCtrl, addStatusCtrl, updateStatusCtrl } from "@/api/system/statusCtrl";
export default {
  name: "StatusCtrl",
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // ç³»ç»ŸçŠ¶æ€ç›‘æŽ§è¡¨æ ¼æ•°æ®
      statusCtrlList: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        sysName: null,
        ip: null,
        url: null,
        method: null,
        orderNum: null,
        status: null,
      },
      // è¡¨å•参数
      form: {},
      // è¡¨å•校验
      rules: {
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** æŸ¥è¯¢ç³»ç»ŸçŠ¶æ€ç›‘æŽ§åˆ—è¡¨ */
    getList() {
      this.loading = true;
      listStatusCtrl(this.queryParams).then(response => {
        this.statusCtrlList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        statusId: null,
        sysName: null,
        ip: null,
        url: null,
        method: null,
        orderNum: null,
        status: null,
        createBy: null,
        createTime: null,
        updateBy: null,
        updateTime: null,
        remark: null
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.statusId)
      this.single = selection.length!==1
      this.multiple = !selection.length
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加系统状态监控";
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.reset();
      const statusId = row.statusId || this.ids
      getStatusCtrl(statusId).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改系统状态监控";
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.statusId != null) {
            updateStatusCtrl(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addStatusCtrl(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const statusIds = row.statusId || this.ids;
      this.$modal.confirm('是否确认删除系统状态监控编号为"' + statusIds + '"的数据项?').then(function() {
        return delStatusCtrl(statusIds);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.download('system/statusCtrl/export', {
        ...this.queryParams
      }, `statusCtrl_${new Date().getTime()}.xlsx`)
    }
  }
};
</script>
se-ui/src/views/system/taskCtrl/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,319 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="任务ID" prop="prjId">
        <el-input
          v-model="queryParams.prjId"
          placeholder="请输入任务ID"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="任务名称" prop="prjName">
        <el-input
          v-model="queryParams.prjName"
          placeholder="请输入任务名称"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="想定ID" prop="thinkId">
        <el-input
          v-model="queryParams.thinkId"
          placeholder="请输入想定ID"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="想定名称" prop="thinkName">
        <el-input
          v-model="queryParams.thinkName"
          placeholder="请输入想定名称"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="是否保存" prop="isSave">
        <el-input
          v-model="queryParams.isSave"
          placeholder="请输入是否保存"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['system:taskCtrl:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['system:taskCtrl:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          size="mini"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['system:taskCtrl:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          @click="handleExport"
          v-hasPermi="['system:taskCtrl:export']"
        >导出</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="taskCtrlList" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="任务ID" align="center" prop="taskId" />
      <el-table-column label="任务ID" align="center" prop="prjId" />
      <el-table-column label="任务名称" align="center" prop="prjName" />
      <el-table-column label="想定ID" align="center" prop="thinkId" />
      <el-table-column label="想定名称" align="center" prop="thinkName" />
      <el-table-column label="是否保存" align="center" prop="isSave" />
      <el-table-column label="节点" align="center" prop="node" />
      <el-table-column label="状态" align="center" prop="status" />
      <el-table-column label="备注" align="center" prop="remark" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['system:taskCtrl:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['system:taskCtrl:remove']"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ·»åŠ æˆ–ä¿®æ”¹åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶å¯¹è¯æ¡† -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="任务ID" prop="prjId">
          <el-input v-model="form.prjId" placeholder="请输入任务ID" />
        </el-form-item>
        <el-form-item label="任务名称" prop="prjName">
          <el-input v-model="form.prjName" placeholder="请输入任务名称" />
        </el-form-item>
        <el-form-item label="想定ID" prop="thinkId">
          <el-input v-model="form.thinkId" placeholder="请输入想定ID" />
        </el-form-item>
        <el-form-item label="想定名称" prop="thinkName">
          <el-input v-model="form.thinkName" placeholder="请输入想定名称" />
        </el-form-item>
        <el-form-item label="是否保存" prop="isSave">
          <el-input v-model="form.isSave" placeholder="请输入是否保存" />
        </el-form-item>
        <el-form-item label="节点" prop="node">
          <el-input v-model="form.node" type="textarea" placeholder="请输入内容" />
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listTaskCtrl, getTaskCtrl, delTaskCtrl, addTaskCtrl, updateTaskCtrl } from "@/api/system/taskCtrl";
export default {
  name: "TaskCtrl",
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶è¡¨æ ¼æ•°æ®
      taskCtrlList: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        prjId: null,
        prjName: null,
        thinkId: null,
        thinkName: null,
        isSave: null,
        node: null,
        status: null,
      },
      // è¡¨å•参数
      form: {},
      // è¡¨å•校验
      rules: {
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** æŸ¥è¯¢åˆ†ç³»ç»Ÿä»»åŠ¡æŽ§åˆ¶åˆ—è¡¨ */
    getList() {
      this.loading = true;
      listTaskCtrl(this.queryParams).then(response => {
        this.taskCtrlList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        taskId: null,
        prjId: null,
        prjName: null,
        thinkId: null,
        thinkName: null,
        isSave: null,
        node: null,
        status: null,
        createBy: null,
        createTime: null,
        updateBy: null,
        updateTime: null,
        remark: null
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.taskId)
      this.single = selection.length!==1
      this.multiple = !selection.length
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加分系统任务控制";
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.reset();
      const taskId = row.taskId || this.ids
      getTaskCtrl(taskId).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改分系统任务控制";
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.taskId != null) {
            updateTaskCtrl(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addTaskCtrl(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const taskIds = row.taskId || this.ids;
      this.$modal.confirm('是否确认删除分系统任务控制编号为"' + taskIds + '"的数据项?').then(function() {
        return delTaskCtrl(taskIds);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.download('system/taskCtrl/export', {
        ...this.queryParams
      }, `taskCtrl_${new Date().getTime()}.xlsx`)
    }
  }
};
</script>
˵Ã÷.txt
@@ -6,6 +6,19 @@
java è‡ªå®šä¹‰è½¯ä»¶è®¸å¯
https://blog.csdn.net/a1374469523/article/details/138667196
# æ˜ å°„宿主机docker套接字
-v /var/run/docker.sock:/var/run/docker.sock
--------------------------------------------------------
  user_name         varchar(30)     not null                   comment '用户账号',
  nick_name         varchar(30)     not null                   comment '用户姓名',
  dept_id           bigint(20)      default null               comment '部门ID',
  secret_level      varchar(2)      default '1'                comment '密级类型',
  email             varchar(50)     default ''                 comment '用户邮箱',
  phonenumber       varchar(11)     default ''                 comment '手机号码',
  sex               char(1)         default '0'                comment '用户性别(0男 1女 2未知)',
  password          varchar(100)    default ''                 comment '密码',
  ç”¨æˆ·åã€ç”¨æˆ·å¯†ç ã€å¯†çº§ã€ç”³è¯·è§’色、用户姓名,http://localhost:8081/register
--------------------------------------------------------
http://192.168.11.203:8090/sso/login,admin,admin123
http://192.168.11.203:8848/nacos,nAcos_!9#_admIn
@@ -42,10 +55,18 @@
uri: lb://se-job  â†’ uri: lb://se-system
        # docker服务
        - id: se-docker
          uri: lb://se-docker
          predicates:
            - Path=/docker/**
  # ä¸æ ¡éªŒç™½åå•
  ignore:
    whites:
      - /system/index/*
#     - /system/index/*
      - /system/reg/*
      - /system/taskCtrl/*
--------------------------------------------------------
se-system-dev.yml,添加:
@@ -81,4 +102,10 @@
  tablePrefix: sys_
--------------------------------------------------------
repository ç›®å½•下 _remote.respositories,删除。
repository ç›®å½•下 _remote.respositories,删除。
proxy_read_timeout 604800s;
nohup java -jar wgcloud.jar &
top -N 10
ps -ef | grep wgcloud
kill -9 10086