Uncarbon преди 4 години
родител
ревизия
92503dd0aa
променени са 31 файла, в които са добавени 1056 реда и са изтрити 134 реда
  1. 16 17
      attachments/schema/MySQL/helio_boot.sql
  2. 880 0
      attachments/schema/PostgreSQL/helio_boot.sql
  3. 2 2
      pom.xml
  4. 3 0
      src/main/java/cc/uncarbon/config/AdminSaTokenExtendConfiguration.java
  5. 32 0
      src/main/java/cc/uncarbon/config/CorsConfiguration.java
  6. 13 0
      src/main/java/cc/uncarbon/config/CustomInterceptorConfiguration.java
  7. 3 27
      src/main/java/cc/uncarbon/module/app/controller/AppAuthController.java
  8. 0 1
      src/main/java/cc/uncarbon/module/sys/aspect/SysLogAspect.java
  9. 3 2
      src/main/java/cc/uncarbon/module/sys/controller/AdminAuthController.java
  10. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysDataDictController.java
  11. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysDeptController.java
  12. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysLogController.java
  13. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysMenuController.java
  14. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysParamController.java
  15. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysRoleController.java
  16. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysTenantController.java
  17. 1 1
      src/main/java/cc/uncarbon/module/sys/controller/AdminSysUserController.java
  18. 2 2
      src/main/java/cc/uncarbon/module/sys/entity/SysParamEntity.java
  19. 3 3
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysParamDTO.java
  20. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysParamDTO.java
  21. 1 1
      src/main/java/cc/uncarbon/module/sys/model/response/SysParamBO.java
  22. 5 2
      src/main/java/cc/uncarbon/module/sys/model/response/SysUserLoginBO.java
  23. 8 8
      src/main/java/cc/uncarbon/module/sys/service/SysDataDictService.java
  24. 9 8
      src/main/java/cc/uncarbon/module/sys/service/SysDeptService.java
  25. 17 14
      src/main/java/cc/uncarbon/module/sys/service/SysMenuService.java
  26. 12 11
      src/main/java/cc/uncarbon/module/sys/service/SysParamService.java
  27. 9 8
      src/main/java/cc/uncarbon/module/sys/service/SysRoleService.java
  28. 9 8
      src/main/java/cc/uncarbon/module/sys/service/SysTenantService.java
  29. 12 8
      src/main/java/cc/uncarbon/module/sys/service/SysUserService.java
  30. 1 1
      src/main/resources/application-dev.yml
  31. 6 1
      src/main/resources/application.yml

+ 16 - 17
attachments/schema/MySQL/helio_boot.sql

@@ -11,7 +11,7 @@ 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`        smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -21,7 +21,7 @@ CREATE TABLE `sys_data_dict`
     `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 '参数描述',
