Selaa lähdekoodia

bump: 发布2.1.0

details see: https://helio.uncarbon.cc/#/i18n/zh-CN/appendix/change-log
Uncarbon 2 vuotta sitten
vanhempi
commit
4c3d8b9ceb
22 muutettua tiedostoa jossa 2273 lisäystä ja 1758 poistoa
  1. 508 501
      attachments/db/MySQL/helio_boot.sql
  2. 35 0
      attachments/db/MySQL/upgrade/2.0.0_to_2.1.0.sql
  3. 989 993
      attachments/db/PostgreSQL/helio_boot.sql
  4. 64 0
      attachments/db/PostgreSQL/upgrade/2.0.0_to_2.1.0.sql
  5. 2 2
      pom.xml
  6. 2 0
      src/main/java/cc/uncarbon/module/adminapi/model/response/SelectOptionItemVO.java
  7. 68 32
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysDataDictController.java
  8. 50 0
      src/main/java/cc/uncarbon/module/sys/entity/SysDataDictClassifiedEntity.java
  9. 0 59
      src/main/java/cc/uncarbon/module/sys/entity/SysDataDictEntity.java
  10. 62 0
      src/main/java/cc/uncarbon/module/sys/entity/SysDataDictItemEntity.java
  11. 31 0
      src/main/java/cc/uncarbon/module/sys/mapper/SysDataDictClassifiedMapper.java
  12. 3 3
      src/main/java/cc/uncarbon/module/sys/mapper/SysDataDictItemMapper.java
  13. 0 65
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysDataDictDTO.java
  14. 53 0
      src/main/java/cc/uncarbon/module/sys/model/request/AdminSysDataDictClassifiedInsertOrUpdateDTO.java
  15. 11 6
      src/main/java/cc/uncarbon/module/sys/model/request/AdminSysDataDictClassifiedListDTO.java
  16. 65 0
      src/main/java/cc/uncarbon/module/sys/model/request/AdminSysDataDictItemInsertOrUpdateDTO.java
  17. 31 0
      src/main/java/cc/uncarbon/module/sys/model/request/AdminSysDataDictItemListDTO.java
  18. 18 24
      src/main/java/cc/uncarbon/module/sys/model/response/SysDataDictClassifiedBO.java
  19. 67 0
      src/main/java/cc/uncarbon/module/sys/model/response/SysDataDictItemBO.java
  20. 209 70
      src/main/java/cc/uncarbon/module/sys/service/SysDataDictService.java
  21. 2 0
      src/main/resources/application.yml
  22. 3 3
      src/test/java/cc/uncarbon/test/ExampleUnitTest.java

+ 508 - 501
attachments/db/MySQL/helio_boot.sql

