From 46706eb0694327074190b84d72dc90098454cd90 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 28 Jan 2021 01:34:49 +0800 Subject: [PATCH 001/167] =?UTF-8?q?=E5=AE=8C=E6=88=90=20Redis=20=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/api/infra/redis.js | 17 + ruoyi-ui/src/api/monitor/cache.js | 9 - ruoyi-ui/src/utils/dict.js | 2 + .../{monitor/cache => infra/redis}/index.vue | 341 +++++---- sql/ruoyi-vue-pro-data.sql | 29 - sql/ruoyi-vue-pro.sql | 504 ++++++++++--- sql/ry_20201128.sql | 683 ------------------ .../framework/redis/core/RedisKeyDefine.java | 48 +- .../redis/core/RedisKeyRegistry.java | 3 + .../controller/redis/RedisController.java | 39 +- .../redis/vo/InfRedisKeyRespVO.java | 43 +- .../redis/vo/InfRedisMonitorRespVO.java | 12 +- .../infra/convert/redis/RedisConvert.java | 34 + .../system/dal/redis/RedisKeyConstants.java | 20 +- src/main/resources/application.yaml | 4 +- 15 files changed, 737 insertions(+), 1051 deletions(-) create mode 100644 ruoyi-ui/src/api/infra/redis.js delete mode 100644 ruoyi-ui/src/api/monitor/cache.js rename ruoyi-ui/src/views/{monitor/cache => infra/redis}/index.vue (80%) delete mode 100644 sql/ruoyi-vue-pro-data.sql delete mode 100644 sql/ry_20201128.sql create mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java diff --git a/ruoyi-ui/src/api/infra/redis.js b/ruoyi-ui/src/api/infra/redis.js new file mode 100644 index 000000000..12ce00430 --- /dev/null +++ b/ruoyi-ui/src/api/infra/redis.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +// 查询缓存详细 +export function getCache() { + return request({ + url: '/infra/redis/get-monitor-info', + method: 'get' + }) +} + +// TODO +export function getKeyList() { + return request({ + url: '/infra/redis/get-key-list', + method: 'get' + }) +} diff --git a/ruoyi-ui/src/api/monitor/cache.js b/ruoyi-ui/src/api/monitor/cache.js deleted file mode 100644 index 2ffaf7a3f..000000000 --- a/ruoyi-ui/src/api/monitor/cache.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -// 查询缓存详细 -export function getCache() { - return request({ - url: '/monitor/cache', - method: 'get' - }) -} diff --git a/ruoyi-ui/src/utils/dict.js b/ruoyi-ui/src/utils/dict.js index 6e8a8d3ba..538c7a457 100644 --- a/ruoyi-ui/src/utils/dict.js +++ b/ruoyi-ui/src/utils/dict.js @@ -15,6 +15,8 @@ export const DICT_TYPE = { SYS_OPERATE_TYPE: 'sys_operate_type', SYS_LOGIN_RESULT: 'sys_login_result', SYS_CONFIG_TYPE: 'sys_config_type', + + INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type' } /** diff --git a/ruoyi-ui/src/views/monitor/cache/index.vue b/ruoyi-ui/src/views/infra/redis/index.vue similarity index 80% rename from ruoyi-ui/src/views/monitor/cache/index.vue rename to ruoyi-ui/src/views/infra/redis/index.vue index 98eed22ec..fa0cc40fa 100644 --- a/ruoyi-ui/src/views/monitor/cache/index.vue +++ b/ruoyi-ui/src/views/infra/redis/index.vue @@ -1,153 +1,188 @@ - - - + + + diff --git a/sql/ruoyi-vue-pro-data.sql b/sql/ruoyi-vue-pro-data.sql deleted file mode 100644 index a1ee1b82a..000000000 --- a/sql/ruoyi-vue-pro-data.sql +++ /dev/null @@ -1,29 +0,0 @@ -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (1, 1, '男', '1', 'sys_user_sex', 0, '性别男', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:53', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (2, 2, '女', '2', 'sys_user_sex', 0, '性别女', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:55', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (8, 1, '正常', '0', 'sys_job_status', 0, '正常状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (9, 2, '暂停', '1', 'sys_job_status', 0, '停用状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', 0, '默认分组', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', 0, '系统分组', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (12, 1, '是', 'Y', 'sys_yes_no', 0, '系统默认是', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (13, 2, '否', 'N', 'sys_yes_no', 0, '系统默认否', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (14, 1, '通知', '1', 'sys_notice_type', 0, '通知', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (15, 2, '公告', '2', 'sys_notice_type', 0, '公告', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (16, 0, '其它', '0', 'sys_operate_type', 0, '其它操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:12', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (17, 1, '查询', '1', 'sys_operate_type', 0, '查询操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:10', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (18, 2, '新增', '2', 'sys_operate_type', 0, '新增操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:17', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (19, 3, '修改', '3', 'sys_operate_type', 0, '修改操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:20', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (20, 4, '删除', '4', 'sys_operate_type', 0, '删除操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:24', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (22, 5, '导出', '5', 'sys_operate_type', 0, '导出操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:20', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (23, 6, '导入', '6', 'sys_operate_type', 0, '导入操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:24', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (27, 1, '开启', '0', 'sys_common_status', 0, '开启状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 02:57:12', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (28, 2, '关闭', '1', 'sys_common_status', 0, '关闭状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:32', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (29, 1, '目录', '1', 'sys_menu_type', 0, '目录', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:30', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (30, 2, '菜单', '2', 'sys_menu_type', 0, '菜单', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:35', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (31, 3, '按钮', '3', 'sys_menu_type', 0, '按钮', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:38', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (32, 1, '内置', '1', 'sys_role_type', 0, '内置角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:22', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (33, 2, '自定义', '2', 'sys_role_type', 0, '自定义角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:26', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (34, 1, '全部数据权限', '1', 'sys_data_scope', 0, '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:02', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (35, 2, '指定部门数据权限', '2', 'sys_data_scope', 0, '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:20', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (36, 3, '本部门数据权限', '3', 'sys_data_scope', 0, '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:29', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (37, 4, '本部门及以下数据权限', '4', 'sys_data_scope', 0, '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:32', b'0'); -INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (38, 5, '仅本人数据权限', '5', 'sys_data_scope', 0, '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:38', b'0'); diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index af7f492f9..c91c40f55 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -11,7 +11,7 @@ Target Server Version : 50718 File Encoding : 65001 - Date: 22/01/2021 01:31:59 + Date: 28/01/2021 01:32:22 */ SET NAMES utf8mb4; @@ -85,6 +85,74 @@ CREATE TABLE `gen_table_column` ( BEGIN; COMMIT; +-- ---------------------------- +-- Table structure for gen_table_column_copy1 +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column_copy1`; +CREATE TABLE `gen_table_column_copy1` ( + `column_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` varchar(64) DEFAULT NULL COMMENT '归属表编号', + `column_name` varchar(200) DEFAULT NULL COMMENT '列名称', + `column_comment` varchar(500) DEFAULT NULL COMMENT '列描述', + `column_type` varchar(100) DEFAULT NULL COMMENT '列类型', + `java_type` varchar(500) DEFAULT NULL COMMENT 'JAVA类型', + `java_field` varchar(200) DEFAULT NULL COMMENT 'JAVA字段名', + `is_pk` char(1) DEFAULT NULL COMMENT '是否主键(1是)', + `is_increment` char(1) DEFAULT NULL COMMENT '是否自增(1是)', + `is_required` char(1) DEFAULT NULL COMMENT '是否必填(1是)', + `is_insert` char(1) DEFAULT NULL COMMENT '是否为插入字段(1是)', + `is_edit` char(1) DEFAULT NULL COMMENT '是否编辑字段(1是)', + `is_list` char(1) DEFAULT NULL COMMENT '是否列表字段(1是)', + `is_query` char(1) DEFAULT NULL COMMENT '是否查询字段(1是)', + `query_type` varchar(200) DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', + `html_type` varchar(200) DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `dict_type` varchar(200) DEFAULT '' COMMENT '字典类型', + `sort` int(11) DEFAULT NULL COMMENT '排序', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`column_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表字段'; + +-- ---------------------------- +-- Records of gen_table_column_copy1 +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for gen_table_copy1 +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_copy1`; +CREATE TABLE `gen_table_copy1` ( + `table_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_name` varchar(200) DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) DEFAULT '' COMMENT '表描述', + `class_name` varchar(100) DEFAULT '' COMMENT '实体类名称', + `tpl_category` varchar(200) DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', + `package_name` varchar(100) DEFAULT NULL COMMENT '生成包路径', + `module_name` varchar(30) DEFAULT NULL COMMENT '生成模块名', + `business_name` varchar(30) DEFAULT NULL COMMENT '生成业务名', + `function_name` varchar(50) DEFAULT NULL COMMENT '生成功能名', + `function_author` varchar(50) DEFAULT NULL COMMENT '生成功能作者', + `gen_type` char(1) DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', + `gen_path` varchar(200) DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', + `options` varchar(1000) DEFAULT NULL COMMENT '其它生成选项', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`table_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表'; + +-- ---------------------------- +-- Records of gen_table_copy1 +-- ---------------------------- +BEGIN; +COMMIT; + -- ---------------------------- -- Table structure for inf_config -- ---------------------------- @@ -111,11 +179,42 @@ CREATE TABLE `inf_config` ( -- ---------------------------- BEGIN; INSERT INTO `inf_config` VALUES (1, 'ui', 1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', b'0', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `inf_config` VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', b'1', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:02', b'0'); +INSERT INTO `inf_config` VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '', '2021-01-21 02:13:02', b'0'); INSERT INTO `inf_config` VALUES (3, 'ui', 1, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', b'0', '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', b'0'); INSERT INTO `inf_config` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0'); COMMIT; +-- ---------------------------- +-- Table structure for inf_config_copy1 +-- ---------------------------- +DROP TABLE IF EXISTS `inf_config_copy1`; +CREATE TABLE `inf_config_copy1` ( + `id` int(5) NOT NULL AUTO_INCREMENT COMMENT '参数主键', + `group` varchar(50) NOT NULL COMMENT '参数分组', + `type` tinyint(4) NOT NULL COMMENT '参数类型', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '参数名称', + `key` varchar(100) NOT NULL DEFAULT '' COMMENT '参数键名', + `value` varchar(500) NOT NULL DEFAULT '' COMMENT '参数键值', + `sensitive` bit(1) NOT NULL COMMENT '是否敏感', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='参数配置表'; + +-- ---------------------------- +-- Records of inf_config_copy1 +-- ---------------------------- +BEGIN; +INSERT INTO `inf_config_copy1` VALUES (1, 'ui', 1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', b'0', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); +INSERT INTO `inf_config_copy1` VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '', '2021-01-21 02:13:02', b'0'); +INSERT INTO `inf_config_copy1` VALUES (3, 'ui', 1, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', b'0', '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', b'0'); +INSERT INTO `inf_config_copy1` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0'); +COMMIT; + -- ---------------------------- -- Table structure for sys_dept -- ---------------------------- @@ -153,6 +252,43 @@ INSERT INTO `sys_dept` VALUES (108, '市场部门', 102, 1, '若依', '158888888 INSERT INTO `sys_dept` VALUES (109, '财务部门', 102, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); COMMIT; +-- ---------------------------- +-- Table structure for sys_dept_copy1 +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dept_copy1`; +CREATE TABLE `sys_dept_copy1` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id', + `name` varchar(30) NOT NULL DEFAULT '' COMMENT '部门名称', + `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父部门id', + `sort` int(4) NOT NULL DEFAULT '0' COMMENT '显示顺序', + `leader` varchar(20) DEFAULT NULL COMMENT '负责人', + `phone` varchar(11) DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) DEFAULT NULL COMMENT '邮箱', + `status` tinyint(4) NOT NULL COMMENT '部门状态(0正常 1停用)', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8mb4 COMMENT='部门表'; + +-- ---------------------------- +-- Records of sys_dept_copy1 +-- ---------------------------- +BEGIN; +INSERT INTO `sys_dept_copy1` VALUES (100, '芋道源码', 0, 0, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-06 19:45:52', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (101, '深圳总公司', 100, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (102, '长沙分公司', 100, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (103, '研发部门', 101, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (104, '市场部门', 101, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (105, '测试部门', 101, 3, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (106, '财务部门', 101, 4, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (107, '运维部门', 101, 5, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (108, '市场部门', 102, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +INSERT INTO `sys_dept_copy1` VALUES (109, '财务部门', 102, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); +COMMIT; + -- ---------------------------- -- Table structure for sys_dict_data -- ---------------------------- @@ -171,7 +307,7 @@ CREATE TABLE `sys_dict_data` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表'; +) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表'; -- ---------------------------- -- Records of sys_dict_data @@ -214,6 +350,75 @@ INSERT INTO `sys_dict_data` VALUES (43, 31, '验证码不正确', '31', 'sys_log INSERT INTO `sys_dict_data` VALUES (44, 100, '未知异常', '100', 'sys_login_result', 0, '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:57', b'0'); INSERT INTO `sys_dict_data` VALUES (45, 1, '是', 'true', 'sys_boolean_string', 0, 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '', '2021-01-19 03:21:08', b'0'); INSERT INTO `sys_dict_data` VALUES (46, 1, '否', 'false', 'sys_boolean_string', 0, 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '', '2021-01-19 03:21:39', b'0'); +INSERT INTO `sys_dict_data` VALUES (47, 1, '永不超时', '1', 'inf_redis_timeout_type', 0, 'Redis 未设置超时的情况', '', '2021-01-26 00:53:17', '', '2021-01-26 00:53:17', b'0'); +INSERT INTO `sys_dict_data` VALUES (48, 1, '动态超时', '2', 'inf_redis_timeout_type', 0, '程序里动态传入超时时间,无法固定', '', '2021-01-26 00:55:00', '', '2021-01-26 00:55:00', b'0'); +INSERT INTO `sys_dict_data` VALUES (49, 3, '固定超时', '3', 'inf_redis_timeout_type', 0, 'Redis 设置了过期时间', '', '2021-01-26 00:55:26', '', '2021-01-26 00:55:26', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_dict_data_copy1 +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_data_copy1`; +CREATE TABLE `sys_dict_data_copy1` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典编码', + `sort` int(4) NOT NULL DEFAULT '0' COMMENT '字典排序', + `label` varchar(100) NOT NULL DEFAULT '' COMMENT '字典标签', + `value` varchar(100) NOT NULL DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) NOT NULL DEFAULT '' COMMENT '字典类型', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表'; + +-- ---------------------------- +-- Records of sys_dict_data_copy1 +-- ---------------------------- +BEGIN; +INSERT INTO `sys_dict_data_copy1` VALUES (1, 1, '男', '1', 'sys_user_sex', 0, '性别男', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:53', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (2, 2, '女', '2', 'sys_user_sex', 0, '性别女', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:55', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (8, 1, '正常', '0', 'sys_job_status', 0, '正常状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (9, 2, '暂停', '1', 'sys_job_status', 0, '停用状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', 0, '默认分组', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', 0, '系统分组', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (12, 1, '系统内置', '1', 'sys_config_type', 0, '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:59', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (13, 2, '自定义', '2', 'sys_config_type', 0, '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:51', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (14, 1, '通知', '1', 'sys_notice_type', 0, '通知', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (15, 2, '公告', '2', 'sys_notice_type', 0, '公告', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (16, 0, '其它', '0', 'sys_operate_type', 0, '其它操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:12', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (17, 1, '查询', '1', 'sys_operate_type', 0, '查询操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:10', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (18, 2, '新增', '2', 'sys_operate_type', 0, '新增操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:17', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (19, 3, '修改', '3', 'sys_operate_type', 0, '修改操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:20', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (20, 4, '删除', '4', 'sys_operate_type', 0, '删除操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:24', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (22, 5, '导出', '5', 'sys_operate_type', 0, '导出操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:20', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (23, 6, '导入', '6', 'sys_operate_type', 0, '导入操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:24', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (27, 1, '开启', '0', 'sys_common_status', 0, '开启状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 02:57:12', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (28, 2, '关闭', '1', 'sys_common_status', 0, '关闭状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:32', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (29, 1, '目录', '1', 'sys_menu_type', 0, '目录', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:30', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (30, 2, '菜单', '2', 'sys_menu_type', 0, '菜单', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:35', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (31, 3, '按钮', '3', 'sys_menu_type', 0, '按钮', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:38', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (32, 1, '内置', '1', 'sys_role_type', 0, '内置角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:22', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (33, 2, '自定义', '2', 'sys_role_type', 0, '自定义角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:26', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (34, 1, '全部数据权限', '1', 'sys_data_scope', 0, '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:02', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (35, 2, '指定部门数据权限', '2', 'sys_data_scope', 0, '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:20', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (36, 3, '本部门数据权限', '3', 'sys_data_scope', 0, '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:29', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (37, 4, '本部门及以下数据权限', '4', 'sys_data_scope', 0, '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:32', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (38, 5, '仅本人数据权限', '5', 'sys_data_scope', 0, '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:38', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (39, 0, '成功', '0', 'sys_login_result', 0, '登陆结果 - 成功', '', '2021-01-18 06:17:36', '', '2021-01-18 06:17:36', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (40, 10, '账号或密码不正确', '10', 'sys_login_result', 0, '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '', '2021-01-18 06:17:54', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (41, 20, '用户被禁用', '20', 'sys_login_result', 0, '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:02', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (42, 30, '验证码不存在', '30', 'sys_login_result', 0, '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:24', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (43, 31, '验证码不正确', '31', 'sys_login_result', 0, '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:33', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (44, 100, '未知异常', '100', 'sys_login_result', 0, '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:57', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (45, 1, '是', 'true', 'sys_boolean_string', 0, 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '', '2021-01-19 03:21:08', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (46, 1, '否', 'false', 'sys_boolean_string', 0, 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '', '2021-01-19 03:21:39', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (47, 1, '永不超时', '1', 'inf_redis_timeout_type', 0, 'Redis 未设置超时的情况', '', '2021-01-26 00:53:17', '', '2021-01-26 00:53:17', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (48, 1, '动态超时', '2', 'inf_redis_timeout_type', 0, '程序里动态传入超时时间,无法固定', '', '2021-01-26 00:55:00', '', '2021-01-26 00:55:00', b'0'); +INSERT INTO `sys_dict_data_copy1` VALUES (49, 3, '固定超时', '3', 'inf_redis_timeout_type', 0, 'Redis 设置了过期时间', '', '2021-01-26 00:55:26', '', '2021-01-26 00:55:26', b'0'); COMMIT; -- ---------------------------- @@ -233,7 +438,7 @@ CREATE TABLE `sys_dict_type` ( `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `dict_type` (`dict_type`) -) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表'; +) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表'; -- ---------------------------- -- Records of sys_dict_type @@ -250,6 +455,44 @@ INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', 0, NULL, INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); INSERT INTO `sys_dict_type` VALUES (11, 'Boolean 是否类型', 'sys_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2021-01-19 03:20:08', b'0'); INSERT INTO `sys_dict_type` VALUES (104, '登陆结果', 'sys_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2021-01-18 06:17:11', b'0'); +INSERT INTO `sys_dict_type` VALUES (105, 'Redis 超时类型', 'inf_redis_timeout_type', 0, 'RedisKeyDefine.TimeoutTypeEnum', '', '2021-01-26 00:52:50', '', '2021-01-26 00:52:50', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for sys_dict_type_copy1 +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_type_copy1`; +CREATE TABLE `sys_dict_type_copy1` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典主键', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) NOT NULL DEFAULT '' COMMENT '字典类型', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `dict_type` (`dict_type`) +) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表'; + +-- ---------------------------- +-- Records of sys_dict_type_copy1 +-- ---------------------------- +BEGIN; +INSERT INTO `sys_dict_type_copy1` VALUES (1, '用户性别', 'sys_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (3, '系统开关', 'sys_normal_disable', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-07 19:47:48', b'1'); +INSERT INTO `sys_dict_type_copy1` VALUES (4, '任务状态', 'sys_job_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (5, '任务分组', 'sys_job_group', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (6, '参数类型', 'sys_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:04', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (7, '通知类型', 'sys_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (8, '通知状态', 'sys_notice_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (9, '操作类型', 'sys_oper_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (10, '系统状态', 'sys_common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (11, 'Boolean 是否类型', 'sys_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2021-01-19 03:20:08', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (104, '登陆结果', 'sys_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2021-01-18 06:17:11', b'0'); +INSERT INTO `sys_dict_type_copy1` VALUES (105, 'Redis 超时类型', 'inf_redis_timeout_type', 0, 'RedisKeyDefine.TimeoutTypeEnum', '', '2021-01-26 00:52:50', '', '2021-01-26 00:52:50', b'0'); COMMIT; -- ---------------------------- @@ -344,7 +587,7 @@ CREATE TABLE `sys_login_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; -- ---------------------------- -- Records of sys_login_log @@ -362,6 +605,26 @@ INSERT INTO `sys_login_log` VALUES (9, 1, '6e7e7bf7-e1fe-401e-bc1a-1aa5057a5bb4' INSERT INTO `sys_login_log` VALUES (10, 1, '2af83bf4-1c84-462c-ae5c-d0b4565fe9e4', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-20 11:17:27', '', '2021-01-20 11:17:27', b'0'); INSERT INTO `sys_login_log` VALUES (11, 1, '23a4f5c4-1edc-4fbe-8254-f52ce8d247c8', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-20 13:37:23', '', '2021-01-20 13:37:23', b'0'); INSERT INTO `sys_login_log` VALUES (12, 1, 'a0260b40-e81f-4eac-9fd7-350883f9ed72', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-20 14:10:55', '', '2021-01-20 14:10:55', b'0'); +INSERT INTO `sys_login_log` VALUES (13, 1, 'c6ed4c50-933d-498f-8b5d-d68a93b88a2f', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-20 17:10:19', '', '2021-01-20 17:10:19', b'0'); +INSERT INTO `sys_login_log` VALUES (14, 1, '17622ede-63e3-4b67-aea0-b525248f709d', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-20 21:41:37', '', '2021-01-20 21:41:37', b'0'); +INSERT INTO `sys_login_log` VALUES (15, 1, 'dbe5faa4-c0e0-420d-b7ab-2eb943fbe1a4', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-20 23:36:39', '', '2021-01-20 23:36:39', b'0'); +INSERT INTO `sys_login_log` VALUES (16, 1, '0801b6de-9406-4acf-8dbf-b797448e0006', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-21 00:37:03', '', '2021-01-21 00:37:03', b'0'); +INSERT INTO `sys_login_log` VALUES (17, 1, 'c52b9ef0-9054-4733-845a-b5b094dee5e3', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-21 01:18:25', '', '2021-01-21 01:18:25', b'0'); +INSERT INTO `sys_login_log` VALUES (18, 1, 'bfda0442-06f9-45f6-91f3-7285aeee1063', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-21 02:10:57', '', '2021-01-21 02:10:57', b'0'); +INSERT INTO `sys_login_log` VALUES (19, 1, '6caf92e4-2b84-4185-b661-c944ce5eb05d', 'test', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-21 02:25:38', '', '2021-01-21 02:25:38', b'0'); +INSERT INTO `sys_login_log` VALUES (20, 1, 'd9659885-0bfd-4662-8656-afcdeb1983ff', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-21 03:02:57', '', '2021-01-21 03:02:57', b'0'); +INSERT INTO `sys_login_log` VALUES (21, 1, '02dd6057-c59f-4c1e-a234-969449f99bcc', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-21 04:56:22', '', '2021-01-21 04:56:22', b'0'); +INSERT INTO `sys_login_log` VALUES (22, 1, '69c26040-e9f4-45fa-98f9-a2391625f48f', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', '', '2021-01-21 06:17:16', '', '2021-01-21 06:17:16', b'0'); +INSERT INTO `sys_login_log` VALUES (23, 1, '13814413-8a87-4fbf-9474-3225b033ff44', 'admin', 30, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 08:30:51', '', '2021-01-21 08:30:51', b'0'); +INSERT INTO `sys_login_log` VALUES (24, 1, '6d84218d-90e9-40fa-acad-e9173813a26f', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 08:30:51', '', '2021-01-21 08:30:51', b'0'); +INSERT INTO `sys_login_log` VALUES (25, 1, '85c2a039-0e6a-47bb-bdd8-72acac8b28e2', 'admin', 31, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 08:30:59', '', '2021-01-21 08:30:59', b'0'); +INSERT INTO `sys_login_log` VALUES (26, 1, 'f44852b5-091b-4a4c-b9f7-99d4f9850cb5', 'admin', 31, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 08:31:05', '', '2021-01-21 08:31:05', b'0'); +INSERT INTO `sys_login_log` VALUES (27, 1, '9830c3ea-9530-45af-b284-c6f8a5c6228d', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 08:31:22', '', '2021-01-21 08:31:22', b'0'); +INSERT INTO `sys_login_log` VALUES (28, 1, '98eae309-5661-4de5-b6fa-60ab609b4549', 'admin', 31, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 09:57:09', '', '2021-01-21 09:57:09', b'0'); +INSERT INTO `sys_login_log` VALUES (29, 1, 'ad9e244f-4c88-4762-b280-2d46d16081ac', 'admin', 31, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 09:57:15', '', '2021-01-21 09:57:15', b'0'); +INSERT INTO `sys_login_log` VALUES (30, 1, '5032fac5-c6dc-41e4-882b-2dbea01ef1f6', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 09:57:18', '', '2021-01-21 09:57:18', b'0'); +INSERT INTO `sys_login_log` VALUES (31, 1, '802ca4eb-ac96-4c6b-91de-0e445dc46e78', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-25 21:29:41', '', '2021-01-25 21:29:41', b'0'); +INSERT INTO `sys_login_log` VALUES (32, 1, '3aeafd34-af33-4329-8b47-8972ecc72635', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-25 23:59:57', '', '2021-01-25 23:59:57', b'0'); COMMIT; -- ---------------------------- @@ -385,7 +648,7 @@ CREATE TABLE `sys_menu` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1066 DEFAULT CHARSET=utf8mb4 COMMENT='菜单权限表'; +) ENGINE=InnoDB AUTO_INCREMENT=1068 DEFAULT CHARSET=utf8mb4 COMMENT='菜单权限表'; -- ---------------------------- -- Records of sys_menu @@ -394,7 +657,7 @@ BEGIN; INSERT INTO `sys_menu` VALUES (1, '系统管理', '', 1, 1, 0, '/system', 'system', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:34:28', b'0'); INSERT INTO `sys_menu` VALUES (2, '基础设施', '', 1, 2, 0, '/infra', 'monitor', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:18:35', b'0'); INSERT INTO `sys_menu` VALUES (3, '系统工具', '', 1, 3, 0, '/tool', 'tool', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:34:28', b'0'); -INSERT INTO `sys_menu` VALUES (4, '若依官网', '', 1, 4, 0, 'http://ruoyi.vip', 'guide', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:34:28', b'0'); +INSERT INTO `sys_menu` VALUES (4, '若依官网', '', 1, 4, 0, 'http://ruoyi.vip', 'guide', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 21:54:28', b'1'); INSERT INTO `sys_menu` VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (101, '角色管理', 'system:role:list', 2, 2, 1, 'role', 'peoples', 'system/role/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (102, '菜单管理', 'system:menu:list', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); @@ -407,8 +670,8 @@ INSERT INTO `sys_menu` VALUES (108, '日志管理', '', 1, 9, 1, 'log', 'log', ' INSERT INTO `sys_menu` VALUES (109, '在线用户', 'monitor:online:list', 2, 1, 2, 'online', 'online', 'monitor/online/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (110, '定时任务', 'monitor:job:list', 2, 2, 2, 'job', 'job', 'monitor/job/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (111, '数据监控', 'monitor:druid:list', 2, 3, 2, 'druid', 'druid', 'monitor/druid/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); -INSERT INTO `sys_menu` VALUES (112, '服务监控', 'monitor:server:list', 2, 4, 2, 'server', 'server', 'monitor/server/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); -INSERT INTO `sys_menu` VALUES (113, '缓存监控', 'monitor:cache:list', 2, 5, 2, 'cache', 'redis', 'monitor/cache/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); +INSERT INTO `sys_menu` VALUES (112, '服务监控', 'monitor:server:list', 2, 4, 2, 'http://127.0.0.1:8080/admin', 'server', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-21 04:58:59', b'0'); +INSERT INTO `sys_menu` VALUES (113, 'Redis 监控', '', 2, 5, 2, 'redis', 'redis', 'infra/redis/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 00:56:30', b'0'); INSERT INTO `sys_menu` VALUES (114, '表单构建', 'tool:build:list', 2, 1, 3, 'build', 'build', 'tool/build/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (115, '代码生成', 'tool:gen:list', 2, 2, 3, 'gen', 'code', 'tool/gen/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (116, '系统接口', 'tool:swagger:list', 2, 3, 3, 'swagger', 'swagger', 'tool/swagger/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); @@ -469,12 +732,14 @@ INSERT INTO `sys_menu` VALUES (1054, '任务导出', 'monitor:job:export', 3, 7, INSERT INTO `sys_menu` VALUES (1055, '生成查询', 'tool:gen:query', 3, 1, 115, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); INSERT INTO `sys_menu` VALUES (1056, '生成修改', 'tool:gen:edit', 3, 2, 115, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); INSERT INTO `sys_menu` VALUES (1057, '生成删除', 'tool:gen:remove', 3, 3, 115, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); -INSERT INTO `sys_menu` VALUES (1058, '导入代码', 'tool:gen:import', 3, 2, 115, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); +INSERT INTO `sys_menu` VALUES (1058, '导入代码', 'tool:gen:import', 3, 2, 115, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 16:55:13', b'0'); INSERT INTO `sys_menu` VALUES (1059, '预览代码', 'tool:gen:preview', 3, 4, 115, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); -INSERT INTO `sys_menu` VALUES (1060, '生成代码', 'tool:gen:code', 3, 5, 115, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); +INSERT INTO `sys_menu` VALUES (1060, '生成代码', 'tool:gen:code', 3, 5, 115, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 16:54:18', b'0'); INSERT INTO `sys_menu` VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', 0, '', '2021-01-06 17:53:44', '', '2021-01-06 17:55:23', b'0'); INSERT INTO `sys_menu` VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', 0, '', '2021-01-06 17:56:31', '', '2021-01-06 17:56:31', b'0'); INSERT INTO `sys_menu` VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', 0, '', '2021-01-07 10:23:28', '', '2021-01-07 10:23:28', b'0'); +INSERT INTO `sys_menu` VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', 0, '', '2021-01-26 01:02:31', '', '2021-01-26 01:02:31', b'0'); +INSERT INTO `sys_menu` VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', 0, '', '2021-01-26 01:02:52', '', '2021-01-26 01:02:52', b'0'); COMMIT; -- ---------------------------- @@ -534,7 +799,7 @@ CREATE TABLE `sys_operate_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; +) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; -- ---------------------------- -- Records of sys_operate_log @@ -568,6 +833,59 @@ INSERT INTO `sys_operate_log` VALUES (28, '866a915b-e60e-4ed6-a60c-ffee9d0d9fa4' INSERT INTO `sys_operate_log` VALUES (29, '6b812f9a-6b56-4965-9592-33e6bcfb789a', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"\",\"icon\":\"\",\"id\":1032,\"name\":\"配置新增\",\"parentId\":106,\"path\":\"\",\"permission\":\"infra:config:add\",\"sort\":\"2\",\"type\":3}}', '2021-01-22 01:28:32', 14, 0, '', 'true', '', '2021-01-20 14:34:05', '', '2021-01-20 14:34:05', b'0'); INSERT INTO `sys_operate_log` VALUES (30, '3d6b8177-66b9-480f-bbba-90733b15219d', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"\",\"icon\":\"#\",\"id\":1034,\"name\":\"配置删除\",\"parentId\":106,\"path\":\"#\",\"permission\":\"infra:config:remove\",\"sort\":\"4\",\"type\":3}}', '2021-01-22 01:28:39', 14, 0, '', 'true', '', '2021-01-20 14:34:13', '', '2021-01-20 14:34:13', b'0'); INSERT INTO `sys_operate_log` VALUES (31, 'b937aa5e-b18a-4dd3-a931-70302fe8c0be', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"\",\"icon\":\"#\",\"id\":1035,\"name\":\"配置导出\",\"parentId\":106,\"path\":\"#\",\"permission\":\"infra:config:export\",\"sort\":\"5\",\"type\":3}}', '2021-01-22 01:28:46', 13, 0, '', 'true', '', '2021-01-20 14:34:19', '', '2021-01-20 14:34:19', b'0'); +INSERT INTO `sys_operate_log` VALUES (32, '308cd0ba-ee57-439f-b1cd-d168ce97672c', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 20:50:59', 32, 0, '', 'true', '', '2021-01-20 17:10:54', '', '2021-01-20 17:10:54', b'0'); +INSERT INTO `sys_operate_log` VALUES (33, '90bc8b4b-a2dc-484c-b6bc-dab700f600e4', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/swagger/index\",\"icon\":\"swagger\",\"id\":116,\"name\":\"系统接口\",\"parentId\":3,\"path\":\"swagger\",\"permission\":\"tool:swagger:list\",\"sort\":\"3\",\"type\":2}}', '2021-01-22 20:51:15', 5588, 0, '', 'true', '', '2021-01-20 17:11:16', '', '2021-01-20 17:11:16', b'0'); +INSERT INTO `sys_operate_log` VALUES (34, '787f584d-5675-422c-b1b9-a0fcf63e9369', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:03:48', 2512, 0, '', 'true', '', '2021-01-20 17:23:46', '', '2021-01-20 17:23:46', b'0'); +INSERT INTO `sys_operate_log` VALUES (35, '8593c50c-4d50-48e6-a3b1-917b83ec6972', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:14:35', 187876, 0, '', 'true', '', '2021-01-20 17:37:39', '', '2021-01-20 17:37:39', b'0'); +INSERT INTO `sys_operate_log` VALUES (36, 'a5b07322-a990-47ef-a227-9af6e4bc8315', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:19:42', 74, 0, '', 'true', '', '2021-01-20 17:39:39', '', '2021-01-20 17:39:39', b'0'); +INSERT INTO `sys_operate_log` VALUES (37, '02c9934e-cfba-4455-9d55-7a0600ef02ff', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:19:56', 21, 0, '', 'true', '', '2021-01-20 17:40:57', '', '2021-01-20 17:40:57', b'0'); +INSERT INTO `sys_operate_log` VALUES (38, 'c4b27f76-dd8d-4da8-a10c-46f11fe1d31f', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:21:06', 17, 0, '', 'true', '', '2021-01-20 17:41:16', '', '2021-01-20 17:41:16', b'0'); +INSERT INTO `sys_operate_log` VALUES (39, '0313045c-4782-4748-9085-910cf58a797e', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:21:21', 13, 0, '', 'true', '', '2021-01-20 17:42:23', '', '2021-01-20 17:42:23', b'0'); +INSERT INTO `sys_operate_log` VALUES (40, '29baeaf1-4442-47c5-bd6d-8f8ed7b196df', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:42:04', 4138, 0, '', 'true', '', '2021-01-20 18:02:07', '', '2021-01-20 18:02:07', b'0'); +INSERT INTO `sys_operate_log` VALUES (41, 'b3c84534-96aa-4e1b-9a25-5187fa9457c8', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:44:09', 49, 0, '', 'true', '', '2021-01-20 18:04:08', '', '2021-01-20 18:04:08', b'0'); +INSERT INTO `sys_operate_log` VALUES (42, '91b5c5a5-9f27-482e-8d01-60cdb17e38fd', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"tool/build/index\",\"icon\":\"build\",\"id\":114,\"name\":\"表单构建\",\"parentId\":3,\"path\":\"build\",\"permission\":\"tool:build:list\",\"sort\":\"1\",\"type\":2}}', '2021-01-22 21:47:16', 60, 0, '', 'true', '', '2021-01-20 18:07:14', '', '2021-01-20 18:07:14', b'0'); +INSERT INTO `sys_operate_log` VALUES (43, '7d4c2903-4d40-44fb-9f09-3201a016a90d', 1, '字典数据 API', '修改字典数据', 2, '', '', 'POST', '/api/system/dict-data/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dict.SysDictDataController.updateDictData(SysDictDataUpdateReqVO)', '{\"reqVO\":{\"dictType\":\"sys_user_sex\",\"id\":1,\"label\":\"男\",\"remark\":\"性别男\",\"sort\":\"1\",\"status\":0,\"value\":\"1\"}}', '2021-01-23 10:50:51', 27, 0, '', 'true', '', '2021-01-20 21:41:59', '', '2021-01-20 21:41:59', b'0'); +INSERT INTO `sys_operate_log` VALUES (44, 'de4ddd97-85e1-4cb2-9167-84256e9c743e', 1, '字典数据 API', '修改字典数据', 2, '', '', 'POST', '/api/system/dict-data/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dict.SysDictDataController.updateDictData(SysDictDataUpdateReqVO)', '{\"reqVO\":{\"dictType\":\"sys_user_sex\",\"id\":1,\"label\":\"男\",\"remark\":\"性别男\",\"sort\":\"1\",\"status\":0,\"value\":\"1\"}}', '2021-01-23 10:53:52', 60816, 0, '', 'true', '', '2021-01-20 21:46:01', '', '2021-01-20 21:46:01', b'0'); +INSERT INTO `sys_operate_log` VALUES (45, 'bd8c93f1-0a83-4e73-8c57-efb651aad67d', 1, '菜单 API', '删除菜单', 2, '', '', 'POST', '/api/system/menu/delete', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.deleteMenu(Long)', '{\"id\":4}', '2021-01-23 11:03:18', 4581, 0, '', 'true', '', '2021-01-20 21:54:32', '', '2021-01-20 21:54:32', b'0'); +INSERT INTO `sys_operate_log` VALUES (46, '5e30d224-c026-4a05-82a3-0069601f4326', 1, '部门 API', '修改部门', 2, '', '', 'POST', '/api/system/dept/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dept.SysDeptController.updateDept(SysDeptUpdateReqVO)', '{\"reqVO\":{\"email\":\"ry@qq.com\",\"id\":108,\"leader\":\"若依\",\"name\":\"市场部门\",\"parentId\":102,\"phone\":\"15888888888\",\"sort\":\"1\",\"status\":0}}', '2021-01-23 11:26:21', 34, 0, '', 'true', '', '2021-01-20 22:17:32', '', '2021-01-20 22:17:32', b'0'); +INSERT INTO `sys_operate_log` VALUES (47, '766b8aa6-9414-478a-8179-ee990be2aa73', 1, '部门 API', '修改部门', 2, '', '', 'POST', '/api/system/dept/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dept.SysDeptController.updateDept(SysDeptUpdateReqVO)', '{\"reqVO\":{\"email\":\"ry@qq.com\",\"id\":109,\"leader\":\"若依\",\"name\":\"财务部门\",\"parentId\":102,\"phone\":\"15888888888\",\"sort\":\"2\",\"status\":0}}', '2021-01-23 11:28:30', 5086, 0, '', 'true', '', '2021-01-20 22:19:46', '', '2021-01-20 22:19:46', b'0'); +INSERT INTO `sys_operate_log` VALUES (48, '3cd76e05-b37b-4d89-bc7d-6252052878d3', 1, '参数配置', '修改参数配置', 3, '', '', 'PUT', '/api/infra/config/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.infra.controller.config.InfConfigController.edit(InfConfigUpdateReqVO)', '{\"reqVO\":{\"group\":\"ui\",\"id\":1,\"name\":\"主框架页-默认皮肤样式名称\",\"remark\":\"蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow\",\"sensitive\":false,\"value\":\"skin-blue\"}}', '2021-01-23 13:23:23', 31, 0, '', 'true', '', '2021-01-20 23:37:02', '', '2021-01-20 23:37:02', b'0'); +INSERT INTO `sys_operate_log` VALUES (49, 'b89748ba-6f98-4abf-b26a-af9e0425f234', 1, '角色 API', '修改角色', 2, '', '', 'POST', '/api/system/role/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysRoleController.update(SysRoleUpdateReqVO)', '{\"reqVO\":{\"code\":\"test\",\"id\":101,\"name\":\"测试账号\",\"remark\":\"132\",\"sort\":\"0\",\"type\":2}}', '2021-01-23 18:16:08', 5314, 0, '', 'true', '', '2021-01-21 00:37:30', '', '2021-01-21 00:37:30', b'0'); +INSERT INTO `sys_operate_log` VALUES (50, '369f88d5-b425-4918-b994-2a893165c704', 1, '角色 API', '修改角色', 2, '', '', 'POST', '/api/system/role/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysRoleController.update(SysRoleUpdateReqVO)', '{\"reqVO\":{\"code\":\"test\",\"id\":101,\"name\":\"测试账号\",\"remark\":\"132\",\"sort\":\"0\",\"type\":2}}', '2021-01-23 18:16:51', 3946, 0, '', 'true', '', '2021-01-21 00:38:11', '', '2021-01-21 00:38:11', b'0'); +INSERT INTO `sys_operate_log` VALUES (51, 'ffa6bc01-3f1c-44c7-a632-087fa66c754e', 1, '用户 API', '新增用户', 2, '', '', 'POST', '/api/system/user/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.user.SysUserController.createUser(SysUserCreateReqVO)', '{\"reqVO\":{\"nickname\":\"测试号\",\"password\":\"buzhidao\",\"postIds\":[],\"username\":\"test\"}}', '2021-01-23 20:32:14', 135, 0, '', '104', '', '2021-01-21 02:13:53', '', '2021-01-21 02:13:53', b'0'); +INSERT INTO `sys_operate_log` VALUES (52, '4b3982fc-b52c-4f72-aaf6-9a0a3cb1ad3e', 1, '用户 API', '修改用户', 2, '', '', 'POST', '/api/system/user/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.user.SysUserController.updateUser(SysUserUpdateReqVO)', '{\"reqVO\":{\"avatar\":\"\",\"deptId\":100,\"email\":\"\",\"id\":104,\"mobile\":\"15601691200\",\"nickname\":\"测试号\",\"postIds\":[],\"sex\":1,\"username\":\"test\"}}', '2021-01-23 20:32:34', 25, 0, '', 'true', '', '2021-01-21 02:14:13', '', '2021-01-21 02:14:13', b'0'); +INSERT INTO `sys_operate_log` VALUES (53, 'c2390db2-3239-4c20-94d2-e92025101128', 1, '权限 API', '赋予用户角色', 2, '', '', 'POST', '/api/system/permission/assign-user-role', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignUserRole(SysPermissionAssignUserRoleReqVO)', '{\"reqVO\":{\"roleIds\":[101],\"userId\":104}}', '2021-01-23 20:32:53', 15, 0, '', 'true', '', '2021-01-21 02:14:32', '', '2021-01-21 02:14:32', b'0'); +INSERT INTO `sys_operate_log` VALUES (54, 'dde4892a-a721-46c3-8fc4-3101d5b0a191', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1001],\"roleId\":101}}', '2021-01-23 20:33:22', 27, 0, '', 'true', '', '2021-01-21 02:15:01', '', '2021-01-21 02:15:01', b'0'); +INSERT INTO `sys_operate_log` VALUES (55, '36a58418-375f-4e7a-b0a9-8161358537ab', 1, '权限 API', '赋予角色数据权限', 2, '', '', 'POST', '/api/system/permission/assign-role-data-scope', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleDataScope(SysPermissionAssignRoleDataScopeReqVO)', '{\"reqVO\":{\"dataScope\":2,\"dataScopeDeptIds\":[104],\"roleId\":101}}', '2021-01-23 20:33:47', 13, 0, '', 'true', '', '2021-01-21 02:15:26', '', '2021-01-21 02:15:26', b'0'); +INSERT INTO `sys_operate_log` VALUES (56, 'f3b54afc-4427-4eeb-979c-c274d5566019', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1001],\"roleId\":101}}', '2021-01-23 20:55:28', 35, 0, '', 'true', '', '2021-01-21 02:37:09', '', '2021-01-21 02:37:09', b'0'); +INSERT INTO `sys_operate_log` VALUES (57, '96543ff3-30e6-4ceb-8ca1-fe39ba235bf6', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1001],\"roleId\":101}}', '2021-01-23 20:57:48', 20, 0, '', 'true', '', '2021-01-21 02:39:29', '', '2021-01-21 02:39:29', b'0'); +INSERT INTO `sys_operate_log` VALUES (58, '9a31bdda-cb5f-4b87-b30d-c5139e75f24b', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001],\"roleId\":101}}', '2021-01-23 20:58:05', 19, 0, '', 'true', '', '2021-01-21 02:39:45', '', '2021-01-21 02:39:45', b'0'); +INSERT INTO `sys_operate_log` VALUES (59, 'f5c66c24-7aca-468d-8507-641599166c78', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001],\"roleId\":101}}', '2021-01-23 21:40:13', 8370, 0, '', 'true', '', '2021-01-21 03:03:21', '', '2021-01-21 03:03:21', b'0'); +INSERT INTO `sys_operate_log` VALUES (60, 'b259a76d-5771-47ed-8a4a-74728ff32b96', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001],\"roleId\":101}}', '2021-01-23 21:40:42', 10361, 0, '', 'true', '', '2021-01-21 03:03:51', '', '2021-01-21 03:03:51', b'0'); +INSERT INTO `sys_operate_log` VALUES (61, '3ff17962-16e0-412b-8b91-aaf356b13caf', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001],\"roleId\":101}}', '2021-01-23 21:41:25', 2828, 0, '', 'true', '', '2021-01-21 03:04:27', '', '2021-01-21 03:04:27', b'0'); +INSERT INTO `sys_operate_log` VALUES (62, '70de67ba-c36a-43b3-9575-682f6e80d4b2', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1024,1025,1,1026,1027,1028,1029,1030,1036,1037,1038,1039,1040,1042,1043,1045,100,1063,1064,1065,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023],\"roleId\":101}}', '2021-01-23 21:41:51', 1686, 0, '', 'true', '', '2021-01-21 03:04:52', '', '2021-01-21 03:04:52', b'0'); +INSERT INTO `sys_operate_log` VALUES (63, 'e86ac5b7-bb6f-486a-9f98-3525bd31c62a', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001,1002],\"roleId\":101}}', '2021-01-23 21:44:44', 2928, 0, '', 'true', '', '2021-01-21 03:07:46', '', '2021-01-21 03:07:46', b'0'); +INSERT INTO `sys_operate_log` VALUES (64, '68ee41a8-d7f4-4fbf-9234-11713cf4ea1e', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001],\"roleId\":101}}', '2021-01-23 21:47:08', 11, 0, '', 'true', '', '2021-01-21 03:10:08', '', '2021-01-21 03:10:08', b'0'); +INSERT INTO `sys_operate_log` VALUES (65, 'e5ae7cb4-0a91-4cf6-810a-9215ccf5cf74', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001,1002],\"roleId\":101}}', '2021-01-23 21:48:17', 9, 0, '', 'true', '', '2021-01-21 03:11:17', '', '2021-01-21 03:11:17', b'0'); +INSERT INTO `sys_operate_log` VALUES (66, '246c0e9d-8232-4944-9d5e-b245b0baea2d', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[],\"roleId\":101}}', '2021-01-23 21:50:11', 11, 0, '', 'true', '', '2021-01-21 03:13:11', '', '2021-01-21 03:13:11', b'0'); +INSERT INTO `sys_operate_log` VALUES (67, 'aaa9076d-92de-4a7b-bedc-89922c9c30d0', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001],\"roleId\":101}}', '2021-01-23 21:50:21', 13, 0, '', 'true', '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:21', b'0'); +INSERT INTO `sys_operate_log` VALUES (68, '3fb4e653-ba5b-4953-85a1-30ccd0884963', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1008,1009,1,1010,1011,1012,101,1063,1064,1065],\"roleId\":101}}', '2021-01-23 21:50:40', 28, 0, '', 'true', '', '2021-01-21 03:13:40', '', '2021-01-21 03:13:40', b'0'); +INSERT INTO `sys_operate_log` VALUES (69, 'c85d8da3-2dd8-4922-9511-c60a71fc13e0', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1008,1009,1,1010,1011,1012,101,1063,1064,1065],\"roleId\":101}}', '2021-01-23 22:00:02', 40, 0, '', 'true', '', '2021-01-21 03:23:02', '', '2021-01-21 03:23:02', b'0'); +INSERT INTO `sys_operate_log` VALUES (70, 'fdb42076-927f-4274-bf0c-2e5b5c6ba51c', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1,100,1001,1002,1003,1004,1005,1006,1007],\"roleId\":101}}', '2021-01-23 22:00:14', 41, 0, '', 'true', '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:14', b'0'); +INSERT INTO `sys_operate_log` VALUES (71, '60387620-e304-4180-87ab-ad5131a50dbf', 1, '权限 API', '赋予角色菜单', 2, '', '', 'POST', '/api/system/permission/assign-role-menu', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysPermissionController.assignRoleMenu(SysPermissionAssignRoleMenuReqVO)', '{\"reqVO\":{\"menuIds\":[1008,1009,1,1010,1011,1012,101,1063,1064,1065],\"roleId\":101}}', '2021-01-23 22:00:27', 44, 0, '', 'true', '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_operate_log` VALUES (72, 'c78c1b32-66ee-456a-bf42-02a863181338', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"http://127.0.0.1:8080/admin\",\"icon\":\"server\",\"id\":112,\"name\":\"服务监控\",\"parentId\":2,\"path\":\"server\",\"permission\":\"monitor:server:list\",\"sort\":\"4\",\"type\":2}}', '2021-01-23 23:34:51', 36, 0, '', 'true', '', '2021-01-21 04:57:58', '', '2021-01-21 04:57:58', b'0'); +INSERT INTO `sys_operate_log` VALUES (73, 'bdf5b5c3-6b10-4f6d-9131-bca51df74855', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"component\":\"\",\"icon\":\"server\",\"id\":112,\"name\":\"服务监控\",\"parentId\":2,\"path\":\"http://127.0.0.1:8080/admin\",\"permission\":\"monitor:server:list\",\"sort\":\"4\",\"type\":2}}', '2021-01-23 23:35:52', 14, 0, '', 'true', '', '2021-01-21 04:58:59', '', '2021-01-21 04:58:59', b'0'); +INSERT INTO `sys_operate_log` VALUES (74, '8502967e-48a6-4b1b-978e-a6fab0d4dc48', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"icon\":\"tool\",\"id\":3,\"name\":\"系统工具\",\"parentId\":0,\"path\":\"/tool\",\"permission\":\"\",\"sort\":\"3\",\"type\":1}}', '2021-01-24 10:30:53', 32, 0, '', 'true', '', '2021-01-21 08:56:19', '', '2021-01-21 08:56:19', b'0'); +INSERT INTO `sys_operate_log` VALUES (75, 'b1e1ac23-ff33-4d8b-ae7e-dcf58edf01eb', 1, '用户 API', '修改用户', 2, '', '', 'POST', '/api/system/user/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.user.SysUserController.updateUser(SysUserUpdateReqVO)', '{\"reqVO\":{\"username\":\"test\",\"nickname\":\"测试号\",\"remark\":null,\"deptId\":100,\"postIds\":[],\"email\":\"\",\"mobile\":\"15601691200\",\"sex\":1,\"avatar\":\"\",\"id\":104}}', '2021-01-24 12:14:07', 34, 0, '', 'true', '', '2021-01-21 10:39:40', '', '2021-01-21 10:39:40', b'0'); +INSERT INTO `sys_operate_log` VALUES (76, '815f8631-e297-4a6c-b31a-8f6e54c6e7a2', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"Redis 监控\",\"permission\":\"\",\"type\":2,\"sort\":\"5\",\"parentId\":2,\"path\":\"cache\",\"icon\":\"redis\",\"component\":\"monitor/cache/index\",\"id\":113}}', '2021-01-28 01:18:11', 52, 500, 'InvalidDefinitionException: No serializer found for class cn.iocoder.dashboard.modules.system.mq.message.permission.SysMenuRefreshMessage and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)', 'null', '', '2021-01-26 00:51:20', '', '2021-01-26 00:51:20', b'0'); +INSERT INTO `sys_operate_log` VALUES (77, 'd6f87cd1-824e-4f65-8ba3-51212fe6e4ff', 1, '字典类型 API', '新增字典类型', 2, '', '', 'POST', '/api/system/dict-type/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dict.SysDictTypeController.createDictType(SysDictTypeCreateReqVO)', '{\"reqVO\":{\"name\":\"Redis 超时类型\",\"status\":0,\"remark\":\"RedisKeyDefine.TimeoutTypeEnum\",\"type\":\"inf_redis_timeout_type\"}}', '2021-01-28 01:19:41', 19, 0, '', '105', '', '2021-01-26 00:52:50', '', '2021-01-26 00:52:50', b'0'); +INSERT INTO `sys_operate_log` VALUES (78, '7ed80010-a788-49c6-b41a-567930a63225', 1, '字典数据 API', '新增字典数据', 2, '', '', 'POST', '/api/system/dict-data/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dict.SysDictDataController.createDictData(SysDictDataCreateReqVO)', '{\"reqVO\":{\"sort\":\"1\",\"label\":\"永不超时\",\"value\":\"1\",\"dictType\":\"inf_redis_timeout_type\",\"status\":0,\"remark\":\"Redis 未设置超时的情况\"}}', '2021-01-28 01:20:08', 18, 500, 'InvalidDefinitionException: No serializer found for class cn.iocoder.dashboard.modules.system.mq.message.dict.SysDictDataRefreshMessage and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)', 'null', '', '2021-01-26 00:53:17', '', '2021-01-26 00:53:17', b'0'); +INSERT INTO `sys_operate_log` VALUES (79, '6e92720f-7757-4cb7-99e2-f6d3b83b7bbb', 1, '字典数据 API', '新增字典数据', 2, '', '', 'POST', '/api/system/dict-data/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dict.SysDictDataController.createDictData(SysDictDataCreateReqVO)', '{\"reqVO\":{\"sort\":\"1\",\"label\":\"永不超时\",\"value\":\"1\",\"dictType\":\"inf_redis_timeout_type\",\"status\":0,\"remark\":\"Redis 未设置超时的情况\"}}', '2021-01-28 01:21:26', 33, 500, 'ServiceException: 已经存在该值的字典数据', 'null', '', '2021-01-26 00:54:35', '', '2021-01-26 00:54:35', b'0'); +INSERT INTO `sys_operate_log` VALUES (80, 'd204de50-32b5-4cf0-b163-768fb57ef38b', 1, '字典数据 API', '新增字典数据', 2, '', '', 'POST', '/api/system/dict-data/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dict.SysDictDataController.createDictData(SysDictDataCreateReqVO)', '{\"reqVO\":{\"sort\":\"1\",\"label\":\"动态超时\",\"value\":\"2\",\"dictType\":\"inf_redis_timeout_type\",\"status\":0,\"remark\":\"程序里动态传入超时时间,无法固定\"}}', '2021-01-28 01:21:51', 24, 0, '', '48', '', '2021-01-26 00:55:00', '', '2021-01-26 00:55:00', b'0'); +INSERT INTO `sys_operate_log` VALUES (81, '78c517c7-191d-46d8-bdc3-5dbeb06be26d', 1, '字典数据 API', '新增字典数据', 2, '', '', 'POST', '/api/system/dict-data/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.dict.SysDictDataController.createDictData(SysDictDataCreateReqVO)', '{\"reqVO\":{\"sort\":\"3\",\"label\":\"固定超时\",\"value\":\"3\",\"dictType\":\"inf_redis_timeout_type\",\"status\":0,\"remark\":\"Redis 设置了过期时间\"}}', '2021-01-28 01:22:17', 21, 0, '', '49', '', '2021-01-26 00:55:26', '', '2021-01-26 00:55:26', b'0'); +INSERT INTO `sys_operate_log` VALUES (82, 'b8c971f3-fd22-4ed3-b5f9-ffc9a8d34859', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"Redis 监控\",\"permission\":\"\",\"type\":2,\"sort\":\"5\",\"parentId\":2,\"path\":\"redis\",\"icon\":\"redis\",\"component\":\"infra/redis/index\",\"id\":113}}', '2021-01-28 01:23:21', 29, 0, '', 'true', '', '2021-01-26 00:56:30', '', '2021-01-26 00:56:30', b'0'); +INSERT INTO `sys_operate_log` VALUES (83, 'e0922d52-0007-4105-a487-692d00d091c3', 1, '菜单 API', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"获得 Redis 监控信息\",\"permission\":\"infra:redis:get-monitor-info\",\"type\":3,\"sort\":\"1\",\"parentId\":113,\"path\":null,\"icon\":null,\"component\":null}}', '2021-01-28 01:29:22', 14, 0, '', '1066', '', '2021-01-26 01:02:31', '', '2021-01-26 01:02:31', b'0'); +INSERT INTO `sys_operate_log` VALUES (84, 'f44a431b-395e-45d9-9e6c-3fbdf7617155', 1, '菜单 API', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"获得 Redis Key 列表\",\"permission\":\"infra:redis:get-key-list\",\"type\":3,\"sort\":\"2\",\"parentId\":113,\"path\":null,\"icon\":null,\"component\":null}}', '2021-01-28 01:29:42', 11, 0, '', '1067', '', '2021-01-26 01:02:52', '', '2021-01-26 01:02:52', b'0'); COMMIT; -- ---------------------------- @@ -628,7 +946,7 @@ CREATE TABLE `sys_role` ( BEGIN; INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 12:40:20', b'0'); INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 11:46:58', b'0'); -INSERT INTO `sys_role` VALUES (101, '测试账号', 'test', 0, 2, '[103]', 0, 2, '132', '', '2021-01-06 13:49:35', '', '2021-01-06 20:36:02', b'0'); +INSERT INTO `sys_role` VALUES (101, '测试账号', 'test', 0, 2, '[104]', 0, 2, '132', '', '2021-01-06 13:49:35', '', '2021-01-21 02:15:26', b'0'); COMMIT; -- ---------------------------- @@ -645,7 +963,7 @@ CREATE TABLE `sys_role_menu` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=169 DEFAULT CHARSET=utf8mb4 COMMENT='角色和菜单关联表'; +) ENGINE=InnoDB AUTO_INCREMENT=239 DEFAULT CHARSET=utf8mb4 COMMENT='角色和菜单关联表'; -- ---------------------------- -- Records of sys_role_menu @@ -735,88 +1053,76 @@ INSERT INTO `sys_role_menu` VALUES (81, 2, 1057, '', '2021-01-06 17:28:04', '', INSERT INTO `sys_role_menu` VALUES (82, 2, 1058, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); INSERT INTO `sys_role_menu` VALUES (83, 2, 1059, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); INSERT INTO `sys_role_menu` VALUES (84, 2, 1060, '', '2021-01-06 17:28:04', '', '2021-01-06 17:28:04', b'0'); -INSERT INTO `sys_role_menu` VALUES (85, 101, 114, '', '2021-01-06 17:30:23', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (88, 101, 3, '', '2021-01-06 17:44:56', '', '2021-01-06 17:47:52', b'1'); -INSERT INTO `sys_role_menu` VALUES (89, 101, 1056, '', '2021-01-06 17:47:52', '', '2021-01-06 17:47:59', b'1'); -INSERT INTO `sys_role_menu` VALUES (90, 101, 1057, '', '2021-01-06 17:47:52', '', '2021-01-06 17:47:59', b'1'); -INSERT INTO `sys_role_menu` VALUES (91, 101, 1058, '', '2021-01-06 17:47:52', '', '2021-01-06 17:47:59', b'1'); -INSERT INTO `sys_role_menu` VALUES (92, 101, 1059, '', '2021-01-06 17:47:52', '', '2021-01-06 17:47:59', b'1'); -INSERT INTO `sys_role_menu` VALUES (93, 101, 1060, '', '2021-01-06 17:47:52', '', '2021-01-06 17:47:59', b'1'); -INSERT INTO `sys_role_menu` VALUES (94, 101, 116, '', '2021-01-06 17:47:52', '', '2021-01-06 17:49:37', b'1'); -INSERT INTO `sys_role_menu` VALUES (95, 101, 1055, '', '2021-01-06 17:47:52', '', '2021-01-06 17:47:59', b'1'); -INSERT INTO `sys_role_menu` VALUES (96, 101, 1055, '', '2021-01-06 17:48:04', '', '2021-01-06 17:49:37', b'1'); -INSERT INTO `sys_role_menu` VALUES (97, 101, 1056, '', '2021-01-06 17:48:13', '', '2021-01-06 17:49:37', b'1'); -INSERT INTO `sys_role_menu` VALUES (98, 101, 1057, '', '2021-01-06 17:48:13', '', '2021-01-06 17:49:37', b'1'); -INSERT INTO `sys_role_menu` VALUES (99, 101, 1058, '', '2021-01-06 17:48:13', '', '2021-01-06 17:49:37', b'1'); -INSERT INTO `sys_role_menu` VALUES (100, 101, 1059, '', '2021-01-06 17:49:29', '', '2021-01-06 17:49:37', b'1'); -INSERT INTO `sys_role_menu` VALUES (101, 101, 1060, '', '2021-01-06 17:49:29', '', '2021-01-06 17:49:37', b'1'); -INSERT INTO `sys_role_menu` VALUES (102, 101, 1024, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (103, 101, 1025, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (104, 101, 1026, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (105, 101, 1027, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (106, 101, 1028, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (107, 101, 4, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (108, 101, 1029, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (109, 101, 1030, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (110, 101, 1031, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (111, 101, 1032, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (112, 101, 1033, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (113, 101, 1034, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (114, 101, 1035, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (115, 101, 1036, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (116, 101, 1037, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (117, 101, 1038, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (118, 101, 1039, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (119, 101, 1040, '', '2021-01-06 18:00:10', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (120, 101, 1041, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (121, 101, 1042, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (122, 101, 1043, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (123, 101, 1044, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (124, 101, 1045, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (125, 101, 1046, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (126, 101, 1047, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (127, 101, 1048, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (128, 101, 1049, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (129, 101, 1050, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (130, 101, 1051, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (131, 101, 1052, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (132, 101, 1053, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (133, 101, 1054, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (134, 101, 1055, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (135, 101, 1056, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (136, 101, 1057, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (137, 101, 1058, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (138, 101, 1059, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (139, 101, 1060, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (140, 101, 1063, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (141, 101, 1064, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (142, 101, 1001, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (143, 101, 1002, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (144, 101, 1003, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (145, 101, 1004, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (146, 101, 1005, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (147, 101, 1006, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (148, 101, 1007, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (149, 101, 111, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (150, 101, 1008, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (151, 101, 112, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (152, 101, 1009, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (153, 101, 113, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (154, 101, 1010, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (155, 101, 1011, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (156, 101, 1012, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (157, 101, 116, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (158, 101, 1013, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (159, 101, 1014, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (160, 101, 1015, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (161, 101, 1016, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (162, 101, 1017, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (163, 101, 1018, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (164, 101, 1019, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (165, 101, 1020, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (166, 101, 1021, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (167, 101, 1022, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); -INSERT INTO `sys_role_menu` VALUES (168, 101, 1023, '', '2021-01-06 18:00:11', '', '2021-01-06 18:00:16', b'1'); +INSERT INTO `sys_role_menu` VALUES (169, 101, 1001, '', '2021-01-21 02:15:01', '', '2021-01-21 03:04:50', b'1'); +INSERT INTO `sys_role_menu` VALUES (170, 101, 1, '', '2021-01-21 02:39:45', '', '2021-01-21 03:13:11', b'1'); +INSERT INTO `sys_role_menu` VALUES (171, 101, 100, '', '2021-01-21 02:39:45', '', '2021-01-21 03:13:11', b'1'); +INSERT INTO `sys_role_menu` VALUES (172, 101, 1024, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (173, 101, 1025, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (174, 101, 1026, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (175, 101, 1027, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (176, 101, 1028, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (177, 101, 1029, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (178, 101, 1030, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (179, 101, 1036, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (180, 101, 1037, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (181, 101, 1038, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (182, 101, 1039, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (183, 101, 1040, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (184, 101, 1042, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (185, 101, 1043, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (186, 101, 1045, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (187, 101, 1063, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (188, 101, 1064, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (189, 101, 1065, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (190, 101, 1007, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (191, 101, 1008, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (192, 101, 1009, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (193, 101, 1010, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (194, 101, 1011, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (195, 101, 1012, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (196, 101, 1013, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (197, 101, 1014, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (198, 101, 1015, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (199, 101, 1016, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (200, 101, 1017, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (201, 101, 1018, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (202, 101, 1019, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (203, 101, 1020, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (204, 101, 1021, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (205, 101, 1022, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (206, 101, 1023, '', '2021-01-21 03:04:50', '', '2021-01-21 03:07:43', b'1'); +INSERT INTO `sys_role_menu` VALUES (207, 101, 1001, '', '2021-01-21 03:07:43', '', '2021-01-21 03:13:11', b'1'); +INSERT INTO `sys_role_menu` VALUES (208, 101, 1002, '', '2021-01-21 03:07:43', '', '2021-01-21 03:10:08', b'1'); +INSERT INTO `sys_role_menu` VALUES (209, 101, 1002, '', '2021-01-21 03:11:17', '', '2021-01-21 03:13:11', b'1'); +INSERT INTO `sys_role_menu` VALUES (210, 101, 1, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:21', b'0'); +INSERT INTO `sys_role_menu` VALUES (211, 101, 1001, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:40', b'1'); +INSERT INTO `sys_role_menu` VALUES (212, 101, 100, '', '2021-01-21 03:13:21', '', '2021-01-21 03:13:40', b'1'); +INSERT INTO `sys_role_menu` VALUES (213, 101, 1008, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (214, 101, 1009, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (215, 101, 1010, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (216, 101, 1011, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (217, 101, 1012, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (218, 101, 101, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (219, 101, 1063, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (220, 101, 1064, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (221, 101, 1065, '', '2021-01-21 03:13:40', '', '2021-01-21 03:23:14', b'1'); +INSERT INTO `sys_role_menu` VALUES (222, 101, 100, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `sys_role_menu` VALUES (223, 101, 1001, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `sys_role_menu` VALUES (224, 101, 1002, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `sys_role_menu` VALUES (225, 101, 1003, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `sys_role_menu` VALUES (226, 101, 1004, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `sys_role_menu` VALUES (227, 101, 1005, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `sys_role_menu` VALUES (228, 101, 1006, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `sys_role_menu` VALUES (229, 101, 1007, '', '2021-01-21 03:23:14', '', '2021-01-21 03:23:27', b'1'); +INSERT INTO `sys_role_menu` VALUES (230, 101, 1008, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_role_menu` VALUES (231, 101, 1009, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_role_menu` VALUES (232, 101, 1010, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_role_menu` VALUES (233, 101, 1011, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_role_menu` VALUES (234, 101, 1012, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_role_menu` VALUES (235, 101, 101, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_role_menu` VALUES (236, 101, 1063, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_role_menu` VALUES (237, 101, 1064, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); +INSERT INTO `sys_role_menu` VALUES (238, 101, 1065, '', '2021-01-21 03:23:27', '', '2021-01-21 03:23:27', b'0'); COMMIT; -- ---------------------------- @@ -844,7 +1150,7 @@ CREATE TABLE `sys_user` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表'; +) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表'; -- ---------------------------- -- Records of sys_user @@ -854,6 +1160,7 @@ INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH INSERT INTO `sys_user` VALUES (2, 'ry', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '若依', '测试员', 105, '[2]', 'ry@qq.com', '15666666666', 1, '', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); INSERT INTO `sys_user` VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 100, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '', NULL, '', '2021-01-07 09:07:17', '', '2021-01-13 23:53:12', b'0'); INSERT INTO `sys_user` VALUES (103, 'yuanma', '', '源码', NULL, 100, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '', NULL, '', '2021-01-13 23:50:35', '', '2021-01-13 23:50:35', b'0'); +INSERT INTO `sys_user` VALUES (104, 'test', '$2a$10$wTJ.1LVmhxcujss2NR2SMeBo8AaFsjkoDfDafHYsdHmitAiwmnvce', '测试号', NULL, 100, '[]', '', '15601691200', 1, '', 0, '', NULL, '', '2021-01-21 02:13:53', '', '2021-01-21 02:14:13', b'0'); COMMIT; -- ---------------------------- @@ -870,7 +1177,7 @@ CREATE TABLE `sys_user_role` ( `update_time` datetime DEFAULT NULL COMMENT '更新时间', `deleted` bit(1) DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='用户和角色关联表'; +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='用户和角色关联表'; -- ---------------------------- -- Records of sys_user_role @@ -882,6 +1189,7 @@ INSERT INTO `sys_user_role` VALUES (3, 100, 1, '', NULL, '', NULL, b'1'); INSERT INTO `sys_user_role` VALUES (4, 100, 101, '', NULL, '', NULL, b'0'); INSERT INTO `sys_user_role` VALUES (5, 100, 1, '', NULL, '', NULL, b'0'); INSERT INTO `sys_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0'); +INSERT INTO `sys_user_role` VALUES (7, 104, 101, '', NULL, '', NULL, b'0'); COMMIT; SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/ry_20201128.sql b/sql/ry_20201128.sql deleted file mode 100644 index 1db0d5af7..000000000 --- a/sql/ry_20201128.sql +++ /dev/null @@ -1,683 +0,0 @@ --- ---------------------------- --- 1、部门表 --- ---------------------------- -drop table if exists sys_dept; -create table sys_dept ( - dept_id bigint(20) not null auto_increment comment '部门id', - parent_id bigint(20) default 0 comment '父部门id', - ancestors varchar(50) default '' comment '祖级列表', - dept_name varchar(30) default '' comment '部门名称', - order_num int(4) default 0 comment '显示顺序', - leader varchar(20) default null comment '负责人', - phone varchar(11) default null comment '联系电话', - email varchar(50) default null comment '邮箱', - status char(1) default '0' comment '部门状态(0正常 1停用)', - del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', - create_by varchar(64) default '' comment '创建者', - create_time datetime comment '创建时间', - update_by varchar(64) default '' comment '更新者', - update_time datetime comment '更新时间', - primary key (dept_id) -) engine=innodb auto_increment=200 comment = '部门表'; - --- ---------------------------- --- 初始化-部门表数据 --- ---------------------------- -insert into sys_dept values(100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); -insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); - - --- ---------------------------- --- 2、用户信息表 --- ---------------------------- -drop table if exists sys_user; -create table sys_user ( - user_id bigint(20) not null auto_increment comment '用户ID', - dept_id bigint(20) default null comment '部门ID', - user_name varchar(30) not null comment '用户账号', - nick_name varchar(30) not null comment '用户昵称', - user_type varchar(2) default '00' comment '用户类型(00系统用户)', - email varchar(50) default '' comment '用户邮箱', - phonenumber varchar(11) default '' comment '手机号码', - sex char(1) default '0' comment '用户性别(0男 1女 2未知)', - avatar varchar(100) default '' comment '头像地址', - password varchar(100) default '' comment '密码', - status char(1) default '0' comment '帐号状态(0正常 1停用)', - del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', - login_ip varchar(50) default '' comment '最后登录IP', - login_date datetime comment '最后登录时间', - create_by varchar(64) default '' comment '创建者', - create_time datetime comment '创建时间', - update_by varchar(64) default '' comment '更新者', - update_time datetime comment '更新时间', - remark varchar(500) default null comment '备注', - primary key (user_id) -) engine=innodb auto_increment=100 comment = '用户信息表'; - --- ---------------------------- --- 初始化-用户信息表数据 --- ---------------------------- -insert into sys_user values(1, 103, 'admin', '若依', '00', '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', 'ry@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 'admin', sysdate(), '', null, '测试员'); - - --- ---------------------------- --- 3、岗位信息表 --- ---------------------------- -drop table if exists sys_post; -create table sys_post -( - post_id bigint(20) not null auto_increment comment '岗位ID', - post_code varchar(64) not null comment '岗位编码', - post_name varchar(50) not null comment '岗位名称', - post_sort int(4) not null comment '显示顺序', - status char(1) not null 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 null comment '备注', - primary key (post_id) -) engine=innodb comment = '岗位信息表'; - --- ---------------------------- --- 初始化-岗位信息表数据 --- ---------------------------- -insert into sys_post values(1, 'ceo', '董事长', 1, '0', 'admin', sysdate(), '', null, ''); -insert into sys_post values(2, 'se', '项目经理', 2, '0', 'admin', sysdate(), '', null, ''); -insert into sys_post values(3, 'hr', '人力资源', 3, '0', 'admin', sysdate(), '', null, ''); -insert into sys_post values(4, 'user', '普通员工', 4, '0', 'admin', sysdate(), '', null, ''); - - --- ---------------------------- --- 4、角色信息表 --- ---------------------------- -drop table if exists sys_role; -create table sys_role ( - role_id bigint(20) not null auto_increment comment '角色ID', - role_name varchar(30) not null comment '角色名称', - role_key varchar(100) not null comment '角色权限字符串', - role_sort int(4) not null comment '显示顺序', - data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', - menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示', - dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示', - status char(1) not null comment '角色状态(0正常 1停用)', - del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', - create_by varchar(64) default '' comment '创建者', - create_time datetime comment '创建时间', - update_by varchar(64) default '' comment '更新者', - update_time datetime comment '更新时间', - remark varchar(500) default null comment '备注', - primary key (role_id) -) engine=innodb auto_increment=100 comment = '角色信息表'; - --- ---------------------------- --- 初始化-角色信息表数据 --- ---------------------------- -insert into sys_role values('1', '超级管理员', 'admin', 1, 1, 1, 1, '0', '0', 'admin', sysdate(), '', null, '超级管理员'); -insert into sys_role values('2', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 'admin', sysdate(), '', null, '普通角色'); - - --- ---------------------------- --- 5、菜单权限表 --- ---------------------------- -drop table if exists sys_menu; -create table sys_menu ( - menu_id bigint(20) not null auto_increment comment '菜单ID', - menu_name varchar(50) not null comment '菜单名称', - parent_id bigint(20) default 0 comment '父菜单ID', - order_num int(4) default 0 comment '显示顺序', - path varchar(200) default '' comment '路由地址', - component varchar(255) default null comment '组件路径', - is_frame int(1) default 1 comment '是否为外链(0是 1否)', - is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)', - menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)', - visible char(1) default 0 comment '菜单状态(0显示 1隐藏)', - status char(1) default 0 comment '菜单状态(0正常 1停用)', - perms varchar(100) default null comment '权限标识', - icon varchar(100) default '#' comment '菜单图标', - 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 '备注', - primary key (menu_id) -) engine=innodb auto_increment=2000 comment = '菜单权限表'; - --- ---------------------------- --- 初始化-菜单信息表数据 --- ---------------------------- --- 一级菜单 -insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, 1, 0, 'M', '0', '0', '', 'system', 'admin', sysdate(), '', null, '系统管理目录'); -insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, 1, 0, 'M', '0', '0', '', 'monitor', 'admin', sysdate(), '', null, '系统监控目录'); -insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, 1, 0, 'M', '0', '0', '', 'tool', 'admin', sysdate(), '', null, '系统工具目录'); -insert into sys_menu values('4', '若依官网', '0', '4', 'http://ruoyi.vip', null , 0, 0, 'M', '0', '0', '', 'guide', 'admin', sysdate(), '', null, '若依官网地址'); --- 二级菜单 -insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', sysdate(), '', null, '用户管理菜单'); -insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', sysdate(), '', null, '角色管理菜单'); -insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', sysdate(), '', null, '菜单管理菜单'); -insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system/dept/index', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', sysdate(), '', null, '部门管理菜单'); -insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system/post/index', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', sysdate(), '', null, '岗位管理菜单'); -insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system/dict/index', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', sysdate(), '', null, '字典管理菜单'); -insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system/config/index', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', sysdate(), '', null, '参数设置菜单'); -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('111', '数据监控', '2', '3', 'druid', 'monitor/druid/index', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', sysdate(), '', null, '数据监控菜单'); -insert into sys_menu values('112', '服务监控', '2', '4', 'server', 'monitor/server/index', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', sysdate(), '', null, '服务监控菜单'); -insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', sysdate(), '', null, '缓存监控菜单'); -insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', sysdate(), '', null, '表单构建菜单'); -insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', sysdate(), '', null, '代码生成菜单'); -insert into sys_menu values('116', '系统接口', '3', '3', 'swagger', 'tool/swagger/index', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', sysdate(), '', null, '系统接口菜单'); --- 三级菜单 -insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', sysdate(), '', null, '操作日志菜单'); -insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', sysdate(), '', null, '登录日志菜单'); --- 用户管理按钮 -insert into sys_menu values('1001', '用户查询', '100', '1', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1002', '用户新增', '100', '2', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1003', '用户修改', '100', '3', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1004', '用户删除', '100', '4', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1005', '用户导出', '100', '5', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1006', '用户导入', '100', '6', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1007', '重置密码', '100', '7', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', sysdate(), '', null, ''); --- 角色管理按钮 -insert into sys_menu values('1008', '角色查询', '101', '1', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1009', '角色新增', '101', '2', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1010', '角色修改', '101', '3', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1011', '角色删除', '101', '4', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1012', '角色导出', '101', '5', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', sysdate(), '', null, ''); --- 菜单管理按钮 -insert into sys_menu values('1013', '菜单查询', '102', '1', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1014', '菜单新增', '102', '2', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1015', '菜单修改', '102', '3', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1016', '菜单删除', '102', '4', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', sysdate(), '', null, ''); --- 部门管理按钮 -insert into sys_menu values('1017', '部门查询', '103', '1', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1018', '部门新增', '103', '2', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1019', '部门修改', '103', '3', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1020', '部门删除', '103', '4', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', sysdate(), '', null, ''); --- 岗位管理按钮 -insert into sys_menu values('1021', '岗位查询', '104', '1', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1022', '岗位新增', '104', '2', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1023', '岗位修改', '104', '3', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1024', '岗位删除', '104', '4', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1025', '岗位导出', '104', '5', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', sysdate(), '', null, ''); --- 字典管理按钮 -insert into sys_menu values('1026', '字典查询', '105', '1', '#', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1027', '字典新增', '105', '2', '#', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1028', '字典修改', '105', '3', '#', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1029', '字典删除', '105', '4', '#', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1030', '字典导出', '105', '5', '#', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', sysdate(), '', null, ''); --- 参数设置按钮 -insert into sys_menu values('1031', '参数查询', '106', '1', '#', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1032', '参数新增', '106', '2', '#', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1033', '参数修改', '106', '3', '#', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1034', '参数删除', '106', '4', '#', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1035', '参数导出', '106', '5', '#', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', sysdate(), '', null, ''); --- 通知公告按钮 -insert into sys_menu values('1036', '公告查询', '107', '1', '#', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1037', '公告新增', '107', '2', '#', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1038', '公告修改', '107', '3', '#', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1039', '公告删除', '107', '4', '#', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', sysdate(), '', null, ''); --- 操作日志按钮 -insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', sysdate(), '', null, ''); --- 登录日志按钮 -insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', sysdate(), '', null, ''); --- 在线用户按钮 -insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, ''); --- 定时任务按钮 -insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1054', '任务导出', '110', '7', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', sysdate(), '', null, ''); --- 代码生成按钮 -insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, ''); -insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, ''); -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, ''); - - --- ---------------------------- --- 6、用户和角色关联表 用户N-1角色 --- ---------------------------- -drop table if exists sys_user_role; -create table sys_user_role ( - user_id bigint(20) not null comment '用户ID', - role_id bigint(20) not null comment '角色ID', - primary key(user_id, role_id) -) engine=innodb comment = '用户和角色关联表'; - --- ---------------------------- --- 初始化-用户和角色关联表数据 --- ---------------------------- -insert into sys_user_role values ('1', '1'); -insert into sys_user_role values ('2', '2'); - - --- ---------------------------- --- 7、角色和菜单关联表 角色1-N菜单 --- ---------------------------- -drop table if exists sys_role_menu; -create table sys_role_menu ( - role_id bigint(20) not null comment '角色ID', - menu_id bigint(20) not null comment '菜单ID', - primary key(role_id, menu_id) -) engine=innodb comment = '角色和菜单关联表'; - --- ---------------------------- --- 初始化-角色和菜单关联表数据 --- ---------------------------- -insert into sys_role_menu values ('2', '1'); -insert into sys_role_menu values ('2', '2'); -insert into sys_role_menu values ('2', '3'); -insert into sys_role_menu values ('2', '4'); -insert into sys_role_menu values ('2', '100'); -insert into sys_role_menu values ('2', '101'); -insert into sys_role_menu values ('2', '102'); -insert into sys_role_menu values ('2', '103'); -insert into sys_role_menu values ('2', '104'); -insert into sys_role_menu values ('2', '105'); -insert into sys_role_menu values ('2', '106'); -insert into sys_role_menu values ('2', '107'); -insert into sys_role_menu values ('2', '108'); -insert into sys_role_menu values ('2', '109'); -insert into sys_role_menu values ('2', '110'); -insert into sys_role_menu values ('2', '111'); -insert into sys_role_menu values ('2', '112'); -insert into sys_role_menu values ('2', '113'); -insert into sys_role_menu values ('2', '114'); -insert into sys_role_menu values ('2', '115'); -insert into sys_role_menu values ('2', '116'); -insert into sys_role_menu values ('2', '500'); -insert into sys_role_menu values ('2', '501'); -insert into sys_role_menu values ('2', '1000'); -insert into sys_role_menu values ('2', '1001'); -insert into sys_role_menu values ('2', '1002'); -insert into sys_role_menu values ('2', '1003'); -insert into sys_role_menu values ('2', '1004'); -insert into sys_role_menu values ('2', '1005'); -insert into sys_role_menu values ('2', '1006'); -insert into sys_role_menu values ('2', '1007'); -insert into sys_role_menu values ('2', '1008'); -insert into sys_role_menu values ('2', '1009'); -insert into sys_role_menu values ('2', '1010'); -insert into sys_role_menu values ('2', '1011'); -insert into sys_role_menu values ('2', '1012'); -insert into sys_role_menu values ('2', '1013'); -insert into sys_role_menu values ('2', '1014'); -insert into sys_role_menu values ('2', '1015'); -insert into sys_role_menu values ('2', '1016'); -insert into sys_role_menu values ('2', '1017'); -insert into sys_role_menu values ('2', '1018'); -insert into sys_role_menu values ('2', '1019'); -insert into sys_role_menu values ('2', '1020'); -insert into sys_role_menu values ('2', '1021'); -insert into sys_role_menu values ('2', '1022'); -insert into sys_role_menu values ('2', '1023'); -insert into sys_role_menu values ('2', '1024'); -insert into sys_role_menu values ('2', '1025'); -insert into sys_role_menu values ('2', '1026'); -insert into sys_role_menu values ('2', '1027'); -insert into sys_role_menu values ('2', '1028'); -insert into sys_role_menu values ('2', '1029'); -insert into sys_role_menu values ('2', '1030'); -insert into sys_role_menu values ('2', '1031'); -insert into sys_role_menu values ('2', '1032'); -insert into sys_role_menu values ('2', '1033'); -insert into sys_role_menu values ('2', '1034'); -insert into sys_role_menu values ('2', '1035'); -insert into sys_role_menu values ('2', '1036'); -insert into sys_role_menu values ('2', '1037'); -insert into sys_role_menu values ('2', '1038'); -insert into sys_role_menu values ('2', '1039'); -insert into sys_role_menu values ('2', '1040'); -insert into sys_role_menu values ('2', '1041'); -insert into sys_role_menu values ('2', '1042'); -insert into sys_role_menu values ('2', '1043'); -insert into sys_role_menu values ('2', '1044'); -insert into sys_role_menu values ('2', '1045'); -insert into sys_role_menu values ('2', '1046'); -insert into sys_role_menu values ('2', '1047'); -insert into sys_role_menu values ('2', '1048'); -insert into sys_role_menu values ('2', '1049'); -insert into sys_role_menu values ('2', '1050'); -insert into sys_role_menu values ('2', '1051'); -insert into sys_role_menu values ('2', '1052'); -insert into sys_role_menu values ('2', '1053'); -insert into sys_role_menu values ('2', '1054'); -insert into sys_role_menu values ('2', '1055'); -insert into sys_role_menu values ('2', '1056'); -insert into sys_role_menu values ('2', '1057'); -insert into sys_role_menu values ('2', '1058'); -insert into sys_role_menu values ('2', '1059'); -insert into sys_role_menu values ('2', '1060'); - --- ---------------------------- --- 8、角色和部门关联表 角色1-N部门 --- ---------------------------- -drop table if exists sys_role_dept; -create table sys_role_dept ( - role_id bigint(20) not null comment '角色ID', - dept_id bigint(20) not null comment '部门ID', - primary key(role_id, dept_id) -) engine=innodb comment = '角色和部门关联表'; - --- ---------------------------- --- 初始化-角色和部门关联表数据 --- ---------------------------- -insert into sys_role_dept values ('2', '100'); -insert into sys_role_dept values ('2', '101'); -insert into sys_role_dept values ('2', '105'); - - --- ---------------------------- --- 9、用户与岗位关联表 用户1-N岗位 --- ---------------------------- -drop table if exists sys_user_post; -create table sys_user_post -( - user_id bigint(20) not null comment '用户ID', - post_id bigint(20) not null comment '岗位ID', - primary key (user_id, post_id) -) engine=innodb comment = '用户与岗位关联表'; - --- ---------------------------- --- 初始化-用户与岗位关联表数据 --- ---------------------------- -insert into sys_user_post values ('1', '1'); -insert into sys_user_post values ('2', '2'); - - --- ---------------------------- --- 10、操作日志记录 --- ---------------------------- -drop table if exists sys_oper_log; -create table sys_oper_log ( - oper_id bigint(20) not null auto_increment comment '日志主键', - title varchar(50) default '' comment '模块标题', - business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)', - method varchar(100) default '' comment '方法名称', - request_method varchar(10) default '' comment '请求方式', - operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)', - oper_name varchar(50) default '' comment '操作人员', - dept_name varchar(50) default '' comment '部门名称', - oper_url varchar(255) default '' comment '请求URL', - oper_ip varchar(50) default '' comment '主机地址', - oper_location varchar(255) default '' comment '操作地点', - oper_param varchar(2000) default '' comment '请求参数', - json_result varchar(2000) default '' comment '返回参数', - status int(1) default 0 comment '操作状态(0正常 1异常)', - error_msg varchar(2000) default '' comment '错误消息', - oper_time datetime comment '操作时间', - primary key (oper_id) -) engine=innodb auto_increment=100 comment = '操作日志记录'; - - --- ---------------------------- --- 11、字典类型表 --- ---------------------------- -drop table if exists sys_dict_type; -create table sys_dict_type -( - dict_id bigint(20) not null auto_increment comment '字典主键', - dict_name varchar(100) default '' comment '字典名称', - dict_type varchar(100) default '' 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 null comment '备注', - primary key (dict_id), - unique (dict_type) -) engine=innodb auto_increment=100 comment = '字典类型表'; - -insert into sys_dict_type values(1, '用户性别', 'sys_user_sex', '0', 'admin', sysdate(), '', null, '用户性别列表'); -insert into sys_dict_type values(2, '菜单状态', 'sys_show_hide', '0', 'admin', sysdate(), '', null, '菜单状态列表'); -insert into sys_dict_type values(3, '系统开关', 'sys_normal_disable', '0', 'admin', sysdate(), '', null, '系统开关列表'); -insert into sys_dict_type values(4, '任务状态', 'sys_job_status', '0', 'admin', sysdate(), '', null, '任务状态列表'); -insert into sys_dict_type values(5, '任务分组', 'sys_job_group', '0', 'admin', sysdate(), '', null, '任务分组列表'); -insert into sys_dict_type values(6, '系统是否', 'sys_yes_no', '0', 'admin', sysdate(), '', null, '系统是否列表'); -insert into sys_dict_type values(7, '通知类型', 'sys_notice_type', '0', 'admin', sysdate(), '', null, '通知类型列表'); -insert into sys_dict_type values(8, '通知状态', 'sys_notice_status', '0', 'admin', sysdate(), '', null, '通知状态列表'); -insert into sys_dict_type values(9, '操作类型', 'sys_oper_type', '0', 'admin', sysdate(), '', null, '操作类型列表'); -insert into sys_dict_type values(10, '系统状态', 'sys_common_status', '0', 'admin', sysdate(), '', null, '登录状态列表'); - - --- ---------------------------- --- 12、字典数据表 --- ---------------------------- -drop table if exists sys_dict_data; -create table sys_dict_data -( - dict_code bigint(20) not null auto_increment comment '字典编码', - dict_sort int(4) default 0 comment '字典排序', - dict_label varchar(100) default '' comment '字典标签', - dict_value varchar(100) default '' comment '字典键值', - dict_type varchar(100) default '' comment '字典类型', - css_class varchar(100) default null comment '样式属性(其他样式扩展)', - list_class varchar(100) default null comment '表格回显样式', - is_default char(1) default 'N' comment '是否默认(Y是 N否)', - 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 null comment '备注', - primary key (dict_code) -) engine=innodb auto_increment=100 comment = '字典数据表'; - -insert into sys_dict_data values(1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', sysdate(), '', null, '性别男'); -insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别女'); -insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别未知'); -insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '显示菜单'); -insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '隐藏菜单'); -insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); -insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); -insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); -insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); -insert into sys_dict_data values(10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', sysdate(), '', null, '默认分组'); -insert into sys_dict_data values(11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, '系统分组'); -insert into sys_dict_data values(12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '系统默认是'); -insert into sys_dict_data values(13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '系统默认否'); -insert into sys_dict_data values(14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', sysdate(), '', null, '通知'); -insert into sys_dict_data values(15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '公告'); -insert into sys_dict_data values(16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); -insert into sys_dict_data values(17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '关闭状态'); -insert into sys_dict_data values(18, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作'); -insert into sys_dict_data values(19, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作'); -insert into sys_dict_data values(20, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作'); -insert into sys_dict_data values(21, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作'); -insert into sys_dict_data values(22, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作'); -insert into sys_dict_data values(23, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作'); -insert into sys_dict_data values(24, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作'); -insert into sys_dict_data values(25, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作'); -insert into sys_dict_data values(26, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作'); -insert into sys_dict_data values(27, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态'); -insert into sys_dict_data values(28, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); - - --- ---------------------------- --- 13、参数配置表 --- ---------------------------- -drop table if exists sys_config; -create table sys_config ( - config_id int(5) not null auto_increment comment '参数主键', - config_name varchar(100) default '' comment '参数名称', - config_key varchar(100) default '' comment '参数键名', - config_value varchar(500) default '' comment '参数键值', - config_type char(1) default 'N' comment '系统内置(Y是 N否)', - create_by varchar(64) default '' comment '创建者', - create_time datetime comment '创建时间', - update_by varchar(64) default '' comment '更新者', - update_time datetime comment '更新时间', - remark varchar(500) default null comment '备注', - primary key (config_id) -) engine=innodb auto_increment=100 comment = '参数配置表'; - -insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); -insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' ); -insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' ); - - --- ---------------------------- --- 14、系统访问记录 --- ---------------------------- -drop table if exists sys_logininfor; -create table sys_logininfor ( - info_id bigint(20) not null auto_increment comment '访问ID', - user_name varchar(50) default '' comment '用户账号', - ipaddr varchar(50) default '' comment '登录IP地址', - login_location varchar(255) default '' comment '登录地点', - browser varchar(50) default '' comment '浏览器类型', - os varchar(50) default '' comment '操作系统', - status char(1) default '0' comment '登录状态(0成功 1失败)', - msg varchar(255) default '' comment '提示消息', - login_time datetime comment '访问时间', - primary key (info_id) -) engine=innodb auto_increment=100 comment = '系统访问记录'; - - --- ---------------------------- --- 15、定时任务调度表 --- ---------------------------- -drop table if exists sys_job; -create table sys_job ( - job_id bigint(20) not null auto_increment comment '任务ID', - job_name varchar(64) default '' comment '任务名称', - job_group varchar(64) default 'DEFAULT' comment '任务组名', - invoke_target varchar(500) not null comment '调用目标字符串', - cron_expression varchar(255) default '' comment 'cron执行表达式', - misfire_policy varchar(20) default '3' comment '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', - concurrent char(1) default '1' comment '是否并发执行(0允许 1禁止)', - 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 '备注信息', - primary key (job_id, job_name, job_group) -) engine=innodb auto_increment=100 comment = '定时任务调度表'; - -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, ''); - - --- ---------------------------- --- 16、定时任务调度日志表 --- ---------------------------- -drop table if exists sys_job_log; -create table sys_job_log ( - job_log_id bigint(20) not null auto_increment comment '任务日志ID', - job_name varchar(64) not null comment '任务名称', - job_group varchar(64) not null comment '任务组名', - invoke_target varchar(500) not null comment '调用目标字符串', - job_message varchar(500) comment '日志信息', - status char(1) default '0' comment '执行状态(0正常 1失败)', - exception_info varchar(2000) default '' comment '异常信息', - create_time datetime comment '创建时间', - primary key (job_log_id) -) engine=innodb comment = '定时任务调度日志表'; - - --- ---------------------------- --- 17、通知公告表 --- ---------------------------- -drop table if exists sys_notice; -create table sys_notice ( - notice_id int(4) not null auto_increment comment '公告ID', - notice_title varchar(50) not null comment '公告标题', - notice_type char(1) not null comment '公告类型(1通知 2公告)', - notice_content longblob default null 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(255) default null comment '备注', - primary key (notice_id) -) engine=innodb auto_increment=10 comment = '通知公告表'; - --- ---------------------------- --- 初始化-公告信息表数据 --- ---------------------------- -insert into sys_notice values('1', '温馨提醒:2018-07-01 若依新版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员'); -insert into sys_notice values('2', '维护通知:2018-07-01 若依系统凌晨维护', '1', '维护内容', '0', 'admin', sysdate(), '', null, '管理员'); - - --- ---------------------------- --- 18、代码生成业务表 --- ---------------------------- -drop table if exists gen_table; -create table gen_table ( - table_id bigint(20) not null auto_increment comment '编号', - table_name varchar(200) default '' comment '表名称', - table_comment varchar(500) default '' comment '表描述', - class_name varchar(100) default '' comment '实体类名称', - tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)', - package_name varchar(100) comment '生成包路径', - module_name varchar(30) comment '生成模块名', - business_name varchar(30) comment '生成业务名', - function_name varchar(50) comment '生成功能名', - function_author varchar(50) comment '生成功能作者', - gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)', - gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)', - options varchar(1000) comment '其它生成选项', - create_by varchar(64) default '' comment '创建者', - create_time datetime comment '创建时间', - update_by varchar(64) default '' comment '更新者', - update_time datetime comment '更新时间', - remark varchar(500) default null comment '备注', - primary key (table_id) -) engine=innodb auto_increment=1 comment = '代码生成业务表'; - - --- ---------------------------- --- 19、代码生成业务表字段 --- ---------------------------- -drop table if exists gen_table_column; -create table gen_table_column ( - column_id bigint(20) not null auto_increment comment '编号', - table_id varchar(64) comment '归属表编号', - column_name varchar(200) comment '列名称', - column_comment varchar(500) comment '列描述', - column_type varchar(100) comment '列类型', - java_type varchar(500) comment 'JAVA类型', - java_field varchar(200) comment 'JAVA字段名', - is_pk char(1) comment '是否主键(1是)', - is_increment char(1) comment '是否自增(1是)', - is_required char(1) comment '是否必填(1是)', - is_insert char(1) comment '是否为插入字段(1是)', - is_edit char(1) comment '是否编辑字段(1是)', - is_list char(1) comment '是否列表字段(1是)', - is_query char(1) comment '是否查询字段(1是)', - query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)', - html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', - dict_type varchar(200) default '' comment '字典类型', - sort int comment '排序', - create_by varchar(64) default '' comment '创建者', - create_time datetime comment '创建时间', - update_by varchar(64) default '' comment '更新者', - update_time datetime comment '更新时间', - primary key (column_id) -) engine=innodb auto_increment=1 comment = '代码生成业务表字段'; \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java b/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java index b9adcc3f1..1238abe1e 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java +++ b/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyDefine.java @@ -1,5 +1,6 @@ package cn.iocoder.dashboard.framework.redis.core; +import com.fasterxml.jackson.annotation.JsonValue; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; @@ -14,15 +15,23 @@ import java.time.Duration; @Data public class RedisKeyDefine { + @Getter + @AllArgsConstructor public enum KeyTypeEnum { - STRING, - LIST, - HASH, - SET, - ZSET, - STREAM, - PUBSUB + STRING("String"), + LIST("List"), + HASH("Hash"), + SET("Set"), + ZSET("Sorted Set"), + STREAM("Stream"), + PUBSUB("Pub/Sub"); + + /** + * 类型 + */ + @JsonValue + private final String type; } @@ -37,6 +46,7 @@ public class RedisKeyDefine { /** * 类型 */ + @JsonValue private final Integer type; } @@ -63,25 +73,29 @@ public class RedisKeyDefine { * 过期时间 */ private final Duration timeout; + /** + * 备注 + */ + private final String memo; - public RedisKeyDefine(String keyTemplate, KeyTypeEnum keyType, Class valueType, Duration timeout) { + private RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, + TimeoutTypeEnum timeoutType, Duration timeout) { + this.memo = memo; this.keyTemplate = keyTemplate; this.keyType = keyType; this.valueType = valueType; - this.timeoutType = TimeoutTypeEnum.FIXED; this.timeout = timeout; + this.timeoutType = timeoutType; // 添加注册表 RedisKeyRegistry.add(this); } - public RedisKeyDefine(String keyTemplate, KeyTypeEnum keyType, Class valueType, TimeoutTypeEnum timeoutType) { - this.keyTemplate = keyTemplate; - this.keyType = keyType; - this.valueType = valueType; - this.timeoutType = timeoutType; - this.timeout = Duration.ZERO; - // 添加注册表 - RedisKeyRegistry.add(this); + public RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, Duration timeout) { + this(memo, keyTemplate, keyType, valueType, TimeoutTypeEnum.FIXED, timeout); + } + + public RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, TimeoutTypeEnum timeoutType) { + this(memo, keyTemplate, keyType, valueType, timeoutType, Duration.ZERO); } } diff --git a/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyRegistry.java b/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyRegistry.java index 4a220fbd0..6da1a362a 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyRegistry.java +++ b/src/main/java/cn/iocoder/dashboard/framework/redis/core/RedisKeyRegistry.java @@ -8,6 +8,9 @@ import java.util.List; */ public class RedisKeyRegistry { + /** + * Redis RedisKeyDefine 数组 + */ private static final List defines = new ArrayList<>(); public static void add(RedisKeyDefine define) { diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java index b40f95aea..8a88597c2 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java @@ -1,25 +1,28 @@ package cn.iocoder.dashboard.modules.infra.controller.redis; -import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.pojo.CommonResult; +import cn.iocoder.dashboard.framework.redis.core.RedisKeyDefine; import cn.iocoder.dashboard.framework.redis.core.RedisKeyRegistry; import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisKeyRespVO; import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; +import cn.iocoder.dashboard.modules.infra.convert.redis.RedisConvert; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.data.redis.connection.RedisServerCommands; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.ArrayList; import java.util.List; import java.util.Properties; -import java.util.stream.Collectors; import static cn.iocoder.dashboard.common.pojo.CommonResult.success; +@Api("Redis 监控 API") @RestController @RequestMapping("/infra/redis") public class RedisController { @@ -27,7 +30,8 @@ public class RedisController { @Resource private StringRedisTemplate stringRedisTemplate; -// @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") + @ApiOperation("获得 Redis 监控信息") + @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") @GetMapping("/get-monitor-info") public CommonResult getRedisMonitorInfo() { // 获得 Redis 统计信息 @@ -36,33 +40,16 @@ public class RedisController { Properties commandStats = stringRedisTemplate.execute(( RedisCallback) connection -> connection.info("commandstats")); assert commandStats != null; // 断言,避免警告 - // 拼接结果返回 - InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize) - .commandStats(new ArrayList<>(commandStats.size())).build(); - commandStats.forEach((key, value) -> { - respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder() - .command(StrUtil.subAfter((String) key, "cmdstat_", false)) - .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) - .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) - .build()); - }); - return success(respVO); + return success(RedisConvert.INSTANCE.build(info, dbSize, commandStats)); } -// @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") + @ApiOperation("获得 Redis Key 列表") + @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") @GetMapping("/get-key-list") public CommonResult> getKeyList() { - List respVOList = RedisKeyRegistry.list().stream() - .map(define -> InfRedisKeyRespVO.builder() - .keyTemplate(define.getKeyTemplate()) - .keyType(define.getKeyType().name()) - .valueType(define.getValueType().getName()) - .timeoutType(define.getTimeoutType().getType()) - .timeout((int) define.getTimeout().getSeconds()) - .build()) - .collect(Collectors.toList()); - return success(respVOList); + List keyDefines = RedisKeyRegistry.list(); + return success(RedisConvert.INSTANCE.convertList(keyDefines)); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java index 666188d84..d62297c7d 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisKeyRespVO.java @@ -1,33 +1,36 @@ package cn.iocoder.dashboard.modules.infra.controller.redis.vo; +import cn.iocoder.dashboard.framework.redis.core.RedisKeyDefine; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import java.time.Duration; + +@ApiModel("Redis Key 信息 Response VO") @Data @Builder @AllArgsConstructor public class InfRedisKeyRespVO { - /** - * Key 模板 - */ - private final String keyTemplate; - /** - * Key 类型的枚举 - */ - private final String keyType; - /** - * Value 类型 - */ - private final String valueType; - /** - * 超时类型 - */ - private final Integer timeoutType; - /** - * 过期时间 - */ - private final Integer timeout; + @ApiModelProperty(value = "login_user:%s", required = true, example = "String") + private String keyTemplate; + + @ApiModelProperty(value = "Key 类型的枚举", required = true, example = "String") + private RedisKeyDefine.KeyTypeEnum keyType; + + @ApiModelProperty(value = "Value 类型", required = true, example = "java.lang.String") + private Class valueType; + + @ApiModelProperty(value = "超时类型", required = true, example = "1") + private RedisKeyDefine.TimeoutTypeEnum timeoutType; + + @ApiModelProperty(value = "过期时间,单位:毫秒", required = true, example = "1024") + private Duration timeout; + + @ApiModelProperty(value = "备注", required = true, example = "啦啦啦啦~") + private String memo; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java index ea9517e43..35389c7f5 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java @@ -1,5 +1,7 @@ package cn.iocoder.dashboard.modules.infra.controller.redis.vo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -7,26 +9,34 @@ import lombok.Data; import java.util.List; import java.util.Properties; +@ApiModel("Redis 监控信息 Response VO") @Data @Builder @AllArgsConstructor public class InfRedisMonitorRespVO { + @ApiModelProperty(value = "Redis info 指令结果", required = true, notes = "具体字段,查看 Redis 文档") private Properties info; + @ApiModelProperty(value = "Redis key 数量", required = true, example = "1024") private Long dbSize; - private List commandStats; + @ApiModelProperty(value = "CommandStat 数组", required = true) + private List commandStats; + @ApiModel("Redis 命令统计结果") @Data @Builder @AllArgsConstructor public static class CommandStat { + @ApiModelProperty(value = "Redis 命令", required = true, example = "get") private String command; + @ApiModelProperty(value = "调用次数", required = true, example = "1024") private Integer calls; + @ApiModelProperty(value = "消耗 CPU 秒数", required = true, example = "666") private Integer usec; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java b/src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java new file mode 100644 index 000000000..b4ae4e20f --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/convert/redis/RedisConvert.java @@ -0,0 +1,34 @@ +package cn.iocoder.dashboard.modules.infra.convert.redis; + +import cn.hutool.core.util.StrUtil; +import cn.iocoder.dashboard.framework.redis.core.RedisKeyDefine; +import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisKeyRespVO; +import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +@Mapper +public interface RedisConvert { + + RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class); + + default InfRedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { + InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize) + .commandStats(new ArrayList<>(commandStats.size())).build(); + commandStats.forEach((key, value) -> { + respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder() + .command(StrUtil.subAfter((String) key, "cmdstat_", false)) + .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) + .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) + .build()); + }); + return respVO; + } + + List convertList(List list); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java index c5ca44578..aa0b1d828 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/RedisKeyConstants.java @@ -14,20 +14,12 @@ import static cn.iocoder.dashboard.framework.redis.core.RedisKeyDefine.KeyTypeEn */ public interface RedisKeyConstants { - /** - * {@link LoginUser} 的缓存 - * - * key 的 format 的参数是 sessionId - */ - RedisKeyDefine LOGIN_USER = new RedisKeyDefine("login_user:%s", STRING, LoginUser.class, - Duration.ofMinutes(30)); + RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登陆用户的缓存", + "login_user:%s", // 参数为 sessionId + STRING, LoginUser.class, Duration.ofMinutes(30)); - /** - * 验证码的缓存 - * - * key 的 format 的参数是 uuid - */ - RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("captcha_code:%s", STRING, String.class, - RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存", + "captcha_code:%s", // 参数为 uuid + STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 7bdb1200a..ff060b164 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -34,8 +34,10 @@ spring: # Jackson 配置项 jackson: serialization: - write-dates-as-timestamps: true # 设置时间的格式,使用时间戳 + write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 + write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 + fail-on-empty-beans: false # 允许序列化无属性的 Bean # 芋道配置项,设置当前项目所有自定义的配置 yudao: From b557251b6f3e0040679409af8d289c8e3ed3e97a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 Jan 2021 01:16:54 +0800 Subject: [PATCH 002/167] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitor/ISysUserOnlineService.java | 48 ----------- .../web/controller/monitor/SysUserOnline.java | 49 ----------- .../monitor/SysUserOnlineServiceImpl.java | 86 ------------------- .../src/main/resources/application.yml | 22 ----- .../controller/auth/SysAuthController.java | 8 +- .../auth/vo/{ => auth}/SysAuthLoginReqVO.java | 2 +- .../vo/{ => auth}/SysAuthLoginRespVO.java | 2 +- .../auth/vo/{ => auth}/SysAuthMenuRespVO.java | 2 +- .../SysAuthPermissionInfoRespVO.java | 2 +- .../vo/session/SysUserSessionPageReqVO.java | 12 +++ .../system/convert/auth/SysAuthConvert.java | 4 +- .../mysql/dao/auth/SysUserOnlineMapper.java | 7 ++ .../dataobject/auth/SysUserSessionDO.java | 38 ++++++++ .../service/auth/SysUserOnlineService.java | 40 +++++++++ 14 files changed, 107 insertions(+), 215 deletions(-) delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ISysUserOnlineService.java delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnline.java delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineServiceImpl.java rename src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/{ => auth}/SysAuthLoginReqVO.java (95%) rename src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/{ => auth}/SysAuthLoginRespVO.java (86%) rename src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/{ => auth}/SysAuthMenuRespVO.java (94%) rename src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/{ => auth}/SysAuthPermissionInfoRespVO.java (94%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserOnlineMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserOnlineService.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ISysUserOnlineService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ISysUserOnlineService.java deleted file mode 100644 index 8eb5448cd..000000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ISysUserOnlineService.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ruoyi.system.service; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.system.domain.SysUserOnline; - -/** - * 在线用户 服务层 - * - * @author ruoyi - */ -public interface ISysUserOnlineService -{ - /** - * 通过登录地址查询信息 - * - * @param ipaddr 登录地址 - * @param user 用户信息 - * @return 在线用户信息 - */ - public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); - - /** - * 通过用户名称查询信息 - * - * @param userName 用户名称 - * @param user 用户信息 - * @return 在线用户信息 - */ - public SysUserOnline selectOnlineByUserName(String userName, LoginUser user); - - /** - * 通过登录地址/用户名称查询信息 - * - * @param ipaddr 登录地址 - * @param userName 用户名称 - * @param user 用户信息 - * @return 在线用户信息 - */ - public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); - - /** - * 设置在线用户信息 - * - * @param user 用户信息 - * @return 在线用户 - */ - public SysUserOnline loginUserToUserOnline(LoginUser user); -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnline.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnline.java deleted file mode 100644 index 86bbb2daf..000000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnline.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.ruoyi.system.domain; - -/** - * 当前在线会话 - * - * @author ruoyi - */ -public class SysUserOnline { - /** - * 会话编号 - */ - private String tokenId; - - /** - * 部门名称 - */ - private String deptName; - - /** - * 用户名称 - */ - private String userName; - - /** - * 登录IP地址 - */ - private String ipaddr; - - /** - * 登录地址 - */ - private String loginLocation; - - /** - * 浏览器类型 - */ - private String browser; - - /** - * 操作系统 - */ - private String os; - - /** - * 登录时间 - */ - private Long loginTime; - -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineServiceImpl.java deleted file mode 100644 index f0a299826..000000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.ruoyi.system.service.impl; - -import org.springframework.stereotype.Service; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.domain.SysUserOnline; -import com.ruoyi.system.service.ISysUserOnlineService; - -/** - * 在线用户 服务层处理 - * - * @author ruoyi - */ -@Service -public class SysUserOnlineServiceImpl implements ISysUserOnlineService { - /** - * 通过登录地址查询信息 - * - * @param ipaddr 登录地址 - * @param user 用户信息 - * @return 在线用户信息 - */ - @Override - public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) { - if (StringUtils.equals(ipaddr, user.getIpaddr())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 通过用户名称查询信息 - * - * @param userName 用户名称 - * @param user 用户信息 - * @return 在线用户信息 - */ - @Override - public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) { - if (StringUtils.equals(userName, user.getUsername())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 通过登录地址/用户名称查询信息 - * - * @param ipaddr 登录地址 - * @param userName 用户名称 - * @param user 用户信息 - * @return 在线用户信息 - */ - @Override - public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) { - if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 设置在线用户信息 - * - * @param user 用户信息 - * @return 在线用户 - */ - @Override - public SysUserOnline loginUserToUserOnline(LoginUser user) { - if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) { - return null; - } - SysUserOnline sysUserOnline = new SysUserOnline(); - sysUserOnline.setTokenId(user.getToken()); - sysUserOnline.setUserName(user.getUsername()); - sysUserOnline.setIpaddr(user.getIpaddr()); - sysUserOnline.setLoginLocation(user.getLoginLocation()); - sysUserOnline.setBrowser(user.getBrowser()); - sysUserOnline.setOs(user.getOs()); - sysUserOnline.setLoginTime(user.getLoginTime()); - if (StringUtils.isNotNull(user.getUser().getDept())) { - sysUserOnline.setDeptName(user.getUser().getDept().getDeptName()); - } - return sysUserOnline; - } -} diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 8bc9dd382..afb292bcf 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -47,28 +47,6 @@ spring: restart: # 热部署开关 enabled: true - # redis 配置 - redis: - # 地址 - host: 127.0.0.1 - # 端口,默认为6379 - port: 6379 - # 数据库索引 - database: 0 - # 密码 - password: - # 连接超时时间 - timeout: 10s - lettuce: - pool: - # 连接池中的最小空闲连接 - min-idle: 0 - # 连接池中的最大空闲连接 - max-idle: 8 - # 连接池的最大数据库连接数 - max-active: 8 - # #连接池最大阻塞等待时间(使用负值表示没有限制) - max-wait: -1ms # 防止XSS攻击 xss: diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java index bc986410b..71810f447 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java @@ -3,10 +3,10 @@ package cn.iocoder.dashboard.modules.system.controller.auth; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginRespVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthLoginReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java similarity index 95% rename from src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthLoginReqVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java index af9753534..e3842acd7 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthLoginReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo; +package cn.iocoder.dashboard.modules.system.controller.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthLoginRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java similarity index 86% rename from src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthLoginRespVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java index 5a1caeb6e..47e0872aa 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthLoginRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthLoginRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo; +package cn.iocoder.dashboard.modules.system.controller.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthMenuRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java similarity index 94% rename from src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthMenuRespVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java index 140c5b07a..28eadb40c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthMenuRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthMenuRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo; +package cn.iocoder.dashboard.modules.system.controller.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthPermissionInfoRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java similarity index 94% rename from src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthPermissionInfoRespVO.java rename to src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java index c8594c446..c4cfa8bb0 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthPermissionInfoRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.dashboard.modules.system.controller.auth.vo; +package cn.iocoder.dashboard.modules.system.controller.auth.vo.auth; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java new file mode 100644 index 000000000..e91198877 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java @@ -0,0 +1,12 @@ +package cn.iocoder.dashboard.modules.system.controller.auth.vo.session; + +import cn.iocoder.dashboard.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("在线用户 Session 分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class SysUserSessionPageReqVO extends PageParam { +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java index 6de7458c2..d36a37828 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java @@ -1,8 +1,8 @@ package cn.iocoder.dashboard.modules.system.convert.auth; import cn.iocoder.dashboard.framework.security.core.LoginUser; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserOnlineMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserOnlineMapper.java new file mode 100644 index 000000000..fdc317a39 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserOnlineMapper.java @@ -0,0 +1,7 @@ +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.auth; + +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface SysUserOnlineMapper extends BaseMapper { +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java new file mode 100644 index 000000000..3964ef9c6 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java @@ -0,0 +1,38 @@ +package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth; + +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 在线用户表 + */ +@TableName(value = "sys_user_session", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +public class SysUserSessionDO extends BaseDO { + + /** + * 会话编号, 即 sessionId + */ + @TableId + private String id; + /** + * 用户编号 + * + * 外键 {@link SysUserDO#getId()} + */ + private Long userId; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserOnlineService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserOnlineService.java new file mode 100644 index 000000000..62198809a --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserOnlineService.java @@ -0,0 +1,40 @@ +package cn.iocoder.dashboard.modules.system.service.auth; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; + +import java.util.Date; + +/** + * 在线用户 Session Service 接口 + */ +public interface SysUserOnlineService { + + /** + * 创建在线用户 Session + * + * @param sessionId Session 编号 + * @param userId 用户编号 + * @param userIp 用户 IP + * @param userAgent 用户 UA + */ + void createUserOnline(String sessionId, Long userId, String userIp, String userAgent); + + /** + * 更新在线用户 Session 的更新时间 + * + * @param sessionId Session 编号 + * @param updateTime 更新时间 + */ + void updateUserOnlineUpdateTime(String sessionId, Date updateTime); + + /** + * 获得在线用户分页列表 + * + * @param reqVO 分页条件 + * @return 份额与列表 + */ + PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO); + +} From ab94fe2d4b1ec7593b684056d33efd83b2a08258 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 Jan 2021 22:47:03 +0800 Subject: [PATCH 003/167] =?UTF-8?q?=E5=B0=86=20LoginUser=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E5=88=B0=20UserSessionService=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=B1=87=E6=80=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 -- .../main/java/com/ruoyi/RuoYiApplication.java | 30 ------ .../monitor/SysUserOnlineController.java | 92 ------------------- .../META-INF/spring-devtools.properties | 1 - .../src/main/resources/application.yml | 14 --- .../mybatis/core/dataobject/BaseDO.java | 3 - .../controller/auth/SysAuthController.java | 4 +- .../auth/SysUserSessionController.java | 49 ++++++++++ .../session/SysUserSessionPageItemRespVO.java | 36 ++++++++ .../vo/session/SysUserSessionPageReqVO.java | 11 +++ ...eMapper.java => SysUserSessionMapper.java} | 4 +- .../dataobject/auth/SysUserSessionDO.java | 9 ++ .../system/service/auth/SysAuthService.java | 11 ++- .../system/service/auth/SysTokenService.java | 30 ------ .../service/auth/SysUserOnlineService.java | 40 -------- .../service/auth/SysUserSessionService.java | 63 +++++++++++++ .../service/auth/impl/SysAuthServiceImpl.java | 72 +++------------ .../auth/impl/SysTokenServiceImpl.java | 58 ------------ .../auth/impl/SysUserSessionServiceImpl.java | 89 ++++++++++++++++++ src/main/resources/application.yaml | 1 + .../src => src}/main/resources/banner.txt | 49 +++++----- 21 files changed, 314 insertions(+), 359 deletions(-) delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java delete mode 100644 ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java rename src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/{SysUserOnlineMapper.java => SysUserSessionMapper.java} (61%) delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysTokenService.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserOnlineService.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysTokenServiceImpl.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java rename {ruoyi-admin/src => src}/main/resources/banner.txt (95%) diff --git a/pom.xml b/pom.xml index 39f97ab43..0f26eb5fc 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,6 @@ 1.16.14 1.4.1.Final - 0.9.1 5.5.6 2.2.7 @@ -177,12 +176,6 @@ ${lombok.version} - - io.jsonwebtoken - jjwt - ${jjwt.version} - - org.projectlombok lombok diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java deleted file mode 100644 index e3c56ee54..000000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ruoyi; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; - -/** - * 启动程序 - * - * @author ruoyi - */ -@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) -public class RuoYiApplication -{ - public static void main(String[] args) - { - // System.setProperty("spring.devtools.restart.enabled", "false"); - SpringApplication.run(RuoYiApplication.class, args); - System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" + - " .-------. ____ __ \n" + - " | _ _ \\ \\ \\ / / \n" + - " | ( ' ) | \\ _. / ' \n" + - " |(_ o _) / _( )_ .' \n" + - " | (_,_).' __ ___(_ o _)' \n" + - " | |\\ \\ | || |(_,_)' \n" + - " | | \\ `' /| `-' / \n" + - " | | \\ / \\ / \n" + - " ''-' `'-' `-..-' "); - } -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java deleted file mode 100644 index 4ca306d70..000000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.ruoyi.web.controller.monitor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.domain.SysUserOnline; -import com.ruoyi.system.service.ISysUserOnlineService; - -/** - * 在线用户监控 - * - * @author ruoyi - */ -@RestController -@RequestMapping("/monitor/online") -public class SysUserOnlineController extends BaseController -{ - @Autowired - private ISysUserOnlineService userOnlineService; - - @Autowired - private RedisCache redisCache; - - @PreAuthorize("@ss.hasPermi('monitor:online:list')") - @GetMapping("/list") - public TableDataInfo list(String ipaddr, String userName) - { - Collection keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*"); - List userOnlineList = new ArrayList(); - for (String key : keys) - { - LoginUser user = redisCache.getCacheObject(key); - if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) - { - if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) - { - userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); - } - } - else if (StringUtils.isNotEmpty(ipaddr)) - { - if (StringUtils.equals(ipaddr, user.getIpaddr())) - { - userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); - } - } - else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) - { - if (StringUtils.equals(userName, user.getUsername())) - { - userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); - } - } - else - { - userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); - } - } - Collections.reverse(userOnlineList); - userOnlineList.removeAll(Collections.singleton(null)); - return getDataTable(userOnlineList); - } - - /** - * 强退用户 - */ - @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") - @Log(title = "在线用户", businessType = BusinessType.FORCE) - @DeleteMapping("/{tokenId}") - public AjaxResult forceLogout(@PathVariable String tokenId) - { - redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); - return AjaxResult.success(); - } -} diff --git a/ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties b/ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties deleted file mode 100644 index 2b23f85a3..000000000 --- a/ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties +++ /dev/null @@ -1 +0,0 @@ -restart.include.json=/com.alibaba.fastjson.*.jar \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index afb292bcf..e2c99b186 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -34,20 +34,6 @@ logging: com.ruoyi: debug org.springframework: warn -# Spring配置 -spring: - # 资源信息 - messages: - # 国际化资源文件路径 - basename: i18n/messages - profiles: - active: druid - # 服务模块 - devtools: - restart: - # 热部署开关 - enabled: true - # 防止XSS攻击 xss: # 过滤开关 diff --git a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/dataobject/BaseDO.java b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/dataobject/BaseDO.java index c0fcda207..c65eaf6dd 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/dataobject/BaseDO.java +++ b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/dataobject/BaseDO.java @@ -34,7 +34,4 @@ public class BaseDO implements Serializable { @TableLogic private Integer deleted; -// /** 备注 */ TODO 思考下,怎么解决 -// private String remark; - } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java index 71810f447..026fa2aed 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java @@ -28,6 +28,8 @@ import java.util.List; import static cn.iocoder.dashboard.common.pojo.CommonResult.success; import static cn.iocoder.dashboard.framework.security.core.util.SecurityUtils.getLoginUserId; import static cn.iocoder.dashboard.framework.security.core.util.SecurityUtils.getLoginUserRoleIds; +import static cn.iocoder.dashboard.util.servlet.ServletUtils.getClientIP; +import static cn.iocoder.dashboard.util.servlet.ServletUtils.getUserAgent; @Api("认证 API") @RestController @@ -47,7 +49,7 @@ public class SysAuthController { @PostMapping("/login") @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 public CommonResult login(@RequestBody @Valid SysAuthLoginReqVO reqVO) { - String token = authService.login(reqVO.getUsername(), reqVO.getPassword(), reqVO.getUuid(), reqVO.getCode()); + String token = authService.login(reqVO, getClientIP(), getUserAgent()); // 返回结果 return success(SysAuthLoginRespVO.builder().token(token).build()); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java new file mode 100644 index 000000000..f366e0d29 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java @@ -0,0 +1,49 @@ +package cn.iocoder.dashboard.modules.system.controller.auth; + +import cn.iocoder.dashboard.common.pojo.CommonResult; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; +import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +import static cn.iocoder.dashboard.common.pojo.CommonResult.success; + +@Api("用户 Session API") +@RestController +@RequestMapping("/user-session") +public class SysUserSessionController { + + @Resource + private SysUserSessionService userSessionService; + + @ApiOperation("获得 Session 分页列表") + @PreAuthorize("@ss.hasPermission('system:user-session:page')") + @GetMapping("/page") + public CommonResult> getUserSessionPage(@Validated SysUserSessionPageReqVO reqVO) { + // 获得 Session 分页 + PageResult sessionPage = userSessionService.getUserSessionPage(reqVO); + + // + return null; + } + + @ApiOperation("删除 Session") + @PreAuthorize("@ss.hasPermission('system:user-session:delete')") + @DeleteMapping("/delete") + @ApiImplicitParam(name = "id", value = "Session 编号", required = true, dataTypeClass = String.class, + example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") + public CommonResult delete(@RequestParam("id") String id) { + userSessionService.deleteUserSession(id); + return success(true); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java new file mode 100644 index 000000000..adf1f9459 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.dashboard.modules.system.controller.auth.vo.session; + +import cn.iocoder.dashboard.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@ApiModel(value = "用户在线 Session Response VO", description = "相比用户基本信息来说,会多部门、用户账号等信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserSessionPageItemRespVO extends PageParam { + + @ApiModelProperty(value = "Session 编号", required = true, example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") + private String id; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + private String userIp; + + @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") + private String userAgent; + + @ApiModelProperty(value = "登陆时间", required = true) + private String createTime; + + @ApiModelProperty(value = "用户账号", required = true, example = "yudao") + private String username; + + @ApiModelProperty(value = "部门名称", example = "研发部") + private String deptName; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java index e91198877..2b27b867f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java @@ -2,11 +2,22 @@ package cn.iocoder.dashboard.modules.system.controller.auth.vo.session; import cn.iocoder.dashboard.common.pojo.PageParam; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotEmpty; + @ApiModel("在线用户 Session 分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) public class SysUserSessionPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模糊匹配") + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") + private String username; + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserOnlineMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserSessionMapper.java similarity index 61% rename from src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserOnlineMapper.java rename to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserSessionMapper.java index fdc317a39..51aed9dbb 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserOnlineMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserSessionMapper.java @@ -2,6 +2,8 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dao.auth; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; -public interface SysUserOnlineMapper extends BaseMapper { +@Mapper +public interface SysUserSessionMapper extends BaseMapper { } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java index 3964ef9c6..1efda9b85 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java @@ -1,17 +1,26 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; /** * 在线用户表 + * + * 我们已经将 {@link LoginUser} 缓存在 Redis 当中。 + * 这里额外存储在线用户到 MySQL 中,目的是为了方便管理界面可以灵活查询。 + * 同时,通过定时轮询 SysUserSessionDO 表,可以主动删除 Redis 的缓存,因为 Redis 的过期删除是延迟的。 + * + * @author 芋道源码 */ @TableName(value = "sys_user_session", autoResultMap = true) @Data +@Builder @EqualsAndHashCode(callSuper = true) public class SysUserSessionDO extends BaseDO { diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java index d1c0580e4..04eb6d968 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java @@ -1,6 +1,7 @@ package cn.iocoder.dashboard.modules.system.service.auth; import cn.iocoder.dashboard.framework.security.core.service.SecurityAuthFrameworkService; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; /** * 认证 Service 接口 @@ -11,6 +12,14 @@ import cn.iocoder.dashboard.framework.security.core.service.SecurityAuthFramewor */ public interface SysAuthService extends SecurityAuthFrameworkService { - String login(String username, String password, String captchaUUID, String captchaCode); + /** + * 登陆用户 + * + * @param reqVO 登陆信息 + * @param userIp 用户 IP + * @param userAgent 用户 UA + * @return 身份令牌,使用 JWT 方式 + */ + String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysTokenService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysTokenService.java deleted file mode 100644 index c1f8c8d91..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysTokenService.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth; - -import io.jsonwebtoken.Claims; - -import java.util.Map; - -/** - * Token Service 接口 - * - * 提供访问 Token 令牌,目前基于 JWT 实现 - */ -public interface SysTokenService { - - /** - * 创建 Token - * - * @param subject 主体 - * @return Token 字符串 - */ - String createToken(String subject); - - /** - * 解析 Token,返回 claims 数据声明 - * - * @param token Token - * @return claims - */ - Claims parseToken(String token); - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserOnlineService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserOnlineService.java deleted file mode 100644 index 62198809a..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserOnlineService.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth; - -import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; - -import java.util.Date; - -/** - * 在线用户 Session Service 接口 - */ -public interface SysUserOnlineService { - - /** - * 创建在线用户 Session - * - * @param sessionId Session 编号 - * @param userId 用户编号 - * @param userIp 用户 IP - * @param userAgent 用户 UA - */ - void createUserOnline(String sessionId, Long userId, String userIp, String userAgent); - - /** - * 更新在线用户 Session 的更新时间 - * - * @param sessionId Session 编号 - * @param updateTime 更新时间 - */ - void updateUserOnlineUpdateTime(String sessionId, Date updateTime); - - /** - * 获得在线用户分页列表 - * - * @param reqVO 分页条件 - * @return 份额与列表 - */ - PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO); - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java new file mode 100644 index 000000000..f22152a3a --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionService.java @@ -0,0 +1,63 @@ +package cn.iocoder.dashboard.modules.system.service.auth; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.security.core.LoginUser; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; + +/** + * 在线用户 Session Service 接口 + * + * @author 芋道源码 + */ +public interface SysUserSessionService { + + /** + * 创建在线用户 Session + * + * @param loginUser 登陆用户 + * @param userIp 用户 IP + * @param userAgent 用户 UA + * @return Session 编号 + */ + String createUserSession(LoginUser loginUser, String userIp, String userAgent); + + /** + * 刷新在线用户 Session 的更新时间 + * + * @param sessionId Session 编号 + * @param loginUser 登陆用户 + */ + void refreshUserSession(String sessionId, LoginUser loginUser); + + /** + * 删除在线用户 Session + * + * @param sessionId Session 编号 + */ + void deleteUserSession(String sessionId); + + /** + * 获得 Session 编号对应的在线用户 + * + * @param sessionId Session 编号 + * @return 在线用户 + */ + LoginUser getLoginUser(String sessionId); + + /** + * 获得 Session 超时时间,单位:毫秒 + * + * @return 超时时间 + */ + Long getSessionTimeoutMillis(); + + /** + * 获得在线用户分页列表 + * + * @param reqVO 分页条件 + * @return 份额与列表 + */ + PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java index ce44b0a1e..e86af8c87 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java @@ -1,28 +1,22 @@ package cn.iocoder.dashboard.modules.system.service.auth.impl; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; -import cn.iocoder.dashboard.framework.security.config.SecurityProperties; import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; -import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO; import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum; import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; -import cn.iocoder.dashboard.modules.system.service.auth.SysTokenService; +import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; import cn.iocoder.dashboard.modules.system.service.common.SysCaptchaService; import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import cn.iocoder.dashboard.modules.system.service.user.SysUserService; -import cn.iocoder.dashboard.util.date.DateUtils; import cn.iocoder.dashboard.util.servlet.ServletUtils; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.JwtException; import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; @@ -37,7 +31,6 @@ import org.springframework.util.Assert; import javax.annotation.Resource; import java.util.Collections; -import java.util.Date; import java.util.Set; import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; @@ -52,11 +45,6 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; @Slf4j public class SysAuthServiceImpl implements SysAuthService { - @Resource - private SecurityProperties securityProperties; - - @Resource - private SysTokenService tokenService; @Resource private AuthenticationManager authenticationManager; @Resource @@ -67,9 +55,8 @@ public class SysAuthServiceImpl implements SysAuthService { private SysCaptchaService captchaService; @Resource private SysLoginLogService loginLogService; - @Resource - private SysLoginUserRedisDAO loginUserRedisDAO; + private SysUserSessionService userSessionService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { @@ -91,27 +78,21 @@ public class SysAuthServiceImpl implements SysAuthService { } // 创建 LoginUser 对象 LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user); - loginUser.setUpdateTime(new Date()); - loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); + loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表 return loginUser; } @Override - public String login(String username, String password, String captchaUUID, String captchaCode) { + public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) { // 判断验证码是否正确 - this.verifyCaptcha(username, captchaUUID, captchaCode); + this.verifyCaptcha(reqVO.getUsername(), reqVO.getUuid(), reqVO.getCode()); // 使用账号密码,进行登陆。 - LoginUser loginUser = this.login0(username, password); - // 缓存登陆用户到 Redis 中 - String sessionId = IdUtil.fastSimpleUUID(); - loginUser.setUpdateTime(new Date()); - loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); - loginUserRedisDAO.set(sessionId, loginUser); + LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); + loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表 - // 创建 Token - // 我们在返回给前端的 JWT 中,使用 sessionId 作为 subject 主体,标识当前 User 用户 - return tokenService.createToken(sessionId); + // 缓存登陆用户到 Redis 中,返回 sessionId 编号 + return userSessionService.createUserSession(loginUser, userIp, userAgent); } private void verifyCaptcha(String username, String captchaUUID, String captchaCode) { @@ -182,42 +163,20 @@ public class SysAuthServiceImpl implements SysAuthService { @Override public LoginUser verifyTokenAndRefresh(String token) { - // 验证 token 的有效性 - String sessionId = this.verifyToken(token); // 获得 LoginUser - LoginUser loginUser = loginUserRedisDAO.get(sessionId); + LoginUser loginUser = userSessionService.getLoginUser(token); if (loginUser == null) { return null; } // 刷新 LoginUser 缓存 - this.refreshLoginUserCache(sessionId, loginUser); + this.refreshLoginUserCache(token, loginUser); return loginUser; } - private String verifyToken(String token) { - Claims claims; - try { - claims = tokenService.parseToken(token); - } catch (JwtException jwtException) { - log.warn("[verifyToken][token({}) 解析发生异常]", token); - return null; - } - // token 已经过期 - if (DateUtils.isExpired(claims.getExpiration())) { - return null; - } - // 判断 sessionId 是否存在 - String sessionId = claims.getSubject(); - if (StrUtil.isBlank(sessionId)) { - return null; - } - return sessionId; - } - - private void refreshLoginUserCache(String sessionId, LoginUser loginUser) { + private void refreshLoginUserCache(String token, LoginUser loginUser) { // 每 1/3 的 Session 超时时间,刷新 LoginUser 缓存 if (System.currentTimeMillis() - loginUser.getUpdateTime().getTime() < - securityProperties.getSessionTimeout().toMillis() / 3) { + userSessionService.getSessionTimeoutMillis() / 3) { return; } @@ -229,9 +188,8 @@ public class SysAuthServiceImpl implements SysAuthService { // 刷新 LoginUser 缓存 loginUser.setDeptId(user.getDeptId()); - loginUser.setUpdateTime(new Date()); loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); - loginUserRedisDAO.set(sessionId, loginUser); + userSessionService.refreshUserSession(token, loginUser); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysTokenServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysTokenServiceImpl.java deleted file mode 100644 index 3b3112f60..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysTokenServiceImpl.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.iocoder.dashboard.modules.system.service.auth.impl; - -import cn.iocoder.dashboard.framework.security.config.SecurityProperties; -import cn.iocoder.dashboard.modules.system.service.auth.SysTokenService; -import cn.iocoder.dashboard.util.date.DateUtils; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.Map; - -/** - * Token Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class SysTokenServiceImpl implements SysTokenService { - - @Resource - private SecurityProperties securityProperties; - - @Override - public String createToken(String subject) { - return Jwts.builder() - .signWith(SignatureAlgorithm.HS512, securityProperties.getTokenSecret()) - .setExpiration(DateUtils.addTime(securityProperties.getTokenTimeout())) - .setSubject(subject) - .compact(); - } - - @Override - public Claims parseToken(String token) { - return Jwts.parser() - .setSigningKey(securityProperties.getTokenSecret()) - .parseClaimsJws(token) - .getBody(); - } - - public static void main(String[] args) { - String secret = "abcdefghijklmnopqrstuvwxyz"; - Map map = new HashMap<>(); - map.put("key1", "value1"); - System.out.println(Jwts.builder() - .signWith(SignatureAlgorithm.HS512, secret) - .setClaims(map) - .compact()); - - System.out.println(Jwts.parser() - .setSigningKey(secret) - .parseClaimsJws("qyJhbGciOiJIUzUxMiJ9.eyJrZXkxIjoidmFsdWUxIn0.AHWncLRBlJkqrKaoWHZmMgbqYIT7rfLs8KCp9LuC0mdNfnx1xEMm1N9bgcD-0lc5sjySqsKiWzqJ3rpoyUSh0g") - .getBody()); - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java new file mode 100644 index 000000000..6dda624c4 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java @@ -0,0 +1,89 @@ +package cn.iocoder.dashboard.modules.system.service.auth.impl; + +import cn.hutool.core.util.IdUtil; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.security.config.SecurityProperties; +import cn.iocoder.dashboard.framework.security.core.LoginUser; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.auth.SysUserSessionMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; +import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO; +import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * 在线用户 Session Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class SysUserSessionServiceImpl implements SysUserSessionService { + + @Resource + private SecurityProperties securityProperties; + + @Resource + private SysLoginUserRedisDAO loginUserRedisDAO; + + @Resource + private SysUserSessionMapper userSessionMapper; + + @Override + public String createUserSession(LoginUser loginUser, String userIp, String userAgent) { + // 生成 Session 编号 + String sessionId = generateSessionId(); + // 写入 Redis 缓存 + loginUser.setUpdateTime(new Date()); + loginUserRedisDAO.set(sessionId, loginUser); + // 写入 DB 中 + SysUserSessionDO userSession = SysUserSessionDO.builder().userId(loginUser.getId()) + .userIp(userIp).userAgent(userAgent).build(); + userSessionMapper.insert(userSession); + // 返回 Session 编号 + return sessionId; + } + + @Override + public void refreshUserSession(String sessionId, LoginUser loginUser) { + // 写入 Redis 缓存 + loginUser.setUpdateTime(new Date()); + loginUserRedisDAO.set(sessionId, loginUser); + // 更新 DB 中 + SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build(); + updateObj.setUpdateTime(new Date()); + userSessionMapper.updateById(updateObj); + } + + @Override + public void deleteUserSession(String sessionId) { + + } + + @Override + public LoginUser getLoginUser(String sessionId) { + return loginUserRedisDAO.get(sessionId); + } + + @Override + public Long getSessionTimeoutMillis() { + return securityProperties.getSessionTimeout().toMillis(); + } + + @Override + public PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO) { + return null; + } + + /** + * 生成 Session 编号,目前采用 UUID 算法 + * + * @return Session 编号 + */ + private static String generateSessionId() { + return IdUtil.fastSimpleUUID(); + } + +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index ff060b164..e313d6e47 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -41,6 +41,7 @@ spring: # 芋道配置项,设置当前项目所有自定义的配置 yudao: + version: 1.0.0 web: api-prefix: /api controller-package: cn.iocoder.dashboard diff --git a/ruoyi-admin/src/main/resources/banner.txt b/src/main/resources/banner.txt similarity index 95% rename from ruoyi-admin/src/main/resources/banner.txt rename to src/main/resources/banner.txt index 94662592f..d4e3b433b 100644 --- a/ruoyi-admin/src/main/resources/banner.txt +++ b/src/main/resources/banner.txt @@ -1,24 +1,25 @@ -Application Version: ${ruoyi.version} -Spring Boot Version: ${spring-boot.version} -//////////////////////////////////////////////////////////////////// -// _ooOoo_ // -// o8888888o // -// 88" . "88 // -// (| ^_^ |) // -// O\ = /O // -// ____/`---'\____ // -// .' \\| |// `. // -// / \\||| : |||// \ // -// / _||||| -:- |||||- \ // -// | | \\\ - /// | | // -// | \_| ''\---/'' | | // -// \ .-\__ `-` ___/-. / // -// ___`. .' /--.--\ `. . ___ // -// ."" '< `.___\_<|>_/___.' >'"". // -// | | : `- \`.;`\ _ /`;.`/ - ` : | | // -// \ \ `-. \_ __\ /__ _/ .-` / / // -// ========`-.____`-.___\_____/___.-`____.-'======== // -// `=---=' // -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // -// 佛祖保佑 永不宕机 永无BUG // -//////////////////////////////////////////////////////////////////// \ No newline at end of file +芋道源码 http://www.iocoder.cn +Application Version: ${yudao.version} +Spring Boot Version: ${spring-boot.version} +//////////////////////////////////////////////////////////////////// +// _ooOoo_ // +// o8888888o // +// 88" . "88 // +// (| ^_^ |) // +// O\ = /O // +// ____/`---'\____ // +// .' \\| |// `. // +// / \\||| : |||// \ // +// / _||||| -:- |||||- \ // +// | | \\\ - /// | | // +// | \_| ''\---/'' | | // +// \ .-\__ `-` ___/-. / // +// ___`. .' /--.--\ `. . ___ // +// ."" '< `.___\_<|>_/___.' >'"". // +// | | : `- \`.;`\ _ /`;.`/ - ` : | | // +// \ \ `-. \_ __\ /__ _/ .-` / / // +// ========`-.____`-.___\_____/___.-`____.-'======== // +// `=---=' // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +//////////////////////////////////////////////////////////////////// From 753c7678ee5a3da612e0b570c21aecd3447130c3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 30 Jan 2021 01:21:25 +0800 Subject: [PATCH 004/167] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=BB=E8=A6=81?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=20session=20=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common}/SwaggerController.java | 8 +- .../common/annotation}/DataScopeAspect.java | 290 +++++++++--------- .../common/annotation}/DataSourceAspect.java | 128 ++++---- .../{enums => annotation}/DataSourceType.java | 38 +-- .../common/annotation}/DynamicDataSource.java | 48 +-- .../DynamicDataSourceContextHolder.java | 82 ++--- .../com/ruoyi/common}/config/DruidConfig.java | 232 +++++++------- .../ruoyi/common}/config/FilterConfig.java | 116 +++---- .../ruoyi/common}/config/ResourcesConfig.java | 88 +++--- .../ruoyi/common}/config/ServerConfig.java | 60 ++-- .../common}/config/ThreadPoolConfig.java | 116 +++---- .../config/properties/DruidProperties.java | 150 ++++----- .../{annotation => filter}/RepeatSubmit.java | 42 +-- .../filter}/RepeatSubmitInterceptor.java | 98 +++--- .../filter}/SameUrlDataInterceptor.java | 228 +++++++------- .../src/main/resources/application-druid.yml | 112 +++---- .../src/main/resources/application.yml | 88 +++--- .../main/resources/i18n/messages.properties | 72 ++--- .../src/main/resources/logback.xml | 184 +++++------ .../{monitor/online.js => system/session.js} | 36 +-- .../online => system/session}/index.vue | 249 ++++++++------- .../auth/SysUserSessionController.java | 38 ++- .../session/SysUserSessionPageItemRespVO.java | 4 +- .../vo/session/SysUserSessionPageReqVO.java | 1 - .../convert/auth/SysUserSessionConvert.java | 16 + .../mysql/dao/auth/SysUserSessionMapper.java | 16 +- .../dal/mysql/dao/user/SysUserMapper.java | 4 + .../dataobject/auth/SysUserSessionDO.java | 3 +- .../redis/dao/auth/SysLoginUserRedisDAO.java | 4 +- .../modules/system/job/package-info.java | 1 + .../auth/impl/SysUserSessionServiceImpl.java | 30 +- .../system/service/user/SysUserService.java | 8 + .../service/user/SysUserServiceImpl.java | 5 + .../util/collection/CollectionUtils.java | 14 +- 34 files changed, 1349 insertions(+), 1260 deletions(-) rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor => ruoyi-common/src/main/java/com/ruoyi/common}/SwaggerController.java (85%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj => ruoyi-common/src/main/java/com/ruoyi/common/annotation}/DataScopeAspect.java (97%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj => ruoyi-common/src/main/java/com/ruoyi/common/annotation}/DataSourceAspect.java (96%) rename ruoyi-common/src/main/java/com/ruoyi/common/{enums => annotation}/DataSourceType.java (90%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework/datasource => ruoyi-common/src/main/java/com/ruoyi/common/annotation}/DynamicDataSource.java (96%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework/datasource => ruoyi-common/src/main/java/com/ruoyi/common/annotation}/DynamicDataSourceContextHolder.java (96%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework => ruoyi-common/src/main/java/com/ruoyi/common}/config/DruidConfig.java (97%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework => ruoyi-common/src/main/java/com/ruoyi/common}/config/FilterConfig.java (97%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework => ruoyi-common/src/main/java/com/ruoyi/common}/config/ResourcesConfig.java (97%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework => ruoyi-common/src/main/java/com/ruoyi/common}/config/ServerConfig.java (96%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework => ruoyi-common/src/main/java/com/ruoyi/common}/config/ThreadPoolConfig.java (97%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework => ruoyi-common/src/main/java/com/ruoyi/common}/config/properties/DruidProperties.java (97%) rename ruoyi-common/src/main/java/com/ruoyi/common/{annotation => filter}/RepeatSubmit.java (95%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor => ruoyi-common/src/main/java/com/ruoyi/common/filter}/RepeatSubmitInterceptor.java (97%) rename {ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl => ruoyi-common/src/main/java/com/ruoyi/common/filter}/SameUrlDataInterceptor.java (97%) rename {ruoyi-admin => ruoyi-common}/src/main/resources/application-druid.yml (95%) rename {ruoyi-admin => ruoyi-common}/src/main/resources/application.yml (95%) rename {ruoyi-admin => ruoyi-common}/src/main/resources/i18n/messages.properties (98%) rename {ruoyi-admin => ruoyi-common}/src/main/resources/logback.xml (96%) rename ruoyi-ui/src/api/{monitor/online.js => system/session.js} (74%) rename ruoyi-ui/src/views/{monitor/online => system/session}/index.vue (62%) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SwaggerController.java b/ruoyi-common/src/main/java/com/ruoyi/common/SwaggerController.java similarity index 85% rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SwaggerController.java rename to ruoyi-common/src/main/java/com/ruoyi/common/SwaggerController.java index f66ca24ec..b79c15f4b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SwaggerController.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/SwaggerController.java @@ -8,17 +8,15 @@ import com.ruoyi.common.core.controller.BaseController; /** * swagger 接口 - * + * * @author ruoyi */ @Controller @RequestMapping("/tool/swagger") -public class SwaggerController extends BaseController -{ +public class SwaggerController extends BaseController { @PreAuthorize("@ss.hasPermi('tool:swagger:view')") @GetMapping() - public String index() - { + public String index() { return redirect("/swagger-ui.html"); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScopeAspect.java similarity index 97% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java rename to ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScopeAspect.java index 07abb1b04..cc01b9422 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScopeAspect.java @@ -1,145 +1,145 @@ -package com.ruoyi.framework.aspectj; - -import java.lang.reflect.Method; - -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.Signature; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.stereotype.Component; -import com.ruoyi.common.annotation.DataScope; -import com.ruoyi.common.core.domain.BaseEntity; -import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.spring.SpringUtils; -import com.ruoyi.framework.web.service.TokenService; - -/** - * 数据过滤处理 - * - * @author ruoyi - */ -@Aspect -@Component -public class DataScopeAspect { - /** - * 全部数据权限 - */ - public static final String DATA_SCOPE_ALL = "1"; - - /** - * 自定数据权限 - */ - public static final String DATA_SCOPE_CUSTOM = "2"; - - /** - * 部门数据权限 - */ - public static final String DATA_SCOPE_DEPT = "3"; - - /** - * 部门及以下数据权限 - */ - public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; - - /** - * 仅本人数据权限 - */ - public static final String DATA_SCOPE_SELF = "5"; - - /** - * 数据权限过滤关键字 - */ - public static final String DATA_SCOPE = "dataScope"; - - // 配置织入点 - @Pointcut("@annotation(com.ruoyi.common.annotation.DataScope)") - public void dataScopePointCut() { - } - - @Before("dataScopePointCut()") - public void doBefore(JoinPoint point) throws Throwable { - handleDataScope(point); - } - - protected void handleDataScope(final JoinPoint joinPoint) { - // 获得注解 - DataScope controllerDataScope = getAnnotationLog(joinPoint); - if (controllerDataScope == null) { - return; - } - // 获取当前的用户 - LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest()); - if (StringUtils.isNotNull(loginUser)) { - SysUser currentUser = loginUser.getUser(); - // 如果是超级管理员,则不过滤数据 - if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { - dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), - controllerDataScope.userAlias()); - } - } - } - - /** - * 数据范围过滤 - * - * @param joinPoint 切点 - * @param user 用户 - * @param userAlias 别名 - */ - public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) { - StringBuilder sqlString = new StringBuilder(); - - for (SysRole role : user.getRoles()) { - String dataScope = role.getDataScope(); - if (DATA_SCOPE_ALL.equals(dataScope)) { - sqlString = new StringBuilder(); - break; - } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { - sqlString.append(StringUtils.format( - " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, - role.getRoleId())); - } else if (DATA_SCOPE_DEPT.equals(dataScope)) { - sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); - } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { - sqlString.append(StringUtils.format( - " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", - deptAlias, user.getDeptId(), user.getDeptId())); - } else if (DATA_SCOPE_SELF.equals(dataScope)) { - if (StringUtils.isNotBlank(userAlias)) { - sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); - } else { - // 数据权限为仅本人且没有userAlias别名不查询任何数据 - sqlString.append(" OR 1=0 "); - } - } - } - - if (StringUtils.isNotBlank(sqlString.toString())) { - Object params = joinPoint.getArgs()[0]; - if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) params; - baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); - } - } - } - - /** - * 是否存在注解,如果存在就获取 - */ - private DataScope getAnnotationLog(JoinPoint joinPoint) { - Signature signature = joinPoint.getSignature(); - MethodSignature methodSignature = (MethodSignature) signature; - Method method = methodSignature.getMethod(); - - if (method != null) { - return method.getAnnotation(DataScope.class); - } - return null; - } -} +package com.ruoyi.framework.aspectj; + +import java.lang.reflect.Method; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.web.service.TokenService; + +/** + * 数据过滤处理 + * + * @author ruoyi + */ +@Aspect +@Component +public class DataScopeAspect { + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 数据权限过滤关键字 + */ + public static final String DATA_SCOPE = "dataScope"; + + // 配置织入点 + @Pointcut("@annotation(com.ruoyi.common.annotation.DataScope)") + public void dataScopePointCut() { + } + + @Before("dataScopePointCut()") + public void doBefore(JoinPoint point) throws Throwable { + handleDataScope(point); + } + + protected void handleDataScope(final JoinPoint joinPoint) { + // 获得注解 + DataScope controllerDataScope = getAnnotationLog(joinPoint); + if (controllerDataScope == null) { + return; + } + // 获取当前的用户 + LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest()); + if (StringUtils.isNotNull(loginUser)) { + SysUser currentUser = loginUser.getUser(); + // 如果是超级管理员,则不过滤数据 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias()); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param userAlias 别名 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) { + StringBuilder sqlString = new StringBuilder(); + + for (SysRole role : user.getRoles()) { + String dataScope = role.getDataScope(); + if (DATA_SCOPE_ALL.equals(dataScope)) { + sqlString = new StringBuilder(); + break; + } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, + role.getRoleId())); + } else if (DATA_SCOPE_DEPT.equals(dataScope)) { + sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); + } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", + deptAlias, user.getDeptId(), user.getDeptId())); + } else if (DATA_SCOPE_SELF.equals(dataScope)) { + if (StringUtils.isNotBlank(userAlias)) { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); + } else { + // 数据权限为仅本人且没有userAlias别名不查询任何数据 + sqlString.append(" OR 1=0 "); + } + } + } + + if (StringUtils.isNotBlank(sqlString.toString())) { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); + } + } + } + + /** + * 是否存在注解,如果存在就获取 + */ + private DataScope getAnnotationLog(JoinPoint joinPoint) { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + + if (method != null) { + return method.getAnnotation(DataScope.class); + } + return null; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSourceAspect.java similarity index 96% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java rename to ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSourceAspect.java index d3cdc4806..020493d2d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSourceAspect.java @@ -1,64 +1,64 @@ -package com.ruoyi.framework.aspectj; - -import java.util.Objects; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; -import com.ruoyi.common.annotation.DataSource; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; - -/** - * 多数据源处理 - * - * @author ruoyi - */ -@Aspect -@Order(1) -@Component -public class DataSourceAspect { - protected Logger logger = LoggerFactory.getLogger(getClass()); - - @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" - + "|| @within(com.ruoyi.common.annotation.DataSource)") - public void dsPointCut() { - - } - - @Around("dsPointCut()") - public Object around(ProceedingJoinPoint point) throws Throwable { - DataSource dataSource = getDataSource(point); - - if (StringUtils.isNotNull(dataSource)) { - DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); - } - - try { - return point.proceed(); - } finally { - // 销毁数据源 在执行方法之后 - DynamicDataSourceContextHolder.clearDataSourceType(); - } - } - - /** - * 获取需要切换的数据源 - */ - public DataSource getDataSource(ProceedingJoinPoint point) { - MethodSignature signature = (MethodSignature) point.getSignature(); - DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); - if (Objects.nonNull(dataSource)) { - return dataSource; - } - - return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); - } -} +package com.ruoyi.framework.aspectj; + +import java.util.Objects; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; + +/** + * 多数据源处理 + * + * @author ruoyi + */ +@Aspect +@Order(1) +@Component +public class DataSourceAspect { + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" + + "|| @within(com.ruoyi.common.annotation.DataSource)") + public void dsPointCut() { + + } + + @Around("dsPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + DataSource dataSource = getDataSource(point); + + if (StringUtils.isNotNull(dataSource)) { + DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); + } + + try { + return point.proceed(); + } finally { + // 销毁数据源 在执行方法之后 + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + + /** + * 获取需要切换的数据源 + */ + public DataSource getDataSource(ProceedingJoinPoint point) { + MethodSignature signature = (MethodSignature) point.getSignature(); + DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); + if (Objects.nonNull(dataSource)) { + return dataSource; + } + + return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSourceType.java similarity index 90% rename from ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java rename to ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSourceType.java index 4b5341d19..0d945be54 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSourceType.java @@ -1,19 +1,19 @@ -package com.ruoyi.common.enums; - -/** - * 数据源 - * - * @author ruoyi - */ -public enum DataSourceType -{ - /** - * 主库 - */ - MASTER, - - /** - * 从库 - */ - SLAVE -} +package com.ruoyi.common.enums; + +/** + * 数据源 + * + * @author ruoyi + */ +public enum DataSourceType +{ + /** + * 主库 + */ + MASTER, + + /** + * 从库 + */ + SLAVE +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynamicDataSource.java similarity index 96% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java rename to ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynamicDataSource.java index f12b1e543..f60b35cb6 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynamicDataSource.java @@ -1,24 +1,24 @@ -package com.ruoyi.framework.datasource; - -import java.util.Map; -import javax.sql.DataSource; - -import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; - -/** - * 动态数据源 - * - * @author ruoyi - */ -public class DynamicDataSource extends AbstractRoutingDataSource { - public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) { - super.setDefaultTargetDataSource(defaultTargetDataSource); - super.setTargetDataSources(targetDataSources); - super.afterPropertiesSet(); - } - - @Override - protected Object determineCurrentLookupKey() { - return DynamicDataSourceContextHolder.getDataSourceType(); - } -} +package com.ruoyi.framework.datasource; + +import java.util.Map; +import javax.sql.DataSource; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * 动态数据源 + * + * @author ruoyi + */ +public class DynamicDataSource extends AbstractRoutingDataSource { + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) { + super.setDefaultTargetDataSource(defaultTargetDataSource); + super.setTargetDataSources(targetDataSources); + super.afterPropertiesSet(); + } + + @Override + protected Object determineCurrentLookupKey() { + return DynamicDataSourceContextHolder.getDataSourceType(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynamicDataSourceContextHolder.java similarity index 96% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java rename to ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynamicDataSourceContextHolder.java index 962d50cb2..37a5f8e58 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DynamicDataSourceContextHolder.java @@ -1,41 +1,41 @@ -package com.ruoyi.framework.datasource; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * 数据源切换处理 - * - * @author ruoyi - */ -public class DynamicDataSourceContextHolder { - public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); - - /** - * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, - * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 - */ - private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); - - /** - * 设置数据源的变量 - */ - public static void setDataSourceType(String dsType) { - log.info("切换到{}数据源", dsType); - CONTEXT_HOLDER.set(dsType); - } - - /** - * 获得数据源的变量 - */ - public static String getDataSourceType() { - return CONTEXT_HOLDER.get(); - } - - /** - * 清空数据源变量 - */ - public static void clearDataSourceType() { - CONTEXT_HOLDER.remove(); - } -} +package com.ruoyi.framework.datasource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 数据源切换处理 + * + * @author ruoyi + */ +public class DynamicDataSourceContextHolder { + public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); + + /** + * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, + * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 + */ + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 设置数据源的变量 + */ + public static void setDataSourceType(String dsType) { + log.info("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); + } + + /** + * 获得数据源的变量 + */ + public static String getDataSourceType() { + return CONTEXT_HOLDER.get(); + } + + /** + * 清空数据源变量 + */ + public static void clearDataSourceType() { + CONTEXT_HOLDER.remove(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/DruidConfig.java similarity index 97% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java rename to ruoyi-common/src/main/java/com/ruoyi/common/config/DruidConfig.java index 512317ade..7e9f4b03f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/DruidConfig.java @@ -1,116 +1,116 @@ -package com.ruoyi.framework.config; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.sql.DataSource; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; -import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; -import com.alibaba.druid.util.Utils; -import com.ruoyi.common.enums.DataSourceType; -import com.ruoyi.common.utils.spring.SpringUtils; -import com.ruoyi.framework.config.properties.DruidProperties; -import com.ruoyi.framework.datasource.DynamicDataSource; - -/** - * druid 配置多数据源 - * - * @author ruoyi - */ -@Configuration -public class DruidConfig { - @Bean - @ConfigurationProperties("spring.datasource.druid.master") - public DataSource masterDataSource(DruidProperties druidProperties) { - DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); - return druidProperties.dataSource(dataSource); - } - - @Bean - @ConfigurationProperties("spring.datasource.druid.slave") - @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") - public DataSource slaveDataSource(DruidProperties druidProperties) { - DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); - return druidProperties.dataSource(dataSource); - } - - @Bean(name = "dynamicDataSource") - @Primary - public DynamicDataSource dataSource(DataSource masterDataSource) { - Map targetDataSources = new HashMap<>(); - targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); - setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); - return new DynamicDataSource(masterDataSource, targetDataSources); - } - - /** - * 设置数据源 - * - * @param targetDataSources 备选数据源集合 - * @param sourceName 数据源名称 - * @param beanName bean名称 - */ - public void setDataSource(Map targetDataSources, String sourceName, String beanName) { - try { - DataSource dataSource = SpringUtils.getBean(beanName); - targetDataSources.put(sourceName, dataSource); - } catch (Exception e) { - } - } - - /** - * 去除监控页面底部的广告 - */ - @SuppressWarnings({"rawtypes", "unchecked"}) - @Bean - @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") - public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) { - // 获取web监控页面的参数 - DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); - // 提取common.js的配置路径 - String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; - String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); - final String filePath = "support/http/resources/js/common.js"; - // 创建filter进行过滤 - Filter filter = new Filter() { - @Override - public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - chain.doFilter(request, response); - // 重置缓冲区,响应头不会被重置 - response.resetBuffer(); - // 获取common.js - String text = Utils.readFromResource(filePath); - // 正则替换banner, 除去底部的广告信息 - text = text.replaceAll("
", ""); - text = text.replaceAll("powered.*?shrek.wang", ""); - response.getWriter().write(text); - } - - @Override - public void destroy() { - } - }; - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); - registrationBean.setFilter(filter); - registrationBean.addUrlPatterns(commonJsPattern); - return registrationBean; - } -} +package com.ruoyi.framework.config; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.sql.DataSource; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; +import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +import com.alibaba.druid.util.Utils; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.framework.config.properties.DruidProperties; +import com.ruoyi.framework.datasource.DynamicDataSource; + +/** + * druid 配置多数据源 + * + * @author ruoyi + */ +@Configuration +public class DruidConfig { + @Bean + @ConfigurationProperties("spring.datasource.druid.master") + public DataSource masterDataSource(DruidProperties druidProperties) { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean + @ConfigurationProperties("spring.datasource.druid.slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") + public DataSource slaveDataSource(DruidProperties druidProperties) { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean(name = "dynamicDataSource") + @Primary + public DynamicDataSource dataSource(DataSource masterDataSource) { + Map targetDataSources = new HashMap<>(); + targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); + setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); + return new DynamicDataSource(masterDataSource, targetDataSources); + } + + /** + * 设置数据源 + * + * @param targetDataSources 备选数据源集合 + * @param sourceName 数据源名称 + * @param beanName bean名称 + */ + public void setDataSource(Map targetDataSources, String sourceName, String beanName) { + try { + DataSource dataSource = SpringUtils.getBean(beanName); + targetDataSources.put(sourceName, dataSource); + } catch (Exception e) { + } + } + + /** + * 去除监控页面底部的广告 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) { + // 获取web监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取common.js的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + final String filePath = "support/http/resources/js/common.js"; + // 创建filter进行过滤 + Filter filter = new Filter() { + @Override + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取common.js + String text = Utils.readFromResource(filePath); + // 正则替换banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + + @Override + public void destroy() { + } + }; + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/FilterConfig.java similarity index 97% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java rename to ruoyi-common/src/main/java/com/ruoyi/common/config/FilterConfig.java index 70a2a4a27..4feef0d0b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/FilterConfig.java @@ -1,58 +1,58 @@ -package com.ruoyi.framework.config; - -import java.util.HashMap; -import java.util.Map; -import javax.servlet.DispatcherType; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import com.ruoyi.common.filter.RepeatableFilter; -import com.ruoyi.common.filter.XssFilter; -import com.ruoyi.common.utils.StringUtils; - -/** - * Filter配置 - * - * @author ruoyi - */ -@Configuration -public class FilterConfig { - @Value("${xss.enabled}") - private String enabled; - - @Value("${xss.excludes}") - private String excludes; - - @Value("${xss.urlPatterns}") - private String urlPatterns; - - @SuppressWarnings({"rawtypes", "unchecked"}) - @Bean - public FilterRegistrationBean xssFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean(); - registration.setDispatcherTypes(DispatcherType.REQUEST); - registration.setFilter(new XssFilter()); - registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); - registration.setName("xssFilter"); - registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); - Map initParameters = new HashMap(); - initParameters.put("excludes", excludes); - initParameters.put("enabled", enabled); - registration.setInitParameters(initParameters); - return registration; - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - @Bean - public FilterRegistrationBean someFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean(); - registration.setFilter(new RepeatableFilter()); - registration.addUrlPatterns("/*"); - registration.setName("repeatableFilter"); - registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); - return registration; - } - -} +package com.ruoyi.framework.config; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.DispatcherType; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.filter.RepeatableFilter; +import com.ruoyi.common.filter.XssFilter; +import com.ruoyi.common.utils.StringUtils; + +/** + * Filter配置 + * + * @author ruoyi + */ +@Configuration +public class FilterConfig { + @Value("${xss.enabled}") + private String enabled; + + @Value("${xss.excludes}") + private String excludes; + + @Value("${xss.urlPatterns}") + private String urlPatterns; + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Bean + public FilterRegistrationBean xssFilterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("excludes", excludes); + initParameters.put("enabled", enabled); + registration.setInitParameters(initParameters); + return registration; + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Bean + public FilterRegistrationBean someFilterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new RepeatableFilter()); + registration.addUrlPatterns("/*"); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/ResourcesConfig.java similarity index 97% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java rename to ruoyi-common/src/main/java/com/ruoyi/common/config/ResourcesConfig.java index edf35f527..b5d749c0a 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/ResourcesConfig.java @@ -1,44 +1,44 @@ -package com.ruoyi.framework.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; - -/** - * 通用配置 - * - * @author ruoyi - */ -@Configuration -public class ResourcesConfig implements WebMvcConfigurer { - @Autowired - private RepeatSubmitInterceptor repeatSubmitInterceptor; - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - /** 本地文件上传路径 */ - registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); - - /** swagger配置 */ - registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); - } - - /** - * 自定义拦截规则 - */ - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); - } - -} +package com.ruoyi.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 通用配置 + * + * @author ruoyi + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer { + @Autowired + private RepeatSubmitInterceptor repeatSubmitInterceptor; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + /** 本地文件上传路径 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); + + /** swagger配置 */ + registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + /** + * 自定义拦截规则 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/ServerConfig.java similarity index 96% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java rename to ruoyi-common/src/main/java/com/ruoyi/common/config/ServerConfig.java index 4692363d0..d50be60aa 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/ServerConfig.java @@ -1,30 +1,30 @@ -package com.ruoyi.framework.config; - -import javax.servlet.http.HttpServletRequest; - -import org.springframework.stereotype.Component; -import com.ruoyi.common.utils.ServletUtils; - -/** - * 服务相关配置 - * - * @author ruoyi - */ -@Component -public class ServerConfig { - /** - * 获取完整的请求路径,包括:域名,端口,上下文访问路径 - * - * @return 服务地址 - */ - public String getUrl() { - HttpServletRequest request = ServletUtils.getRequest(); - return getDomain(request); - } - - public static String getDomain(HttpServletRequest request) { - StringBuffer url = request.getRequestURL(); - String contextPath = request.getServletContext().getContextPath(); - return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); - } -} +package com.ruoyi.framework.config; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 服务相关配置 + * + * @author ruoyi + */ +@Component +public class ServerConfig { + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/ThreadPoolConfig.java similarity index 97% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java rename to ruoyi-common/src/main/java/com/ruoyi/common/config/ThreadPoolConfig.java index b157d7877..dac6f6e8b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/ThreadPoolConfig.java @@ -1,58 +1,58 @@ -package com.ruoyi.framework.config; - -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadPoolExecutor; - -import org.apache.commons.lang3.concurrent.BasicThreadFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import com.ruoyi.common.utils.Threads; - -/** - * 线程池配置 - * - * @author ruoyi - **/ -@Configuration -public class ThreadPoolConfig { - // 核心线程池大小 - private int corePoolSize = 50; - - // 最大可创建的线程数 - private int maxPoolSize = 200; - - // 队列最大长度 - private int queueCapacity = 1000; - - // 线程池维护线程所允许的空闲时间 - private int keepAliveSeconds = 300; - - @Bean(name = "threadPoolTaskExecutor") - public ThreadPoolTaskExecutor threadPoolTaskExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setMaxPoolSize(maxPoolSize); - executor.setCorePoolSize(corePoolSize); - executor.setQueueCapacity(queueCapacity); - executor.setKeepAliveSeconds(keepAliveSeconds); - // 线程池对拒绝任务(无线程可用)的处理策略 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - return executor; - } - - /** - * 执行周期性或定时任务 - */ - @Bean(name = "scheduledExecutorService") - protected ScheduledExecutorService scheduledExecutorService() { - return new ScheduledThreadPoolExecutor(corePoolSize, - new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) { - @Override - protected void afterExecute(Runnable r, Throwable t) { - super.afterExecute(r, t); - Threads.printException(r, t); - } - }; - } -} +package com.ruoyi.framework.config; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import com.ruoyi.common.utils.Threads; + +/** + * 线程池配置 + * + * @author ruoyi + **/ +@Configuration +public class ThreadPoolConfig { + // 核心线程池大小 + private int corePoolSize = 50; + + // 最大可创建的线程数 + private int maxPoolSize = 200; + + // 队列最大长度 + private int queueCapacity = 1000; + + // 线程池维护线程所允许的空闲时间 + private int keepAliveSeconds = 300; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) { + @Override + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/properties/DruidProperties.java similarity index 97% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java rename to ruoyi-common/src/main/java/com/ruoyi/common/config/properties/DruidProperties.java index 2ca02648b..339839001 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/properties/DruidProperties.java @@ -1,75 +1,75 @@ -package com.ruoyi.framework.config.properties; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import com.alibaba.druid.pool.DruidDataSource; - -/** - * druid 配置属性 - * - * @author ruoyi - */ -@Configuration -public class DruidProperties { - @Value("${spring.datasource.druid.initialSize}") - private int initialSize; - - @Value("${spring.datasource.druid.minIdle}") - private int minIdle; - - @Value("${spring.datasource.druid.maxActive}") - private int maxActive; - - @Value("${spring.datasource.druid.maxWait}") - private int maxWait; - - @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") - private int timeBetweenEvictionRunsMillis; - - @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") - private int minEvictableIdleTimeMillis; - - @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") - private int maxEvictableIdleTimeMillis; - - @Value("${spring.datasource.druid.validationQuery}") - private String validationQuery; - - @Value("${spring.datasource.druid.testWhileIdle}") - private boolean testWhileIdle; - - @Value("${spring.datasource.druid.testOnBorrow}") - private boolean testOnBorrow; - - @Value("${spring.datasource.druid.testOnReturn}") - private boolean testOnReturn; - - public DruidDataSource dataSource(DruidDataSource datasource) { - /** 配置初始化大小、最小、最大 */ - datasource.setInitialSize(initialSize); - datasource.setMaxActive(maxActive); - datasource.setMinIdle(minIdle); - - /** 配置获取连接等待超时的时间 */ - datasource.setMaxWait(maxWait); - - /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ - datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); - - /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ - datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); - datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); - - /** - * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 - */ - datasource.setValidationQuery(validationQuery); - /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ - datasource.setTestWhileIdle(testWhileIdle); - /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ - datasource.setTestOnBorrow(testOnBorrow); - /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ - datasource.setTestOnReturn(testOnReturn); - return datasource; - } -} +package com.ruoyi.framework.config.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import com.alibaba.druid.pool.DruidDataSource; + +/** + * druid 配置属性 + * + * @author ruoyi + */ +@Configuration +public class DruidProperties { + @Value("${spring.datasource.druid.initialSize}") + private int initialSize; + + @Value("${spring.datasource.druid.minIdle}") + private int minIdle; + + @Value("${spring.datasource.druid.maxActive}") + private int maxActive; + + @Value("${spring.datasource.druid.maxWait}") + private int maxWait; + + @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + + @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") + private int maxEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.validationQuery}") + private String validationQuery; + + @Value("${spring.datasource.druid.testWhileIdle}") + private boolean testWhileIdle; + + @Value("${spring.datasource.druid.testOnBorrow}") + private boolean testOnBorrow; + + @Value("${spring.datasource.druid.testOnReturn}") + private boolean testOnReturn; + + public DruidDataSource dataSource(DruidDataSource datasource) { + /** 配置初始化大小、最小、最大 */ + datasource.setInitialSize(initialSize); + datasource.setMaxActive(maxActive); + datasource.setMinIdle(minIdle); + + /** 配置获取连接等待超时的时间 */ + datasource.setMaxWait(maxWait); + + /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ + datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ + datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); + + /** + * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 + */ + datasource.setValidationQuery(validationQuery); + /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ + datasource.setTestWhileIdle(testWhileIdle); + /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnBorrow(testOnBorrow); + /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnReturn(testOnReturn); + return datasource; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatSubmit.java similarity index 95% rename from ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java rename to ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatSubmit.java index 5f81b40bb..29c667f86 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatSubmit.java @@ -1,21 +1,21 @@ -package com.ruoyi.common.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 自定义注解防止表单重复提交 - * - * @author ruoyi - */ -@Inherited -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface RepeatSubmit { - -} +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解防止表单重复提交 + * + * @author ruoyi + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit { + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatSubmitInterceptor.java similarity index 97% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java rename to ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatSubmitInterceptor.java index bb7644b2a..e07e6de65 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatSubmitInterceptor.java @@ -1,49 +1,49 @@ -package com.ruoyi.framework.interceptor; - -import java.lang.reflect.Method; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; -import com.alibaba.fastjson.JSONObject; -import com.ruoyi.common.annotation.RepeatSubmit; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.ServletUtils; - -/** - * 防止重复提交拦截器 - * - * @author ruoyi - */ -@Component -public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter { - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - if (handler instanceof HandlerMethod) { - HandlerMethod handlerMethod = (HandlerMethod) handler; - Method method = handlerMethod.getMethod(); - RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); - if (annotation != null) { - if (this.isRepeatSubmit(request)) { - AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试"); - ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult)); - return false; - } - } - return true; - } else { - return super.preHandle(request, response, handler); - } - } - - /** - * 验证是否重复提交由子类实现具体的防重复提交的规则 - * - * @param request - * @return - * @throws Exception - */ - public abstract boolean isRepeatSubmit(HttpServletRequest request); -} +package com.ruoyi.framework.interceptor; + +import java.lang.reflect.Method; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 防止重复提交拦截器 + * + * @author ruoyi + */ +@Component +public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) { + if (this.isRepeatSubmit(request)) { + AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试"); + ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult)); + return false; + } + } + return true; + } else { + return super.preHandle(request, response, handler); + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * + * @param request + * @return + * @throws Exception + */ + public abstract boolean isRepeatSubmit(HttpServletRequest request); +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/SameUrlDataInterceptor.java similarity index 97% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java rename to ruoyi-common/src/main/java/com/ruoyi/common/filter/SameUrlDataInterceptor.java index 8b25ab0c5..3386b4115 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/SameUrlDataInterceptor.java @@ -1,114 +1,114 @@ -package com.ruoyi.framework.interceptor.impl; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import javax.servlet.http.HttpServletRequest; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import com.alibaba.fastjson.JSONObject; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.filter.RepeatedlyRequestWrapper; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.http.HttpHelper; -import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; - -/** - * 判断请求url和数据是否和上一次相同, - * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 - * - * @author ruoyi - */ -@Component -public class SameUrlDataInterceptor extends RepeatSubmitInterceptor { - public final String REPEAT_PARAMS = "repeatParams"; - - public final String REPEAT_TIME = "repeatTime"; - - // 令牌自定义标识 - @Value("${token.header}") - private String header; - - @Autowired - private RedisCache redisCache; - - /** - * 间隔时间,单位:秒 默认10秒 - *

- * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据 - */ - private int intervalTime = 10; - - public void setIntervalTime(int intervalTime) { - this.intervalTime = intervalTime; - } - - @SuppressWarnings("unchecked") - @Override - public boolean isRepeatSubmit(HttpServletRequest request) { - String nowParams = ""; - if (request instanceof RepeatedlyRequestWrapper) { - RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; - nowParams = HttpHelper.getBodyString(repeatedlyRequest); - } - - // body参数为空,获取Parameter的数据 - if (StringUtils.isEmpty(nowParams)) { - nowParams = JSONObject.toJSONString(request.getParameterMap()); - } - Map nowDataMap = new HashMap(); - nowDataMap.put(REPEAT_PARAMS, nowParams); - nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); - - // 请求地址(作为存放cache的key值) - String url = request.getRequestURI(); - - // 唯一值(没有消息头则使用请求地址) - String submitKey = request.getHeader(header); - if (StringUtils.isEmpty(submitKey)) { - submitKey = url; - } - - // 唯一标识(指定key + 消息头) - String cache_repeat_key = Constants.REPEAT_SUBMIT_KEY + submitKey; - - Object sessionObj = redisCache.getCacheObject(cache_repeat_key); - if (sessionObj != null) { - Map sessionMap = (Map) sessionObj; - if (sessionMap.containsKey(url)) { - Map preDataMap = (Map) sessionMap.get(url); - if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap)) { - return true; - } - } - } - Map cacheMap = new HashMap(); - cacheMap.put(url, nowDataMap); - redisCache.setCacheObject(cache_repeat_key, cacheMap, intervalTime, TimeUnit.SECONDS); - return false; - } - - /** - * 判断参数是否相同 - */ - private boolean compareParams(Map nowMap, Map preMap) { - String nowParams = (String) nowMap.get(REPEAT_PARAMS); - String preParams = (String) preMap.get(REPEAT_PARAMS); - return nowParams.equals(preParams); - } - - /** - * 判断两次间隔时间 - */ - private boolean compareTime(Map nowMap, Map preMap) { - long time1 = (Long) nowMap.get(REPEAT_TIME); - long time2 = (Long) preMap.get(REPEAT_TIME); - if ((time1 - time2) < (this.intervalTime * 1000)) { - return true; - } - return false; - } -} +package com.ruoyi.framework.interceptor.impl; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.filter.RepeatedlyRequestWrapper; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpHelper; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 判断请求url和数据是否和上一次相同, + * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 + * + * @author ruoyi + */ +@Component +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor { + public final String REPEAT_PARAMS = "repeatParams"; + + public final String REPEAT_TIME = "repeatTime"; + + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + @Autowired + private RedisCache redisCache; + + /** + * 间隔时间,单位:秒 默认10秒 + *

+ * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据 + */ + private int intervalTime = 10; + + public void setIntervalTime(int intervalTime) { + this.intervalTime = intervalTime; + } + + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(HttpServletRequest request) { + String nowParams = ""; + if (request instanceof RepeatedlyRequestWrapper) { + RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; + nowParams = HttpHelper.getBodyString(repeatedlyRequest); + } + + // body参数为空,获取Parameter的数据 + if (StringUtils.isEmpty(nowParams)) { + nowParams = JSONObject.toJSONString(request.getParameterMap()); + } + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + + // 请求地址(作为存放cache的key值) + String url = request.getRequestURI(); + + // 唯一值(没有消息头则使用请求地址) + String submitKey = request.getHeader(header); + if (StringUtils.isEmpty(submitKey)) { + submitKey = url; + } + + // 唯一标识(指定key + 消息头) + String cache_repeat_key = Constants.REPEAT_SUBMIT_KEY + submitKey; + + Object sessionObj = redisCache.getCacheObject(cache_repeat_key); + if (sessionObj != null) { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap)) { + return true; + } + } + } + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cache_repeat_key, cacheMap, intervalTime, TimeUnit.SECONDS); + return false; + } + + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap) { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < (this.intervalTime * 1000)) { + return true; + } + return false; + } +} diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-common/src/main/resources/application-druid.yml similarity index 95% rename from ruoyi-admin/src/main/resources/application-druid.yml rename to ruoyi-common/src/main/resources/application-druid.yml index cdfb3390b..13e1a5c36 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-common/src/main/resources/application-druid.yml @@ -1,57 +1,57 @@ -# 数据源配置 -spring: - datasource: - type: com.alibaba.druid.pool.DruidDataSource - driverClassName: com.mysql.cj.jdbc.Driver - druid: - # 主库数据源 - master: - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: root - password: password - # 从库数据源 - slave: - # 从数据源开关/默认关闭 - enabled: false - url: - username: - password: - # 初始连接数 - initialSize: 5 - # 最小连接池数量 - minIdle: 10 - # 最大连接池数量 - maxActive: 20 - # 配置获取连接等待超时的时间 - maxWait: 60000 - # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 - timeBetweenEvictionRunsMillis: 60000 - # 配置一个连接在池中最小生存的时间,单位是毫秒 - minEvictableIdleTimeMillis: 300000 - # 配置一个连接在池中最大生存的时间,单位是毫秒 - maxEvictableIdleTimeMillis: 900000 - # 配置检测连接是否有效 - validationQuery: SELECT 1 FROM DUAL - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - webStatFilter: - enabled: true - statViewServlet: - enabled: true - # 设置白名单,不填则允许所有访问 - allow: - url-pattern: /druid/* - # 控制台管理用户名和密码 - login-username: - login-password: - filter: - stat: - enabled: true - # 慢SQL记录 - log-slow-sql: true - slow-sql-millis: 1000 - merge-sql: true - wall: - config: +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: password + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: + login-password: + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: multi-statement-allow: true \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-common/src/main/resources/application.yml similarity index 95% rename from ruoyi-admin/src/main/resources/application.yml rename to ruoyi-common/src/main/resources/application.yml index e2c99b186..8adc0a845 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-common/src/main/resources/application.yml @@ -1,44 +1,44 @@ -# 项目相关配置 -ruoyi: - # 名称 - name: RuoYi - # 版本 - version: 3.3.0 - # 版权年份 - copyrightYear: 2020 - # 实例演示开关 - demoEnabled: true - # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) - profile: D:/ruoyi/uploadPath - # 获取ip地址开关 - addressEnabled: false - -# 开发环境配置 -server: - # 服务器的HTTP端口,默认为8080 - port: 8080 - servlet: - # 应用的访问路径 - context-path: / - tomcat: - # tomcat的URI编码 - uri-encoding: UTF-8 - # tomcat最大线程数,默认为200 - max-threads: 800 - # Tomcat启动初始化的线程数,默认值25 - min-spare-threads: 30 - -# 日志配置 -logging: - level: - com.ruoyi: debug - org.springframework: warn - -# 防止XSS攻击 -xss: - # 过滤开关 - enabled: true - # 排除链接(多个用逗号分隔) - excludes: /system/notice/* - # 匹配链接 - urlPatterns: /system/*,/monitor/*,/tool/* +# 项目相关配置 +ruoyi: + # 名称 + name: RuoYi + # 版本 + version: 3.3.0 + # 版权年份 + copyrightYear: 2020 + # 实例演示开关 + demoEnabled: true + # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) + profile: D:/ruoyi/uploadPath + # 获取ip地址开关 + addressEnabled: false + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # tomcat最大线程数,默认为200 + max-threads: 800 + # Tomcat启动初始化的线程数,默认值25 + min-spare-threads: 30 + +# 日志配置 +logging: + level: + com.ruoyi: debug + org.springframework: warn + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice/* + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-common/src/main/resources/i18n/messages.properties similarity index 98% rename from ruoyi-admin/src/main/resources/i18n/messages.properties rename to ruoyi-common/src/main/resources/i18n/messages.properties index 4baeb241a..d63aa1f8a 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-common/src/main/resources/i18n/messages.properties @@ -1,36 +1,36 @@ -#错误消息 -not.null=* 必须填写 -user.jcaptcha.error=验证码错误 -user.jcaptcha.expire=验证码已失效 -user.not.exists=用户不存在/密码错误 -user.password.not.match=用户不存在/密码错误 -user.password.retry.limit.count=密码输入错误{0}次 -user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟 -user.password.delete=对不起,您的账号已被删除 -user.blocked=用户已封禁,请联系管理员 -role.blocked=角色已封禁,请联系管理员 -user.logout.success=退出成功 - -length.not.valid=长度必须在{min}到{max}个字符之间 - -user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 -user.password.not.valid=* 5-50个字符 - -user.email.not.valid=邮箱格式错误 -user.mobile.phone.number.not.valid=手机号格式错误 -user.login.success=登录成功 -user.notfound=请重新登录 -user.forcelogout=管理员强制退出,请重新登录 -user.unknown.error=未知错误,请重新登录 - -##文件上传消息 -upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! -upload.filename.exceed.length=上传的文件名最长{0}个字符 - -##权限 -no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] -no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] -no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] -no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] -no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] -no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=用户不存在/密码错误 +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟 +user.password.delete=对不起,您的账号已被删除 +user.blocked=用户已封禁,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +user.logout.success=退出成功 + +length.not.valid=长度必须在{min}到{max}个字符之间 + +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.password.not.valid=* 5-50个字符 + +user.email.not.valid=邮箱格式错误 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 + +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 + +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-common/src/main/resources/logback.xml similarity index 96% rename from ruoyi-admin/src/main/resources/logback.xml rename to ruoyi-common/src/main/resources/logback.xml index d69a57207..a360583fa 100644 --- a/ruoyi-admin/src/main/resources/logback.xml +++ b/ruoyi-common/src/main/resources/logback.xml @@ -1,93 +1,93 @@ - - - - - - - - - - - ${log.pattern} - - - - - - ${log.path}/sys-info.log - - - - ${log.path}/sys-info.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - INFO - - ACCEPT - - DENY - - - - - ${log.path}/sys-error.log - - - - ${log.path}/sys-error.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - ERROR - - ACCEPT - - DENY - - - - - - ${log.path}/sys-user.log - - - ${log.path}/sys-user.%d{yyyy-MM-dd}.log - - 60 - - - ${log.pattern} - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-ui/src/api/monitor/online.js b/ruoyi-ui/src/api/system/session.js similarity index 74% rename from ruoyi-ui/src/api/monitor/online.js rename to ruoyi-ui/src/api/system/session.js index 288ebe029..dee070995 100644 --- a/ruoyi-ui/src/api/monitor/online.js +++ b/ruoyi-ui/src/api/system/session.js @@ -1,18 +1,18 @@ -import request from '@/utils/request' - -// 查询在线用户列表 -export function list(query) { - return request({ - url: '/monitor/online/list', - method: 'get', - params: query - }) -} - -// 强退用户 -export function forceLogout(tokenId) { - return request({ - url: '/monitor/online/' + tokenId, - method: 'delete' - }) -} +import request from '@/utils/request' + +// 查询在线用户列表 +export function list(query) { + return request({ + url: '/system/user-session/page', + method: 'get', + params: query + }) +} + +// 强退用户 +export function forceLogout(tokenId) { + return request({ + url: '/system/user-session/delete?id=' + tokenId, + method: 'delete' + }) +} diff --git a/ruoyi-ui/src/views/monitor/online/index.vue b/ruoyi-ui/src/views/system/session/index.vue similarity index 62% rename from ruoyi-ui/src/views/monitor/online/index.vue rename to ruoyi-ui/src/views/system/session/index.vue index 0dc6e98c3..5c0be114a 100644 --- a/ruoyi-ui/src/views/monitor/online/index.vue +++ b/ruoyi-ui/src/views/system/session/index.vue @@ -1,128 +1,121 @@ - - - - + + + + diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java index f366e0d29..4401dd52d 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java @@ -4,8 +4,14 @@ import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; +import cn.iocoder.dashboard.modules.system.convert.auth.SysUserSessionConvert; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; +import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; +import cn.iocoder.dashboard.modules.system.service.user.SysUserService; +import cn.iocoder.dashboard.util.collection.MapUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -14,26 +20,50 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import static cn.iocoder.dashboard.common.pojo.CommonResult.success; +import static cn.iocoder.dashboard.util.collection.CollectionUtils.convertList; @Api("用户 Session API") @RestController -@RequestMapping("/user-session") +@RequestMapping("/system/user-session") public class SysUserSessionController { @Resource private SysUserSessionService userSessionService; + @Resource + private SysUserService userService; + @Resource + private SysDeptService deptService; @ApiOperation("获得 Session 分页列表") @PreAuthorize("@ss.hasPermission('system:user-session:page')") @GetMapping("/page") public CommonResult> getUserSessionPage(@Validated SysUserSessionPageReqVO reqVO) { // 获得 Session 分页 - PageResult sessionPage = userSessionService.getUserSessionPage(reqVO); + PageResult pageResult = userSessionService.getUserSessionPage(reqVO); - // - return null; + // 获得拼接需要的数据 + Map userMap = userService.getUserMap( + convertList(pageResult.getList(), SysUserSessionDO::getUserId)); + Map deptMap = deptService.getDeptMap( + convertList(userMap.values(), SysUserDO::getDeptId)); + // 拼接结果返回 + List sessionList = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(session -> { + SysUserSessionPageItemRespVO respVO = SysUserSessionConvert.INSTANCE.convert(session); + sessionList.add(respVO); + // 设置用户账号 + MapUtils.findAndThen(userMap, session.getUserId(), user -> { + respVO.setUsername(user.getUsername()); + // 设置用户部门 + MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> respVO.setDeptName(dept.getName())); + }); + }); + return success(new PageResult<>(sessionList, pageResult.getTotal())); } @ApiOperation("删除 Session") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java index adf1f9459..3cc1e09af 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageItemRespVO.java @@ -8,6 +8,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import java.util.Date; + @ApiModel(value = "用户在线 Session Response VO", description = "相比用户基本信息来说,会多部门、用户账号等信息") @Data @NoArgsConstructor @@ -25,7 +27,7 @@ public class SysUserSessionPageItemRespVO extends PageParam { private String userAgent; @ApiModelProperty(value = "登陆时间", required = true) - private String createTime; + private Date createTime; @ApiModelProperty(value = "用户账号", required = true, example = "yudao") private String username; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java index 2b27b867f..3a2fca733 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/session/SysUserSessionPageReqVO.java @@ -14,7 +14,6 @@ import javax.validation.constraints.NotEmpty; public class SysUserSessionPageReqVO extends PageParam { @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模糊匹配") - @NotEmpty(message = "用户 IP 不能为空") private String userIp; @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java b/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java new file mode 100644 index 000000000..a8b65675f --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysUserSessionConvert.java @@ -0,0 +1,16 @@ +package cn.iocoder.dashboard.modules.system.convert.auth; + +import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface SysUserSessionConvert { + + SysUserSessionConvert INSTANCE = Mappers.getMapper(SysUserSessionConvert.class); + + SysUserSessionPageItemRespVO convert(SysUserSessionDO session); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserSessionMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserSessionMapper.java index 51aed9dbb..310d30df4 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserSessionMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/auth/SysUserSessionMapper.java @@ -1,9 +1,21 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dao.auth; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; + @Mapper -public interface SysUserSessionMapper extends BaseMapper { +public interface SysUserSessionMapper extends BaseMapperX { + + default PageResult selectPage(SysUserSessionPageReqVO reqVO, Collection userIds) { + return selectPage(reqVO, new QueryWrapperX() + .inIfPresent("user_id", userIds) + .likeIfPresent("user_ip", reqVO.getUserIp())); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/user/SysUserMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/user/SysUserMapper.java index 933bdde00..c9ea4a629 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/user/SysUserMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/user/SysUserMapper.java @@ -48,5 +48,9 @@ public interface SysUserMapper extends BaseMapperX { return selectList(new QueryWrapperX().like("nickname", nickname)); } + default List selectListByUsername(String username) { + return selectList(new QueryWrapperX().like("username", username)); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java index 1efda9b85..f8e229619 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/auth/SysUserSessionDO.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; @@ -27,7 +28,7 @@ public class SysUserSessionDO extends BaseDO { /** * 会话编号, 即 sessionId */ - @TableId + @TableId(type = IdType.INPUT) private String id; /** * 用户编号 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java index 0b54d4535..e5f517e40 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java @@ -30,8 +30,8 @@ public class SysLoginUserRedisDAO { stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(loginUser), LOGIN_USER.getTimeout()); } - public void delete(String accessToken) { - String redisKey = formatKey(accessToken); + public void delete(String sessionId) { + String redisKey = formatKey(sessionId); stringRedisTemplate.delete(redisKey); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java new file mode 100644 index 000000000..de704997d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/job/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.system.job; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java index 6dda624c4..25c1da1e5 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java @@ -1,19 +1,26 @@ package cn.iocoder.dashboard.modules.system.service.auth.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.security.config.SecurityProperties; import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.auth.SysUserSessionMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.auth.SysUserSessionDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO; import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService; +import cn.iocoder.dashboard.modules.system.service.user.SysUserService; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Collection; import java.util.Date; +import static cn.iocoder.dashboard.util.collection.CollectionUtils.convertSet; + /** * 在线用户 Session Service 实现类 * @@ -27,10 +34,12 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { @Resource private SysLoginUserRedisDAO loginUserRedisDAO; - @Resource private SysUserSessionMapper userSessionMapper; + @Resource + private SysUserService userService; + @Override public String createUserSession(LoginUser loginUser, String userIp, String userAgent) { // 生成 Session 编号 @@ -39,8 +48,8 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { loginUser.setUpdateTime(new Date()); loginUserRedisDAO.set(sessionId, loginUser); // 写入 DB 中 - SysUserSessionDO userSession = SysUserSessionDO.builder().userId(loginUser.getId()) - .userIp(userIp).userAgent(userAgent).build(); + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) + .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).build(); userSessionMapper.insert(userSession); // 返回 Session 编号 return sessionId; @@ -59,7 +68,10 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { @Override public void deleteUserSession(String sessionId) { - + // 删除 Redis 缓存 + loginUserRedisDAO.delete(sessionId); + // 删除 DB 记录 + userSessionMapper.deleteById(sessionId); } @Override @@ -74,7 +86,15 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { @Override public PageResult getUserSessionPage(SysUserSessionPageReqVO reqVO) { - return null; + // 处理基于用户昵称的查询 + Collection userIds = null; + if (StrUtil.isNotEmpty(reqVO.getUsername())) { + userIds = convertSet(userService.listUsersByUsername(reqVO.getUsername()), SysUserDO::getId); + if (CollUtil.isEmpty(userIds)) { + return PageResult.empty(); + } + } + return userSessionMapper.selectPage(reqVO, userIds); } /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java index 288c14dee..ab6ee758a 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java @@ -79,6 +79,14 @@ public interface SysUserService { */ List listUsersByNickname(String nickname); + /** + * 获得用户列表,基于用户账号模糊匹配 + * + * @param username 用户账号 + * @return 用户列表 + */ + List listUsersByUsername(String username); + /** * 创建用户 * diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java index af8dd1a64..efc202f92 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java @@ -92,6 +92,11 @@ public class SysUserServiceImpl implements SysUserService { return userMapper.selectListByNickname(nickname); } + @Override + public List listUsersByUsername(String username) { + return userMapper.selectListByUsername(username); + } + /** * 获得部门条件:查询指定部门的子部门编号们,包括自身 * diff --git a/src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java b/src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java index 497c40780..5142b7926 100644 --- a/src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java +++ b/src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java @@ -26,35 +26,35 @@ public class CollectionUtils { return from.stream().filter(predicate).collect(Collectors.toList()); } - public static List convertList(List from, Function func) { + public static List convertList(Collection from, Function func) { if (CollUtil.isEmpty(from)) { return new ArrayList<>(); } return from.stream().map(func).collect(Collectors.toList()); } - public static Set convertSet(List from, Function func) { + public static Set convertSet(Collection from, Function func) { if (CollUtil.isEmpty(from)) { return new HashSet<>(); } return from.stream().map(func).collect(Collectors.toSet()); } - public static Map convertMap(List from, Function keyFunc) { + public static Map convertMap(Collection from, Function keyFunc) { if (CollUtil.isEmpty(from)) { return new HashMap<>(); } return from.stream().collect(Collectors.toMap(keyFunc, item -> item)); } - public static Map convertMap(List from, Function keyFunc, Function valueFunc) { + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc) { if (CollUtil.isEmpty(from)) { return new HashMap<>(); } return from.stream().collect(Collectors.toMap(keyFunc, valueFunc)); } - public static Map> convertMultiMap(List from, Function keyFunc) { + public static Map> convertMultiMap(Collection from, Function keyFunc) { if (CollUtil.isEmpty(from)) { return new HashMap<>(); } @@ -62,7 +62,7 @@ public class CollectionUtils { Collectors.mapping(t -> t, Collectors.toList()))); } - public static Map> convertMultiMap(List from, Function keyFunc, Function valueFunc) { + public static Map> convertMultiMap(Collection from, Function keyFunc, Function valueFunc) { if (CollUtil.isEmpty(from)) { return new HashMap<>(); } @@ -71,7 +71,7 @@ public class CollectionUtils { } // 暂时没想好名字,先以 2 结尾噶 - public static Map> convertMultiMap2(List from, Function keyFunc, Function valueFunc) { + public static Map> convertMultiMap2(Collection from, Function keyFunc, Function valueFunc) { if (CollUtil.isEmpty(from)) { return new HashMap<>(); } From 67c3a62dcffb86fd07758cca29b5783cf54c629d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 30 Jan 2021 20:38:27 +0800 Subject: [PATCH 005/167] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8=EF=BC=8C=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=95=B0=E6=8D=AE=E5=BA=93=20information=5Fschema=20?= =?UTF-8?q?=E7=9A=84=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +- .../ruoyi/common/constant/GenConstants.java | 153 ++++++++++++------ .../com/ruoyi/generator/domain/GenTable.java | 104 +++++------- .../generator/domain/GenTableColumn.java | 122 +------------- .../enums/logger/SysLoginLogTypeEnum.java | 8 +- .../service/auth/impl/SysAuthServiceImpl.java | 2 +- .../codegen/ToolCodeGenController.java | 21 +++ .../vo/ToolCodeGenTableBaseRespVO.java | 4 + .../vo/ToolCodeGenTablePageItemRespVO.java | 7 + .../controller/codegen/vo/package-info.java | 1 + .../modules/tool/controller/package-info.java | 1 + .../ToolInformationSchemaColumnMapper.java | 18 +++ .../ToolInformationSchemaTableMapper.java | 17 ++ .../tool/dal/mysql/dao/package-info.java | 1 + .../codegen/ToolCodegenColumnDO.java | 22 +++ .../codegen/ToolCodegenTableDO.java | 87 ++++++++++ .../ToolInformationSchemaColumnDO.java | 45 ++++++ .../codegen/ToolInformationSchemaTableDO.java | 36 +++++ .../dal/mysql/dataobject/package-info.java | 1 + .../codegen/ToolCodeGenTemplateTypeEnum.java | 25 +++ .../modules/tool/enums/package-info.java | 1 + .../dashboard/modules/tool/package-info.java | 7 + .../cn/iocoder/dashboard/TestApplication.java | 7 + ...ToolInformationSchemaColumnMapperTest.java | 27 ++++ .../ToolInformationSchemaTableMapperTest.java | 26 +++ 25 files changed, 514 insertions(+), 237 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodeGenController.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodeGenTableBaseRespVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodeGenTablePageItemRespVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/controller/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaColumnMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenTableDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaColumnDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaTableDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodeGenTemplateTypeEnum.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/enums/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java create mode 100644 src/test/java/cn/iocoder/dashboard/TestApplication.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaColumnMapperTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapperTest.java diff --git a/pom.xml b/pom.xml index 0f26eb5fc..dd9fbe7d0 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,6 @@ - 3.0.2 @@ -169,6 +168,13 @@ ${spring-boot-admin.version} + + + org.springframework.boot + spring-boot-starter-test + test + + org.projectlombok diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java index 7284290ab..78afc5c9e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -5,105 +5,158 @@ package com.ruoyi.common.constant; * * @author ruoyi */ -public class GenConstants -{ - /** 单表(增删改查) */ - public static final String TPL_CRUD = "crud"; +public class GenConstants { - /** 树表(增删改查) */ - public static final String TPL_TREE = "tree"; - - - /** 树编码字段 */ + /** + * 树编码字段 + */ public static final String TREE_CODE = "treeCode"; - /** 树父编码字段 */ + /** + * 树父编码字段 + */ public static final String TREE_PARENT_CODE = "treeParentCode"; - /** 树名称字段 */ + /** + * 树名称字段 + */ public static final String TREE_NAME = "treeName"; - /** 上级菜单ID字段 */ + /** + * 上级菜单ID字段 + */ public static final String PARENT_MENU_ID = "parentMenuId"; - /** 上级菜单名称字段 */ + /** + * 上级菜单名称字段 + */ public static final String PARENT_MENU_NAME = "parentMenuName"; - /** 数据库字符串类型 */ - public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + /** + * 数据库字符串类型 + */ + public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; - /** 数据库文本类型 */ - public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; + /** + * 数据库文本类型 + */ + public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; - /** 数据库时间类型 */ - public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + /** + * 数据库时间类型 + */ + public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; - /** 数据库数字类型 */ - public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", - "bit", "bigint", "float", "double", "decimal" }; + /** + * 数据库数字类型 + */ + public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal"}; - /** 页面不需要编辑字段 */ - public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; + /** + * 页面不需要编辑字段 + */ + public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"}; - /** 页面不需要显示的列表字段 */ - public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", - "update_time" }; + /** + * 页面不需要显示的列表字段 + */ + public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time"}; - /** 页面不需要查询字段 */ - public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", - "update_time", "remark" }; + /** + * 页面不需要查询字段 + */ + public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark"}; - /** Entity基类字段 */ - public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; + /** + * Entity基类字段 + */ + public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"}; - /** Tree基类字段 */ - public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" }; + /** + * Tree基类字段 + */ + public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors", "children"}; - /** 文本框 */ + /** + * 文本框 + */ public static final String HTML_INPUT = "input"; - /** 文本域 */ + /** + * 文本域 + */ public static final String HTML_TEXTAREA = "textarea"; - /** 下拉框 */ + /** + * 下拉框 + */ public static final String HTML_SELECT = "select"; - /** 单选框 */ + /** + * 单选框 + */ public static final String HTML_RADIO = "radio"; - /** 复选框 */ + /** + * 复选框 + */ public static final String HTML_CHECKBOX = "checkbox"; - /** 日期控件 */ + /** + * 日期控件 + */ public static final String HTML_DATETIME = "datetime"; - /** 上传控件 */ + /** + * 上传控件 + */ public static final String HTML_UPLOAD_IMAGE = "uploadImage"; - /** 富文本控件 */ + /** + * 富文本控件 + */ public static final String HTML_EDITOR = "editor"; - /** 字符串类型 */ + /** + * 字符串类型 + */ public static final String TYPE_STRING = "String"; - /** 整型 */ + /** + * 整型 + */ public static final String TYPE_INTEGER = "Integer"; - /** 长整型 */ + /** + * 长整型 + */ public static final String TYPE_LONG = "Long"; - /** 浮点型 */ + /** + * 浮点型 + */ public static final String TYPE_DOUBLE = "Double"; - /** 高精度计算类型 */ + /** + * 高精度计算类型 + */ public static final String TYPE_BIGDECIMAL = "BigDecimal"; - /** 时间类型 */ + /** + * 时间类型 + */ public static final String TYPE_DATE = "Date"; - /** 模糊查询 */ + /** + * 模糊查询 + */ public static final String QUERY_LIKE = "LIKE"; - /** 需要 */ + /** + * 需要 + */ public static final String REQUIRE = "1"; } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java index 8872de3df..9344aa151 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -3,6 +3,7 @@ package com.ruoyi.generator.domain; import java.util.List; import javax.validation.Valid; import javax.validation.constraints.NotBlank; + import org.apache.commons.lang3.ArrayUtils; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.core.domain.BaseEntity; @@ -13,108 +14,87 @@ import com.ruoyi.common.utils.StringUtils; * * @author ruoyi */ -public class GenTable extends BaseEntity -{ - private static final long serialVersionUID = 1L; +public class GenTable extends BaseEntity { - /** 编号 */ - private Long tableId; - - /** 表名称 */ - @NotBlank(message = "表名称不能为空") - private String tableName; - - /** 表描述 */ - @NotBlank(message = "表描述不能为空") - private String tableComment; - - /** 实体类名称(首字母大写) */ - @NotBlank(message = "实体类名称不能为空") - private String className; - - /** 使用的模板(crud单表操作 tree树表操作) */ - private String tplCategory; - - /** 生成包路径 */ + /** + * 生成包路径 + */ @NotBlank(message = "生成包路径不能为空") private String packageName; - /** 生成模块名 */ - @NotBlank(message = "生成模块名不能为空") - private String moduleName; - - /** 生成业务名 */ - @NotBlank(message = "生成业务名不能为空") - private String businessName; - - /** 生成功能名 */ - @NotBlank(message = "生成功能名不能为空") - private String functionName; - - /** 生成作者 */ - @NotBlank(message = "作者不能为空") - private String functionAuthor; - - /** 生成代码方式(0zip压缩包 1自定义路径) */ + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ private String genType; - /** 生成路径(不填默认项目路径) */ + /** + * 生成路径(不填默认项目路径) + */ private String genPath; - /** 主键信息 */ + /** + * 主键信息 + */ private GenTableColumn pkColumn; - /** 表列信息 */ + /** + * 表列信息 + */ @Valid private List columns; - /** 其它生成选项 */ + /** + * 其它生成选项 + */ private String options; - /** 树编码字段 */ + /** + * 树编码字段 + */ private String treeCode; - /** 树父编码字段 */ + /** + * 树父编码字段 + */ private String treeParentCode; - /** 树名称字段 */ + /** + * 树名称字段 + */ private String treeName; - /** 上级菜单ID字段 */ + /** + * 上级菜单ID字段 + */ private String parentMenuId; - /** 上级菜单名称字段 */ + /** + * 上级菜单名称字段 + */ private String parentMenuName; - public boolean isTree() - { + public boolean isTree() { return isTree(this.tplCategory); } - public static boolean isTree(String tplCategory) - { + public static boolean isTree(String tplCategory) { return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); } - public boolean isCrud() - { + public boolean isCrud() { return isCrud(this.tplCategory); } - public static boolean isCrud(String tplCategory) - { + public static boolean isCrud(String tplCategory) { return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); } - public boolean isSuperColumn(String javaField) - { + public boolean isSuperColumn(String javaField) { return isSuperColumn(this.tplCategory, javaField); } - public static boolean isSuperColumn(String tplCategory, String javaField) - { - if (isTree(tplCategory)) - { + public static boolean isSuperColumn(String tplCategory, String javaField) { + if (isTree(tplCategory)) { return StringUtils.equalsAnyIgnoreCase(javaField, ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java index 883fa9e01..4209a3859 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -6,7 +6,7 @@ import com.ruoyi.common.utils.StringUtils; /** * 代码生成业务字段表 gen_table_column - * + * * @author ruoyi */ public class GenTableColumn extends BaseEntity @@ -68,86 +68,6 @@ public class GenTableColumn extends BaseEntity /** 排序 */ private Integer sort; - public void setColumnId(Long columnId) - { - this.columnId = columnId; - } - - public Long getColumnId() - { - return columnId; - } - - public void setTableId(Long tableId) - { - this.tableId = tableId; - } - - public Long getTableId() - { - return tableId; - } - - public void setColumnName(String columnName) - { - this.columnName = columnName; - } - - public String getColumnName() - { - return columnName; - } - - public void setColumnComment(String columnComment) - { - this.columnComment = columnComment; - } - - public String getColumnComment() - { - return columnComment; - } - - public void setColumnType(String columnType) - { - this.columnType = columnType; - } - - public String getColumnType() - { - return columnType; - } - - public void setJavaType(String javaType) - { - this.javaType = javaType; - } - - public String getJavaType() - { - return javaType; - } - - public void setJavaField(String javaField) - { - this.javaField = javaField; - } - - public String getJavaField() - { - return javaField; - } - - public void setIsPk(String isPk) - { - this.isPk = isPk; - } - - public String getIsPk() - { - return isPk; - } - public boolean isPk() { return isPk(this.isPk); @@ -278,46 +198,6 @@ public class GenTableColumn extends BaseEntity return isQuery != null && StringUtils.equals("1", isQuery); } - public void setQueryType(String queryType) - { - this.queryType = queryType; - } - - public String getQueryType() - { - return queryType; - } - - public String getHtmlType() - { - return htmlType; - } - - public void setHtmlType(String htmlType) - { - this.htmlType = htmlType; - } - - public void setDictType(String dictType) - { - this.dictType = dictType; - } - - public String getDictType() - { - return dictType; - } - - public void setSort(Integer sort) - { - this.sort = sort; - } - - public Integer getSort() - { - return sort; - } - public boolean isSuperColumn() { return isSuperColumn(this.javaField); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java index 9249dd1e7..81a48e72b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/logger/SysLoginLogTypeEnum.java @@ -10,8 +10,12 @@ import lombok.Getter; @AllArgsConstructor public enum SysLoginLogTypeEnum { - LOGIN(1), - LOGOUT(2); + LOGIN_USERNAME(100), // 使用账号登录 + + LOGOUT_SELF(200), // 自己主动登出 + LOGOUT_TIMEOUT(201), // 超时登出 + LOGOUT_DELETE(202), // 强制退出 + ; /** * 日志类型 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java index e86af8c87..ec562af4c 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java @@ -137,7 +137,7 @@ public class SysAuthServiceImpl implements SysAuthService { private void createLoginLog(String username, SysLoginResultEnum loginResult) { SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO(); - reqVO.setLogType(SysLoginLogTypeEnum.LOGIN.getType()); + reqVO.setLogType(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()); reqVO.setTraceId(TracerUtils.getTraceId()); reqVO.setUsername(username); reqVO.setUserAgent(ServletUtils.getUserAgent()); diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodeGenController.java b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodeGenController.java new file mode 100644 index 000000000..9f142e101 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodeGenController.java @@ -0,0 +1,21 @@ +package cn.iocoder.dashboard.modules.tool.controller.codegen; + +import cn.iocoder.dashboard.common.pojo.CommonResult; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodeGenTablePageItemRespVO; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static cn.iocoder.dashboard.common.pojo.CommonResult.success; + +@RestController +@RequestMapping("/tool/code-gen") +public class ToolCodeGenController { + + @GetMapping("/table/page") + public CommonResult> getCodeGenTablePage() { + return success(null); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodeGenTableBaseRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodeGenTableBaseRespVO.java new file mode 100644 index 000000000..91b80df94 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodeGenTableBaseRespVO.java @@ -0,0 +1,4 @@ +package cn.iocoder.dashboard.modules.tool.controller.codegen.vo; + +public class ToolCodeGenTableBaseRespVO { +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodeGenTablePageItemRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodeGenTablePageItemRespVO.java new file mode 100644 index 000000000..d176291ca --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/ToolCodeGenTablePageItemRespVO.java @@ -0,0 +1,7 @@ +package cn.iocoder.dashboard.modules.tool.controller.codegen.vo; + +public class ToolCodeGenTablePageItemRespVO extends ToolCodeGenTableBaseRespVO { + + + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/package-info.java new file mode 100644 index 000000000..a2a9340c6 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/vo/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.tool.controller.codegen.vo; diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/controller/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/package-info.java new file mode 100644 index 000000000..631d5fd44 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.tool.controller; diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaColumnMapper.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaColumnMapper.java new file mode 100644 index 000000000..4a257697b --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaColumnMapper.java @@ -0,0 +1,18 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen; + +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ToolInformationSchemaColumnMapper extends BaseMapperX { + + default List selectListByTableName(String tableName) { + return selectList(new QueryWrapper().eq("table_name", tableName) + .orderByAsc("ordinal_position")); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapper.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapper.java new file mode 100644 index 000000000..05fe395d8 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapper.java @@ -0,0 +1,17 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen; + +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ToolInformationSchemaTableMapper extends BaseMapperX { + + default List selectListByTableSchema(String tableSchema) { + return selectList(new QueryWrapper().eq("table_schema", tableSchema)); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/package-info.java new file mode 100644 index 000000000..362f8a3b5 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dao; diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java new file mode 100644 index 000000000..c9100460b --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java @@ -0,0 +1,22 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen; + +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 代码生成 column 字段定义 + * + * @author 芋道源码 + */ +@TableName(value = "tool_codegen_table_column", autoResultMap = true) +@Data +@Builder +@EqualsAndHashCode(callSuper = true) +public class ToolCodegenColumnDO extends BaseDO { + + + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenTableDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenTableDO.java new file mode 100644 index 000000000..518528f92 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenTableDO.java @@ -0,0 +1,87 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen; + +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodeGenTemplateTypeEnum; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 代码生成 table 表定义 + * + * @author 芋道源码 + */ +@TableName(value = "tool_codegen_table", autoResultMap = true) +@Data +@Builder +@EqualsAndHashCode(callSuper = true) +public class ToolCodegenTableDO extends BaseDO { + + // ========== 表相关字段 ========== + + /** + * ID 编号 + */ + private Long id; + /** + * 表名称 + */ +// @NotBlank(message = "表名称不能为空") + private String tableName; + /** + * 表描述 + */ +// @NotBlank(message = "表描述不能为空") + private String tableComment; + /** + * 备注 + */ + private String remark; + + // ========== 类相关字段 ========== + + /** + * 模块名,即一级目录 + * + * 例如说,infra、system、tool 等等 + */ +// @NotBlank(message = "模块名不能为空") + private String moduleName; + /** + * 业务名,即二级目录 + * + * 例如说,user、permission、dict 等等 + */ +// @NotBlank(message = "生成业务名不能为空") + private String businessName; + /** + * 类名称(首字母大写) + * + * 例如说,SysUser、SysMenu、SysDictData 等等 + */ +// @NotBlank(message = "实体类名称不能为空") + private String className; + /** + * 类描述 + */ +// @NotBlank(message = "生成功能名不能为空") + private String classComment; + /** + * 作者 + */ +// @NotBlank(message = "作者不能为空") + private String author; + + // ========== 生成相关字段 ========== + + /** + * 模板类型 + * + * 枚举 {@link ToolCodeGenTemplateTypeEnum} + */ + private Integer templateType; + + // ========== 菜单相关字段 ========== + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaColumnDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaColumnDO.java new file mode 100644 index 000000000..2cbf10219 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaColumnDO.java @@ -0,0 +1,45 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; + +/** + * MySQL 数据库中的 column 字段定义 + * + * @author 芋道源码 + */ +@TableName(value = "information_schema.columns", autoResultMap = true) +@Data +@Builder +public class ToolInformationSchemaColumnDO { + + /** + * 表名称 + */ + private String tableName; + /** + * 字段名 + */ + private String columnName; + /** + * 字段类型 + */ + private String columnType; + /** + * 是否允许为空 + */ + @TableField("case when is_nullable = 'yes' then '1' else '0' end") + private Boolean nullable; + /** + * 是否主键 + */ + @TableField("case when column_key = 'PRI' then '1' else '0' end") + private Boolean primaryKey; + /** + * 排序字段 + */ + private Integer ordinalPosition; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaTableDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaTableDO.java new file mode 100644 index 000000000..5e67f9e30 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaTableDO.java @@ -0,0 +1,36 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + +/** + * MySQL 数据库中的 table 表定义 + * + * @author 芋道源码 + */ +@TableName(value = "information_schema.tables", autoResultMap = true) +@Data +@Builder +public class ToolInformationSchemaTableDO { + + /** + * 数据库 + */ + private String tableSchema; + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + private String tableComment; + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/package-info.java new file mode 100644 index 000000000..32458ba0c --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject; diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodeGenTemplateTypeEnum.java b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodeGenTemplateTypeEnum.java new file mode 100644 index 000000000..7939b84e8 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodeGenTemplateTypeEnum.java @@ -0,0 +1,25 @@ +package cn.iocoder.dashboard.modules.tool.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成模板类型 + * + * @author 芋道源码 + */ +@AllArgsConstructor +@Getter +public enum ToolCodeGenTemplateTypeEnum { + + CRUD(1), // 基础 CRUD + TREE(2), // 树形 CRUD + SUB(3) // 子表 CRUD + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/enums/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/package-info.java new file mode 100644 index 000000000..f76f926d5 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.tool.enums; diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java new file mode 100644 index 000000000..d161f55db --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/package-info.java @@ -0,0 +1,7 @@ +/** + * tool 包下,我们放研发工具,提升研发效率与质量。 + * 例如说:代码生成器、接口文档等等 + * + * 缩写:tool + */ +package cn.iocoder.dashboard.modules.tool; diff --git a/src/test/java/cn/iocoder/dashboard/TestApplication.java b/src/test/java/cn/iocoder/dashboard/TestApplication.java new file mode 100644 index 000000000..96af4814a --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/TestApplication.java @@ -0,0 +1,7 @@ +package cn.iocoder.dashboard; + +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TestApplication { +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaColumnMapperTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaColumnMapperTest.java new file mode 100644 index 000000000..382a55b86 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaColumnMapperTest.java @@ -0,0 +1,27 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen; + +import cn.iocoder.dashboard.TestApplication; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertTrue; + + +@SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class ToolInformationSchemaColumnMapperTest { + + @Resource + private ToolInformationSchemaColumnMapper toolInformationSchemaColumnMapper; + + @Test + public void testSelectListByTableName() { + List columns = toolInformationSchemaColumnMapper + .selectListByTableName("inf_config"); + assertTrue(columns.size() > 0); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapperTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapperTest.java new file mode 100644 index 000000000..da5aa1830 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapperTest.java @@ -0,0 +1,26 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen; + +import cn.iocoder.dashboard.TestApplication; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class ToolInformationSchemaTableMapperTest { + + @Resource + private ToolInformationSchemaTableMapper toolInformationSchemaTableMapper; + + @Test + public void tstSelectListByTableSchema() { + List tables = toolInformationSchemaTableMapper + .selectListByTableSchema("ruoyi-vue-pro"); + assertTrue(tables.size() > 0); + } + +} From 58f83a2bd1ca3ea8d3111bc56aa662377e4b357d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 30 Jan 2021 21:36:01 +0800 Subject: [PATCH 006/167] =?UTF-8?q?=E6=A2=B3=E7=90=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8=E7=9A=84=E8=A1=A8=E7=BB=93=E6=9E=84?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E7=9B=B8=E5=85=B3=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E7=9A=84=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/constant/GenConstants.java | 49 ---- ruoyi-generator/pom.xml | 34 --- .../com/ruoyi/generator/config/GenConfig.java | 5 +- .../com/ruoyi/generator/domain/GenTable.java | 16 -- .../generator/domain/GenTableColumn.java | 226 +----------------- .../mapper/GenTableColumnMapper.java | 18 +- .../generator/mapper/GenTableMapper.java | 22 +- .../service/GenTableColumnServiceImpl.java | 72 +++--- .../service/GenTableServiceImpl.java | 185 ++++++-------- .../service/IGenTableColumnService.java | 14 +- .../generator/service/IGenTableService.java | 32 +-- .../com/ruoyi/generator/util/GenUtils.java | 123 ++++------ .../generator/util/VelocityInitializer.java | 16 +- .../codegen/ToolCodegenColumnDO.java | 97 ++++++++ .../codegen/ToolCodegenTableDO.java | 9 +- .../ToolInformationSchemaColumnDO.java | 9 + .../ToolCodegenColumnHtmlTypeEnum.java | 28 +++ .../ToolCodegenColumnListConditionEnum.java | 27 +++ ....java => ToolCodegenTemplateTypeEnum.java} | 2 +- 19 files changed, 369 insertions(+), 615 deletions(-) delete mode 100644 ruoyi-generator/pom.xml create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java rename src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/{ToolCodeGenTemplateTypeEnum.java => ToolCodegenTemplateTypeEnum.java} (89%) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java index 78afc5c9e..a1bc70846 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -80,46 +80,6 @@ public class GenConstants { */ public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors", "children"}; - /** - * 文本框 - */ - public static final String HTML_INPUT = "input"; - - /** - * 文本域 - */ - public static final String HTML_TEXTAREA = "textarea"; - - /** - * 下拉框 - */ - public static final String HTML_SELECT = "select"; - - /** - * 单选框 - */ - public static final String HTML_RADIO = "radio"; - - /** - * 复选框 - */ - public static final String HTML_CHECKBOX = "checkbox"; - - /** - * 日期控件 - */ - public static final String HTML_DATETIME = "datetime"; - - /** - * 上传控件 - */ - public static final String HTML_UPLOAD_IMAGE = "uploadImage"; - - /** - * 富文本控件 - */ - public static final String HTML_EDITOR = "editor"; - /** * 字符串类型 */ @@ -150,13 +110,4 @@ public class GenConstants { */ public static final String TYPE_DATE = "Date"; - /** - * 模糊查询 - */ - public static final String QUERY_LIKE = "LIKE"; - - /** - * 需要 - */ - public static final String REQUIRE = "1"; } diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml deleted file mode 100644 index 8a768f259..000000000 --- a/ruoyi-generator/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - ruoyi - com.ruoyi - 3.3.0 - - 4.0.0 - - ruoyi-generator - - - generator代码生成 - - - - - - - org.apache.velocity - velocity - - - - - com.ruoyi - ruoyi-common - - - - - \ No newline at end of file diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java index 1b144deb9..e6351984d 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java @@ -7,14 +7,13 @@ import org.springframework.stereotype.Component; /** * 读取代码生成相关配置 - * + * * @author ruoyi */ @Component @ConfigurationProperties(prefix = "gen") @PropertySource(value = { "classpath:generator.yml" }) -public class GenConfig -{ +public class GenConfig { /** 作者 */ public static String author; diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java index 9344aa151..287faa55e 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -22,27 +22,11 @@ public class GenTable extends BaseEntity { @NotBlank(message = "生成包路径不能为空") private String packageName; - /** - * 生成代码方式(0zip压缩包 1自定义路径) - */ - private String genType; - - /** - * 生成路径(不填默认项目路径) - */ - private String genPath; - /** * 主键信息 */ private GenTableColumn pkColumn; - /** - * 表列信息 - */ - @Valid - private List columns; - /** * 其它生成选项 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java index 4209a3859..62f91782b 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -1,6 +1,7 @@ package com.ruoyi.generator.domain; import javax.validation.constraints.NotBlank; + import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.utils.StringUtils; @@ -9,202 +10,9 @@ import com.ruoyi.common.utils.StringUtils; * * @author ruoyi */ -public class GenTableColumn extends BaseEntity -{ - private static final long serialVersionUID = 1L; +public class GenTableColumn extends BaseEntity { - /** 编号 */ - private Long columnId; - - /** 归属表编号 */ - private Long tableId; - - /** 列名称 */ - private String columnName; - - /** 列描述 */ - private String columnComment; - - /** 列类型 */ - private String columnType; - - /** JAVA类型 */ - private String javaType; - - /** JAVA字段名 */ - @NotBlank(message = "Java属性不能为空") - private String javaField; - - /** 是否主键(1是) */ - private String isPk; - - /** 是否自增(1是) */ - private String isIncrement; - - /** 是否必填(1是) */ - private String isRequired; - - /** 是否为插入字段(1是) */ - private String isInsert; - - /** 是否编辑字段(1是) */ - private String isEdit; - - /** 是否列表字段(1是) */ - private String isList; - - /** 是否查询字段(1是) */ - private String isQuery; - - /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */ - private String queryType; - - /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、upload上传控件、editor富文本控件) */ - private String htmlType; - - /** 字典类型 */ - private String dictType; - - /** 排序 */ - private Integer sort; - - public boolean isPk() - { - return isPk(this.isPk); - } - - public boolean isPk(String isPk) - { - return isPk != null && StringUtils.equals("1", isPk); - } - - public String getIsIncrement() - { - return isIncrement; - } - - public void setIsIncrement(String isIncrement) - { - this.isIncrement = isIncrement; - } - - public boolean isIncrement() - { - return isIncrement(this.isIncrement); - } - - public boolean isIncrement(String isIncrement) - { - return isIncrement != null && StringUtils.equals("1", isIncrement); - } - - public void setIsRequired(String isRequired) - { - this.isRequired = isRequired; - } - - public String getIsRequired() - { - return isRequired; - } - - public boolean isRequired() - { - return isRequired(this.isRequired); - } - - public boolean isRequired(String isRequired) - { - return isRequired != null && StringUtils.equals("1", isRequired); - } - - public void setIsInsert(String isInsert) - { - this.isInsert = isInsert; - } - - public String getIsInsert() - { - return isInsert; - } - - public boolean isInsert() - { - return isInsert(this.isInsert); - } - - public boolean isInsert(String isInsert) - { - return isInsert != null && StringUtils.equals("1", isInsert); - } - - public void setIsEdit(String isEdit) - { - this.isEdit = isEdit; - } - - public String getIsEdit() - { - return isEdit; - } - - public boolean isEdit() - { - return isInsert(this.isEdit); - } - - public boolean isEdit(String isEdit) - { - return isEdit != null && StringUtils.equals("1", isEdit); - } - - public void setIsList(String isList) - { - this.isList = isList; - } - - public String getIsList() - { - return isList; - } - - public boolean isList() - { - return isList(this.isList); - } - - public boolean isList(String isList) - { - return isList != null && StringUtils.equals("1", isList); - } - - public void setIsQuery(String isQuery) - { - this.isQuery = isQuery; - } - - public String getIsQuery() - { - return isQuery; - } - - public boolean isQuery() - { - return isQuery(this.isQuery); - } - - public boolean isQuery(String isQuery) - { - return isQuery != null && StringUtils.equals("1", isQuery); - } - - public boolean isSuperColumn() - { - return isSuperColumn(this.javaField); - } - - public static boolean isSuperColumn(String javaField) - { + public static boolean isSuperColumn(String javaField) { return StringUtils.equalsAnyIgnoreCase(javaField, // BaseEntity "createBy", "createTime", "updateBy", "updateTime", "remark", @@ -212,37 +20,13 @@ public class GenTableColumn extends BaseEntity "parentName", "parentId", "orderNum", "ancestors"); } - public boolean isUsableColumn() - { + public boolean isUsableColumn() { return isUsableColumn(javaField); } - public static boolean isUsableColumn(String javaField) - { + public static boolean isUsableColumn(String javaField) { // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); } - public String readConverterExp() - { - String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); - StringBuffer sb = new StringBuffer(); - if (StringUtils.isNotEmpty(remarks)) - { - for (String value : remarks.split(" ")) - { - if (StringUtils.isNotEmpty(value)) - { - Object startStr = value.subSequence(0, 1); - String endStr = value.substring(1); - sb.append("").append(startStr).append("=").append(endStr).append(","); - } - } - return sb.deleteCharAt(sb.length() - 1).toString(); - } - else - { - return this.columnComment; - } - } } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java index 0dc342895..3e71d14ee 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -1,18 +1,18 @@ package com.ruoyi.generator.mapper; import java.util.List; + import com.ruoyi.generator.domain.GenTableColumn; /** * 业务字段 数据层 - * + * * @author ruoyi */ -public interface GenTableColumnMapper -{ +public interface GenTableColumnMapper { /** * 根据表名称查询列信息 - * + * * @param tableName 表名称 * @return 列信息 */ @@ -20,7 +20,7 @@ public interface GenTableColumnMapper /** * 查询业务字段列表 - * + * * @param tableId 业务字段编号 * @return 业务字段集合 */ @@ -28,7 +28,7 @@ public interface GenTableColumnMapper /** * 新增业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ @@ -36,7 +36,7 @@ public interface GenTableColumnMapper /** * 修改业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ @@ -44,7 +44,7 @@ public interface GenTableColumnMapper /** * 删除业务字段 - * + * * @param genTableColumns 列数据 * @return 结果 */ @@ -52,7 +52,7 @@ public interface GenTableColumnMapper /** * 批量删除业务字段 - * + * * @param ids 需要删除的数据ID * @return 结果 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index 4288d889b..cc59bd2f4 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -1,18 +1,18 @@ package com.ruoyi.generator.mapper; import java.util.List; + import com.ruoyi.generator.domain.GenTable; /** * 业务 数据层 - * + * * @author ruoyi */ -public interface GenTableMapper -{ +public interface GenTableMapper { /** * 查询业务列表 - * + * * @param genTable 业务信息 * @return 业务集合 */ @@ -20,7 +20,7 @@ public interface GenTableMapper /** * 查询据库列表 - * + * * @param genTable 业务信息 * @return 数据库表集合 */ @@ -28,7 +28,7 @@ public interface GenTableMapper /** * 查询据库列表 - * + * * @param tableNames 表名称组 * @return 数据库表集合 */ @@ -36,7 +36,7 @@ public interface GenTableMapper /** * 查询表ID业务信息 - * + * * @param id 业务ID * @return 业务信息 */ @@ -44,7 +44,7 @@ public interface GenTableMapper /** * 查询表名称业务信息 - * + * * @param tableName 表名称 * @return 业务信息 */ @@ -52,7 +52,7 @@ public interface GenTableMapper /** * 新增业务 - * + * * @param genTable 业务信息 * @return 结果 */ @@ -60,7 +60,7 @@ public interface GenTableMapper /** * 修改业务 - * + * * @param genTable 业务信息 * @return 结果 */ @@ -68,7 +68,7 @@ public interface GenTableMapper /** * 批量删除业务 - * + * * @param ids 需要删除的数据ID * @return 结果 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java index 3a2d66a59..ac144794e 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.generator.service; import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.core.text.Convert; @@ -9,60 +10,55 @@ import com.ruoyi.generator.mapper.GenTableColumnMapper; /** * 业务字段 服务层实现 - * + * * @author ruoyi */ @Service -public class GenTableColumnServiceImpl implements IGenTableColumnService -{ - @Autowired - private GenTableColumnMapper genTableColumnMapper; +public class GenTableColumnServiceImpl implements IGenTableColumnService { + @Autowired + private GenTableColumnMapper genTableColumnMapper; - /** + /** * 查询业务字段列表 - * + * * @param tableId 业务字段编号 * @return 业务字段集合 */ - @Override - public List selectGenTableColumnListByTableId(Long tableId) - { - return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); - } - + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + /** * 新增业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ - @Override - public int insertGenTableColumn(GenTableColumn genTableColumn) - { - return genTableColumnMapper.insertGenTableColumn(genTableColumn); - } - - /** - * 修改业务字段 - * - * @param genTableColumn 业务字段信息 - * @return 结果 - */ - @Override - public int updateGenTableColumn(GenTableColumn genTableColumn) - { - return genTableColumnMapper.updateGenTableColumn(genTableColumn); - } + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } - /** + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + + /** * 删除业务字段对象 - * + * * @param ids 需要删除的数据ID * @return 结果 */ - @Override - public int deleteGenTableColumnByIds(String ids) - { - return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); - } + @Override + public int deleteGenTableColumnByIds(String ids) { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 4f663021d..de1a41990 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; + import org.apache.commons.io.IOUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; @@ -38,12 +39,11 @@ import com.ruoyi.generator.util.VelocityUtils; /** * 业务 服务层实现 - * + * * @author ruoyi */ @Service -public class GenTableServiceImpl implements IGenTableService -{ +public class GenTableServiceImpl implements IGenTableService { private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); @Autowired @@ -54,13 +54,12 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询业务信息 - * + * * @param id 业务ID * @return 业务信息 */ @Override - public GenTable selectGenTableById(Long id) - { + public GenTable selectGenTableById(Long id) { GenTable genTable = genTableMapper.selectGenTableById(id); setTableFromOptions(genTable); return genTable; @@ -68,57 +67,51 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询业务列表 - * + * * @param genTable 业务信息 * @return 业务集合 */ @Override - public List selectGenTableList(GenTable genTable) - { + public List selectGenTableList(GenTable genTable) { return genTableMapper.selectGenTableList(genTable); } /** * 查询据库列表 - * + * * @param genTable 业务信息 * @return 数据库表集合 */ @Override - public List selectDbTableList(GenTable genTable) - { + public List selectDbTableList(GenTable genTable) { return genTableMapper.selectDbTableList(genTable); } /** * 查询据库列表 - * + * * @param tableNames 表名称组 * @return 数据库表集合 */ @Override - public List selectDbTableListByNames(String[] tableNames) - { + public List selectDbTableListByNames(String[] tableNames) { return genTableMapper.selectDbTableListByNames(tableNames); } /** * 修改业务 - * + * * @param genTable 业务信息 * @return 结果 */ @Override @Transactional - public void updateGenTable(GenTable genTable) - { + public void updateGenTable(GenTable genTable) { String options = JSON.toJSONString(genTable.getParams()); genTable.setOptions(options); int row = genTableMapper.updateGenTable(genTable); - if (row > 0) - { - for (GenTableColumn cenTableColumn : genTable.getColumns()) - { + if (row > 0) { + for (GenTableColumn cenTableColumn : genTable.getColumns()) { genTableColumnMapper.updateGenTableColumn(cenTableColumn); } } @@ -126,62 +119,53 @@ public class GenTableServiceImpl implements IGenTableService /** * 删除业务对象 - * + * * @param tableIds 需要删除的数据ID * @return 结果 */ @Override @Transactional - public void deleteGenTableByIds(Long[] tableIds) - { + public void deleteGenTableByIds(Long[] tableIds) { genTableMapper.deleteGenTableByIds(tableIds); genTableColumnMapper.deleteGenTableColumnByIds(tableIds); } /** * 导入表结构 - * + * * @param tableList 导入表列表 */ @Override @Transactional - public void importGenTable(List tableList) - { + public void importGenTable(List tableList) { String operName = SecurityUtils.getUsername(); - try - { - for (GenTable table : tableList) - { + try { + for (GenTable table : tableList) { String tableName = table.getTableName(); GenUtils.initTable(table, operName); int row = genTableMapper.insertGenTable(table); - if (row > 0) - { + if (row > 0) { // 保存列信息 List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); - for (GenTableColumn column : genTableColumns) - { + for (GenTableColumn column : genTableColumns) { GenUtils.initColumnField(column, table); genTableColumnMapper.insertGenTableColumn(column); } } } - } - catch (Exception e) - { + } catch (Exception e) { throw new CustomException("导入失败:" + e.getMessage()); } } /** * 预览代码 - * + * * @param tableId 表编号 * @return 预览数据列表 */ @Override - public Map previewCode(Long tableId) - { + public Map previewCode(Long tableId) { Map dataMap = new LinkedHashMap<>(); // 查询表信息 GenTable table = genTableMapper.selectGenTableById(tableId); @@ -194,8 +178,7 @@ public class GenTableServiceImpl implements IGenTableService // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) - { + for (String template : templates) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); @@ -207,13 +190,12 @@ public class GenTableServiceImpl implements IGenTableService /** * 生成代码(下载方式) - * + * * @param tableName 表名称 * @return 数据 */ @Override - public byte[] downloadCode(String tableName) - { + public byte[] downloadCode(String tableName) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); generatorCode(tableName, zip); @@ -223,12 +205,11 @@ public class GenTableServiceImpl implements IGenTableService /** * 生成代码(自定义路径) - * + * * @param tableName 表名称 */ @Override - public void generatorCode(String tableName) - { + public void generatorCode(String tableName) { // 查询表信息 GenTable table = genTableMapper.selectGenTableByName(tableName); // 查询列信息 @@ -241,21 +222,16 @@ public class GenTableServiceImpl implements IGenTableService // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) - { - if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) - { + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); tpl.merge(context, sw); - try - { + try { String path = getGenPath(table, template); FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); - } - catch (IOException e) - { + } catch (IOException e) { throw new CustomException("渲染模板失败,表名:" + table.getTableName()); } } @@ -264,13 +240,12 @@ public class GenTableServiceImpl implements IGenTableService /** * 同步数据库 - * + * * @param tableName 表名称 */ @Override @Transactional - public void synchDb(String tableName) - { + public void synchDb(String tableName) { GenTable table = genTableMapper.selectGenTableByName(tableName); List tableColumns = table.getColumns(); List tableColumnNames = tableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); @@ -279,33 +254,29 @@ public class GenTableServiceImpl implements IGenTableService List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); dbTableColumns.forEach(column -> { - if (!tableColumnNames.contains(column.getColumnName())) - { + if (!tableColumnNames.contains(column.getColumnName())) { GenUtils.initColumnField(column, table); genTableColumnMapper.insertGenTableColumn(column); } }); List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); - if (StringUtils.isNotEmpty(delColumns)) - { + if (StringUtils.isNotEmpty(delColumns)) { genTableColumnMapper.deleteGenTableColumns(delColumns); } } /** * 批量生成代码(下载方式) - * + * * @param tableNames 表数组 * @return 数据 */ @Override - public byte[] downloadCode(String[] tableNames) - { + public byte[] downloadCode(String[] tableNames) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); - for (String tableName : tableNames) - { + for (String tableName : tableNames) { generatorCode(tableName, zip); } IOUtils.closeQuietly(zip); @@ -315,8 +286,7 @@ public class GenTableServiceImpl implements IGenTableService /** * 查询表信息并生成代码 */ - private void generatorCode(String tableName, ZipOutputStream zip) - { + private void generatorCode(String tableName, ZipOutputStream zip) { // 查询表信息 GenTable table = genTableMapper.selectGenTableByName(tableName); // 查询列信息 @@ -329,23 +299,19 @@ public class GenTableServiceImpl implements IGenTableService // 获取模板列表 List templates = VelocityUtils.getTemplateList(table.getTplCategory()); - for (String template : templates) - { + for (String template : templates) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, Constants.UTF8); tpl.merge(context, sw); - try - { + try { // 添加到zip zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); IOUtils.write(sw.toString(), zip, Constants.UTF8); IOUtils.closeQuietly(sw); - zip.flush(); + zip.flush(); zip.closeEntry(); - } - catch (IOException e) - { + } catch (IOException e) { log.error("渲染模板失败,表名:" + table.getTableName(), e); } } @@ -353,26 +319,19 @@ public class GenTableServiceImpl implements IGenTableService /** * 修改保存参数校验 - * + * * @param genTable 业务信息 */ @Override - public void validateEdit(GenTable genTable) - { - if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) - { + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { String options = JSON.toJSONString(genTable.getParams()); JSONObject paramsObj = JSONObject.parseObject(options); - if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) - { + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { throw new CustomException("树编码字段不能为空"); - } - else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) - { + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { throw new CustomException("树父编码字段不能为空"); - } - else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) - { + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { throw new CustomException("树名称字段不能为空"); } } @@ -380,42 +339,36 @@ public class GenTableServiceImpl implements IGenTableService /** * 设置主键列信息 - * - * @param table 业务表信息 + * + * @param table 业务表信息 * @param columns 业务字段列表 */ - public void setPkColumn(GenTable table, List columns) - { - for (GenTableColumn column : columns) - { - if (column.isPk()) - { + public void setPkColumn(GenTable table, List columns) { + for (GenTableColumn column : columns) { + if (column.isPk()) { table.setPkColumn(column); break; } } - if (StringUtils.isNull(table.getPkColumn())) - { + if (StringUtils.isNull(table.getPkColumn())) { table.setPkColumn(columns.get(0)); } } /** * 设置代码生成其他选项值 - * + * * @param genTable 设置后的生成对象 */ - public void setTableFromOptions(GenTable genTable) - { + public void setTableFromOptions(GenTable genTable) { JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions()); - if (StringUtils.isNotNull(paramsObj)) - { + if (StringUtils.isNotNull(paramsObj)) { String treeCode = paramsObj.getString(GenConstants.TREE_CODE); String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); String treeName = paramsObj.getString(GenConstants.TREE_NAME); String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); - + genTable.setTreeCode(treeCode); genTable.setTreeParentCode(treeParentCode); genTable.setTreeName(treeName); @@ -426,18 +379,16 @@ public class GenTableServiceImpl implements IGenTableService /** * 获取代码生成地址 - * - * @param table 业务表信息 + * + * @param table 业务表信息 * @param template 模板文件路径 * @return 生成地址 */ - public static String getGenPath(GenTable table, String template) - { + public static String getGenPath(GenTable table, String template) { String genPath = table.getGenPath(); - if (StringUtils.equals(genPath, "/")) - { + if (StringUtils.equals(genPath, "/")) { return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); } return genPath + File.separator + VelocityUtils.getFileName(template, table); } -} \ No newline at end of file +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java index 2130d0431..d4aa88693 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java @@ -1,18 +1,18 @@ package com.ruoyi.generator.service; import java.util.List; + import com.ruoyi.generator.domain.GenTableColumn; /** * 业务字段 服务层 - * + * * @author ruoyi */ -public interface IGenTableColumnService -{ +public interface IGenTableColumnService { /** * 查询业务字段列表 - * + * * @param tableId 业务字段编号 * @return 业务字段集合 */ @@ -20,7 +20,7 @@ public interface IGenTableColumnService /** * 新增业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ @@ -28,7 +28,7 @@ public interface IGenTableColumnService /** * 修改业务字段 - * + * * @param genTableColumn 业务字段信息 * @return 结果 */ @@ -36,7 +36,7 @@ public interface IGenTableColumnService /** * 删除业务字段信息 - * + * * @param ids 需要删除的数据ID * @return 结果 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index cb2f04373..f342cfa7e 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -2,18 +2,18 @@ package com.ruoyi.generator.service; import java.util.List; import java.util.Map; + import com.ruoyi.generator.domain.GenTable; /** * 业务 服务层 - * + * * @author ruoyi */ -public interface IGenTableService -{ +public interface IGenTableService { /** * 查询业务列表 - * + * * @param genTable 业务信息 * @return 业务集合 */ @@ -21,7 +21,7 @@ public interface IGenTableService /** * 查询据库列表 - * + * * @param genTable 业务信息 * @return 数据库表集合 */ @@ -29,7 +29,7 @@ public interface IGenTableService /** * 查询据库列表 - * + * * @param tableNames 表名称组 * @return 数据库表集合 */ @@ -37,7 +37,7 @@ public interface IGenTableService /** * 查询业务信息 - * + * * @param id 业务ID * @return 业务信息 */ @@ -45,7 +45,7 @@ public interface IGenTableService /** * 修改业务 - * + * * @param genTable 业务信息 * @return 结果 */ @@ -53,7 +53,7 @@ public interface IGenTableService /** * 删除业务信息 - * + * * @param tableIds 需要删除的表数据ID * @return 结果 */ @@ -61,14 +61,14 @@ public interface IGenTableService /** * 导入表结构 - * + * * @param tableList 导入表列表 */ public void importGenTable(List tableList); /** * 预览代码 - * + * * @param tableId 表编号 * @return 预览数据列表 */ @@ -76,7 +76,7 @@ public interface IGenTableService /** * 生成代码(下载方式) - * + * * @param tableName 表名称 * @return 数据 */ @@ -84,7 +84,7 @@ public interface IGenTableService /** * 生成代码(自定义路径) - * + * * @param tableName 表名称 * @return 数据 */ @@ -92,14 +92,14 @@ public interface IGenTableService /** * 同步数据库 - * + * * @param tableName 表名称 */ public void synchDb(String tableName); /** * 批量生成代码(下载方式) - * + * * @param tableNames 表数组 * @return 数据 */ @@ -107,7 +107,7 @@ public interface IGenTableService /** * 修改保存参数校验 - * + * * @param genTable 业务信息 */ public void validateEdit(GenTable genTable); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java index 612ae30d0..1aee0196c 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java @@ -1,6 +1,7 @@ package com.ruoyi.generator.util; import java.util.Arrays; + import org.apache.commons.lang3.RegExUtils; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.utils.StringUtils; @@ -10,16 +11,14 @@ import com.ruoyi.generator.domain.GenTableColumn; /** * 代码生成器 工具类 - * + * * @author ruoyi */ -public class GenUtils -{ +public class GenUtils { /** * 初始化表信息 */ - public static void initTable(GenTable genTable, String operName) - { + public static void initTable(GenTable genTable, String operName) { genTable.setClassName(convertClassName(genTable.getTableName())); genTable.setPackageName(GenConfig.getPackageName()); genTable.setModuleName(getModuleName(GenConfig.getPackageName())); @@ -32,8 +31,7 @@ public class GenUtils /** * 初始化列属性字段 */ - public static void initColumnField(GenTableColumn column, GenTable table) - { + public static void initColumnField(GenTableColumn column, GenTable table) { String dataType = getDbType(column.getColumnType()); String columnName = column.getColumnName(); column.setTableId(table.getTableId()); @@ -43,36 +41,28 @@ public class GenUtils // 设置默认类型 column.setJavaType(GenConstants.TYPE_STRING); - if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) - { + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { // 字符串长度超过500设置为文本域 Integer columnLength = getColumnLength(column.getColumnType()); String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; column.setHtmlType(htmlType); - } - else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) - { + } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { column.setJavaType(GenConstants.TYPE_DATE); column.setHtmlType(GenConstants.HTML_DATETIME); - } - else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) - { + } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { column.setHtmlType(GenConstants.HTML_INPUT); // 如果是浮点型 统一用BigDecimal String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); - if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) - { + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { column.setJavaType(GenConstants.TYPE_BIGDECIMAL); } // 如果是整形 - else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) - { + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { column.setJavaType(GenConstants.TYPE_INTEGER); } // 长整形 - else - { + else { column.setJavaType(GenConstants.TYPE_LONG); } } @@ -81,69 +71,59 @@ public class GenUtils column.setIsInsert(GenConstants.REQUIRE); // 编辑字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) - { + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) { column.setIsEdit(GenConstants.REQUIRE); } // 列表字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) - { + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) { column.setIsList(GenConstants.REQUIRE); } // 查询字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) - { + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { column.setIsQuery(GenConstants.REQUIRE); } // 查询字段类型 - if (StringUtils.endsWithIgnoreCase(columnName, "name")) - { + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { column.setQueryType(GenConstants.QUERY_LIKE); } // 状态字段设置单选框 - if (StringUtils.endsWithIgnoreCase(columnName, "status")) - { + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { column.setHtmlType(GenConstants.HTML_RADIO); } // 类型&性别字段设置下拉框 else if (StringUtils.endsWithIgnoreCase(columnName, "type") - || StringUtils.endsWithIgnoreCase(columnName, "sex")) - { + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { column.setHtmlType(GenConstants.HTML_SELECT); } // 文件字段设置上传控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "image")) - { + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { column.setHtmlType(GenConstants.HTML_UPLOAD_IMAGE); } // 内容字段设置富文本控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "content")) - { + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { column.setHtmlType(GenConstants.HTML_EDITOR); } } /** * 校验数组是否包含指定值 - * - * @param arr 数组 + * + * @param arr 数组 * @param targetValue 值 * @return 是否包含 */ - public static boolean arraysContains(String[] arr, String targetValue) - { + public static boolean arraysContains(String[] arr, String targetValue) { return Arrays.asList(arr).contains(targetValue); } /** * 获取模块名 - * + * * @param packageName 包名 * @return 模块名 */ - public static String getModuleName(String packageName) - { + public static String getModuleName(String packageName) { int lastIndex = packageName.lastIndexOf("."); int nameLength = packageName.length(); String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); @@ -152,12 +132,11 @@ public class GenUtils /** * 获取业务名 - * + * * @param tableName 表名 * @return 业务名 */ - public static String getBusinessName(String tableName) - { + public static String getBusinessName(String tableName) { int lastIndex = tableName.lastIndexOf("_"); int nameLength = tableName.length(); String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); @@ -166,16 +145,14 @@ public class GenUtils /** * 表名转换成Java类名 - * + * * @param tableName 表名称 * @return 类名 */ - public static String convertClassName(String tableName) - { + public static String convertClassName(String tableName) { boolean autoRemovePre = GenConfig.getAutoRemovePre(); String tablePrefix = GenConfig.getTablePrefix(); - if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) - { + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { String[] searchList = StringUtils.split(tablePrefix, ","); tableName = replaceFirst(tableName, searchList); } @@ -184,18 +161,15 @@ public class GenUtils /** * 批量替换前缀 - * + * * @param replacementm 替换值 - * @param searchList 替换列表 + * @param searchList 替换列表 * @return */ - public static String replaceFirst(String replacementm, String[] searchList) - { + public static String replaceFirst(String replacementm, String[] searchList) { String text = replacementm; - for (String searchString : searchList) - { - if (replacementm.startsWith(searchString)) - { + for (String searchString : searchList) { + if (replacementm.startsWith(searchString)) { text = replacementm.replaceFirst(searchString, ""); break; } @@ -205,48 +179,39 @@ public class GenUtils /** * 关键字替换 - * + * * @param text 需要被替换的名字 * @return 替换后的名字 */ - public static String replaceText(String text) - { + public static String replaceText(String text) { return RegExUtils.replaceAll(text, "(?:表|若依)", ""); } /** * 获取数据库类型字段 - * + * * @param columnType 列类型 * @return 截取后的列类型 */ - public static String getDbType(String columnType) - { - if (StringUtils.indexOf(columnType, "(") > 0) - { + public static String getDbType(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { return StringUtils.substringBefore(columnType, "("); - } - else - { + } else { return columnType; } } /** * 获取字段长度 - * + * * @param columnType 列类型 * @return 截取后的列类型 */ - public static Integer getColumnLength(String columnType) - { - if (StringUtils.indexOf(columnType, "(") > 0) - { + public static Integer getColumnLength(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { String length = StringUtils.substringBetween(columnType, "(", ")"); return Integer.valueOf(length); - } - else - { + } else { return 0; } } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java index 8f9ee07b8..08fe390ff 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java @@ -1,24 +1,22 @@ package com.ruoyi.generator.util; import java.util.Properties; + import org.apache.velocity.app.Velocity; import com.ruoyi.common.constant.Constants; /** * VelocityEngine工厂 - * + * * @author RuoYi */ -public class VelocityInitializer -{ +public class VelocityInitializer { /** * 初始化vm方法 */ - public static void initVelocity() - { + public static void initVelocity() { Properties p = new Properties(); - try - { + try { // 加载classpath目录下的vm文件 p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); // 定义字符集 @@ -26,9 +24,7 @@ public class VelocityInitializer p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8); // 初始化Velocity引擎,指定配置Properties Velocity.init(p); - } - catch (Exception e) - { + } catch (Exception e) { throw new RuntimeException(e); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java index c9100460b..cebb37343 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java @@ -1,6 +1,10 @@ package cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict.SysDictTypeDO; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; import lombok.Data; @@ -17,6 +21,99 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) public class ToolCodegenColumnDO extends BaseDO { + /** + * ID 编号 + */ + @TableId + private Long id; + /** + * 表编号 + * + * 外键 {@link ToolCodegenTableDO#getId()} + */ + private Long tableId; + + // ========== 表相关字段 ========== + + /** + * 字段名 + */ + private String columnName; + /** + * 字段类型 + */ + private String columnType; + /** + * 字段描述 + */ + private String columnComment; + /** + * 是否允许为空 + */ + private Boolean nullable; + /** + * 是否主键 + */ + private Boolean primaryKey; + /** + * 是否自增 + */ + private Boolean autoIncrement; + /** + * 排序字段 + */ + private Integer ordinalPosition; + + // ========== Java 相关字段 ========== + + /** + * Java 属性类型 + * + * 例如说 String、Boolean 等等 + */ + private String javaType; + /** + * Java 属性名 + */ +// @NotBlank(message = "Java属性不能为空") + private String javaField; + /** + * 字典类型 + * + * 关联 {@link SysDictTypeDO#getType()} + */ + private String dictType; + + // ========== CRUD 相关字段 ========== + + /** + * 是否为 Create 创建操作的字段 + */ + private Boolean createOperation; + /** + * 是否为 Update 更新操作的字段 + */ + private Boolean updateOperation; + /** + * 是否为 List 查询操作的返回字段 + */ + private Boolean listOperationResult; + /** + * List 查询操作的条件类型 + * 如果为空,则说明不是查询字段 + * + * 枚举 {@link ToolCodegenColumnListConditionEnum} + */ + private String listOperationCondition; + + // ========== UI 相关字段 ========== + + /** + * 显示类型 + * + * 枚举 {@link ToolCodegenColumnHtmlTypeEnum} + */ + private String htmlType; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenTableDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenTableDO.java index 518528f92..4ad146ecc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenTableDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenTableDO.java @@ -1,7 +1,7 @@ package cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodeGenTemplateTypeEnum; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Builder; import lombok.Data; @@ -18,12 +18,13 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) public class ToolCodegenTableDO extends BaseDO { - // ========== 表相关字段 ========== - /** * ID 编号 */ private Long id; + + // ========== 表相关字段 ========== + /** * 表名称 */ @@ -78,7 +79,7 @@ public class ToolCodegenTableDO extends BaseDO { /** * 模板类型 * - * 枚举 {@link ToolCodeGenTemplateTypeEnum} + * 枚举 {@link ToolCodegenTemplateTypeEnum} */ private Integer templateType; diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaColumnDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaColumnDO.java index 2cbf10219..adcc61b27 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaColumnDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolInformationSchemaColumnDO.java @@ -27,6 +27,10 @@ public class ToolInformationSchemaColumnDO { * 字段类型 */ private String columnType; + /** + * 字段描述 + */ + private String columnComment; /** * 是否允许为空 */ @@ -37,6 +41,11 @@ public class ToolInformationSchemaColumnDO { */ @TableField("case when column_key = 'PRI' then '1' else '0' end") private Boolean primaryKey; + /** + * 是否自增 + */ + @TableField("case when extra = 'auto_increment' then '1' else '0' end") + private Boolean autoIncrement; /** * 排序字段 */ diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java new file mode 100644 index 000000000..f1f791034 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java @@ -0,0 +1,28 @@ +package cn.iocoder.dashboard.modules.tool.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段 HTML 展示枚举 + */ +@AllArgsConstructor +@Getter +public enum ToolCodegenColumnHtmlTypeEnum { + + INPUT("input"), // 文本框 + TEXTAREA("textarea"), // 文本域 + SELECT("select"), // 下拉框 + RADIO("radio"), // 单选框 + CHECKBOX("checkbox"), // 复选框 + DATETIME("datetime"), // 日期控件 + UPLOAD_IMAGE("upload_image"), // 上传控件 + EDITOR("editor"), // 富文本控件 + ; + + /** + * 条件 + */ + private final String condition; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java new file mode 100644 index 000000000..bfa76a84b --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnListConditionEnum.java @@ -0,0 +1,27 @@ +package cn.iocoder.dashboard.modules.tool.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段过滤条件枚举 + */ +@AllArgsConstructor +@Getter +public enum ToolCodegenColumnListConditionEnum { + + EQ("="), + NE("!="), + GT(">"), + GTE(">="), + LT("<"), + LTE("<="), + LIKE("LIKE"), + BETWEEN("BETWEEN"); + + /** + * 条件 + */ + private final String condition; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodeGenTemplateTypeEnum.java b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java similarity index 89% rename from src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodeGenTemplateTypeEnum.java rename to src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java index 7939b84e8..30394544e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodeGenTemplateTypeEnum.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenTemplateTypeEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @AllArgsConstructor @Getter -public enum ToolCodeGenTemplateTypeEnum { +public enum ToolCodegenTemplateTypeEnum { CRUD(1), // 基础 CRUD TREE(2), // 树形 CRUD From 0be7138eefe3f3922765f8e5b3aef04eb7f4c09b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 31 Jan 2021 16:42:16 +0800 Subject: [PATCH 007/167] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=AD=97=E6=AE=B5=E7=9A=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/constant/GenConstants.java | 73 ------ .../com/ruoyi/generator/util/GenUtils.java | 218 ----------------- .../codegen/ToolCodeGenController.java | 20 +- .../tool/convert/codegen/CodegenConvert.java | 21 ++ .../modules/tool/convert/package-info.java | 1 + .../dao/coegen/ToolCodegenColumnMapper.java | 9 + .../dao/coegen/ToolCodegenTableMapper.java | 15 ++ .../ToolInformationSchemaTableMapper.java | 4 + .../ToolCodegenColumnHtmlTypeEnum.java | 5 +- .../service/codegen/ToolCodegenService.java | 18 ++ .../codegen/impl/ToolCodegenServiceImpl.java | 222 ++++++++++++++++++ .../modules/tool/service/package-info.java | 1 + 12 files changed, 310 insertions(+), 297 deletions(-) delete mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/CodegenConvert.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/convert/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenColumnMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenTableMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/service/package-info.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java index a1bc70846..54c82967c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -32,82 +32,9 @@ public class GenConstants { */ public static final String PARENT_MENU_NAME = "parentMenuName"; - /** - * 数据库字符串类型 - */ - public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; - - /** - * 数据库文本类型 - */ - public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; - - /** - * 数据库时间类型 - */ - public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; - - /** - * 数据库数字类型 - */ - public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", - "bit", "bigint", "float", "double", "decimal"}; - - /** - * 页面不需要编辑字段 - */ - public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"}; - - /** - * 页面不需要显示的列表字段 - */ - public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by", - "update_time"}; - - /** - * 页面不需要查询字段 - */ - public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", - "update_time", "remark"}; - - /** - * Entity基类字段 - */ - public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"}; - /** * Tree基类字段 */ public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors", "children"}; - /** - * 字符串类型 - */ - public static final String TYPE_STRING = "String"; - - /** - * 整型 - */ - public static final String TYPE_INTEGER = "Integer"; - - /** - * 长整型 - */ - public static final String TYPE_LONG = "Long"; - - /** - * 浮点型 - */ - public static final String TYPE_DOUBLE = "Double"; - - /** - * 高精度计算类型 - */ - public static final String TYPE_BIGDECIMAL = "BigDecimal"; - - /** - * 时间类型 - */ - public static final String TYPE_DATE = "Date"; - } diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java deleted file mode 100644 index 1aee0196c..000000000 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.ruoyi.generator.util; - -import java.util.Arrays; - -import org.apache.commons.lang3.RegExUtils; -import com.ruoyi.common.constant.GenConstants; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.generator.config.GenConfig; -import com.ruoyi.generator.domain.GenTable; -import com.ruoyi.generator.domain.GenTableColumn; - -/** - * 代码生成器 工具类 - * - * @author ruoyi - */ -public class GenUtils { - /** - * 初始化表信息 - */ - public static void initTable(GenTable genTable, String operName) { - genTable.setClassName(convertClassName(genTable.getTableName())); - genTable.setPackageName(GenConfig.getPackageName()); - genTable.setModuleName(getModuleName(GenConfig.getPackageName())); - genTable.setBusinessName(getBusinessName(genTable.getTableName())); - genTable.setFunctionName(replaceText(genTable.getTableComment())); - genTable.setFunctionAuthor(GenConfig.getAuthor()); - genTable.setCreateBy(operName); - } - - /** - * 初始化列属性字段 - */ - public static void initColumnField(GenTableColumn column, GenTable table) { - String dataType = getDbType(column.getColumnType()); - String columnName = column.getColumnName(); - column.setTableId(table.getTableId()); - column.setCreateBy(table.getCreateBy()); - // 设置java字段名 - column.setJavaField(StringUtils.toCamelCase(columnName)); - // 设置默认类型 - column.setJavaType(GenConstants.TYPE_STRING); - - if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { - // 字符串长度超过500设置为文本域 - Integer columnLength = getColumnLength(column.getColumnType()); - String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; - column.setHtmlType(htmlType); - } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { - column.setJavaType(GenConstants.TYPE_DATE); - column.setHtmlType(GenConstants.HTML_DATETIME); - } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { - column.setHtmlType(GenConstants.HTML_INPUT); - - // 如果是浮点型 统一用BigDecimal - String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); - if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { - column.setJavaType(GenConstants.TYPE_BIGDECIMAL); - } - // 如果是整形 - else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { - column.setJavaType(GenConstants.TYPE_INTEGER); - } - // 长整形 - else { - column.setJavaType(GenConstants.TYPE_LONG); - } - } - - // 插入字段(默认所有字段都需要插入) - column.setIsInsert(GenConstants.REQUIRE); - - // 编辑字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) { - column.setIsEdit(GenConstants.REQUIRE); - } - // 列表字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) { - column.setIsList(GenConstants.REQUIRE); - } - // 查询字段 - if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { - column.setIsQuery(GenConstants.REQUIRE); - } - - // 查询字段类型 - if (StringUtils.endsWithIgnoreCase(columnName, "name")) { - column.setQueryType(GenConstants.QUERY_LIKE); - } - // 状态字段设置单选框 - if (StringUtils.endsWithIgnoreCase(columnName, "status")) { - column.setHtmlType(GenConstants.HTML_RADIO); - } - // 类型&性别字段设置下拉框 - else if (StringUtils.endsWithIgnoreCase(columnName, "type") - || StringUtils.endsWithIgnoreCase(columnName, "sex")) { - column.setHtmlType(GenConstants.HTML_SELECT); - } - // 文件字段设置上传控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { - column.setHtmlType(GenConstants.HTML_UPLOAD_IMAGE); - } - // 内容字段设置富文本控件 - else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { - column.setHtmlType(GenConstants.HTML_EDITOR); - } - } - - /** - * 校验数组是否包含指定值 - * - * @param arr 数组 - * @param targetValue 值 - * @return 是否包含 - */ - public static boolean arraysContains(String[] arr, String targetValue) { - return Arrays.asList(arr).contains(targetValue); - } - - /** - * 获取模块名 - * - * @param packageName 包名 - * @return 模块名 - */ - public static String getModuleName(String packageName) { - int lastIndex = packageName.lastIndexOf("."); - int nameLength = packageName.length(); - String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); - return moduleName; - } - - /** - * 获取业务名 - * - * @param tableName 表名 - * @return 业务名 - */ - public static String getBusinessName(String tableName) { - int lastIndex = tableName.lastIndexOf("_"); - int nameLength = tableName.length(); - String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); - return businessName; - } - - /** - * 表名转换成Java类名 - * - * @param tableName 表名称 - * @return 类名 - */ - public static String convertClassName(String tableName) { - boolean autoRemovePre = GenConfig.getAutoRemovePre(); - String tablePrefix = GenConfig.getTablePrefix(); - if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { - String[] searchList = StringUtils.split(tablePrefix, ","); - tableName = replaceFirst(tableName, searchList); - } - return StringUtils.convertToCamelCase(tableName); - } - - /** - * 批量替换前缀 - * - * @param replacementm 替换值 - * @param searchList 替换列表 - * @return - */ - public static String replaceFirst(String replacementm, String[] searchList) { - String text = replacementm; - for (String searchString : searchList) { - if (replacementm.startsWith(searchString)) { - text = replacementm.replaceFirst(searchString, ""); - break; - } - } - return text; - } - - /** - * 关键字替换 - * - * @param text 需要被替换的名字 - * @return 替换后的名字 - */ - public static String replaceText(String text) { - return RegExUtils.replaceAll(text, "(?:表|若依)", ""); - } - - /** - * 获取数据库类型字段 - * - * @param columnType 列类型 - * @return 截取后的列类型 - */ - public static String getDbType(String columnType) { - if (StringUtils.indexOf(columnType, "(") > 0) { - return StringUtils.substringBefore(columnType, "("); - } else { - return columnType; - } - } - - /** - * 获取字段长度 - * - * @param columnType 列类型 - * @return 截取后的列类型 - */ - public static Integer getColumnLength(String columnType) { - if (StringUtils.indexOf(columnType, "(") > 0) { - String length = StringUtils.substringBetween(columnType, "(", ")"); - return Integer.valueOf(length); - } else { - return 0; - } - } -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodeGenController.java b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodeGenController.java index 9f142e101..1aa3165b4 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodeGenController.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/controller/codegen/ToolCodeGenController.java @@ -3,19 +3,31 @@ package cn.iocoder.dashboard.modules.tool.controller.codegen; import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.modules.tool.controller.codegen.vo.ToolCodeGenTablePageItemRespVO; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; import static cn.iocoder.dashboard.common.pojo.CommonResult.success; @RestController -@RequestMapping("/tool/code-gen") +@RequestMapping("/tool/codegen") public class ToolCodeGenController { + @Resource + private ToolCodegenService codegenService; + @GetMapping("/table/page") public CommonResult> getCodeGenTablePage() { return success(null); } + @ApiOperation("基于数据库的表结构,创建代码生成器的表定义") + @PostMapping("/table/create") + // TODO 权限 + public CommonResult createCodeGenTable(@RequestParam("tableName") String tableName) { + return success(codegenService.createCodegenTable(tableName)); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/CodegenConvert.java b/src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/CodegenConvert.java new file mode 100644 index 000000000..7f570db1e --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/convert/codegen/CodegenConvert.java @@ -0,0 +1,21 @@ +package cn.iocoder.dashboard.modules.tool.convert.codegen; + +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface CodegenConvert { + + CodegenConvert INSTANCE = Mappers.getMapper(CodegenConvert.class); + + ToolCodegenTableDO convert(ToolInformationSchemaTableDO bean); + + List convertList(List list); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/convert/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/tool/convert/package-info.java new file mode 100644 index 000000000..6dd9aa41b --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/convert/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.tool.convert; diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenColumnMapper.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenColumnMapper.java new file mode 100644 index 000000000..9e88678f4 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenColumnMapper.java @@ -0,0 +1,9 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen; + +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ToolCodegenColumnMapper extends BaseMapperX { +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenTableMapper.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenTableMapper.java new file mode 100644 index 000000000..a4e0dfe1a --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenTableMapper.java @@ -0,0 +1,15 @@ +package cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen; + +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ToolCodegenTableMapper extends BaseMapperX { + + default ToolCodegenTableDO selectByTableName(String tableName) { + return selectOne(new QueryWrapper().eq("table_name", tableName)); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapper.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapper.java index 05fe395d8..1aaed37e6 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolInformationSchemaTableMapper.java @@ -14,4 +14,8 @@ public interface ToolInformationSchemaTableMapper extends BaseMapperX().eq("table_schema", tableSchema)); } + default ToolInformationSchemaTableDO selectByTableName(String tableName) { + return selectOne(new QueryWrapper().eq("table_name", tableName)); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java index f1f791034..8eec060df 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/enums/codegen/ToolCodegenColumnHtmlTypeEnum.java @@ -16,13 +16,14 @@ public enum ToolCodegenColumnHtmlTypeEnum { RADIO("radio"), // 单选框 CHECKBOX("checkbox"), // 复选框 DATETIME("datetime"), // 日期控件 - UPLOAD_IMAGE("upload_image"), // 上传控件 + UPLOAD_IMAGE("upload_image"), // 上传图片 + UPLOAD_FILE("upload_file"), // 上传文件 EDITOR("editor"), // 富文本控件 ; /** * 条件 */ - private final String condition; + private final String type; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java new file mode 100644 index 000000000..cc12b0945 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenService.java @@ -0,0 +1,18 @@ +package cn.iocoder.dashboard.modules.tool.service.codegen; + +/** + * 代码生成 Service 接口 + * + * @author 芋道源码 + */ +public interface ToolCodegenService { + + /** + * 基于数据库的表结构,创建代码生成器的表定义 + * + * @param tableName 表名称 + * @return 表定义的编号 + */ + Long createCodegenTable(String tableName); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java new file mode 100644 index 000000000..d1094539d --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java @@ -0,0 +1,222 @@ +package cn.iocoder.dashboard.modules.tool.service.codegen.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.modules.tool.convert.codegen.CodegenConvert; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenColumnMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenTableMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolInformationSchemaColumnMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolInformationSchemaTableMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; +import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; +import com.google.common.collect.Sets; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +/** + * 代码生成 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class ToolCodegenServiceImpl implements ToolCodegenService { + + /** + * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map columnListOperationConditionMappings = + MapUtil.builder() + .put("name", ToolCodegenColumnListConditionEnum.LIKE) + .put("time", ToolCodegenColumnListConditionEnum.BETWEEN) + .put("date", ToolCodegenColumnListConditionEnum.BETWEEN) + .build(); + + /** + * 字段名与 {@link ToolCodegenColumnHtmlTypeEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map columnHtmlTypeMappings = + MapUtil.builder() + .put("status", ToolCodegenColumnHtmlTypeEnum.RADIO) + .put("sex", ToolCodegenColumnHtmlTypeEnum.RADIO) + .put("type", ToolCodegenColumnHtmlTypeEnum.SELECT) + .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) + .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) + .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) + .build(); + + /** + * 新增操作,不需要传递的字段 + */ + private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet( + "id"); + /** + * 修改操作,不需要传递的字段 + */ + private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); + /** + * 列表操作的条件,不需要传递的字段 + */ + private static final Set LIST_OPERATION_CONDITION_COLUMN = Sets.newHashSet(); + /** + * 列表操作的结果,不需要返回的字段 + */ + private static final Set LIST_OPERATION_RESULT_COLUMN = Sets.newHashSet(); + + /** + * Java 类型与 MySQL 类型的映射关系 + */ + private static final Map> javaTypeMappings = MapUtil.>builder() + .put(Boolean.class.getSimpleName(), Sets.newHashSet("bit")) + .put(Integer.class.getSimpleName(), Sets.newHashSet("tinyint", "smallint", "mediumint", "int")) + .put(Long.class.getSimpleName(), Collections.singleton("bigint")) + .put(Double.class.getSimpleName(), Sets.newHashSet("float", "double")) + .put(BigDecimal.class.getSimpleName(), Sets.newHashSet("decimal", "numeric")) + .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本 + "char", "varchar", "nvarchar", "varchar2")) // 短文本 + .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp")) + .build(); + + static { + Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> { + CREATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); + UPDATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); + LIST_OPERATION_CONDITION_COLUMN.add(field.getName()); + LIST_OPERATION_RESULT_COLUMN.add(field.getName()); + }); + LIST_OPERATION_RESULT_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 + } + + @Resource + private ToolInformationSchemaTableMapper informationSchemaTableMapper; + @Resource + private ToolInformationSchemaColumnMapper informationSchemaColumnMapper; + @Resource + private ToolCodegenTableMapper codegenTableMapper; + @Resource + private ToolCodegenColumnMapper codegenColumnMapper; + + @Override + @Transactional + public Long createCodegenTable(String tableName) { + // 从数据库中,获得数据库表结构 + ToolInformationSchemaTableDO schemaTable = informationSchemaTableMapper.selectByTableName(tableName); + if (schemaTable == null) { + throw new RuntimeException(""); // TODO + } + List schemaColumns = informationSchemaColumnMapper.selectListByTableName(tableName); + if (CollUtil.isEmpty(schemaColumns)) { + throw new RuntimeException(""); // TODO + } + // 校验是否已经存在 + if (codegenTableMapper.selectByTableName(tableName) != null) { + throw new RuntimeException(""); // TODO + } + + // 将 table 插入到数据库 + ToolCodegenTableDO table = CodegenConvert.INSTANCE.convert(schemaTable); + initTableDefault(table); + codegenTableMapper.insert(table); + // 将 column 插入到数据库 + List columns = CodegenConvert.INSTANCE.convertList(schemaColumns); + columns.forEach(column -> { + initColumnDefault(column); + column.setTableId(table.getId()); + codegenColumnMapper.insert(column); + }); + return table.getId(); + } + + /** + * 初始化 Table 表的默认字段 + * + * @param table 表定义 + */ + private void initTableDefault(ToolCodegenTableDO table) { + table.setModuleName(StrUtil.subBefore(table.getTableName(), + '_', false)); // 第一个 _ 前缀的前面,作为 module 名字 + table.setBusinessName(StrUtil.subAfter(table.getTableName(), + '_', false)); // 第一个 _ 前缀的后面,作为 module 名字 + table.setBusinessName(StrUtil.toCamelCase(table.getBusinessName())); // 可能存在多个 _ 的情况,转换成驼峰 + table.setClassName(StrUtil.toCamelCase(table.getClassName())); // 驼峰 + table.setClassComment(StrUtil.subBefore(table.getClassComment(), // 去除结尾的表,作为类描述 + '表', true)); + table.setAuthor("芋艿"); // TODO 稍后改成创建人 + } + + /** + * 初始化 Column 列的默认字段 + * + * @param column 列定义 + */ + private void initColumnDefault(ToolCodegenColumnDO column) { + // 处理 Java 相关的字段的默认值 + processColumnJava(column); + // 处理 CRUD 相关的字段的默认值 + processColumnOperation(column); + // 处理 UI 相关的字段的默认值 + processColumnUI(column); + } + + private void processColumnJava(ToolCodegenColumnDO column) { + // 处理 javaField 字段 + column.setJavaField(StrUtil.toCamelCase(column.getColumnName())); + // 处理 dictType 字段,暂无 + // 处理 javaType 字段 + String dbType = StrUtil.subBefore(column.getColumnName(), ')', false); + javaTypeMappings.entrySet().stream() + .filter(entry -> entry.getValue().contains(dbType)) + .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); + if (column.getJavaType() == null) { + throw new IllegalStateException(String.format("column(%s) 的数据库类型(%s) 找不到匹配的 Java 类型", + column.getColumnName(), column.getColumnType())); + } + } + + private void processColumnOperation(ToolCodegenColumnDO column) { + // 处理 createOperation 字段 + column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getColumnName()) + && !column.getPrimaryKey()); // 非主键 + // 处理 updateOperation 字段 + column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getColumnName())); + // 处理 listOperationResult 字段 + column.setListOperationResult(!LIST_OPERATION_RESULT_COLUMN.contains(column.getColumnName())); + // 处理 listOperationCondition 字段。默认设置为需要过滤的条件,手动进行取消 + if (!LIST_OPERATION_CONDITION_COLUMN.contains(column.getColumnName()) + && !column.getPrimaryKey()) { // 非主键 + column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); + } + columnListOperationConditionMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getColumnName(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); + } + + private void processColumnUI(ToolCodegenColumnDO column) { + // 基于后缀进行匹配 + columnHtmlTypeMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getColumnName(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); + // 如果是 Boolean 类型时,设置为 radio 类型. + // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. + if (Boolean.class.getSimpleName().equals(column.getJavaType())) { + column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.RADIO.getType()); + } + // 兜底,设置默认为 input 类型 + if (column.getHtmlType() == null) { + column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.INPUT.getType()); + } + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/package-info.java new file mode 100644 index 000000000..5c89d1db5 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.tool.service; From 1bea2ea7f8034863a8f994e006df01070865760e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 1 Feb 2021 00:48:19 +0800 Subject: [PATCH 008/167] =?UTF-8?q?=E5=BC=95=E5=85=A5=20Velocity=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=BC=95=E6=93=8E=EF=BC=8C=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BB=A3=E7=A0=81~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 ++ .../mysql/dataobject/dict/SysDictTypeDO.java | 7 +- .../dao/coegen/ToolCodegenColumnMapper.java | 10 +++ .../codegen/ToolCodegenColumnDO.java | 9 ++- .../codegen/impl/ToolCodegenEngine.java | 44 +++++++++++++ .../codegen/impl/ToolCodegenServiceImpl.java | 64 +++++++++---------- src/main/resources/codegen/dal/do.vm | 30 +++++++++ .../codegen/impl/ToolCodegenEngineTest.java | 32 ++++++++++ .../impl/ToolCodegenServiceImplTest.java | 22 +++++++ 9 files changed, 187 insertions(+), 38 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java create mode 100644 src/main/resources/codegen/dal/do.vm create mode 100644 src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java diff --git a/pom.xml b/pom.xml index dd9fbe7d0..d93101c89 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,7 @@ 1.4.1.Final 5.5.6 2.2.7 + 2.2 @@ -221,6 +222,12 @@ ${easyexcel.verion} + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dict/SysDictTypeDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dict/SysDictTypeDO.java index e9816a5bd..bb663d182 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dict/SysDictTypeDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dict/SysDictTypeDO.java @@ -5,8 +5,7 @@ import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.*; /** * 字典类型表 @@ -16,6 +15,10 @@ import lombok.EqualsAndHashCode; @TableName("sys_dict_type") @Data @EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor public class SysDictTypeDO extends BaseDO { /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenColumnMapper.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenColumnMapper.java index 9e88678f4..ee570ba4f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenColumnMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dao/coegen/ToolCodegenColumnMapper.java @@ -2,8 +2,18 @@ package cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen; import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + @Mapper public interface ToolCodegenColumnMapper extends BaseMapperX { + + default List selectByTableId(Long tableId) { + return selectList(new QueryWrapper() + .eq("table_id", tableId) + .orderByAsc("ordinal_position")); + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java index cebb37343..4cc7e9a33 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java @@ -95,16 +95,19 @@ public class ToolCodegenColumnDO extends BaseDO { */ private Boolean updateOperation; /** - * 是否为 List 查询操作的返回字段 + * 是否为 List 查询操作的字段 */ - private Boolean listOperationResult; + private Boolean listOperation; /** * List 查询操作的条件类型 - * 如果为空,则说明不是查询字段 * * 枚举 {@link ToolCodegenColumnListConditionEnum} */ private String listOperationCondition; + /** + * 是否为 List 查询操作的返回字段 + */ + private Boolean listOperationResult; // ========== UI 相关字段 ========== diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java new file mode 100644 index 000000000..8e89e4e8c --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -0,0 +1,44 @@ +package cn.iocoder.dashboard.modules.tool.service.codegen.impl; + +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.TemplateUtil; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 代码生成的引擎,用于具体生成代码 + * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 + * + * 考虑到 Java 模板引擎的框架非常多,Freemarker、Velocity、Thymeleaf 等等,所以我们采用 hutool 封装的 {@link cn.hutool.extra.template.Template} 抽象 + * + * @author 芋道源码 + */ +@Component +public class ToolCodegenEngine { + + /** + * 模板引擎,由 hutool 实现 + */ + private final TemplateEngine templateEngine; + + public ToolCodegenEngine() { + TemplateConfig config = new TemplateConfig(); + config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); + this.templateEngine = TemplateUtil.createEngine(config); + } + + public void execute(ToolCodegenTableDO table, List columns) { + Map bindingMap = new HashMap<>(); + bindingMap.put("table", table); + bindingMap.put("columns", columns); + String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); + System.out.println(result); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java index d1094539d..d8b5b2421 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java @@ -5,16 +5,9 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.dashboard.modules.tool.convert.codegen.CodegenConvert; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenColumnMapper; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenTableMapper; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolInformationSchemaColumnMapper; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolInformationSchemaTableMapper; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; -import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.*; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.*; +import cn.iocoder.dashboard.modules.tool.enums.codegen.*; import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; import com.google.common.collect.Sets; import org.springframework.stereotype.Service; @@ -60,8 +53,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { /** * 新增操作,不需要传递的字段 */ - private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet( - "id"); + private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); /** * 修改操作,不需要传递的字段 */ @@ -69,11 +61,11 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { /** * 列表操作的条件,不需要传递的字段 */ - private static final Set LIST_OPERATION_CONDITION_COLUMN = Sets.newHashSet(); + private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); /** * 列表操作的结果,不需要返回的字段 */ - private static final Set LIST_OPERATION_RESULT_COLUMN = Sets.newHashSet(); + private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); /** * Java 类型与 MySQL 类型的映射关系 @@ -90,13 +82,15 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { .build(); static { + // 处理 OPERATION 相关的字段 Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> { CREATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); UPDATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); - LIST_OPERATION_CONDITION_COLUMN.add(field.getName()); - LIST_OPERATION_RESULT_COLUMN.add(field.getName()); + LIST_OPERATION_EXCLUDE_COLUMN.add(field.getName()); + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.add(field.getName()); }); - LIST_OPERATION_RESULT_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 + LIST_OPERATION_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是可能需要传递的 + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 } @Resource @@ -134,7 +128,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { columns.forEach(column -> { initColumnDefault(column); column.setTableId(table.getId()); - codegenColumnMapper.insert(column); + codegenColumnMapper.insert(column); // TODO 批量插入 }); return table.getId(); } @@ -150,10 +144,11 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { table.setBusinessName(StrUtil.subAfter(table.getTableName(), '_', false)); // 第一个 _ 前缀的后面,作为 module 名字 table.setBusinessName(StrUtil.toCamelCase(table.getBusinessName())); // 可能存在多个 _ 的情况,转换成驼峰 - table.setClassName(StrUtil.toCamelCase(table.getClassName())); // 驼峰 - table.setClassComment(StrUtil.subBefore(table.getClassComment(), // 去除结尾的表,作为类描述 + table.setClassName(StrUtil.upperFirst(StrUtil.toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 + table.setClassComment(StrUtil.subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 '表', true)); table.setAuthor("芋艿"); // TODO 稍后改成创建人 + table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); } /** @@ -175,7 +170,7 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { column.setJavaField(StrUtil.toCamelCase(column.getColumnName())); // 处理 dictType 字段,暂无 // 处理 javaType 字段 - String dbType = StrUtil.subBefore(column.getColumnName(), ')', false); + String dbType = StrUtil.subBefore(column.getColumnType(), '(', false); javaTypeMappings.entrySet().stream() .filter(entry -> entry.getValue().contains(dbType)) .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); @@ -187,26 +182,29 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { private void processColumnOperation(ToolCodegenColumnDO column) { // 处理 createOperation 字段 - column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getColumnName()) - && !column.getPrimaryKey()); // 非主键 + column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,创建时无需传递 // 处理 updateOperation 字段 - column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getColumnName())); - // 处理 listOperationResult 字段 - column.setListOperationResult(!LIST_OPERATION_RESULT_COLUMN.contains(column.getColumnName())); - // 处理 listOperationCondition 字段。默认设置为需要过滤的条件,手动进行取消 - if (!LIST_OPERATION_CONDITION_COLUMN.contains(column.getColumnName()) - && !column.getPrimaryKey()) { // 非主键 + column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + || column.getPrimaryKey()); // 对于主键,更新时需要传递 + // 处理 listOperation 字段 + column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 + // 处理 listOperationCondition 字段 + columnListOperationConditionMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); + if (column.getListOperationCondition() == null) { column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); } - columnListOperationConditionMappings.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getColumnName(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); + // 处理 listOperationResult 字段 + column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); } private void processColumnUI(ToolCodegenColumnDO column) { // 基于后缀进行匹配 columnHtmlTypeMappings.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getColumnName(), entry.getKey())) + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); // 如果是 Boolean 类型时,设置为 radio 类型. // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. diff --git a/src/main/resources/codegen/dal/do.vm b/src/main/resources/codegen/dal/do.vm new file mode 100644 index 000000000..0e5db0e7b --- /dev/null +++ b/src/main/resources/codegen/dal/do.vm @@ -0,0 +1,30 @@ +import com.baomidou.mybatisplus.annotation.*; +import lombok.*; +import java.util.*; + +/** +* ${table.description} +*/ +@TableName("${table.tableName}") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ${table.tableName}DO extends BaseDO { + +#foreach ($column in $columns) + /** + * ${column.columnComment} + */ +#if(${column.primaryKey} && ${column.javaType} != 'String') + @TableId +#end +#if(${column.primaryKey} && ${column.javaType} == 'String') + @TableId(type = IdType.INPUT) +#end + private ${column.javaType} ${column.javaField}; +#end + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java new file mode 100644 index 000000000..faf4d850b --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java @@ -0,0 +1,32 @@ +package cn.iocoder.dashboard.modules.tool.service.codegen.impl; + +import cn.iocoder.dashboard.TestApplication; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenColumnMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenTableMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; +import java.util.List; + +@SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class ToolCodegenEngineTest { + + @Resource + private ToolCodegenTableMapper codegenTableMapper; + @Resource + private ToolCodegenColumnMapper codegenColumnMapper; + + @Resource + private ToolCodegenEngine codegenEngine; + + @Test + public void testExecute() { + ToolCodegenTableDO table = codegenTableMapper.selectById(8); + List columns = codegenColumnMapper.selectByTableId(table.getId()); + codegenEngine.execute(table, columns); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java new file mode 100644 index 000000000..f534e9769 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java @@ -0,0 +1,22 @@ +package cn.iocoder.dashboard.modules.tool.service.codegen.impl; + +import cn.iocoder.dashboard.TestApplication; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class ToolCodegenServiceImplTest { + + @Resource + private ToolCodegenServiceImpl toolCodegenService; + + @Test + public void tetCreateCodegenTable() { + toolCodegenService.createCodegenTable("sys_dict_type"); + } + +} From 6c5c32c845468706274f6c074ef6222748d8611d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 2 Feb 2021 00:06:38 +0800 Subject: [PATCH 009/167] =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E5=87=BA=20ToolCodeg?= =?UTF-8?q?enBuilder=20=E7=B1=BB=EF=BC=8C=E8=B4=9F=E8=B4=A3=20table=20?= =?UTF-8?q?=E5=92=8C=20column=20=E7=9A=84=E6=9E=84=E5=BB=BA=EF=BC=8C?= =?UTF-8?q?=E8=AE=A9=20ToolCodegenService=20=E4=B8=93=E6=B3=A8=E4=BA=8E?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=9A=84=E7=BB=84=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codegen/impl/ToolCodegenBuilder.java | 192 ++++++++++++++++++ .../codegen/impl/ToolCodegenServiceImpl.java | 186 ++--------------- 2 files changed, 210 insertions(+), 168 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java new file mode 100644 index 000000000..4abd7349b --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java @@ -0,0 +1,192 @@ +package cn.iocoder.dashboard.modules.tool.service.codegen.impl; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.modules.tool.convert.codegen.CodegenConvert; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; +import com.google.common.collect.Sets; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 代码生成器的 Builder,负责: + * 1. 将数据库的表 {@link ToolInformationSchemaTableDO} 定义,构建成 {@link ToolCodegenTableDO} + * 2. 将数据库的列 {@link ToolInformationSchemaColumnDO} 构定义,建成 {@link ToolCodegenColumnDO} + */ +@Component +public class ToolCodegenBuilder { + + /** + * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map columnListOperationConditionMappings = + MapUtil.builder() + .put("name", ToolCodegenColumnListConditionEnum.LIKE) + .put("time", ToolCodegenColumnListConditionEnum.BETWEEN) + .put("date", ToolCodegenColumnListConditionEnum.BETWEEN) + .build(); + + /** + * 字段名与 {@link ToolCodegenColumnHtmlTypeEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map columnHtmlTypeMappings = + MapUtil.builder() + .put("status", ToolCodegenColumnHtmlTypeEnum.RADIO) + .put("sex", ToolCodegenColumnHtmlTypeEnum.RADIO) + .put("type", ToolCodegenColumnHtmlTypeEnum.SELECT) + .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) + .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) + .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) + .build(); + + /** + * 新增操作,不需要传递的字段 + */ + private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 修改操作,不需要传递的字段 + */ + private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); + /** + * 列表操作的条件,不需要传递的字段 + */ + private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 列表操作的结果,不需要返回的字段 + */ + private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); + + /** + * Java 类型与 MySQL 类型的映射关系 + */ + private static final Map> javaTypeMappings = MapUtil.>builder() + .put(Boolean.class.getSimpleName(), Sets.newHashSet("bit")) + .put(Integer.class.getSimpleName(), Sets.newHashSet("tinyint", "smallint", "mediumint", "int")) + .put(Long.class.getSimpleName(), Collections.singleton("bigint")) + .put(Double.class.getSimpleName(), Sets.newHashSet("float", "double")) + .put(BigDecimal.class.getSimpleName(), Sets.newHashSet("decimal", "numeric")) + .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本 + "char", "varchar", "nvarchar", "varchar2")) // 短文本 + .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp")) + .build(); + + static { + // 处理 OPERATION 相关的字段 + Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> { + CREATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); + UPDATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); + LIST_OPERATION_EXCLUDE_COLUMN.add(field.getName()); + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.add(field.getName()); + }); + LIST_OPERATION_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是可能需要传递的 + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 + } + + public ToolCodegenTableDO buildTable(ToolInformationSchemaTableDO schemaTable) { + ToolCodegenTableDO table = CodegenConvert.INSTANCE.convert(schemaTable); + initTableDefault(table); + return table; + } + + /** + * 初始化 Table 表的默认字段 + * + * @param table 表定义 + */ + private void initTableDefault(ToolCodegenTableDO table) { + table.setModuleName(StrUtil.subBefore(table.getTableName(), + '_', false)); // 第一个 _ 前缀的前面,作为 module 名字 + table.setBusinessName(StrUtil.subAfter(table.getTableName(), + '_', false)); // 第一个 _ 前缀的后面,作为 module 名字 + table.setBusinessName(StrUtil.toCamelCase(table.getBusinessName())); // 可能存在多个 _ 的情况,转换成驼峰 + table.setClassName(StrUtil.upperFirst(StrUtil.toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 + table.setClassComment(StrUtil.subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 + '表', true)); + table.setAuthor("芋艿"); // TODO 稍后改成创建人 + table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); + } + + public List buildColumns(List schemaColumns) { + List columns = CodegenConvert.INSTANCE.convertList(schemaColumns); + columns.forEach(this::initColumnDefault); + return columns; + } + + /** + * 初始化 Column 列的默认字段 + * + * @param column 列定义 + */ + private void initColumnDefault(ToolCodegenColumnDO column) { + // 处理 Java 相关的字段的默认值 + processColumnJava(column); + // 处理 CRUD 相关的字段的默认值 + processColumnOperation(column); + // 处理 UI 相关的字段的默认值 + processColumnUI(column); + } + + private void processColumnJava(ToolCodegenColumnDO column) { + // 处理 javaField 字段 + column.setJavaField(StrUtil.toCamelCase(column.getColumnName())); + // 处理 dictType 字段,暂无 + // 处理 javaType 字段 + String dbType = StrUtil.subBefore(column.getColumnType(), '(', false); + javaTypeMappings.entrySet().stream() + .filter(entry -> entry.getValue().contains(dbType)) + .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); + if (column.getJavaType() == null) { + throw new IllegalStateException(String.format("column(%s) 的数据库类型(%s) 找不到匹配的 Java 类型", + column.getColumnName(), column.getColumnType())); + } + } + + private void processColumnOperation(ToolCodegenColumnDO column) { + // 处理 createOperation 字段 + column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,创建时无需传递 + // 处理 updateOperation 字段 + column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + || column.getPrimaryKey()); // 对于主键,更新时需要传递 + // 处理 listOperation 字段 + column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 + // 处理 listOperationCondition 字段 + columnListOperationConditionMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); + if (column.getListOperationCondition() == null) { + column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); + } + // 处理 listOperationResult 字段 + column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); + } + + private void processColumnUI(ToolCodegenColumnDO column) { + // 基于后缀进行匹配 + columnHtmlTypeMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); + // 如果是 Boolean 类型时,设置为 radio 类型. + // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. + if (Boolean.class.getSimpleName().equals(column.getJavaType())) { + column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.RADIO.getType()); + } + // 兜底,设置默认为 input 类型 + if (column.getHtmlType() == null) { + column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.INPUT.getType()); + } + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java index d8b5b2421..d23ecee2b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java @@ -1,21 +1,20 @@ package cn.iocoder.dashboard.modules.tool.service.codegen.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; -import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.tool.convert.codegen.CodegenConvert; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.*; -import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.*; -import cn.iocoder.dashboard.modules.tool.enums.codegen.*; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenColumnMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenTableMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolInformationSchemaColumnMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolInformationSchemaTableMapper; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; -import com.google.common.collect.Sets; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.math.BigDecimal; -import java.util.*; +import java.util.List; /** * 代码生成 Service 实现类 @@ -25,74 +24,6 @@ import java.util.*; @Service public class ToolCodegenServiceImpl implements ToolCodegenService { - /** - * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 - * 注意,字段的匹配以后缀的方式 - */ - private static final Map columnListOperationConditionMappings = - MapUtil.builder() - .put("name", ToolCodegenColumnListConditionEnum.LIKE) - .put("time", ToolCodegenColumnListConditionEnum.BETWEEN) - .put("date", ToolCodegenColumnListConditionEnum.BETWEEN) - .build(); - - /** - * 字段名与 {@link ToolCodegenColumnHtmlTypeEnum} 的默认映射 - * 注意,字段的匹配以后缀的方式 - */ - private static final Map columnHtmlTypeMappings = - MapUtil.builder() - .put("status", ToolCodegenColumnHtmlTypeEnum.RADIO) - .put("sex", ToolCodegenColumnHtmlTypeEnum.RADIO) - .put("type", ToolCodegenColumnHtmlTypeEnum.SELECT) - .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) - .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) - .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) - .build(); - - /** - * 新增操作,不需要传递的字段 - */ - private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); - /** - * 修改操作,不需要传递的字段 - */ - private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); - /** - * 列表操作的条件,不需要传递的字段 - */ - private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); - /** - * 列表操作的结果,不需要返回的字段 - */ - private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); - - /** - * Java 类型与 MySQL 类型的映射关系 - */ - private static final Map> javaTypeMappings = MapUtil.>builder() - .put(Boolean.class.getSimpleName(), Sets.newHashSet("bit")) - .put(Integer.class.getSimpleName(), Sets.newHashSet("tinyint", "smallint", "mediumint", "int")) - .put(Long.class.getSimpleName(), Collections.singleton("bigint")) - .put(Double.class.getSimpleName(), Sets.newHashSet("float", "double")) - .put(BigDecimal.class.getSimpleName(), Sets.newHashSet("decimal", "numeric")) - .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本 - "char", "varchar", "nvarchar", "varchar2")) // 短文本 - .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp")) - .build(); - - static { - // 处理 OPERATION 相关的字段 - Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> { - CREATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); - UPDATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); - LIST_OPERATION_EXCLUDE_COLUMN.add(field.getName()); - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.add(field.getName()); - }); - LIST_OPERATION_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是可能需要传递的 - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 - } - @Resource private ToolInformationSchemaTableMapper informationSchemaTableMapper; @Resource @@ -102,6 +33,11 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { @Resource private ToolCodegenColumnMapper codegenColumnMapper; + @Resource + private ToolCodegenBuilder codegenBuilder; + @Resource + private ToolCodegenEngine codegenEngine; + @Override @Transactional public Long createCodegenTable(String tableName) { @@ -119,102 +55,16 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { throw new RuntimeException(""); // TODO } - // 将 table 插入到数据库 - ToolCodegenTableDO table = CodegenConvert.INSTANCE.convert(schemaTable); - initTableDefault(table); + // 构建 ToolCodegenTableDO 对象,插入到 DB 中 + ToolCodegenTableDO table = codegenBuilder.buildTable(schemaTable); codegenTableMapper.insert(table); - // 将 column 插入到数据库 - List columns = CodegenConvert.INSTANCE.convertList(schemaColumns); + // 构建 ToolCodegenColumnDO 数组,插入到 DB 中 + List columns = codegenBuilder.buildColumns(schemaColumns); columns.forEach(column -> { - initColumnDefault(column); column.setTableId(table.getId()); codegenColumnMapper.insert(column); // TODO 批量插入 }); return table.getId(); } - /** - * 初始化 Table 表的默认字段 - * - * @param table 表定义 - */ - private void initTableDefault(ToolCodegenTableDO table) { - table.setModuleName(StrUtil.subBefore(table.getTableName(), - '_', false)); // 第一个 _ 前缀的前面,作为 module 名字 - table.setBusinessName(StrUtil.subAfter(table.getTableName(), - '_', false)); // 第一个 _ 前缀的后面,作为 module 名字 - table.setBusinessName(StrUtil.toCamelCase(table.getBusinessName())); // 可能存在多个 _ 的情况,转换成驼峰 - table.setClassName(StrUtil.upperFirst(StrUtil.toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 - table.setClassComment(StrUtil.subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 - '表', true)); - table.setAuthor("芋艿"); // TODO 稍后改成创建人 - table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); - } - - /** - * 初始化 Column 列的默认字段 - * - * @param column 列定义 - */ - private void initColumnDefault(ToolCodegenColumnDO column) { - // 处理 Java 相关的字段的默认值 - processColumnJava(column); - // 处理 CRUD 相关的字段的默认值 - processColumnOperation(column); - // 处理 UI 相关的字段的默认值 - processColumnUI(column); - } - - private void processColumnJava(ToolCodegenColumnDO column) { - // 处理 javaField 字段 - column.setJavaField(StrUtil.toCamelCase(column.getColumnName())); - // 处理 dictType 字段,暂无 - // 处理 javaType 字段 - String dbType = StrUtil.subBefore(column.getColumnType(), '(', false); - javaTypeMappings.entrySet().stream() - .filter(entry -> entry.getValue().contains(dbType)) - .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); - if (column.getJavaType() == null) { - throw new IllegalStateException(String.format("column(%s) 的数据库类型(%s) 找不到匹配的 Java 类型", - column.getColumnName(), column.getColumnType())); - } - } - - private void processColumnOperation(ToolCodegenColumnDO column) { - // 处理 createOperation 字段 - column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - && !column.getPrimaryKey()); // 对于主键,创建时无需传递 - // 处理 updateOperation 字段 - column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - || column.getPrimaryKey()); // 对于主键,更新时需要传递 - // 处理 listOperation 字段 - column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 - // 处理 listOperationCondition 字段 - columnListOperationConditionMappings.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); - if (column.getListOperationCondition() == null) { - column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); - } - // 处理 listOperationResult 字段 - column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); - } - - private void processColumnUI(ToolCodegenColumnDO column) { - // 基于后缀进行匹配 - columnHtmlTypeMappings.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); - // 如果是 Boolean 类型时,设置为 radio 类型. - // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. - if (Boolean.class.getSimpleName().equals(column.getJavaType())) { - column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.RADIO.getType()); - } - // 兜底,设置默认为 input 类型 - if (column.getHtmlType() == null) { - column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.INPUT.getType()); - } - } - } From 528d2a9bca4b1aec64010b2d0b461880a3ea526d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 2 Feb 2021 01:07:11 +0800 Subject: [PATCH 010/167] =?UTF-8?q?=E5=AE=8C=E6=88=90=20do=20=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E7=9A=84=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/OldCommonStatusEnum.java | 27 ------------------- .../codegen/impl/ToolCodegenBuilder.java | 15 ++++++----- .../codegen/impl/ToolCodegenEngine.java | 5 ++++ src/main/resources/application.yaml | 5 +++- src/main/resources/codegen/dal/do.vm | 18 ++++++++++--- 5 files changed, 32 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/cn/iocoder/dashboard/common/enums/OldCommonStatusEnum.java diff --git a/src/main/java/cn/iocoder/dashboard/common/enums/OldCommonStatusEnum.java b/src/main/java/cn/iocoder/dashboard/common/enums/OldCommonStatusEnum.java deleted file mode 100644 index 315229f54..000000000 --- a/src/main/java/cn/iocoder/dashboard/common/enums/OldCommonStatusEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.dashboard.common.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 通用状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum OldCommonStatusEnum { - - ENABLE("0", "开启"), - DISABLE("1", "关闭"); - - /** - * 状态值 - */ - private final String status; - /** - * 状态名 - */ - private final String name; - -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java index 4abd7349b..4250c2886 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java @@ -50,6 +50,10 @@ public class ToolCodegenBuilder { .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) .build(); + /** + * {@link BaseDO} 的字段 + */ + public static final Set BASE_DO_FIELDS = new HashSet<>(); /** * 新增操作,不需要传递的字段 */ @@ -82,14 +86,13 @@ public class ToolCodegenBuilder { .build(); static { + Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> BASE_DO_FIELDS.add(field.getName())); // 处理 OPERATION 相关的字段 - Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> { - CREATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); - UPDATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); - LIST_OPERATION_EXCLUDE_COLUMN.add(field.getName()); - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.add(field.getName()); - }); + CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); LIST_OPERATION_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是可能需要传递的 + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 8e89e4e8c..6e03d59cb 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.tool.service.codegen.impl; import cn.hutool.extra.template.TemplateConfig; import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateUtil; +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; import org.springframework.stereotype.Component; @@ -37,6 +38,10 @@ public class ToolCodegenEngine { Map bindingMap = new HashMap<>(); bindingMap.put("table", table); bindingMap.put("columns", columns); + bindingMap.put("basePackage", "cn.iocoder.dashboard.modules"); // TODO 基础包 + // DO 类,独有字段 + bindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); + bindingMap.put("baseDOClassName", BaseDO.class.getName()); String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); System.out.println(result); } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index e313d6e47..634cbd325 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -39,6 +39,9 @@ spring: write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 fail-on-empty-beans: false # 允许序列化无属性的 Bean + main: + lazy-initialization: true # TODO 芋艿:本地开发环境,可以配置下 lazy 延迟加载 + # 芋道配置项,设置当前项目所有自定义的配置 yudao: version: 1.0.0 @@ -79,7 +82,7 @@ apollo: mybatis-plus: configuration: map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 global-config: db-config: id-type: auto # 自增 ID diff --git a/src/main/resources/codegen/dal/do.vm b/src/main/resources/codegen/dal/do.vm index 0e5db0e7b..e01778d60 100644 --- a/src/main/resources/codegen/dal/do.vm +++ b/src/main/resources/codegen/dal/do.vm @@ -1,9 +1,14 @@ +package ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}; + import com.baomidou.mybatisplus.annotation.*; +import ${baseDOClassName}; import lombok.*; import java.util.*; /** -* ${table.description} +* ${table.classComment} DO +* +* @author ${table.author} */ @TableName("${table.tableName}") @Data @@ -12,19 +17,24 @@ import java.util.*; @Builder @NoArgsConstructor @AllArgsConstructor -public class ${table.tableName}DO extends BaseDO { +public class ${table.className}DO extends BaseDO { #foreach ($column in $columns) +#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 /** * ${column.columnComment} */ -#if(${column.primaryKey} && ${column.javaType} != 'String') +#if ($column.dictType != "")##处理枚举值 + // TODO 枚举 ${column.dictType} +#end +#if (${column.primaryKey} && ${column.javaType} != 'String')##处理主键 + 非 String 的情况 @TableId #end -#if(${column.primaryKey} && ${column.javaType} == 'String') +#if (${column.primaryKey} && ${column.javaType} == 'String')##处理主键 + String 的情况 @TableId(type = IdType.INPUT) #end private ${column.javaType} ${column.javaField}; #end +#end } From 18b6dfa068e6151ba986a5e220d07f26ee565d8b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 2 Feb 2021 22:54:53 +0800 Subject: [PATCH 011/167] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=9A=84=20sql=20=E8=84=9A=E6=9C=AC=20=E7=BC=96=E5=86=99=20map?= =?UTF-8?q?per=20=E7=9A=84=E4=BB=A3=E7=A0=81=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/ruoyi-vue-pro.sql | 441 +++++------------- .../mybatis/core/query/QueryWrapperX.java | 14 + .../dal/mysql/dao/dept/SysDeptMapper.java | 8 +- .../dal/mysql/dao/dict/SysDictDataMapper.java | 4 - .../dal/mysql/dao/dict/SysDictTypeMapper.java | 5 - .../codegen/impl/ToolCodegenEngine.java | 32 +- src/main/resources/codegen/dal/mapper.vm | 42 ++ 7 files changed, 212 insertions(+), 334 deletions(-) create mode 100644 src/main/resources/codegen/dal/mapper.vm diff --git a/sql/ruoyi-vue-pro.sql b/sql/ruoyi-vue-pro.sql index c91c40f55..286afb95c 100644 --- a/sql/ruoyi-vue-pro.sql +++ b/sql/ruoyi-vue-pro.sql @@ -11,148 +11,12 @@ Target Server Version : 50718 File Encoding : 65001 - Date: 28/01/2021 01:32:22 + Date: 02/02/2021 22:52:40 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; --- ---------------------------- --- Table structure for gen_table --- ---------------------------- -DROP TABLE IF EXISTS `gen_table`; -CREATE TABLE `gen_table` ( - `table_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', - `table_name` varchar(200) DEFAULT '' COMMENT '表名称', - `table_comment` varchar(500) DEFAULT '' COMMENT '表描述', - `class_name` varchar(100) DEFAULT '' COMMENT '实体类名称', - `tpl_category` varchar(200) DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', - `package_name` varchar(100) DEFAULT NULL COMMENT '生成包路径', - `module_name` varchar(30) DEFAULT NULL COMMENT '生成模块名', - `business_name` varchar(30) DEFAULT NULL COMMENT '生成业务名', - `function_name` varchar(50) DEFAULT NULL COMMENT '生成功能名', - `function_author` varchar(50) DEFAULT NULL COMMENT '生成功能作者', - `gen_type` char(1) DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', - `gen_path` varchar(200) DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', - `options` varchar(1000) DEFAULT NULL COMMENT '其它生成选项', - `create_by` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`table_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表'; - --- ---------------------------- --- Records of gen_table --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for gen_table_column --- ---------------------------- -DROP TABLE IF EXISTS `gen_table_column`; -CREATE TABLE `gen_table_column` ( - `column_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', - `table_id` varchar(64) DEFAULT NULL COMMENT '归属表编号', - `column_name` varchar(200) DEFAULT NULL COMMENT '列名称', - `column_comment` varchar(500) DEFAULT NULL COMMENT '列描述', - `column_type` varchar(100) DEFAULT NULL COMMENT '列类型', - `java_type` varchar(500) DEFAULT NULL COMMENT 'JAVA类型', - `java_field` varchar(200) DEFAULT NULL COMMENT 'JAVA字段名', - `is_pk` char(1) DEFAULT NULL COMMENT '是否主键(1是)', - `is_increment` char(1) DEFAULT NULL COMMENT '是否自增(1是)', - `is_required` char(1) DEFAULT NULL COMMENT '是否必填(1是)', - `is_insert` char(1) DEFAULT NULL COMMENT '是否为插入字段(1是)', - `is_edit` char(1) DEFAULT NULL COMMENT '是否编辑字段(1是)', - `is_list` char(1) DEFAULT NULL COMMENT '是否列表字段(1是)', - `is_query` char(1) DEFAULT NULL COMMENT '是否查询字段(1是)', - `query_type` varchar(200) DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', - `html_type` varchar(200) DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', - `dict_type` varchar(200) DEFAULT '' COMMENT '字典类型', - `sort` int(11) DEFAULT NULL COMMENT '排序', - `create_by` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`column_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表字段'; - --- ---------------------------- --- Records of gen_table_column --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for gen_table_column_copy1 --- ---------------------------- -DROP TABLE IF EXISTS `gen_table_column_copy1`; -CREATE TABLE `gen_table_column_copy1` ( - `column_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', - `table_id` varchar(64) DEFAULT NULL COMMENT '归属表编号', - `column_name` varchar(200) DEFAULT NULL COMMENT '列名称', - `column_comment` varchar(500) DEFAULT NULL COMMENT '列描述', - `column_type` varchar(100) DEFAULT NULL COMMENT '列类型', - `java_type` varchar(500) DEFAULT NULL COMMENT 'JAVA类型', - `java_field` varchar(200) DEFAULT NULL COMMENT 'JAVA字段名', - `is_pk` char(1) DEFAULT NULL COMMENT '是否主键(1是)', - `is_increment` char(1) DEFAULT NULL COMMENT '是否自增(1是)', - `is_required` char(1) DEFAULT NULL COMMENT '是否必填(1是)', - `is_insert` char(1) DEFAULT NULL COMMENT '是否为插入字段(1是)', - `is_edit` char(1) DEFAULT NULL COMMENT '是否编辑字段(1是)', - `is_list` char(1) DEFAULT NULL COMMENT '是否列表字段(1是)', - `is_query` char(1) DEFAULT NULL COMMENT '是否查询字段(1是)', - `query_type` varchar(200) DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', - `html_type` varchar(200) DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', - `dict_type` varchar(200) DEFAULT '' COMMENT '字典类型', - `sort` int(11) DEFAULT NULL COMMENT '排序', - `create_by` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`column_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表字段'; - --- ---------------------------- --- Records of gen_table_column_copy1 --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for gen_table_copy1 --- ---------------------------- -DROP TABLE IF EXISTS `gen_table_copy1`; -CREATE TABLE `gen_table_copy1` ( - `table_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', - `table_name` varchar(200) DEFAULT '' COMMENT '表名称', - `table_comment` varchar(500) DEFAULT '' COMMENT '表描述', - `class_name` varchar(100) DEFAULT '' COMMENT '实体类名称', - `tpl_category` varchar(200) DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', - `package_name` varchar(100) DEFAULT NULL COMMENT '生成包路径', - `module_name` varchar(30) DEFAULT NULL COMMENT '生成模块名', - `business_name` varchar(30) DEFAULT NULL COMMENT '生成业务名', - `function_name` varchar(50) DEFAULT NULL COMMENT '生成功能名', - `function_author` varchar(50) DEFAULT NULL COMMENT '生成功能作者', - `gen_type` char(1) DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', - `gen_path` varchar(200) DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', - `options` varchar(1000) DEFAULT NULL COMMENT '其它生成选项', - `create_by` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`table_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表'; - --- ---------------------------- --- Records of gen_table_copy1 --- ---------------------------- -BEGIN; -COMMIT; - -- ---------------------------- -- Table structure for inf_config -- ---------------------------- @@ -184,37 +48,6 @@ INSERT INTO `inf_config` VALUES (3, 'ui', 1, '主框架页-侧边栏主题', 'sy INSERT INTO `inf_config` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0'); COMMIT; --- ---------------------------- --- Table structure for inf_config_copy1 --- ---------------------------- -DROP TABLE IF EXISTS `inf_config_copy1`; -CREATE TABLE `inf_config_copy1` ( - `id` int(5) NOT NULL AUTO_INCREMENT COMMENT '参数主键', - `group` varchar(50) NOT NULL COMMENT '参数分组', - `type` tinyint(4) NOT NULL COMMENT '参数类型', - `name` varchar(100) NOT NULL DEFAULT '' COMMENT '参数名称', - `key` varchar(100) NOT NULL DEFAULT '' COMMENT '参数键名', - `value` varchar(500) NOT NULL DEFAULT '' COMMENT '参数键值', - `sensitive` bit(1) NOT NULL COMMENT '是否敏感', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `create_by` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='参数配置表'; - --- ---------------------------- --- Records of inf_config_copy1 --- ---------------------------- -BEGIN; -INSERT INTO `inf_config_copy1` VALUES (1, 'ui', 1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', b'0', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `inf_config_copy1` VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '', '2021-01-21 02:13:02', b'0'); -INSERT INTO `inf_config_copy1` VALUES (3, 'ui', 1, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', b'0', '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', b'0'); -INSERT INTO `inf_config_copy1` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0'); -COMMIT; - -- ---------------------------- -- Table structure for sys_dept -- ---------------------------- @@ -252,43 +85,6 @@ INSERT INTO `sys_dept` VALUES (108, '市场部门', 102, 1, '若依', '158888888 INSERT INTO `sys_dept` VALUES (109, '财务部门', 102, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); COMMIT; --- ---------------------------- --- Table structure for sys_dept_copy1 --- ---------------------------- -DROP TABLE IF EXISTS `sys_dept_copy1`; -CREATE TABLE `sys_dept_copy1` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id', - `name` varchar(30) NOT NULL DEFAULT '' COMMENT '部门名称', - `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父部门id', - `sort` int(4) NOT NULL DEFAULT '0' COMMENT '显示顺序', - `leader` varchar(20) DEFAULT NULL COMMENT '负责人', - `phone` varchar(11) DEFAULT NULL COMMENT '联系电话', - `email` varchar(50) DEFAULT NULL COMMENT '邮箱', - `status` tinyint(4) NOT NULL COMMENT '部门状态(0正常 1停用)', - `create_by` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8mb4 COMMENT='部门表'; - --- ---------------------------- --- Records of sys_dept_copy1 --- ---------------------------- -BEGIN; -INSERT INTO `sys_dept_copy1` VALUES (100, '芋道源码', 0, 0, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-06 19:45:52', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (101, '深圳总公司', 100, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (102, '长沙分公司', 100, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (103, '研发部门', 101, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (104, '市场部门', 101, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (105, '测试部门', 101, 3, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (106, '财务部门', 101, 4, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (107, '运维部门', 101, 5, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (108, '市场部门', 102, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -INSERT INTO `sys_dept_copy1` VALUES (109, '财务部门', 102, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); -COMMIT; - -- ---------------------------- -- Table structure for sys_dict_data -- ---------------------------- @@ -355,72 +151,6 @@ INSERT INTO `sys_dict_data` VALUES (48, 1, '动态超时', '2', 'inf_redis_timeo INSERT INTO `sys_dict_data` VALUES (49, 3, '固定超时', '3', 'inf_redis_timeout_type', 0, 'Redis 设置了过期时间', '', '2021-01-26 00:55:26', '', '2021-01-26 00:55:26', b'0'); COMMIT; --- ---------------------------- --- Table structure for sys_dict_data_copy1 --- ---------------------------- -DROP TABLE IF EXISTS `sys_dict_data_copy1`; -CREATE TABLE `sys_dict_data_copy1` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典编码', - `sort` int(4) NOT NULL DEFAULT '0' COMMENT '字典排序', - `label` varchar(100) NOT NULL DEFAULT '' COMMENT '字典标签', - `value` varchar(100) NOT NULL DEFAULT '' COMMENT '字典键值', - `dict_type` varchar(100) NOT NULL DEFAULT '' COMMENT '字典类型', - `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `create_by` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表'; - --- ---------------------------- --- Records of sys_dict_data_copy1 --- ---------------------------- -BEGIN; -INSERT INTO `sys_dict_data_copy1` VALUES (1, 1, '男', '1', 'sys_user_sex', 0, '性别男', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:53', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (2, 2, '女', '2', 'sys_user_sex', 0, '性别女', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:55', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (8, 1, '正常', '0', 'sys_job_status', 0, '正常状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (9, 2, '暂停', '1', 'sys_job_status', 0, '停用状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', 0, '默认分组', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', 0, '系统分组', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (12, 1, '系统内置', '1', 'sys_config_type', 0, '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:59', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (13, 2, '自定义', '2', 'sys_config_type', 0, '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:51', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (14, 1, '通知', '1', 'sys_notice_type', 0, '通知', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (15, 2, '公告', '2', 'sys_notice_type', 0, '公告', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (16, 0, '其它', '0', 'sys_operate_type', 0, '其它操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:12', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (17, 1, '查询', '1', 'sys_operate_type', 0, '查询操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:10', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (18, 2, '新增', '2', 'sys_operate_type', 0, '新增操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:17', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (19, 3, '修改', '3', 'sys_operate_type', 0, '修改操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:20', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (20, 4, '删除', '4', 'sys_operate_type', 0, '删除操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:24', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (22, 5, '导出', '5', 'sys_operate_type', 0, '导出操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:20', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (23, 6, '导入', '6', 'sys_operate_type', 0, '导入操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:24', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (27, 1, '开启', '0', 'sys_common_status', 0, '开启状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 02:57:12', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (28, 2, '关闭', '1', 'sys_common_status', 0, '关闭状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:32', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (29, 1, '目录', '1', 'sys_menu_type', 0, '目录', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:30', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (30, 2, '菜单', '2', 'sys_menu_type', 0, '菜单', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:35', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (31, 3, '按钮', '3', 'sys_menu_type', 0, '按钮', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:38', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (32, 1, '内置', '1', 'sys_role_type', 0, '内置角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:22', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (33, 2, '自定义', '2', 'sys_role_type', 0, '自定义角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:26', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (34, 1, '全部数据权限', '1', 'sys_data_scope', 0, '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:02', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (35, 2, '指定部门数据权限', '2', 'sys_data_scope', 0, '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:20', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (36, 3, '本部门数据权限', '3', 'sys_data_scope', 0, '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:29', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (37, 4, '本部门及以下数据权限', '4', 'sys_data_scope', 0, '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:32', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (38, 5, '仅本人数据权限', '5', 'sys_data_scope', 0, '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:38', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (39, 0, '成功', '0', 'sys_login_result', 0, '登陆结果 - 成功', '', '2021-01-18 06:17:36', '', '2021-01-18 06:17:36', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (40, 10, '账号或密码不正确', '10', 'sys_login_result', 0, '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '', '2021-01-18 06:17:54', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (41, 20, '用户被禁用', '20', 'sys_login_result', 0, '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:02', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (42, 30, '验证码不存在', '30', 'sys_login_result', 0, '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:24', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (43, 31, '验证码不正确', '31', 'sys_login_result', 0, '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:33', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (44, 100, '未知异常', '100', 'sys_login_result', 0, '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '', '2021-01-18 06:19:57', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (45, 1, '是', 'true', 'sys_boolean_string', 0, 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '', '2021-01-19 03:21:08', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (46, 1, '否', 'false', 'sys_boolean_string', 0, 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '', '2021-01-19 03:21:39', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (47, 1, '永不超时', '1', 'inf_redis_timeout_type', 0, 'Redis 未设置超时的情况', '', '2021-01-26 00:53:17', '', '2021-01-26 00:53:17', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (48, 1, '动态超时', '2', 'inf_redis_timeout_type', 0, '程序里动态传入超时时间,无法固定', '', '2021-01-26 00:55:00', '', '2021-01-26 00:55:00', b'0'); -INSERT INTO `sys_dict_data_copy1` VALUES (49, 3, '固定超时', '3', 'inf_redis_timeout_type', 0, 'Redis 设置了过期时间', '', '2021-01-26 00:55:26', '', '2021-01-26 00:55:26', b'0'); -COMMIT; - -- ---------------------------- -- Table structure for sys_dict_type -- ---------------------------- @@ -458,43 +188,6 @@ INSERT INTO `sys_dict_type` VALUES (104, '登陆结果', 'sys_login_result', 0, INSERT INTO `sys_dict_type` VALUES (105, 'Redis 超时类型', 'inf_redis_timeout_type', 0, 'RedisKeyDefine.TimeoutTypeEnum', '', '2021-01-26 00:52:50', '', '2021-01-26 00:52:50', b'0'); COMMIT; --- ---------------------------- --- Table structure for sys_dict_type_copy1 --- ---------------------------- -DROP TABLE IF EXISTS `sys_dict_type_copy1`; -CREATE TABLE `sys_dict_type_copy1` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典主键', - `name` varchar(100) NOT NULL DEFAULT '' COMMENT '字典名称', - `dict_type` varchar(100) NOT NULL DEFAULT '' COMMENT '字典类型', - `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `create_by` varchar(64) DEFAULT '' COMMENT '创建者', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_by` varchar(64) DEFAULT '' COMMENT '更新者', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `dict_type` (`dict_type`) -) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表'; - --- ---------------------------- --- Records of sys_dict_type_copy1 --- ---------------------------- -BEGIN; -INSERT INTO `sys_dict_type_copy1` VALUES (1, '用户性别', 'sys_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (3, '系统开关', 'sys_normal_disable', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-07 19:47:48', b'1'); -INSERT INTO `sys_dict_type_copy1` VALUES (4, '任务状态', 'sys_job_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (5, '任务分组', 'sys_job_group', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (6, '参数类型', 'sys_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 07:41:04', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (7, '通知类型', 'sys_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (8, '通知状态', 'sys_notice_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (9, '操作类型', 'sys_oper_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (10, '系统状态', 'sys_common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (11, 'Boolean 是否类型', 'sys_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2021-01-19 03:20:08', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (104, '登陆结果', 'sys_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2021-01-18 06:17:11', b'0'); -INSERT INTO `sys_dict_type_copy1` VALUES (105, 'Redis 超时类型', 'inf_redis_timeout_type', 0, 'RedisKeyDefine.TimeoutTypeEnum', '', '2021-01-26 00:52:50', '', '2021-01-26 00:52:50', b'0'); -COMMIT; - -- ---------------------------- -- Table structure for sys_file -- ---------------------------- @@ -587,7 +280,7 @@ CREATE TABLE `sys_login_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; +) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; -- ---------------------------- -- Records of sys_login_log @@ -625,6 +318,14 @@ INSERT INTO `sys_login_log` VALUES (29, 1, 'ad9e244f-4c88-4762-b280-2d46d16081ac INSERT INTO `sys_login_log` VALUES (30, 1, '5032fac5-c6dc-41e4-882b-2dbea01ef1f6', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-21 09:57:18', '', '2021-01-21 09:57:18', b'0'); INSERT INTO `sys_login_log` VALUES (31, 1, '802ca4eb-ac96-4c6b-91de-0e445dc46e78', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-25 21:29:41', '', '2021-01-25 21:29:41', b'0'); INSERT INTO `sys_login_log` VALUES (32, 1, '3aeafd34-af33-4329-8b47-8972ecc72635', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-25 23:59:57', '', '2021-01-25 23:59:57', b'0'); +INSERT INTO `sys_login_log` VALUES (33, 1, '2829acdd-ac0e-40e4-847c-5ef160bded8f', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 05:17:41', '', '2021-01-26 05:17:41', b'0'); +INSERT INTO `sys_login_log` VALUES (34, 1, 'ed9e0038-854a-48d1-8d1a-0ca2faa51635', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 07:55:34', '', '2021-01-26 07:55:34', b'0'); +INSERT INTO `sys_login_log` VALUES (35, 1, 'abb350a3-5cac-49a6-9cce-37e9a675840c', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:26:02', '', '2021-01-26 08:26:02', b'0'); +INSERT INTO `sys_login_log` VALUES (36, 1, '82ba6974-5279-4e7b-8151-569a01b4d666', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:26:25', '', '2021-01-26 08:26:25', b'0'); +INSERT INTO `sys_login_log` VALUES (37, 1, '71c36cd2-23de-4788-af29-d1eaa658fb95', 'admin', 31, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:27:29', '', '2021-01-26 08:27:29', b'0'); +INSERT INTO `sys_login_log` VALUES (38, 1, '8d595ab5-da9c-473b-94c5-8a6efe3bc50e', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:27:33', '', '2021-01-26 08:27:33', b'0'); +INSERT INTO `sys_login_log` VALUES (39, 1, 'b56f5bf7-01c5-43e5-bfc6-b43052518b20', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:29:27', '', '2021-01-26 08:29:27', b'0'); +INSERT INTO `sys_login_log` VALUES (40, 1, '0d22b1ad-9254-490e-a4cc-43c928f293dd', 'admin', 0, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:30:01', '', '2021-01-26 08:30:01', b'0'); COMMIT; -- ---------------------------- @@ -667,7 +368,7 @@ INSERT INTO `sys_menu` VALUES (105, '字典管理', 'system:dict:list', 2, 6, 1, INSERT INTO `sys_menu` VALUES (106, '配置管理', 'infra:config:list', 2, 7, 2, 'config', 'edit', 'infra/config/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:35:39', b'0'); INSERT INTO `sys_menu` VALUES (107, '通知公告', 'system:notice:list', 2, 8, 1, 'notice', 'message', 'system/notice/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (108, '日志管理', '', 1, 9, 1, 'log', 'log', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:34:28', b'0'); -INSERT INTO `sys_menu` VALUES (109, '在线用户', 'monitor:online:list', 2, 1, 2, 'online', 'online', 'monitor/online/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); +INSERT INTO `sys_menu` VALUES (109, '在线用户', 'system:user-session:list', 2, 10, 1, 'user-session', 'online', 'system/session/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:20', b'0'); INSERT INTO `sys_menu` VALUES (110, '定时任务', 'monitor:job:list', 2, 2, 2, 'job', 'job', 'monitor/job/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (111, '数据监控', 'monitor:druid:list', 2, 3, 2, 'druid', 'druid', 'monitor/druid/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); INSERT INTO `sys_menu` VALUES (112, '服务监控', 'monitor:server:list', 2, 4, 2, 'http://127.0.0.1:8080/admin', 'server', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-21 04:58:59', b'0'); @@ -720,9 +421,9 @@ INSERT INTO `sys_menu` VALUES (1040, '操作查询', 'system:operate-log:query', INSERT INTO `sys_menu` VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:23', b'0'); INSERT INTO `sys_menu` VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:26', b'0'); INSERT INTO `sys_menu` VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:30', b'0'); -INSERT INTO `sys_menu` VALUES (1046, '在线查询', 'monitor:online:query', 3, 1, 109, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); -INSERT INTO `sys_menu` VALUES (1047, '批量强退', 'monitor:online:batchLogout', 3, 2, 109, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); -INSERT INTO `sys_menu` VALUES (1048, '单条强退', 'monitor:online:forceLogout', 3, 3, 109, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); +INSERT INTO `sys_menu` VALUES (1046, '在线查询', 'system:user-session:list', 3, 1, 109, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:22:37', b'0'); +INSERT INTO `sys_menu` VALUES (1047, '批量强退', 'monitor:online:batchLogout', 3, 2, 109, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:46', b'1'); +INSERT INTO `sys_menu` VALUES (1048, '单条强退', 'system:user-session:delete', 3, 3, 109, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:22:54', b'0'); INSERT INTO `sys_menu` VALUES (1049, '任务查询', 'monitor:job:query', 3, 1, 110, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); INSERT INTO `sys_menu` VALUES (1050, '任务新增', 'monitor:job:add', 3, 2, 110, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); INSERT INTO `sys_menu` VALUES (1051, '任务修改', 'monitor:job:edit', 3, 3, 110, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); @@ -799,7 +500,7 @@ CREATE TABLE `sys_operate_log` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; +) ENGINE=InnoDB AUTO_INCREMENT=91 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; -- ---------------------------- -- Records of sys_operate_log @@ -886,6 +587,12 @@ INSERT INTO `sys_operate_log` VALUES (81, '78c517c7-191d-46d8-bdc3-5dbeb06be26d' INSERT INTO `sys_operate_log` VALUES (82, 'b8c971f3-fd22-4ed3-b5f9-ffc9a8d34859', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"Redis 监控\",\"permission\":\"\",\"type\":2,\"sort\":\"5\",\"parentId\":2,\"path\":\"redis\",\"icon\":\"redis\",\"component\":\"infra/redis/index\",\"id\":113}}', '2021-01-28 01:23:21', 29, 0, '', 'true', '', '2021-01-26 00:56:30', '', '2021-01-26 00:56:30', b'0'); INSERT INTO `sys_operate_log` VALUES (83, 'e0922d52-0007-4105-a487-692d00d091c3', 1, '菜单 API', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"获得 Redis 监控信息\",\"permission\":\"infra:redis:get-monitor-info\",\"type\":3,\"sort\":\"1\",\"parentId\":113,\"path\":null,\"icon\":null,\"component\":null}}', '2021-01-28 01:29:22', 14, 0, '', '1066', '', '2021-01-26 01:02:31', '', '2021-01-26 01:02:31', b'0'); INSERT INTO `sys_operate_log` VALUES (84, 'f44a431b-395e-45d9-9e6c-3fbdf7617155', 1, '菜单 API', '创建菜单', 2, '', '', 'POST', '/api/system/menu/create', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.createMenu(SysMenuCreateReqVO)', '{\"reqVO\":{\"name\":\"获得 Redis Key 列表\",\"permission\":\"infra:redis:get-key-list\",\"type\":3,\"sort\":\"2\",\"parentId\":113,\"path\":null,\"icon\":null,\"component\":null}}', '2021-01-28 01:29:42', 11, 0, '', '1067', '', '2021-01-26 01:02:52', '', '2021-01-26 01:02:52', b'0'); +INSERT INTO `sys_operate_log` VALUES (85, 'a46dce1a-6ced-4aa5-90f6-8ea979d038a5', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"在线用户\",\"permission\":\"system:user-session:list\",\"type\":2,\"sort\":\"1\",\"parentId\":2,\"path\":\"user-session\",\"icon\":\"online\",\"component\":\"system/session/index\",\"id\":109}}', '2021-01-30 01:08:01', 49, 0, '', 'true', '', '2021-01-26 08:20:55', '', '2021-01-26 08:20:55', b'0'); +INSERT INTO `sys_operate_log` VALUES (86, 'f2092546-cbd3-485e-b54b-95a1448b9985', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"在线用户\",\"permission\":\"system:user-session:list\",\"type\":2,\"sort\":\"10\",\"parentId\":1,\"path\":\"user-session\",\"icon\":\"online\",\"component\":\"system/session/index\",\"id\":109}}', '2021-01-30 01:08:26', 16, 0, '', 'true', '', '2021-01-26 08:21:20', '', '2021-01-26 08:21:20', b'0'); +INSERT INTO `sys_operate_log` VALUES (87, 'c2b446cc-c49e-477f-93de-bf2f900d6483', 1, '菜单 API', '删除菜单', 2, '', '', 'POST', '/api/system/menu/delete', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.deleteMenu(Long)', '{\"id\":1047}', '2021-01-30 01:08:51', 48, 0, '', 'true', '', '2021-01-26 08:21:46', '', '2021-01-26 08:21:46', b'0'); +INSERT INTO `sys_operate_log` VALUES (88, '1597d596-7be2-4af1-b50a-bc169974a4fb', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"在线查询\",\"permission\":\"system:user-session:list\",\"type\":3,\"sort\":\"1\",\"parentId\":109,\"path\":\"#\",\"icon\":\"#\",\"component\":\"\",\"id\":1046}}', '2021-01-30 01:09:43', 16, 0, '', 'true', '', '2021-01-26 08:22:37', '', '2021-01-26 08:22:37', b'0'); +INSERT INTO `sys_operate_log` VALUES (89, 'd8afad81-a738-4b8f-a7f0-bbf4515540e9', 1, '菜单 API', '修改菜单', 2, '', '', 'POST', '/api/system/menu/update', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.permission.SysMenuController.updateMenu(SysMenuUpdateReqVO)', '{\"reqVO\":{\"name\":\"单条强退\",\"permission\":\"system:user-session:delete\",\"type\":3,\"sort\":\"3\",\"parentId\":109,\"path\":\"#\",\"icon\":\"#\",\"component\":\"\",\"id\":1048}}', '2021-01-30 01:10:00', 19, 0, '', 'true', '', '2021-01-26 08:22:54', '', '2021-01-26 08:22:54', b'0'); +INSERT INTO `sys_operate_log` VALUES (90, '28d257d8-d578-4bbe-b671-09d3ce94bda6', 1, '用户 Session API', '删除 Session', 4, '', '', 'DELETE', '/api/system/user-session/delete', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', 'CommonResult cn.iocoder.dashboard.modules.system.controller.auth.SysUserSessionController.delete(String)', '{\"id\":\"73cc914671034f3190f09f520d1b39e9\"}', '2021-01-30 01:16:55', 11, 0, '', 'true', '', '2021-01-26 08:29:50', '', '2021-01-26 08:29:50', b'0'); COMMIT; -- ---------------------------- @@ -1192,4 +899,110 @@ INSERT INTO `sys_user_role` VALUES (6, 100, 2, '', NULL, '', NULL, b'0'); INSERT INTO `sys_user_role` VALUES (7, 104, 101, '', NULL, '', NULL, b'0'); COMMIT; +-- ---------------------------- +-- Table structure for sys_user_session +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_session`; +CREATE TABLE `sys_user_session` ( + `id` varchar(32) NOT NULL COMMENT '会话编号', + `user_id` bigint(20) NOT NULL COMMENT '用户编号', + `user_ip` varchar(50) NOT NULL COMMENT '用户 IP', + `user_agent` varchar(200) NOT NULL COMMENT '浏览器 UA', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户在线 Session'; + +-- ---------------------------- +-- Records of sys_user_session +-- ---------------------------- +BEGIN; +INSERT INTO `sys_user_session` VALUES ('73cc914671034f3190f09f520d1b39e9', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:29:27', '', '2021-01-26 08:29:50', b'1'); +INSERT INTO `sys_user_session` VALUES ('9cc71dc2d7a24b978db1bfe0e4bae349', 1, '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', '', '2021-01-26 08:30:01', '', '2021-01-26 08:30:01', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for tool_codegen_table +-- ---------------------------- +DROP TABLE IF EXISTS `tool_codegen_table`; +CREATE TABLE `tool_codegen_table` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_name` varchar(200) NOT NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) NOT NULL DEFAULT '' COMMENT '表描述', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `module_name` varchar(30) NOT NULL COMMENT '生成模块名', + `business_name` varchar(30) NOT NULL COMMENT '生成业务名', + `class_name` varchar(100) NOT NULL DEFAULT '' COMMENT '实体类名称', + `class_comment` varchar(50) NOT NULL COMMENT '生成功能名', + `author` varchar(50) NOT NULL COMMENT '生成作者', + `template_type` tinyint(4) NOT NULL COMMENT '使用的模板(crud单表操作 tree树表操作)', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `package_name` varchar(100) DEFAULT NULL COMMENT '生成包路径', + `sub_table_name` varchar(64) DEFAULT NULL COMMENT '关联子表的表名', + `sub_table_fk_name` varchar(64) DEFAULT NULL COMMENT '子表关联的外键名', + `options` varchar(1000) DEFAULT NULL COMMENT '其它生成选项', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表定义'; + +-- ---------------------------- +-- Records of tool_codegen_table +-- ---------------------------- +BEGIN; +INSERT INTO `tool_codegen_table` VALUES (8, 'sys_dict_type', '字典类型表', NULL, 'system', 'test', 'SysDictType', '字典类型', '芋艿', 1, '', '2021-01-31 00:24:41', '', '2021-01-31 05:47:01', b'0', NULL, NULL, NULL, NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for tool_codegen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `tool_codegen_table_column`; +CREATE TABLE `tool_codegen_table_column` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` bigint(20) NOT NULL COMMENT '归属表编号', + `column_name` varchar(200) NOT NULL COMMENT '列名称', + `column_type` varchar(100) NOT NULL COMMENT '列类型', + `column_comment` varchar(500) NOT NULL COMMENT '列描述', + `nullable` bit(1) NOT NULL COMMENT '是否必填(1是)', + `primary_key` bit(1) NOT NULL COMMENT '是否主键(1是)', + `auto_Increment` char(1) NOT NULL COMMENT '是否自增(1是)', + `ordinal_position` int(11) NOT NULL COMMENT '排序', + `java_type` varchar(32) NOT NULL COMMENT 'JAVA类型', + `java_field` varchar(64) NOT NULL COMMENT 'JAVA字段名', + `dict_type` varchar(200) DEFAULT '' COMMENT '字典类型', + `create_operation` bit(1) NOT NULL COMMENT '是否为 Create 创建操作的字段', + `update_operation` bit(1) NOT NULL COMMENT '是否为 Update 更新操作的字段', + `list_operation` bit(1) NOT NULL COMMENT '是否为 List 查询操作的字段', + `list_operation_condition` varchar(32) NOT NULL DEFAULT 'EQ' COMMENT 'List 查询操作的条件类型', + `list_operation_result` bit(1) NOT NULL COMMENT '是否为 List 查询操作的返回字段', + `html_type` varchar(32) NOT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COMMENT='代码生成表字段定义'; + +-- ---------------------------- +-- Records of tool_codegen_table_column +-- ---------------------------- +BEGIN; +INSERT INTO `tool_codegen_table_column` VALUES (31, 8, 'id', 'bigint(20)', '字典主键', b'0', b'1', '1', 1, 'Long', 'id', '', b'0', b'1', b'0', '=', b'1', 'input', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (32, 8, 'name', 'varchar(100)', '字典名称', b'0', b'0', '0', 2, 'String', 'name', '', b'1', b'1', b'1', 'LIKE', b'1', 'input', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (33, 8, 'dict_type', 'varchar(100)', '字典类型', b'0', b'0', '0', 3, 'String', 'dictType', '', b'1', b'1', b'1', '=', b'1', 'select', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (34, 8, 'status', 'tinyint(4)', '状态', b'0', b'0', '0', 4, 'Integer', 'status', 'sys_common_status', b'1', b'1', b'1', '=', b'1', 'radio', '', '2021-01-31 00:24:42', '', '2021-01-31 04:38:58', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (35, 8, 'remark', 'varchar(500)', '备注', b'1', b'0', '0', 5, 'String', 'remark', '', b'1', b'1', b'1', '=', b'1', 'input', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (36, 8, 'create_by', 'varchar(64)', '创建者', b'1', b'0', '0', 6, 'String', 'createBy', '', b'0', b'0', b'0', '=', b'0', 'input', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (37, 8, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 7, 'Date', 'createTime', '', b'0', b'0', b'0', 'BETWEEN', b'0', 'input', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (38, 8, 'update_by', 'varchar(64)', '更新者', b'1', b'0', '0', 8, 'String', 'updateBy', '', b'0', b'0', b'0', '=', b'0', 'input', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (39, 8, 'update_time', 'datetime', '更新时间', b'0', b'0', '0', 9, 'Date', 'updateTime', '', b'0', b'0', b'0', 'BETWEEN', b'0', 'input', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +INSERT INTO `tool_codegen_table_column` VALUES (40, 8, 'deleted', 'bit(1)', '是否删除', b'0', b'0', '0', 10, 'Boolean', 'deleted', '', b'0', b'0', b'0', '=', b'0', 'radio', '', '2021-01-31 00:24:42', '', '2021-01-31 00:24:42', b'0'); +COMMIT; + SET FOREIGN_KEY_CHECKS = 1; diff --git a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/query/QueryWrapperX.java b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/query/QueryWrapperX.java index e5cf5a56d..6e5e00c8f 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/query/QueryWrapperX.java +++ b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/query/QueryWrapperX.java @@ -44,6 +44,13 @@ public class QueryWrapperX extends QueryWrapper { return this; } + public QueryWrapperX neIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ne(column, val); + } + return this; + } + public QueryWrapperX gtIfPresent(String column, Object val) { if (val != null) { return (QueryWrapperX) super.gt(column, val); @@ -51,6 +58,13 @@ public class QueryWrapperX extends QueryWrapper { return this; } + public QueryWrapperX geIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ge(column, val); + } + return this; + } + public QueryWrapperX betweenIfPresent(String column, Object val1, Object val2) { if (val1 != null && val2 != null) { return (QueryWrapperX) super.between(column, val1, val2); diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dept/SysDeptMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dept/SysDeptMapper.java index c932890f0..b75138707 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dept/SysDeptMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dept/SysDeptMapper.java @@ -1,21 +1,17 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dao.dept; +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import java.util.Date; import java.util.List; @Mapper -public interface SysDeptMapper extends BaseMapper { - - default List selectList() { - return selectList(new QueryWrapper<>()); - } +public interface SysDeptMapper extends BaseMapperX { default List selectList(SysDeptListReqVO reqVO) { return selectList(new QueryWrapperX().likeIfPresent("name", reqVO.getName()) diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dict/SysDictDataMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dict/SysDictDataMapper.java index 2b442e7ab..8946c287a 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dict/SysDictDataMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dict/SysDictDataMapper.java @@ -31,10 +31,6 @@ public interface SysDictDataMapper extends BaseMapperX { .orderByAsc("dict_type", "sort")); } - default List selectList() { - return selectList(new QueryWrapper<>()); - } - default List selectList(SysDictDataExportReqVO reqVO) { return selectList(new QueryWrapperX().likeIfPresent("label", reqVO.getLabel()) .likeIfPresent("dict_type", reqVO.getDictType()) diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dict/SysDictTypeMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dict/SysDictTypeMapper.java index 487e7f16e..ded2e19b2 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dict/SysDictTypeMapper.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dict/SysDictTypeMapper.java @@ -6,7 +6,6 @@ import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeExportReqVO; import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypePageReqVO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict.SysDictTypeDO; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -37,8 +36,4 @@ public interface SysDictTypeMapper extends BaseMapperX { return selectOne(new QueryWrapperX().eq("name", name)); } - default List selectList() { - return selectList(new QueryWrapper<>()); - } - } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 6e03d59cb..e947af918 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -3,9 +3,12 @@ package cn.iocoder.dashboard.modules.tool.service.codegen.impl; import cn.hutool.extra.template.TemplateConfig; import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateUtil; +import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.springframework.stereotype.Component; import java.util.HashMap; @@ -27,22 +30,41 @@ public class ToolCodegenEngine { * 模板引擎,由 hutool 实现 */ private final TemplateEngine templateEngine; + /** + * 全局通用变量映射 + */ + private final Map globalBindingMap = new HashMap<>(); public ToolCodegenEngine() { + // 初始化 TemplateEngine 属性 TemplateConfig config = new TemplateConfig(); config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); this.templateEngine = TemplateUtil.createEngine(config); + // 初始化基础 bindingMap + initGlobalBindingMap(); + } + + private void initGlobalBindingMap() { + // 全局配置 + globalBindingMap.put("basePackage", "cn.iocoder.dashboard.modules"); // TODO 基础包 + // 全局 Java Bean + globalBindingMap.put("pageResultClassName", PageResult.class.getName()); + // DO 类,独有字段 + globalBindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); + globalBindingMap.put("baseDOClassName", BaseDO.class.getName()); + globalBindingMap.put("QueryWrapperClassName", QueryWrapperX.class.getName()); + globalBindingMap.put("BaseMapperClassName", BaseMapper.class.getName()); } public void execute(ToolCodegenTableDO table, List columns) { + // 创建 bindingMap Map bindingMap = new HashMap<>(); bindingMap.put("table", table); bindingMap.put("columns", columns); - bindingMap.put("basePackage", "cn.iocoder.dashboard.modules"); // TODO 基础包 - // DO 类,独有字段 - bindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); - bindingMap.put("baseDOClassName", BaseDO.class.getName()); - String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); + bindingMap.putAll(globalBindingMap); + // 执行生成 +// String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); + String result = templateEngine.getTemplate("codegen/dal/mapper.vm").render(bindingMap); System.out.println(result); } diff --git a/src/main/resources/codegen/dal/mapper.vm b/src/main/resources/codegen/dal/mapper.vm new file mode 100644 index 000000000..4cc30dc21 --- /dev/null +++ b/src/main/resources/codegen/dal/mapper.vm @@ -0,0 +1,42 @@ +package ${basePackage}.${table.moduleName}.dal.mysql.dao.${table.businessName}; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import ${pageResultClassName}; +import ${QueryWrapperClassName}; +import ${BaseMapperClassName}; +import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}DO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> { + + default PageResult<${table.className}DO> selectPage(${table.className}PageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX<${table.className}DO>() +#foreach ($column in $columns) +#if (${column.listOperation}) +#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 +#if (${column.listOperationCondition} == "=")##情况一,= 的时候 + .eqIfPresent("${column.column_name}", reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "!=")##情况二,!= 的时候 + .neIfPresent("${column.column_name}", reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">")##情况三,> 的时候 + .gtIfPresent("${column.column_name}", reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 + .geIfPresent("${column.column_name}", reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<")##情况五,< 的时候 + .gtIfPresent("${column.column_name}", reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<=")##情况六,<= 的时候 + .geIfPresent("${column.column_name}", reqVO.get${JavaField}()) +#end +#end +#end + ); + } + +} From 13f37ce0cc4915433b051ea52da940217af88472 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 5 Feb 2021 01:31:53 +0800 Subject: [PATCH 012/167] =?UTF-8?q?=E5=88=86=E9=A1=B5=20request=20vo=20?= =?UTF-8?q?=E7=9A=84=E7=BC=96=E5=86=99=20=E5=A2=9E=E5=8A=A0=20example=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=8C=E7=94=A8=E4=BA=8E=E7=94=9F=E6=88=90?= =?UTF-8?q?=20swagger=20=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/vo/InfConfigExportReqVO.java | 4 +- .../config/vo/InfConfigPageReqVO.java | 4 +- .../codegen/ToolCodegenColumnDO.java | 4 ++ .../codegen/impl/ToolCodegenBuilder.java | 2 + .../codegen/impl/ToolCodegenEngine.java | 10 ++- .../codegen/controller/controller.vm | 63 +++++++++++++++++++ .../codegen/controller/vo/pageReqVO.vm | 43 +++++++++++++ src/main/resources/codegen/dal/do.vm | 6 +- src/main/resources/codegen/dal/mapper.vm | 21 ++++--- 9 files changed, 137 insertions(+), 20 deletions(-) create mode 100644 src/main/resources/codegen/controller/controller.vm create mode 100644 src/main/resources/codegen/controller/vo/pageReqVO.vm diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java index b2145203b..d8f549c9b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigExportReqVO.java @@ -22,11 +22,11 @@ public class InfConfigExportReqVO { @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举") private Integer type; - @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private Date beginTime; - @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private Date endTime; diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java index 9af18b16a..24672265e 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/infra/controller/config/vo/InfConfigPageReqVO.java @@ -25,11 +25,11 @@ public class InfConfigPageReqVO extends PageParam { @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举") private Integer type; - @ApiModelProperty(value = "开始时间", example = "2020-10-24") + @ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private Date beginTime; - @ApiModelProperty(value = "结束时间", example = "2020-10-24") + @ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private Date endTime; diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java index 4cc7e9a33..01289bd78 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/dal/mysql/dataobject/codegen/ToolCodegenColumnDO.java @@ -83,6 +83,10 @@ public class ToolCodegenColumnDO extends BaseDO { * 关联 {@link SysDictTypeDO#getType()} */ private String dictType; + /** + * 数据示例,主要用于生成 Swagger 注解的 example 字段 + */ + private String example; // ========== CRUD 相关字段 ========== diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java index 4250c2886..6d228a18d 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java @@ -48,6 +48,8 @@ public class ToolCodegenBuilder { .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) + .put("time", ToolCodegenColumnHtmlTypeEnum.DATETIME) + .put("date", ToolCodegenColumnHtmlTypeEnum.DATETIME) .build(); /** diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index e947af918..9d7043f52 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -3,12 +3,13 @@ package cn.iocoder.dashboard.modules.tool.service.codegen.impl; import cn.hutool.extra.template.TemplateConfig; import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateUtil; +import cn.iocoder.dashboard.common.pojo.PageParam; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.springframework.stereotype.Component; import java.util.HashMap; @@ -49,11 +50,13 @@ public class ToolCodegenEngine { globalBindingMap.put("basePackage", "cn.iocoder.dashboard.modules"); // TODO 基础包 // 全局 Java Bean globalBindingMap.put("pageResultClassName", PageResult.class.getName()); + // VO 类,独有字段 + globalBindingMap.put("pageParamClassName", PageParam.class.getName()); // DO 类,独有字段 globalBindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); globalBindingMap.put("baseDOClassName", BaseDO.class.getName()); globalBindingMap.put("QueryWrapperClassName", QueryWrapperX.class.getName()); - globalBindingMap.put("BaseMapperClassName", BaseMapper.class.getName()); + globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); } public void execute(ToolCodegenTableDO table, List columns) { @@ -64,7 +67,8 @@ public class ToolCodegenEngine { bindingMap.putAll(globalBindingMap); // 执行生成 // String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); - String result = templateEngine.getTemplate("codegen/dal/mapper.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/dal/mapper.vm").render(bindingMap); + String result = templateEngine.getTemplate("codegen/controller/vo/pageReqVO.vm").render(bindingMap); System.out.println(result); } diff --git a/src/main/resources/codegen/controller/controller.vm b/src/main/resources/codegen/controller/controller.vm new file mode 100644 index 000000000..ba40b5602 --- /dev/null +++ b/src/main/resources/codegen/controller/controller.vm @@ -0,0 +1,63 @@ +import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +import javax.validation.*; +import java.util.*; + +import org.springframework.validation.annotation.Validated; + +/** + * ${class.description} Controller + */ +@RestController +@RequestMapping("/${class.classNameLowerUnderscore}") +@Api(tags = "${class.description}") +@Validated +public class ${class.className}Controller { + + @Autowired + private ${class.className}Service ${class.classNameVar}Service; + + @PostMapping("/create") + @ApiOperation("创建${class.description}") + public CommonResult create${class.className}(@Valid ${class.className}CreateReqVO createVO) { + return success(${class.classNameVar}Service.create${class.className}(createVO)); + } + + @PostMapping("/update") + @ApiOperation("更新${class.description}") + public CommonResult update${class.className}(@Valid ${class.className}UpdateReqVO updateVO) { + ${class.classNameVar}Service.update${class.className}(updateVO); + return success(true); + } + + @PostMapping("/delete") + @ApiOperation("删除${class.description}") + @ApiImplicitParam(name = "${class.classNameVar}Id", value = "${class.description}编号", required = true) + public CommonResult delete${class.className}(@RequestParam("${class.classNameVar}Id") Integer ${class.classNameVar}Id) { + ${class.classNameVar}Service.delete${class.className}(${class.classNameVar}Id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得${class.description}") + @ApiImplicitParam(name = "${class.classNameVar}Id", value = "${class.description}编号", required = true) + public CommonResult<${class.className}RespVO> get${class.className}(@RequestParam("${class.classNameVar}Id") Integer ${class.classNameVar}Id) { + return success(${class.classNameVar}Service.get${class.className}(${class.classNameVar}Id)); + } + + @GetMapping("/list") + @ApiOperation("获得${class.description}列表") + @ApiImplicitParam(name = "${class.classNameVar}Ids", value = "${class.description}编号列表", required = true) + public CommonResult> list${class.className}s(@RequestParam("${class.classNameVar}Ids") List ${class.classNameVar}Ids) { + return success(${class.classNameVar}Service.list${class.className}s(${class.classNameVar}Ids)); + } + + @GetMapping("/page") + @ApiOperation("获得${class.description}分页") + public CommonResult> page${class.className}(${class.className}PageReqVO pageVO) { + return success(${class.classNameVar}Service.page${class.className}(pageVO)); + } + +} diff --git a/src/main/resources/codegen/controller/vo/pageReqVO.vm b/src/main/resources/codegen/controller/vo/pageReqVO.vm new file mode 100644 index 000000000..30f08be44 --- /dev/null +++ b/src/main/resources/codegen/controller/vo/pageReqVO.vm @@ -0,0 +1,43 @@ +package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import io.swagger.annotations.*; +import ${pageParamClassName}; + +@ApiModel("${table.classComment}分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ${table.className}PageReqVO extends PageParam { + +#foreach ($column in $columns) +#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## Between 的时候 + @ApiModelProperty(value = "开始${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) +#if (${column.javaType} == "Date")## 时间类型 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +#end + private ${column.javaType} begin${JavaField}; + + @ApiModelProperty(value = "结束${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) +#if (${column.javaType} == "Date")## 时间类型 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +#end + private ${column.javaType} end${JavaField}; +#else +#if (${column.javaType} == "Date")## 时间类型 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +#end + @ApiModelProperty(value = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType} ${column.javaField}; +#end + +#end +#end +} diff --git a/src/main/resources/codegen/dal/do.vm b/src/main/resources/codegen/dal/do.vm index e01778d60..6fd37b13c 100644 --- a/src/main/resources/codegen/dal/do.vm +++ b/src/main/resources/codegen/dal/do.vm @@ -1,9 +1,9 @@ package ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}; -import com.baomidou.mybatisplus.annotation.*; -import ${baseDOClassName}; import lombok.*; import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import ${baseDOClassName}; /** * ${table.classComment} DO @@ -24,7 +24,7 @@ public class ${table.className}DO extends BaseDO { /** * ${column.columnComment} */ -#if ($column.dictType != "")##处理枚举值 +#if ("$!column.dictType" != "")##处理枚举值 // TODO 枚举 ${column.dictType} #end #if (${column.primaryKey} && ${column.javaType} != 'String')##处理主键 + 非 String 的情况 diff --git a/src/main/resources/codegen/dal/mapper.vm b/src/main/resources/codegen/dal/mapper.vm index 4cc30dc21..949e7dcb0 100644 --- a/src/main/resources/codegen/dal/mapper.vm +++ b/src/main/resources/codegen/dal/mapper.vm @@ -1,11 +1,9 @@ package ${basePackage}.${table.moduleName}.dal.mysql.dao.${table.businessName}; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - import ${pageResultClassName}; import ${QueryWrapperClassName}; import ${BaseMapperClassName}; -import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}DO; +import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; import org.apache.ibatis.annotations.Mapper; @Mapper @@ -17,22 +15,25 @@ public interface ${table.className}Mapper extends BaseMapperX<${table.className} #if (${column.listOperation}) #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 #if (${column.listOperationCondition} == "=")##情况一,= 的时候 - .eqIfPresent("${column.column_name}", reqVO.get${JavaField}()) + .eqIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == "!=")##情况二,!= 的时候 - .neIfPresent("${column.column_name}", reqVO.get${JavaField}()) + .neIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == ">")##情况三,> 的时候 - .gtIfPresent("${column.column_name}", reqVO.get${JavaField}()) + .gtIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 - .geIfPresent("${column.column_name}", reqVO.get${JavaField}()) + .geIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == "<")##情况五,< 的时候 - .gtIfPresent("${column.column_name}", reqVO.get${JavaField}()) + .gtIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end -#if (${column.listOperationCondition} == "<=")##情况六,<= 的时候 - .geIfPresent("${column.column_name}", reqVO.get${JavaField}()) +#if (${column.listOperationCondition} == "LIKE")##情况七,Like 的时候 + .likeIfPresent("${column.columnName}", reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候 + .betweenIfPresent("${column.columnName}", reqVO.getBegin${JavaField}(), reqVO.getEnd${JavaField}()) #end #end #end From fade9bce329a8c6130de2e49443eb78ed1624d23 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Feb 2021 10:09:17 +0800 Subject: [PATCH 013/167] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=8E=B0=E6=9C=89=20?= =?UTF-8?q?vo=E3=80=81do=E3=80=81mapper=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/service/codegen/impl/ToolCodegenEngine.java | 9 +++++++-- .../resources/codegen/controller/vo/pageReqVO.vm | 12 ++++++++---- src/main/resources/codegen/dal/do.vm | 2 +- src/main/resources/codegen/dal/mapper.vm | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 9d7043f52..5ce35f877 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -10,8 +10,10 @@ import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.dashboard.util.date.DateUtils; import org.springframework.stereotype.Component; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -49,9 +51,10 @@ public class ToolCodegenEngine { // 全局配置 globalBindingMap.put("basePackage", "cn.iocoder.dashboard.modules"); // TODO 基础包 // 全局 Java Bean - globalBindingMap.put("pageResultClassName", PageResult.class.getName()); + globalBindingMap.put("PageResultClassName", PageResult.class.getName()); + globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); // VO 类,独有字段 - globalBindingMap.put("pageParamClassName", PageParam.class.getName()); + globalBindingMap.put("PageParamClassName", PageParam.class.getName()); // DO 类,独有字段 globalBindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); globalBindingMap.put("baseDOClassName", BaseDO.class.getName()); @@ -64,6 +67,8 @@ public class ToolCodegenEngine { Map bindingMap = new HashMap<>(); bindingMap.put("table", table); bindingMap.put("columns", columns); + bindingMap.put("hasDateColumn", columns.stream().anyMatch(codegenColumnDO -> + codegenColumnDO.getJavaType().equals(Date.class.getSimpleName()))); bindingMap.putAll(globalBindingMap); // 执行生成 // String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); diff --git a/src/main/resources/codegen/controller/vo/pageReqVO.vm b/src/main/resources/codegen/controller/vo/pageReqVO.vm index 30f08be44..ad585f227 100644 --- a/src/main/resources/codegen/controller/vo/pageReqVO.vm +++ b/src/main/resources/codegen/controller/vo/pageReqVO.vm @@ -2,9 +2,13 @@ package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; -import javax.validation.constraints.*; import io.swagger.annotations.*; -import ${pageParamClassName}; +import ${PageParamClassName}; +#if (${hasDateColumn}) +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#end @ApiModel("${table.classComment}分页 Request VO") @Data @@ -18,7 +22,7 @@ public class ${table.className}PageReqVO extends PageParam { #foreach ($column in $columns) #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 #if (${column.listOperation})##查询操作 -#if (${column.listOperationCondition} == "BETWEEN")## Between 的时候 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 @ApiModelProperty(value = "开始${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) #if (${column.javaType} == "Date")## 时间类型 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @@ -30,7 +34,7 @@ public class ${table.className}PageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) #end private ${column.javaType} end${JavaField}; -#else +#else##情况二,非 Between 的时间 #if (${column.javaType} == "Date")## 时间类型 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) #end diff --git a/src/main/resources/codegen/dal/do.vm b/src/main/resources/codegen/dal/do.vm index 6fd37b13c..70c8cc02c 100644 --- a/src/main/resources/codegen/dal/do.vm +++ b/src/main/resources/codegen/dal/do.vm @@ -3,7 +3,7 @@ package ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.business import lombok.*; import java.util.*; import com.baomidou.mybatisplus.annotation.*; -import ${baseDOClassName}; +import ${BaseDOClassName}; /** * ${table.classComment} DO diff --git a/src/main/resources/codegen/dal/mapper.vm b/src/main/resources/codegen/dal/mapper.vm index 949e7dcb0..13a3d71b2 100644 --- a/src/main/resources/codegen/dal/mapper.vm +++ b/src/main/resources/codegen/dal/mapper.vm @@ -1,6 +1,6 @@ package ${basePackage}.${table.moduleName}.dal.mysql.dao.${table.businessName}; -import ${pageResultClassName}; +import ${PageResultClassName}; import ${QueryWrapperClassName}; import ${BaseMapperClassName}; import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; From 8db3297800cce6813c1210a600a8c4b8319c034b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Feb 2021 10:43:42 +0800 Subject: [PATCH 014/167] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20baseVO.vm=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/codegen/controller/vo/baseVO.vm | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/resources/codegen/controller/vo/baseVO.vm diff --git a/src/main/resources/codegen/controller/vo/baseVO.vm b/src/main/resources/codegen/controller/vo/baseVO.vm new file mode 100644 index 000000000..e0f64fc3f --- /dev/null +++ b/src/main/resources/codegen/controller/vo/baseVO.vm @@ -0,0 +1,28 @@ +package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* ${table.classComment} Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult})##通用操作 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) +#if (!${column.nullable})#if (${field.fieldType} == 'String')## 判断 @NotEmpty 和 @NotNull 注解 + @NotEmpty(message = "${column.columnComment}不能为空") +#else + @NotNull(message = "${column.columnComment}不能为空") +#end +#end + private ${column.javaType} ${column.javaField}; + +#end +#end +} From 612861c9555123b0eb623bf8e196a9b873e70ffc Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Feb 2021 11:24:04 +0800 Subject: [PATCH 015/167] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20createReqVO.vm=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20updateReqVO.vm=20=E5=A2=9E=E5=8A=A0=20resp?= =?UTF-8?q?VO.vm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codegen/controller/vo/createReqVO.vm | 27 +++++++++++++++++++ .../resources/codegen/controller/vo/respVO.vm | 20 ++++++++++++++ .../codegen/controller/vo/updateReqVO.vm | 21 +++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 src/main/resources/codegen/controller/vo/createReqVO.vm create mode 100644 src/main/resources/codegen/controller/vo/respVO.vm create mode 100644 src/main/resources/codegen/controller/vo/updateReqVO.vm diff --git a/src/main/resources/codegen/controller/vo/createReqVO.vm b/src/main/resources/codegen/controller/vo/createReqVO.vm new file mode 100644 index 000000000..d59f20bbd --- /dev/null +++ b/src/main/resources/codegen/controller/vo/createReqVO.vm @@ -0,0 +1,27 @@ +package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("${table.classComment}创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${table.className}CreateReqVO extends ${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}))##不是通用字段 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) +#if (!${column.nullable})#if (${field.fieldType} == 'String')## 判断 @NotEmpty 和 @NotNull 注解 + @NotEmpty(message = "${column.columnComment}不能为空") +#else + @NotNull(message = "${column.columnComment}不能为空") +#end +#end + private ${column.javaType} ${column.javaField}; + +#end +#end +} diff --git a/src/main/resources/codegen/controller/vo/respVO.vm b/src/main/resources/codegen/controller/vo/respVO.vm new file mode 100644 index 000000000..9176c073f --- /dev/null +++ b/src/main/resources/codegen/controller/vo/respVO.vm @@ -0,0 +1,20 @@ +package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("${table.classComment} Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${table.className}RespVO extends ${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.listOperationResult} && (!${column.createOperation} || !${column.updateOperation}))##不是通用字段 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType} ${column.javaField}; + +#end +#end +} diff --git a/src/main/resources/codegen/controller/vo/updateReqVO.vm b/src/main/resources/codegen/controller/vo/updateReqVO.vm new file mode 100644 index 000000000..6108b4621 --- /dev/null +++ b/src/main/resources/codegen/controller/vo/updateReqVO.vm @@ -0,0 +1,21 @@ +package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("${table.classComment}更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${table.className}UpdateReqVO extends ${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}))##不是通用字段 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType} ${column.javaField}; + +#end +#end +} From b8015e87b386ffd42fcb92cdcd6fe726b83281a2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Feb 2021 11:45:10 +0800 Subject: [PATCH 016/167] =?UTF-8?q?=E6=8F=90=E4=BE=9B=E4=B8=80=E4=B8=AA=20?= =?UTF-8?q?Spring=20Boot=20=E8=AF=BB=E5=8F=96=E5=A4=9A=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/iocoder/dashboard/DashboardApplication.java | 6 +++++- src/main/resources/application.yaml | 7 ------- src/main/resources/db.yaml | 7 +++++++ 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/db.yaml diff --git a/src/main/java/cn/iocoder/dashboard/DashboardApplication.java b/src/main/java/cn/iocoder/dashboard/DashboardApplication.java index 32783aa8c..f2092e2b3 100644 --- a/src/main/java/cn/iocoder/dashboard/DashboardApplication.java +++ b/src/main/java/cn/iocoder/dashboard/DashboardApplication.java @@ -5,10 +5,14 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -@EnableAdminServer +@EnableAdminServer // TODO 芋艿:需要迁移出去 public class DashboardApplication { public static void main(String[] args) { + // 设置读取的配置文件 + System.setProperty("spring.config.name", "application,db"); + + // 启动 Spring Boot SpringApplication.run(DashboardApplication.class, args); } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 634cbd325..9fd382e14 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,13 +2,6 @@ spring: application: name: dashboard - # 数据源配置项 TODO 多数据源;TODO 监控配置 - datasource: - url: jdbc:mysql://127.0.1:33061/ruoyi-vue-pro?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT - driver-class-name: com.mysql.jdbc.Driver - username: root - password: 123456 - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 diff --git a/src/main/resources/db.yaml b/src/main/resources/db.yaml new file mode 100644 index 000000000..05018f24f --- /dev/null +++ b/src/main/resources/db.yaml @@ -0,0 +1,7 @@ +spring: + # 数据源配置项 TODO 多数据源;TODO 监控配置 + datasource: + url: jdbc:mysql://127.0.1:33061/ruoyi-vue-pro?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT + driver-class-name: com.mysql.jdbc.Driver + username: root + password: 123456 From 763e20796bb3258df1a4fe20fb496041bbb0e882 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Feb 2021 19:12:08 +0800 Subject: [PATCH 017/167] =?UTF-8?q?=E5=9F=BA=E4=BA=8E=20Velocity=20?= =?UTF-8?q?=E7=9A=84=20macro=20=E5=92=8C=20parse=20=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E6=A8=A1=E6=9D=BF=E7=9A=84=E5=8F=AF?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codegen/controller/vo/_column.vm | 13 +++++++ .../resources/codegen/controller/vo/baseVO.vm | 9 +---- .../codegen/controller/vo/createReqVO.vm | 19 +++++----- .../codegen/controller/vo/pageReqVO.vm | 35 +++++++++---------- .../codegen/controller/vo/updateReqVO.vm | 13 +++++-- src/main/resources/codegen/dal/mapper.vm | 5 +++ 6 files changed, 57 insertions(+), 37 deletions(-) create mode 100644 src/main/resources/codegen/controller/vo/_column.vm diff --git a/src/main/resources/codegen/controller/vo/_column.vm b/src/main/resources/codegen/controller/vo/_column.vm new file mode 100644 index 000000000..2e2222509 --- /dev/null +++ b/src/main/resources/codegen/controller/vo/_column.vm @@ -0,0 +1,13 @@ +## 提供给 baseVO、createVO、updateVO 生成字段 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) +#if (!${column.nullable})## 判断 @NotEmpty 和 @NotNull 注解 +#if (${field.fieldType} == 'String') + @NotEmpty(message = "${column.columnComment}不能为空") +#else + @NotNull(message = "${column.columnComment}不能为空") +#end +#end +#if (${column.javaType} == "Date")## 时间类型 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +#end + private ${column.javaType} ${column.javaField}; diff --git a/src/main/resources/codegen/controller/vo/baseVO.vm b/src/main/resources/codegen/controller/vo/baseVO.vm index e0f64fc3f..324e60e8f 100644 --- a/src/main/resources/codegen/controller/vo/baseVO.vm +++ b/src/main/resources/codegen/controller/vo/baseVO.vm @@ -14,14 +14,7 @@ public class ${table.className}BaseVO { #foreach ($column in $columns) #if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult})##通用操作 - @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) -#if (!${column.nullable})#if (${field.fieldType} == 'String')## 判断 @NotEmpty 和 @NotNull 注解 - @NotEmpty(message = "${column.columnComment}不能为空") -#else - @NotNull(message = "${column.columnComment}不能为空") -#end -#end - private ${column.javaType} ${column.javaField}; + #parse("codegen/controller/vo/_column.vm") #end #end diff --git a/src/main/resources/codegen/controller/vo/createReqVO.vm b/src/main/resources/codegen/controller/vo/createReqVO.vm index d59f20bbd..82c191107 100644 --- a/src/main/resources/codegen/controller/vo/createReqVO.vm +++ b/src/main/resources/codegen/controller/vo/createReqVO.vm @@ -4,6 +4,16 @@ import lombok.*; import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}) + && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end @ApiModel("${table.classComment}创建 Request VO") @Data @@ -13,14 +23,7 @@ public class ${table.className}CreateReqVO extends ${table.className}BaseVO { #foreach ($column in $columns) #if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}))##不是通用字段 - @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) -#if (!${column.nullable})#if (${field.fieldType} == 'String')## 判断 @NotEmpty 和 @NotNull 注解 - @NotEmpty(message = "${column.columnComment}不能为空") -#else - @NotNull(message = "${column.columnComment}不能为空") -#end -#end - private ${column.javaType} ${column.javaField}; + #parse("codegen/controller/vo/_column.vm") #end #end diff --git a/src/main/resources/codegen/controller/vo/pageReqVO.vm b/src/main/resources/codegen/controller/vo/pageReqVO.vm index ad585f227..1fe25b9c1 100644 --- a/src/main/resources/codegen/controller/vo/pageReqVO.vm +++ b/src/main/resources/codegen/controller/vo/pageReqVO.vm @@ -4,42 +4,39 @@ import lombok.*; import java.util.*; import io.swagger.annotations.*; import ${PageParamClassName}; -#if (${hasDateColumn}) +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperation} && ${column.javaType} == "Date")## 时间类型 import org.springframework.format.annotation.DateTimeFormat; import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) +#if (${column.javaType} == "Date")## 时间类型 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +#end + @ApiModelProperty(value = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; #end @ApiModel("${table.classComment}分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor public class ${table.className}PageReqVO extends PageParam { #foreach ($column in $columns) #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 #if (${column.listOperation})##查询操作 #if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 - @ApiModelProperty(value = "开始${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) -#if (${column.javaType} == "Date")## 时间类型 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) -#end - private ${column.javaType} begin${JavaField}; + #columnTpl('begin', '开始') - @ApiModelProperty(value = "结束${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) -#if (${column.javaType} == "Date")## 时间类型 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) -#end - private ${column.javaType} end${JavaField}; + #columnTpl('end', '结束') #else##情况二,非 Between 的时间 -#if (${column.javaType} == "Date")## 时间类型 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) -#end - @ApiModelProperty(value = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - private ${column.javaType} ${column.javaField}; +#columnTpl('', '') #end #end diff --git a/src/main/resources/codegen/controller/vo/updateReqVO.vm b/src/main/resources/codegen/controller/vo/updateReqVO.vm index 6108b4621..62acbf799 100644 --- a/src/main/resources/codegen/controller/vo/updateReqVO.vm +++ b/src/main/resources/codegen/controller/vo/updateReqVO.vm @@ -4,6 +4,16 @@ import lombok.*; import java.util.*; import io.swagger.annotations.*; import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult})) + && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end @ApiModel("${table.classComment}更新 Request VO") @Data @@ -13,8 +23,7 @@ public class ${table.className}UpdateReqVO extends ${table.className}BaseVO { #foreach ($column in $columns) #if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}))##不是通用字段 - @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) - private ${column.javaType} ${column.javaField}; + #parse("codegen/controller/vo/_column.vm") #end #end diff --git a/src/main/resources/codegen/dal/mapper.vm b/src/main/resources/codegen/dal/mapper.vm index 13a3d71b2..942f17a95 100644 --- a/src/main/resources/codegen/dal/mapper.vm +++ b/src/main/resources/codegen/dal/mapper.vm @@ -6,6 +6,11 @@ import ${BaseMapperClassName}; import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; import org.apache.ibatis.annotations.Mapper; +/** +* ${table.classComment} Mapper +* +* @author ${table.author} +*/ @Mapper public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> { From 2210ed5cf876ce80792c8d28cba80988b85fcd7d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Feb 2021 21:18:43 +0800 Subject: [PATCH 018/167] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20service=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/util/VelocityInitializer.java | 31 ------- .../src/main/resources/vm/java/domain.java.vm | 85 ------------------- .../src/main/resources/vm/java/mapper.java.vm | 61 ------------- .../dashboard/DashboardApplication.java | 9 +- .../dept/vo/dept/SysDeptCreateReqVO.java | 2 + .../codegen/impl/ToolCodegenEngine.java | 21 +++-- .../util/collection/CollectionUtils.java | 7 ++ src/main/resources/application.yaml | 7 ++ src/main/resources/codegen/service/service.vm | 62 ++++++++++++++ src/main/resources/db.yaml | 7 -- 10 files changed, 97 insertions(+), 195 deletions(-) delete mode 100644 ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java delete mode 100644 ruoyi-generator/src/main/resources/vm/java/domain.java.vm delete mode 100644 ruoyi-generator/src/main/resources/vm/java/mapper.java.vm create mode 100644 src/main/resources/codegen/service/service.vm delete mode 100644 src/main/resources/db.yaml diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java deleted file mode 100644 index 08fe390ff..000000000 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ruoyi.generator.util; - -import java.util.Properties; - -import org.apache.velocity.app.Velocity; -import com.ruoyi.common.constant.Constants; - -/** - * VelocityEngine工厂 - * - * @author RuoYi - */ -public class VelocityInitializer { - /** - * 初始化vm方法 - */ - public static void initVelocity() { - Properties p = new Properties(); - try { - // 加载classpath目录下的vm文件 - p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); - // 定义字符集 - p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8); - p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8); - // 初始化Velocity引擎,指定配置Properties - Velocity.init(p); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm deleted file mode 100644 index 9dd824786..000000000 --- a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm +++ /dev/null @@ -1,85 +0,0 @@ -package ${packageName}.domain; - -#foreach ($import in $importList) -import ${import}; -#end -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.annotation.Excel; -#if($table.crud) -import com.ruoyi.common.core.domain.BaseEntity; -#elseif($table.tree) -import com.ruoyi.common.core.domain.TreeEntity; -#end - -/** - * ${functionName}对象 ${tableName} - * - * @author ${author} - * @date ${datetime} - */ -#if($table.crud) -#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 -#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 - - @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 - .toString(); - } -} diff --git a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm deleted file mode 100644 index 5502baf6d..000000000 --- a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm +++ /dev/null @@ -1,61 +0,0 @@ -package ${packageName}.mapper; - -import java.util.List; -import ${packageName}.domain.${ClassName}; - -/** - * ${functionName}Mapper接口 - * - * @author ${author} - * @date ${datetime} - */ -public interface ${ClassName}Mapper -{ - /** - * 查询${functionName} - * - * @param ${pkColumn.javaField} ${functionName}ID - * @return ${functionName} - */ - public ${ClassName} select${ClassName}ById(${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}ID - * @return 结果 - */ - public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); - - /** - * 批量删除${functionName} - * - * @param ${pkColumn.javaField}s 需要删除的数据ID - * @return 结果 - */ - public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s); -} diff --git a/src/main/java/cn/iocoder/dashboard/DashboardApplication.java b/src/main/java/cn/iocoder/dashboard/DashboardApplication.java index f2092e2b3..f46f4bc3b 100644 --- a/src/main/java/cn/iocoder/dashboard/DashboardApplication.java +++ b/src/main/java/cn/iocoder/dashboard/DashboardApplication.java @@ -8,11 +8,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableAdminServer // TODO 芋艿:需要迁移出去 public class DashboardApplication { - public static void main(String[] args) { - // 设置读取的配置文件 - System.setProperty("spring.config.name", "application,db"); +// static { +// // 设置读取的配置文件 +// System.setProperty("spring.config.name", "application,db"); +// } - // 启动 Spring Boot + public static void main(String[] args) { SpringApplication.run(DashboardApplication.class, args); } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java index 3e18aa4dd..6ea550c76 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptCreateReqVO.java @@ -3,9 +3,11 @@ package cn.iocoder.dashboard.modules.system.controller.dept.vo.dept; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.ToString; @ApiModel("部门创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) public class SysDeptCreateReqVO extends SysDeptBaseVO { } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 5ce35f877..4258cf192 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -10,14 +10,16 @@ import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; +import cn.iocoder.dashboard.util.collection.CollectionUtils; import cn.iocoder.dashboard.util.date.DateUtils; import org.springframework.stereotype.Component; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import static cn.hutool.core.text.CharSequenceUtil.*; + /** * 代码生成的引擎,用于具体生成代码 * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 @@ -49,7 +51,7 @@ public class ToolCodegenEngine { private void initGlobalBindingMap() { // 全局配置 - globalBindingMap.put("basePackage", "cn.iocoder.dashboard.modules"); // TODO 基础包 + globalBindingMap.put("basePackage", "cn.iocoder.dashboard.modules"); // TODO 基础包, 抽成参数 // 全局 Java Bean globalBindingMap.put("PageResultClassName", PageResult.class.getName()); globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); @@ -64,16 +66,21 @@ public class ToolCodegenEngine { public void execute(ToolCodegenTableDO table, List columns) { // 创建 bindingMap - Map bindingMap = new HashMap<>(); + Map bindingMap = new HashMap<>(globalBindingMap); bindingMap.put("table", table); bindingMap.put("columns", columns); - bindingMap.put("hasDateColumn", columns.stream().anyMatch(codegenColumnDO -> - codegenColumnDO.getJavaType().equals(Date.class.getSimpleName()))); - bindingMap.putAll(globalBindingMap); + bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey)); + bindingMap.put("simpleClassName", upperFirst(toCamelCase(subAfter( // 去掉第一个驼峰,例如说 SysUser 去掉后是 User + toUnderlineCase(table.getClassName()), '_', false)))); // 执行生成 // String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/dal/mapper.vm").render(bindingMap); - String result = templateEngine.getTemplate("codegen/controller/vo/pageReqVO.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/controller/vo/pageReqVO.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/controller/vo/baseVO.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/controller/vo/createReqVO.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/controller/vo/updateReqVO.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/controller/vo/respVO.vm").render(bindingMap); + String result = templateEngine.getTemplate("codegen/service/service.vm").render(bindingMap); System.out.println(result); } diff --git a/src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java b/src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java index 5142b7926..3d7d54881 100644 --- a/src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java +++ b/src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java @@ -86,6 +86,13 @@ public class CollectionUtils { return !CollectionUtil.isEmpty(from) ? from.get(0) : null; } + public static T findFirst(List from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return null; + } + return from.stream().filter(predicate).findFirst().orElse(null); + } + public static void addIfNotNull(Collection coll, T item) { if (item == null) { return; diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 9fd382e14..634cbd325 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,6 +2,13 @@ spring: application: name: dashboard + # 数据源配置项 TODO 多数据源;TODO 监控配置 + datasource: + url: jdbc:mysql://127.0.1:33061/ruoyi-vue-pro?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT + driver-class-name: com.mysql.jdbc.Driver + username: root + password: 123456 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 diff --git a/src/main/resources/codegen/service/service.vm b/src/main/resources/codegen/service/service.vm new file mode 100644 index 000000000..68a26df89 --- /dev/null +++ b/src/main/resources/codegen/service/service.vm @@ -0,0 +1,62 @@ +package ${basePackage}.${table.moduleName}.service.${table.businessName}; + +import java.util.*; +import javax.validation.*; +import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; +import ${PageResultClassName}; + +/** +* ${table.classComment} Service 接口 +* +* @author ${table.author} +*/ +public interface ${table.className}Service { + + /** + * 创建${table.classComment} + * + * @param createReqVO 创建信息 + * @return ${class.description} + */ + ${primaryColumn.javaType} create${simpleClassName}(@Valid ${table.className}CreateReqVO createReqVO); + + /** + * 更新${table.classComment} + * + * @param updateReqVO 更新信息 + */ + void update${simpleClassName}(@Valid ${table.className}UpdateReqVO updateReqVO); + + /** + * 删除${table.classComment} + * + * @param id 编号 + */ + void delete${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment} + * + * @param id 编号 + * @return ${class.description} + */ + ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment}列表 + * + * @param ids 编号 + * @return ${class.classComment}列表 + */ + List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids); + + /** + * 获得${table.classComment}分页 + * + * @param pageReqVO 分页查询 + * @return ${class.classComment}分页 + */ + PageResult<${table.className}DO> get${simpleClassName}Page(${table.className}PageReqVO pageReqVO); + +} diff --git a/src/main/resources/db.yaml b/src/main/resources/db.yaml deleted file mode 100644 index 05018f24f..000000000 --- a/src/main/resources/db.yaml +++ /dev/null @@ -1,7 +0,0 @@ -spring: - # 数据源配置项 TODO 多数据源;TODO 监控配置 - datasource: - url: jdbc:mysql://127.0.1:33061/ruoyi-vue-pro?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT - driver-class-name: com.mysql.jdbc.Driver - username: root - password: 123456 From 5442f6522e5e25fc2472626470bb7877ddffe06f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Feb 2021 23:52:26 +0800 Subject: [PATCH 019/167] =?UTF-8?q?=E6=95=B4=E7=90=86=20vm=20=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=20=E6=8F=90=E4=BA=A4=20test=20=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=9A=84=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/controller/GenController.java | 47 ++++----- .../com/ruoyi/generator/domain/GenTable.java | 32 ------- .../main/resources/vm/java/service.java.vm | 61 ------------ .../src/main/resources/vm/xml/mapper.xml.vm | 95 ------------------- .../modules/infra/convert/package-info.java | 1 - .../system/controller/test/package-info.java | 1 + .../controller/test/vo/SysTestDemoBaseVO.java | 30 ++++++ .../test/vo/SysTestDemoCreateReqVO.java | 14 +++ .../test/vo/SysTestDemoPageReqVO.java | 41 ++++++++ .../controller/test/vo/SysTestDemoRespVO.java | 19 ++++ .../test/vo/SysTestDemoUpdateReqVO.java | 21 ++++ .../dal/mysql/dao/test/SysTestDemoMapper.java | 28 ++++++ .../mysql/dataobject/test/SysTestDemoDO.java | 44 +++++++++ .../service/test/SysTestDemoService.java | 66 +++++++++++++ .../codegen/impl/ToolCodegenBuilder.java | 56 +++++++++-- .../codegen/impl/ToolCodegenEngine.java | 19 +++- .../codegen/controller/vo/updateReqVO.vm | 4 +- src/main/resources/codegen/convert/convert.vm | 22 +++++ src/main/resources/codegen/dal/do.vm | 2 +- src/main/resources/codegen/dal/mapper.vm | 11 ++- src/main/resources/codegen/enums/errorcode.vm | 2 + src/main/resources/codegen/service/service.vm | 8 +- .../resources/codegen/service/serviceImpl.vm | 30 ++++++ .../codegen/impl/ToolCodegenEngineTest.java | 2 +- .../impl/ToolCodegenServiceImplTest.java | 2 +- 25 files changed, 412 insertions(+), 246 deletions(-) delete mode 100644 ruoyi-generator/src/main/resources/vm/java/service.java.vm delete mode 100644 ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm delete mode 100644 src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/test/package-info.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoBaseVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoCreateReqVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoPageReqVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoRespVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoUpdateReqVO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/test/SysTestDemoMapper.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/test/SysTestDemoDO.java create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/test/SysTestDemoService.java create mode 100644 src/main/resources/codegen/convert/convert.vm create mode 100644 src/main/resources/codegen/enums/errorcode.vm create mode 100644 src/main/resources/codegen/service/serviceImpl.vm diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java index 9de4d4472..6199d50c8 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; + import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -30,13 +31,12 @@ import com.ruoyi.generator.service.IGenTableService; /** * 代码生成 操作处理 - * + * * @author ruoyi */ @RestController @RequestMapping("/tool/gen") -public class GenController extends BaseController -{ +public class GenController extends BaseController { @Autowired private IGenTableService genTableService; @@ -48,8 +48,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:list')") @GetMapping("/list") - public TableDataInfo genList(GenTable genTable) - { + public TableDataInfo genList(GenTable genTable) { startPage(); List list = genTableService.selectGenTableList(genTable); return getDataTable(list); @@ -60,8 +59,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:query')") @GetMapping(value = "/{talbleId}") - public AjaxResult getInfo(@PathVariable Long talbleId) - { + public AjaxResult getInfo(@PathVariable Long talbleId) { GenTable table = genTableService.selectGenTableById(talbleId); List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId); Map map = new HashMap(); @@ -75,8 +73,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:list')") @GetMapping("/db/list") - public TableDataInfo dataList(GenTable genTable) - { + public TableDataInfo dataList(GenTable genTable) { startPage(); List list = genTableService.selectDbTableList(genTable); return getDataTable(list); @@ -87,8 +84,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:list')") @GetMapping(value = "/column/{talbleId}") - public TableDataInfo columnList(Long tableId) - { + public TableDataInfo columnList(Long tableId) { TableDataInfo dataInfo = new TableDataInfo(); List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); dataInfo.setRows(list); @@ -102,8 +98,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:list')") @Log(title = "代码生成", businessType = BusinessType.IMPORT) @PostMapping("/importTable") - public AjaxResult importTableSave(String tables) - { + public AjaxResult importTableSave(String tables) { String[] tableNames = Convert.toStrArray(tables); // 查询表信息 List tableList = genTableService.selectDbTableListByNames(tableNames); @@ -117,8 +112,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:edit')") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult editSave(@Validated @RequestBody GenTable genTable) - { + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) { genTableService.validateEdit(genTable); genTableService.updateGenTable(genTable); return AjaxResult.success(); @@ -130,8 +124,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:remove')") @Log(title = "代码生成", businessType = BusinessType.DELETE) @DeleteMapping("/{tableIds}") - public AjaxResult remove(@PathVariable Long[] tableIds) - { + public AjaxResult remove(@PathVariable Long[] tableIds) { genTableService.deleteGenTableByIds(tableIds); return AjaxResult.success(); } @@ -141,8 +134,7 @@ public class GenController extends BaseController */ @PreAuthorize("@ss.hasPermi('tool:gen:preview')") @GetMapping("/preview/{tableId}") - public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException - { + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException { Map dataMap = genTableService.previewCode(tableId); return AjaxResult.success(dataMap); } @@ -153,8 +145,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:code')") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/download/{tableName}") - public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException - { + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { byte[] data = genTableService.downloadCode(tableName); genCode(response, data); } @@ -165,8 +156,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:code')") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/genCode/{tableName}") - public AjaxResult genCode(@PathVariable("tableName") String tableName) - { + public AjaxResult genCode(@PathVariable("tableName") String tableName) { genTableService.generatorCode(tableName); return AjaxResult.success(); } @@ -177,8 +167,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:edit')") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @GetMapping("/synchDb/{tableName}") - public AjaxResult synchDb(@PathVariable("tableName") String tableName) - { + public AjaxResult synchDb(@PathVariable("tableName") String tableName) { genTableService.synchDb(tableName); return AjaxResult.success(); } @@ -189,8 +178,7 @@ public class GenController extends BaseController @PreAuthorize("@ss.hasPermi('tool:gen:code')") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/batchGenCode") - public void batchGenCode(HttpServletResponse response, String tables) throws IOException - { + public void batchGenCode(HttpServletResponse response, String tables) throws IOException { String[] tableNames = Convert.toStrArray(tables); byte[] data = genTableService.downloadCode(tableNames); genCode(response, data); @@ -199,8 +187,7 @@ public class GenController extends BaseController /** * 生成zip文件 */ - private void genCode(HttpServletResponse response, byte[] data) throws IOException - { + private void genCode(HttpServletResponse response, byte[] data) throws IOException { response.reset(); response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); @@ -209,4 +196,4 @@ public class GenController extends BaseController response.setContentType("application/octet-stream; charset=UTF-8"); IOUtils.write(data, response.getOutputStream()); } -} \ No newline at end of file +} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java index 287faa55e..f005b41af 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -22,11 +22,6 @@ public class GenTable extends BaseEntity { @NotBlank(message = "生成包路径不能为空") private String packageName; - /** - * 主键信息 - */ - private GenTableColumn pkColumn; - /** * 其它生成选项 */ @@ -57,31 +52,4 @@ public class GenTable extends BaseEntity { */ private String parentMenuName; - public boolean isTree() { - return isTree(this.tplCategory); - } - - public static boolean isTree(String tplCategory) { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); - } - - public boolean isCrud() { - return isCrud(this.tplCategory); - } - - public static boolean isCrud(String tplCategory) { - return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); - } - - public boolean isSuperColumn(String javaField) { - return isSuperColumn(this.tplCategory, javaField); - } - - public static boolean isSuperColumn(String tplCategory, String javaField) { - if (isTree(tplCategory)) { - return StringUtils.equalsAnyIgnoreCase(javaField, - ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); - } - return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); - } } diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm deleted file mode 100644 index af422f342..000000000 --- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ /dev/null @@ -1,61 +0,0 @@ -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}ID - * @return ${functionName} - */ - public ${ClassName} select${ClassName}ById(${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}ID - * @return 结果 - */ - public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s); - - /** - * 删除${functionName}信息 - * - * @param ${pkColumn.javaField} ${functionName}ID - * @return 结果 - */ - public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); -} diff --git a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm deleted file mode 100644 index 6c490a4b4..000000000 --- a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -#foreach ($column in $columns) - -#end - - - - select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName} - - - - - - - - insert into ${tableName} - -#foreach($column in $columns) -#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) - $column.columnName, -#end -#end - - -#foreach($column in $columns) -#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) - #{$column.javaField}, -#end -#end - - - - - update ${tableName} - -#foreach($column in $columns) -#if($column.columnName != $pkColumn.columnName) - $column.columnName = #{$column.javaField}, -#end -#end - - where ${pkColumn.columnName} = #{${pkColumn.javaField}} - - - - delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} - - - - delete from ${tableName} where ${pkColumn.columnName} in - - #{${pkColumn.javaField}} - - - - \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java deleted file mode 100644 index 7479ece0e..000000000 --- a/src/main/java/cn/iocoder/dashboard/modules/infra/convert/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.convert; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/package-info.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/package-info.java new file mode 100644 index 000000000..93a04d264 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.modules.system.controller.test; diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoBaseVO.java new file mode 100644 index 000000000..72cad4bde --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoBaseVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.dashboard.modules.system.controller.test.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SysTestDemoBaseVO { + + @ApiModelProperty(value = "字典名称", required = true, example = "性别额") + @NotNull(message = "字典名称不能为空") + private String name; + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_sex") + @NotNull(message = "字典类型不能为空") + private String dictType; + + @ApiModelProperty(value = "状态", required = true, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注", example = "我是备注") + private String remark; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoCreateReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoCreateReqVO.java new file mode 100644 index 000000000..112822987 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoCreateReqVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.dashboard.modules.system.controller.test.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("字典类型创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysTestDemoCreateReqVO extends SysTestDemoBaseVO { + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoPageReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoPageReqVO.java new file mode 100644 index 000000000..8818bdbcf --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoPageReqVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.dashboard.modules.system.controller.test.vo; + +import cn.iocoder.dashboard.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("字典类型分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysTestDemoPageReqVO extends PageParam { + + @ApiModelProperty(value = "字典名称", example = "性别额") + private String name; + + @ApiModelProperty(value = "字典类型", example = "sys_sex") + private String dictType; + + @ApiModelProperty(value = "状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "备注", example = "我是备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoRespVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoRespVO.java new file mode 100644 index 000000000..c0b8e5f46 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoRespVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.dashboard.modules.system.controller.test.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("字典类型 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysTestDemoRespVO extends SysTestDemoBaseVO { + + @ApiModelProperty(value = "字典主键", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoUpdateReqVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoUpdateReqVO.java new file mode 100644 index 000000000..e0343d7e2 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/vo/SysTestDemoUpdateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.dashboard.modules.system.controller.test.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("字典类型更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysTestDemoUpdateReqVO extends SysTestDemoBaseVO { + + @ApiModelProperty(value = "字典主键", required = true, example = "1") + @NotNull(message = "字典主键不能为空") + private Long id; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/test/SysTestDemoMapper.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/test/SysTestDemoMapper.java new file mode 100644 index 000000000..96672187e --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/test/SysTestDemoMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.test; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.test.SysTestDemoDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoPageReqVO; + +/** +* 字典类型 Mapper +* +* @author 芋艿 +*/ +@Mapper +public interface SysTestDemoMapper extends BaseMapperX { + + default PageResult selectPage(SysTestDemoPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("dict_type", reqVO.getDictType()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("remark", reqVO.getRemark()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + ); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/test/SysTestDemoDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/test/SysTestDemoDO.java new file mode 100644 index 000000000..65efa29a0 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/test/SysTestDemoDO.java @@ -0,0 +1,44 @@ +package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.test; + +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** +* 字典类型 DO +* +* @author 芋艿 +*/ +@TableName("sys_test_demo") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysTestDemoDO extends BaseDO { + + /** + * 字典主键 + */ + @TableId + private Long id; + /** + * 字典名称 + */ + private String name; + /** + * 字典类型 + */ + private String dictType; + /** + * 状态 + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/test/SysTestDemoService.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/test/SysTestDemoService.java new file mode 100644 index 000000000..11192a0f6 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/test/SysTestDemoService.java @@ -0,0 +1,66 @@ +package cn.iocoder.dashboard.modules.system.service.test; + +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.test.SysTestDemoDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** +* 字典类型 Service 接口 +* +* @author 芋艿 +*/ +public interface SysTestDemoService { + + /** + * 创建字典类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTestDemo(@Valid SysTestDemoCreateReqVO createReqVO); + + /** + * 更新字典类型 + * + * @param updateReqVO 更新信息 + */ + void updateTestDemo(@Valid SysTestDemoUpdateReqVO updateReqVO); + + /** + * 删除字典类型 + * + * @param id 编号 + */ + void deleteTestDemo(Long id); + + /** + * 获得字典类型 + * + * @param id 编号 + * @return 字典类型 + */ + SysTestDemoDO getTestDemo(Long id); + + /** + * 获得字典类型列表 + * + * @param ids 编号 + * @return 字典类型列表 + */ + List getTestDemoList(Collection ids); + + /** + * 获得字典类型分页 + * + * @param pageReqVO 分页查询 + * @return 字典类型分页 + */ + PageResult getTestDemoPage(SysTestDemoPageReqVO pageReqVO); + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java index 6d228a18d..57fa01dfb 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java @@ -17,6 +17,8 @@ import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.*; +import static cn.hutool.core.text.CharSequenceUtil.*; + /** * 代码生成器的 Builder,负责: * 1. 将数据库的表 {@link ToolInformationSchemaTableDO} 定义,构建成 {@link ToolCodegenTableDO} @@ -25,6 +27,18 @@ import java.util.*; @Component public class ToolCodegenBuilder { + /** + * Module 名字的映射 TODO 后续梳理到配置类 + * + * key:模块的完整名 + * value:模块的缩写名 + */ + private static final Map moduleNames = MapUtil.builder() + .put("system", "sys") + .put("infra", "inf") + .put("tool", "tool") + .build(); + /** * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 * 注意,字段的匹配以后缀的方式 @@ -93,9 +107,9 @@ public class ToolCodegenBuilder { CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是可能需要传递的 + LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的 LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 } public ToolCodegenTableDO buildTable(ToolInformationSchemaTableDO schemaTable) { @@ -110,13 +124,12 @@ public class ToolCodegenBuilder { * @param table 表定义 */ private void initTableDefault(ToolCodegenTableDO table) { - table.setModuleName(StrUtil.subBefore(table.getTableName(), - '_', false)); // 第一个 _ 前缀的前面,作为 module 名字 - table.setBusinessName(StrUtil.subAfter(table.getTableName(), - '_', false)); // 第一个 _ 前缀的后面,作为 module 名字 - table.setBusinessName(StrUtil.toCamelCase(table.getBusinessName())); // 可能存在多个 _ 的情况,转换成驼峰 - table.setClassName(StrUtil.upperFirst(StrUtil.toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 - table.setClassComment(StrUtil.subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 + table.setModuleName(getFullModuleName(StrUtil.subBefore(table.getTableName(), + '_', false))); // 第一个 _ 前缀的前面,作为 module 名字 + table.setBusinessName(toCamelCase(subAfter(table.getTableName(), + '_', false))); // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰 + table.setClassName(upperFirst(toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 + table.setClassComment(subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 '表', true)); table.setAuthor("芋艿"); // TODO 稍后改成创建人 table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); @@ -144,7 +157,7 @@ public class ToolCodegenBuilder { private void processColumnJava(ToolCodegenColumnDO column) { // 处理 javaField 字段 - column.setJavaField(StrUtil.toCamelCase(column.getColumnName())); + column.setJavaField(toCamelCase(column.getColumnName())); // 处理 dictType 字段,暂无 // 处理 javaType 字段 String dbType = StrUtil.subBefore(column.getColumnType(), '(', false); @@ -194,4 +207,27 @@ public class ToolCodegenBuilder { } } + /** + * 获得模块的缩略名 + * + * @param fullModuleName 模块的完整名 + * @return 缩略名 + */ + public String getSimpleModuleName(String fullModuleName) { + return moduleNames.getOrDefault(fullModuleName, fullModuleName); + } + + /** + * 获得模块的完整名 + * + * @param shortModuleName 模块的缩略名 + * @return 完整名 + */ + public String getFullModuleName(String shortModuleName) { + return moduleNames.entrySet().stream() + .filter(entry -> entry.getValue().equals(shortModuleName)) // 匹配 + .findFirst().map(Map.Entry::getKey) // 返回 key + .orElse(shortModuleName); // 兜底返回 shortModuleName + } + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 4258cf192..56fb4a766 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -14,6 +14,7 @@ import cn.iocoder.dashboard.util.collection.CollectionUtils; import cn.iocoder.dashboard.util.date.DateUtils; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,6 +32,9 @@ import static cn.hutool.core.text.CharSequenceUtil.*; @Component public class ToolCodegenEngine { + @Resource + private ToolCodegenBuilder codegenBuilder; + /** * 模板引擎,由 hutool 实现 */ @@ -69,9 +73,15 @@ public class ToolCodegenEngine { Map bindingMap = new HashMap<>(globalBindingMap); bindingMap.put("table", table); bindingMap.put("columns", columns); - bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey)); - bindingMap.put("simpleClassName", upperFirst(toCamelCase(subAfter( // 去掉第一个驼峰,例如说 SysUser 去掉后是 User - toUnderlineCase(table.getClassName()), '_', false)))); + bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey)); // 主键字段 + String simpleModuleName = codegenBuilder.getSimpleModuleName(table.getModuleName()); + bindingMap.put("simpleModuleName", simpleModuleName); // 将 system 转成 sys + // className 相关 + String simpleClassName = subAfter(table.getClassName(), upperFirst(simpleModuleName) + , false); // 将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 + bindingMap.put("simpleClassName", simpleClassName); + bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type + bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量 // 执行生成 // String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/dal/mapper.vm").render(bindingMap); @@ -80,7 +90,10 @@ public class ToolCodegenEngine { // String result = templateEngine.getTemplate("codegen/controller/vo/createReqVO.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/controller/vo/updateReqVO.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/controller/vo/respVO.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/convert/convert.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/enums/errorcode.vm").render(bindingMap); String result = templateEngine.getTemplate("codegen/service/service.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/service/serviceImpl.vm").render(bindingMap); System.out.println(result); } diff --git a/src/main/resources/codegen/controller/vo/updateReqVO.vm b/src/main/resources/codegen/controller/vo/updateReqVO.vm index 62acbf799..e10abcc10 100644 --- a/src/main/resources/codegen/controller/vo/updateReqVO.vm +++ b/src/main/resources/codegen/controller/vo/updateReqVO.vm @@ -6,8 +6,8 @@ import io.swagger.annotations.*; import javax.validation.constraints.*; ## 处理 Date 字段的引入 #foreach ($column in $columns) -#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult})) - && ${column.javaType} == "Date")## 时间类型 +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}) + && ${column.javaType} == "Date"))## 时间类型 import org.springframework.format.annotation.DateTimeFormat; import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; diff --git a/src/main/resources/codegen/convert/convert.vm b/src/main/resources/codegen/convert/convert.vm new file mode 100644 index 000000000..4571c9553 --- /dev/null +++ b/src/main/resources/codegen/convert/convert.vm @@ -0,0 +1,22 @@ +package ${basePackage}.${table.moduleName}.convert.${table.businessName}; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; + +/** +* ${table.classComment} Convert +* +* @author ${table.author} +*/ +@Mapper +public interface ${table.className}Convert { + + ${table.className}Convert INSTANCE = Mappers.getMapper(${table.className}Convert.class); + + ${table.className}DO convert(${table.className}CreateReqVO bean); + + ${table.className}DO convert(${table.className}UpdateReqVO bean); + +} diff --git a/src/main/resources/codegen/dal/do.vm b/src/main/resources/codegen/dal/do.vm index 70c8cc02c..6fd37b13c 100644 --- a/src/main/resources/codegen/dal/do.vm +++ b/src/main/resources/codegen/dal/do.vm @@ -3,7 +3,7 @@ package ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.business import lombok.*; import java.util.*; import com.baomidou.mybatisplus.annotation.*; -import ${BaseDOClassName}; +import ${baseDOClassName}; /** * ${table.classComment} DO diff --git a/src/main/resources/codegen/dal/mapper.vm b/src/main/resources/codegen/dal/mapper.vm index 942f17a95..a70aadd30 100644 --- a/src/main/resources/codegen/dal/mapper.vm +++ b/src/main/resources/codegen/dal/mapper.vm @@ -5,6 +5,7 @@ import ${QueryWrapperClassName}; import ${BaseMapperClassName}; import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; import org.apache.ibatis.annotations.Mapper; +import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.${table.className}PageReqVO; /** * ${table.classComment} Mapper @@ -26,19 +27,19 @@ public interface ${table.className}Mapper extends BaseMapperX<${table.className} .neIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == ">")##情况三,> 的时候 - .gtIfPresent("${column.columnName}", reqVO.get${JavaField}()) + .gtIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 - .geIfPresent("${column.columnName}", reqVO.get${JavaField}()) + .geIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == "<")##情况五,< 的时候 - .gtIfPresent("${column.columnName}", reqVO.get${JavaField}()) + .gtIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == "LIKE")##情况七,Like 的时候 - .likeIfPresent("${column.columnName}", reqVO.get${JavaField}()) + .likeIfPresent("${column.columnName}", reqVO.get${JavaField}()) #end #if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候 - .betweenIfPresent("${column.columnName}", reqVO.getBegin${JavaField}(), reqVO.getEnd${JavaField}()) + .betweenIfPresent("${column.columnName}", reqVO.getBegin${JavaField}(), reqVO.getEnd${JavaField}()) #end #end #end diff --git a/src/main/resources/codegen/enums/errorcode.vm b/src/main/resources/codegen/enums/errorcode.vm new file mode 100644 index 000000000..f6f623c17 --- /dev/null +++ b/src/main/resources/codegen/enums/errorcode.vm @@ -0,0 +1,2 @@ +// ========== ${table.classCommet} TODO 补充编号 ========== +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_FOUND = new ErrorCode(TODO 补充编号, "${table.classComment}不存在}"); diff --git a/src/main/resources/codegen/service/service.vm b/src/main/resources/codegen/service/service.vm index 68a26df89..28d28b9be 100644 --- a/src/main/resources/codegen/service/service.vm +++ b/src/main/resources/codegen/service/service.vm @@ -17,7 +17,7 @@ public interface ${table.className}Service { * 创建${table.classComment} * * @param createReqVO 创建信息 - * @return ${class.description} + * @return 编号 */ ${primaryColumn.javaType} create${simpleClassName}(@Valid ${table.className}CreateReqVO createReqVO); @@ -39,7 +39,7 @@ public interface ${table.className}Service { * 获得${table.classComment} * * @param id 编号 - * @return ${class.description} + * @return ${table.classComment} */ ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id); @@ -47,7 +47,7 @@ public interface ${table.className}Service { * 获得${table.classComment}列表 * * @param ids 编号 - * @return ${class.classComment}列表 + * @return ${table.classComment}列表 */ List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids); @@ -55,7 +55,7 @@ public interface ${table.className}Service { * 获得${table.classComment}分页 * * @param pageReqVO 分页查询 - * @return ${class.classComment}分页 + * @return ${table.classComment}分页 */ PageResult<${table.className}DO> get${simpleClassName}Page(${table.className}PageReqVO pageReqVO); diff --git a/src/main/resources/codegen/service/serviceImpl.vm b/src/main/resources/codegen/service/serviceImpl.vm new file mode 100644 index 000000000..d129c4f38 --- /dev/null +++ b/src/main/resources/codegen/service/serviceImpl.vm @@ -0,0 +1,30 @@ +package ${basePackage}.${table.moduleName}.service.${table.businessName}.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; +import ${PageResultClassName}; + +import static ${basePackage}.${table.moduleName}.enums.${simpleModuleName.substring(0,1).toUpperCase()}${simpleModuleName.substring(1)}ErrorCodeConstants.*; + +/** +* ${table.classComment} Service 实现类 +* +* @author ${table.author} +*/ +@Validated +public class ${table.className}ServiceImpl implements {table.className}Service { + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Override + public ${primaryColumn.javaType} create${simpleClassName}(@Valid ${table.className}CreateReqVO createReqVO) { + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java index faf4d850b..180349650 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java @@ -24,7 +24,7 @@ public class ToolCodegenEngineTest { @Test public void testExecute() { - ToolCodegenTableDO table = codegenTableMapper.selectById(8); + ToolCodegenTableDO table = codegenTableMapper.selectById(10); List columns = codegenColumnMapper.selectByTableId(table.getId()); codegenEngine.execute(table, columns); } diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java index f534e9769..e31ed2b7c 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java @@ -16,7 +16,7 @@ class ToolCodegenServiceImplTest { @Test public void tetCreateCodegenTable() { - toolCodegenService.createCodegenTable("sys_dict_type"); + toolCodegenService.createCodegenTable("sys_test_demo"); } } From 59be930f2e93d3247486c9d2c88dbde929c56c24 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 7 Feb 2021 00:34:54 +0800 Subject: [PATCH 020/167] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20serviceImpl.vm=20?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/vm/java/serviceImpl.java.vm | 109 ------------------ .../system/enums/SysErrorCodeConstants.java | 3 + .../test/impl/SysTestDemoServiceImpl.java | 80 +++++++++++++ .../codegen/impl/ToolCodegenEngine.java | 8 +- src/main/resources/codegen/dal/do.vm | 2 +- src/main/resources/codegen/enums/errorcode.vm | 4 +- .../resources/codegen/service/serviceImpl.vm | 54 ++++++++- 7 files changed, 143 insertions(+), 117 deletions(-) delete mode 100644 ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/service/test/impl/SysTestDemoServiceImpl.java diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm deleted file mode 100644 index 05a3de84c..000000000 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ /dev/null @@ -1,109 +0,0 @@ -package ${packageName}.service.impl; - -import java.util.List; -#foreach ($column in $columns) -#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') -import com.ruoyi.common.utils.DateUtils; -#break -#end -#end -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -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}ID - * @return ${functionName} - */ - @Override - public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) - { - return ${className}Mapper.select${ClassName}ById(${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 结果 - */ - @Override - public int insert${ClassName}(${ClassName} ${className}) - { -#foreach ($column in $columns) -#if($column.javaField == 'createTime') - ${className}.setCreateTime(DateUtils.getNowDate()); -#end -#end - return ${className}Mapper.insert${ClassName}(${className}); - } - - /** - * 修改${functionName} - * - * @param ${className} ${functionName} - * @return 结果 - */ - @Override - public int update${ClassName}(${ClassName} ${className}) - { -#foreach ($column in $columns) -#if($column.javaField == 'updateTime') - ${className}.setUpdateTime(DateUtils.getNowDate()); -#end -#end - return ${className}Mapper.update${ClassName}(${className}); - } - - /** - * 批量删除${functionName} - * - * @param ${pkColumn.javaField}s 需要删除的${functionName}ID - * @return 结果 - */ - @Override - public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s) - { - return ${className}Mapper.delete${ClassName}ByIds(${pkColumn.javaField}s); - } - - /** - * 删除${functionName}信息 - * - * @param ${pkColumn.javaField} ${functionName}ID - * @return 结果 - */ - @Override - public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) - { - return ${className}Mapper.delete${ClassName}ById(${pkColumn.javaField}); - } -} diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java index 1bbde5784..70703bda4 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java @@ -75,4 +75,7 @@ public interface SysErrorCodeConstants { // ========== 文件 1002009000 ========== ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在"); + // ========== 字典类型(测试) 1002010000 ========== + ErrorCode TEST_DEMO_NOT_EXISTS = new ErrorCode(1002010000, "字典类型不存在}"); + } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/service/test/impl/SysTestDemoServiceImpl.java b/src/main/java/cn/iocoder/dashboard/modules/system/service/test/impl/SysTestDemoServiceImpl.java new file mode 100644 index 000000000..2b1df0250 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/service/test/impl/SysTestDemoServiceImpl.java @@ -0,0 +1,80 @@ +package cn.iocoder.dashboard.modules.system.service.test.impl; + +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoUpdateReqVO; +import cn.iocoder.dashboard.modules.system.convert.test.SysTestDemoConvert; +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.test.SysTestDemoMapper; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.test.SysTestDemoDO; +import cn.iocoder.dashboard.modules.system.service.test.SysTestDemoService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.TEST_DEMO_NOT_EXISTS; + +/** +* 字典类型 Service 实现类 +* +* @author 芋艿 +*/ +@Service +@Validated +public class SysTestDemoServiceImpl implements SysTestDemoService { + + @Resource + private SysTestDemoMapper testDemoMapper; + + @Override + public Long createTestDemo(SysTestDemoCreateReqVO createReqVO) { + // 插入 + SysTestDemoDO testDemo = SysTestDemoConvert.INSTANCE.convert(createReqVO); + testDemoMapper.insert(testDemo); + // 返回 + return testDemo.getId(); + } + + @Override + public void updateTestDemo(SysTestDemoUpdateReqVO updateReqVO) { + // 校验存在 + this.validateTestDemoExists(updateReqVO.getId()); + // 更新 + SysTestDemoDO updateObj = SysTestDemoConvert.INSTANCE.convert(updateReqVO); + testDemoMapper.updateById(updateObj); + } + + @Override + public void deleteTestDemo(Long id) { + // 校验存在 + this.validateTestDemoExists(id); + // 更新 + testDemoMapper.deleteById(id); + } + + private void validateTestDemoExists(Long id) { + if (testDemoMapper.selectById(id) == null) { + throw ServiceExceptionUtil.exception(TEST_DEMO_NOT_EXISTS); + } + } + + @Override + public SysTestDemoDO getTestDemo(Long id) { + return testDemoMapper.selectById(id); + } + + @Override + public List getTestDemoList(Collection ids) { + return testDemoMapper.selectBatchIds(ids); + } + + @Override + public PageResult getTestDemoPage(SysTestDemoPageReqVO pageReqVO) { + return testDemoMapper.selectPage(pageReqVO); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 56fb4a766..8d4559692 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.tool.service.codegen.impl; import cn.hutool.extra.template.TemplateConfig; import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateUtil; +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; import cn.iocoder.dashboard.common.pojo.PageParam; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; @@ -59,11 +60,12 @@ public class ToolCodegenEngine { // 全局 Java Bean globalBindingMap.put("PageResultClassName", PageResult.class.getName()); globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); + globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); // VO 类,独有字段 globalBindingMap.put("PageParamClassName", PageParam.class.getName()); // DO 类,独有字段 globalBindingMap.put("baseDOFields", ToolCodegenBuilder.BASE_DO_FIELDS); - globalBindingMap.put("baseDOClassName", BaseDO.class.getName()); + globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); globalBindingMap.put("QueryWrapperClassName", QueryWrapperX.class.getName()); globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); } @@ -92,8 +94,8 @@ public class ToolCodegenEngine { // String result = templateEngine.getTemplate("codegen/controller/vo/respVO.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/convert/convert.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/enums/errorcode.vm").render(bindingMap); - String result = templateEngine.getTemplate("codegen/service/service.vm").render(bindingMap); -// String result = templateEngine.getTemplate("codegen/service/serviceImpl.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/service/service.vm").render(bindingMap); + String result = templateEngine.getTemplate("codegen/service/serviceImpl.vm").render(bindingMap); System.out.println(result); } diff --git a/src/main/resources/codegen/dal/do.vm b/src/main/resources/codegen/dal/do.vm index 6fd37b13c..70c8cc02c 100644 --- a/src/main/resources/codegen/dal/do.vm +++ b/src/main/resources/codegen/dal/do.vm @@ -3,7 +3,7 @@ package ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.business import lombok.*; import java.util.*; import com.baomidou.mybatisplus.annotation.*; -import ${baseDOClassName}; +import ${BaseDOClassName}; /** * ${table.classComment} DO diff --git a/src/main/resources/codegen/enums/errorcode.vm b/src/main/resources/codegen/enums/errorcode.vm index f6f623c17..099a1d228 100644 --- a/src/main/resources/codegen/enums/errorcode.vm +++ b/src/main/resources/codegen/enums/errorcode.vm @@ -1,2 +1,2 @@ -// ========== ${table.classCommet} TODO 补充编号 ========== -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_FOUND = new ErrorCode(TODO 补充编号, "${table.classComment}不存在}"); +// ========== ${table.classComment} TODO 补充编号 ========== +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在}"); diff --git a/src/main/resources/codegen/service/serviceImpl.vm b/src/main/resources/codegen/service/serviceImpl.vm index d129c4f38..5f883885a 100644 --- a/src/main/resources/codegen/service/serviceImpl.vm +++ b/src/main/resources/codegen/service/serviceImpl.vm @@ -10,6 +10,12 @@ import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; import ${PageResultClassName}; +import ${basePackage}.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.${table.moduleName}.dal.mysql.dao.${table.businessName}.${table.className}Mapper; +import ${basePackage}.${table.moduleName}.service.${table.businessName}.${table.className}Service; + +import ${ServiceExceptionUtilClassName}; + import static ${basePackage}.${table.moduleName}.enums.${simpleModuleName.substring(0,1).toUpperCase()}${simpleModuleName.substring(1)}ErrorCodeConstants.*; /** @@ -17,14 +23,58 @@ import static ${basePackage}.${table.moduleName}.enums.${simpleModuleName.substr * * @author ${table.author} */ +@Service @Validated -public class ${table.className}ServiceImpl implements {table.className}Service { +public class ${table.className}ServiceImpl implements ${table.className}Service { @Resource private ${table.className}Mapper ${classNameVar}Mapper; @Override - public ${primaryColumn.javaType} create${simpleClassName}(@Valid ${table.className}CreateReqVO createReqVO) { + public ${primaryColumn.javaType} create${simpleClassName}(${table.className}CreateReqVO createReqVO) { + // 插入 + ${table.className}DO ${classNameVar} = ${table.className}Convert.INSTANCE.convert(createReqVO); + ${classNameVar}Mapper.insert(${classNameVar}); + // 返回 + return ${classNameVar}.getId(); + } + + @Override + public void update${simpleClassName}(${table.className}UpdateReqVO updateReqVO) { + // 校验存在 + this.validate${simpleClassName}Exists(updateReqVO.getId()); + // 更新 + ${table.className}DO updateObj = ${table.className}Convert.INSTANCE.convert(updateReqVO); + ${classNameVar}Mapper.updateById(updateObj); + } + + @Override + public void delete${simpleClassName}(${primaryColumn.javaType} id) { + // 校验存在 + this.validate${simpleClassName}Exists(id); + // 更新 + ${classNameVar}Mapper.deleteById(id); + } + + private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { + if (${classNameVar}Mapper.selectById(id) == null) { + throw ServiceExceptionUtil.exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + } + + @Override + public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) { + return ${classNameVar}Mapper.selectById(id); + } + + @Override + public List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids) { + return ${classNameVar}Mapper.selectBatchIds(ids); + } + + @Override + public PageResult<${table.className}DO> get${simpleClassName}Page(${table.className}PageReqVO pageReqVO) { + return ${classNameVar}Mapper.selectPage(pageReqVO); } } From 45d203550fbd34893669372313a46358cedba09a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 9 Feb 2021 12:51:01 +0800 Subject: [PATCH 021/167] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20controller.vm=20?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/SysTestDemoController.java | 78 ++++++++++++++++++ .../codegen/impl/ToolCodegenEngine.java | 7 +- .../codegen/controller/controller.vm | 79 +++++++++++-------- src/main/resources/codegen/convert/convert.vm | 10 +++ 4 files changed, 140 insertions(+), 34 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/modules/system/controller/test/SysTestDemoController.java diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/SysTestDemoController.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/SysTestDemoController.java new file mode 100644 index 000000000..5e910fd69 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/test/SysTestDemoController.java @@ -0,0 +1,78 @@ +package cn.iocoder.dashboard.modules.system.controller.test; + +import cn.iocoder.dashboard.common.pojo.CommonResult; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoRespVO; +import cn.iocoder.dashboard.modules.system.controller.test.vo.SysTestDemoUpdateReqVO; +import cn.iocoder.dashboard.modules.system.convert.test.SysTestDemoConvert; +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.test.SysTestDemoDO; +import cn.iocoder.dashboard.modules.system.service.test.SysTestDemoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.dashboard.common.pojo.CommonResult.success; + +@Api(tags = "字典类型") +@RestController +@RequestMapping("/system/test-demo") +@Validated +public class SysTestDemoController { + + @Resource + private SysTestDemoService testDemoService; + + @ApiOperation("创建字典类型") + @PostMapping("/create") + public CommonResult createTestDemo(@Valid SysTestDemoCreateReqVO createReqVO) { + return success(testDemoService.createTestDemo(createReqVO)); + } + + @ApiOperation("更新字典类型") + @PutMapping("/update") + public CommonResult updateTestDemo(@Valid SysTestDemoUpdateReqVO updateReqVO) { + testDemoService.updateTestDemo(updateReqVO); + return success(true); + } + + @ApiOperation("删除字典类型") + @DeleteMapping("/delete") + @ApiImplicitParam(name = "id", value = "编号", required = true) + public CommonResult deleteTestDemo(@RequestParam("id") Long id) { + testDemoService.deleteTestDemo(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得字典类型") + @ApiImplicitParam(name = "id", value = "编号", required = true) + public CommonResult getTestDemo(@RequestParam("id") Long id) { + SysTestDemoDO testDemo = testDemoService.getTestDemo(id); + return success(SysTestDemoConvert.INSTANCE.convert(testDemo)); + } + + @GetMapping("/list") + @ApiOperation("获得字典类型列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true) + public CommonResult> getTestDemoList(@RequestParam("ids") Collection ids) { + List list = testDemoService.getTestDemoList(ids); + return success(SysTestDemoConvert.INSTANCE.convertList(list)); + } + + @ApiOperation("获得字典类型分页") + @GetMapping("/page") + public CommonResult> getTestDemoPage(@Valid SysTestDemoPageReqVO pageVO) { + PageResult pageResult = testDemoService.getTestDemoPage(pageVO); + return success(SysTestDemoConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 8d4559692..f5f3b3943 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -4,6 +4,7 @@ import cn.hutool.extra.template.TemplateConfig; import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateUtil; import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.common.pojo.PageParam; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; @@ -58,6 +59,7 @@ public class ToolCodegenEngine { // 全局配置 globalBindingMap.put("basePackage", "cn.iocoder.dashboard.modules"); // TODO 基础包, 抽成参数 // 全局 Java Bean + globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); globalBindingMap.put("PageResultClassName", PageResult.class.getName()); globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); @@ -76,6 +78,7 @@ public class ToolCodegenEngine { bindingMap.put("table", table); bindingMap.put("columns", columns); bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey)); // 主键字段 + // moduleName 相关 String simpleModuleName = codegenBuilder.getSimpleModuleName(table.getModuleName()); bindingMap.put("simpleModuleName", simpleModuleName); // 将 system 转成 sys // className 相关 @@ -84,6 +87,7 @@ public class ToolCodegenEngine { bindingMap.put("simpleClassName", simpleClassName); bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量 + bindingMap.put("simpleClassName_strikeCase", toSymbolCase(simpleClassName, '-')); // 将 DictType 转换成 dict-type // 执行生成 // String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/dal/mapper.vm").render(bindingMap); @@ -95,7 +99,8 @@ public class ToolCodegenEngine { // String result = templateEngine.getTemplate("codegen/convert/convert.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/enums/errorcode.vm").render(bindingMap); // String result = templateEngine.getTemplate("codegen/service/service.vm").render(bindingMap); - String result = templateEngine.getTemplate("codegen/service/serviceImpl.vm").render(bindingMap); +// String result = templateEngine.getTemplate("codegen/service/serviceImpl.vm").render(bindingMap); + String result = templateEngine.getTemplate("codegen/controller/controller.vm").render(bindingMap); System.out.println(result); } diff --git a/src/main/resources/codegen/controller/controller.vm b/src/main/resources/codegen/controller/controller.vm index ba40b5602..c7f8438ba 100644 --- a/src/main/resources/codegen/controller/controller.vm +++ b/src/main/resources/codegen/controller/controller.vm @@ -1,63 +1,76 @@ +package ${basePackage}.${table.moduleName}.controller.${table.businessName}; + import org.springframework.web.bind.annotation.*; -import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + import io.swagger.annotations.*; + import javax.validation.constraints.*; import javax.validation.*; import java.util.*; -import org.springframework.validation.annotation.Validated; +import ${PageResultClassName}; +import ${CommonResultClassName}; +import static ${CommonResultClassName}.success; -/** - * ${class.description} Controller - */ +import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.${table.moduleName}.dal.mysql.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.${table.moduleName}.service.${table.businessName}.${table.className}Service; + +@Api(tags = "${table.classComment}") @RestController -@RequestMapping("/${class.classNameLowerUnderscore}") -@Api(tags = "${class.description}") +##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写 +@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}") @Validated -public class ${class.className}Controller { +public class ${table.className}Controller { - @Autowired - private ${class.className}Service ${class.classNameVar}Service; + @Resource + private ${table.className}Service ${classNameVar}Service; + @ApiOperation("创建${table.classComment}") @PostMapping("/create") - @ApiOperation("创建${class.description}") - public CommonResult create${class.className}(@Valid ${class.className}CreateReqVO createVO) { - return success(${class.classNameVar}Service.create${class.className}(createVO)); + public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid ${table.className}CreateReqVO createReqVO) { + return success(${classNameVar}Service.create${simpleClassName}(createReqVO)); } - @PostMapping("/update") - @ApiOperation("更新${class.description}") - public CommonResult update${class.className}(@Valid ${class.className}UpdateReqVO updateVO) { - ${class.classNameVar}Service.update${class.className}(updateVO); + @ApiOperation("更新${table.classComment}") + @PutMapping("/update") + public CommonResult update${simpleClassName}(@Valid ${table.className}UpdateReqVO updateReqVO) { + ${classNameVar}Service.update${simpleClassName}(updateReqVO); return success(true); } - @PostMapping("/delete") - @ApiOperation("删除${class.description}") - @ApiImplicitParam(name = "${class.classNameVar}Id", value = "${class.description}编号", required = true) - public CommonResult delete${class.className}(@RequestParam("${class.classNameVar}Id") Integer ${class.classNameVar}Id) { - ${class.classNameVar}Service.delete${class.className}(${class.classNameVar}Id); + @ApiOperation("删除${table.classComment}") + @DeleteMapping("/delete") + @ApiImplicitParam(name = "id", value = "编号", required = true) + public CommonResult delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${classNameVar}Service.delete${simpleClassName}(id); return success(true); } @GetMapping("/get") - @ApiOperation("获得${class.description}") - @ApiImplicitParam(name = "${class.classNameVar}Id", value = "${class.description}编号", required = true) - public CommonResult<${class.className}RespVO> get${class.className}(@RequestParam("${class.classNameVar}Id") Integer ${class.classNameVar}Id) { - return success(${class.classNameVar}Service.get${class.className}(${class.classNameVar}Id)); + @ApiOperation("获得${table.classComment}") + @ApiImplicitParam(name = "id", value = "编号", required = true) + public CommonResult<${table.className}RespVO> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); + return success(${table.className}Convert.INSTANCE.convert(${classNameVar})); } @GetMapping("/list") - @ApiOperation("获得${class.description}列表") - @ApiImplicitParam(name = "${class.classNameVar}Ids", value = "${class.description}编号列表", required = true) - public CommonResult> list${class.className}s(@RequestParam("${class.classNameVar}Ids") List ${class.classNameVar}Ids) { - return success(${class.classNameVar}Service.list${class.className}s(${class.classNameVar}Ids)); + @ApiOperation("获得${table.classComment}列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true) + public CommonResult> get${simpleClassName}List(@RequestParam("ids") Collection<${primaryColumn.javaType}> ids) { + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(ids); + return success(${table.className}Convert.INSTANCE.convertList(list)); } + @ApiOperation("获得${table.classComment}分页") @GetMapping("/page") - @ApiOperation("获得${class.description}分页") - public CommonResult> page${class.className}(${class.className}PageReqVO pageVO) { - return success(${class.classNameVar}Service.page${class.className}(pageVO)); + public CommonResult> get${simpleClassName}Page(@Valid ${table.className}PageReqVO pageVO) { + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageVO); + return success(${table.className}Convert.INSTANCE.convertPage(pageResult)); } } diff --git a/src/main/resources/codegen/convert/convert.vm b/src/main/resources/codegen/convert/convert.vm index 4571c9553..e32b24ecb 100644 --- a/src/main/resources/codegen/convert/convert.vm +++ b/src/main/resources/codegen/convert/convert.vm @@ -1,5 +1,9 @@ package ${basePackage}.${table.moduleName}.convert.${table.businessName}; +import java.util.*; + +import ${PageResultClassName}; + import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; @@ -19,4 +23,10 @@ public interface ${table.className}Convert { ${table.className}DO convert(${table.className}UpdateReqVO bean); + ${table.className}RespVO convert(${table.className}DO bean); + + List<${table.className}RespVO> convertList(List<${table.className}DO> list); + + PageResult<${table.className}RespVO> convertPage(PageResult<${table.className}DO> page); + } From b04db3d6d87b7d01c6dc37c20d02b3b416933b85 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 9 Feb 2021 15:55:54 +0800 Subject: [PATCH 022/167] =?UTF-8?q?=E5=8D=87=E7=BA=A7=20highlight=20?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/package.json | 2 +- ruoyi-ui/src/api/tool/codegen.js | 2 + ruoyi-ui/src/main.js | 6 +- ruoyi-ui/src/views/tool/gen/editTable.vue | 10 ++- ruoyi-ui/src/views/tool/gen/genInfoForm.vue | 89 ++++++++++++++++++--- ruoyi-ui/src/views/tool/gen/index.vue | 28 ++++++- 6 files changed, 117 insertions(+), 20 deletions(-) create mode 100644 ruoyi-ui/src/api/tool/codegen.js diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 6f07a9544..7df639f52 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -44,7 +44,7 @@ "element-ui": "2.14.1", "file-saver": "2.0.4", "fuse.js": "6.4.3", - "highlight.js": "10.4.1", + "highlight.js": "9.18.5", "js-beautify": "1.13.0", "js-cookie": "2.2.1", "jsencrypt": "3.0.0-rc.1", diff --git a/ruoyi-ui/src/api/tool/codegen.js b/ruoyi-ui/src/api/tool/codegen.js new file mode 100644 index 000000000..d95ed38d5 --- /dev/null +++ b/ruoyi-ui/src/api/tool/codegen.js @@ -0,0 +1,2 @@ +import request from '@/utils/request' + diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index 969a93e50..3bd0e5b38 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -21,8 +21,8 @@ import Pagination from "@/components/Pagination"; // 自定义表格工具扩展 import RightToolbar from "@/components/RightToolbar" // 代码高亮插件 -import hljs from 'highlight.js' -import 'highlight.js/styles/github-gist.css' +// import hljs from 'highlight.js' +// import 'highlight.js/styles/github-gist.css' import {DICT_TYPE, getDictDataLabel, getDictDatas} from "@/utils/dict"; // 全局方法挂载 @@ -57,7 +57,7 @@ Vue.component('Pagination', Pagination) Vue.component('RightToolbar', RightToolbar) Vue.use(permission) -Vue.use(hljs.vuePlugin); +// Vue.use(hljs.vuePlugin); /** * If you don't want to use mock-server diff --git a/ruoyi-ui/src/views/tool/gen/editTable.vue b/ruoyi-ui/src/views/tool/gen/editTable.vue index 800368326..39071894e 100644 --- a/ruoyi-ui/src/views/tool/gen/editTable.vue +++ b/ruoyi-ui/src/views/tool/gen/editTable.vue @@ -90,7 +90,8 @@ - + + @@ -112,7 +113,7 @@ - + @@ -143,6 +144,8 @@ export default { activeName: "cloum", // 表格的高度 tableHeight: document.documentElement.scrollHeight - 245 + "px", + // 表信息 + tables: [], // 表列信息 cloumns: [], // 字典信息 @@ -160,6 +163,7 @@ export default { getGenTable(tableId).then(res => { this.cloumns = res.data.rows; this.info = res.data.info; + this.tables = res.data.tables; }); /** 查询字典下拉列表 */ getDictOptionselect().then(response => { @@ -167,7 +171,7 @@ export default { }); /** 查询菜单下拉列表 */ getMenuTreeselect().then(response => { - this.menus = this.handleTree(response.data, "id"); + this.menus = this.handleTree(response.data, "menuId"); }); } }, diff --git a/ruoyi-ui/src/views/tool/gen/genInfoForm.vue b/ruoyi-ui/src/views/tool/gen/genInfoForm.vue index a77098c9e..926376c96 100644 --- a/ruoyi-ui/src/views/tool/gen/genInfoForm.vue +++ b/ruoyi-ui/src/views/tool/gen/genInfoForm.vue @@ -4,9 +4,10 @@ 生成模板 - + + @@ -126,8 +127,8 @@ @@ -144,8 +145,8 @@ @@ -162,8 +163,47 @@ + + + + + +

关联信息

+ + + + 关联子表的表名 + + + + + + + + + + + + + 子表关联的外键名 + + + + + + @@ -185,6 +225,10 @@ export default { type: Object, default: null }, + tables: { + type: Array, + default: null + }, menus: { type: Array, default: [] @@ -192,6 +236,7 @@ export default { }, data() { return { + subColumns: [], rules: { tplCategory: [ { required: true, message: "请选择生成模板", trigger: "blur" } @@ -212,6 +257,11 @@ export default { }; }, created() {}, + watch: { + 'info.subTableName': function(val) { + this.setSubTableColumns(val); + } + }, methods: { /** 转换菜单数据结构 */ normalizer(node) { @@ -219,10 +269,31 @@ export default { delete node.children; } return { - id: node.id, - label: node.name, + id: node.menuId, + label: node.menuName, children: node.children }; + }, + /** 选择子表名触发 */ + subSelectChange(value) { + this.info.subTableFkName = ''; + }, + /** 选择生成模板触发 */ + tplSelectChange(value) { + if(value !== 'sub') { + this.info.subTableName = ''; + this.info.subTableFkName = ''; + } + }, + /** 设置关联外键 */ + setSubTableColumns(value) { + for (var item in this.tables) { + const name = this.tables[item].tableName; + if (value === name) { + this.subColumns = this.tables[item].columns; + break; + } + } } } }; diff --git a/ruoyi-ui/src/views/tool/gen/index.vue b/ruoyi-ui/src/views/tool/gen/index.vue index a9145f8f5..2d62d475d 100644 --- a/ruoyi-ui/src/views/tool/gen/index.vue +++ b/ruoyi-ui/src/views/tool/gen/index.vue @@ -32,7 +32,7 @@ > - 搜索 + 搜索 重置 @@ -41,6 +41,7 @@ - + - - + - + - + - + - + @@ -110,10 +108,15 @@ + + + - + @@ -125,7 +128,8 @@ diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 185001451..f56374809 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -72,6 +72,8 @@ public class ToolCodegenEngine { .put(javaTemplatePath("service/serviceImpl"), javaFilePath("service/${table.businessName}/impl/${table.className}ServiceImpl")) // Vue + .put(vueTemplatePath("views/index.vue"), + vueFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) // SQL .build(); @@ -161,4 +163,12 @@ public class ToolCodegenEngine { return "java/${basePackage}/${table.moduleName}/" + path + ".java"; } + private static String vueTemplatePath(String path) { + return "codegen/vue/" + path + ".vm"; + } + + private static String vueFilePath(String path) { + return "vue/" + path; + } + } diff --git a/src/main/resources/codegen/java/controller/vo/pageReqVO.vm b/src/main/resources/codegen/java/controller/vo/pageReqVO.vm index 1fe25b9c1..71630742e 100644 --- a/src/main/resources/codegen/java/controller/vo/pageReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/pageReqVO.vm @@ -36,7 +36,7 @@ public class ${table.className}PageReqVO extends PageParam { #columnTpl('end', '结束') #else##情况二,非 Between 的时间 -#columnTpl('', '') + #columnTpl('', '') #end #end diff --git a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/src/main/resources/codegen/vue/views/index.vue.vm similarity index 73% rename from ruoyi-generator/src/main/resources/vm/vue/index.vue.vm rename to src/main/resources/codegen/vue/views/index.vue.vm index 8ff104711..4e091361e 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm +++ b/src/main/resources/codegen/vue/views/index.vue.vm @@ -1,538 +1,536 @@ - - - + + + diff --git a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java index 4036ed8ea..cd41bd133 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java @@ -10,6 +10,7 @@ import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; import java.util.List; +import java.util.Map; @SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class ToolCodegenEngineTest { @@ -24,9 +25,10 @@ public class ToolCodegenEngineTest { @Test public void testExecute() { - ToolCodegenTableDO table = codegenTableMapper.selectById(14); + ToolCodegenTableDO table = codegenTableMapper.selectById(10); List columns = codegenColumnMapper.selectListByTableId(table.getId()); - codegenEngine.execute(table, columns); + Map result = codegenEngine.execute(table, columns); + System.out.println(result.get("vue/views/system/test/index.vue")); } } From 802e80f655f6ee12c14093fd88f729cbe5698edf Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 11 Feb 2021 15:44:29 +0800 Subject: [PATCH 033/167] =?UTF-8?q?=E5=AE=8C=E6=88=90=20vue=20=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E3=80=81=E5=88=97=E8=A1=A8=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/codegen/vue/views/index.vue.vm | 212 ++++++------------ 1 file changed, 69 insertions(+), 143 deletions(-) diff --git a/src/main/resources/codegen/vue/views/index.vue.vm b/src/main/resources/codegen/vue/views/index.vue.vm index 4e091361e..f0568f93f 100644 --- a/src/main/resources/codegen/vue/views/index.vue.vm +++ b/src/main/resources/codegen/vue/views/index.vue.vm @@ -1,35 +1,37 @@