소스 검색

feat: 发布1.4.0

Uncarbon 4 년 전
부모
커밋
6a899d8543
51개의 변경된 파일1748개의 추가작업 그리고 1541개의 파일을 삭제
  1. 6 2
      README.md
  2. 439 451
      attachments/schema/MySQL/helio_boot.sql
  3. 870 880
      attachments/schema/PostgreSQL/helio_boot.sql
  4. 32 4
      pom.xml
  5. 1 1
      src/main/java/cc/uncarbon/interceptor/AdminSaTokenParseInterceptor.java
  6. 5 7
      src/main/java/cc/uncarbon/module/app/controller/AppAuthController.java
  7. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminAuthController.java
  8. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysDataDictController.java
  9. 2 2
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysDeptController.java
  10. 2 2
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysLogController.java
  11. 3 3
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysMenuController.java
  12. 2 2
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysParamController.java
  13. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysRoleController.java
  14. 2 2
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysTenantController.java
  15. 4 3
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysUserController.java
  16. 1 1
      src/main/java/cc/uncarbon/module/sys/entity/SysDataDictEntity.java
  17. 2 2
      src/main/java/cc/uncarbon/module/sys/entity/SysDeptEntity.java
  18. 1 1
      src/main/java/cc/uncarbon/module/sys/entity/SysLogEntity.java
  19. 4 4
      src/main/java/cc/uncarbon/module/sys/entity/SysMenuEntity.java
  20. 1 1
      src/main/java/cc/uncarbon/module/sys/entity/SysParamEntity.java
  21. 1 1
      src/main/java/cc/uncarbon/module/sys/entity/SysRoleEntity.java
  22. 1 1
      src/main/java/cc/uncarbon/module/sys/entity/SysRoleMenuRelationEntity.java
  23. 6 2
      src/main/java/cc/uncarbon/module/sys/entity/SysTenantEntity.java
  24. 1 1
      src/main/java/cc/uncarbon/module/sys/entity/SysUserDeptRelationEntity.java
  25. 2 2
      src/main/java/cc/uncarbon/module/sys/entity/SysUserEntity.java
  26. 1 1
      src/main/java/cc/uncarbon/module/sys/entity/SysUserRoleRelationEntity.java
  27. 20 0
      src/main/java/cc/uncarbon/module/sys/enums/GenericStatusEnum.java
  28. 5 5
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysDeptDTO.java
  29. 1 1
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysMenuDTO.java
  30. 0 3
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysParamDTO.java
  31. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysUserDTO.java
  32. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysLogDTO.java
  33. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysRoleDTO.java
  34. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysTenantDTO.java
  35. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysUserDTO.java
  36. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/SysUserLoginDTO.java
  37. 1 1
      src/main/java/cc/uncarbon/module/sys/model/response/SysDeptBO.java
  38. 1 1
      src/main/java/cc/uncarbon/module/sys/model/response/SysLogBO.java
  39. 2 2
      src/main/java/cc/uncarbon/module/sys/model/response/SysMenuBO.java
  40. 4 0
      src/main/java/cc/uncarbon/module/sys/model/response/VbenAdminUserInfoBO.java
  41. 30 7
      src/main/java/cc/uncarbon/module/sys/service/SysDataDictService.java
  42. 35 11
      src/main/java/cc/uncarbon/module/sys/service/SysDeptService.java
  43. 20 4
      src/main/java/cc/uncarbon/module/sys/service/SysLogService.java
  44. 37 17
      src/main/java/cc/uncarbon/module/sys/service/SysMenuService.java
  45. 40 16
      src/main/java/cc/uncarbon/module/sys/service/SysParamService.java
  46. 30 9
      src/main/java/cc/uncarbon/module/sys/service/SysRoleService.java
  47. 37 11
      src/main/java/cc/uncarbon/module/sys/service/SysTenantService.java
  48. 3 3
      src/main/java/cc/uncarbon/module/sys/service/SysUserRoleRelationService.java
  49. 46 15
      src/main/java/cc/uncarbon/module/sys/service/SysUserService.java
  50. 6 3
      src/main/resources/application.yml
  51. 26 41
      src/main/resources/logback-spring.xml

+ 6 - 2
README.md

@@ -1,11 +1,15 @@
 # helio-boot
 
 ## 项目介绍