@@ -1,501 +1,508 @@
-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/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', ''),
-       (48, 0, 1, 0, '2022-06-29 17:35:26', 'admin', '2022-06-29 17:35:26', 'admin', '绑定角色与菜单关联关系', 12, 2, 'SysRole:bindMenus',
-        'ant-design:share-alt-outlined', 5, 1, NULL, '');
-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;
-
-
--- v1.7.2 - Uncarbon - 默认内置文件上传功能
--- 建表 oss_file_info
-DROP TABLE IF EXISTS `oss_file_info`;
-CREATE TABLE `oss_file_info`
-(
-    `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 '更新者',
-    `storage_platform`  varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '存储平台',
-    `storage_base_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '基础存储路径',
-    `storage_path`      varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '存储路径',
-    `storage_filename`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '存储文件名',
-    `original_filename` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '原始文件名',
-    `extend_name`       varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '扩展名',
-    `file_size`         bigint(20) NOT NULL COMMENT '文件大小',
-    `md5`               varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT 'MD5',
-    `classified`        varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件类别',
-    `direct_url`        varchar(512) 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 = '上传文件信息' ROW_FORMAT = Dynamic;
-
--- v1.7.2 - Uncarbon - 新增上传文件信息后台管理菜单
-INSERT INTO `sys_menu` (`id`, `tenant_id`, `revision`, `del_flag`, `created_at`, `created_by`, `updated_at`,
-                        `updated_by`, `title`, `parent_id`, `type`, `permission`, `icon`, `sort`, `status`, `component`,
-                        `external_link`)
-VALUES (20220922152710, NULL, 1, 0, '2022-12-25 23:09:30', 'admin', '2022-12-26 22:02:31', 'admin', '文件管理', 0, 0,
-        'Oss', 'ant-design:file-outlined', 4, 1, NULL, '');
-INSERT INTO `sys_menu` (`id`, `tenant_id`, `revision`, `del_flag`, `created_at`, `created_by`, `updated_at`,
-                        `updated_by`, `title`, `parent_id`, `type`, `permission`, `icon`, `sort`, `status`, `component`,
-                        `external_link`)
-VALUES (20220922152714, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-12-26 22:03:14', 'admin',
-        '上传文件信息管理', 20220922152710, 1, 'OssFileInfo', 'ant-design:save-twotone', 1, 1, '/oss/OssFileInfo/index',
-        '');
-INSERT INTO `sys_menu` (`id`, `tenant_id`, `revision`, `del_flag`, `created_at`, `created_by`, `updated_at`,
-                        `updated_by`, `title`, `parent_id`, `type`, `permission`, `icon`, `sort`, `status`, `component`,
-                        `external_link`)
-VALUES (20220922152715, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-12-26 22:01:58', 'admin', '查询',
-        20220922152714, 2, 'OssFileInfo:retrieve', NULL, 1, 1, NULL, '');
-INSERT INTO `sys_menu` (`id`, `tenant_id`, `revision`, `del_flag`, `created_at`, `created_by`, `updated_at`,
-                        `updated_by`, `title`, `parent_id`, `type`, `permission`, `icon`, `sort`, `status`, `component`,
-                        `external_link`)
-VALUES (20220922152718, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-12-26 22:02:09', 'admin', '删除',
-        20220922152714, 2, 'OssFileInfo:delete', NULL, 2, 1, NULL, '');
-
--- v1.8.0 - Uncarbon - 新增错误原因堆栈、用户UA、IP属地字段;表注释更新
-ALTER TABLE sys_log
-    ADD COLUMN error_stacktrace varchar(3000) NOT NULL DEFAULT '' COMMENT '错误原因堆栈' AFTER status,
-    ADD COLUMN user_agent varchar(255) NOT NULL DEFAULT '' COMMENT '用户UA' AFTER error_stacktrace,
-    ADD COLUMN ip_location_region_name varchar(100) NOT NULL DEFAULT '' COMMENT 'IP地址属地-国家或地区名' AFTER user_agent,
-    ADD COLUMN ip_location_province_name varchar(100) NOT NULL DEFAULT '' COMMENT 'IP地址属地-省级行政区名' AFTER ip_location_region_name,
-    ADD COLUMN ip_location_city_name varchar(100) NOT NULL DEFAULT '' COMMENT 'IP地址属地-市级行政区名' AFTER ip_location_province_name,
-    ADD COLUMN ip_location_district_name varchar(100) NOT NULL DEFAULT '' COMMENT 'IP地址属地-县级行政区名' AFTER ip_location_city_name;
-ALTER TABLE sys_log COMMENT = '系统日志';
+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_classified & sys_data_dict_item
+-- ----------------------------
+CREATE TABLE `sys_data_dict_classified`  (
+  `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 '更新者',
+  `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类编码',
+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
+  `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态',
+  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类描述',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据字典分类' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_data_dict_item`  (
+  `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 '更新者',
+  `classified_id` bigint(20) NOT NULL COMMENT '所属分类ID',
+  `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典项编码',
+  `label` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典项标签',
+  `value` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典项值',
+  `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态',
+  `sort` int(11) NOT NULL DEFAULT 1 COMMENT '排序',
+  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '描述',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据字典项' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- 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/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', ''),
+       (48, 0, 1, 0, '2022-06-29 17:35:26', 'admin', '2022-06-29 17:35:26', 'admin', '绑定角色与菜单关联关系', 12, 2, 'SysRole:bindMenus',
+        'ant-design:share-alt-outlined', 5, 1, NULL, '');
+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;
+
+
+-- v1.7.2 - Uncarbon - 默认内置文件上传功能
+-- 建表 oss_file_info
+DROP TABLE IF EXISTS `oss_file_info`;
+CREATE TABLE `oss_file_info`
+(
+    `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 '更新者',
+    `storage_platform`  varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '存储平台',
+    `storage_base_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '基础存储路径',
+    `storage_path`      varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '存储路径',
+    `storage_filename`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '存储文件名',
+    `original_filename` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '原始文件名',
+    `extend_name`       varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '扩展名',
+    `file_size`         bigint(20) NOT NULL COMMENT '文件大小',
+    `md5`               varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT 'MD5',
+    `classified`        varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件类别',
+    `direct_url`        varchar(512) 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 = '上传文件信息' ROW_FORMAT = Dynamic;
+
+-- v1.7.2 - Uncarbon - 新增上传文件信息后台管理菜单
+INSERT INTO `sys_menu` (`id`, `tenant_id`, `revision`, `del_flag`, `created_at`, `created_by`, `updated_at`,
+                        `updated_by`, `title`, `parent_id`, `type`, `permission`, `icon`, `sort`, `status`, `component`,
+                        `external_link`)
+VALUES (20220922152710, NULL, 1, 0, '2022-12-25 23:09:30', 'admin', '2022-12-26 22:02:31', 'admin', '文件管理', 0, 0,
+        'Oss', 'ant-design:file-outlined', 4, 1, NULL, '');
+INSERT INTO `sys_menu` (`id`, `tenant_id`, `revision`, `del_flag`, `created_at`, `created_by`, `updated_at`,
+                        `updated_by`, `title`, `parent_id`, `type`, `permission`, `icon`, `sort`, `status`, `component`,
+                        `external_link`)
+VALUES (20220922152714, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-12-26 22:03:14', 'admin',
+        '上传文件信息管理', 20220922152710, 1, 'OssFileInfo', 'ant-design:save-twotone', 1, 1, '/oss/OssFileInfo/index',
+        '');
+INSERT INTO `sys_menu` (`id`, `tenant_id`, `revision`, `del_flag`, `created_at`, `created_by`, `updated_at`,
+                        `updated_by`, `title`, `parent_id`, `type`, `permission`, `icon`, `sort`, `status`, `component`,
+                        `external_link`)
+VALUES (20220922152715, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-12-26 22:01:58', 'admin', '查询',
+        20220922152714, 2, 'OssFileInfo:retrieve', NULL, 1, 1, NULL, '');
+INSERT INTO `sys_menu` (`id`, `tenant_id`, `revision`, `del_flag`, `created_at`, `created_by`, `updated_at`,
+                        `updated_by`, `title`, `parent_id`, `type`, `permission`, `icon`, `sort`, `status`, `component`,
+                        `external_link`)
+VALUES (20220922152718, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-12-26 22:02:09', 'admin', '删除',
+        20220922152714, 2, 'OssFileInfo:delete', NULL, 2, 1, NULL, '');
+
+-- v1.8.0 - Uncarbon - 新增错误原因堆栈、用户UA、IP属地字段;表注释更新
+ALTER TABLE sys_log
+    ADD COLUMN error_stacktrace varchar(3000) NOT NULL DEFAULT '' COMMENT '错误原因堆栈' AFTER status,
+    ADD COLUMN user_agent varchar(255) NOT NULL DEFAULT '' COMMENT '用户UA' AFTER error_stacktrace,
+    ADD COLUMN ip_location_region_name varchar(100) NOT NULL DEFAULT '' COMMENT 'IP地址属地-国家或地区名' AFTER user_agent,
+    ADD COLUMN ip_location_province_name varchar(100) NOT NULL DEFAULT '' COMMENT 'IP地址属地-省级行政区名' AFTER ip_location_region_name,
+    ADD COLUMN ip_location_city_name varchar(100) NOT NULL DEFAULT '' COMMENT 'IP地址属地-市级行政区名' AFTER ip_location_province_name,
+    ADD COLUMN ip_location_district_name varchar(100) NOT NULL DEFAULT '' COMMENT 'IP地址属地-县级行政区名' AFTER ip_location_city_name;
+ALTER TABLE sys_log COMMENT = '系统日志';

+ 35 - 0
attachments/db/MySQL/upgrade/2.0.0_to_2.1.0.sql

@@ -0,0 +1,35 @@
+-- 重构数据字典,拆分为`sys_data_dict_classified`(数据字典分类)和`sys_data_dict_item`(数据字典项),并重新设计字段
+CREATE TABLE `sys_data_dict_classified`  (
+  `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 '更新者',
+  `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类编码',
+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',
+  `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态',
+  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类描述',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据字典分类' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_data_dict_item`  (
+  `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 '更新者',
+  `classified_id` bigint(20) NOT NULL COMMENT '所属分类ID',
+  `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典项编码',
+  `label` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典项标签',
+  `value` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典项值',
+  `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态',
+  `sort` int(11) NOT NULL DEFAULT 1 COMMENT '排序',
+  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '描述',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据字典项' ROW_FORMAT = Dynamic;

+ 989 - 993
attachments/db/PostgreSQL/helio_boot.sql

@@ -1,993 +1,989 @@
--- ----------------------------
--- 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/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', '');
-INSERT INTO "sys_menu"
-VALUES (48, 0, 1, 0, '2022-06-29 17:35:26', 'admin', '2022-06-29 17:35:26', 'admin', '绑定角色与菜单关联关系', 12, 2, 'SysRole:bindMenus',
-        'ant-design:share-alt-outlined', 5, 1, NULL, '');
-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");
-
-
--- v1.7.2 - Uncarbon - 默认内置文件上传功能
--- 建表 oss_file_info
-DROP TABLE IF EXISTS "oss_file_info";
-CREATE TABLE "oss_file_info"
-(
-    "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),
-    "storage_platform"  varchar(50)  NOT NULL,
-    "storage_base_path" varchar(255) NOT NULL,
-    "storage_path"      varchar(512) NOT NULL,
-    "storage_filename"  varchar(255) NOT NULL,
-    "original_filename" varchar(255) NOT NULL,
-    "extend_name"       varchar(16)  NOT NULL,
-    "file_size"         int8         NOT NULL,
-    "md5"               varchar(32)  NOT NULL,
-    "classified"        varchar(50),
-    "direct_url"        varchar(512)
-)
-;
-COMMENT
-ON COLUMN "oss_file_info"."id" IS '主键ID';
-COMMENT
-ON COLUMN "oss_file_info"."tenant_id" IS '租户ID';
-COMMENT
-ON COLUMN "oss_file_info"."revision" IS '乐观锁';
-COMMENT
-ON COLUMN "oss_file_info"."del_flag" IS '逻辑删除标识';
-COMMENT
-ON COLUMN "oss_file_info"."created_at" IS '创建时刻';
-COMMENT
-ON COLUMN "oss_file_info"."created_by" IS '创建者';
-COMMENT
-ON COLUMN "oss_file_info"."updated_at" IS '更新时刻';
-COMMENT
-ON COLUMN "oss_file_info"."updated_by" IS '更新者';
-COMMENT
-ON COLUMN "oss_file_info"."storage_platform" IS '存储平台';
-COMMENT
-ON COLUMN "oss_file_info"."storage_base_path" IS '基础存储路径';
-COMMENT
-ON COLUMN "oss_file_info"."storage_path" IS '存储路径';
-COMMENT
-ON COLUMN "oss_file_info"."storage_filename" IS '存储文件名';
-COMMENT
-ON COLUMN "oss_file_info"."original_filename" IS '原始文件名';
-COMMENT
-ON COLUMN "oss_file_info"."extend_name" IS '扩展名';
-COMMENT
-ON COLUMN "oss_file_info"."file_size" IS '文件大小';
-COMMENT
-ON COLUMN "oss_file_info"."md5" IS 'MD5';
-COMMENT
-ON COLUMN "oss_file_info"."classified" IS '文件类别';
-COMMENT
-ON COLUMN "oss_file_info"."direct_url" IS '对象存储直链';
-COMMENT
-ON TABLE "oss_file_info" IS '上传文件信息';
-
--- 主键
-ALTER TABLE "oss_file_info"
-    ADD CONSTRAINT "oss_file_info_pkey" PRIMARY KEY ("id");
-
-
--- v1.7.2 - Uncarbon - 新增上传文件信息管理菜单
-INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
-                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
-                       "external_link")
-VALUES (20220922152714, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:27:14',
-        'helio-generator', '上传文件信息管理', 0, 1, 'OssFileInfo', 'ant-design:flag-outlined', 100, 1,
-        '/oss/OssFileInfo/index', '');
-INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
-                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
-                       "external_link")
-VALUES (20220922152715, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:27:14',
-        'helio-generator', '查询', 1572848462892752896, 2, 'OssFileInfo:retrieve', NULL, 1, 1, NULL, '');
-INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
-                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
-                       "external_link")
-VALUES (20220922152716, NULL, 1, 1, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:35:48', 'admin',
-        '新增', 1572848462892752896, 2, 'OssFileInfo:create', NULL, 2, 1, NULL, '');
-INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
-                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
-                       "external_link")
-VALUES (20220922152717, NULL, 1, 1, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:35:55', 'admin',
-        '编辑', 1572848462892752896, 2, 'OssFileInfo:update', NULL, 4, 1, NULL, '');
-INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
-                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
-                       "external_link")
-VALUES (20220922152718, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:36:03', 'admin',
-        '删除', 1572848462892752896, 2, 'OssFileInfo:delete', NULL, 2, 1, NULL, '');
-
--- v1.8.0 - Uncarbon - 新增错误原因堆栈、用户UA、IP属地字段;表注释更新
-ALTER TABLE sys_log
-    ADD COLUMN error_stacktrace varchar(3000) NOT NULL DEFAULT '',
-    ADD COLUMN user_agent varchar(255) NOT NULL DEFAULT '',
-    ADD COLUMN ip_location_region_name varchar(100) NOT NULL DEFAULT '',
-    ADD COLUMN ip_location_province_name varchar(100) NOT NULL DEFAULT '',
-    ADD COLUMN ip_location_city_name varchar(100) NOT NULL DEFAULT '',
-    ADD COLUMN ip_location_district_name varchar(100) NOT NULL DEFAULT '';
-
-COMMENT ON COLUMN sys_log.error_stacktrace IS '错误原因堆栈';
-COMMENT ON COLUMN sys_log.user_agent IS '用户UA';
-COMMENT ON COLUMN sys_log.ip_location_region_name IS 'IP地址属地-国家或地区名';
-COMMENT ON COLUMN sys_log.ip_location_province_name IS 'IP地址属地-省级行政区名';
-COMMENT ON COLUMN sys_log.ip_location_city_name IS 'IP地址属地-市级行政区名';
-COMMENT ON COLUMN sys_log.ip_location_district_name IS 'IP地址属地-县级行政区名';
-
-COMMENT ON TABLE sys_log IS '系统日志';
-
--- v1.8.0 - Uncarbon - 订正系统菜单-权限串缺少默认值问题
-ALTER TABLE "sys_menu"
-    ALTER COLUMN "permission" SET DEFAULT '';
+-- ----------------------------
+-- Table structure for sys_data_dict_classified & sys_data_dict_item
+-- ----------------------------
+CREATE TABLE "sys_data_dict_classified" (
+  "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) COLLATE "pg_catalog"."default",
+  "updated_at" timestamp(6) NOT NULL,
+  "updated_by" varchar(255) COLLATE "pg_catalog"."default",
+  "code" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
+  "name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
+  "status" int2 NOT NULL DEFAULT 1,
+  "description" varchar(255) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying
+);
+COMMENT ON COLUMN "sys_data_dict_classified"."id" IS '主键ID';
+COMMENT ON COLUMN "sys_data_dict_classified"."tenant_id" IS '租户ID';
+COMMENT ON COLUMN "sys_data_dict_classified"."revision" IS '乐观锁';
+COMMENT ON COLUMN "sys_data_dict_classified"."del_flag" IS '逻辑删除标识';
+COMMENT ON COLUMN "sys_data_dict_classified"."created_at" IS '创建时刻';
+COMMENT ON COLUMN "sys_data_dict_classified"."created_by" IS '创建者';
+COMMENT ON COLUMN "sys_data_dict_classified"."updated_at" IS '更新时刻';
+COMMENT ON COLUMN "sys_data_dict_classified"."updated_by" IS '更新者';
+COMMENT ON COLUMN "sys_data_dict_classified"."code" IS '分类编码';
+COMMENT ON COLUMN "sys_data_dict_classified"."name" IS '分类名称';
+COMMENT ON COLUMN "sys_data_dict_classified"."status" IS '状态';
+COMMENT ON COLUMN "sys_data_dict_classified"."description" IS '分类描述';
+COMMENT ON TABLE "sys_data_dict_classified" IS '数据字典分类';
+ALTER TABLE "sys_data_dict_classified" ADD PRIMARY KEY ("id");
+
+CREATE TABLE "sys_data_dict_item" (
+  "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) COLLATE "pg_catalog"."default",
+  "updated_at" timestamp(6) NOT NULL,
+  "updated_by" varchar(255) COLLATE "pg_catalog"."default",
+  "classified_id" int8 NOT NULL,
+  "code" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
+  "label" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
+  "value" varchar(4096) COLLATE "pg_catalog"."default" NOT NULL,
+  "status" int2 NOT NULL DEFAULT 1,
+  "sort" int4 NOT NULL DEFAULT 1,
+  "description" varchar(255) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying
+);
+COMMENT ON COLUMN "sys_data_dict_item"."id" IS '主键ID';
+COMMENT ON COLUMN "sys_data_dict_item"."tenant_id" IS '租户ID';
+COMMENT ON COLUMN "sys_data_dict_item"."revision" IS '乐观锁';
+COMMENT ON COLUMN "sys_data_dict_item"."del_flag" IS '逻辑删除标识';
+COMMENT ON COLUMN "sys_data_dict_item"."created_at" IS '创建时刻';
+COMMENT ON COLUMN "sys_data_dict_item"."created_by" IS '创建者';
+COMMENT ON COLUMN "sys_data_dict_item"."updated_at" IS '更新时刻';
+COMMENT ON COLUMN "sys_data_dict_item"."updated_by" IS '更新者';
+COMMENT ON COLUMN "sys_data_dict_item"."classified_id" IS '所属分类ID';
+COMMENT ON COLUMN "sys_data_dict_item"."code" IS '字典项编码';
+COMMENT ON COLUMN "sys_data_dict_item"."label" IS '字典项标签';
+COMMENT ON COLUMN "sys_data_dict_item"."value" IS '字典项值';
+COMMENT ON COLUMN "sys_data_dict_item"."status" IS '状态';
+COMMENT ON COLUMN "sys_data_dict_item"."sort" IS '排序';
+COMMENT ON COLUMN "sys_data_dict_item"."description" IS '描述';
+COMMENT ON TABLE "sys_data_dict_item" IS '数据字典项';
+ALTER TABLE "sys_data_dict_item" ADD PRIMARY KEY ("id");
+
+-- ----------------------------
+-- 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/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', '');
+INSERT INTO "sys_menu"
+VALUES (48, 0, 1, 0, '2022-06-29 17:35:26', 'admin', '2022-06-29 17:35:26', 'admin', '绑定角色与菜单关联关系', 12, 2, 'SysRole:bindMenus',
+        'ant-design:share-alt-outlined', 5, 1, NULL, '');
+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_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");
+
+
+-- v1.7.2 - Uncarbon - 默认内置文件上传功能
+-- 建表 oss_file_info
+DROP TABLE IF EXISTS "oss_file_info";
+CREATE TABLE "oss_file_info"
+(
+    "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),
+    "storage_platform"  varchar(50)  NOT NULL,
+    "storage_base_path" varchar(255) NOT NULL,
+    "storage_path"      varchar(512) NOT NULL,
+    "storage_filename"  varchar(255) NOT NULL,
+    "original_filename" varchar(255) NOT NULL,
+    "extend_name"       varchar(16)  NOT NULL,
+    "file_size"         int8         NOT NULL,
+    "md5"               varchar(32)  NOT NULL,
+    "classified"        varchar(50),
+    "direct_url"        varchar(512)
+)
+;
+COMMENT
+ON COLUMN "oss_file_info"."id" IS '主键ID';
+COMMENT
+ON COLUMN "oss_file_info"."tenant_id" IS '租户ID';
+COMMENT
+ON COLUMN "oss_file_info"."revision" IS '乐观锁';
+COMMENT
+ON COLUMN "oss_file_info"."del_flag" IS '逻辑删除标识';
+COMMENT
+ON COLUMN "oss_file_info"."created_at" IS '创建时刻';
+COMMENT
+ON COLUMN "oss_file_info"."created_by" IS '创建者';
+COMMENT
+ON COLUMN "oss_file_info"."updated_at" IS '更新时刻';
+COMMENT
+ON COLUMN "oss_file_info"."updated_by" IS '更新者';
+COMMENT
+ON COLUMN "oss_file_info"."storage_platform" IS '存储平台';
+COMMENT
+ON COLUMN "oss_file_info"."storage_base_path" IS '基础存储路径';
+COMMENT
+ON COLUMN "oss_file_info"."storage_path" IS '存储路径';
+COMMENT
+ON COLUMN "oss_file_info"."storage_filename" IS '存储文件名';
+COMMENT
+ON COLUMN "oss_file_info"."original_filename" IS '原始文件名';
+COMMENT
+ON COLUMN "oss_file_info"."extend_name" IS '扩展名';
+COMMENT
+ON COLUMN "oss_file_info"."file_size" IS '文件大小';
+COMMENT
+ON COLUMN "oss_file_info"."md5" IS 'MD5';
+COMMENT
+ON COLUMN "oss_file_info"."classified" IS '文件类别';
+COMMENT
+ON COLUMN "oss_file_info"."direct_url" IS '对象存储直链';
+COMMENT
+ON TABLE "oss_file_info" IS '上传文件信息';
+
+-- 主键
+ALTER TABLE "oss_file_info"
+    ADD CONSTRAINT "oss_file_info_pkey" PRIMARY KEY ("id");
+
+
+-- v1.7.2 - Uncarbon - 新增上传文件信息管理菜单
+INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
+                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
+                       "external_link")
+VALUES (20220922152714, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:27:14',
+        'helio-generator', '上传文件信息管理', 0, 1, 'OssFileInfo', 'ant-design:flag-outlined', 100, 1,
+        '/oss/OssFileInfo/index', '');
+INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
+                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
+                       "external_link")
+VALUES (20220922152715, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:27:14',
+        'helio-generator', '查询', 1572848462892752896, 2, 'OssFileInfo:retrieve', NULL, 1, 1, NULL, '');
+INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
+                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
+                       "external_link")
+VALUES (20220922152716, NULL, 1, 1, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:35:48', 'admin',
+        '新增', 1572848462892752896, 2, 'OssFileInfo:create', NULL, 2, 1, NULL, '');
+INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
+                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
+                       "external_link")
+VALUES (20220922152717, NULL, 1, 1, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:35:55', 'admin',
+        '编辑', 1572848462892752896, 2, 'OssFileInfo:update', NULL, 4, 1, NULL, '');
+INSERT INTO "sys_menu"("id", "tenant_id", "revision", "del_flag", "created_at", "created_by", "updated_at",
+                       "updated_by", "title", "parent_id", "type", "permission", "icon", "sort", "status", "component",
+                       "external_link")
+VALUES (20220922152718, NULL, 1, 0, '2022-09-22 15:27:14', 'helio-generator', '2022-09-22 15:36:03', 'admin',
+        '删除', 1572848462892752896, 2, 'OssFileInfo:delete', NULL, 2, 1, NULL, '');
+
+-- v1.8.0 - Uncarbon - 新增错误原因堆栈、用户UA、IP属地字段;表注释更新
+ALTER TABLE sys_log
+    ADD COLUMN error_stacktrace varchar(3000) NOT NULL DEFAULT '',
+    ADD COLUMN user_agent varchar(255) NOT NULL DEFAULT '',
+    ADD COLUMN ip_location_region_name varchar(100) NOT NULL DEFAULT '',
+    ADD COLUMN ip_location_province_name varchar(100) NOT NULL DEFAULT '',
+    ADD COLUMN ip_location_city_name varchar(100) NOT NULL DEFAULT '',
+    ADD COLUMN ip_location_district_name varchar(100) NOT NULL DEFAULT '';
+
+COMMENT ON COLUMN sys_log.error_stacktrace IS '错误原因堆栈';
+COMMENT ON COLUMN sys_log.user_agent IS '用户UA';
+COMMENT ON COLUMN sys_log.ip_location_region_name IS 'IP地址属地-国家或地区名';
+COMMENT ON COLUMN sys_log.ip_location_province_name IS 'IP地址属地-省级行政区名';
+COMMENT ON COLUMN sys_log.ip_location_city_name IS 'IP地址属地-市级行政区名';
+COMMENT ON COLUMN sys_log.ip_location_district_name IS 'IP地址属地-县级行政区名';
+
+COMMENT ON TABLE sys_log IS '系统日志';
+
+-- v1.8.0 - Uncarbon - 订正系统菜单-权限串缺少默认值问题
+ALTER TABLE "sys_menu"
+    ALTER COLUMN "permission" SET DEFAULT '';