+    `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 '别称键名',
@@ -43,7 +43,7 @@ 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`   smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -71,7 +71,7 @@ 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`   smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -102,7 +102,7 @@ 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`      smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -117,8 +117,7 @@ CREATE TABLE `sys_menu`
     `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,
-    INDEX           `idx_sys_menu_parent_id`(`parent_id`) USING BTREE
+    PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台菜单';
 
 -- ----------------------------
@@ -231,15 +230,15 @@ 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`    smallint(6) NOT NULL DEFAULT 0 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 '备注',
-    `key`         varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT 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 '参数描述',
+    `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 = '系统参数';
 
@@ -258,7 +257,7 @@ 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`   smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -287,7 +286,7 @@ 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`   smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -312,7 +311,7 @@ CREATE TABLE `sys_tenant`
 (
     `id`                   bigint(20) NOT NULL COMMENT '主键ID',
     `revision`             bigint(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
-    `del_flag`             smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -342,7 +341,7 @@ 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`      smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -379,7 +378,7 @@ 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`   smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -405,7 +404,7 @@ 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`   smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',
@@ -433,7 +432,7 @@ 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`   smallint(6) NOT NULL DEFAULT 0 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 '更新时刻',

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

@@ -0,0 +1,880 @@
+-- ----------------------------
+-- 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");

+ 2 - 2
pom.xml

@@ -7,11 +7,11 @@
     <parent>
         <groupId>cc.uncarbon.framework</groupId>
         <artifactId>helio-starters</artifactId>
-        <version>1.2.1</version>
+        <version>1.3.0</version>
     </parent>
 
     <artifactId>helio-boot</artifactId>
-    <version>1.2.1</version>
+    <version>1.3.0</version>
 
     <properties>
     </properties>

+ 3 - 0
src/main/java/cc/uncarbon/config/AdminSaTokenExtendConfiguration.java

@@ -2,8 +2,10 @@ package cc.uncarbon.config;
 
 import cc.uncarbon.framework.core.context.UserContextHolder;
 import cn.dev33.satoken.stp.StpInterface;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 
@@ -15,6 +17,7 @@ import java.util.List;
  */
 @Component
 public class AdminSaTokenExtendConfiguration implements StpInterface {
+
     /**
      * 返回一个账号所拥有的权限码集合
      */

+ 32 - 0
src/main/java/cc/uncarbon/config/CorsConfiguration.java

@@ -0,0 +1,32 @@
+package cc.uncarbon.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * Spring Boot 2.4+ 跨域设置需要变化
+ * 参考https://blog.csdn.net/jxysgzs/article/details/110818712
+ *
+ * 因可能个别项目需要特别的跨域设置,单拎出来放在这
+ *
+ * @author Uncarbon
+ */
+@Configuration
+public class CorsConfiguration implements WebMvcConfigurer {
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry
+                // 设置允许跨域的路由规则
+                .addMapping("/**")
+                // 设置允许跨域请求的域名
+                .allowedOriginPatterns("*")
+                // 是否允许证书(cookies)
+                .allowCredentials(true)
+                // 设置允许的方法
+                .allowedMethods("*")
+                // 跨域允许时间
+                .maxAge(3600);
+    }
+}

+ 13 - 0
src/main/java/cc/uncarbon/config/CustomInterceptorConfiguration.java

@@ -16,6 +16,7 @@ import javax.annotation.Resource;
 
 /**
  * 将自定义拦截器加入到拦截器队列中
+ *
  * @author Uncarbon
  */
 @Configuration
@@ -38,8 +39,20 @@ public class CustomInterceptorConfiguration implements WebMvcConfigurer {
                 .addInterceptor(new AdminSaTokenParseInterceptor())
                 .addPathPatterns(SysConstant.SYS_MODULE_CONTEXT_PATH + "/**");
 
+        /*
+        可选拦截器 - 从请求头解析租户信息
+        其他家后台管理登录时,账号上面可以手动填入租户ID,如"000000"
+        这个拦截器就是为了满足这种需要
+
+        注:若使用该拦截器,cc.uncarbon.module.sys.service.SysUserService#adminLogin 处的“主动清空用户上下文”代码需要删除
+         */
+        /* registry
+                .addInterceptor(new DefaultTenantParseInterceptor())
+                .addPathPatterns("/**");*/
+
         /*
         2. App-路由拦截器, 使几乎所有接口都需要登录
+        放行接口请在配置文件的 helio.security.exclude-routes 中设置
          */
         registry
                 .addInterceptor(new AppSaTokenRouteInterceptor(helioProperties))

+ 3 - 27
src/main/java/cc/uncarbon/module/app/controller/AppAuthController.java

@@ -25,7 +25,7 @@ import java.util.Map;
  */
 @Slf4j
 @Api(value = "APP鉴权接口", tags = {"APP鉴权接口"})
-@RequestMapping(AppConstant.APP_MODULE_CONTEXT_PATH + HelioConstant.Version.APP_API_VERSION_V1 + "/auth")
+@RequestMapping(AppConstant.APP_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/auth")
 @RestController
 public class AppAuthController {
 
@@ -33,34 +33,10 @@ public class AppAuthController {
     @PostMapping("/login")
     public ApiResult<?> login() {
         /*
-        鉴权方法请参考AdminAuthController.login,自行根据业务实现
+        编码时请参考AdminAuthController#login
          */
 
-        // 构造用户上下文
-        UserContext userContext = UserContext.builder()
-                .userId(1L)
-                .userName("App测试登录")
-                .userPhoneNo("12345678910")
-                .userType(UserTypeEnum.APP_USER_INDIVIDUAL)
-                .extraData(null)
-                .roles(CollUtil.newArrayList())
-                .permissions(CollUtil.newArrayList())
-                .relationalTenant(null)
-                .build();
-
-        // 注册到SA-Token
-        StpUtil.login(userContext.getUserId());
-        StpUtil.getSession().set("userContext", userContext);
-
-
-        // 返回登录token
-        Map<String, Object> tokenInfo = new HashMap<>(16);
-        tokenInfo.put("tokenName", StpUtil.getTokenName());
-        tokenInfo.put("tokenValue", StpUtil.getTokenValue());
-        tokenInfo.put("roles", userContext.getRoles());
-        tokenInfo.put("permissions", userContext.getPermissions());
-
-        return ApiResult.data("登录成功", tokenInfo);
+        return ApiResult.success();
     }
 
 }

+ 0 - 1
src/main/java/cc/uncarbon/module/sys/aspect/SysLogAspect.java

@@ -27,7 +27,6 @@ import java.util.stream.Collectors;
 @Aspect
 @Component
 @Slf4j
-@Data
 public class SysLogAspect {
 
     @Resource

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

@@ -32,8 +32,8 @@ import java.util.Map;
  * @author Uncarbon
  */
 @Slf4j
-@Api(value = "SAAS管理后台鉴权接口", tags = {"SAAS鉴权接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/auth")
+@Api(value = "SaaS后台管理鉴权接口", tags = {"SaaS后台管理鉴权接口"})
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/auth")
 @RestController
 public class AdminAuthController {
 
@@ -57,6 +57,7 @@ public class AdminAuthController {
                 .userPhoneNo(userInfo.getPhoneNo())
                 .userType(UserTypeEnum.ADMIN_USER)
                 .extraData(null)
+                .rolesIds(userInfo.getRoleIds())
                 .roles(userInfo.getRoles())
                 .permissions(userInfo.getPermissions())
                 .relationalTenant(userInfo.getRelationalTenant())

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

@@ -29,7 +29,7 @@ import javax.validation.Valid;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "数据字典管理接口", tags = {"数据字典管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/sys/dataDicts")
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/dataDicts")
 @RestController
 public class AdminSysDataDictController {
 

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

@@ -28,7 +28,7 @@ import java.util.List;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "部门管理接口", tags = {"部门管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/sys/depts")
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/depts")
 @RestController
 public class AdminSysDeptController {
 

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

@@ -29,7 +29,7 @@ import javax.annotation.Resource;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "后台操作日志管理接口", tags = {"后台操作日志管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/sys/logs")
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/logs")
 @RestController
 public class AdminSysLogController {
 

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

@@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "后台菜单管理接口", tags = {"后台菜单管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/sys/menus")
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/menus")
 @RestController
 public class AdminSysMenuController {
 

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

@@ -28,7 +28,7 @@ import javax.validation.Valid;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "系统参数管理接口", tags = {"系统参数管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/sys/params")
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/params")
 @RestController
 public class AdminSysParamController {
 

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

@@ -33,7 +33,7 @@ import java.util.List;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "后台角色管理接口", tags = {"后台角色管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/sys/roles")
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/roles")
 @RestController
 public class AdminSysRoleController {
 

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

@@ -30,7 +30,7 @@ import javax.validation.Valid;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "系统租户管理接口", tags = {"系统租户管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/sys/tenants")
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/tenants")
 @RestController
 public class AdminSysTenantController {
 

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

@@ -30,7 +30,7 @@ import javax.validation.Valid;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "后台用户管理接口", tags = {"后台用户管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.SAAS_API_VERSION_V1 + "/sys/users")
+@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/users")
 @RestController
 public class AdminSysUserController {
 

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

@@ -26,8 +26,8 @@ import lombok.experimental.SuperBuilder;
 public class SysParamEntity extends HelioBaseEntity<Long> {
 
     @ApiModelProperty(value = "键名")
-    @TableField(value = "`key`")
-    private String key;
+    @TableField(value = "name")
+    private String name;
 
     @ApiModelProperty(value = "键值")
     @TableField(value = "value")

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

@@ -30,10 +30,10 @@ public class AdminInsertOrUpdateSysParamDTO implements Serializable {
 
     @ApiModelProperty(value = "键名", required = true)
     @NotBlank(message = "键名不能为空")
-    private String key;
+    private String name;
 
-    @ApiModelProperty(value = "值", required = true)
-    @NotBlank(message = "值不能为空")
+    @ApiModelProperty(value = "值", required = true)
+    @NotBlank(message = "值不能为空")
     private String value;
 
     @ApiModelProperty(value = "描述", required = true)

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

@@ -21,8 +21,8 @@ import java.io.Serializable;
 @Data
 public class AdminListSysParamDTO implements Serializable {
 
-    @ApiModelProperty(value = "英文键名")
-    private String key;
+    @ApiModelProperty(value = "键名")
+    private String name;
 
     @ApiModelProperty(value = "描述")
     private String description;

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

@@ -41,7 +41,7 @@ public class SysParamBO implements Serializable {
     private LocalDateTime updatedAt;
 
     @ApiModelProperty(value = "键名")
-    private String key;
+    private String name;
 
     @ApiModelProperty(value = "键值")
     private String value;

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

@@ -36,13 +36,16 @@ public class SysUserLoginBO implements Serializable {
     @ApiModelProperty(value = "手机号")
     private String phoneNo;
 
-    @ApiModelProperty(value = "拥有角色")
+    @ApiModelProperty(value = "对应角色ID")
+    private List<Long> roleIds;
+
+    @ApiModelProperty(value = "对应角色")
     private List<String> roles;
 
     @ApiModelProperty(value = "拥有权限")
     private List<String> permissions;
 
-    @ApiModelProperty("所属租户")
+    @ApiModelProperty(value = "所属租户")
     private TenantContext relationalTenant;
 
 }

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

@@ -66,7 +66,7 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
     @SysLog(value = "新增数据字典")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysDataDictDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         dto.setId(null);
         SysDataDictEntity entity = new SysDataDictEntity();
@@ -83,7 +83,7 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
     @SysLog(value = "编辑数据字典")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysDataDictDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         SysDataDictEntity entity = new SysDataDictEntity();
         BeanUtil.copyProperties(dto, entity);
@@ -138,14 +138,14 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
     }
 
     /**
-     * 检查是否已存在同数据
+     * 检查是否已存在同数据
      *
      * @param dto DTO
      */
-    private void checkExist(AdminInsertOrUpdateSysDataDictDTO dto) {
-        SysDataDictEntity existEntity = this.getOne(
+    private void checkExistence(AdminInsertOrUpdateSysDataDictDTO dto) {
+        SysDataDictEntity existingEntity = this.getOne(
                 new QueryWrapper<SysDataDictEntity>()
-                        .select(" id ")
+                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
                         .eq(SysDataDictEntity::getCamelCaseKey, dto.getCamelCaseKey())
                         .or()
@@ -155,9 +155,9 @@ public class SysDataDictService extends HelioBaseServiceImpl<SysDataDictMapper,
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );
 
-        if (existEntity != null && !existEntity.getId().equals(dto.getId())) {
+        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
             throw new BusinessException(400, "已存在相同数据字典,请重新输入");
         }
     }
 
-}
+}

+ 9 - 8
src/main/java/cc/uncarbon/module/sys/service/SysDeptService.java

@@ -72,7 +72,7 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
     @SysLog(value = "新增部门")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysDeptDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         if (ObjectUtil.isNull(dto.getParentId())) {
             dto.setParentId(0L);
@@ -93,7 +93,7 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
     @SysLog(value = "编辑部门")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysDeptDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         if (ObjectUtil.isNull(dto.getParentId())) {
             dto.setParentId(0L);
@@ -181,20 +181,21 @@ public class SysDeptService extends HelioBaseServiceImpl<SysDeptMapper, SysDeptE
 
 
     /**
-     * 检查是否已存在同名数据
+     * 检查是否已存在相同数据
+     * 
      * @param dto DTO
      */
-    private void checkExist(AdminInsertOrUpdateSysDeptDTO dto) {
-        SysDeptEntity existEntity = this.getOne(
+    private void checkExistence(AdminInsertOrUpdateSysDeptDTO dto) {
+        SysDeptEntity existingEntity = this.getOne(
                 new QueryWrapper<SysDeptEntity>()
-                        .select(" id ")
+                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
                         .eq(SysDeptEntity::getTitle, dto.getTitle())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );
 
-        if (existEntity != null && !existEntity.getId().equals(dto.getId())) {
+        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
             throw new BusinessException(400, "已存在相同部门,请重新输入");
         }
     }
-}
+}

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

@@ -91,7 +91,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
     @SysLog(value = "新增后台菜单")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysMenuDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         if (ObjectUtil.isNull(dto.getParentId())) {
             dto.setParentId(0L);
@@ -113,7 +113,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
     @SysLog(value = "编辑后台菜单")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysMenuDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         if (ObjectUtil.isNull(dto.getParentId())) {
             dto.setParentId(0L);
@@ -214,7 +214,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
          */
         List<Long> disabledMenuIds = this.list(
                 new QueryWrapper<SysMenuEntity>()
-                        .select(" id ")
+                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
                         .eq(SysMenuEntity::getStatus, GenericStatusEnum.DISABLED)
         ).stream().map(SysMenuEntity::getId).collect(Collectors.toList());
@@ -226,7 +226,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
          */
         return this.list(
                 new QueryWrapper<SysMenuEntity>()
-                        .select(" id ")
+                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
                         .and(
                                 wrapper -> wrapper
@@ -375,7 +375,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
         if (roleIds.contains(SysConstant.SUPER_ADMIN_ROLE_ID)) {
             return this.list(
                     new QueryWrapper<SysMenuEntity>()
-                            .select(" id ")
+                            .select(HelioConstant.CRUD.SQL_COLUMN_ID)
             ).stream().map(SysMenuEntity::getId).collect(Collectors.toList());
         }
 
@@ -386,9 +386,11 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
             throw new BusinessException(SysErrorEnum.NO_MENU_AVAILABLE_FOR_CURRENT_ROLE);
         }
 
-        // 3. 临时补充上级菜单ID
-        // 这个Ant-Design的Tree组件有个吊诡的地方, 只选一部分子级的话, 父级菜单不算勾选
-        // 只能在代码里补上了
+        /*
+        3. 补充上级菜单ID
+        这个Ant-Design的Tree组件有个吊诡的地方, 只选一部分子级的话, 父级菜单不算勾选
+        只能在代码里补上了
+         */
         List<Long> missingParentIds = this.listMissingParentId(menuIds);
         menuIds.addAll(missingParentIds);
 
@@ -443,22 +445,23 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
     }
 
     /**
-     * 检查是否已存在同名数据
+     * 检查是否已存在相同数据
+     * 
      * @param dto DTO
      */
-    private void checkExist(AdminInsertOrUpdateSysMenuDTO dto) {
+    private void checkExistence(AdminInsertOrUpdateSysMenuDTO dto) {
         if (StrUtil.isNotBlank(dto.getPermission())) {
             dto.setPermission(StrUtil.cleanBlank(dto.getPermission()));
 
-            SysMenuEntity existEntity = this.getOne(
+            SysMenuEntity existingEntity = this.getOne(
                     new QueryWrapper<SysMenuEntity>()
-                            .select(" id ")
+                            .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                             .lambda()
                             .eq(SysMenuEntity::getPermission, dto.getPermission())
                             .last(HelioConstant.CRUD.SQL_LIMIT_1)
             );
 
-            if (existEntity != null && !existEntity.getId().equals(dto.getId())) {
+            if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
                 throw new BusinessException(400, "已存在相同权限标识,请重新输入");
             }
         }
@@ -493,4 +496,4 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
 
         return ret;
     }
-}
+}

+ 12 - 11
src/main/java/cc/uncarbon/module/sys/service/SysParamService.java

@@ -41,7 +41,7 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
                 new QueryWrapper<SysParamEntity>()
                         .lambda()
                         // 键名
-                        .like(StrUtil.isNotBlank(dto.getKey()), SysParamEntity::getKey, StrUtil.cleanBlank(dto.getKey()))
+                        .like(StrUtil.isNotBlank(dto.getName()), SysParamEntity::getName, StrUtil.cleanBlank(dto.getName()))
                         // 描述
                         .like(StrUtil.isNotBlank(dto.getDescription()), SysParamEntity::getDescription, StrUtil.cleanBlank(dto.getDescription()))
                         // 排序
@@ -67,7 +67,7 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
     @SysLog(value = "新增系统参数")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysParamDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         dto.setId(null);
         SysParamEntity entity = new SysParamEntity();
@@ -84,7 +84,7 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
     @SysLog(value = "编辑系统参数")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysParamDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         SysParamEntity entity = new SysParamEntity();
         BeanUtil.copyProperties(dto, entity);
@@ -111,7 +111,7 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
                 new QueryWrapper<SysParamEntity>()
                         .select(" value ")
                         .lambda()
-                        .eq(SysParamEntity::getKey, key)
+                        .eq(SysParamEntity::getName, key)
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );
         if (sysParamEntity == null) {
@@ -170,22 +170,23 @@ public class SysParamService extends HelioBaseServiceImpl<SysParamMapper, SysPar
     }
 
     /**
-     * 检查是否已存在同名数据
+     * 检查是否已存在相同数据
+     *
      * @param dto DTO
      */
-    private void checkExist(AdminInsertOrUpdateSysParamDTO dto) {
-        SysParamEntity existEntity = this.getOne(
+    private void checkExistence(AdminInsertOrUpdateSysParamDTO dto) {
+        SysParamEntity existingEntity = this.getOne(
                 new QueryWrapper<SysParamEntity>()
-                        .select(" id ")
+                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
                         .eq(SysParamEntity::getDescription, dto.getDescription())
                         .or()
-                        .eq(SysParamEntity::getKey, dto.getKey())
+                        .eq(SysParamEntity::getName, dto.getName())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );
 
-        if (existEntity != null && !existEntity.getId().equals(dto.getId())) {
+        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
             throw new BusinessException(400, "已存在相同系统参数,请重新输入");
         }
     }
-}
+}

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

@@ -80,7 +80,7 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
     @SysLog(value = "新增后台角色")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysRoleDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         dto.setId(null);
         SysRoleEntity entity = new SysRoleEntity();
@@ -99,7 +99,7 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
     @SysLog(value = "编辑后台角色")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysRoleDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         SysRoleEntity entity = new SysRoleEntity();
         BeanUtil.copyProperties(dto, entity);
@@ -176,20 +176,21 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
     }
 
     /**
-     * 检查是否已存在同名数据
+     * 检查是否已存在相同数据
+     * 
      * @param dto DTO
      */
-    private void checkExist(AdminInsertOrUpdateSysRoleDTO dto) {
-        SysRoleEntity existEntity = this.getOne(
+    private void checkExistence(AdminInsertOrUpdateSysRoleDTO dto) {
+        SysRoleEntity existingEntity = this.getOne(
                 new QueryWrapper<SysRoleEntity>()
-                        .select(" id ")
+                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
                         .eq(SysRoleEntity::getTitle, dto.getTitle())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );
 
-        if (existEntity != null && !existEntity.getId().equals(dto.getId())) {
+        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
             throw new BusinessException(400, "已存在相同后台角色,请重新输入");
         }
     }
-}
+}

+ 9 - 8
src/main/java/cc/uncarbon/module/sys/service/SysTenantService.java

@@ -85,7 +85,7 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
     @SysLog(value = "新增系统租户")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertSysTenantDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         // 1. 加入一个新租户(tenant)
         //    这里是直接顺带创建管理员账号了, 你可以根据业务需要决定是否创建
@@ -152,7 +152,7 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
     @SysLog(value = "编辑系统租户")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminUpdateSysTenantDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         SysTenantEntity entity = new SysTenantEntity();
         BeanUtil.copyProperties(dto, entity);
@@ -230,13 +230,14 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
     }
 
     /**
-     * 检查是否已存在同名数据
+     * 检查是否已存在相同数据
+     * 
      * @param dto DTO
      */
-    private void checkExist(AdminUpdateSysTenantDTO dto) {
-        SysTenantEntity existEntity = this.getOne(
+    private void checkExistence(AdminUpdateSysTenantDTO dto) {
+        SysTenantEntity existingEntity = this.getOne(
                 new QueryWrapper<SysTenantEntity>()
-                        .select(" id ")
+                        .select(HelioConstant.CRUD.SQL_COLUMN_ID)
                         .lambda()
                         .eq(SysTenantEntity::getTenantId, dto.getTenantId())
                         .or()
@@ -244,9 +245,9 @@ public class SysTenantService extends HelioBaseServiceImpl<SysTenantMapper, SysT
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );
 
-        if (existEntity != null && !existEntity.getId().equals(dto.getId())) {
+        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
             throw new BusinessException(400, "已存在相同系统租户,请重新输入");
         }
     }
 
-}
+}

+ 12 - 8
src/main/java/cc/uncarbon/module/sys/service/SysUserService.java

@@ -19,6 +19,7 @@ import cc.uncarbon.module.sys.util.PwdUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 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 com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -29,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 
@@ -93,7 +95,7 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
     @SysLog(value = "新增后台用户")
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminInsertOrUpdateSysUserDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         dto.setId(null);
         SysUserEntity entity = new SysUserEntity();
@@ -119,7 +121,7 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
     @SysLog(value = "编辑后台用户")
     @Transactional(rollbackFor = Exception.class)
     public void adminUpdate(AdminInsertOrUpdateSysUserDTO dto) {
-        this.checkExist(dto);
+        this.checkExistence(dto);
 
         SysUserEntity updateEntity = new SysUserEntity();
         BeanUtil.copyProperties(dto, updateEntity);
@@ -196,7 +198,8 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
 
         // 因字段类型不一致, 单独转换
         ret
-                .setRoles(sysUserBO.getRoles().stream().map(SysRoleBO::getValue).collect(Collectors.toList()))
+                .setRoleIds(sysUserBO.getRoles().stream().map(SysRoleBO::getId).filter(ObjectUtil::isNotNull).sorted().collect(Collectors.toList()))
+                .setRoles(sysUserBO.getRoles().stream().map(SysRoleBO::getValue).filter(StrUtil::isNotBlank).collect(Collectors.toList()))
                 .setPermissions(sysUserBO.getPermissions())
                 .setRelationalTenant(currentTenantContext)
         ;
@@ -324,14 +327,15 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
     }
 
     /**
-     * 检查是否已存在同名数据
+     * 检查是否已存在相同数据
+     * 
      * @param dto DTO
      */
-    private void checkExist(AdminInsertOrUpdateSysUserDTO dto) {
-        SysUserEntity existEntity = this.getUserByPin(dto.getUsername());
+    private void checkExistence(AdminInsertOrUpdateSysUserDTO dto) {
+        SysUserEntity existingEntity = this.getUserByPin(dto.getUsername());
 
-        if (existEntity != null && !existEntity.getId().equals(dto.getId())) {
+        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
             throw new BusinessException(400, "已存在相同账号,请重新输入");
         }
     }
-}
+}

+ 1 - 1
src/main/resources/application-dev.yml

@@ -32,4 +32,4 @@ knife4j:
 
 mybatis-plus:
   configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

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

@@ -37,9 +37,14 @@ helio:
       enabled: false
   security:
     exclude-routes:
+      # 图标
+      - /favicon.ico
+      # Swagger API文档接口
+      - /v2/api-docs
+      - /v3/api-docs
       # App-放行接口
       - /app/api/v1/auth/login
-      - /favicon.ico
+
 
 knife4j:
   # 保持true