-`helio-boot`基于[JDK15](http://jdk.java.net/archive/) (当然 JDK8 或 JDK11 也可以,详见官方文档) + Spring Boot 2.4.x,是一款预置SaaS、RBAC能力的单体项目脚手架,适合初学者学习、老手接外包干私活、初创企业快速上马项目
+`helio-boot`基于 Spring Boot 2.5.x,是一款预置SaaS、RBAC能力的单体项目脚手架,适合初学者学习、老手接外包干私活、初创企业快速上马项目
+
+JDK compatibility: 1.8 - 17
 
 [官方文档](https://helio.uncarbon.cc/)
 
-~~需要先安装helio-starters~~ [helio-starters](https://github.com/uncarbon97/helio-starters) 已推送至Maven中央仓库,加载时会自动拉取
+需要先安装 `MySQL`、`Redis` 等必需中间件
+
+基础支撑构件 [helio-starters](https://github.com/uncarbon97/helio-starters) 已推送至Maven中央仓库,加载时会自动拉取
 
 ## 配套后台管理前端模板 && 代码生成器
 | 项目名 | 简介 | Gitee | GitHub

+ 439 - 451
attachments/schema/MySQL/helio_boot.sql

@@ -1,451 +1,439 @@
-SET NAMES utf8mb4;
-SET
-FOREIGN_KEY_CHECKS = 0;
-
--- ----------------------------
--- Table structure for sys_data_dict
--- ----------------------------
-DROP TABLE IF EXISTS `sys_data_dict`;
-CREATE TABLE `sys_data_dict`
-(
-    `id`              bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`       bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`        bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`        tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at`      datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at`      datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`          varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `camel_case_key`  varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '驼峰式键名',
-    `under_case_key`  varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '下划线式键名',
-    `pascal_case_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '帕斯卡式键名',
-    `value`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '键值',
-    `description`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '描述',
-    `unit`            varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '单位',
-    `value_range`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '取值范围',
-    `alias_key`       varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '别称键名',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据字典';
-
--- ----------------------------
--- Records of sys_data_dict
--- ----------------------------
-BEGIN;
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_dept
--- ----------------------------
-DROP TABLE IF EXISTS `sys_dept`;
-CREATE TABLE `sys_dept`
-(
-    `id`         bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at` datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at` datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `title`      varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
-    `parent_id`  bigint(20) NOT NULL DEFAULT 0 COMMENT '上级ID(根节点设置为0)',
-    `sort`       int(11) NOT NULL DEFAULT 1 COMMENT '排序',
-    `status`     int(11) NOT NULL DEFAULT 0 COMMENT '状态(0=禁用 1=启用)',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门';
-
--- ----------------------------
--- Records of sys_dept
--- ----------------------------
-BEGIN;
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_log
--- ----------------------------
-DROP TABLE IF EXISTS `sys_log`;
-CREATE TABLE `sys_log`
-(
-    `id`         bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at` datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at` datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `user_id`    bigint(20) NULL DEFAULT NULL COMMENT '用户ID',
-    `username`   varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户账号',
-    `operation`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作内容',
-    `method`     varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法',
-    `params`     text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求参数',
-    `ip`         varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'IP地址',
-    `status`     int(11) NOT NULL DEFAULT 0 COMMENT '状态(参考SysLogStatusEnum)',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台操作日志';
-
--- ----------------------------
--- Records of sys_log
--- ----------------------------
-BEGIN;
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_menu
--- ----------------------------
-DROP TABLE IF EXISTS `sys_menu`;
-CREATE TABLE `sys_menu`
-(
-    `id`            bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`     bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`      bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`      tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at`    datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at`    datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `title`         varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '名称',
-    `parent_id`     bigint(20) NOT NULL DEFAULT 0 COMMENT '上级菜单ID(根节点设置为0)',
-    `type`          int(11) NOT NULL DEFAULT 1 COMMENT '菜单类型(参考MenuTypeEnum)',
-    `permission`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '权限标识',
-    `icon`          varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标',
-    `sort`          int(11) NULL DEFAULT 1 COMMENT '排序',
-    `status`        int(11) NOT NULL DEFAULT 0 COMMENT '状态(0=禁用 1=启用)',
-    `component`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件',
-    `external_link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '外链地址',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台菜单';
-
--- ----------------------------
--- Records of sys_menu
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_menu`
-VALUES (1, 0, 1, 0, '2021-06-01 17:16:48', NULL, '2021-06-02 17:14:16', NULL, NULL, '系统管理', 0, 0, 'Sys',
-        'ant-design:setting-outlined', 3, 1, 'LAYOUT', ''),
-       (2, 0, 1, 0, '2021-06-01 17:13:13', NULL, '2021-07-18 00:10:33', 'admin', NULL, '中控台', 0, 0, 'Dashboard',
-        'ant-design:appstore-outlined', 1, 1, 'LAYOUT', ''),
-       (3, 0, 1, 0, '2021-06-01 17:14:22', NULL, '2021-06-02 11:24:38', NULL, NULL, '分析页(默认页必须分配, 否则进不去后台)', 2, 1,
-        'Dashboard:analysis', 'ant-design:fund-outlined', 1, 1, '/dashboard/analysis/index', ''),
-       (4, 0, 1, 0, '2021-06-01 17:14:47', NULL, '2021-06-02 11:32:23', NULL, NULL, '工作台', 2, 1, 'Dashboard:workbench',
-        'ant-design:database-outlined', 2, 1, '/dashboard/workbench/index', ''),
-       (5, 0, 1, 0, '2021-06-01 17:15:38', NULL, '2021-07-15 23:56:43', 'admin', NULL, '关于', 0, 1, 'About',
-        'ant-design:eye-outlined', 2, 1, '/sys/vben/about/index', ''),
-       (6, 0, 1, 0, '2021-06-02 16:06:58', NULL, '2021-07-17 23:55:52', 'admin', NULL, '学(mo)习(yu)', 2, 3, '',
-        'ant-design:zhihu-outlined', 3, 1, 'https://www.zhihu.com/', 'https://www.zhihu.com/'),
-       (7, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, NULL, '部门管理', 1, 1, 'SysDept',
-        'ant-design:flag-outlined', 1, 1, '/sys/SysDept/index', ''),
-       (8, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, NULL, '查询', 7, 2, 'SysDept:retrieve',
-        NULL, 1, 1, NULL, ''),
-       (9, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, NULL, '新增', 7, 2, 'SysDept:create', NULL,
-        2, 1, NULL, ''),
-       (10, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, NULL, '删除', 7, 2, 'SysDept:delete', NULL,
-        3, 1, NULL, ''),
-       (11, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '编辑', 7, 2, 'SysDept:update', NULL,
-        4, 1, NULL, ''),
-       (12, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '角色管理', 1, 1, 'SysRole',
-        'ant-design:usergroup-add-outlined', 2, 1, '/sys/SysRole/index', ''),
-       (13, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '查询', 12, 2, 'SysRole:retrieve',
-        NULL, 1, 1, NULL, ''),
-       (14, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '新增', 12, 2, 'SysRole:create',
-        NULL, 2, 1, NULL, ''),
-       (15, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '删除', 12, 2, 'SysRole:delete',
-        NULL, 3, 1, NULL, ''),
-       (16, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '编辑', 12, 2, 'SysRole:update',
-        NULL, 4, 1, NULL, ''),
-       (17, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '后台用户', 1, 1, 'SysUser',
-        'ant-design:user-outlined', 3, 1, '/sys/SysUser/index', ''),
-       (18, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '查询', 17, 2, 'SysUser:retrieve',
-        NULL, 1, 1, NULL, ''),
-       (19, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '新增', 17, 2, 'SysUser:create',
-        NULL, 2, 1, NULL, ''),
-       (20, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '删除', 17, 2, 'SysUser:delete',
-        NULL, 3, 1, NULL, ''),
-       (21, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '编辑', 17, 2, 'SysUser:update',
-        NULL, 4, 1, NULL, ''),
-       (22, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '菜单管理', 1, 1, 'SysMenu',
-        'ant-design:align-left-outlined', 4, 1, '/sys/SysMenu/index', ''),
-       (23, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '查询', 22, 2, 'SysMenu:retrieve',
-        NULL, 1, 1, NULL, ''),
-       (24, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '新增', 22, 2, 'SysMenu:create',
-        NULL, 2, 1, NULL, ''),
-       (25, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '删除', 22, 2, 'SysMenu:delete',
-        NULL, 3, 1, NULL, ''),
-       (26, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '编辑', 22, 2, 'SysMenu:update',
-        NULL, 4, 1, NULL, ''),
-       (27, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '参数管理', 1, 1, 'SysParam',
-        'ant-design:ant-design-outlined', 5, 1, '/sys/SysParam/index', ''),
-       (28, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '查询', 27, 2, 'SysParam:retrieve',
-        NULL, 1, 1, NULL, ''),
-       (29, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '新增', 27, 2, 'SysParam:create',
-        NULL, 2, 1, NULL, ''),
-       (30, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '删除', 27, 2, 'SysParam:delete',
-        NULL, 3, 1, NULL, ''),
-       (31, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '编辑', 27, 2, 'SysParam:update',
-        NULL, 4, 1, NULL, ''),
-       (32, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '租户管理', 1, 1, 'SysTenant',
-        'ant-design:aliyun-outlined', 6, 1, '/sys/SysTenant/index', ''),
-       (33, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '查询', 32, 2, 'SysTenant:retrieve',
-        NULL, 1, 1, NULL, ''),
-       (34, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '新增', 32, 2, 'SysTenant:create',
-        NULL, 2, 1, NULL, ''),
-       (35, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '删除', 32, 2, 'SysTenant:delete',
-        NULL, 3, 1, NULL, ''),
-       (36, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '编辑', 32, 2, 'SysTenant:update',
-        NULL, 4, 1, NULL, ''),
-       (37, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '数据字典', 1, 1, 'SysDataDict',
-        'ant-design:field-string-outlined', 7, 1, '/sys/SysDataDict/index', ''),
-       (38, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '查询', 37, 2,
-        'SysDataDict:retrieve', NULL, 1, 1, NULL, ''),
-       (39, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '新增', 37, 2, 'SysDataDict:create',
-        NULL, 2, 1, NULL, ''),
-       (40, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '删除', 37, 2, 'SysDataDict:delete',
-        NULL, 3, 1, NULL, ''),
-       (41, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '编辑', 37, 2, 'SysDataDict:update',
-        NULL, 4, 1, NULL, ''),
-       (42, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '系统日志', 1, 1, 'SysLog',
-        'ant-design:edit-twotone', 8, 1, '/sys/SysLog/index', ''),
-       (43, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '查询', 42, 2, 'SysLog:retrieve',
-        NULL, 1, 1, NULL, ''),
-       (44, 0, 1, 0, '2021-07-17 23:37:26', 'admin', '2021-07-17 23:38:28', 'admin', NULL, '修改当前用户密码', 1, 1, '',
-        'ant-design:compass-outlined', 9, 1, '/sys/SysUser/change-password/index', ''),
-       (45, 0, 1, 0, '2021-07-17 23:39:41', 'admin', '2021-07-17 23:39:41', 'admin', NULL, '重置某用户密码', 17, 2,
-        'SysUser:resetPassword', 'ant-design:redo-outlined', 5, 1, NULL, ''),
-       (46, 0, 1, 0, '2021-07-17 23:40:26', 'admin', '2021-07-17 23:40:26', 'admin', NULL, '绑定用户与角色关联关系', 17, 2,
-        'SysUser:bindRoles', 'ant-design:share-alt-outlined', 6, 1, NULL, ''),
-       (47, 0, 1, 0, '2021-07-17 23:40:47', 'admin', '2021-07-17 23:41:15', 'admin', NULL, '踢某用户下线', 17, 2,
-        'SysUser:kickOut', 'ant-design:disconnect-outlined', 7, 1, 'LAYOUT', '');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_param
--- ----------------------------
-DROP TABLE IF EXISTS `sys_param`;
-CREATE TABLE `sys_param`
-(
-    `id`          bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`   bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`    bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`    tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at`  datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at`  datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `name`         varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '键名',
-    `value`       varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '键值',
-    `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '描述',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统参数';
-
--- ----------------------------
--- Records of sys_param
--- ----------------------------
-BEGIN;
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_role
--- ----------------------------
-DROP TABLE IF EXISTS `sys_role`;
-CREATE TABLE `sys_role`
-(
-    `id`         bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at` datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at` datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `title`      varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '名称',
-    `value`      varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '值',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台角色';
-
--- ----------------------------
--- Records of sys_role
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_role`
-VALUES (1, 0, 1, 0, '2021-04-17 02:34:30', NULL, '2021-06-07 16:22:28', 'admin', NULL, '超级管理员(代码中固定拥有所有菜单的权限)',
-        'SuperAdmin');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_role_menu_relation
--- ----------------------------
-DROP TABLE IF EXISTS `sys_role_menu_relation`;
-CREATE TABLE `sys_role_menu_relation`
-(
-    `id`         bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at` datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at` datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `role_id`    bigint(20) NOT NULL COMMENT '角色ID',
-    `menu_id`    bigint(20) NOT NULL COMMENT '菜单ID',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台角色-可见菜单关联';
-
--- ----------------------------
--- Records of sys_role_menu_relation
--- ----------------------------
-BEGIN;
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_tenant
--- ----------------------------
-DROP TABLE IF EXISTS `sys_tenant`;
-CREATE TABLE `sys_tenant`
-(
-    `id`                   bigint(20) NOT NULL COMMENT '主键ID',
-    `revision`             bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`             tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at`           datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at`           datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`               varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `tenant_name`          varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户名',
-    `tenant_id`            bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `status`               int(11) NOT NULL DEFAULT 0 COMMENT '状态(0=禁用 1=启用)',
-    `tenant_admin_user_id` bigint(20) NULL DEFAULT NULL COMMENT '租户管理员用户ID',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统租户';
-
--- ----------------------------
--- Records of sys_tenant
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_tenant`
-VALUES (1, 1, 0, '2021-05-11 16:06:47', '', '2021-06-10 16:29:32', 'admin', '可无视SQL拦截器', '超级租户', 0, 1, 1);
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_user
--- ----------------------------
-DROP TABLE IF EXISTS `sys_user`;
-CREATE TABLE `sys_user`
-(
-    `id`            bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`     bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`      bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`      tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at`    datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at`    datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `pin`           varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '账号',
-    `pwd`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
-    `salt`          varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '盐',
-    `nickname`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL DEFAULT '' COMMENT '昵称',
-    `status`        int(11) NOT NULL DEFAULT 0 COMMENT '状态(0=禁用 1=启用)',
-    `gender`        int(11) NULL DEFAULT 0 COMMENT '性别',
-    `email`         varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '邮箱',
-    `phone_no`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号',
-    `last_login_at` datetime(0) NULL DEFAULT NULL COMMENT '最后登录时刻',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台用户';
-
--- ----------------------------
--- Records of sys_user
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_user`
-VALUES (1, 0, 1, 0, '2021-04-06 09:56:02', NULL, '2021-06-28 16:37:07', 'admin', '', 'admin',
-        'b7f6692251833658a56ff2d09e9835b91384d203721bf27a544586d3c9a379ff', '6a8e9339-dfd1-4cfe-80cb-30ca9fc3d81e',
-        '超级管理员', 1, 0, 'admin@example.com', '17874585544', '2021-07-18 00:32:08');
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_user_dept_relation
--- ----------------------------
-DROP TABLE IF EXISTS `sys_user_dept_relation`;
-CREATE TABLE `sys_user_dept_relation`
-(
-    `id`         bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at` datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at` datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `user_id`    bigint(20) NOT NULL COMMENT '用户ID',
-    `dept_id`    bigint(20) NOT NULL COMMENT '部门ID',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台用户-部门关联';
-
--- ----------------------------
--- Records of sys_user_dept_relation
--- ----------------------------
-BEGIN;
-COMMIT;
-
--- ----------------------------
--- Table structure for sys_user_role_relation
--- ----------------------------
-DROP TABLE IF EXISTS `sys_user_role_relation`;
-CREATE TABLE `sys_user_role_relation`
-(
-    `id`         bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at` datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at` datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    `user_id`    bigint(20) NOT NULL COMMENT '用户ID',
-    `role_id`    bigint(20) NOT NULL COMMENT '角色ID',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台用户-角色关联';
-
--- ----------------------------
--- Records of sys_user_role_relation
--- ----------------------------
-BEGIN;
-INSERT INTO `sys_user_role_relation`
-VALUES (1, 0, 1, 0, '2021-01-01 18:22:12', NULL, '2021-01-01 18:22:12', NULL, NULL, 1, 1);
-COMMIT;
-
--- ----------------------------
--- Table structure for 数据表模板
--- ----------------------------
-DROP TABLE IF EXISTS `数据表模板`;
-CREATE TABLE `数据表模板`
-(
-    `id`         bigint(20) NOT NULL COMMENT '主键ID',
-    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
-    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
-    `created_at` datetime(0) NOT NULL COMMENT '创建时刻',
-    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
-    `updated_at` datetime(0) NOT NULL COMMENT '更新时刻',
-    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
-    `remark`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
-    PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据表注释';
-
--- ----------------------------
--- Records of 数据表模板
--- ----------------------------
-BEGIN;
-COMMIT;
-
-SET
-FOREIGN_KEY_CHECKS = 1;
+SET NAMES utf8mb4;
+SET
+FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for 数据表模板
+-- ----------------------------
+DROP TABLE IF EXISTS `数据表模板`;
+CREATE TABLE `数据表模板`
+(
+    `id`         bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at` datetime NOT NULL COMMENT '创建时刻',
+    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at` datetime NOT NULL COMMENT '更新时刻',
+    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据表注释';
+
+-- ----------------------------
+-- Records of 数据表模板
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_data_dict
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_data_dict`;
+CREATE TABLE `sys_data_dict`
+(
+    `id`              bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`       bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`        bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`        tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at`      datetime                                                      NOT NULL COMMENT '创建时刻',
+    `created_by`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at`      datetime                                                      NOT NULL COMMENT '更新时刻',
+    `updated_by`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `camel_case_key`  varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '驼峰式键名',
+    `under_case_key`  varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '下划线式键名',
+    `pascal_case_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '帕斯卡式键名',
+    `value`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '键值',
+    `description`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '描述',
+    `unit`            varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '单位',
+    `value_range`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '取值范围',
+    `alias_key`       varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '别称键名',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据字典';
+
+-- ----------------------------
+-- Records of sys_data_dict
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dept`;
+CREATE TABLE `sys_dept`
+(
+    `id`         bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at` datetime                                                     NOT NULL COMMENT '创建时刻',
+    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at` datetime                                                     NOT NULL COMMENT '更新时刻',
+    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `title`      varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
+    `parent_id`  bigint(20) NOT NULL DEFAULT 0 COMMENT '上级ID(根节点设置为0)',
+    `sort`       int(11) NOT NULL DEFAULT 1 COMMENT '排序',
+    `status`     int(11) NOT NULL DEFAULT 0 COMMENT '状态(0=禁用 1=启用)',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门';
+
+-- ----------------------------
+-- Records of sys_dept
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_log
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_log`;
+CREATE TABLE `sys_log`
+(
+    `id`         bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at` datetime NOT NULL COMMENT '创建时刻',
+    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at` datetime NOT NULL COMMENT '更新时刻',
+    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `user_id`    bigint(20) NULL DEFAULT NULL COMMENT '用户ID',
+    `username`   varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户账号',
+    `operation`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作内容',
+    `method`     varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法',
+    `params`     text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求参数',
+    `ip`         varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'IP地址',
+    `status`     int(11) NOT NULL DEFAULT 0 COMMENT '状态(参考SysLogStatusEnum)',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台操作日志';
+
+-- ----------------------------
+-- Records of sys_log
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_menu`;
+CREATE TABLE `sys_menu`
+(
+    `id`            bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`     bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`      bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`      tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at`    datetime                                                      NOT NULL COMMENT '创建时刻',
+    `created_by`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at`    datetime                                                      NOT NULL COMMENT '更新时刻',
+    `updated_by`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `title`         varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '名称',
+    `parent_id`     bigint(20) NOT NULL DEFAULT 0 COMMENT '上级菜单ID(根节点设置为0)',
+    `type`          int(11) NOT NULL DEFAULT 1 COMMENT '菜单类型(参考MenuTypeEnum)',
+    `permission`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '权限标识',
+    `icon`          varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标',
+    `sort`          int(11) NULL DEFAULT 1 COMMENT '排序',
+    `status`        int(11) NOT NULL DEFAULT 0 COMMENT '状态(0=禁用 1=启用)',
+    `component`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件',
+    `external_link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '外链地址',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台菜单';
+
+-- ----------------------------
+-- Records of sys_menu
+-- ----------------------------
+BEGIN;
+INSERT INTO `sys_menu`
+VALUES (1, 0, 1, 0, '2021-06-01 17:16:48', NULL, '2021-06-02 17:14:16', NULL, '系统管理', 0, 0, 'Sys',
+        'ant-design:setting-outlined', 3, 1, 'LAYOUT', ''),
+       (2, 0, 1, 0, '2021-06-01 17:13:13', NULL, '2021-07-18 00:10:33', 'admin', '中控台', 0, 0, 'Dashboard',
+        'ant-design:appstore-outlined', 1, 1, 'LAYOUT', ''),
+       (3, 0, 1, 0, '2021-06-01 17:14:22', NULL, '2021-06-02 11:24:38', NULL, '分析页(默认页必须分配, 否则进不去后台)', 2, 1,
+        'Dashboard:analysis', 'ant-design:fund-outlined', 1, 1, '/dashboard/analysis/index', ''),
+       (4, 0, 1, 0, '2021-06-01 17:14:47', NULL, '2021-06-02 11:32:23', NULL, '工作台', 2, 1, 'Dashboard:workbench',
+        'ant-design:database-outlined', 2, 1, '/dashboard/workbench/index', ''),
+       (5, 0, 1, 0, '2021-06-01 17:15:38', NULL, '2021-07-15 23:56:43', 'admin', '关于', 0, 1, 'About',
+        'ant-design:eye-outlined', 2, 1, '/sys/vben/about/index', ''),
+       (6, 0, 1, 0, '2021-06-02 16:06:58', NULL, '2021-07-17 23:55:52', 'admin', '学(mo)习(yu)', 2, 3, '',
+        'ant-design:zhihu-outlined', 3, 1, 'https://www.zhihu.com/', 'https://www.zhihu.com/'),
+       (7, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, '部门管理', 1, 1, 'SysDept',
+        'ant-design:flag-outlined', 1, 1, '/sys/SysDept/index', ''),
+       (8, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, '查询', 7, 2, 'SysDept:retrieve', NULL, 1,
+        1, NULL, ''),
+       (9, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, '新增', 7, 2, 'SysDept:create', NULL, 2, 1,
+        NULL, ''),
+       (10, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, '删除', 7, 2, 'SysDept:delete', NULL, 3, 1,
+        NULL, ''),
+       (11, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '编辑', 7, 2, 'SysDept:update', NULL, 4, 1,
+        NULL, ''),
+       (12, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '角色管理', 1, 1, 'SysRole',
+        'ant-design:usergroup-add-outlined', 2, 1, '/sys/SysRole/index', ''),
+       (13, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '查询', 12, 2, 'SysRole:retrieve', NULL, 1,
+        1, NULL, ''),
+       (14, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '新增', 12, 2, 'SysRole:create', NULL, 2,
+        1, NULL, ''),
+       (15, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '删除', 12, 2, 'SysRole:delete', NULL, 3,
+        1, NULL, ''),
+       (16, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '编辑', 12, 2, 'SysRole:update', NULL, 4,
+        1, NULL, ''),
+       (17, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '后台用户', 1, 1, 'SysUser',
+        'ant-design:user-outlined', 3, 1, '/sys/SysUser/index', ''),
+       (18, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '查询', 17, 2, 'SysUser:retrieve', NULL, 1,
+        1, NULL, ''),
+       (19, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '新增', 17, 2, 'SysUser:create', NULL, 2,
+        1, NULL, ''),
+       (20, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '删除', 17, 2, 'SysUser:delete', NULL, 3,
+        1, NULL, ''),
+       (21, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '编辑', 17, 2, 'SysUser:update', NULL, 4,
+        1, NULL, ''),
+       (22, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '菜单管理', 1, 1, 'SysMenu',
+        'ant-design:align-left-outlined', 4, 1, '/sys/SysMenu/index', ''),
+       (23, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '查询', 22, 2, 'SysMenu:retrieve', NULL, 1,
+        1, NULL, ''),
+       (24, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '新增', 22, 2, 'SysMenu:create', NULL, 2,
+        1, NULL, ''),
+       (25, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '删除', 22, 2, 'SysMenu:delete', NULL, 3,
+        1, NULL, ''),
+       (26, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '编辑', 22, 2, 'SysMenu:update', NULL, 4,
+        1, NULL, ''),
+       (27, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '参数管理', 1, 1, 'SysParam',
+        'ant-design:ant-design-outlined', 5, 1, '/sys/SysParam/index', ''),
+       (28, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '查询', 27, 2, 'SysParam:retrieve', NULL,
+        1, 1, NULL, ''),
+       (29, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '新增', 27, 2, 'SysParam:create', NULL, 2,
+        1, NULL, ''),
+       (30, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '删除', 27, 2, 'SysParam:delete', NULL, 3,
+        1, NULL, ''),
+       (31, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '编辑', 27, 2, 'SysParam:update', NULL, 4,
+        1, NULL, ''),
+       (32, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '租户管理', 1, 1, 'SysTenant',
+        'ant-design:aliyun-outlined', 6, 1, '/sys/SysTenant/index', ''),
+       (33, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '查询', 32, 2, 'SysTenant:retrieve', NULL,
+        1, 1, NULL, ''),
+       (34, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '新增', 32, 2, 'SysTenant:create', NULL, 2,
+        1, NULL, ''),
+       (35, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '删除', 32, 2, 'SysTenant:delete', NULL, 3,
+        1, NULL, ''),
+       (36, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '编辑', 32, 2, 'SysTenant:update', NULL, 4,
+        1, NULL, ''),
+       (37, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '数据字典', 1, 1, 'SysDataDict',
+        'ant-design:field-string-outlined', 7, 1, '/sys/SysDataDict/index', ''),
+       (38, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '查询', 37, 2, 'SysDataDict:retrieve',
+        NULL, 1, 1, NULL, ''),
+       (39, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '新增', 37, 2, 'SysDataDict:create', NULL,
+        2, 1, NULL, ''),
+       (40, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '删除', 37, 2, 'SysDataDict:delete', NULL,
+        3, 1, NULL, ''),
+       (41, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '编辑', 37, 2, 'SysDataDict:update', NULL,
+        4, 1, NULL, ''),
+       (42, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '系统日志', 1, 1, 'SysLog',
+        'ant-design:edit-twotone', 8, 1, '/sys/SysLog/index', ''),
+       (43, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '查询', 42, 2, 'SysLog:retrieve', NULL, 1,
+        1, NULL, ''),
+       (44, 0, 1, 0, '2021-07-17 23:37:26', 'admin', '2021-07-17 23:38:28', 'admin', '修改当前用户密码', 1, 1, '',
+        'ant-design:compass-outlined', 9, 1, '/sys/SysUser/change-password/index', ''),
+       (45, 0, 1, 0, '2021-07-17 23:39:41', 'admin', '2021-07-17 23:39:41', 'admin', '重置某用户密码', 17, 2,
+        'SysUser:resetPassword', 'ant-design:redo-outlined', 5, 1, NULL, ''),
+       (46, 0, 1, 0, '2021-07-17 23:40:26', 'admin', '2021-07-17 23:40:26', 'admin', '绑定用户与角色关联关系', 17, 2,
+        'SysUser:bindRoles', 'ant-design:share-alt-outlined', 6, 1, NULL, ''),
+       (47, 0, 1, 0, '2021-07-17 23:40:47', 'admin', '2021-07-17 23:41:15', 'admin', '踢某用户下线', 17, 2, 'SysUser:kickOut',
+        'ant-design:disconnect-outlined', 7, 1, 'LAYOUT', '');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_param
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_param`;
+CREATE TABLE `sys_param`
+(
+    `id`          bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`   bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`    bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`    tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at`  datetime                                                      NOT NULL COMMENT '创建时刻',
+    `created_by`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at`  datetime                                                      NOT NULL COMMENT '更新时刻',
+    `updated_by`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `name`        varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '键名',
+    `value`       varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '键值',
+    `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '描述',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统参数';
+
+-- ----------------------------
+-- Records of sys_param
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role`;
+CREATE TABLE `sys_role`
+(
+    `id`         bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at` datetime                                                      NOT NULL COMMENT '创建时刻',
+    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at` datetime                                                      NOT NULL COMMENT '更新时刻',
+    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `title`      varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '名称',
+    `value`      varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '值',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台角色';
+
+-- ----------------------------
+-- Records of sys_role
+-- ----------------------------
+BEGIN;
+INSERT INTO `sys_role`
+VALUES (1, 0, 1, 0, '2021-04-17 02:34:30', NULL, '2021-06-07 16:22:28', 'admin', '超级管理员(代码中固定拥有所有菜单的权限)', 'SuperAdmin');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_role_menu_relation
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_menu_relation`;
+CREATE TABLE `sys_role_menu_relation`
+(
+    `id`         bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at` datetime NOT NULL COMMENT '创建时刻',
+    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at` datetime NOT NULL COMMENT '更新时刻',
+    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `role_id`    bigint(20) NOT NULL COMMENT '角色ID',
+    `menu_id`    bigint(20) NOT NULL COMMENT '菜单ID',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台角色-可见菜单关联';
+
+-- ----------------------------
+-- Records of sys_role_menu_relation
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_tenant
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_tenant`;
+CREATE TABLE `sys_tenant`
+(
+    `id`                   bigint(20) NOT NULL COMMENT '主键ID',
+    `revision`             bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`             tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at`           datetime                                                     NOT NULL COMMENT '创建时刻',
+    `created_by`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at`           datetime                                                     NOT NULL COMMENT '更新时刻',
+    `updated_by`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `remark`               varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+    `tenant_name`          varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户名',
+    `tenant_id`            bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `status`               int(11) NOT NULL DEFAULT 0 COMMENT '状态(0=禁用 1=启用)',
+    `tenant_admin_user_id` bigint(20) NULL DEFAULT NULL COMMENT '租户管理员用户ID',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统租户';
+
+-- ----------------------------
+-- Records of sys_tenant
+-- ----------------------------
+BEGIN;
+INSERT INTO `sys_tenant`
+VALUES (1, 1, 0, '2021-05-11 16:06:47', '', '2021-06-10 16:29:32', 'admin', '可无视SQL拦截器', '超级租户', 0, 1, 1);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_user
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user`
+(
+    `id`            bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`     bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`      bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`      tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at`    datetime                                                      NOT NULL COMMENT '创建时刻',
+    `created_by`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at`    datetime                                                      NOT NULL COMMENT '更新时刻',
+    `updated_by`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `pin`           varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '账号',
+    `pwd`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
+    `salt`          varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '盐',
+    `nickname`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL DEFAULT '' COMMENT '昵称',
+    `status`        int(11) NOT NULL DEFAULT 0 COMMENT '状态(0=禁用 1=启用)',
+    `gender`        int(11) NULL DEFAULT 0 COMMENT '性别',
+    `email`         varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '邮箱',
+    `phone_no`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号',
+    `last_login_at` datetime NULL DEFAULT NULL COMMENT '最后登录时刻',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台用户';
+
+-- ----------------------------
+-- Records of sys_user
+-- ----------------------------
+BEGIN;
+INSERT INTO `sys_user`
+VALUES (1, 0, 1, 0, '2021-04-06 09:56:02', NULL, '2021-06-28 16:37:07', 'admin', 'admin',
+        'b7f6692251833658a56ff2d09e9835b91384d203721bf27a544586d3c9a379ff', '6a8e9339-dfd1-4cfe-80cb-30ca9fc3d81e',
+        '超级管理员', 1, 0, 'admin@example.com', '17874585544', '2021-07-18 00:32:08');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_user_dept_relation
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_dept_relation`;
+CREATE TABLE `sys_user_dept_relation`
+(
+    `id`         bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at` datetime NOT NULL COMMENT '创建时刻',
+    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at` datetime NOT NULL COMMENT '更新时刻',
+    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `user_id`    bigint(20) NOT NULL COMMENT '用户ID',
+    `dept_id`    bigint(20) NOT NULL COMMENT '部门ID',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台用户-部门关联';
+
+-- ----------------------------
+-- Records of sys_user_dept_relation
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_user_role_relation
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_role_relation`;
+CREATE TABLE `sys_user_role_relation`
+(
+    `id`         bigint(20) NOT NULL COMMENT '主键ID',
+    `tenant_id`  bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
+    `revision`   bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
+    `del_flag`   tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
+    `created_at` datetime NOT NULL COMMENT '创建时刻',
+    `created_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
+    `updated_at` datetime NOT NULL COMMENT '更新时刻',
+    `updated_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
+    `user_id`    bigint(20) NOT NULL COMMENT '用户ID',
+    `role_id`    bigint(20) NOT NULL COMMENT '角色ID',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台用户-角色关联';
+
+-- ----------------------------
+-- Records of sys_user_role_relation
+-- ----------------------------
+BEGIN;
+INSERT INTO `sys_user_role_relation`
+VALUES (1, 0, 1, 0, '2021-01-01 18:22:12', NULL, '2021-01-01 18:22:12', NULL, 1, 1);
+COMMIT;
+
+SET
+FOREIGN_KEY_CHECKS = 1;

+ 870 - 880
attachments/schema/PostgreSQL/helio_boot.sql

@@ -1,880 +1,870 @@
--- ----------------------------
--- Table structure for sys_data_dict
--- ----------------------------
-DROP TABLE IF EXISTS "sys_data_dict";
-CREATE TABLE "sys_data_dict"
-(
-    "id"              int8         NOT NULL,
-    "tenant_id"       int8,
-    "revision"        int8         NOT NULL DEFAULT 1,
-    "del_flag"        int2         NOT NULL DEFAULT 0,
-    "created_at"      timestamp(6) NOT NULL,
-    "created_by"      varchar(255),
-    "updated_at"      timestamp(6) NOT NULL,
-    "updated_by"      varchar(255),
-    "remark"          varchar(255),
-    "camel_case_key"  varchar(100) NOT NULL,
-    "under_case_key"  varchar(100) NOT NULL,
-    "pascal_case_key" varchar(100) NOT NULL,
-    "value"           varchar(255) NOT NULL,
-    "description"     varchar(255) NOT NULL,
-    "unit"            varchar(30),
-    "value_range"     varchar(255),
-    "alias_key"       varchar(100)
-)
-;
-COMMENT
-ON COLUMN "sys_data_dict"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_data_dict"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_data_dict"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_data_dict"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_data_dict"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_data_dict"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_data_dict"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_data_dict"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_data_dict"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_data_dict"."camel_case_key" IS '驼峰式键名';
-COMMENT
-ON COLUMN "sys_data_dict"."under_case_key" IS '下划线式键名';
-COMMENT
-ON COLUMN "sys_data_dict"."pascal_case_key" IS '帕斯卡式键名';
-COMMENT
-ON COLUMN "sys_data_dict"."value" IS '键值';
-COMMENT
-ON COLUMN "sys_data_dict"."description" IS '描述';
-COMMENT
-ON COLUMN "sys_data_dict"."unit" IS '单位';
-COMMENT
-ON COLUMN "sys_data_dict"."value_range" IS '取值范围';
-COMMENT
-ON COLUMN "sys_data_dict"."alias_key" IS '别称键名';
-COMMENT
-ON TABLE "sys_data_dict" IS '数据字典';
-
--- ----------------------------
--- Records of sys_data_dict
--- ----------------------------
-
--- ----------------------------
--- Table structure for sys_dept
--- ----------------------------
-DROP TABLE IF EXISTS "sys_dept";
-CREATE TABLE "sys_dept"
-(
-    "id"         int8         NOT NULL,
-    "tenant_id"  int8,
-    "revision"   int8         NOT NULL DEFAULT 1,
-    "del_flag"   int2         NOT NULL DEFAULT 0,
-    "created_at" timestamp(6) NOT NULL,
-    "created_by" varchar(255),
-    "updated_at" timestamp(6) NOT NULL,
-    "updated_by" varchar(255),
-    "remark"     varchar(255),
-    "title"      varchar(50)  NOT NULL,
-    "parent_id"  int8         NOT NULL,
-    "sort"       int4         NOT NULL,
-    "status"     int4         NOT NULL
-)
-;
-COMMENT
-ON COLUMN "sys_dept"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_dept"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_dept"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_dept"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_dept"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_dept"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_dept"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_dept"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_dept"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_dept"."title" IS '名称';
-COMMENT
-ON COLUMN "sys_dept"."parent_id" IS '上级ID(根节点设置为0)';
-COMMENT
-ON COLUMN "sys_dept"."sort" IS '排序';
-COMMENT
-ON COLUMN "sys_dept"."status" IS '状态(0=禁用 1=启用)';
-COMMENT
-ON TABLE "sys_dept" IS '部门';
-
--- ----------------------------
--- Records of sys_dept
--- ----------------------------
-
--- ----------------------------
--- Table structure for sys_log
--- ----------------------------
-DROP TABLE IF EXISTS "sys_log";
-CREATE TABLE "sys_log"
-(
-    "id"         int8         NOT NULL,
-    "tenant_id"  int8,
-    "revision"   int8         NOT NULL DEFAULT 1,
-    "del_flag"   int2         NOT NULL DEFAULT 0,
-    "created_at" timestamp(6) NOT NULL,
-    "created_by" varchar(255),
-    "updated_at" timestamp(6) NOT NULL,
-    "updated_by" varchar(255),
-    "remark"     varchar(255),
-    "user_id"    int8,
-    "username"   varchar(50),
-    "operation"  varchar(255),
-    "method"     varchar(500),
-    "params"     text,
-    "ip"         varchar(128),
-    "status"     int4         NOT NULL
-)
-;
-COMMENT
-ON COLUMN "sys_log"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_log"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_log"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_log"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_log"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_log"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_log"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_log"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_log"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_log"."user_id" IS '用户ID';
-COMMENT
-ON COLUMN "sys_log"."username" IS '用户账号';
-COMMENT
-ON COLUMN "sys_log"."operation" IS '操作内容';
-COMMENT
-ON COLUMN "sys_log"."method" IS '请求方法';
-COMMENT
-ON COLUMN "sys_log"."params" IS '请求参数';
-COMMENT
-ON COLUMN "sys_log"."ip" IS 'IP地址';
-COMMENT
-ON COLUMN "sys_log"."status" IS '状态(参考SysLogStatusEnum)';
-COMMENT
-ON TABLE "sys_log" IS '后台操作日志';
-
--- ----------------------------
--- Records of sys_log
--- ----------------------------
-
--- ----------------------------
--- Table structure for sys_menu
--- ----------------------------
-DROP TABLE IF EXISTS "sys_menu";
-CREATE TABLE "sys_menu"
-(
-    "id"            int8         NOT NULL,
-    "tenant_id"     int8,
-    "revision"      int8         NOT NULL DEFAULT 1,
-    "del_flag"      int2         NOT NULL DEFAULT 0,
-    "created_at"    timestamp(6) NOT NULL,
-    "created_by"    varchar(255),
-    "updated_at"    timestamp(6) NOT NULL,
-    "updated_by"    varchar(255),
-    "remark"        varchar(255),
-    "title"         varchar(50)  NOT NULL,
-    "parent_id"     int8         NOT NULL,
-    "type"          int4         NOT NULL,
-    "permission"    varchar(255) NOT NULL,
-    "icon"          varchar(255),
-    "sort"          int4,
-    "status"        int4         NOT NULL,
-    "component"     varchar(255),
-    "external_link" varchar(255)
-)
-;
-COMMENT
-ON COLUMN "sys_menu"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_menu"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_menu"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_menu"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_menu"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_menu"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_menu"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_menu"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_menu"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_menu"."title" IS '名称';
-COMMENT
-ON COLUMN "sys_menu"."parent_id" IS '上级菜单ID(根节点设置为0)';
-COMMENT
-ON COLUMN "sys_menu"."type" IS '菜单类型(参考MenuTypeEnum)';
-COMMENT
-ON COLUMN "sys_menu"."permission" IS '权限标识';
-COMMENT
-ON COLUMN "sys_menu"."icon" IS '图标';
-COMMENT
-ON COLUMN "sys_menu"."sort" IS '排序';
-COMMENT
-ON COLUMN "sys_menu"."status" IS '状态(0=禁用 1=启用)';
-COMMENT
-ON COLUMN "sys_menu"."component" IS '组件';
-COMMENT
-ON COLUMN "sys_menu"."external_link" IS '外链地址';
-COMMENT
-ON TABLE "sys_menu" IS '后台菜单';
-
--- ----------------------------
--- Records of sys_menu
--- ----------------------------
-INSERT INTO "sys_menu"
-VALUES (1, 0, 1, 0, '2021-06-01 17:16:48', NULL, '2021-06-02 17:14:16', NULL, NULL, '系统管理', 0, 0, 'Sys',
-        'ant-design:setting-outlined', 3, 1, 'LAYOUT', '');
-INSERT INTO "sys_menu"
-VALUES (2, 0, 1, 0, '2021-06-01 17:13:13', NULL, '2021-07-18 00:10:33', 'admin', NULL, '中控台', 0, 0, 'Dashboard',
-        'ant-design:appstore-outlined', 1, 1, 'LAYOUT', '');
-INSERT INTO "sys_menu"
-VALUES (3, 0, 1, 0, '2021-06-01 17:14:22', NULL, '2021-06-02 11:24:38', NULL, NULL, '分析页(默认页必须分配, 否则进不去后台)', 2, 1,
-        'Dashboard:analysis', 'ant-design:fund-outlined', 1, 1, '/dashboard/analysis/index', '');
-INSERT INTO "sys_menu"
-VALUES (4, 0, 1, 0, '2021-06-01 17:14:47', NULL, '2021-06-02 11:32:23', NULL, NULL, '工作台', 2, 1, 'Dashboard:workbench',
-        'ant-design:database-outlined', 2, 1, '/dashboard/workbench/index', '');
-INSERT INTO "sys_menu"
-VALUES (5, 0, 1, 0, '2021-06-01 17:15:38', NULL, '2021-07-15 23:56:43', 'admin', NULL, '关于', 0, 1, 'About',
-        'ant-design:eye-outlined', 2, 1, '/sys/vben/about/index', '');
-INSERT INTO "sys_menu"
-VALUES (6, 0, 1, 0, '2021-06-02 16:06:58', NULL, '2021-07-17 23:55:52', 'admin', NULL, '学(mo)习(yu)', 2, 3, '',
-        'ant-design:zhihu-outlined', 3, 1, 'https://www.zhihu.com/', 'https://www.zhihu.com/');
-INSERT INTO "sys_menu"
-VALUES (7, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, NULL, '部门管理', 1, 1, 'SysDept',
-        'ant-design:flag-outlined', 1, 1, '/sys/SysDept/index', '');
-INSERT INTO "sys_menu"
-VALUES (8, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, NULL, '查询', 7, 2, 'SysDept:retrieve',
-        NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (9, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, NULL, '新增', 7, 2, 'SysDept:create', NULL,
-        2, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (10, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, NULL, '删除', 7, 2, 'SysDept:delete', NULL,
-        3, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (11, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '编辑', 7, 2, 'SysDept:update', NULL,
-        4, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (12, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '角色管理', 1, 1, 'SysRole',
-        'ant-design:usergroup-add-outlined', 2, 1, '/sys/SysRole/index', '');
-INSERT INTO "sys_menu"
-VALUES (13, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '查询', 12, 2, 'SysRole:retrieve',
-        NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (14, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '新增', 12, 2, 'SysRole:create',
-        NULL, 2, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (15, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '删除', 12, 2, 'SysRole:delete',
-        NULL, 3, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (16, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, NULL, '编辑', 12, 2, 'SysRole:update',
-        NULL, 4, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (17, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '后台用户', 1, 1, 'SysUser',
-        'ant-design:user-outlined', 3, 1, '/sys/SysUser/index', '');
-INSERT INTO "sys_menu"
-VALUES (18, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '查询', 17, 2, 'SysUser:retrieve',
-        NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (19, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '新增', 17, 2, 'SysUser:create',
-        NULL, 2, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (20, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '删除', 17, 2, 'SysUser:delete',
-        NULL, 3, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (21, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, NULL, '编辑', 17, 2, 'SysUser:update',
-        NULL, 4, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (22, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '菜单管理', 1, 1, 'SysMenu',
-        'ant-design:align-left-outlined', 4, 1, '/sys/SysMenu/index', '');
-INSERT INTO "sys_menu"
-VALUES (23, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '查询', 22, 2, 'SysMenu:retrieve',
-        NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (24, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '新增', 22, 2, 'SysMenu:create',
-        NULL, 2, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (25, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '删除', 22, 2, 'SysMenu:delete',
-        NULL, 3, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (26, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '编辑', 22, 2, 'SysMenu:update',
-        NULL, 4, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (27, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, NULL, '参数管理', 1, 1, 'SysParam',
-        'ant-design:ant-design-outlined', 5, 1, '/sys/SysParam/index', '');
-INSERT INTO "sys_menu"
-VALUES (28, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '查询', 27, 2, 'SysParam:retrieve',
-        NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (29, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '新增', 27, 2, 'SysParam:create',
-        NULL, 2, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (30, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '删除', 27, 2, 'SysParam:delete',
-        NULL, 3, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (31, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '编辑', 27, 2, 'SysParam:update',
-        NULL, 4, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (32, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '租户管理', 1, 1, 'SysTenant',
-        'ant-design:aliyun-outlined', 6, 1, '/sys/SysTenant/index', '');
-INSERT INTO "sys_menu"
-VALUES (33, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, NULL, '查询', 32, 2, 'SysTenant:retrieve',
-        NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (34, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '新增', 32, 2, 'SysTenant:create',
-        NULL, 2, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (35, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '删除', 32, 2, 'SysTenant:delete',
-        NULL, 3, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (36, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '编辑', 32, 2, 'SysTenant:update',
-        NULL, 4, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (37, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '数据字典', 1, 1, 'SysDataDict',
-        'ant-design:field-string-outlined', 7, 1, '/sys/SysDataDict/index', '');
-INSERT INTO "sys_menu"
-VALUES (38, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, NULL, '查询', 37, 2,
-        'SysDataDict:retrieve', NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (39, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '新增', 37, 2, 'SysDataDict:create',
-        NULL, 2, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (40, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '删除', 37, 2, 'SysDataDict:delete',
-        NULL, 3, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (41, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '编辑', 37, 2, 'SysDataDict:update',
-        NULL, 4, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (42, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '系统日志', 1, 1, 'SysLog',
-        'ant-design:edit-twotone', 8, 1, '/sys/SysLog/index', '');
-INSERT INTO "sys_menu"
-VALUES (43, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, NULL, '查询', 42, 2, 'SysLog:retrieve',
-        NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (44, 0, 1, 0, '2021-07-17 23:37:26', 'admin', '2021-07-17 23:38:28', 'admin', NULL, '修改当前用户密码', 1, 1, '',
-        'ant-design:compass-outlined', 9, 1, '/sys/SysUser/change-password/index', '');
-INSERT INTO "sys_menu"
-VALUES (45, 0, 1, 0, '2021-07-17 23:39:41', 'admin', '2021-07-17 23:39:41', 'admin', NULL, '重置某用户密码', 17, 2,
-        'SysUser:resetPassword', 'ant-design:redo-outlined', 5, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (46, 0, 1, 0, '2021-07-17 23:40:26', 'admin', '2021-07-17 23:40:26', 'admin', NULL, '绑定用户与角色关联关系', 17, 2,
-        'SysUser:bindRoles', 'ant-design:share-alt-outlined', 6, 1, NULL, '');
-INSERT INTO "sys_menu"
-VALUES (47, 0, 1, 0, '2021-07-17 23:40:47', 'admin', '2021-07-17 23:41:15', 'admin', NULL, '踢某用户下线', 17, 2,
-        'SysUser:kickOut', 'ant-design:disconnect-outlined', 7, 1, 'LAYOUT', '');
-
--- ----------------------------
--- Table structure for sys_param
--- ----------------------------
-DROP TABLE IF EXISTS "sys_param";
-CREATE TABLE "sys_param"
-(
-    "id"          int8         NOT NULL,
-    "tenant_id"   int8,
-    "revision"    int8         NOT NULL DEFAULT 1,
-    "del_flag"    int2         NOT NULL DEFAULT 0,
-    "created_at"  timestamp(6) NOT NULL,
-    "created_by"  varchar(255),
-    "updated_at"  timestamp(6) NOT NULL,
-    "updated_by"  varchar(255),
-    "remark"      varchar(255),
-    "name"        varchar(50)  NOT NULL,
-    "value"       varchar(255) NOT NULL,
-    "description" varchar(255) NOT NULL
-)
-;
-COMMENT
-ON COLUMN "sys_param"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_param"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_param"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_param"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_param"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_param"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_param"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_param"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_param"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_param"."name" IS '键名';
-COMMENT
-ON COLUMN "sys_param"."value" IS '键值';
-COMMENT
-ON COLUMN "sys_param"."description" IS '描述';
-COMMENT
-ON TABLE "sys_param" IS '系统参数';
-
--- ----------------------------
--- Records of sys_param
--- ----------------------------
-
--- ----------------------------
--- Table structure for sys_role
--- ----------------------------
-DROP TABLE IF EXISTS "sys_role";
-CREATE TABLE "sys_role"
-(
-    "id"         int8         NOT NULL,
-    "tenant_id"  int8,
-    "revision"   int8         NOT NULL DEFAULT 1,
-    "del_flag"   int2         NOT NULL DEFAULT 0,
-    "created_at" timestamp(6) NOT NULL,
-    "created_by" varchar(255),
-    "updated_at" timestamp(6) NOT NULL,
-    "updated_by" varchar(255),
-    "remark"     varchar(255),
-    "title"      varchar(50)  NOT NULL,
-    "value"      varchar(100) NOT NULL
-)
-;
-COMMENT
-ON COLUMN "sys_role"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_role"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_role"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_role"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_role"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_role"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_role"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_role"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_role"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_role"."title" IS '名称';
-COMMENT
-ON COLUMN "sys_role"."value" IS '值';
-COMMENT
-ON TABLE "sys_role" IS '后台角色';
-
--- ----------------------------
--- Records of sys_role
--- ----------------------------
-INSERT INTO "sys_role"
-VALUES (1, 0, 1, 0, '2021-04-17 02:34:30', NULL, '2021-06-07 16:22:28', 'admin', NULL, '超级管理员(代码中固定拥有所有菜单的权限)',
-        'SuperAdmin');
-
--- ----------------------------
--- Table structure for sys_role_menu_relation
--- ----------------------------
-DROP TABLE IF EXISTS "sys_role_menu_relation";
-CREATE TABLE "sys_role_menu_relation"
-(
-    "id"         int8         NOT NULL,
-    "tenant_id"  int8,
-    "revision"   int8         NOT NULL DEFAULT 1,
-    "del_flag"   int2         NOT NULL DEFAULT 0,
-    "created_at" timestamp(6) NOT NULL,
-    "created_by" varchar(255),
-    "updated_at" timestamp(6) NOT NULL,
-    "updated_by" varchar(255),
-    "remark"     varchar(255),
-    "role_id"    int8         NOT NULL,
-    "menu_id"    int8         NOT NULL
-)
-;
-COMMENT
-ON COLUMN "sys_role_menu_relation"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."role_id" IS '角色ID';
-COMMENT
-ON COLUMN "sys_role_menu_relation"."menu_id" IS '菜单ID';
-COMMENT
-ON TABLE "sys_role_menu_relation" IS '后台角色-可见菜单关联';
-
--- ----------------------------
--- Records of sys_role_menu_relation
--- ----------------------------
-
--- ----------------------------
--- Table structure for sys_tenant
--- ----------------------------
-DROP TABLE IF EXISTS "sys_tenant";
-CREATE TABLE "sys_tenant"
-(
-    "id"                   int8         NOT NULL,
-    "revision"             int8         NOT NULL DEFAULT 1,
-    "del_flag"             int2         NOT NULL DEFAULT 0,
-    "created_at"           timestamp(6) NOT NULL,
-    "created_by"           varchar(255),
-    "updated_at"           timestamp(6) NOT NULL,
-    "updated_by"           varchar(255),
-    "remark"               varchar(255),
-    "tenant_name"          varchar(50)  NOT NULL,
-    "tenant_id"            int8,
-    "status"               int4         NOT NULL,
-    "tenant_admin_user_id" int8
-)
-;
-COMMENT
-ON COLUMN "sys_tenant"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_tenant"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_tenant"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_tenant"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_tenant"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_tenant"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_tenant"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_tenant"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_tenant"."tenant_name" IS '租户名';
-COMMENT
-ON COLUMN "sys_tenant"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_tenant"."status" IS '状态(0=禁用 1=启用)';
-COMMENT
-ON COLUMN "sys_tenant"."tenant_admin_user_id" IS '租户管理员用户ID';
-COMMENT
-ON TABLE "sys_tenant" IS '系统租户';
-
--- ----------------------------
--- Records of sys_tenant
--- ----------------------------
-INSERT INTO "sys_tenant"
-VALUES (1, 1, 0, '2021-05-11 16:06:47', '', '2021-06-10 16:29:32', 'admin', '可无视SQL拦截器', '超级租户', 0, 1, 1);
-
--- ----------------------------
--- Table structure for sys_user
--- ----------------------------
-DROP TABLE IF EXISTS "sys_user";
-CREATE TABLE "sys_user"
-(
-    "id"            int8         NOT NULL,
-    "tenant_id"     int8,
-    "revision"      int8         NOT NULL DEFAULT 1,
-    "del_flag"      int2         NOT NULL DEFAULT 0,
-    "created_at"    timestamp(6) NOT NULL,
-    "created_by"    varchar(255),
-    "updated_at"    timestamp(6) NOT NULL,
-    "updated_by"    varchar(255),
-    "remark"        varchar(255),
-    "pin"           varchar(20)  NOT NULL,
-    "pwd"           varchar(255) NOT NULL,
-    "salt"          varchar(64)  NOT NULL,
-    "nickname"      varchar(20)  NOT NULL,
-    "status"        int4         NOT NULL,
-    "gender"        int4,
-    "email"         varchar(255),
-    "phone_no"      varchar(20),
-    "last_login_at" timestamp(6)
-)
-;
-COMMENT
-ON COLUMN "sys_user"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_user"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_user"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_user"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_user"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_user"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_user"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_user"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_user"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_user"."pin" IS '账号';
-COMMENT
-ON COLUMN "sys_user"."pwd" IS '密码';
-COMMENT
-ON COLUMN "sys_user"."salt" IS '盐';
-COMMENT
-ON COLUMN "sys_user"."nickname" IS '昵称';
-COMMENT
-ON COLUMN "sys_user"."status" IS '状态(0=禁用 1=启用)';
-COMMENT
-ON COLUMN "sys_user"."gender" IS '性别';
-COMMENT
-ON COLUMN "sys_user"."email" IS '邮箱';
-COMMENT
-ON COLUMN "sys_user"."phone_no" IS '手机号';
-COMMENT
-ON COLUMN "sys_user"."last_login_at" IS '最后登录时刻';
-COMMENT
-ON TABLE "sys_user" IS '后台用户';
-
--- ----------------------------
--- Records of sys_user
--- ----------------------------
-INSERT INTO "sys_user"
-VALUES (1, 0, 1, 0, '2021-04-06 09:56:02', NULL, '2021-06-28 16:37:07', 'admin', '', 'admin',
-        'b7f6692251833658a56ff2d09e9835b91384d203721bf27a544586d3c9a379ff', '6a8e9339-dfd1-4cfe-80cb-30ca9fc3d81e',
-        '超级管理员', 1, 0, 'admin@example.com', '17874585544', '2021-07-18 00:32:08');
-
--- ----------------------------
--- Table structure for sys_user_dept_relation
--- ----------------------------
-DROP TABLE IF EXISTS "sys_user_dept_relation";
-CREATE TABLE "sys_user_dept_relation"
-(
-    "id"         int8         NOT NULL,
-    "tenant_id"  int8,
-    "revision"   int8         NOT NULL DEFAULT 1,
-    "del_flag"   int2         NOT NULL DEFAULT 0,
-    "created_at" timestamp(6) NOT NULL,
-    "created_by" varchar(255),
-    "updated_at" timestamp(6) NOT NULL,
-    "updated_by" varchar(255),
-    "remark"     varchar(255),
-    "user_id"    int8         NOT NULL,
-    "dept_id"    int8         NOT NULL
-)
-;
-COMMENT
-ON COLUMN "sys_user_dept_relation"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."user_id" IS '用户ID';
-COMMENT
-ON COLUMN "sys_user_dept_relation"."dept_id" IS '部门ID';
-COMMENT
-ON TABLE "sys_user_dept_relation" IS '后台用户-部门关联';
-
--- ----------------------------
--- Records of sys_user_dept_relation
--- ----------------------------
-
--- ----------------------------
--- Table structure for sys_user_role_relation
--- ----------------------------
-DROP TABLE IF EXISTS "sys_user_role_relation";
-CREATE TABLE "sys_user_role_relation"
-(
-    "id"         int8         NOT NULL,
-    "tenant_id"  int8,
-    "revision"   int8         NOT NULL DEFAULT 1,
-    "del_flag"   int2         NOT NULL DEFAULT 0,
-    "created_at" timestamp(6) NOT NULL,
-    "created_by" varchar(255),
-    "updated_at" timestamp(6) NOT NULL,
-    "updated_by" varchar(255),
-    "remark"     varchar(255),
-    "user_id"    int8         NOT NULL,
-    "role_id"    int8         NOT NULL
-)
-;
-COMMENT
-ON COLUMN "sys_user_role_relation"."id" IS '主键ID';
-COMMENT
-ON COLUMN "sys_user_role_relation"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "sys_user_role_relation"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "sys_user_role_relation"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "sys_user_role_relation"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "sys_user_role_relation"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "sys_user_role_relation"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "sys_user_role_relation"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "sys_user_role_relation"."remark" IS '备注';
-COMMENT
-ON COLUMN "sys_user_role_relation"."user_id" IS '用户ID';
-COMMENT
-ON COLUMN "sys_user_role_relation"."role_id" IS '角色ID';
-COMMENT
-ON TABLE "sys_user_role_relation" IS '后台用户-角色关联';
-
--- ----------------------------
--- Records of sys_user_role_relation
--- ----------------------------
-INSERT INTO "sys_user_role_relation"
-VALUES (1, 0, 1, 0, '2021-01-01 18:22:12', NULL, '2021-01-01 18:22:12', NULL, NULL, 1, 1);
-
--- ----------------------------
--- Table structure for 数据表模板
--- ----------------------------
-DROP TABLE IF EXISTS "数据表模板";
-CREATE TABLE "数据表模板"
-(
-    "id"         int8         NOT NULL,
-    "tenant_id"  int8,
-    "revision"   int8         NOT NULL DEFAULT 1,
-    "del_flag"   int2         NOT NULL DEFAULT 0,
-    "created_at" timestamp(6) NOT NULL,
-    "created_by" varchar(255),
-    "updated_at" timestamp(6) NOT NULL,
-    "updated_by" varchar(255),
-    "remark"     varchar(255)
-)
-;
-COMMENT
-ON COLUMN "数据表模板"."id" IS '主键ID';
-COMMENT
-ON COLUMN "数据表模板"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "数据表模板"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "数据表模板"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "数据表模板"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "数据表模板"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "数据表模板"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "数据表模板"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "数据表模板"."remark" IS '备注';
-COMMENT
-ON TABLE "数据表模板" IS '数据表注释';
-
--- ----------------------------
--- Records of 数据表模板
--- ----------------------------
-
--- ----------------------------
--- Primary Key structure for table sys_data_dict
--- ----------------------------
-ALTER TABLE "sys_data_dict"
-    ADD CONSTRAINT "sys_data_dict_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_dept
--- ----------------------------
-ALTER TABLE "sys_dept"
-    ADD CONSTRAINT "sys_dept_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_log
--- ----------------------------
-ALTER TABLE "sys_log"
-    ADD CONSTRAINT "sys_log_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_menu
--- ----------------------------
-ALTER TABLE "sys_menu"
-    ADD CONSTRAINT "sys_menu_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_param
--- ----------------------------
-ALTER TABLE "sys_param"
-    ADD CONSTRAINT "sys_param_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_role
--- ----------------------------
-ALTER TABLE "sys_role"
-    ADD CONSTRAINT "sys_role_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_role_menu_relation
--- ----------------------------
-ALTER TABLE "sys_role_menu_relation"
-    ADD CONSTRAINT "sys_role_menu_relation_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_tenant
--- ----------------------------
-ALTER TABLE "sys_tenant"
-    ADD CONSTRAINT "sys_tenant_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_user
--- ----------------------------
-ALTER TABLE "sys_user"
-    ADD CONSTRAINT "sys_user_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_user_dept_relation
--- ----------------------------
-ALTER TABLE "sys_user_dept_relation"
-    ADD CONSTRAINT "sys_user_dept_relation_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table sys_user_role_relation
--- ----------------------------
-ALTER TABLE "sys_user_role_relation"
-    ADD CONSTRAINT "sys_user_role_relation_pkey" PRIMARY KEY ("id");
-
--- ----------------------------
--- Primary Key structure for table 数据表模板
--- ----------------------------
-ALTER TABLE "数据表模板"
-    ADD CONSTRAINT "数据表模板_pkey" PRIMARY KEY ("id");
+-- ----------------------------
+-- Table structure for sys_data_dict
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_data_dict";
+CREATE TABLE "sys_data_dict"
+(
+    "id"              int8         NOT NULL,
+    "tenant_id"       int8,
+    "revision"        int8         NOT NULL DEFAULT 1,
+    "del_flag"        int2         NOT NULL DEFAULT 0,
+    "created_at"      timestamp(6) NOT NULL,
+    "created_by"      varchar(255),
+    "updated_at"      timestamp(6) NOT NULL,
+    "updated_by"      varchar(255),
+    "camel_case_key"  varchar(100) NOT NULL,
+    "under_case_key"  varchar(100) NOT NULL,
+    "pascal_case_key" varchar(100) NOT NULL,
+    "value"           varchar(255) NOT NULL,
+    "description"     varchar(255) NOT NULL,
+    "unit"            varchar(30),
+    "value_range"     varchar(255),
+    "alias_key"       varchar(100)
+)
+;
+COMMENT
+ON COLUMN "sys_data_dict"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_data_dict"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_data_dict"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_data_dict"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_data_dict"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_data_dict"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_data_dict"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_data_dict"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_data_dict"."camel_case_key" IS '驼峰式键名';
+COMMENT
+ON COLUMN "sys_data_dict"."under_case_key" IS '下划线式键名';
+COMMENT
+ON COLUMN "sys_data_dict"."pascal_case_key" IS '帕斯卡式键名';
+COMMENT
+ON COLUMN "sys_data_dict"."value" IS '键值';
+COMMENT
+ON COLUMN "sys_data_dict"."description" IS '描述';
+COMMENT
+ON COLUMN "sys_data_dict"."unit" IS '单位';
+COMMENT
+ON COLUMN "sys_data_dict"."value_range" IS '取值范围';
+COMMENT
+ON COLUMN "sys_data_dict"."alias_key" IS '别称键名';
+COMMENT
+ON TABLE "sys_data_dict" IS '数据字典';
+
+-- ----------------------------
+-- Records of sys_data_dict
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_dept
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_dept";
+CREATE TABLE "sys_dept"
+(
+    "id"         int8         NOT NULL,
+    "tenant_id"  int8,
+    "revision"   int8         NOT NULL DEFAULT 1,
+    "del_flag"   int2         NOT NULL DEFAULT 0,
+    "created_at" timestamp(6) NOT NULL,
+    "created_by" varchar(255),
+    "updated_at" timestamp(6) NOT NULL,
+    "updated_by" varchar(255),
+    "title"      varchar(50)  NOT NULL,
+    "parent_id"  int8         NOT NULL,
+    "sort"       int4         NOT NULL,
+    "status"     int4         NOT NULL
+)
+;
+COMMENT
+ON COLUMN "sys_dept"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_dept"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_dept"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_dept"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_dept"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_dept"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_dept"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_dept"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_dept"."title" IS '名称';
+COMMENT
+ON COLUMN "sys_dept"."parent_id" IS '上级ID(根节点设置为0)';
+COMMENT
+ON COLUMN "sys_dept"."sort" IS '排序';
+COMMENT
+ON COLUMN "sys_dept"."status" IS '状态(0=禁用 1=启用)';
+COMMENT
+ON TABLE "sys_dept" IS '部门';
+
+-- ----------------------------
+-- Records of sys_dept
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_log
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_log";
+CREATE TABLE "sys_log"
+(
+    "id"         int8         NOT NULL,
+    "tenant_id"  int8,
+    "revision"   int8         NOT NULL DEFAULT 1,
+    "del_flag"   int2         NOT NULL DEFAULT 0,
+    "created_at" timestamp(6) NOT NULL,
+    "created_by" varchar(255),
+    "updated_at" timestamp(6) NOT NULL,
+    "updated_by" varchar(255),
+    "user_id"    int8,
+    "username"   varchar(50),
+    "operation"  varchar(255),
+    "method"     varchar(500),
+    "params"     text,
+    "ip"         varchar(128),
+    "status"     int4         NOT NULL
+)
+;
+COMMENT
+ON COLUMN "sys_log"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_log"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_log"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_log"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_log"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_log"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_log"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_log"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_log"."user_id" IS '用户ID';
+COMMENT
+ON COLUMN "sys_log"."username" IS '用户账号';
+COMMENT
+ON COLUMN "sys_log"."operation" IS '操作内容';
+COMMENT
+ON COLUMN "sys_log"."method" IS '请求方法';
+COMMENT
+ON COLUMN "sys_log"."params" IS '请求参数';
+COMMENT
+ON COLUMN "sys_log"."ip" IS 'IP地址';
+COMMENT
+ON COLUMN "sys_log"."status" IS '状态(参考SysLogStatusEnum)';
+COMMENT
+ON TABLE "sys_log" IS '后台操作日志';
+
+-- ----------------------------
+-- Records of sys_log
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_menu";
+CREATE TABLE "sys_menu"
+(
+    "id"            int8         NOT NULL,
+    "tenant_id"     int8,
+    "revision"      int8         NOT NULL DEFAULT 1,
+    "del_flag"      int2         NOT NULL DEFAULT 0,
+    "created_at"    timestamp(6) NOT NULL,
+    "created_by"    varchar(255),
+    "updated_at"    timestamp(6) NOT NULL,
+    "updated_by"    varchar(255),
+    "title"         varchar(50)  NOT NULL,
+    "parent_id"     int8         NOT NULL,
+    "type"          int4         NOT NULL,
+    "permission"    varchar(255) NOT NULL,
+    "icon"          varchar(255),
+    "sort"          int4,
+    "status"        int4         NOT NULL,
+    "component"     varchar(255),
+    "external_link" varchar(255)
+)
+;
+COMMENT
+ON COLUMN "sys_menu"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_menu"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_menu"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_menu"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_menu"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_menu"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_menu"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_menu"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_menu"."title" IS '名称';
+COMMENT
+ON COLUMN "sys_menu"."parent_id" IS '上级菜单ID(根节点设置为0)';
+COMMENT
+ON COLUMN "sys_menu"."type" IS '菜单类型(参考MenuTypeEnum)';
+COMMENT
+ON COLUMN "sys_menu"."permission" IS '权限标识';
+COMMENT
+ON COLUMN "sys_menu"."icon" IS '图标';
+COMMENT
+ON COLUMN "sys_menu"."sort" IS '排序';
+COMMENT
+ON COLUMN "sys_menu"."status" IS '状态(0=禁用 1=启用)';
+COMMENT
+ON COLUMN "sys_menu"."component" IS '组件';
+COMMENT
+ON COLUMN "sys_menu"."external_link" IS '外链地址';
+COMMENT
+ON TABLE "sys_menu" IS '后台菜单';
+
+-- ----------------------------
+-- Records of sys_menu
+-- ----------------------------
+BEGIN;
+INSERT INTO "sys_menu"
+VALUES (1, 0, 1, 0, '2021-06-01 17:16:48', NULL, '2021-06-02 17:14:16', NULL, '系统管理', 0, 0, 'Sys',
+        'ant-design:setting-outlined', 3, 1, 'LAYOUT', '');
+INSERT INTO "sys_menu"
+VALUES (2, 0, 1, 0, '2021-06-01 17:13:13', NULL, '2021-07-18 00:10:33', 'admin', '中控台', 0, 0, 'Dashboard',
+        'ant-design:appstore-outlined', 1, 1, 'LAYOUT', '');
+INSERT INTO "sys_menu"
+VALUES (3, 0, 1, 0, '2021-06-01 17:14:22', NULL, '2021-06-02 11:24:38', NULL, '分析页(默认页必须分配, 否则进不去后台)', 2, 1,
+        'Dashboard:analysis', 'ant-design:fund-outlined', 1, 1, '/dashboard/analysis/index', '');
+INSERT INTO "sys_menu"
+VALUES (4, 0, 1, 0, '2021-06-01 17:14:47', NULL, '2021-06-02 11:32:23', NULL, '工作台', 2, 1, 'Dashboard:workbench',
+        'ant-design:database-outlined', 2, 1, '/dashboard/workbench/index', '');
+INSERT INTO "sys_menu"
+VALUES (5, 0, 1, 0, '2021-06-01 17:15:38', NULL, '2021-07-15 23:56:43', 'admin', '关于', 0, 1, 'About',
+        'ant-design:eye-outlined', 2, 1, '/sys/vben/about/index', '');
+INSERT INTO "sys_menu"
+VALUES (6, 0, 1, 0, '2021-06-02 16:06:58', NULL, '2021-07-17 23:55:52', 'admin', '学(mo)习(yu)', 2, 3, '',
+        'ant-design:zhihu-outlined', 3, 1, 'https://www.zhihu.com/', 'https://www.zhihu.com/');
+INSERT INTO "sys_menu"
+VALUES (7, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, '部门管理', 1, 1, 'SysDept',
+        'ant-design:flag-outlined', 1, 1, '/sys/SysDept/index', '');
+INSERT INTO "sys_menu"
+VALUES (8, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, '查询', 7, 2, 'SysDept:retrieve', NULL, 1,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (9, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, '新增', 7, 2, 'SysDept:create', NULL, 2, 1,
+        NULL, '');
+INSERT INTO "sys_menu"
+VALUES (10, 0, 1, 0, '2021-07-17 23:32:15', NULL, '2021-07-17 23:32:15', NULL, '删除', 7, 2, 'SysDept:delete', NULL, 3, 1,
+        NULL, '');
+INSERT INTO "sys_menu"
+VALUES (11, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '编辑', 7, 2, 'SysDept:update', NULL, 4, 1,
+        NULL, '');
+INSERT INTO "sys_menu"
+VALUES (12, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '角色管理', 1, 1, 'SysRole',
+        'ant-design:usergroup-add-outlined', 2, 1, '/sys/SysRole/index', '');
+INSERT INTO "sys_menu"
+VALUES (13, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '查询', 12, 2, 'SysRole:retrieve', NULL, 1,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (14, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '新增', 12, 2, 'SysRole:create', NULL, 2,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (15, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '删除', 12, 2, 'SysRole:delete', NULL, 3,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (16, 0, 1, 0, '2021-07-17 23:32:16', NULL, '2021-07-17 23:32:16', NULL, '编辑', 12, 2, 'SysRole:update', NULL, 4,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (17, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '后台用户', 1, 1, 'SysUser',
+        'ant-design:user-outlined', 3, 1, '/sys/SysUser/index', '');
+INSERT INTO "sys_menu"
+VALUES (18, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '查询', 17, 2, 'SysUser:retrieve', NULL, 1,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (19, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '新增', 17, 2, 'SysUser:create', NULL, 2,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (20, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '删除', 17, 2, 'SysUser:delete', NULL, 3,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (21, 0, 1, 0, '2021-07-17 23:32:17', NULL, '2021-07-17 23:32:17', NULL, '编辑', 17, 2, 'SysUser:update', NULL, 4,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (22, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '菜单管理', 1, 1, 'SysMenu',
+        'ant-design:align-left-outlined', 4, 1, '/sys/SysMenu/index', '');
+INSERT INTO "sys_menu"
+VALUES (23, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '查询', 22, 2, 'SysMenu:retrieve', NULL, 1,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (24, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '新增', 22, 2, 'SysMenu:create', NULL, 2,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (25, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '删除', 22, 2, 'SysMenu:delete', NULL, 3,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (26, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '编辑', 22, 2, 'SysMenu:update', NULL, 4,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (27, 0, 1, 0, '2021-07-17 23:32:18', NULL, '2021-07-17 23:32:18', NULL, '参数管理', 1, 1, 'SysParam',
+        'ant-design:ant-design-outlined', 5, 1, '/sys/SysParam/index', '');
+INSERT INTO "sys_menu"
+VALUES (28, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '查询', 27, 2, 'SysParam:retrieve', NULL,
+        1, 1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (29, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '新增', 27, 2, 'SysParam:create', NULL, 2,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (30, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '删除', 27, 2, 'SysParam:delete', NULL, 3,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (31, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '编辑', 27, 2, 'SysParam:update', NULL, 4,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (32, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '租户管理', 1, 1, 'SysTenant',
+        'ant-design:aliyun-outlined', 6, 1, '/sys/SysTenant/index', '');
+INSERT INTO "sys_menu"
+VALUES (33, 0, 1, 0, '2021-07-17 23:32:19', NULL, '2021-07-17 23:32:19', NULL, '查询', 32, 2, 'SysTenant:retrieve', NULL,
+        1, 1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (34, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '新增', 32, 2, 'SysTenant:create', NULL, 2,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (35, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '删除', 32, 2, 'SysTenant:delete', NULL, 3,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (36, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '编辑', 32, 2, 'SysTenant:update', NULL, 4,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (37, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '数据字典', 1, 1, 'SysDataDict',
+        'ant-design:field-string-outlined', 7, 1, '/sys/SysDataDict/index', '');
+INSERT INTO "sys_menu"
+VALUES (38, 0, 1, 0, '2021-07-17 23:32:20', NULL, '2021-07-17 23:32:20', NULL, '查询', 37, 2, 'SysDataDict:retrieve',
+        NULL, 1, 1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (39, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '新增', 37, 2, 'SysDataDict:create', NULL,
+        2, 1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (40, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '删除', 37, 2, 'SysDataDict:delete', NULL,
+        3, 1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (41, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '编辑', 37, 2, 'SysDataDict:update', NULL,
+        4, 1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (42, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '系统日志', 1, 1, 'SysLog',
+        'ant-design:edit-twotone', 8, 1, '/sys/SysLog/index', '');
+INSERT INTO "sys_menu"
+VALUES (43, 0, 1, 0, '2021-07-17 23:32:21', NULL, '2021-07-17 23:32:21', NULL, '查询', 42, 2, 'SysLog:retrieve', NULL, 1,
+        1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (44, 0, 1, 0, '2021-07-17 23:37:26', 'admin', '2021-07-17 23:38:28', 'admin', '修改当前用户密码', 1, 1, '',
+        'ant-design:compass-outlined', 9, 1, '/sys/SysUser/change-password/index', '');
+INSERT INTO "sys_menu"
+VALUES (45, 0, 1, 0, '2021-07-17 23:39:41', 'admin', '2021-07-17 23:39:41', 'admin', '重置某用户密码', 17, 2,
+        'SysUser:resetPassword', 'ant-design:redo-outlined', 5, 1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (46, 0, 1, 0, '2021-07-17 23:40:26', 'admin', '2021-07-17 23:40:26', 'admin', '绑定用户与角色关联关系', 17, 2,
+        'SysUser:bindRoles', 'ant-design:share-alt-outlined', 6, 1, NULL, '');
+INSERT INTO "sys_menu"
+VALUES (47, 0, 1, 0, '2021-07-17 23:40:47', 'admin', '2021-07-17 23:41:15', 'admin', '踢某用户下线', 17, 2, 'SysUser:kickOut',
+        'ant-design:disconnect-outlined', 7, 1, 'LAYOUT', '');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_param
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_param";
+CREATE TABLE "sys_param"
+(
+    "id"          int8         NOT NULL,
+    "tenant_id"   int8,
+    "revision"    int8         NOT NULL DEFAULT 1,
+    "del_flag"    int2         NOT NULL DEFAULT 0,
+    "created_at"  timestamp(6) NOT NULL,
+    "created_by"  varchar(255),
+    "updated_at"  timestamp(6) NOT NULL,
+    "updated_by"  varchar(255),
+    "name"        varchar(50)  NOT NULL,
+    "value"       varchar(255) NOT NULL,
+    "description" varchar(255) NOT NULL
+)
+;
+COMMENT
+ON COLUMN "sys_param"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_param"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_param"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_param"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_param"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_param"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_param"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_param"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_param"."name" IS '键名';
+COMMENT
+ON COLUMN "sys_param"."value" IS '键值';
+COMMENT
+ON COLUMN "sys_param"."description" IS '描述';
+COMMENT
+ON TABLE "sys_param" IS '系统参数';
+
+-- ----------------------------
+-- Records of sys_param
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_role
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_role";
+CREATE TABLE "sys_role"
+(
+    "id"         int8         NOT NULL,
+    "tenant_id"  int8,
+    "revision"   int8         NOT NULL DEFAULT 1,
+    "del_flag"   int2         NOT NULL DEFAULT 0,
+    "created_at" timestamp(6) NOT NULL,
+    "created_by" varchar(255),
+    "updated_at" timestamp(6) NOT NULL,
+    "updated_by" varchar(255),
+    "title"      varchar(50)  NOT NULL,
+    "value"      varchar(100) NOT NULL
+)
+;
+COMMENT
+ON COLUMN "sys_role"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_role"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_role"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_role"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_role"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_role"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_role"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_role"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_role"."title" IS '名称';
+COMMENT
+ON COLUMN "sys_role"."value" IS '值';
+COMMENT
+ON TABLE "sys_role" IS '后台角色';
+
+-- ----------------------------
+-- Records of sys_role
+-- ----------------------------
+BEGIN;
+INSERT INTO "sys_role"
+VALUES (1, 0, 1, 0, '2021-04-17 02:34:30', NULL, '2021-06-07 16:22:28', 'admin', '超级管理员(代码中固定拥有所有菜单的权限)', 'SuperAdmin');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_role_menu_relation
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_role_menu_relation";
+CREATE TABLE "sys_role_menu_relation"
+(
+    "id"         int8         NOT NULL,
+    "tenant_id"  int8,
+    "revision"   int8         NOT NULL DEFAULT 1,
+    "del_flag"   int2         NOT NULL DEFAULT 0,
+    "created_at" timestamp(6) NOT NULL,
+    "created_by" varchar(255),
+    "updated_at" timestamp(6) NOT NULL,
+    "updated_by" varchar(255),
+    "role_id"    int8         NOT NULL,
+    "menu_id"    int8         NOT NULL
+)
+;
+COMMENT
+ON COLUMN "sys_role_menu_relation"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."role_id" IS '角色ID';
+COMMENT
+ON COLUMN "sys_role_menu_relation"."menu_id" IS '菜单ID';
+COMMENT
+ON TABLE "sys_role_menu_relation" IS '后台角色-可见菜单关联';
+
+-- ----------------------------
+-- Records of sys_role_menu_relation
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_tenant
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_tenant";
+CREATE TABLE "sys_tenant"
+(
+    "id"                   int8         NOT NULL,
+    "revision"             int8         NOT NULL DEFAULT 1,
+    "del_flag"             int2         NOT NULL DEFAULT 0,
+    "created_at"           timestamp(6) NOT NULL,
+    "created_by"           varchar(255),
+    "updated_at"           timestamp(6) NOT NULL,
+    "updated_by"           varchar(255),
+    "remark"               varchar(255),
+    "tenant_name"          varchar(50)  NOT NULL,
+    "tenant_id"            int8,
+    "status"               int4         NOT NULL,
+    "tenant_admin_user_id" int8
+)
+;
+COMMENT
+ON COLUMN "sys_tenant"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_tenant"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_tenant"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_tenant"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_tenant"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_tenant"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_tenant"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_tenant"."remark" IS '备注';
+COMMENT
+ON COLUMN "sys_tenant"."tenant_name" IS '租户名';
+COMMENT
+ON COLUMN "sys_tenant"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_tenant"."status" IS '状态(0=禁用 1=启用)';
+COMMENT
+ON COLUMN "sys_tenant"."tenant_admin_user_id" IS '租户管理员用户ID';
+COMMENT
+ON TABLE "sys_tenant" IS '系统租户';
+
+-- ----------------------------
+-- Records of sys_tenant
+-- ----------------------------
+BEGIN;
+INSERT INTO "sys_tenant"
+VALUES (1, 1, 0, '2021-05-11 16:06:47', '', '2021-06-10 16:29:32', 'admin', '可无视SQL拦截器', '超级租户', 0, 1, 1);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_user
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_user";
+CREATE TABLE "sys_user"
+(
+    "id"            int8         NOT NULL,
+    "tenant_id"     int8,
+    "revision"      int8         NOT NULL DEFAULT 1,
+    "del_flag"      int2         NOT NULL DEFAULT 0,
+    "created_at"    timestamp(6) NOT NULL,
+    "created_by"    varchar(255),
+    "updated_at"    timestamp(6) NOT NULL,
+    "updated_by"    varchar(255),
+    "pin"           varchar(20)  NOT NULL,
+    "pwd"           varchar(255) NOT NULL,
+    "salt"          varchar(64)  NOT NULL,
+    "nickname"      varchar(20)  NOT NULL,
+    "status"        int4         NOT NULL,
+    "gender"        int4,
+    "email"         varchar(255),
+    "phone_no"      varchar(20),
+    "last_login_at" timestamp(6)
+)
+;
+COMMENT
+ON COLUMN "sys_user"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_user"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_user"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_user"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_user"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_user"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_user"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_user"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_user"."pin" IS '账号';
+COMMENT
+ON COLUMN "sys_user"."pwd" IS '密码';
+COMMENT
+ON COLUMN "sys_user"."salt" IS '盐';
+COMMENT
+ON COLUMN "sys_user"."nickname" IS '昵称';
+COMMENT
+ON COLUMN "sys_user"."status" IS '状态(0=禁用 1=启用)';
+COMMENT
+ON COLUMN "sys_user"."gender" IS '性别';
+COMMENT
+ON COLUMN "sys_user"."email" IS '邮箱';
+COMMENT
+ON COLUMN "sys_user"."phone_no" IS '手机号';
+COMMENT
+ON COLUMN "sys_user"."last_login_at" IS '最后登录时刻';
+COMMENT
+ON TABLE "sys_user" IS '后台用户';
+
+-- ----------------------------
+-- Records of sys_user
+-- ----------------------------
+BEGIN;
+INSERT INTO "sys_user"
+VALUES (1, 0, 1, 0, '2021-04-06 09:56:02', NULL, '2021-06-28 16:37:07', 'admin', 'admin',
+        'b7f6692251833658a56ff2d09e9835b91384d203721bf27a544586d3c9a379ff', '6a8e9339-dfd1-4cfe-80cb-30ca9fc3d81e',
+        '超级管理员', 1, 0, 'admin@example.com', '17874585544', '2021-07-18 00:32:08');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_user_dept_relation
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_user_dept_relation";
+CREATE TABLE "sys_user_dept_relation"
+(
+    "id"         int8         NOT NULL,
+    "tenant_id"  int8,
+    "revision"   int8         NOT NULL DEFAULT 1,
+    "del_flag"   int2         NOT NULL DEFAULT 0,
+    "created_at" timestamp(6) NOT NULL,
+    "created_by" varchar(255),
+    "updated_at" timestamp(6) NOT NULL,
+    "updated_by" varchar(255),
+    "user_id"    int8         NOT NULL,
+    "dept_id"    int8         NOT NULL
+)
+;
+COMMENT
+ON COLUMN "sys_user_dept_relation"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."user_id" IS '用户ID';
+COMMENT
+ON COLUMN "sys_user_dept_relation"."dept_id" IS '部门ID';
+COMMENT
+ON TABLE "sys_user_dept_relation" IS '后台用户-部门关联';
+
+-- ----------------------------
+-- Records of sys_user_dept_relation
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Table structure for sys_user_role_relation
+-- ----------------------------
+DROP TABLE IF EXISTS "sys_user_role_relation";
+CREATE TABLE "sys_user_role_relation"
+(
+    "id"         int8         NOT NULL,
+    "tenant_id"  int8,
+    "revision"   int8         NOT NULL DEFAULT 1,
+    "del_flag"   int2         NOT NULL DEFAULT 0,
+    "created_at" timestamp(6) NOT NULL,
+    "created_by" varchar(255),
+    "updated_at" timestamp(6) NOT NULL,
+    "updated_by" varchar(255),
+    "user_id"    int8         NOT NULL,
+    "role_id"    int8         NOT NULL
+)
+;
+COMMENT
+ON COLUMN "sys_user_role_relation"."id" IS '主键ID';
+COMMENT
+ON COLUMN "sys_user_role_relation"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "sys_user_role_relation"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "sys_user_role_relation"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "sys_user_role_relation"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "sys_user_role_relation"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "sys_user_role_relation"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "sys_user_role_relation"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "sys_user_role_relation"."user_id" IS '用户ID';
+COMMENT
+ON COLUMN "sys_user_role_relation"."role_id" IS '角色ID';
+COMMENT
+ON TABLE "sys_user_role_relation" IS '后台用户-角色关联';
+
+-- ----------------------------
+-- Records of sys_user_role_relation
+-- ----------------------------
+BEGIN;
+INSERT INTO "sys_user_role_relation"
+VALUES (1, 0, 1, 0, '2021-01-01 18:22:12', NULL, '2021-01-01 18:22:12', NULL, 1, 1);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for 数据表模板
+-- ----------------------------
+DROP TABLE IF EXISTS "数据表模板";
+CREATE TABLE "数据表模板"
+(
+    "id"         int8         NOT NULL,
+    "tenant_id"  int8,
+    "revision"   int8         NOT NULL DEFAULT 1,
+    "del_flag"   int2         NOT NULL DEFAULT 0,
+    "created_at" timestamp(6) NOT NULL,
+    "created_by" varchar(255),
+    "updated_at" timestamp(6) NOT NULL,
+    "updated_by" varchar(255)
+)
+;
+COMMENT
+ON COLUMN "数据表模板"."id" IS '主键ID';
+COMMENT
+ON COLUMN "数据表模板"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "数据表模板"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "数据表模板"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "数据表模板"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "数据表模板"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "数据表模板"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "数据表模板"."updated_by" IS '更新者';
+COMMENT
+ON TABLE "数据表模板" IS '数据表注释';
+
+-- ----------------------------
+-- Records of 数据表模板
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+-- ----------------------------
+-- Primary Key structure for table sys_data_dict
+-- ----------------------------
+ALTER TABLE "sys_data_dict"
+    ADD CONSTRAINT "sys_data_dict_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_dept
+-- ----------------------------
+ALTER TABLE "sys_dept"
+    ADD CONSTRAINT "sys_dept_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_log
+-- ----------------------------
+ALTER TABLE "sys_log"
+    ADD CONSTRAINT "sys_log_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_menu
+-- ----------------------------
+ALTER TABLE "sys_menu"
+    ADD CONSTRAINT "sys_menu_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_param
+-- ----------------------------
+ALTER TABLE "sys_param"
+    ADD CONSTRAINT "sys_param_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_role
+-- ----------------------------
+ALTER TABLE "sys_role"
+    ADD CONSTRAINT "sys_role_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_role_menu_relation
+-- ----------------------------
+ALTER TABLE "sys_role_menu_relation"
+    ADD CONSTRAINT "sys_role_menu_relation_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_tenant
+-- ----------------------------
+ALTER TABLE "sys_tenant"
+    ADD CONSTRAINT "sys_tenant_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_user
+-- ----------------------------
+ALTER TABLE "sys_user"
+    ADD CONSTRAINT "sys_user_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_user_dept_relation
+-- ----------------------------
+ALTER TABLE "sys_user_dept_relation"
+    ADD CONSTRAINT "sys_user_dept_relation_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table sys_user_role_relation
+-- ----------------------------
+ALTER TABLE "sys_user_role_relation"
+    ADD CONSTRAINT "sys_user_role_relation_pkey" PRIMARY KEY ("id");
+
+-- ----------------------------
+-- Primary Key structure for table 数据表模板
+-- ----------------------------
+ALTER TABLE "数据表模板"
+    ADD CONSTRAINT "数据表模板_pkey" PRIMARY KEY ("id");

+ 32 - 4
pom.xml

@@ -7,11 +7,11 @@
     <parent>
         <groupId>cc.uncarbon.framework</groupId>
         <artifactId>helio-starters</artifactId>
-        <version>1.3.0</version>
+        <version>1.4.0</version>
     </parent>
 
     <artifactId>helio-boot</artifactId>
-    <version>1.3.0</version>
+    <version>1.4.0</version>
 
     <properties>
     </properties>
@@ -71,6 +71,7 @@
 
     <build>
         <plugins>
+            <!-- Spring Boot 打包插件 -->
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
@@ -79,7 +80,7 @@
                 </configuration>
             </plugin>
 
-            <!-- 跳过单元测试 -->
+            <!-- 编译时,跳过单元测试 -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
@@ -87,6 +88,33 @@
                     <skipTests>true</skipTests>
                 </configuration>
             </plugin>
+
+            <!-- 编译时,不执行 mvn deploy -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+
+            <!-- 编译时,不生成 javadoc.jar -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+
+            <!-- 编译时,不生成 sources.jar -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <configuration>
+                    <skipSource>true</skipSource>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
-</project>
+</project>

+ 1 - 1
src/main/java/cc/uncarbon/interceptor/AdminSaTokenParseInterceptor.java

@@ -30,7 +30,7 @@ public class AdminSaTokenParseInterceptor implements AsyncHandlerInterceptor {
 
         // 从请求头解析用户上下文
         if (AdminStpUtil.isLogin()) {
-            UserContext currentUser = (UserContext) AdminStpUtil.getSession().get("userContext");
+            UserContext currentUser = (UserContext) AdminStpUtil.getSession().get(UserContext.CAMEL_NAME);
             log.debug("[SA-Token][Admin] 从请求头解析出用户上下文 >> {}", currentUser);
 
             currentUser

+ 5 - 7
src/main/java/cc/uncarbon/module/app/controller/AppAuthController.java

@@ -2,12 +2,8 @@ package cc.uncarbon.module.app.controller;
 
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.framework.core.context.UserContext;
 import cc.uncarbon.framework.web.model.response.ApiResult;
 import cc.uncarbon.module.app.constant.AppConstant;
-import cc.uncarbon.module.sys.enums.UserTypeEnum;
-import cn.dev33.satoken.stp.StpUtil;
-import cn.hutool.core.collection.CollUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -16,9 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.HashMap;
-import java.util.Map;
-
 
 /**
  * @author Uncarbon
@@ -29,6 +22,11 @@ import java.util.Map;
 @RestController
 public class AppAuthController {
 
+    /*
+    /app/** 开头的C端接口默认为都需要登录,放行接口请在配置文件的 helio.security.exclude-routes 中设置
+    相关拦截器代码请见 CustomInterceptorConfiguration.java
+     */
+
     @ApiOperation(value = "登录", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
     @PostMapping("/login")
     public ApiResult<?> login() {

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/controller/AdminAuthController.java

@@ -65,7 +65,7 @@ public class AdminAuthController {
 
         // 注册到SA-Token
         AdminStpUtil.login(userInfo.getId(), dto.getRememberMe());
-        AdminStpUtil.getSession().set("userContext", userContext);
+        AdminStpUtil.getSession().set(UserContext.CAMEL_NAME, userContext);
 
 
         // 返回登录token

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/controller/AdminSysDataDictController.java

@@ -50,7 +50,7 @@ public class AdminSysDataDictController {
     @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/{id}")
     public ApiResult<SysDataDictBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysDataDictService.getOneById(id));
+        return ApiResult.data(sysDataDictService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/controller/AdminSysDeptController.java

@@ -33,7 +33,7 @@ import java.util.List;
 public class AdminSysDeptController {
 
     private static final String PERMISSION_PREFIX = "SysDept:";
-    
+
     @Resource
     private SysDeptService sysDeptService;
 
@@ -49,7 +49,7 @@ public class AdminSysDeptController {
     @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/{id}")
     public ApiResult<SysDeptBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysDeptService.getOneById(id));
+        return ApiResult.data(sysDeptService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/controller/AdminSysLogController.java

@@ -34,7 +34,7 @@ import javax.annotation.Resource;
 public class AdminSysLogController {
 
     private static final String PERMISSION_PREFIX = "SysLog:";
-    
+
     @Resource
     private SysLogService sysLogService;
 
@@ -50,7 +50,7 @@ public class AdminSysLogController {
     @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/{id}")
     public ApiResult<SysLogBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysLogService.getOneById(id));
+        return ApiResult.data(sysLogService.getOneById(id, true));
     }
 
 }

+ 3 - 3
src/main/java/cc/uncarbon/module/sys/controller/AdminSysMenuController.java

@@ -61,7 +61,7 @@ public class AdminSysMenuController {
     @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/{id}")
     public ApiResult<SysMenuBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysMenuService.getOneById(id));
+        return ApiResult.data(sysMenuService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
@@ -104,7 +104,7 @@ public class AdminSysMenuController {
         if (redisValue == null) {
             redisValue = sysMenuService.adminListSideMenu();
             // 记录到缓存
-            String sysMenuCacheDuration = sysParamService.getParamValueByKey(SysConstant.PARAM_KEY_CACHE_MENU_DURATION, "30");
+            String sysMenuCacheDuration = sysParamService.getParamValueByName(SysConstant.PARAM_KEY_CACHE_MENU_DURATION, "30");
             stringRedisTemplate.opsForValue().set(redisKey, JSONUtil.toJsonStr(redisValue), Integer.parseInt(sysMenuCacheDuration), TimeUnit.MINUTES);
         } else {
             redisValue = JSONUtil.parse(redisValue).toBean(ArrayList.class);
@@ -122,7 +122,7 @@ public class AdminSysMenuController {
         if (redisValue == null) {
             redisValue = sysMenuService.adminListVisibleMenu();
             // 记录到缓存
-            String sysMenuCacheDuration = sysParamService.getParamValueByKey(SysConstant.PARAM_KEY_CACHE_MENU_DURATION, "30");
+            String sysMenuCacheDuration = sysParamService.getParamValueByName(SysConstant.PARAM_KEY_CACHE_MENU_DURATION, "30");
             stringRedisTemplate.opsForValue().set(redisKey, JSONUtil.toJsonStr(redisValue), Integer.parseInt(sysMenuCacheDuration), TimeUnit.MINUTES);
         } else {
             redisValue = JSONUtil.parse(redisValue).toBean(ArrayList.class);

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/controller/AdminSysParamController.java

@@ -33,7 +33,7 @@ import javax.validation.Valid;
 public class AdminSysParamController {
 
     private static final String PERMISSION_PREFIX = "SysParam:";
-    
+
     @Resource
     private SysParamService sysParamService;
 
@@ -49,7 +49,7 @@ public class AdminSysParamController {
     @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/{id}")
     public ApiResult<SysParamBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysParamService.getOneById(id));
+        return ApiResult.data(sysParamService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/controller/AdminSysRoleController.java

@@ -60,7 +60,7 @@ public class AdminSysRoleController {
     @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/{id}")
     public ApiResult<SysRoleBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysRoleService.getOneById(id));
+        return ApiResult.data(sysRoleService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/controller/AdminSysTenantController.java

@@ -35,7 +35,7 @@ import javax.validation.Valid;
 public class AdminSysTenantController {
 
     private static final String PERMISSION_PREFIX = "SysTenant:";
-    
+
     @Resource
     private SysTenantService sysTenantService;
 
@@ -51,7 +51,7 @@ public class AdminSysTenantController {
     @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/{id}")
     public ApiResult<SysTenantBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysTenantService.getOneById(id));
+        return ApiResult.data(sysTenantService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)

+ 4 - 3
src/main/java/cc/uncarbon/module/sys/controller/AdminSysUserController.java

@@ -9,6 +9,7 @@ import cc.uncarbon.framework.web.model.response.ApiResult;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.model.request.*;
 import cc.uncarbon.module.sys.model.response.SysUserBO;
+import cc.uncarbon.module.sys.model.response.VbenAdminUserInfoBO;
 import cc.uncarbon.module.sys.service.SysUserService;
 import cc.uncarbon.module.sys.util.AdminStpUtil;
 import cn.dev33.satoken.annotation.SaCheckLogin;
@@ -35,7 +36,7 @@ import javax.validation.Valid;
 public class AdminSysUserController {
 
     private static final String PERMISSION_PREFIX = "SysUser:";
-    
+
     @Resource
     private SysUserService sysUserService;
 
@@ -51,7 +52,7 @@ public class AdminSysUserController {
     @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/{id}")
     public ApiResult<SysUserBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysUserService.getOneById(id));
+        return ApiResult.data(sysUserService.getOneById(id, true, false));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
@@ -84,7 +85,7 @@ public class AdminSysUserController {
 
     @ApiOperation(value = "取当前用户信息", produces = MediaType.APPLICATION_JSON_VALUE)
     @GetMapping(value = "/info")
-    public ApiResult<?> getCurrentUserInfo() {
+    public ApiResult<VbenAdminUserInfoBO> getCurrentUserInfo() {
         return ApiResult.data(sysUserService.adminGetCurrentUserInfo());
     }
 

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/entity/SysDataDictEntity.java

@@ -19,7 +19,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/entity/SysDeptEntity.java

@@ -19,7 +19,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
@@ -38,7 +38,7 @@ public class SysDeptEntity extends HelioBaseEntity<Long> {
 	@TableField(value = "sort")
 	private Integer sort;
 
-	@ApiModelProperty(value = "状态(0=禁用 1=启用)")
+	@ApiModelProperty(value = "状态")
 	@TableField(value = "status")
 	private GenericStatusEnum status;
 

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/entity/SysLogEntity.java

@@ -19,7 +19,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data

+ 4 - 4
src/main/java/cc/uncarbon/module/sys/entity/SysMenuEntity.java

@@ -20,7 +20,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
@@ -35,7 +35,7 @@ public class SysMenuEntity extends HelioBaseEntity<Long> {
 	@TableField(value = "parent_id")
 	private Long parentId;
 
-	@ApiModelProperty(value = "菜单类型(参考MenuTypeEnum)")
+	@ApiModelProperty(value = "菜单类型")
 	@TableField(value = "type")
 	private SysMenuTypeEnum type;
 
@@ -51,11 +51,11 @@ public class SysMenuEntity extends HelioBaseEntity<Long> {
 	@TableField(value = "sort")
 	private Integer sort;
 
-	@ApiModelProperty(value = "状态(0=禁用 1=启用)")
+	@ApiModelProperty(value = "状态")
 	@TableField(value = "status")
 	private GenericStatusEnum status;
 
-	@ApiModelProperty(value = "组件", notes = "Vue项目中`/@/views/`的子路径; `LAYOUT`为空页面")
+	@ApiModelProperty(value = "组件(Vue项目中`/@/views/`后的路径部分; 填`LAYOUT`为空页面)")
 	@TableField(value = "component")
 	private String component;
 

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/entity/SysParamEntity.java

@@ -18,7 +18,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/entity/SysRoleEntity.java

@@ -18,7 +18,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/entity/SysRoleMenuRelationEntity.java

@@ -18,7 +18,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data

+ 6 - 2
src/main/java/cc/uncarbon/module/sys/entity/SysTenantEntity.java

@@ -19,7 +19,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
@@ -30,7 +30,7 @@ public class SysTenantEntity extends HelioBaseEntity<Long> {
     @TableField(value = "tenant_name")
     private String tenantName;
 
-    @ApiModelProperty(value = "状态(0=禁用 1=启用)")
+    @ApiModelProperty(value = "状态")
     @TableField(value = "status")
     private GenericStatusEnum status;
 
@@ -38,4 +38,8 @@ public class SysTenantEntity extends HelioBaseEntity<Long> {
     @TableField(value = "tenant_admin_user_id")
     private Long tenantAdminUserId;
 
+    @ApiModelProperty(value = "备注")
+    @TableField(value = "remark")
+    private String remark;
+
 }

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/entity/SysUserDeptRelationEntity.java

@@ -18,7 +18,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/entity/SysUserEntity.java

@@ -23,7 +23,7 @@ import java.time.LocalDateTime;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
@@ -47,7 +47,7 @@ public class SysUserEntity extends HelioBaseEntity<Long> {
 	@TableField(value = "nickname")
 	private String nickname;
 
-	@ApiModelProperty(value = "状态(0=正常 -1=封禁)")
+	@ApiModelProperty(value = "状态")
 	@TableField(value = "status")
 	private SysUserStatusEnum status;
 

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/entity/SysUserRoleRelationEntity.java

@@ -18,7 +18,7 @@ import lombok.experimental.SuperBuilder;
  */
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
-@SuperBuilder(toBuilder = true)
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data

+ 20 - 0
src/main/java/cc/uncarbon/module/sys/enums/GenericStatusEnum.java

@@ -8,6 +8,7 @@ import lombok.Getter;
 
 /**
  * 通用状态枚举类
+ *
  * @author Uncarbon
  */
 @AllArgsConstructor
@@ -29,4 +30,23 @@ public enum GenericStatusEnum implements HelioBaseEnum<Integer> {
     private final Integer value;
     private final String label;
 
+    /**
+     * 取反值
+     * @param old 原值
+     * @return 新值
+     */
+    public static GenericStatusEnum reverse(GenericStatusEnum old) {
+        if (old == null) {
+            return null;
+        }
+
+        switch (old) {
+            case DISABLED:
+                return GenericStatusEnum.ENABLED;
+            case ENABLED:
+                return GenericStatusEnum.DISABLED;
+        }
+
+        throw new IllegalArgumentException();
+    }
 }

+ 5 - 5
src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysDeptDTO.java

@@ -28,18 +28,18 @@ public class AdminInsertOrUpdateSysDeptDTO implements Serializable {
 
     @ApiModelProperty(value = "所属租户ID", hidden = true, notes = "仅新增时使用")
     private Long tenantId;
-        
+
     @ApiModelProperty(value = "名称", required = true)
     @NotBlank(message = "名称不能为空")
     private String title;
-        
+
     @ApiModelProperty(value = "上级ID(无上级节点设置为0)")
     private Long parentId;
-        
+
     @ApiModelProperty(value = "排序")
     private Integer sort;
 
-    @ApiModelProperty(value = "状态(0=禁用 1=启用)")
+    @ApiModelProperty(value = "状态")
     private GenericStatusEnum status;
-    
+
 }

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysMenuDTO.java

@@ -54,7 +54,7 @@ public class AdminInsertOrUpdateSysMenuDTO implements Serializable {
     @ApiModelProperty(value = "排序")
     private Integer sort;
 
-    @ApiModelProperty(value = "状态(0=禁用 1=启用)")
+    @ApiModelProperty(value = "状态")
     private GenericStatusEnum status;
 
     @ApiModelProperty(value = "外链地址")

+ 0 - 3
src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysParamDTO.java

@@ -25,9 +25,6 @@ public class AdminInsertOrUpdateSysParamDTO implements Serializable {
     @ApiModelProperty(value = "主键ID", hidden = true, notes = "仅更新时使用")
     private Long id;
 
-    @ApiModelProperty(value = "所属租户ID", hidden = true, notes = "仅新增时使用")
-    private Long tenantId;
-
     @ApiModelProperty(value = "键名", required = true)
     @NotBlank(message = "键名不能为空")
     private String name;

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysUserDTO.java

@@ -44,11 +44,11 @@ public class AdminInsertOrUpdateSysUserDTO implements Serializable {
     @NotBlank(message = "昵称不能为空")
     private String nickname;
 
-    @ApiModelProperty(value = "状态", dataType = "Integer", required = true)
+    @ApiModelProperty(value = "状态", required = true)
     @NotNull(message = "状态不能为空")
     private SysUserStatusEnum status;
 
-    @ApiModelProperty(value = "性别", dataType = "Integer", required = true)
+    @ApiModelProperty(value = "性别", required = true)
     @NotNull(message = "性别不能为空")
     private GenderEnum gender;
 

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysLogDTO.java

@@ -35,12 +35,12 @@ public class AdminListSysLogDTO implements Serializable {
     @ApiModelProperty(value = "状态")
     private SysLogStatusEnum status;
 
-    @ApiModelProperty(value = "开始时间区间")
+    @ApiModelProperty(value = "时间区间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT, timezone = HelioConstant.Jackson.TIME_ZONE)
     @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime beginAt;
 
-    @ApiModelProperty(value = "结束时间区间")
+    @ApiModelProperty(value = "时间区间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT, timezone = HelioConstant.Jackson.TIME_ZONE)
     @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime endAt;

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysRoleDTO.java

@@ -31,12 +31,12 @@ public class AdminListSysRoleDTO implements Serializable {
     @ApiModelProperty(value = "值(关键词)")
     private String value;
 
-    @ApiModelProperty(value = "开始时间区间")
+    @ApiModelProperty(value = "时间区间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT, timezone = HelioConstant.Jackson.TIME_ZONE)
     @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime beginAt;
 
-    @ApiModelProperty(value = "结束时间区间")
+    @ApiModelProperty(value = "时间区间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT, timezone = HelioConstant.Jackson.TIME_ZONE)
     @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime endAt;

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysTenantDTO.java

@@ -35,12 +35,12 @@ public class AdminListSysTenantDTO implements Serializable {
     @ApiModelProperty(value = "状态")
     private GenericStatusEnum status;
 
-    @ApiModelProperty(value = "开始时间区间")
+    @ApiModelProperty(value = "时间区间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT, timezone = HelioConstant.Jackson.TIME_ZONE)
     @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime beginAt;
 
-    @ApiModelProperty(value = "结束时间区间")
+    @ApiModelProperty(value = "时间区间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT, timezone = HelioConstant.Jackson.TIME_ZONE)
     @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime endAt;

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysUserDTO.java

@@ -28,12 +28,12 @@ public class AdminListSysUserDTO implements Serializable {
     @ApiModelProperty(value = "手机号(关键词)")
     private String phoneNo;
 
-    @ApiModelProperty(value = "开始时间区间")
+    @ApiModelProperty(value = "时间区间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT, timezone = HelioConstant.Jackson.TIME_ZONE)
     @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime beginAt;
 
-    @ApiModelProperty(value = "结束时间区间")
+    @ApiModelProperty(value = "时间区间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT, timezone = HelioConstant.Jackson.TIME_ZONE)
     @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime endAt;

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/SysUserLoginDTO.java

@@ -25,12 +25,12 @@ import java.io.Serializable;
 public class SysUserLoginDTO implements Serializable {
 
     @ApiModelProperty(value = "账号", required = true)
-    @Size(min = 5, max = 16, message = "账号须为5-16位")
+    @Size(min = 5, max = 16, message = "【账号】长度须在 5 至 16 位之间")
     @NotBlank(message = "账号不能为空")
     private String username;
 
     @ApiModelProperty(value = "密码", required = true)
-    @Size(min = 5, max = 64, message = "密码须为5-64位")
+    @Size(min = 5, max = 64, message = "【密码】长度须在 5 至 16 位之间")
     @NotBlank(message = "密码不能为空")
     private String password;
 

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/model/response/SysDeptBO.java

@@ -51,7 +51,7 @@ public class SysDeptBO implements Serializable {
     @ApiModelProperty(value = "排序")
     private Integer sort;
 
-    @ApiModelProperty(value = "状态(0=禁用 1=启用)")
+    @ApiModelProperty(value = "状态")
     private GenericStatusEnum status;
 
     @ApiModelProperty(value = "子项数据")

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/model/response/SysLogBO.java

@@ -42,7 +42,7 @@ public class SysLogBO implements Serializable {
     @ApiModelProperty(value = "IP地址")
     private String ip;
 
-    @ApiModelProperty(value = "状态(0=未执行 1=成功)")
+    @ApiModelProperty(value = "状态")
     private SysLogStatusEnum status;
 
 }

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/response/SysMenuBO.java

@@ -49,7 +49,7 @@ public class SysMenuBO implements Serializable {
     @ApiModelProperty(value = "上级菜单ID")
     private Long parentId;
 
-    @ApiModelProperty(value = "菜单类型(参考MenuTypeEnum)")
+    @ApiModelProperty(value = "菜单类型")
     private SysMenuTypeEnum type;
 
     @ApiModelProperty(value = "权限标识")
@@ -61,7 +61,7 @@ public class SysMenuBO implements Serializable {
     @ApiModelProperty(value = "排序")
     private Integer sort;
 
-    @ApiModelProperty(value = "状态(0=禁用 1=启用)")
+    @ApiModelProperty(value = "状态")
     private GenericStatusEnum status;
 
     @ApiModelProperty(value = "组件")

+ 4 - 0
src/main/java/cc/uncarbon/module/sys/model/response/VbenAdminUserInfoBO.java

@@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 
 
 /**
@@ -29,4 +30,7 @@ public class VbenAdminUserInfoBO implements Serializable {
     @ApiModelProperty(value = "昵称")
     private String nickname;
 
+    @ApiModelProperty(value = "最后登录时刻")
+    private LocalDateTime lastLoginAt;
+
 }

+ 30 - 7
src/main/java/cc/uncarbon/module/sys/service/SysDataDictService.java

@@ -16,13 +16,13 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-
 
 /**
  * 数据字典
@@ -52,10 +52,26 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
 
     /**
      * 通用-详情
+     *
+     * @deprecated 使用 getOneById(java.lang.Long, boolean) 替代
      */
-    public SysDataDictBO getOneById(Long entityId) {
+    @Deprecated
+    public SysDataDictBO getOneById(Long entityId) throws BusinessException {
+       return this.getOneById(entityId, true);
+    }
+
+    /**
+     * 通用-详情
+     *
+     * @param entityId 实体类主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @return null or BO
+     */
+    public SysDataDictBO getOneById(Long entityId, boolean throwIfInvalidId) throws BusinessException {
         SysDataDictEntity entity = this.getById(entityId);
-        SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (throwIfInvalidId) {
+            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        }
 
         return this.entity2BO(entity);
     }
@@ -66,6 +82,7 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
     @SysLog(value = "新增数据字典")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysDataDictDTO dto) {
+        log.info("[后台管理-新增数据字典] >> DTO={}", dto);
         this.checkExistence(dto);
 
         dto.setId(null);
@@ -83,6 +100,7 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
     @SysLog(value = "编辑数据字典")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysDataDictDTO dto) {
+        log.info("[后台管理-编辑数据字典] >> DTO={}", dto);
         this.checkExistence(dto);
 
         SysDataDictEntity entity = new SysDataDictEntity();
@@ -96,7 +114,8 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
      */
     @SysLog(value = "删除数据字典")
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(List<Long> ids) {
+    public void adminDelete(Collection<Long> ids) {
+        log.info("[后台管理-删除数据字典] >> ids={}", ids);
         this.removeByIds(ids);
     }
 
@@ -145,12 +164,16 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
     private void checkExistence(AdminInsertOrUpdateSysDataDictDTO dto) {
         SysDataDictEntity existingEntity = this.getOne(
                 new QueryWrapper<SysDataDictEntity>()
-                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
+                        // 仅取主键ID
+                        .select(SysDataDictEntity::getId)
+                        // 驼峰式键名相同
                         .eq(SysDataDictEntity::getCamelCaseKey, dto.getCamelCaseKey())
                         .or()
+                        // 或帕斯卡式键名相同
                         .eq(SysDataDictEntity::getPascalCaseKey, dto.getPascalCaseKey())
                         .or()
+                        // 或下划线式键名相同
                         .eq(SysDataDictEntity::getUnderCaseKey, dto.getUnderCaseKey())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );

+ 35 - 11
src/main/java/cc/uncarbon/module/sys/service/SysDeptService.java

@@ -17,17 +17,18 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import javax.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-
 
 /**
  * 部门
+ *
  * @author Uncarbon
  */
 @Slf4j
@@ -46,7 +47,8 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
                 new QueryWrapper<SysDeptEntity>()
                         .lambda()
                         // 名称
-                        .like(StrUtil.isNotBlank(dto.getTitle()), SysDeptEntity::getTitle, StrUtil.cleanBlank(dto.getTitle()))
+                        .like(StrUtil.isNotBlank(dto.getTitle()), SysDeptEntity::getTitle,
+                                StrUtil.cleanBlank(dto.getTitle()))
                         // 上级ID
                         .eq(ObjectUtil.isNotNull(dto.getParentId()), SysDeptEntity::getParentId, dto.getParentId())
                         // 排序
@@ -58,10 +60,26 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
 
     /**
      * 通用-详情
+     *
+     * @deprecated 使用 getOneById(java.lang.Long, boolean) 替代
      */
-    public SysDeptBO getOneById(Long entityId) {
+    @Deprecated
+    public SysDeptBO getOneById(Long entityId) throws BusinessException {
+        return this.getOneById(entityId, true);
+    }
+
+    /**
+     * 通用-详情
+     *
+     * @param entityId         实体类主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @return null or BO
+     */
+    public SysDeptBO getOneById(Long entityId, boolean throwIfInvalidId) throws BusinessException {
         SysDeptEntity entity = this.getById(entityId);
-        SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (throwIfInvalidId) {
+            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        }
 
         return this.entity2BO(entity, false);
     }
@@ -72,6 +90,7 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
     @SysLog(value = "新增部门")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysDeptDTO dto) {
+        log.info("[后台管理-新增部门] >> DTO={}", dto);
         this.checkExistence(dto);
 
         if (ObjectUtil.isNull(dto.getParentId())) {
@@ -93,6 +112,7 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
     @SysLog(value = "编辑部门")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysDeptDTO dto) {
+        log.info("[后台管理-编辑部门] >> DTO={}", dto);
         this.checkExistence(dto);
 
         if (ObjectUtil.isNull(dto.getParentId())) {
@@ -110,12 +130,14 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
      */
     @SysLog(value = "删除部门")
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(List<Long> ids) {
+    public void adminDelete(Collection<Long> ids) {
+        log.info("[后台管理-删除部门] >> ids={}", ids);
         this.removeByIds(ids);
     }
 
     /**
      * 取所属部门简易信息
+     *
      * @param userId 用户ID
      */
     public SysDeptBO getPlainDeptByUserId(Long userId) {
@@ -134,7 +156,7 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
         return this.entity2BO(entity, false);
     }
 
-    
+
     /*
     私有方法
     ------------------------------------------------------------------------------------------------
@@ -182,14 +204,16 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
 
     /**
      * 检查是否已存在相同数据
-     * 
+     *
      * @param dto DTO
      */
     private void checkExistence(AdminInsertOrUpdateSysDeptDTO dto) {
         SysDeptEntity existingEntity = this.getOne(
                 new QueryWrapper<SysDeptEntity>()
-                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
+                        // 仅取主键ID
+                        .select(SysDeptEntity::getId)
+                        // 名称相同
                         .eq(SysDeptEntity::getTitle, dto.getTitle())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );

+ 20 - 4
src/main/java/cc/uncarbon/module/sys/service/SysLogService.java

@@ -1,5 +1,6 @@
 package cc.uncarbon.module.sys.service;
 
+import cc.uncarbon.framework.core.exception.BusinessException;
 import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.crud.service.impl.HelioBaseServiceImpl;
@@ -53,17 +54,32 @@ public class SysLogService extends HelioBaseServiceImpl<SysLogMapper, SysLogEnti
 
     /**
      * 通用-详情
+     *
+     * @deprecated 使用 getOneById(java.lang.Long, boolean) 替代
      */
-    public SysLogBO getOneById(Long entityId) {
+    @Deprecated
+    public SysLogBO getOneById(Long entityId) throws BusinessException {
+       return this.getOneById(entityId, true);
+    }
+
+    /**
+     * 通用-详情
+     *
+     * @param entityId 实体类主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @return null or BO
+     */
+    public SysLogBO getOneById(Long entityId, boolean throwIfInvalidId) throws BusinessException {
         SysLogEntity entity = this.getById(entityId);
-        SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (throwIfInvalidId) {
+            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        }
 
         return this.entity2BO(entity);
     }
 
 
 
-
     /*
     私有方法
     ------------------------------------------------------------------------------------------------
@@ -100,4 +116,4 @@ public class SysLogService extends HelioBaseServiceImpl<SysLogMapper, SysLogEnti
         return ret;
     }
 
-}
+}

+ 37 - 17
src/main/java/cc/uncarbon/module/sys/service/SysMenuService.java

@@ -22,16 +22,16 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
+import javax.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 
 /**
@@ -76,10 +76,26 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
 
     /**
      * 通用-详情
+     *
+     * @deprecated 使用 getOneById(java.lang.Long, boolean) 替代
      */
-    public SysMenuBO getOneById(Long entityId) {
+    @Deprecated
+    public SysMenuBO getOneById(Long entityId) throws BusinessException {
+        return this.getOneById(entityId, true);
+    }
+
+    /**
+     * 通用-详情
+     *
+     * @param entityId 实体类主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @return null or BO
+     */
+    public SysMenuBO getOneById(Long entityId, boolean throwIfInvalidId) throws BusinessException {
         SysMenuEntity entity = this.getById(entityId);
-        SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (throwIfInvalidId) {
+            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        }
 
         return this.entity2BO(entity, false, null);
     }
@@ -91,6 +107,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
     @SysLog(value = "新增后台菜单")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysMenuDTO dto) {
+        log.info("[后台管理-新增后台菜单] >> DTO={}", dto);
         this.checkExistence(dto);
 
         if (ObjectUtil.isNull(dto.getParentId())) {
@@ -113,6 +130,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
     @SysLog(value = "编辑后台菜单")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysMenuDTO dto) {
+        log.info("[后台管理-编辑后台菜单] >> DTO={}", dto);
         this.checkExistence(dto);
 
         if (ObjectUtil.isNull(dto.getParentId())) {
@@ -130,7 +148,8 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
      */
     @SysLog(value = "删除后台菜单")
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(List<Long> ids) {
+    public void adminDelete(Collection<Long> ids) {
+        log.info("[后台管理-删除后台菜单] >> ids={}", ids);
         this.removeByIds(ids);
     }
 
@@ -144,7 +163,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
 
         // 超级管理员直接允许所有权限
         if (roleIds.contains(SysConstant.SUPER_ADMIN_ROLE_ID)) {
-            return this.list().stream().map(SysMenuEntity::getPermission).collect(Collectors.toList());
+            return this.list().stream().map(SysMenuEntity::getPermission).filter(StrUtil::isNotEmpty).distinct().collect(Collectors.toList());
         }
 
         List<Long> menuIds = sysRoleMenuRelationService.listMenuIdByRoleIds(roleIds);
@@ -155,11 +174,10 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
 
         return this.list(
                 new QueryWrapper<SysMenuEntity>()
-                        .select(" DISTINCT permission ")
                         .lambda()
+                        .select(SysMenuEntity::getPermission)
                         .in(SysMenuEntity::getId, menuIds)
-                        .ne(SysMenuEntity::getPermission, "")
-        ).stream().map(SysMenuEntity::getPermission).collect(Collectors.toList());
+        ).stream().map(SysMenuEntity::getPermission).filter(StrUtil::isNotEmpty).distinct().collect(Collectors.toList());
     }
 
     /**
@@ -268,7 +286,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
             stringRedisTemplate.delete(keys);
         }
     }
-    
+
 
     /*
     私有方法
@@ -300,7 +318,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
                                 .build()
                 );
 
-        // 这里是兼容JDK8的写法,使用JDK15可使用语法糖免写break
+        // 这里是兼容 JDK8 的写法,使用较高 JDK 版本可使用语法糖
         switch (bo.getType()) {
             case DIR:
             case BUTTON: {
@@ -446,7 +464,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
 
     /**
      * 检查是否已存在相同数据
-     * 
+     *
      * @param dto DTO
      */
     private void checkExistence(AdminInsertOrUpdateSysMenuDTO dto) {
@@ -455,8 +473,10 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
 
             SysMenuEntity existingEntity = this.getOne(
                     new QueryWrapper<SysMenuEntity>()
-                            .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                             .lambda()
+                            // 仅取主键ID
+                            .select(SysMenuEntity::getId)
+                            // 权限标识相同
                             .eq(SysMenuEntity::getPermission, dto.getPermission())
                             .last(HelioConstant.CRUD.SQL_LIMIT_1)
             );

+ 40 - 16
src/main/java/cc/uncarbon/module/sys/service/SysParamService.java

@@ -16,16 +16,17 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-
 
 /**
  * 系统参数
+ *
  * @author Uncarbon
  */
 @Slf4j
@@ -53,10 +54,26 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
 
     /**
      * 通用-详情
+     *
+     * @deprecated 使用 getOneById(java.lang.Long, boolean) 替代
+     */
+    @Deprecated
+    public SysParamBO getOneById(Long entityId) throws BusinessException {
+        return this.getOneById(entityId, true);
+    }
+
+    /**
+     * 通用-详情
+     *
+     * @param entityId 实体类主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @return null or BO
      */
-    public SysParamBO getOneById(Long entityId) {
+    public SysParamBO getOneById(Long entityId, boolean throwIfInvalidId) throws BusinessException {
         SysParamEntity entity = this.getById(entityId);
-        SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (throwIfInvalidId) {
+            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        }
 
         return this.entity2BO(entity);
     }
@@ -67,6 +84,7 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
     @SysLog(value = "新增系统参数")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysParamDTO dto) {
+        log.info("[后台管理-新增系统参数] >> DTO={}", dto);
         this.checkExistence(dto);
 
         dto.setId(null);
@@ -84,6 +102,7 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
     @SysLog(value = "编辑系统参数")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysParamDTO dto) {
+        log.info("[后台管理-编辑系统参数] >> DTO={}", dto);
         this.checkExistence(dto);
 
         SysParamEntity entity = new SysParamEntity();
@@ -97,21 +116,23 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
      */
     @SysLog(value = "删除系统参数")
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(List<Long> ids) {
+    public void adminDelete(Collection<Long> ids) {
+        log.info("[后台管理-删除系统参数] >> ids={}", ids);
         this.removeByIds(ids);
     }
 
     /**
      * 根据键名取值
-     * @param key 键名
-     * @return 成功返回值, 失败返回null
+     *
+     * @param name 键名
+     * @return 成功返回键值,失败返回null
      */
-    public String getParamValueByKey(String key) {
+    public String getParamValueByName(String name) {
         SysParamEntity sysParamEntity = this.getOne(
                 new QueryWrapper<SysParamEntity>()
-                        .select(" value ")
                         .lambda()
-                        .eq(SysParamEntity::getName, key)
+                        .select(SysParamEntity::getValue)
+                        .eq(SysParamEntity::getName, name)
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );
         if (sysParamEntity == null) {
@@ -124,12 +145,12 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
     /**
      * 根据键名取值
      *
-     * @param key          键名
+     * @param name         键名
      * @param defaultValue 默认值
-     * @return 成功返回值, 失败返回defaultValue
+     * @return 成功返回键值,失败返回defaultValue
      */
-    public String getParamValueByKey(String key, String defaultValue) {
-        String value = this.getParamValueByKey(key);
+    public String getParamValueByName(String name, String defaultValue) {
+        String value = this.getParamValueByName(name);
         if (value == null) {
             return defaultValue;
         }
@@ -177,10 +198,13 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
     private void checkExistence(AdminInsertOrUpdateSysParamDTO dto) {
         SysParamEntity existingEntity = this.getOne(
                 new QueryWrapper<SysParamEntity>()
-                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
+                        // 仅取主键ID
+                        .select(SysParamEntity::getId)
+                        // 描述相同
                         .eq(SysParamEntity::getDescription, dto.getDescription())
                         .or()
+                        // 或键名相同
                         .eq(SysParamEntity::getName, dto.getName())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );

+ 30 - 9
src/main/java/cc/uncarbon/module/sys/service/SysRoleService.java

@@ -18,14 +18,14 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import javax.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-
 
 /**
  * 后台角色
@@ -65,10 +65,26 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
 
     /**
      * 通用-详情
+     *
+     * @deprecated 使用 getOneById(java.lang.Long, boolean) 替代
      */
-    public SysRoleBO getOneById(Long entityId) {
+    @Deprecated
+    public SysRoleBO getOneById(Long entityId) throws BusinessException {
+        return this.getOneById(entityId, true);
+    }
+
+    /**
+     * 通用-详情
+     *
+     * @param entityId 实体类主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @return null or BO
+     */
+    public SysRoleBO getOneById(Long entityId, boolean throwIfInvalidId) throws BusinessException {
         SysRoleEntity entity = this.getById(entityId);
-        SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (throwIfInvalidId) {
+            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        }
 
         return this.entity2BO(entity);
     }
@@ -80,6 +96,7 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
     @SysLog(value = "新增后台角色")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysRoleDTO dto) {
+        log.info("[后台管理-新增后台角色] >> DTO={}", dto);
         this.checkExistence(dto);
 
         dto.setId(null);
@@ -99,6 +116,7 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
     @SysLog(value = "编辑后台角色")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysRoleDTO dto) {
+        log.info("[后台管理-编辑后台角色] >> DTO={}", dto);
         this.checkExistence(dto);
 
         SysRoleEntity entity = new SysRoleEntity();
@@ -114,7 +132,8 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
      */
     @SysLog(value = "删除后台角色")
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(List<Long> ids) {
+    public void adminDelete(Collection<Long> ids) {
+        log.info("[后台管理-删除后台角色] >> ids={}", ids);
         this.removeByIds(ids);
     }
 
@@ -177,14 +196,16 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
 
     /**
      * 检查是否已存在相同数据
-     * 
+     *
      * @param dto DTO
      */
     private void checkExistence(AdminInsertOrUpdateSysRoleDTO dto) {
         SysRoleEntity existingEntity = this.getOne(
                 new QueryWrapper<SysRoleEntity>()
-                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
+                        // 仅取主键ID
+                        .select(SysRoleEntity::getId)
+                        // 名称相同
                         .eq(SysRoleEntity::getTitle, dto.getTitle())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );

+ 37 - 11
src/main/java/cc/uncarbon/module/sys/service/SysTenantService.java

@@ -11,21 +11,25 @@ import cc.uncarbon.module.sys.entity.SysTenantEntity;
 import cc.uncarbon.module.sys.entity.SysUserRoleRelationEntity;
 import cc.uncarbon.module.sys.enums.SysErrorEnum;
 import cc.uncarbon.module.sys.mapper.SysTenantMapper;
-import cc.uncarbon.module.sys.model.request.*;
+import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysRoleDTO;
+import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysUserDTO;
+import cc.uncarbon.module.sys.model.request.AdminInsertSysTenantDTO;
+import cc.uncarbon.module.sys.model.request.AdminListSysTenantDTO;
+import cc.uncarbon.module.sys.model.request.AdminUpdateSysTenantDTO;
 import cc.uncarbon.module.sys.model.response.SysTenantBO;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import javax.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 
 /**
@@ -71,10 +75,26 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
 
     /**
      * 通用-详情
+     *
+     * @deprecated 使用 getOneById(java.lang.Long, boolean) 替代
      */
-    public SysTenantBO getOneById(Long entityId) {
+    @Deprecated
+    public SysTenantBO getOneById(Long entityId) throws BusinessException {
+        return this.getOneById(entityId, true);
+    }
+
+    /**
+     * 通用-详情
+     *
+     * @param entityId 实体类主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @return null or BO
+     */
+    public SysTenantBO getOneById(Long entityId, boolean throwIfInvalidId) throws BusinessException {
         SysTenantEntity entity = this.getById(entityId);
-        SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (throwIfInvalidId) {
+            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        }
 
         return this.entity2BO(entity);
     }
@@ -85,6 +105,7 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
     @SysLog(value = "新增系统租户")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertSysTenantDTO dto) {
+        log.info("[后台管理-新增系统租户] >> DTO={}", dto);
         this.checkExistence(dto);
 
         // 1. 加入一个新租户(tenant)
@@ -152,6 +173,7 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
     @SysLog(value = "编辑系统租户")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminUpdateSysTenantDTO dto) {
+        log.info("[后台管理-编辑系统租户] >> DTO={}", dto);
         this.checkExistence(dto);
 
         SysTenantEntity entity = new SysTenantEntity();
@@ -165,7 +187,8 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
      */
     @SysLog(value = "删除系统租户")
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(List<Long> ids) {
+    public void adminDelete(Collection<Long> ids) {
+        log.info("[后台管理-删除系统租户] >> ids={}", ids);
         this.removeByIds(ids);
     }
 
@@ -231,16 +254,19 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
 
     /**
      * 检查是否已存在相同数据
-     * 
+     *
      * @param dto DTO
      */
     private void checkExistence(AdminUpdateSysTenantDTO dto) {
         SysTenantEntity existingEntity = this.getOne(
                 new QueryWrapper<SysTenantEntity>()
-                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
+                        // 仅取主键ID
+                        .select(SysTenantEntity::getId)
+                        // 租户ID相同
                         .eq(SysTenantEntity::getTenantId, dto.getTenantId())
                         .or()
+                        // 或租户名相同
                         .eq(SysTenantEntity::getTenantName, dto.getTenantName())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );

+ 3 - 3
src/main/java/cc/uncarbon/module/sys/service/SysUserRoleRelationService.java

@@ -55,8 +55,8 @@ public class SysUserRoleRelationService extends HelioBaseServiceImpl<SysUserRole
 
         return this.list(
                 new QueryWrapper<SysUserRoleRelationEntity>()
-                        .select(" user_id ")
                         .lambda()
+                        .select(SysUserRoleRelationEntity::getUserId)
                         .in(SysUserRoleRelationEntity::getRoleId, roleIds)
         ).stream().map(SysUserRoleRelationEntity::getUserId).collect(Collectors.toList());
     }
@@ -73,9 +73,9 @@ public class SysUserRoleRelationService extends HelioBaseServiceImpl<SysUserRole
 
         return this.list(
                 new QueryWrapper<SysUserRoleRelationEntity>()
-                        .select(" role_id ")
                         .lambda()
+                        .select(SysUserRoleRelationEntity::getRoleId)
                         .eq(SysUserRoleRelationEntity::getUserId, userId)
         ).stream().map(SysUserRoleRelationEntity::getRoleId).collect(Collectors.toList());
     }
-}
+}

+ 46 - 15
src/main/java/cc/uncarbon/module/sys/service/SysUserService.java

@@ -13,8 +13,19 @@ import cc.uncarbon.module.sys.enums.GenericStatusEnum;
 import cc.uncarbon.module.sys.enums.SysErrorEnum;
 import cc.uncarbon.module.sys.enums.SysUserStatusEnum;
 import cc.uncarbon.module.sys.mapper.SysUserMapper;
-import cc.uncarbon.module.sys.model.request.*;
-import cc.uncarbon.module.sys.model.response.*;
+import cc.uncarbon.module.sys.model.request.AdminBindUserRoleRelationDTO;
+import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysUserDTO;
+import cc.uncarbon.module.sys.model.request.AdminListSysUserDTO;
+import cc.uncarbon.module.sys.model.request.AdminResetSysUserPasswordDTO;
+import cc.uncarbon.module.sys.model.request.AdminUpdateCurrentSysUserPasswordDTO;
+import cc.uncarbon.module.sys.model.request.SysUserLoginDTO;
+import cc.uncarbon.module.sys.model.response.SysDeptBO;
+import cc.uncarbon.module.sys.model.response.SysRoleBO;
+import cc.uncarbon.module.sys.model.response.SysTenantBO;
+import cc.uncarbon.module.sys.model.response.SysUserBO;
+import cc.uncarbon.module.sys.model.response.SysUserBaseInfoBO;
+import cc.uncarbon.module.sys.model.response.SysUserLoginBO;
+import cc.uncarbon.module.sys.model.response.VbenAdminUserInfoBO;
 import cc.uncarbon.module.sys.util.PwdUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
@@ -23,15 +34,14 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.Objects;
 import java.util.stream.Collectors;
+import javax.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 
 /**
@@ -80,12 +90,29 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
 
     /**
      * 通用-详情
+     *
+     * @deprecated 使用 getOneById(java.lang.Long, boolean, boolean) 替代
      */
-    public SysUserBO getOneById(Long entityId) {
+    @Deprecated
+    public SysUserBO getOneById(Long entityId) throws BusinessException {
+        return this.getOneById(entityId, true, false);
+    }
+
+    /**
+     * 通用-详情
+     *
+     * @param entityId 实体类主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @param joinFullRolesAndPermissions 是否显示完整角色和权限信息
+     * @return null or BO
+     */
+    public SysUserBO getOneById(Long entityId, boolean throwIfInvalidId, boolean joinFullRolesAndPermissions) throws BusinessException {
         SysUserEntity entity = this.getById(entityId);
-        SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (throwIfInvalidId) {
+            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        }
 
-        return this.entity2BO(entity, true);
+        return this.entity2BO(entity, joinFullRolesAndPermissions);
     }
 
     /**
@@ -95,6 +122,7 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
     @SysLog(value = "新增后台用户")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysUserDTO dto) {
+        log.info("[后台管理-新增后台用户] >> DTO={}", dto);
         this.checkExistence(dto);
 
         dto.setId(null);
@@ -121,6 +149,7 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
     @SysLog(value = "编辑后台用户")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysUserDTO dto) {
+        log.info("[后台管理-编辑后台用户] >> DTO={}", dto);
         this.checkExistence(dto);
 
         SysUserEntity updateEntity = new SysUserEntity();
@@ -136,7 +165,8 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
      */
     @SysLog(value = "删除后台用户")
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(List<Long> ids) {
+    public void adminDelete(Collection<Long> ids) {
+        log.info("[后台管理-删除后台用户] >> ids={}", ids);
         this.removeByIds(ids);
     }
 
@@ -191,7 +221,7 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
 
 
         // 取账号完整BO
-        SysUserBO sysUserBO = this.getOneById(sysUserEntity.getId());
+        SysUserBO sysUserBO = this.getOneById(sysUserEntity.getId(), true, true);
 
         SysUserLoginBO ret = new SysUserLoginBO();
         BeanUtil.copyProperties(sysUserBO, ret);
@@ -211,10 +241,11 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
      * 后台管理-取当前用户信息
      */
     public VbenAdminUserInfoBO adminGetCurrentUserInfo() {
-        SysUserBO sysUserBO = getOneById(UserContextHolder.getUserId());
+        SysUserBO sysUserBO = this.getOneById(UserContextHolder.getUserId(), true, false);
         return VbenAdminUserInfoBO.builder()
                 .username(sysUserBO.getUsername())
                 .nickname(sysUserBO.getNickname())
+                .lastLoginAt(sysUserBO.getLastLoginAt())
                 .build();
     }
 
@@ -328,7 +359,7 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
 
     /**
      * 检查是否已存在相同数据
-     * 
+     *
      * @param dto DTO
      */
     private void checkExistence(AdminInsertOrUpdateSysUserDTO dto) {

+ 6 - 3
src/main/resources/application.yml

@@ -27,6 +27,7 @@ helio:
       # 是否开启租户
       enabled: true
       ignored-tables:
+        # 以下表不参与租户隔离
         - sys_menu
         - sys_tenant
         - sys_role_menu_relation
@@ -34,15 +35,16 @@ helio:
         - sys_user_role_relation
     optimistic-lock:
       # 是否开启乐观锁
-      enabled: false
+      enabled: true
   security:
     exclude-routes:
+      # 放行路由, 不进行登录校验
       # 图标
       - /favicon.ico
       # Swagger API文档接口
       - /v2/api-docs
       - /v3/api-docs
-      # App-放行接口
+      # C端登录接口
       - /app/api/v1/auth/login
 
 
@@ -66,9 +68,10 @@ mybatis-plus:
 
 logging:
   level:
-    # 分别指定脚手架、业务模块的日志级别
+    # 分别指定脚手架、业务模块、单元测试的日志级别
     cc.uncarbon.framework: DEBUG
     cc.uncarbon.module: DEBUG
+    cc.uncarbon.test: DEBUG
 
 sa-token:
   # token名称

+ 26 - 41
src/main/resources/logback-spring.xml

@@ -4,9 +4,9 @@
     <!-- 配置-彩色日志渲染类 -->
     <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
     <conversionRule conversionWord="wex"
-                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+            converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
     <conversionRule conversionWord="wEx"
-                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+            converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
 
     <!-- 常量-项目名称 -->
     <property name="APP_NAME" value="helio-boot"/>
@@ -18,7 +18,7 @@
     <property name="LOG_MAX_SIZE" value="100MB"/>
     <!-- 常量-文件型日志输出格式 -->
     <property name="LOG_FILE_OUTPUT_PATTERN"
-              value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5level [%10thread] [%X{tid}] %40.40logger{40} [%10method,%line] : %msg%n"/>
+            value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5level [%10thread] [%X{tid}] %40.40logger{40} [%10method,%line] : %msg%n"/>
 
     <!-- 控制台输出 -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
@@ -35,9 +35,11 @@
             <OnMismatch>DENY</OnMismatch>
             <OnMatch>ACCEPT</OnMatch>
         </filter>
+        <!-- 今日日志 -->
+        <File>${LOG_HOME}/${APP_NAME}.today-debug.log</File>
         <!-- 日志滚动策略 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志文件输出文件名 -->
+            <!-- 历史日志输出文件名 -->
             <FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}-debug.log</FileNamePattern>
             <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
         </rollingPolicy>
@@ -68,9 +70,11 @@
             <OnMismatch>DENY</OnMismatch>
             <OnMatch>ACCEPT</OnMatch>
         </filter>
+        <!-- 今日日志 -->
+        <File>${LOG_HOME}/${APP_NAME}.today-warn.log</File>
         <!-- 日志滚动策略 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志文件输出文件名 -->
+            <!-- 历史日志输出文件名 -->
             <FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}-warn.log</FileNamePattern>
             <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
         </rollingPolicy>
@@ -101,9 +105,11 @@
             <OnMismatch>DENY</OnMismatch>
             <OnMatch>ACCEPT</OnMatch>
         </filter>
+        <!-- 今日日志 -->
+        <File>${LOG_HOME}/${APP_NAME}.today-info.log</File>
         <!-- 日志滚动策略 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志文件输出文件名 -->
+            <!-- 历史日志输出文件名 -->
             <FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}-info.log</FileNamePattern>
             <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
         </rollingPolicy>
@@ -134,9 +140,11 @@
             <OnMismatch>DENY</OnMismatch>
             <OnMatch>ACCEPT</OnMatch>
         </filter>
+        <!-- 今日日志 -->
+        <File>${LOG_HOME}/${APP_NAME}.today-error.log</File>
         <!-- 日志滚动策略 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志文件输出文件名 -->
+            <!-- 历史日志输出文件名 -->
             <FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}-error.log</FileNamePattern>
             <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
         </rollingPolicy>
@@ -163,37 +171,14 @@
 
     <logger name="io.undertow" level="WARN"/>
     <logger name="com.alibaba.nacos" level="INFO"/>
-
-    <!-- 开发环境-未指定包名的日志使用WARN级别 -->
-    <springProfile name="dev">
-        <root level="WARN">
-            <appender-ref ref="STDOUT"/>
-            <appender-ref ref="ASYNC_DEBUG" />
-            <appender-ref ref="ASYNC_INFO" />
-            <appender-ref ref="ASYNC_WARN" />
-            <appender-ref ref="ASYNC_ERROR" />
-        </root>
-    </springProfile>
-
-    <!-- 测试环境-未指定包名的日志使用WARN级别 -->
-    <springProfile name="test">
-        <root level="WARN">
-            <appender-ref ref="STDOUT"/>
-            <appender-ref ref="ASYNC_DEBUG" />
-            <appender-ref ref="ASYNC_INFO" />
-            <appender-ref ref="ASYNC_WARN" />
-            <appender-ref ref="ASYNC_ERROR" />
-        </root>
-    </springProfile>
-
-    <!-- 生产环境-未指定包名的日志使用INFO级别 -->
-    <springProfile name="prod">
-        <root level="INFO">
-            <appender-ref ref="STDOUT"/>
-            <appender-ref ref="ASYNC_DEBUG" />
-            <appender-ref ref="ASYNC_INFO" />
-            <appender-ref ref="ASYNC_WARN" />
-            <appender-ref ref="ASYNC_ERROR" />
-        </root>
-    </springProfile>
-</configuration>
+    <logger name="org.apache.dubbo.common.Version" level="off"/>
+
+    <!-- 默认日志输出级别 -->
+    <root level="WARN">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="ASYNC_DEBUG"/>
+        <appender-ref ref="ASYNC_WARN"/>
+        <appender-ref ref="ASYNC_INFO"/>
+        <appender-ref ref="ASYNC_ERROR"/>
+    </root>
+</configuration>