+ 64 - 0
attachments/db/PostgreSQL/upgrade/2.0.0_to_2.1.0.sql

@@ -0,0 +1,64 @@
+-- 重构数据字典,拆分为`sys_data_dict_classified`(数据字典分类)和`sys_data_dict_item`(数据字典项),并重新设计字段
+CREATE TABLE "sys_data_dict_classified" (
+  "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) COLLATE "pg_catalog"."default",
+  "updated_at" timestamp(6) NOT NULL,
+  "updated_by" varchar(255) COLLATE "pg_catalog"."default",
+  "code" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
+  "name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
+  "status" int2 NOT NULL DEFAULT 1,
+  "description" varchar(255) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying
+);
+COMMENT ON COLUMN "sys_data_dict_classified"."id" IS '主键ID';
+COMMENT ON COLUMN "sys_data_dict_classified"."tenant_id" IS '租户ID';
+COMMENT ON COLUMN "sys_data_dict_classified"."revision" IS '乐观锁';
+COMMENT ON COLUMN "sys_data_dict_classified"."del_flag" IS '逻辑删除标识';
+COMMENT ON COLUMN "sys_data_dict_classified"."created_at" IS '创建时刻';
+COMMENT ON COLUMN "sys_data_dict_classified"."created_by" IS '创建者';
+COMMENT ON COLUMN "sys_data_dict_classified"."updated_at" IS '更新时刻';
+COMMENT ON COLUMN "sys_data_dict_classified"."updated_by" IS '更新者';
+COMMENT ON COLUMN "sys_data_dict_classified"."code" IS '分类编码';
+COMMENT ON COLUMN "sys_data_dict_classified"."name" IS '分类名称';
+COMMENT ON COLUMN "sys_data_dict_classified"."status" IS '状态';
+COMMENT ON COLUMN "sys_data_dict_classified"."description" IS '分类描述';
+COMMENT ON TABLE "sys_data_dict_classified" IS '数据字典分类';
+ALTER TABLE "sys_data_dict_classified" ADD PRIMARY KEY ("id");
+
+CREATE TABLE "sys_data_dict_item" (
+  "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) COLLATE "pg_catalog"."default",
+  "updated_at" timestamp(6) NOT NULL,
+  "updated_by" varchar(255) COLLATE "pg_catalog"."default",
+  "classified_id" int8 NOT NULL,
+  "code" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
+  "label" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
+  "value" varchar(4096) COLLATE "pg_catalog"."default" NOT NULL,
+  "status" int2 NOT NULL DEFAULT 1,
+  "sort" int4 NOT NULL DEFAULT 1,
+  "description" varchar(255) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying
+);
+COMMENT ON COLUMN "sys_data_dict_item"."id" IS '主键ID';
+COMMENT ON COLUMN "sys_data_dict_item"."tenant_id" IS '租户ID';
+COMMENT ON COLUMN "sys_data_dict_item"."revision" IS '乐观锁';
+COMMENT ON COLUMN "sys_data_dict_item"."del_flag" IS '逻辑删除标识';
+COMMENT ON COLUMN "sys_data_dict_item"."created_at" IS '创建时刻';
+COMMENT ON COLUMN "sys_data_dict_item"."created_by" IS '创建者';
+COMMENT ON COLUMN "sys_data_dict_item"."updated_at" IS '更新时刻';
+COMMENT ON COLUMN "sys_data_dict_item"."updated_by" IS '更新者';
+COMMENT ON COLUMN "sys_data_dict_item"."classified_id" IS '所属分类ID';
+COMMENT ON COLUMN "sys_data_dict_item"."code" IS '字典项编码';
+COMMENT ON COLUMN "sys_data_dict_item"."label" IS '字典项标签';
+COMMENT ON COLUMN "sys_data_dict_item"."value" IS '字典项值';
+COMMENT ON COLUMN "sys_data_dict_item"."status" IS '状态';
+COMMENT ON COLUMN "sys_data_dict_item"."sort" IS '排序';
+COMMENT ON COLUMN "sys_data_dict_item"."description" IS '描述';
+COMMENT ON TABLE "sys_data_dict_item" IS '数据字典项';
+ALTER TABLE "sys_data_dict_item" ADD PRIMARY KEY ("id");

+ 2 - 2
pom.xml

@@ -8,13 +8,13 @@
     <parent>
         <groupId>cc.uncarbon.framework</groupId>
         <artifactId>helio-starters</artifactId>
-        <version>2.0.0</version>
+        <version>2.1.0</version>
     </parent>
 
     <artifactId>helio-boot</artifactId>
     <description>Helio 单模块版单体脚手架</description>
     <!-- 制品版本号,建议每次打包发布时都调整以作区分 -->
-    <version>2.0.1</version>
+    <version>2.1.0</version>
 
     <properties>
         <!-- 这里写其他第三方依赖 -->

+ 2 - 0
src/main/java/cc/uncarbon/module/adminapi/model/response/SelectOptionItemVO.java

@@ -9,6 +9,7 @@ import lombok.NonNull;
 import lombok.Setter;
 import lombok.experimental.Accessors;
 
+import java.io.Serial;
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
@@ -26,6 +27,7 @@ import java.util.stream.Stream;
 @Getter
 public class SelectOptionItemVO implements Serializable {
 
+    @Serial
     private static final long serialVersionUID = 1L;
 
     // ID👉名称 一对(用于关联各种实体)

+ 68 - 32
src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysDataDictController.java

@@ -6,22 +6,24 @@ import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
 import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
+import cc.uncarbon.module.adminapi.util.AdminStpUtil;
 import cc.uncarbon.module.sys.annotation.SysLog;
-import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysDataDictDTO;
-import cc.uncarbon.module.sys.model.request.AdminListSysDataDictDTO;
-import cc.uncarbon.module.sys.model.response.SysDataDictBO;
+import cc.uncarbon.module.sys.model.request.AdminSysDataDictClassifiedInsertOrUpdateDTO;
+import cc.uncarbon.module.sys.model.request.AdminSysDataDictClassifiedListDTO;
+import cc.uncarbon.module.sys.model.request.AdminSysDataDictItemInsertOrUpdateDTO;
+import cc.uncarbon.module.sys.model.request.AdminSysDataDictItemListDTO;
+import cc.uncarbon.module.sys.model.response.SysDataDictClassifiedBO;
+import cc.uncarbon.module.sys.model.response.SysDataDictItemBO;
 import cc.uncarbon.module.sys.service.SysDataDictService;
-import cc.uncarbon.module.adminapi.util.AdminStpUtil;
 import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
-import jakarta.validation.Valid;
-
 
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Tag(name = "数据字典管理接口")
@@ -37,48 +39,82 @@ public class AdminSysDataDictController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @Operation(summary = "分页列表")
-    @GetMapping(value = "/sys/data-dicts")
-    public ApiResult<PageResult<SysDataDictBO>> list(PageParam pageParam, AdminListSysDataDictDTO dto) {
-        return ApiResult.data(sysDataDictService.adminList(pageParam, dto));
+    @Operation(summary = "分页列表数据字典分类")
+    @GetMapping(value = "/sys/data-dict/classifieds")
+    public ApiResult<PageResult<SysDataDictClassifiedBO>> list(PageParam pageParam, AdminSysDataDictClassifiedListDTO dto) {
+        return ApiResult.data(sysDataDictService.adminListClassified(pageParam, dto));
+    }
+
+    @SysLog(value = "新增数据字典分类")
+    @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
+    @Operation(summary = "新增数据字典分类")
+    @PostMapping(value = "/sys/data-dict/classifieds")
+    public ApiResult<Void> insert(@RequestBody @Valid AdminSysDataDictClassifiedInsertOrUpdateDTO dto) {
+        sysDataDictService.adminInsertClassified(dto);
+
+        return ApiResult.success();
+    }
+
+    @SysLog(value = "编辑数据字典分类")
+    @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
+    @Operation(summary = "编辑数据字典分类")
+    @PutMapping(value = "/sys/data-dict/classifieds/{id}")
+    public ApiResult<Void> update(@PathVariable Long id, @RequestBody @Valid AdminSysDataDictClassifiedInsertOrUpdateDTO dto) {
+        dto.setId(id);
+        sysDataDictService.adminUpdateClassified(dto);
+
+        return ApiResult.success();
+    }
+
+    @SysLog(value = "删除数据字典分类")
+    @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
+    @Operation(summary = "删除数据字典分类")
+    @DeleteMapping(value = "/sys/data-dict/classifieds")
+    public ApiResult<Void> deleteClassified(@RequestBody @Valid IdsDTO<Long> dto) {
+        sysDataDictService.adminDeleteClassified(dto.getIds());
+
+        return ApiResult.success();
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @Operation(summary = "详情")
-    @GetMapping(value = "/sys/data-dicts/{id}")
-    public ApiResult<SysDataDictBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysDataDictService.getOneById(id, true));
+    @Operation(summary = "分页列表数据字典分类下的字典项")
+    @GetMapping(value = "/sys/data-dict/classifieds/{classifiedId}/items")
+    public ApiResult<PageResult<SysDataDictItemBO>> list(@PathVariable Long classifiedId, PageParam pageParam, AdminSysDataDictItemListDTO dto) {
+        dto.setClassifiedId(classifiedId);
+        return ApiResult.data(sysDataDictService.adminListItem(pageParam, dto));
     }
 
-    @SysLog(value = "新增数据字典")
+    @SysLog(value = "新增数据字典")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
-    @Operation(summary = "新增")
-    @PostMapping(value = "/sys/data-dicts")
-    public ApiResult<Void> insert(@RequestBody @Valid AdminInsertOrUpdateSysDataDictDTO dto) {
-        sysDataDictService.adminInsert(dto);
+    @Operation(summary = "新增数据字典项")
+    @PostMapping(value = "/sys/data-dict/classifieds/{classifiedId}/items")
+    public ApiResult<Void> insert(@PathVariable Long classifiedId, @RequestBody @Valid AdminSysDataDictItemInsertOrUpdateDTO dto) {
+        dto.setClassifiedId(classifiedId);
+        sysDataDictService.adminInsertItem(dto);
 
         return ApiResult.success();
     }
 
-    @SysLog(value = "编辑数据字典")
+    @SysLog(value = "编辑数据字典")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
-    @Operation(summary = "编辑")
-    @PutMapping(value = "/sys/data-dicts/{id}")
-    public ApiResult<Void> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysDataDictDTO dto) {
-        dto.setId(id);
-        sysDataDictService.adminUpdate(dto);
+    @Operation(summary = "编辑数据字典项")
+    @PutMapping(value = "/sys/data-dict/classifieds/{classifiedId}/items/{id}")
+    public ApiResult<Void> update(@PathVariable Long classifiedId, @PathVariable Long id, @RequestBody @Valid AdminSysDataDictItemInsertOrUpdateDTO dto) {
+        dto
+                .setId(id)
+                .setClassifiedId(classifiedId);
+        sysDataDictService.adminUpdateItem(dto);
 
         return ApiResult.success();
     }
 
-    @SysLog(value = "删除数据字典")
+    @SysLog(value = "删除数据字典")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
-    @Operation(summary = "删除")
-    @DeleteMapping(value = "/sys/data-dicts")
-    public ApiResult<Void> delete(@RequestBody @Valid IdsDTO<Long> dto) {
-        sysDataDictService.adminDelete(dto.getIds());
+    @Operation(summary = "删除数据字典项")
+    @DeleteMapping(value = "/sys/data-dict/classifieds/{classifiedId}/items")
+    public ApiResult<Void> deleteItem(@PathVariable Long classifiedId, @RequestBody @Valid IdsDTO<Long> dto) {
+        sysDataDictService.adminDeleteItem(dto.getIds(), classifiedId);
 
         return ApiResult.success();
     }
-
 }

+ 50 - 0
src/main/java/cc/uncarbon/module/sys/entity/SysDataDictClassifiedEntity.java

@@ -0,0 +1,50 @@
+package cc.uncarbon.module.sys.entity;
+
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serial;
+
+
+/**
+ * 数据字典分类
+ */
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@TableName(value = "sys_data_dict_classified")
+public class SysDataDictClassifiedEntity extends HelioBaseEntity<Long> {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "分类编码")
+    @TableField(value = "code")
+    private String code;
+
+    @Schema(description = "分类名称")
+    @TableField(value = "name")
+    private String name;
+
+    @Schema(description = "状态")
+    @TableField(value = "status")
+    private EnabledStatusEnum status;
+
+    @Schema(description = "分类描述")
+    @TableField(value = "description")
+    private String description;
+
+}

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

@@ -1,59 +0,0 @@
-package cc.uncarbon.module.sys.entity;
-
-import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-import lombok.experimental.SuperBuilder;
-
-
-/**
- * 数据字典
- */
-@EqualsAndHashCode(callSuper = true)
-@Accessors(chain = true)
-@SuperBuilder
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-@TableName(value = "sys_data_dict")
-public class SysDataDictEntity extends HelioBaseEntity<Long> {
-
-	@Schema(description = "驼峰式键名")
-	@TableField(value = "camel_case_key")
-	private String camelCaseKey;
-
-	@Schema(description = "下划线式键名")
-	@TableField(value = "under_case_key")
-	private String underCaseKey;
-
-	@Schema(description = "帕斯卡式键名")
-	@TableField(value = "pascal_case_key")
-	private String pascalCaseKey;
-
-	@Schema(description = "数据值")
-	@TableField(value = "value")
-	private String value;
-
-	@Schema(description = "描述")
-	@TableField(value = "description")
-	private String description;
-
-	@Schema(description = "单位")
-	@TableField(value = "unit")
-	private String unit;
-
-	@Schema(description = "取值范围")
-	@TableField(value = "value_range")
-	private String valueRange;
-
-	@Schema(description = "别称键名")
-	@TableField(value = "alias_key")
-	private String aliasKey;
-
-}

+ 62 - 0
src/main/java/cc/uncarbon/module/sys/entity/SysDataDictItemEntity.java

@@ -0,0 +1,62 @@
+package cc.uncarbon.module.sys.entity;
+
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serial;
+
+
+/**
+ * 数据字典项
+ */
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@TableName(value = "sys_data_dict_item")
+public class SysDataDictItemEntity extends HelioBaseEntity<Long> {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "所属分类ID")
+    @TableField(value = "classified_id")
+    private Long classifiedId;
+
+    @Schema(description = "字典项编码")
+    @TableField(value = "code")
+    private String code;
+
+    @Schema(description = "字典项标签")
+    @TableField(value = "label")
+    private String label;
+
+    @Schema(description = "字典项值")
+    @TableField(value = "value")
+    private String value;
+
+    @Schema(description = "状态")
+    @TableField(value = "status")
+    private EnabledStatusEnum status;
+
+    @Schema(description = "排序")
+    @TableField(value = "sort")
+    private Integer sort;
+
+    @Schema(description = "描述")
+    @TableField(value = "description")
+    private String description;
+
+}

+ 31 - 0
src/main/java/cc/uncarbon/module/sys/mapper/SysDataDictClassifiedMapper.java

@@ -0,0 +1,31 @@
+package cc.uncarbon.module.sys.mapper;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
+import cc.uncarbon.module.sys.entity.SysDataDictClassifiedEntity;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Objects;
+
+
+/**
+ * 数据字典分类
+ */
+@Mapper
+public interface SysDataDictClassifiedMapper extends BaseMapper<SysDataDictClassifiedEntity> {
+
+    default SysDataDictClassifiedEntity selectByCode(@Nonnull String code, @Nullable EnabledStatusEnum status) {
+        return selectOne(
+                new QueryWrapper<SysDataDictClassifiedEntity>()
+                        .lambda()
+                        .eq(SysDataDictClassifiedEntity::getCode, code)
+                        .eq(Objects.nonNull(status), SysDataDictClassifiedEntity::getStatus, status)
+                        .last(HelioConstant.CRUD.SQL_LIMIT_1)
+        );
+    }
+
+}

+ 3 - 3
src/main/java/cc/uncarbon/module/sys/mapper/SysDataDictMapper.java → src/main/java/cc/uncarbon/module/sys/mapper/SysDataDictItemMapper.java

@@ -1,14 +1,14 @@
 package cc.uncarbon.module.sys.mapper;
 
-import cc.uncarbon.module.sys.entity.SysDataDictEntity;
+import cc.uncarbon.module.sys.entity.SysDataDictItemEntity;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
 
 /**
- * 数据字典
+ * 数据字典
  */
 @Mapper
-public interface SysDataDictMapper extends BaseMapper<SysDataDictEntity> {
+public interface SysDataDictItemMapper extends BaseMapper<SysDataDictItemEntity> {
 
 }

+ 0 - 65
src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysDataDictDTO.java

@@ -1,65 +0,0 @@
-package cc.uncarbon.module.sys.model.request;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.Size;
-import java.io.Serializable;
-
-
-/**
- * 后台管理-新增/编辑数据字典
- */
-@Accessors(chain = true)
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class AdminInsertOrUpdateSysDataDictDTO implements Serializable {
-
-    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
-    private Long id;
-
-    @Schema(description = "驼峰式键名", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Size(max = 100, message = "【驼峰式键名】最长100位")
-    @NotBlank(message = "驼峰式键名不能为空")
-    private String camelCaseKey;
-
-    @Schema(description = "下划线式键名", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Size(max = 100, message = "【下划线式键名】最长100位")
-    @NotBlank(message = "下划线式键名不能为空")
-    private String underCaseKey;
-
-    @Schema(description = "帕斯卡式键名", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Size(max = 100, message = "【帕斯卡式键名】最长100位")
-    @NotBlank(message = "帕斯卡式键名不能为空")
-    private String pascalCaseKey;
-
-    @Schema(description = "数据值", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Size(max = 255, message = "【数据值】最长255位")
-    @NotBlank(message = "数据值不能为空")
-    private String value;
-
-    @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Size(max = 255, message = "【描述】最长255位")
-    @NotBlank(message = "描述不能为空")
-    private String description;
-
-    @Schema(description = "单位")
-    @Size(max = 30, message = "【单位】最长30位")
-    private String unit;
-
-    @Schema(description = "取值范围")
-    @Size(max = 255, message = "【取值范围】最长255位")
-    private String valueRange;
-
-    @Schema(description = "别称键名")
-    @Size(max = 100, message = "【别称键名】最长100位")
-    private String aliasKey;
-
-}

+ 53 - 0
src/main/java/cc/uncarbon/module/sys/model/request/AdminSysDataDictClassifiedInsertOrUpdateDTO.java

@@ -0,0 +1,53 @@
+package cc.uncarbon.module.sys.model.request;
+
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 后台管理-新增/编辑数据字典分类 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysDataDictClassifiedInsertOrUpdateDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
+    private Long id;
+
+    @Schema(description = "分类编码", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Size(max = 255, message = "【分类编码】最长255位")
+    @NotBlank(message = "分类编码不能为空")
+    private String code;
+
+    @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Size(max = 255, message = "【分类名称】最长255位")
+    @NotBlank(message = "分类名称不能为空")
+    private String name;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "状态不能为空")
+    private EnabledStatusEnum status;
+
+    @Schema(description = "分类描述")
+    @Size(max = 255, message = "【分类描述】最长255位")
+    private String description;
+
+}

+ 11 - 6
src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysDataDictDTO.java → src/main/java/cc/uncarbon/module/sys/model/request/AdminSysDataDictClassifiedListDTO.java

@@ -2,25 +2,30 @@ package cc.uncarbon.module.sys.model.request;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
 
+import java.io.Serial;
 import java.io.Serializable;
 
 
 /**
- * 后台管理-分页列表数据字典
+ * 后台管理-分页列表数据字典分类 DTO
  */
 @Accessors(chain = true)
-@Builder
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
-public class AdminListSysDataDictDTO implements Serializable {
+public class AdminSysDataDictClassifiedListDTO implements Serializable {
 
-    @Schema(description = "描述(关键词)")
-    private String description;
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "分类编码")
+    private String code;
 
 }

+ 65 - 0
src/main/java/cc/uncarbon/module/sys/model/request/AdminSysDataDictItemInsertOrUpdateDTO.java

@@ -0,0 +1,65 @@
+package cc.uncarbon.module.sys.model.request;
+
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 后台管理-新增/编辑数据字典项 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysDataDictItemInsertOrUpdateDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
+    private Long id;
+
+    @Schema(description = "所属分类ID", hidden = true)
+    private Long classifiedId;
+
+    @Schema(description = "字典项编码", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Size(max = 255, message = "【字典项编码】最长255位")
+    @NotBlank(message = "字典项编码不能为空")
+    private String code;
+
+    @Schema(description = "字典项标签", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Size(max = 255, message = "【字典项标签】最长255位")
+    @NotBlank(message = "字典项标签不能为空")
+    private String label;
+
+    @Schema(description = "字典项值", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Size(max = 4096, message = "【字典项值】最长4096位")
+    @NotBlank(message = "字典项值不能为空")
+    private String value;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "状态不能为空")
+    private EnabledStatusEnum status;
+
+    @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "排序不能为空")
+    private Integer sort;
+
+    @Schema(description = "描述")
+    @Size(max = 255, message = "【描述】最长255位")
+    private String description;
+
+}

+ 31 - 0
src/main/java/cc/uncarbon/module/sys/model/request/AdminSysDataDictItemListDTO.java

@@ -0,0 +1,31 @@
+package cc.uncarbon.module.sys.model.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 后台管理-分页列表数据字典项 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysDataDictItemListDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "所属分类ID", hidden = true)
+    private Long classifiedId;
+
+}

+ 18 - 24
src/main/java/cc/uncarbon/module/sys/model/response/SysDataDictBO.java → src/main/java/cc/uncarbon/module/sys/model/response/SysDataDictClassifiedBO.java

@@ -1,30 +1,36 @@
 package cc.uncarbon.module.sys.model.response;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.io.Serial;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
 
 /**
- * 数据字典BO
+ * 数据字典分类 BO
  */
 @Accessors(chain = true)
-@Builder
+@SuperBuilder
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
-public class SysDataDictBO implements Serializable {
+public class SysDataDictClassifiedBO implements Serializable {
 
-    @Schema(description = "主键ID")
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
     private Long id;
 
     @Schema(description = "创建时刻")
@@ -37,28 +43,16 @@ public class SysDataDictBO implements Serializable {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime updatedAt;
 
-    @Schema(description = "驼峰式键名")
-    private String camelCaseKey;
-
-    @Schema(description = "下划线式键名")
-    private String underCaseKey;
+    @Schema(description = "分类编码")
+    private String code;
 
-    @Schema(description = "帕斯卡式键名")
-    private String pascalCaseKey;
+    @Schema(description = "分类名称")
+    private String name;
 
-    @Schema(description = "数据值")
-    private String value;
+    @Schema(description = "状态")
+    private EnabledStatusEnum status;
 
-    @Schema(description = "描述")
+    @Schema(description = "分类描述")
     private String description;
 
-    @Schema(description = "单位")
-    private String unit;
-
-    @Schema(description = "取值范围")
-    private String valueRange;
-
-    @Schema(description = "别称键名")
-    private String aliasKey;
-
 }

+ 67 - 0
src/main/java/cc/uncarbon/module/sys/model/response/SysDataDictItemBO.java

@@ -0,0 +1,67 @@
+package cc.uncarbon.module.sys.model.response;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 数据字典项 BO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SysDataDictItemBO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+
+    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
+    private Long id;
+
+    @Schema(description = "创建时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime createdAt;
+
+    @Schema(description = "更新时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime updatedAt;
+
+    @Schema(description = "所属分类ID")
+    private Long classifiedId;
+
+    @Schema(description = "字典项编码")
+    private String code;
+
+    @Schema(description = "字典项标签")
+    private String label;
+
+    @Schema(description = "字典项值")
+    private String value;
+
+    @Schema(description = "状态")
+    private EnabledStatusEnum status;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "描述")
+    private String description;
+
+}

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

@@ -1,29 +1,32 @@
 package cc.uncarbon.module.sys.service;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.framework.core.exception.BusinessException;
 import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
-import cc.uncarbon.module.sys.entity.SysDataDictEntity;
-import cc.uncarbon.module.sys.enums.SysErrorEnum;
-import cc.uncarbon.module.sys.mapper.SysDataDictMapper;
-import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysDataDictDTO;
-import cc.uncarbon.module.sys.model.request.AdminListSysDataDictDTO;
-import cc.uncarbon.module.sys.model.response.SysDataDictBO;
+import cc.uncarbon.module.sys.entity.SysDataDictClassifiedEntity;
+import cc.uncarbon.module.sys.entity.SysDataDictItemEntity;
+import cc.uncarbon.module.sys.mapper.SysDataDictClassifiedMapper;
+import cc.uncarbon.module.sys.mapper.SysDataDictItemMapper;
+import cc.uncarbon.module.sys.model.request.AdminSysDataDictClassifiedInsertOrUpdateDTO;
+import cc.uncarbon.module.sys.model.request.AdminSysDataDictClassifiedListDTO;
+import cc.uncarbon.module.sys.model.request.AdminSysDataDictItemInsertOrUpdateDTO;
+import cc.uncarbon.module.sys.model.request.AdminSysDataDictItemListDTO;
+import cc.uncarbon.module.sys.model.response.SysDataDictClassifiedBO;
+import cc.uncarbon.module.sys.model.response.SysDataDictItemBO;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.annotation.Nonnull;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 
 
 /**
@@ -34,90 +37,156 @@ import java.util.List;
 @Slf4j
 public class SysDataDictService {
 
-    private final SysDataDictMapper sysDataDictMapper;
+    private final SysDataDictClassifiedMapper sysDataDictClassifiedMapper;
+    private final SysDataDictItemMapper sysDataDictItemMapper;
 
 
     /**
-     * 后台管理-分页列表
+     * 后台管理-分页列表数据字典分类
      */
-    public PageResult<SysDataDictBO> adminList(PageParam pageParam, AdminListSysDataDictDTO dto) {
-        Page<SysDataDictEntity> entityPage = sysDataDictMapper.selectPage(
+    public PageResult<SysDataDictClassifiedBO> adminListClassified(PageParam pageParam, AdminSysDataDictClassifiedListDTO dto) {
+        Page<SysDataDictClassifiedEntity> entityPage = sysDataDictClassifiedMapper.selectPage(
                 new Page<>(pageParam.getPageNum(), pageParam.getPageSize()),
-                new QueryWrapper<SysDataDictEntity>()
+                new QueryWrapper<SysDataDictClassifiedEntity>()
                         .lambda()
-                        // 参数描述
-                        .like(CharSequenceUtil.isNotBlank(dto.getDescription()), SysDataDictEntity::getDescription, CharSequenceUtil.cleanBlank(dto.getDescription()))
+                        // 分类编码
+                        .eq(CharSequenceUtil.isNotBlank(dto.getCode()), SysDataDictClassifiedEntity::getCode, CharSequenceUtil.cleanBlank(dto.getCode()))
                         // 排序
-                        .orderByDesc(SysDataDictEntity::getCreatedAt)
+                        .orderByDesc(SysDataDictClassifiedEntity::getCreatedAt)
         );
 
-        return this.entityPage2BOPage(entityPage);
+        return this.classifiedEntityPage2BOPage(entityPage);
     }
 
     /**
-     * 根据 ID 取详情
+     * 后台管理-新增数据字典分类
      *
-     * @param id 主键ID
-     * @return null or BO
+     * @return 主键ID
      */
-    public SysDataDictBO getOneById(Long id) {
-        return this.getOneById(id, false);
+    @Transactional(rollbackFor = Exception.class)
+    public Long adminInsertClassified(AdminSysDataDictClassifiedInsertOrUpdateDTO dto) {
+        log.info("[后台管理-新增数据字典分类] >> 入参={}", dto);
+        this.checkExistence(dto);
+
+        dto.setId(null);
+        SysDataDictClassifiedEntity entity = new SysDataDictClassifiedEntity();
+        BeanUtil.copyProperties(dto, entity);
+
+        sysDataDictClassifiedMapper.insert(entity);
+
+        return entity.getId();
     }
 
     /**
-     * 根据 ID 取详情
-     *
-     * @param id 主键ID
-     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
-     * @return null or BO
-     */
-    public SysDataDictBO getOneById(Long id, boolean throwIfInvalidId) throws BusinessException {
-        SysDataDictEntity entity = sysDataDictMapper.selectById(id);
-        if (throwIfInvalidId) {
-            SysErrorEnum.INVALID_ID.assertNotNull(entity);
-        }
+     * 后台管理-编辑数据字典分类
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void adminUpdateClassified(AdminSysDataDictClassifiedInsertOrUpdateDTO dto) {
+        log.info("[后台管理-编辑数据字典分类] >> 入参={}", dto);
+        this.checkExistence(dto);
+
+        SysDataDictClassifiedEntity entity = new SysDataDictClassifiedEntity();
+        BeanUtil.copyProperties(dto, entity);
+
+        sysDataDictClassifiedMapper.updateById(entity);
+    }
+
+    /**
+     * 后台管理-删除数据字典分类
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void adminDeleteClassified(Collection<Long> ids) {
+        log.info("[后台管理-删除数据字典分类] >> 入参={}", ids);
+        sysDataDictClassifiedMapper.deleteBatchIds(ids);
+    }
+
+    /**
+     * 后台管理-分页列表数据字典分类下的字典项
+     */
+    public PageResult<SysDataDictItemBO> adminListItem(PageParam pageParam, AdminSysDataDictItemListDTO dto) {
+        Page<SysDataDictItemEntity> entityPage = sysDataDictItemMapper.selectPage(
+                new Page<>(pageParam.getPageNum(), pageParam.getPageSize()),
+                new QueryWrapper<SysDataDictItemEntity>()
+                        .lambda()
+                        // 分类ID
+                        .eq(SysDataDictItemEntity::getClassifiedId, dto.getClassifiedId())
+                        // 排序
+                        .orderByAsc(SysDataDictItemEntity::getSort)
+        );
 
-        return this.entity2BO(entity);
+        return this.itemEntityPage2BOPage(entityPage);
     }
 
     /**
-     * 后台管理-新增
+     * 后台管理-新增数据字典项
+     *
+     * @return 主键ID
      */
     @Transactional(rollbackFor = Exception.class)
-    public Long adminInsert(AdminInsertOrUpdateSysDataDictDTO dto) {
-        log.info("[后台管理-新增数据字典] >> 入参={}", dto);
+    public Long adminInsertItem(AdminSysDataDictItemInsertOrUpdateDTO dto) {
+        log.info("[后台管理-新增数据字典] >> 入参={}", dto);
         this.checkExistence(dto);
 
         dto.setId(null);
-        SysDataDictEntity entity = new SysDataDictEntity();
+        SysDataDictItemEntity entity = new SysDataDictItemEntity();
         BeanUtil.copyProperties(dto, entity);
 
-        sysDataDictMapper.insert(entity);
+        sysDataDictItemMapper.insert(entity);
 
         return entity.getId();
     }
 
     /**
-     * 后台管理-编辑
+     * 后台管理-编辑数据字典项
      */
     @Transactional(rollbackFor = Exception.class)
-    public void adminUpdate(AdminInsertOrUpdateSysDataDictDTO dto) {
-        log.info("[后台管理-编辑数据字典] >> 入参={}", dto);
+    public void adminUpdateItem(AdminSysDataDictItemInsertOrUpdateDTO dto) {
+        log.info("[后台管理-编辑数据字典] >> 入参={}", dto);
         this.checkExistence(dto);
 
-        SysDataDictEntity entity = new SysDataDictEntity();
+        SysDataDictItemEntity entity = new SysDataDictItemEntity();
         BeanUtil.copyProperties(dto, entity);
 
-        sysDataDictMapper.updateById(entity);
+        sysDataDictItemMapper.updateById(entity);
     }
 
     /**
-     * 后台管理-删除
+     * 后台管理-删除数据字典项
      */
     @Transactional(rollbackFor = Exception.class)
-    public void adminDelete(Collection<Long> ids) {
-        log.info("[后台管理-删除数据字典] >> 入参={}", ids);
-        sysDataDictMapper.deleteBatchIds(ids);
+    public void adminDeleteItem(Collection<Long> ids, Long classifiedId) {
+        log.info("[后台管理-删除数据字典项] >> 分类ID={}  入参={}", classifiedId, ids);
+        sysDataDictItemMapper.delete(
+                new QueryWrapper<SysDataDictItemEntity>()
+                        .lambda()
+                        .eq(SysDataDictItemEntity::getClassifiedId, classifiedId)
+                        .in(SysDataDictItemEntity::getId, ids)
+        );
+    }
+
+    /**
+     * 列举指定分类编码下的所有启用的字典项
+     *
+     * @return 存在则返回字典项列表;不存在或没有符合的字典项,均返回空列表
+     */
+    public List<SysDataDictItemBO> listEnabledItemsByClassifiedCode(@Nonnull String classifiedCode) {
+        SysDataDictClassifiedEntity classified =
+                sysDataDictClassifiedMapper.selectByCode(classifiedCode, EnabledStatusEnum.ENABLED);
+        if (Objects.isNull(classified)) {
+            return Collections.emptyList();
+        }
+        return itemEntityList2BOs(
+                sysDataDictItemMapper.selectList(
+                        new QueryWrapper<SysDataDictItemEntity>()
+                                .lambda()
+                                // 分类ID
+                                .eq(SysDataDictItemEntity::getClassifiedId, classified.getId())
+                                // 状态
+                                .eq(SysDataDictItemEntity::getStatus, EnabledStatusEnum.ENABLED)
+                                // 排序
+                                .orderByAsc(SysDataDictItemEntity::getSort)
+                )
+        );
     }
 
     /*
@@ -132,12 +201,31 @@ public class SysDataDictService {
      * @param entity 实体
      * @return BO
      */
-    private SysDataDictBO entity2BO(SysDataDictEntity entity) {
+    private SysDataDictClassifiedBO entity2BO(SysDataDictClassifiedEntity entity) {
+        if (entity == null) {
+            return null;
+        }
+
+        SysDataDictClassifiedBO bo = new SysDataDictClassifiedBO();
+        BeanUtil.copyProperties(entity, bo);
+
+        // 可以在此处为BO填充字段
+
+        return bo;
+    }
+
+    /**
+     * 实体转 BO
+     *
+     * @param entity 实体
+     * @return BO
+     */
+    private SysDataDictItemBO entity2BO(SysDataDictItemEntity entity) {
         if (entity == null) {
             return null;
         }
 
-        SysDataDictBO bo = new SysDataDictBO();
+        SysDataDictItemBO bo = new SysDataDictItemBO();
         BeanUtil.copyProperties(entity, bo);
 
         // 可以在此处为BO填充字段
@@ -151,13 +239,33 @@ public class SysDataDictService {
      * @param entityList 实体 List
      * @return BO List
      */
-    private List<SysDataDictBO> entityList2BOs(List<SysDataDictEntity> entityList) {
+    private List<SysDataDictClassifiedBO> classifiedEntityList2BOs(List<SysDataDictClassifiedEntity> entityList) {
+        if (CollUtil.isEmpty(entityList)) {
+            return Collections.emptyList();
+        }
+
+        // 深拷贝
+        List<SysDataDictClassifiedBO> ret = new ArrayList<>(entityList.size());
+        entityList.forEach(
+                entity -> ret.add(this.entity2BO(entity))
+        );
+
+        return ret;
+    }
+
+    /**
+     * 实体 List 转 BO List
+     *
+     * @param entityList 实体 List
+     * @return BO List
+     */
+    private List<SysDataDictItemBO> itemEntityList2BOs(List<SysDataDictItemEntity> entityList) {
         if (CollUtil.isEmpty(entityList)) {
             return Collections.emptyList();
         }
 
         // 深拷贝
-        List<SysDataDictBO> ret = new ArrayList<>(entityList.size());
+        List<SysDataDictItemBO> ret = new ArrayList<>(entityList.size());
         entityList.forEach(
                 entity -> ret.add(this.entity2BO(entity))
         );
@@ -171,12 +279,47 @@ public class SysDataDictService {
      * @param entityPage 实体分页
      * @return BO 分页
      */
-    private PageResult<SysDataDictBO> entityPage2BOPage(Page<SysDataDictEntity> entityPage) {
-        return new PageResult<SysDataDictBO>()
+    private PageResult<SysDataDictClassifiedBO> classifiedEntityPage2BOPage(Page<SysDataDictClassifiedEntity> entityPage) {
+        return new PageResult<SysDataDictClassifiedBO>()
                 .setCurrent(entityPage.getCurrent())
                 .setSize(entityPage.getSize())
                 .setTotal(entityPage.getTotal())
-                .setRecords(this.entityList2BOs(entityPage.getRecords()));
+                .setRecords(this.classifiedEntityList2BOs(entityPage.getRecords()));
+    }
+
+    /**
+     * 实体分页转 BO 分页
+     *
+     * @param entityPage 实体分页
+     * @return BO 分页
+     */
+    private PageResult<SysDataDictItemBO> itemEntityPage2BOPage(Page<SysDataDictItemEntity> entityPage) {
+        return new PageResult<SysDataDictItemBO>()
+                .setCurrent(entityPage.getCurrent())
+                .setSize(entityPage.getSize())
+                .setTotal(entityPage.getTotal())
+                .setRecords(this.itemEntityList2BOs(entityPage.getRecords()));
+    }
+
+    /**
+     * 检查是否已存在相同数据
+     *
+     * @param dto DTO
+     */
+    private void checkExistence(AdminSysDataDictClassifiedInsertOrUpdateDTO dto) {
+        SysDataDictClassifiedEntity existingEntity = sysDataDictClassifiedMapper.selectOne(
+                new QueryWrapper<SysDataDictClassifiedEntity>()
+                        .lambda()
+                        // 仅取主键ID
+                        .select(SysDataDictClassifiedEntity::getId)
+                        // 分类编码相同
+                        .eq(SysDataDictClassifiedEntity::getCode, dto.getCode())
+                        .last(HelioConstant.CRUD.SQL_LIMIT_1)
+        );
+
+        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
+            throw new BusinessException(400, "已存在相同数据字典分类,请重新输入");
+        }
     }
 
     /**
@@ -184,25 +327,21 @@ public class SysDataDictService {
      *
      * @param dto DTO
      */
-    private void checkExistence(AdminInsertOrUpdateSysDataDictDTO dto) {
-        SysDataDictEntity existingEntity = sysDataDictMapper.selectOne(
-                new QueryWrapper<SysDataDictEntity>()
+    private void checkExistence(AdminSysDataDictItemInsertOrUpdateDTO dto) {
+        SysDataDictItemEntity existingEntity = sysDataDictItemMapper.selectOne(
+                new QueryWrapper<SysDataDictItemEntity>()
                         .lambda()
                         // 仅取主键ID
-                        .select(SysDataDictEntity::getId)
-                        // 驼峰式键名相同
-                        .eq(SysDataDictEntity::getCamelCaseKey, dto.getCamelCaseKey())
-                        .or()
-                        // 或帕斯卡式键名相同
-                        .eq(SysDataDictEntity::getPascalCaseKey, dto.getPascalCaseKey())
-                        .or()
-                        // 或下划线式键名相同
-                        .eq(SysDataDictEntity::getUnderCaseKey, dto.getUnderCaseKey())
+                        .select(SysDataDictItemEntity::getId)
+                        // 分类ID相同
+                        .eq(SysDataDictItemEntity::getClassifiedId, dto.getClassifiedId())
+                        // 分类编码相同
+                        .eq(SysDataDictItemEntity::getCode, dto.getCode())
                         .last(HelioConstant.CRUD.SQL_LIMIT_1)
         );
 
         if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
-            throw new BusinessException(400, "已存在相同数据字典,请重新输入");
+            throw new BusinessException(400, "已存在相同数据字典,请重新输入");
         }
     }
 

+ 2 - 0
src/main/resources/application.yml

@@ -85,6 +85,8 @@ logging:
     # 指定日志级别,开发、测试环境建议为 DEBUG,生产环境建议为 INFO
     cc.uncarbon.framework: DEBUG
     cc.uncarbon.module: DEBUG
+    # 单元测试日志级别
+    cc.uncarbon.test: INFO
 
 # 详细配置文档:https://sa-token.cc/doc.html#/use/config
 sa-token:

+ 3 - 3
src/test/java/cc/uncarbon/test/ExampleUnitTest.java

@@ -11,7 +11,7 @@ import cc.uncarbon.module.sys.service.SysRoleService;
 import cn.hutool.core.collection.CollUtil;
 import jakarta.annotation.Resource;
 import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
@@ -29,8 +29,8 @@ class ExampleUnitTest {
     private SysRoleService sysRoleService;
 
 
-    @BeforeEach
-    public void init() {
+    @BeforeAll
+    public static void init() {
         // 设置用户上下文
         UserContext userContext = new UserContext();
         userContext