From 039969e1ac5a02d9ee29e4211da6f3cafcc37004 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Sun, 22 Oct 2023 17:39:58 +0800 Subject: [PATCH 01/38] =?UTF-8?q?doc=20=E4=BB=BB=E5=8A=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index df3040bf..f8a443d4 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,6 +1,20 @@ # CHANGELOG - ## [v1.3.5] 一号线-园博园 +- 新增: SQL查询功能 +- 新增: SQL查询功能支持导出 +- 新增: 前端登录时检测密码是否需要进行修改 +- 新增: 默认密码强制修改功能 +- 新增: 记录密码输入错误次数 +- 新增: 多次输错密码自动锁定功能 +- 新增: 超过锁定时间后,再登录时解除锁定清空 +- 新增: 记录密码更改记录,不能与前N次相同功能 +- 新增: 控制密码多少天必须更改 +- 新增: 密码安全策略配置 +- 优化: 前端websocket连接前先检测是否已经登录 +- 优化: 完整集成Knife4j, 支持增强功能 +- 优化: 审计日志增加定时删除和一键清除超期日志功能 + +## [v1.3.4] 一号线-园博园 - 新增: 通用导入组件 - 新增: 小程序端脚手架 - 新增: 小程序后端对接相关配置 -- Gitee From aca925c51438a97aee821e39f3f79f4ab4d55002 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Mon, 23 Oct 2023 19:42:04 +0800 Subject: [PATCH 02/38] =?UTF-8?q?feat=20=E5=AF=86=E7=A0=81=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E5=90=8E=E6=B8=85=E9=99=A4=E6=89=80=E6=9C=89=E7=9A=84?= =?UTF-8?q?=E6=9D=83=E9=99=90=EF=BC=8C=E5=BF=85=E9=A1=BB=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 14 ------------- .../service/PasswordSecurityCheckService.java | 11 +++++++++- .../core/upms/service/RolePermService.java | 21 ++++++++++++++----- .../iam/core/user/entity/UserExpandInfo.java | 7 +++++-- .../iam/dto/user/UserExpandInfoDto.java | 3 +++ pom.xml | 2 +- 6 files changed, 35 insertions(+), 23 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 7908286b..b82eac08 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,17 +1,3 @@ -## 1.3.5 -- x SQL查询功能 -- x SQL查询功能支持导出 -- x 完整集成Knife4j, 支持增强功能 -- x 前端登录时检测密码是否需要进行修改 -- x 前端websocket连接前先检测是否已经登录 -- x 默认密码强制修改功能 -- x 记录密码输入错误次数 -- x 多次输错密码自动锁定功能 -- x 超过锁定时间后,再登录时解除锁定清空 -- x 记录密码更改记录,不能与前N次相同功能 -- x 控制密码多少天必须更改 -- x 密码安全策略配置 -- x 审计日志增加定时删除和一键清除超期日志功能 ## 1.3.6 - 文件上传替换为基于`x-file-storage`定制 - 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java index 73776faa..f086a800 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java @@ -47,6 +47,7 @@ public class PasswordSecurityCheckService { int state = this.verifyPasswordExpire(userId, securityConfig); // 检查密码是否已经过期 if (state == 0){ + // 设置为 return result.setExpirePwd(true); } // 检查密码是否到了提示过期的时候 @@ -86,7 +87,8 @@ public class PasswordSecurityCheckService { int dealDay = securityConfig.getUpdateFrequency() - keepPwdDay; // 判断密码是否已经过期 if( dealDay >= 0 ){ - return 1; + this.userExpirePwd(userId); + return 1; } // 判断是否满足密码修改的倒计时提醒 if (dealDay < securityConfig.getExpireRemind()){ @@ -96,4 +98,11 @@ public class PasswordSecurityCheckService { return 0; } + /** + * 密码过期处理, 更新状态用户状态 + */ + public void userExpirePwd(Long userId){ + + } + } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java index b1df9935..26e05157 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java @@ -4,15 +4,18 @@ import cn.bootx.platform.common.core.annotation.NestedPermission; import cn.bootx.platform.common.core.entity.UserDetail; import cn.bootx.platform.common.core.rest.dto.BaseDto; import cn.bootx.platform.common.core.util.TreeBuildUtil; -import cn.bootx.platform.iam.core.permission.service.PermMenuService; -import cn.bootx.platform.starter.auth.exception.NotLoginException; -import cn.bootx.platform.starter.auth.util.SecurityUtil; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.iam.code.PermissionCode; +import cn.bootx.platform.iam.core.permission.service.PermMenuService; import cn.bootx.platform.iam.core.upms.dao.RoleMenuManager; import cn.bootx.platform.iam.core.upms.entity.RoleMenu; +import cn.bootx.platform.iam.core.user.dao.UserExpandInfoManager; +import cn.bootx.platform.iam.core.user.entity.UserExpandInfo; import cn.bootx.platform.iam.dto.permission.PermMenuDto; import cn.bootx.platform.iam.dto.upms.MenuAndResourceDto; +import cn.bootx.platform.starter.auth.exception.NotLoginException; +import cn.bootx.platform.starter.auth.exception.UserNotFoundException; +import cn.bootx.platform.starter.auth.util.SecurityUtil; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -40,6 +43,8 @@ import static cn.bootx.platform.iam.code.CachingCode.USER_PERM_CODE; @RequiredArgsConstructor public class RolePermService { + private final UserExpandInfoManager userExpandInfoManager; + private final RoleMenuManager roleMenuManager; private final UserRoleService userRoleService; @@ -159,11 +164,17 @@ public class RolePermService { } /** - * 查询用户查询拥有的权限信息(直接获取所有终端的权限码) + * 查询用户查询拥有的权限信息(直接获取所有终端的权限码),如果当前用户密码是否过期, 过期或者未修改密码, 返回权限为空 */ private List findPermissionsByUser(Long userId) { - List permissions = new ArrayList<>(0); + // 判断当前用户密码是否过期, 过期或者未修改密码, 返回权限为空 + UserExpandInfo userExpandInfo = userExpandInfoManager.findById(userId) + .orElseThrow(UserNotFoundException::new); + if (userExpandInfo.isExpirePassword() || userExpandInfo.isInitialPassword()){ + return new ArrayList<>(0); + } + List permissions = new ArrayList<>(0); List roleIds = userRoleService.findRoleIdsByUser(userId); if (CollUtil.isEmpty(roleIds)) { return permissions; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserExpandInfo.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserExpandInfo.java index 66ca18af..f02902d7 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserExpandInfo.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserExpandInfo.java @@ -22,7 +22,7 @@ import java.time.LocalDateTime; */ @EqualsAndHashCode(callSuper = true) @Data -//@DbTable(isAppend = true) +@DbTable(isAppend = true) @Accessors(chain = true) @TableName("iam_user_expand_info") public class UserExpandInfo extends MpBaseEntity implements EntityBaseFunction { @@ -40,7 +40,6 @@ public class UserExpandInfo extends MpBaseEntity implements EntityBaseFunction1.36.0 1.16.5 8.5.4 - 3.5.3.2 + 3.5.4 3.6.1 1.7.0 3.23.0 -- Gitee From 1735bcdcd5f312addc960932963610a7036739cb Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Tue, 31 Oct 2023 20:35:43 +0800 Subject: [PATCH 03/38] =?UTF-8?q?feat=20=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 1 + .../controller/PasswordSecurityConfigController.java | 3 +-- .../service/PasswordSecurityCheckService.java | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index b82eac08..38659ffb 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -4,6 +4,7 @@ - Websocket连接管理页 - 可视化大屏端支持一键登录 - 密码过期后清除所有的权限,必须强制更改密码 +- 密码安全配置设置为必填. 保存信息化状态变为查看状态 ## 1.3.x、1.4.x - 数据集功能 - 小程序工单功能 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java index 04b97f6f..cf314eb8 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java @@ -50,7 +50,6 @@ public class PasswordSecurityConfigController { @Operation(summary = "登录后检查密码相关的情况") @GetMapping("/checkPasswordSecurity") public ResResult checkPasswordSecurity(){ - Long userId = SecurityUtil.getUserId(); - return Res.ok(passwordSecurityCheckService.checkPasswordSecurity(userId)); + return Res.ok(passwordSecurityCheckService.checkPasswordSecurity()); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java index f086a800..e2589601 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java @@ -1,5 +1,6 @@ package cn.bootx.platform.iam.core.security.password.service; +import cn.bootx.platform.common.core.entity.UserDetail; import cn.bootx.platform.common.core.util.CollUtil; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.bootx.platform.iam.core.security.password.dao.PasswordChangeHistoryManager; @@ -9,6 +10,8 @@ import cn.bootx.platform.iam.core.user.entity.UserExpandInfo; import cn.bootx.platform.iam.dto.security.PasswordSecurityConfigDto; import cn.bootx.platform.iam.dto.security.passwordSecurityCheckResult; import cn.bootx.platform.iam.exception.user.UserInfoNotExistsException; +import cn.bootx.platform.starter.auth.exception.NotLoginException; +import cn.bootx.platform.starter.auth.util.SecurityUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -37,8 +40,14 @@ public class PasswordSecurityCheckService { /** * 登录后检查密码相关的情况 */ - public passwordSecurityCheckResult checkPasswordSecurity(Long userId){ + public passwordSecurityCheckResult checkPasswordSecurity(){ passwordSecurityCheckResult result = new passwordSecurityCheckResult(); + UserDetail userDetail = SecurityUtil.getCurrentUser() + .orElseThrow(NotLoginException::new); + if (userDetail.isAdmin()){ + return result; + } + Long userId = userDetail.getId(); PasswordSecurityConfigDto securityConfig = configService.getDefault(); // 检查是否是默认密码未进行修改 if (this.isDefaultPassword(userId,securityConfig)){ -- Gitee From 86fd533889968b3061b4b28613c267520f27b93d Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Wed, 1 Nov 2023 20:24:52 +0800 Subject: [PATCH 04/38] =?UTF-8?q?feat=20=E6=8E=A5=E5=85=A5x.file.storage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common-starter-file/pom.xml | 12 +++++- .../starter/file/FileAutoConfiguration.java | 2 + .../file/controller/FIleUpLoadController.java | 14 ++++++- .../file/handler/FileDetailRecordHandler.java | 39 +++++++++++++++++++ .../src/main/resources/application-dev.yml | 11 ++++++ pom.xml | 3 ++ 6 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java diff --git a/bootx-common-starters/common-starter-file/pom.xml b/bootx-common-starters/common-starter-file/pom.xml index e302b6f0..c02a7ba7 100644 --- a/bootx-common-starters/common-starter-file/pom.xml +++ b/bootx-common-starters/common-starter-file/pom.xml @@ -30,11 +30,19 @@ table-modify-mysql-boot-starter provided + cn.bootx.platform common-mybatis-plus true + + + org.dromara.x-file-storage + x-file-storage-spring + ${x-file-storage.version} + + io.minio @@ -45,12 +53,12 @@ com.qcloud cos_api - 5.6.155 + ${cos_api.version} com.qcloud cos-sts_api - 3.1.0 + ${cos-sts_api.version} diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/FileAutoConfiguration.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/FileAutoConfiguration.java index fea14281..2f201cbd 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/FileAutoConfiguration.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/FileAutoConfiguration.java @@ -1,6 +1,7 @@ package cn.bootx.platform.starter.file; import org.apache.ibatis.annotations.Mapper; +import org.dromara.x.file.storage.spring.EnableFileStorage; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; @@ -16,6 +17,7 @@ import org.springframework.data.mongodb.repository.config.EnableMongoRepositorie @ComponentScan @ConfigurationPropertiesScan @EnableMongoRepositories +@EnableFileStorage @AutoConfiguration @MapperScan(annotationClass = Mapper.class) public class FileAutoConfiguration { diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java index eec514d9..d52dc683 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java @@ -12,6 +12,8 @@ import cn.bootx.platform.starter.file.service.FileUploadService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.dromara.x.file.storage.core.FileInfo; +import org.dromara.x.file.storage.core.FileStorageService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -33,6 +35,7 @@ import java.io.IOException; public class FIleUpLoadController { private final FileUploadService uploadService; + private final FileStorageService fileStorageService; @IgnoreAuth(ignore = false) @Operation(summary = "分页") @@ -40,7 +43,16 @@ public class FIleUpLoadController { public ResResult> page(PageParam pageParam) { return Res.ok(uploadService.page(pageParam)); } - + @PostMapping("/upload") + public ResResult upload(MultipartFile file) { + FileInfo fileInfo = fileStorageService.of(file) + .setPath("upload/") //保存到相对路径下,为了方便管理,不需要可以不写 + .setObjectId("0") //关联对象id,为了方便管理,不需要可以不写 + .setObjectType("0") //关联对象类型,为了方便管理,不需要可以不写 + .putAttr("role","admin") //保存一些属性,可以在切面、保存上传记录、自定义存储平台等地方获取使用,不需要可以不写 + .upload(); //将文件上传到对应地方 + return Res.ok(); + } @IgnoreAuth(ignore = false, login = true) @Operation(summary = "上传") diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java new file mode 100644 index 00000000..14699858 --- /dev/null +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java @@ -0,0 +1,39 @@ +package cn.bootx.platform.starter.file.handler; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.x.file.storage.core.FileInfo; +import org.dromara.x.file.storage.core.recorder.FileRecorder; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class FileDetailRecordHandler implements FileRecorder { + /** + * @param fileInfo + * @return + */ + @Override + public boolean save(FileInfo fileInfo) { + return false; + } + + /** + * @param url + * @return + */ + @Override + public FileInfo getByUrl(String url) { + return null; + } + + /** + * @param url + * @return + */ + @Override + public boolean delete(String url) { + return false; + } +} diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml index e0d38154..4476a6cc 100644 --- a/bootx-start/src/main/resources/application-dev.yml +++ b/bootx-start/src/main/resources/application-dev.yml @@ -85,6 +85,17 @@ table-modify: update-type: update scan-package: cn.bootx.platform database-type: mysql +dromara: + x-file-storage: #文件存储配置 + default-platform: local #默认使用的存储平台 + thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】 + local-plus: + - platform: local # 存储平台标识 + enable-storage: true #启用存储 + enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高) + domain: "“http://127.0.0.1:9999/" # 访问域名,例如:“http://127.0.0.1:8030/local-plus/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名 + path-patterns: /** # 访问路径 + storage-path: D:/Temp/ # 存储路径 # Swagger 增强版 knife4j: enable: true diff --git a/pom.xml b/pom.xml index a1d6e42a..a1f9219e 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,9 @@ 1.36.0 1.16.5 8.5.4 + 5.6.155 + 3.1.0 + 2.0.0 3.5.4 3.6.1 1.7.0 -- Gitee From e3621cc8bff061847ff998777aff90b53fe2008f Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Mon, 13 Nov 2023 23:25:12 +0800 Subject: [PATCH 05/38] =?UTF-8?q?feat=20x.file.storage=E9=9B=86=E6=88=90?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/controller/FIleUpLoadController.java | 13 - .../starter/file/convert/FileConvert.java | 6 + .../file/handler/FileDetailRecordHandler.java | 14 +- .../file/service/FileUploadService.java | 98 +------ .../starter/file/service/UploadService.java | 44 ---- .../file/service/impl/JdbcUploadService.java | 117 --------- .../file/service/impl/LocalUploadService.java | 102 ------- .../file/service/impl/MinioUploadService.java | 130 --------- .../file/service/impl/MongoUploadService.java | 98 ------- .../file/service/impl/OssUploadService.java | 18 -- .../service/impl/TencentOssUploadService.java | 248 ------------------ .../src/main/resources/application-dev.yml | 2 +- 12 files changed, 27 insertions(+), 863 deletions(-) delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/UploadService.java delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/JdbcUploadService.java delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/LocalUploadService.java delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/MinioUploadService.java delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/MongoUploadService.java delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/OssUploadService.java delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/TencentOssUploadService.java diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java index d52dc683..5a579a1b 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java @@ -12,8 +12,6 @@ import cn.bootx.platform.starter.file.service.FileUploadService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.dromara.x.file.storage.core.FileInfo; -import org.dromara.x.file.storage.core.FileStorageService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -35,7 +33,6 @@ import java.io.IOException; public class FIleUpLoadController { private final FileUploadService uploadService; - private final FileStorageService fileStorageService; @IgnoreAuth(ignore = false) @Operation(summary = "分页") @@ -43,16 +40,6 @@ public class FIleUpLoadController { public ResResult> page(PageParam pageParam) { return Res.ok(uploadService.page(pageParam)); } - @PostMapping("/upload") - public ResResult upload(MultipartFile file) { - FileInfo fileInfo = fileStorageService.of(file) - .setPath("upload/") //保存到相对路径下,为了方便管理,不需要可以不写 - .setObjectId("0") //关联对象id,为了方便管理,不需要可以不写 - .setObjectType("0") //关联对象类型,为了方便管理,不需要可以不写 - .putAttr("role","admin") //保存一些属性,可以在切面、保存上传记录、自定义存储平台等地方获取使用,不需要可以不写 - .upload(); //将文件上传到对应地方 - return Res.ok(); - } @IgnoreAuth(ignore = false, login = true) @Operation(summary = "上传") diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java index 19a6e719..51329567 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java @@ -2,6 +2,7 @@ package cn.bootx.platform.starter.file.convert; import cn.bootx.platform.starter.file.dto.UpdateFileDto; import cn.bootx.platform.starter.file.entity.UpdateFileInfo; +import org.dromara.x.file.storage.core.FileInfo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -16,4 +17,9 @@ public interface FileConvert { UpdateFileDto convert(UpdateFileInfo in); + UpdateFileInfo convert(FileInfo in); + + UpdateFileDto toDto(FileInfo in); + + } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java index 14699858..8a5769f2 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java @@ -6,13 +6,17 @@ import org.dromara.x.file.storage.core.FileInfo; import org.dromara.x.file.storage.core.recorder.FileRecorder; import org.springframework.stereotype.Service; +/** + * x.file.storage 文件上传信息储存 + * @author xxm + * @since 2023/11/13 + */ @Slf4j @Service @RequiredArgsConstructor public class FileDetailRecordHandler implements FileRecorder { /** - * @param fileInfo - * @return + * 保存文件记录 */ @Override public boolean save(FileInfo fileInfo) { @@ -20,8 +24,7 @@ public class FileDetailRecordHandler implements FileRecorder { } /** - * @param url - * @return + * 根据 url 获取文件记录 */ @Override public FileInfo getByUrl(String url) { @@ -29,8 +32,7 @@ public class FileDetailRecordHandler implements FileRecorder { } /** - * @param url - * @return + * 根据 url 删除文件记录 */ @Override public boolean delete(String url) { diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java index 7d1a7126..5ed7dc4d 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java @@ -1,26 +1,23 @@ package cn.bootx.platform.starter.file.service; import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; -import cn.bootx.platform.starter.file.configuration.FileUploadProperties; import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.function.ParamService; import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.starter.file.convert.FileConvert; import cn.bootx.platform.starter.file.dao.UpdateFileManager; import cn.bootx.platform.starter.file.dto.UpLoadOptions; import cn.bootx.platform.starter.file.dto.UpdateFileDto; import cn.bootx.platform.starter.file.entity.UpdateFileInfo; -import cn.bootx.platform.starter.file.entity.UploadFileContext; -import cn.bootx.platform.starter.file.service.impl.OssUploadService; -import cn.bootx.platform.starter.file.service.impl.TencentOssUploadService; -import cn.hutool.core.io.FileTypeUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.dromara.x.file.storage.core.FileInfo; +import org.dromara.x.file.storage.core.FileStorageService; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -33,7 +30,6 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.List; /** * 文件上传管理类 @@ -46,13 +42,8 @@ import java.util.List; @RequiredArgsConstructor public class FileUploadService { - private final List uploadServices; - private final UpdateFileManager updateFileManager; - - private final FileUploadProperties fileUploadProperties; - - private final ParamService paramService; + private final FileStorageService fileStorageService; /** * 文件上传 @@ -60,35 +51,11 @@ public class FileUploadService { * @param fileName 文件名称 */ @Transactional(rollbackFor = Exception.class) - public UpdateFileDto upload(MultipartFile file, String fileName) throws IOException { - val uploadType = fileUploadProperties.getUploadType(); - UploadService uploadService = uploadServices.stream() - .filter(s -> s.enable(uploadType)) - .findFirst() - .orElseThrow(() -> new BizException("未找到该类的上传处理器")); - if (file.isEmpty()) { - throw new BizException("文件不可为空"); - } - // 上传文件信息 - if (StrUtil.isBlank(fileName)) { - fileName = file.getOriginalFilename(); - } - String fileType = FileTypeUtil.getType(file.getInputStream(), fileName); - String fileSuffix = fileType; - - // 获取不到类型名,后缀名使用上传文件名称的后缀 - if (StrUtil.isBlank(fileSuffix)) { - fileSuffix = StrUtil.subAfter(fileName, ".", true); - } - UploadFileContext context = new UploadFileContext().setFileId(IdUtil.getSnowflakeNextId()) - .setFileName(fileName) - .setFileSuffix(fileSuffix); - - UpdateFileInfo uploadInfo = uploadService.upload(file, context); - uploadInfo.setFileSuffix(fileSuffix).setFileType(fileType).setFileName(fileName); - uploadInfo.setId(context.getFileId()); - updateFileManager.save(uploadInfo); - return uploadInfo.toDto(); + public UpdateFileDto upload(MultipartFile file, String fileName) { + FileInfo upload = fileStorageService.of(file) + .setName(fileName) + .upload(); + return FileConvert.CONVERT.toDto(upload); } /** @@ -96,61 +63,22 @@ public class FileUploadService { */ @Transactional(rollbackFor = Exception.class) public void delete(Long id){ - val uploadType = fileUploadProperties.getUploadType(); - UploadService uploadService = uploadServices.stream() - .filter(s -> s.enable(uploadType)) - .findFirst() - .orElseThrow(() -> new BizException("未找到该类的上传处理器")); - UpdateFileInfo updateFileInfo = updateFileManager.findById(id).orElseThrow(() -> new BizException("文件不存在")); - uploadService.delete(updateFileInfo); - updateFileManager.deleteById(updateFileInfo.getId()); + updateFileManager.findById(id); } /** * 浏览 */ public void preview(Long id, HttpServletResponse response) { - val uploadType = fileUploadProperties.getUploadType(); - UploadService uploadService = uploadServices.stream() - .filter(s -> s.enable(uploadType)) - .findFirst() - .orElseThrow(() -> new BizException("未找到该类的上传处理器")); - UpdateFileInfo updateFileInfo = updateFileManager.findById(id).orElseThrow(() -> new BizException("文件不存在")); - uploadService.preview(updateFileInfo, response); } /** * 文件下载 */ public ResponseEntity download(Long id) { - val uploadType = fileUploadProperties.getUploadType(); - UploadService uploadService = uploadServices.stream() - .filter(s -> s.enable(uploadType)) - .findFirst() - .orElseThrow(() -> new BizException("未找到该类文件的处理器")); - UpdateFileInfo updateFileInfo = updateFileManager.findById(id).orElseThrow(() -> new BizException("文件不存在")); - InputStream inputStream = uploadService.download(updateFileInfo); - // 设置header信息 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - headers.setContentDispositionFormData("attachment", - new String(updateFileInfo.getFileName().getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); - return new ResponseEntity<>(IoUtil.readBytes(inputStream), headers, HttpStatus.OK); + return null; } - /** - * 获取文件字节数组 - */ - public byte[] getFileBytes(Long id) { - val uploadType = fileUploadProperties.getUploadType(); - UploadService uploadService = uploadServices.stream() - .filter(s -> s.enable(uploadType)) - .findFirst() - .orElseThrow(() -> new BizException("未找到该类文件的处理器")); - UpdateFileInfo updateFileInfo = updateFileManager.findById(id).orElseThrow(() -> new BizException("文件不存在")); - InputStream inputStream = uploadService.download(updateFileInfo); - return IoUtil.readBytes(inputStream); - } /** * 分页 @@ -184,10 +112,8 @@ public class FileUploadService { * 服务地址 */ private String getServerUrl() { + fileStorageService.get String serverUrl = paramService.getValue("FileServerUrl"); - if (StrUtil.isBlank(serverUrl)) { - serverUrl = fileUploadProperties.getServerUrl(); - } return serverUrl; } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/UploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/UploadService.java deleted file mode 100644 index e3e818df..00000000 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/UploadService.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.bootx.platform.starter.file.service; - -import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; -import cn.bootx.platform.starter.file.entity.UploadFileContext; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletResponse; -import java.io.InputStream; - -/** - * 文件上传接口 - * - * @author xxm - * @since 2022/1/14 - */ -public interface UploadService { - - /** - * 判断启用 - */ - boolean enable(FileUploadTypeEnum type); - - /** - * 上传文件 - */ - UpdateFileInfo upload(MultipartFile file, UploadFileContext context); - - /** - * 预览文件 - */ - void preview(UpdateFileInfo updateFileInfo, HttpServletResponse response); - - /** - * 下载文件 - */ - InputStream download(UpdateFileInfo updateFileInfo); - - /** - * 删除文件 - */ - void delete(UpdateFileInfo updateFileInfo); - -} diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/JdbcUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/JdbcUploadService.java deleted file mode 100644 index 8e57479a..00000000 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/JdbcUploadService.java +++ /dev/null @@ -1,117 +0,0 @@ -package cn.bootx.platform.starter.file.service.impl; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; -import cn.bootx.platform.starter.file.configuration.FileUploadProperties; -import cn.bootx.platform.starter.file.dao.JdbcFileDataManager; -import cn.bootx.platform.starter.file.entity.JdbcFileData; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; -import cn.bootx.platform.starter.file.entity.UploadFileContext; -import cn.bootx.platform.starter.file.service.UploadService; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.IoUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -/** - * 数据库存储上传文件 - * @author xxm - * @since 2023/8/5 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class JdbcUploadService implements UploadService { - private final JdbcFileDataManager jdbcFileDataManager; - - private final FileUploadProperties fileUploadProperties; - - /** - * 判断启用 - */ - @Override - public boolean enable(FileUploadTypeEnum type) { - return type==FileUploadTypeEnum.JDBC; - } - - /** - * 上传文件 - * - * @param file - * @param context - */ - @SneakyThrows - @Override - public UpdateFileInfo upload(MultipartFile file, UploadFileContext context) { - FileUploadProperties.JDBC jdbc = fileUploadProperties.getJdbc(); - JdbcFileData jdbcFileData; - byte[] bytes = file.getBytes(); - if (jdbc.isBase64()){ - jdbcFileData =new JdbcFileData().setBase64(Base64.encode(bytes)); - } else { - jdbcFileData =new JdbcFileData().setData(bytes); - } - jdbcFileDataManager.save(jdbcFileData); - return new UpdateFileInfo().setExternalStorageId(String.valueOf(jdbcFileData.getId())).setFileSize(file.getSize()); - } - - /** - * 预览文件 - */ - @SneakyThrows - @Override - public void preview(UpdateFileInfo updateFileInfo, HttpServletResponse response) { - FileUploadProperties.JDBC jdbc = fileUploadProperties.getJdbc(); - Long id = Long.valueOf(updateFileInfo.getExternalStorageId()); - JdbcFileData jdbcFileData = jdbcFileDataManager.findById(id) - .orElseThrow(DataNotExistException::new); - InputStream inputStream; - if (jdbc.isBase64()){ - inputStream = new ByteArrayInputStream(Base64.decode(jdbcFileData.getBase64())); - } else { - inputStream = new ByteArrayInputStream(jdbcFileData.getData()); - } - - // 获取响应输出流 - ServletOutputStream os = response.getOutputStream(); - IoUtil.copy(inputStream, os); - response.addHeader(HttpHeaders.CONTENT_DISPOSITION, updateFileInfo.getFileType()); - IoUtil.close(inputStream); - IoUtil.close(os); - - } - - /** - * 下载文件 - */ - @Override - public InputStream download(UpdateFileInfo updateFileInfo) { - FileUploadProperties.JDBC jdbc = fileUploadProperties.getJdbc(); - Long id = Long.valueOf(updateFileInfo.getExternalStorageId()); - JdbcFileData jdbcFileData = jdbcFileDataManager.findById(id) - .orElseThrow(DataNotExistException::new); - if (jdbc.isBase64()){ - return new ByteArrayInputStream(Base64.decode(jdbcFileData.getBase64())); - } else { - return new ByteArrayInputStream(jdbcFileData.getData()); - } - } - - /** - * 删除文件 - */ - @Override - public void delete(UpdateFileInfo updateFileInfo) { - Long id = Long.valueOf(updateFileInfo.getExternalStorageId()); - jdbcFileDataManager.deleteById(id); - } -} diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/LocalUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/LocalUploadService.java deleted file mode 100644 index 4cdbf72b..00000000 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/LocalUploadService.java +++ /dev/null @@ -1,102 +0,0 @@ -package cn.bootx.platform.starter.file.service.impl; - -import cn.bootx.platform.starter.file.configuration.FileUploadProperties; -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; -import cn.bootx.platform.starter.file.entity.UploadFileContext; -import cn.bootx.platform.starter.file.service.UploadService; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.IdUtil; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.nio.file.Files; -import java.util.Optional; - -/** - * 上传文件本地存储 - * - * @author xxm - * @since 2022/1/12 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class LocalUploadService implements UploadService { - - private final FileUploadProperties fileUploadProperties; - - @Override - public boolean enable(FileUploadTypeEnum type) { - return type == FileUploadTypeEnum.LOCAL; - } - - /** - * 文件上传 - */ - @SneakyThrows - @Override - public UpdateFileInfo upload(MultipartFile file, UploadFileContext context) { - String fileSuffix = Optional.ofNullable(context.getFileSuffix()).map(s -> "." + s).orElse(""); - String filePath = DateUtil.today() + "/" + IdUtil.getSnowflakeNextIdStr() + fileSuffix; - String storePath = fileUploadProperties.getLocal().getLocalPath() + filePath; - FileUtil.writeFromStream(file.getInputStream(), storePath); - return new UpdateFileInfo().setFilePath(filePath).setFileSize(file.getSize()); - } - - /** - * 浏览 - */ - @SneakyThrows - @Override - public void preview(UpdateFileInfo updateFileInfo, HttpServletResponse response) { - String storePath = fileUploadProperties.getLocal().getLocalPath() + updateFileInfo.getFilePath(); - File file = new File(storePath); - if (!file.exists()) { - throw new BizException("文件不存在"); - } - FileInputStream is = new FileInputStream(file); - // 获取响应输出流 - ServletOutputStream os = response.getOutputStream(); - IoUtil.copy(is, os); - response.addHeader(HttpHeaders.CONTENT_DISPOSITION, updateFileInfo.getFileType()); - IoUtil.close(is); - IoUtil.close(os); - } - - /** - * 下载 - */ - @SneakyThrows - @Override - public InputStream download(UpdateFileInfo updateFileInfo) { - String storePath = fileUploadProperties.getLocal().getLocalPath() + updateFileInfo.getFilePath(); - File file = new File(storePath); - if (!file.exists()) { - throw new BizException("文件不存在"); - } - return Files.newInputStream(file.toPath()); - } - - /** - * 删除文件 - */ - @Override - public void delete(UpdateFileInfo updateFileInfo) { - String storePath = fileUploadProperties.getLocal().getLocalPath() + updateFileInfo.getFilePath(); - FileUtil.del(storePath); - } - -} diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/MinioUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/MinioUploadService.java deleted file mode 100644 index 09d1b195..00000000 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/MinioUploadService.java +++ /dev/null @@ -1,130 +0,0 @@ -package cn.bootx.platform.starter.file.service.impl; - -import cn.bootx.platform.starter.file.configuration.FileUploadProperties; -import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; -import cn.bootx.platform.starter.file.entity.UploadFileContext; -import cn.bootx.platform.starter.file.service.UploadService; -import cn.hutool.core.io.IoUtil; -import io.minio.*; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; -import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import java.io.InputStream; -import java.util.Objects; - -/** - * minio方式存储文件 - * - * @author xxm - * @since 2022/1/12 - */ -@Slf4j -@Service -@ConditionalOnMissingClass("io.minio.MinioClient") -@RequiredArgsConstructor -public class MinioUploadService implements UploadService { - - private final FileUploadProperties fileUploadProperties; - - private MinioClient client; - - /** - * 判断启用 - */ - @Override - public boolean enable(FileUploadTypeEnum type) { - boolean initFlag = type == FileUploadTypeEnum.MINIO; - if (initFlag) { - this.doInit(); - } - return initFlag; - } - - /** - * 上传文件 - */ - @SneakyThrows - @Override - public UpdateFileInfo upload(MultipartFile file, UploadFileContext context) { - FileUploadProperties.Minio minio = fileUploadProperties.getMinio(); - PutObjectArgs putObjectArgs = PutObjectArgs.builder() - .bucket(minio.getBucket()) // bucket必须传递 - .contentType(file.getContentType()) - .object(context.getFileId() + "." + context.getFileSuffix()) - .stream(file.getInputStream(), file.getSize(), -1) // 文件内容 - .build(); - // 执行上传 - client.putObject(putObjectArgs); - return new UpdateFileInfo().setExternalStorageId(putObjectArgs.object()).setFileSize(file.getSize()); - } - - /** - * 预览文件 - */ - @SneakyThrows - @Override - public void preview(UpdateFileInfo updateFileInfo, HttpServletResponse response) { - FileUploadProperties.Minio minio = fileUploadProperties.getMinio(); - String storageId = updateFileInfo.getExternalStorageId(); - GetObjectResponse inputStream = client - .getObject(GetObjectArgs.builder().bucket(minio.getBucket()).object(storageId).build()); - // 获取响应输出流 - ServletOutputStream os = response.getOutputStream(); - IoUtil.copy(inputStream, os); - response.addHeader(HttpHeaders.CONTENT_DISPOSITION, updateFileInfo.getFileType()); - IoUtil.close(inputStream); - IoUtil.close(os); - } - - /** - * 下载文件 - */ - @SneakyThrows - @Override - public InputStream download(UpdateFileInfo updateFileInfo) { - FileUploadProperties.Minio minio = fileUploadProperties.getMinio(); - String storageId = updateFileInfo.getExternalStorageId(); - return client.getObject(GetObjectArgs.builder() - .bucket(minio.getBucket()) // bucket 必须传递 - .object(storageId) // 相对路径作为 key - .build()); - } - - /** - * 删除文件 - */ - @SneakyThrows - @Override - public void delete(UpdateFileInfo updateFileInfo) { - FileUploadProperties.Minio minio = fileUploadProperties.getMinio(); - client.removeObject(RemoveObjectArgs.builder() - .bucket(minio.getBucket()) // bucket必须传递 - .object(updateFileInfo.getExternalStorageId()) // 相对路径作为 key - .build()); - } - - /** - * 初始化 - */ - protected void doInit() { - if (Objects.nonNull(client)) { - return; - } - FileUploadProperties.Minio minio = fileUploadProperties.getMinio(); - // 初始化客户端 - client = MinioClient.builder() - .endpoint(minio.getEndpoint()) // Endpoint URL - .region(minio.getRegion()) // Region - .credentials(minio.getAccessKey(), minio.getAccessSecret()) // 认证密钥 - .build(); - } - -} diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/MongoUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/MongoUploadService.java deleted file mode 100644 index f2ccbc86..00000000 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/MongoUploadService.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.bootx.platform.starter.file.service.impl; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; -import cn.bootx.platform.starter.file.entity.UploadFileContext; -import cn.bootx.platform.starter.file.service.UploadService; -import cn.hutool.core.io.IoUtil; -import com.mongodb.client.gridfs.model.GridFSFile; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.bson.types.ObjectId; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; -import org.springframework.data.mongodb.gridfs.GridFsResource; -import org.springframework.data.mongodb.gridfs.GridFsTemplate; -import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import java.io.InputStream; -import java.util.Optional; - -/** - * mongo方式存储文件 - * - * @author xxm - * @since 2022/1/12 - */ -@Slf4j -@Service -@ConditionalOnClass(name="org.springframework.data.mongodb.gridfs.GridFsTemplate") -@RequiredArgsConstructor -public class MongoUploadService implements UploadService { - - private final GridFsTemplate gridFsTemplate; - - @Override - public boolean enable(FileUploadTypeEnum type) { - return type == FileUploadTypeEnum.MONGO; - } - - /** - * 上传 - */ - @SneakyThrows - @Override - public UpdateFileInfo upload(MultipartFile file, UploadFileContext context) { - ObjectId store = gridFsTemplate.store(file.getInputStream(), context.getFileName(), file.getContentType()); - return new UpdateFileInfo().setExternalStorageId(store.toString()).setFileSize(file.getSize()); - } - - @SneakyThrows - @Override - public void preview(UpdateFileInfo updateFileInfo, HttpServletResponse response) { - Criteria criteria = Criteria.where("_id").is(updateFileInfo.getExternalStorageId()); - Query query = new Query(criteria); - - GridFSFile gridFSFile = Optional.ofNullable(gridFsTemplate.findOne(query)) - .orElseThrow(DataNotExistException::new); - GridFsResource resource = gridFsTemplate.getResource(gridFSFile); - InputStream inputStream = resource.getInputStream(); - - // 获取响应输出流 - ServletOutputStream os = response.getOutputStream(); - IoUtil.copy(inputStream, os); - response.addHeader(HttpHeaders.CONTENT_DISPOSITION, updateFileInfo.getFileType()); - IoUtil.close(inputStream); - IoUtil.close(os); - } - - @SneakyThrows - @Override - public InputStream download(UpdateFileInfo updateFileInfo) { - Criteria criteria = Criteria.where("_id").is(new ObjectId(updateFileInfo.getExternalStorageId())); - Query query = new Query(criteria); - - GridFSFile gridFSFile = Optional.ofNullable(gridFsTemplate.findOne(query)) - .orElseThrow(DataNotExistException::new); - GridFsResource resource = gridFsTemplate.getResource(gridFSFile); - return resource.getInputStream(); - } - - /** - * 删除文件 - */ - @Override - public void delete(UpdateFileInfo updateFileInfo) { - Criteria criteria = Criteria.where("_id").is(new ObjectId(updateFileInfo.getExternalStorageId())); - Query query = new Query(criteria); - gridFsTemplate.delete(query); - } - -} diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/OssUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/OssUploadService.java deleted file mode 100644 index 7d2c752e..00000000 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/OssUploadService.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.starter.file.service.impl; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 阿里云OSS上传文件 - * - * @author xxm - * @since 2022/1/12 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class OssUploadService { - -} diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/TencentOssUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/TencentOssUploadService.java deleted file mode 100644 index efd397fc..00000000 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/impl/TencentOssUploadService.java +++ /dev/null @@ -1,248 +0,0 @@ -package cn.bootx.platform.starter.file.service.impl; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; -import cn.bootx.platform.starter.file.configuration.FileUploadProperties; -import cn.bootx.platform.starter.file.dto.UpLoadOptions; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; -import cn.bootx.platform.starter.file.entity.UploadFileContext; -import cn.bootx.platform.starter.file.service.UploadService; -import cn.hutool.core.codec.Base64Encoder; -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.crypto.SecureUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.qcloud.cos.COSClient; -import com.qcloud.cos.ClientConfig; -import com.qcloud.cos.auth.BasicCOSCredentials; -import com.qcloud.cos.auth.COSCredentials; -import com.qcloud.cos.exception.CosClientException; -import com.qcloud.cos.http.HttpMethodName; -import com.qcloud.cos.http.HttpProtocol; -import com.qcloud.cos.model.GeneratePresignedUrlRequest; -import com.qcloud.cos.model.ObjectMetadata; -import com.qcloud.cos.model.PutObjectRequest; -import com.qcloud.cos.model.UploadResult; -import com.qcloud.cos.region.Region; -import com.qcloud.cos.transfer.TransferManager; -import com.qcloud.cos.transfer.TransferManagerConfiguration; -import com.qcloud.cos.transfer.Upload; -import com.tencent.cloud.CosStsClient; -import com.tencent.cloud.Response; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; -import java.util.Objects; -import java.util.TreeMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import static java.time.temporal.ChronoUnit.MINUTES; - -/** - * 阿里云OSS上传文件 - * - * @author xxm - * @since 2022/1/12 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class TencentOssUploadService implements UploadService { - private final FileUploadProperties fileUploadProperties; - - private final ObjectMapper objectMapper; - - COSClient client; - TransferManager transferManager; - - @Override - public boolean enable(FileUploadTypeEnum type) { - boolean initFlag = type == FileUploadTypeEnum.TENCENT_OSS; - if (initFlag) { - this.doInit(); - } - return initFlag; - } - - @Override - public UpdateFileInfo upload(MultipartFile file, UploadFileContext context) { - FileUploadProperties.TencentOss oss = fileUploadProperties.getTencentOss(); - ObjectMetadata objectMetadata = new ObjectMetadata(); - objectMetadata.setContentLength(file.getSize()); - PutObjectRequest putObjectRequest; - UploadResult uploadResult; - try { - putObjectRequest = new PutObjectRequest(oss.getBucket(), context.getFileId().toString(), file.getInputStream(), objectMetadata); - } catch (IOException e) { - throw new RuntimeException(e); - } - try { - // 高级接口会返回一个异步结果Upload - // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回 UploadResult, 失败抛出异常 - Upload upload = transferManager.upload(putObjectRequest); - uploadResult = upload.waitForUploadResult(); - } catch (CosClientException | InterruptedException e) { - e.printStackTrace(); - log.error("上传失败,原因:", e); - throw new BizException("上传失败"); - } - - return new UpdateFileInfo().setExternalStorageId(uploadResult.getKey()).setFileSize(file.getSize()); - } - - @Override - public void preview(UpdateFileInfo updateFileInfo, HttpServletResponse response) { - FileUploadProperties.TencentOss oss = fileUploadProperties.getTencentOss(); - String key = updateFileInfo.getExternalStorageId(); - GeneratePresignedUrlRequest req = - new GeneratePresignedUrlRequest(oss.getBucket(), key, HttpMethodName.GET); - Date expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L); - req.setExpiration(expirationDate); - URL url = client.generatePresignedUrl(req); - try { - response.sendRedirect(url.toString()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public InputStream download(UpdateFileInfo updateFileInfo) { - FileUploadProperties.TencentOss oss = fileUploadProperties.getTencentOss(); - String key = updateFileInfo.getExternalStorageId(); - GeneratePresignedUrlRequest req = - new GeneratePresignedUrlRequest(oss.getBucket(), key, HttpMethodName.GET); - Date expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L); - req.setExpiration(expirationDate); - URL url = client.generatePresignedUrl(req); - try { - return url.openStream(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void delete(UpdateFileInfo updateFileInfo) { - FileUploadProperties.TencentOss oss = fileUploadProperties.getTencentOss(); - client.deleteObject(oss.getBucket(), updateFileInfo.getFileName()); - } - - public UpLoadOptions getTemplateCredential() { - UpLoadOptions options; - FileUploadProperties.TencentOss oss = fileUploadProperties.getTencentOss(); - TreeMap config = new TreeMap(); - config.put("secretId", oss.getSecretId()); - config.put("secretKey", oss.getSecretKey()); - config.put("durationSeconds", 1800); - config.put("bucket", oss.getBucket()); - config.put("region", oss.getRegion()); - config.put("allowPrefixes", new String[]{ - "bootx/*" - }); - - String[] allowActions = new String[]{ - // 简单上传 - "name/cos:PutObject", - // 表单上传、小程序上传 - "name/cos:PostObject", - // 分块上传 - "name/cos:InitiateMultipartUpload", - "name/cos:ListMultipartUploads", - "name/cos:ListParts", - "name/cos:UploadPart", - "name/cos:CompleteMultipartUpload" - }; - - config.put("allowActions", allowActions); - try { - Response response = CosStsClient.getCredential(config); - options = new UpLoadOptions(); - options.setSessionToken(response.credentials.sessionToken); - options.setTmpSecretKey(response.credentials.tmpSecretKey); - options.setTmpSecretId(response.credentials.tmpSecretId); - options.setExpiredTime(1800L); - } catch (IOException e) { - throw new RuntimeException(e); - } - LocalDateTime startTime = LocalDateTime.now(); - LocalDateTime endTime = startTime.plus(5, MINUTES); - String keyTime = LocalDateTimeUtil.toEpochMilli(startTime) / 1000 + ";" + LocalDateTimeUtil.toEpochMilli(endTime) / 1000; - TreeMap formData = new TreeMap<>(); - ObjectNode root = objectMapper.createObjectNode(); - root.put("expiration", endTime.plus(30, MINUTES).withNano(0).atZone(ZoneId.of("Z")) - .toString()); - ArrayNode conditions = objectMapper.createArrayNode(); - root.putIfAbsent("conditions", conditions); - ObjectNode child = objectMapper.createObjectNode(); - child.put("acl", "default"); - child = objectMapper.createObjectNode(); - child.put("bucket", oss.getBucket()); - ArrayNode tempArr = objectMapper.createArrayNode(); - tempArr.add("starts-with"); - tempArr.add("$key"); - tempArr.add("bootx/"); - conditions.addPOJO(tempArr); - conditions.addPOJO(child); - child = objectMapper.createObjectNode(); - child.put("q-sign-algorithm", "sha1"); - conditions.addPOJO(child); - child = objectMapper.createObjectNode(); - child.put("q-ak", options.getTmpSecretId()); - - conditions.addPOJO(child); - child = objectMapper.createObjectNode(); - child.put("q-sign-time", keyTime); - conditions.addPOJO(child); - formData.put("x-cos-security-token", options.getSessionToken()); - String policyText = JacksonUtil.toJson(root); - formData.put("policy", Base64Encoder.encode(policyText)); - formData.put("acl", "default"); - formData.put("q-sign-algorithm", "sha1"); - formData.put("q-ak", options.getTmpSecretId()); - formData.put("q-key-time", keyTime); - String signKey = SecureUtil.hmacSha1(options.getTmpSecretKey()).digestHex(keyTime); - String stringToSign = SecureUtil.sha1().digestHex(policyText); - String signature = SecureUtil.hmacSha1(signKey).digestHex(stringToSign); - formData.put("q-signature", signature); - log.info("signKey:{},stringToSign:{},signature:{}", signKey, stringToSign, signature); - options.setFormData(formData); - options.setUploadUrl("https://" + oss.getBucket() + ".cos.ap-beijing.myqcloud.com"); - - - return options; - } - - protected void doInit() { - if (Objects.nonNull(client)) { - return; - } - // 初始化客户端 - FileUploadProperties.TencentOss oss = fileUploadProperties.getTencentOss(); - - Region region = new Region(oss.getRegion()); //COS_REGION 参数:配置成存储桶 bucket 的实际地域,例如 ap-beijing,更多 COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224 - ClientConfig clientConfig = new ClientConfig(region); - clientConfig.setHttpProtocol(HttpProtocol.https); - COSCredentials cred = new BasicCOSCredentials(oss.getSecretId(), oss.getSecretKey()); - client = new COSClient(cred, clientConfig); - ExecutorService threadPool = Executors.newFixedThreadPool(32); - transferManager = new TransferManager(client, threadPool); - TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration(); - transferManagerConfiguration.setMultipartUploadThreshold(5 * 1024 * 1024); - transferManagerConfiguration.setMinimumUploadPartSize(1024 * 1024); - transferManager.setConfiguration(transferManagerConfiguration); - - } -} diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml index 4476a6cc..aa846e84 100644 --- a/bootx-start/src/main/resources/application-dev.yml +++ b/bootx-start/src/main/resources/application-dev.yml @@ -93,7 +93,7 @@ dromara: - platform: local # 存储平台标识 enable-storage: true #启用存储 enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高) - domain: "“http://127.0.0.1:9999/" # 访问域名,例如:“http://127.0.0.1:8030/local-plus/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名 + domain: http://127.0.0.1:9999/ # 访问域名,例如:“http://127.0.0.1:8030/local-plus/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名 path-patterns: /** # 访问路径 storage-path: D:/Temp/ # 存储路径 # Swagger 增强版 -- Gitee From 8eab28632ee37848782be2192c32f9eb1d563ca7 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Tue, 14 Nov 2023 20:38:30 +0800 Subject: [PATCH 06/38] =?UTF-8?q?feat=20x-file-storage=E9=9B=86=E6=88=90?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/controller/FIleUpLoadController.java | 59 +++++----- .../starter/file/convert/FileConvert.java | 2 + .../file/handler/FileDetailRecordHandler.java | 2 +- .../file/service/FileUploadService.java | 106 +++++++++--------- .../controller/GoViewController.java | 15 ++- .../core/service/ProjectInfoService.java | 18 +-- .../src/main/resources/application-dev.yml | 4 +- 7 files changed, 100 insertions(+), 106 deletions(-) diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java index 5a579a1b..01cbc317 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java @@ -5,13 +5,14 @@ import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.file.dto.UpLoadOptions; import cn.bootx.platform.starter.file.dto.UpdateFileDto; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; import cn.bootx.platform.starter.file.service.FileUploadService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.dromara.x.file.storage.core.FileInfo; +import org.dromara.x.file.storage.core.FileStorageService; +import org.dromara.x.file.storage.spring.SpringFileStorageProperties; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -34,6 +35,10 @@ public class FIleUpLoadController { private final FileUploadService uploadService; + private final FileStorageService fileStorageService; + + private final SpringFileStorageProperties properties; + @IgnoreAuth(ignore = false) @Operation(summary = "分页") @GetMapping("/page") @@ -55,23 +60,30 @@ public class FIleUpLoadController { return Res.ok(); } - @Operation(summary = "获取文件预览地址") - @GetMapping("getFilePreviewUrl") - public ResResult getFilePreviewUrl(Long id) { - return Res.ok(uploadService.getFilePreviewUrl(id)); - } - - @Operation(summary = "获取文件预览地址前缀") - @GetMapping("getFilePreviewUrlPrefix") - public ResResult getFilePreviewUrlPrefix() { - return Res.ok(uploadService.getFilePreviewUrlPrefix()); + @Operation(summary = "获取文件") + @GetMapping("/getFile") + public ResResult getFile(){ + FileInfo fileInfoByUrl = fileStorageService.getFileInfoByUrl(""); + return Res.ok(); } - @Operation(summary = "获取文件下载地址") - @GetMapping("getFileDownloadUrl") - public ResResult getFileDownloadUrl(Long id) { - return Res.ok(uploadService.getFileDownloadUrl(id)); - } +// @Operation(summary = "获取文件预览地址(流量会经过后端)") +// @GetMapping("getFilePreviewUrl") +// public ResResult getFilePreviewUrl(Long id) { +// return Res.ok(uploadService.getFilePreviewUrl(id)); +// } +// +// @Operation(summary = "获取文件预览地址前缀") +// @GetMapping("getFilePreviewUrlPrefix") +// public ResResult getFilePreviewUrlPrefix() { +// return Res.ok(uploadService.getFilePreviewUrlPrefix()); +// } +// +// @Operation(summary = "获取文件下载地址(流量会经过后端)") +// @GetMapping("getFileDownloadUrl") +// public ResResult getFileDownloadUrl(Long id) { +// return Res.ok(uploadService.getFileDownloadUrl(id)); +// } @Operation(summary = "预览文件") @GetMapping("/preview/{id}") @@ -85,17 +97,4 @@ public class FIleUpLoadController { return uploadService.download(id); } - @Operation(summary = "获取临时oss密钥") - @GetMapping("/getUpLoadOptions") - public ResResult getTempCredentials() { - return Res.ok(uploadService.getTempCredentials()); - } - @Operation(summary = "保存记录") - @PostMapping("/saveUploadResult") - public ResResult saveUploadResult(@RequestBody UpdateFileInfo info) { - return Res.ok(uploadService.saveUploadResult(info)); - } - - - } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java index 51329567..bd07c4c0 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java @@ -19,6 +19,8 @@ public interface FileConvert { UpdateFileInfo convert(FileInfo in); + FileInfo toFileInfo(UpdateFileInfo in); + UpdateFileDto toDto(FileInfo in); diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java index 8a5769f2..24454653 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java @@ -20,7 +20,7 @@ public class FileDetailRecordHandler implements FileRecorder { */ @Override public boolean save(FileInfo fileInfo) { - return false; + return true; } /** diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java index 5ed7dc4d..c1f9e169 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java @@ -1,21 +1,15 @@ package cn.bootx.platform.starter.file.service; -import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; -import cn.bootx.platform.common.core.exception.BizException; +import cn.bootx.platform.common.core.exception.DataNotExistException; import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.starter.file.convert.FileConvert; import cn.bootx.platform.starter.file.dao.UpdateFileManager; -import cn.bootx.platform.starter.file.dto.UpLoadOptions; import cn.bootx.platform.starter.file.dto.UpdateFileDto; import cn.bootx.platform.starter.file.entity.UpdateFileInfo; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import lombok.val; import org.dromara.x.file.storage.core.FileInfo; import org.dromara.x.file.storage.core.FileStorageService; import org.springframework.http.HttpHeaders; @@ -27,9 +21,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; /** * 文件上传管理类 @@ -41,7 +32,6 @@ import java.nio.charset.StandardCharsets; @Service @RequiredArgsConstructor public class FileUploadService { - private final UpdateFileManager updateFileManager; private final FileStorageService fileStorageService; @@ -53,8 +43,10 @@ public class FileUploadService { @Transactional(rollbackFor = Exception.class) public UpdateFileDto upload(MultipartFile file, String fileName) { FileInfo upload = fileStorageService.of(file) - .setName(fileName) .upload(); + byte[] bytes = fileStorageService.download(upload) + .bytes(); + return FileConvert.CONVERT.toDto(upload); } @@ -63,20 +55,31 @@ public class FileUploadService { */ @Transactional(rollbackFor = Exception.class) public void delete(Long id){ - updateFileManager.findById(id); + UpdateFileInfo updateFileInfo = updateFileManager.findById(id) + .orElseThrow(DataNotExistException::new); + fileStorageService.delete(FileConvert.CONVERT.toFileInfo(updateFileInfo)); } /** * 浏览 */ public void preview(Long id, HttpServletResponse response) { + UpdateFileInfo updateFileInfo = updateFileManager.findById(id) + .orElseThrow(DataNotExistException::new); } /** * 文件下载 */ public ResponseEntity download(Long id) { - return null; + UpdateFileInfo updateFileInfo = updateFileManager.findById(id) + .orElseThrow(DataNotExistException::new); + FileInfo fileInfo = FileConvert.CONVERT.toFileInfo(updateFileInfo); + byte[] bytes = fileStorageService.download(fileInfo).bytes(); + // 设置header信息 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + return new ResponseEntity<>(bytes,HttpStatus.OK); } @@ -87,49 +90,40 @@ public class FileUploadService { return MpUtil.convert2DtoPageResult(updateFileManager.page(pageParam)); } - /** - * 获取文件预览地址 - */ - public String getFilePreviewUrl(Long id) { - return this.getServerUrl() + "/file/preview/" + id; - } - - /** - * 获取文件预览地址前缀 - */ - public String getFilePreviewUrlPrefix() { - return this.getServerUrl() + "/file/preview/"; - } - - /** - * 获取文件地址 - */ - public String getFileDownloadUrl(Long id) { - return this.getServerUrl() + "/file/download/" + id; - } - +// /** +// * 获取文件预览地址 +// */ +// public String getFilePreviewUrl(Long id) { +// return this.getServerUrl() + "/file/preview/" + id; +// } +// +// /** +// * 获取文件预览地址前缀 +// */ +// public String getFilePreviewUrlPrefix() { +// return this.getServerUrl() + "/file/preview/"; +// } +// +// /** +// * 获取文件地址 +// */ +// public String getFileDownloadUrl(Long id) { +// return this.getServerUrl() + "/file/download/" + id; +// } +// /** * 服务地址 */ - private String getServerUrl() { - fileStorageService.get - String serverUrl = paramService.getValue("FileServerUrl"); - return serverUrl; - } - - public UpLoadOptions getTempCredentials() { - - TencentOssUploadService ossUploadService=(TencentOssUploadService)uploadServices.stream().filter(s -> s.enable(FileUploadTypeEnum.TENCENT_OSS)) - .findFirst().orElseThrow(() -> new BizException("未找到该类文件的处理器")); - - return ossUploadService.getTemplateCredential(); - - } - - public UpdateFileDto saveUploadResult(UpdateFileInfo uploadInfo) { - - uploadInfo.setId(IdUtil.getSnowflakeNextId()); - updateFileManager.save(uploadInfo); - return uploadInfo.toDto(); - } +// private String getServerUrl() { +// fileStorageService.getProperties().getLocalPlus().get(0). +// String serverUrl = paramService.getValue("FileServerUrl"); +// return serverUrl; +// } +// +// public UpdateFileDto saveUploadResult(UpdateFileInfo uploadInfo) { +// +// uploadInfo.setId(IdUtil.getSnowflakeNextId()); +// updateFileManager.save(uploadInfo); +// return uploadInfo.toDto(); +// } } diff --git a/bootx-services/service-visualization/src/main/java/cn/bootx/platform/visualization/controller/GoViewController.java b/bootx-services/service-visualization/src/main/java/cn/bootx/platform/visualization/controller/GoViewController.java index 5970b512..046d2b9a 100644 --- a/bootx-services/service-visualization/src/main/java/cn/bootx/platform/visualization/controller/GoViewController.java +++ b/bootx-services/service-visualization/src/main/java/cn/bootx/platform/visualization/controller/GoViewController.java @@ -5,7 +5,6 @@ import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.visualization.core.service.ProjectInfoService; import cn.bootx.platform.visualization.dto.GoVIewPageResult; -import cn.bootx.platform.visualization.dto.OssInfo; import cn.bootx.platform.visualization.dto.ProjectInfoResult; import cn.bootx.platform.visualization.param.ProjectInfoSave; import io.swagger.v3.oas.annotations.Operation; @@ -30,13 +29,13 @@ import java.util.List; public class GoViewController { private final ProjectInfoService projectInfoService; - - @IgnoreAuth - @Operation(summary = "获取文件oss存储信息") - @GetMapping("/getOssInfo") - public ResResult getOssInfo() { - return Res.ok(projectInfoService.getOssInfo()); - } +// +// @IgnoreAuth +// @Operation(summary = "获取文件oss存储信息") +// @GetMapping("/getOssInfo") +// public ResResult getOssInfo() { +// return Res.ok(projectInfoService.getOssInfo()); +// } @Operation(summary = "获取项目列表分页 ") @GetMapping("/page") diff --git a/bootx-services/service-visualization/src/main/java/cn/bootx/platform/visualization/core/service/ProjectInfoService.java b/bootx-services/service-visualization/src/main/java/cn/bootx/platform/visualization/core/service/ProjectInfoService.java index 85b7e940..7130bedf 100644 --- a/bootx-services/service-visualization/src/main/java/cn/bootx/platform/visualization/core/service/ProjectInfoService.java +++ b/bootx-services/service-visualization/src/main/java/cn/bootx/platform/visualization/core/service/ProjectInfoService.java @@ -14,7 +14,6 @@ import cn.bootx.platform.visualization.core.dao.ProjectInfoPublishManager; import cn.bootx.platform.visualization.core.entity.ProjectInfo; import cn.bootx.platform.visualization.core.entity.ProjectInfoPublish; import cn.bootx.platform.visualization.dto.GoVIewPageResult; -import cn.bootx.platform.visualization.dto.OssInfo; import cn.bootx.platform.visualization.dto.ProjectInfoDto; import cn.bootx.platform.visualization.dto.ProjectInfoResult; import cn.bootx.platform.visualization.param.CreateParam; @@ -54,13 +53,13 @@ public class ProjectInfoService { private final ParamService paramService; - /** - * 获取文件上传oss信息 - */ - public OssInfo getOssInfo() { - String filePreviewUrlPrefix = fileUploadService.getFilePreviewUrlPrefix(); - return new OssInfo().setBucketURL(filePreviewUrlPrefix); - } +// /** +// * 获取文件上传oss信息 +// */ +// public OssInfo getOssInfo() { +// String filePreviewUrlPrefix = fileUploadService.getFilePreviewUrlPrefix(); +// return new OssInfo().setBucketURL(filePreviewUrlPrefix); +// } /** * 创建项目 @@ -257,7 +256,8 @@ public class ProjectInfoService { .setContent(projectInfo.getContent()) .setRemarks(projectInfo.getRemark()); // 转换访问地址 - String filePreviewUrlPrefix = fileUploadService.getFilePreviewUrlPrefix(); +// String filePreviewUrlPrefix = fileUploadService.getFilePreviewUrlPrefix(); + String filePreviewUrlPrefix = "fileUploadService.getFilePreviewUrlPrefix()"; if (Objects.nonNull(projectInfo.getIndexImage())) { projectInfoResult.setIndexImage(filePreviewUrlPrefix + projectInfo.getIndexImage()); } diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml index aa846e84..ec3b83de 100644 --- a/bootx-start/src/main/resources/application-dev.yml +++ b/bootx-start/src/main/resources/application-dev.yml @@ -86,7 +86,7 @@ table-modify: scan-package: cn.bootx.platform database-type: mysql dromara: - x-file-storage: #文件存储配置 + x-file-storage: #文件存储配置, default-platform: local #默认使用的存储平台 thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】 local-plus: @@ -94,7 +94,7 @@ dromara: enable-storage: true #启用存储 enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高) domain: http://127.0.0.1:9999/ # 访问域名,例如:“http://127.0.0.1:8030/local-plus/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名 - path-patterns: /** # 访问路径 + path-patterns: /file/** # 访问路径不要用 /**, 会导致覆盖项目的资源 storage-path: D:/Temp/ # 存储路径 # Swagger 增强版 knife4j: -- Gitee From 240ae67c54fc177ba5796bfa1533739ca80e1485 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Tue, 14 Nov 2023 23:25:48 +0800 Subject: [PATCH 07/38] =?UTF-8?q?feat=20x.file.storage=E9=9B=86=E6=88=90?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FileUploadConfiguration.java | 12 +- .../configuration/FileUploadProperties.java | 140 +----------------- .../file/controller/FIleUpLoadController.java | 47 +++--- .../starter/file/convert/FileConvert.java | 12 +- ...ileManager.java => UploadFileManager.java} | 10 +- ...eFileMapper.java => UploadFileMapper.java} | 4 +- ...{UpdateFileDto.java => UploadFileDto.java} | 2 +- ...pdateFileInfo.java => UploadFileInfo.java} | 23 ++- .../file/handler/FileDetailRecordHandler.java | 24 ++- .../file/service/FileUploadService.java | 115 +++++++------- .../src/main/resources/application-dev.yml | 7 +- 11 files changed, 137 insertions(+), 259 deletions(-) rename bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/{UpdateFileManager.java => UploadFileManager.java} (60%) rename bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/{UpdateFileMapper.java => UploadFileMapper.java} (62%) rename bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/{UpdateFileDto.java => UploadFileDto.java} (97%) rename bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/{UpdateFileInfo.java => UploadFileInfo.java} (66%) diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadConfiguration.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadConfiguration.java index d8337c51..4446d1a6 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadConfiguration.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadConfiguration.java @@ -2,11 +2,7 @@ package cn.bootx.platform.starter.file.configuration; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.mongodb.MongoDatabaseFactory; -import org.springframework.data.mongodb.core.convert.MongoConverter; -import org.springframework.data.mongodb.gridfs.GridFsTemplate; /** * 文件上传配置 @@ -24,9 +20,9 @@ public class FileUploadConfiguration { /** * 自定义 GridFsTemplate */ - @Bean - public GridFsTemplate gridFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) { - return new GridFsTemplate(dbFactory, converter, properties.getMongo().getBucket()); - } +// @Bean +// public GridFsTemplate gridFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) { +// return new GridFsTemplate(dbFactory, converter, properties.getMongo().getBucket()); +// } } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadProperties.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadProperties.java index a7344761..f9c90ad2 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadProperties.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadProperties.java @@ -1,9 +1,6 @@ package cn.bootx.platform.starter.file.configuration; -import cn.bootx.platform.starter.file.code.FileUploadTypeEnum; import lombok.Data; -import lombok.Getter; -import lombok.Setter; import lombok.experimental.Accessors; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -19,143 +16,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class FileUploadProperties { /** - * 上传文件类型 默认为本地 - */ - private FileUploadTypeEnum uploadType = FileUploadTypeEnum.LOCAL; - - /** - * 服务器地址,优先级低于系统参数配置 + * 文件服务器地址, 需要与 x.file.storage 配置的 domain 一致 */ private String serverUrl = "http://127.0.0.1:9999"; - /** - * 本地存储 - */ - private Local local = new Local(); - - /** - * 数据库存储 - */ - private JDBC jdbc = new JDBC(); - - /** - * mongo存储配置 - */ - private Mongo mongo = new Mongo(); - - /** - * minio存储配置 - */ - private Minio minio = new Minio(); - - /** - * 腾讯云存储配置 - */ - private TencentOss tencentOss = new TencentOss(); - - /** - * 本地存储 - */ - @Getter - @Setter - public static class Local { - - /** - * 本地存储路径 - */ - private String localPath = "/data/file/"; - - } - - /** - * 数据库存储 - */ - @Getter - @Setter - public static class JDBC { - - /** - * 是否以Base64方式进行存储 - */ - private boolean base64 = false; - - } - - /** - * mongo存储配置 - */ - @Getter - @Setter - public static class Mongo { - - /** - * 存储桶 - */ - private String bucket = "fs"; - - } - - /** - * Minio存储配置 - */ - @Getter - @Setter - public static class Minio { - - /** - * 端点地址 - */ - private String endpoint; - - /** - * 区域 - */ - private String region; - - /** - * 访问 key - */ - private String accessKey; - - /** - * 访问 Secret - */ - private String accessSecret; - - /** - * 存储桶 需要至少三位 - */ - private String bucket = "bootx"; - - } - - @Getter - @Setter - public static class TencentOss { - - /** - * 地域 - */ - private String region; - - /** - * 标识Id - */ - private String secretId; - /** - * 秘钥 - */ - private String secretKey; - - /** - * 会话Token - */ - private String sessionToken; - - /** - * 存储桶 - */ - private String bucket; - } - } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java index 01cbc317..72cd70f6 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java @@ -5,14 +5,13 @@ import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.file.dto.UpdateFileDto; +import cn.bootx.platform.starter.file.dto.UploadFileDto; import cn.bootx.platform.starter.file.service.FileUploadService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.dromara.x.file.storage.core.FileInfo; import org.dromara.x.file.storage.core.FileStorageService; -import org.dromara.x.file.storage.spring.SpringFileStorageProperties; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -37,19 +36,17 @@ public class FIleUpLoadController { private final FileStorageService fileStorageService; - private final SpringFileStorageProperties properties; - @IgnoreAuth(ignore = false) @Operation(summary = "分页") @GetMapping("/page") - public ResResult> page(PageParam pageParam) { + public ResResult> page(PageParam pageParam) { return Res.ok(uploadService.page(pageParam)); } @IgnoreAuth(ignore = false, login = true) @Operation(summary = "上传") @PostMapping("/upload") - public ResResult local(MultipartFile file, String fileName) throws IOException { + public ResResult local(MultipartFile file, String fileName) throws IOException { return Res.ok(uploadService.upload(file, fileName)); } @@ -67,31 +64,31 @@ public class FIleUpLoadController { return Res.ok(); } -// @Operation(summary = "获取文件预览地址(流量会经过后端)") -// @GetMapping("getFilePreviewUrl") -// public ResResult getFilePreviewUrl(Long id) { -// return Res.ok(uploadService.getFilePreviewUrl(id)); -// } -// -// @Operation(summary = "获取文件预览地址前缀") -// @GetMapping("getFilePreviewUrlPrefix") -// public ResResult getFilePreviewUrlPrefix() { -// return Res.ok(uploadService.getFilePreviewUrlPrefix()); -// } -// -// @Operation(summary = "获取文件下载地址(流量会经过后端)") -// @GetMapping("getFileDownloadUrl") -// public ResResult getFileDownloadUrl(Long id) { -// return Res.ok(uploadService.getFileDownloadUrl(id)); -// } + @Operation(summary = "获取文件预览地址(流量会经过后端)") + @GetMapping("getFilePreviewUrl") + public ResResult getFilePreviewUrl(Long id) { + return Res.ok(uploadService.getFilePreviewUrl(id)); + } + + @Operation(summary = "获取文件预览地址前缀") + @GetMapping("getFilePreviewUrlPrefix") + public ResResult getFilePreviewUrlPrefix() { + return Res.ok(uploadService.getFilePreviewUrlPrefix()); + } + + @Operation(summary = "获取文件下载地址(流量会经过后端)") + @GetMapping("getFileDownloadUrl") + public ResResult getFileDownloadUrl(Long id) { + return Res.ok(uploadService.getFileDownloadUrl(id)); + } - @Operation(summary = "预览文件") + @Operation(summary = "预览文件(流量会经过后端)") @GetMapping("/preview/{id}") public void preview(@PathVariable Long id, HttpServletResponse response) { uploadService.preview(id, response); } - @Operation(summary = "下载文件") + @Operation(summary = "下载文件(流量会经过后端)") @GetMapping("/download/{id}") public ResponseEntity download(@PathVariable Long id) { return uploadService.download(id); diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java index bd07c4c0..91f2b818 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java @@ -1,7 +1,7 @@ package cn.bootx.platform.starter.file.convert; -import cn.bootx.platform.starter.file.dto.UpdateFileDto; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; +import cn.bootx.platform.starter.file.dto.UploadFileDto; +import cn.bootx.platform.starter.file.entity.UploadFileInfo; import org.dromara.x.file.storage.core.FileInfo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -15,13 +15,13 @@ public interface FileConvert { FileConvert CONVERT = Mappers.getMapper(FileConvert.class); - UpdateFileDto convert(UpdateFileInfo in); + UploadFileDto convert(UploadFileInfo in); - UpdateFileInfo convert(FileInfo in); + UploadFileInfo convert(FileInfo in); - FileInfo toFileInfo(UpdateFileInfo in); + FileInfo toFileInfo(UploadFileInfo in); - UpdateFileDto toDto(FileInfo in); + UploadFileDto toDto(FileInfo in); } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UpdateFileManager.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java similarity index 60% rename from bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UpdateFileManager.java rename to bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java index 7232ab4a..c8198dec 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UpdateFileManager.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java @@ -1,6 +1,6 @@ package cn.bootx.platform.starter.file.dao; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; +import cn.bootx.platform.starter.file.entity.UploadFileInfo; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; @@ -16,14 +16,14 @@ import org.springframework.stereotype.Repository; @Slf4j @Repository @RequiredArgsConstructor -public class UpdateFileManager extends BaseManager { +public class UploadFileManager extends BaseManager { /** * 分页 */ - public Page page(PageParam pageParam) { - Page mpPage = MpUtil.getMpPage(pageParam, UpdateFileInfo.class); - return lambdaQuery().orderByDesc(UpdateFileInfo::getId).page(mpPage); + public Page page(PageParam pageParam) { + Page mpPage = MpUtil.getMpPage(pageParam, UploadFileInfo.class); + return lambdaQuery().orderByDesc(UploadFileInfo::getId).page(mpPage); } } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UpdateFileMapper.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileMapper.java similarity index 62% rename from bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UpdateFileMapper.java rename to bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileMapper.java index 8e3ed31e..508fa55e 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UpdateFileMapper.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.starter.file.dao; -import cn.bootx.platform.starter.file.entity.UpdateFileInfo; +import cn.bootx.platform.starter.file.entity.UploadFileInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -9,6 +9,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2022/1/12 */ @Mapper -public interface UpdateFileMapper extends BaseMapper { +public interface UploadFileMapper extends BaseMapper { } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UpdateFileDto.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UploadFileDto.java similarity index 97% rename from bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UpdateFileDto.java rename to bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UploadFileDto.java index 23fba3e3..2d084ecc 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UpdateFileDto.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UploadFileDto.java @@ -16,7 +16,7 @@ import java.time.LocalDateTime; */ @Data @Accessors(chain = true) -public class UpdateFileDto { +public class UploadFileDto { /** 主键 */ private Long id; diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UpdateFileInfo.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileInfo.java similarity index 66% rename from bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UpdateFileInfo.java rename to bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileInfo.java index 10f8a7ca..05c83b21 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UpdateFileInfo.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileInfo.java @@ -3,13 +3,14 @@ package cn.bootx.platform.starter.file.entity; import cn.bootx.platform.starter.file.convert.FileConvert; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.starter.file.dto.UpdateFileDto; +import cn.bootx.platform.starter.file.dto.UploadFileDto; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.dromara.x.file.storage.core.FileInfo; import java.time.LocalDateTime; @@ -22,8 +23,8 @@ import java.time.LocalDateTime; @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -@TableName("starter_file_upload_info") -public class UpdateFileInfo extends MpIdEntity implements EntityBaseFunction { +@TableName(value = "starter_file_upload_info",autoResultMap = true) +public class UploadFileInfo extends MpIdEntity implements EntityBaseFunction { /** 存储位置 */ private String filePath; @@ -52,8 +53,22 @@ public class UpdateFileInfo extends MpIdEntity implements EntityBaseFunction page(PageParam pageParam) { + return MpUtil.convert2DtoPageResult(uploadFileManager.page(pageParam)); } + /** * 文件删除 */ @Transactional(rollbackFor = Exception.class) public void delete(Long id){ - UpdateFileInfo updateFileInfo = updateFileManager.findById(id) + UploadFileInfo uploadFileInfo = uploadFileManager.findById(id) .orElseThrow(DataNotExistException::new); - fileStorageService.delete(FileConvert.CONVERT.toFileInfo(updateFileInfo)); + fileStorageService.delete(FileConvert.CONVERT.toFileInfo(uploadFileInfo)); + } + + + + /** + * 文件上传 + * @param file 文件 + * @param fileName 文件名称 + */ + @Transactional(rollbackFor = Exception.class) + public UploadFileDto upload(MultipartFile file, String fileName) { + UploadPretreatment uploadPretreatment = fileStorageService.of(file); + if (StrUtil.isBlank(fileName)){ + uploadPretreatment.setOriginalFilename(fileName); + } + FileInfo upload =uploadPretreatment.upload(); + return FileConvert.CONVERT.toDto(upload); } /** * 浏览 */ public void preview(Long id, HttpServletResponse response) { - UpdateFileInfo updateFileInfo = updateFileManager.findById(id) - .orElseThrow(DataNotExistException::new); + byte[] bytes = fileStorageService.download(String.valueOf(id)).bytes(); } /** * 文件下载 */ public ResponseEntity download(Long id) { - UpdateFileInfo updateFileInfo = updateFileManager.findById(id) - .orElseThrow(DataNotExistException::new); - FileInfo fileInfo = FileConvert.CONVERT.toFileInfo(updateFileInfo); - byte[] bytes = fileStorageService.download(fileInfo).bytes(); + byte[] bytes = fileStorageService.download(String.valueOf(id)).bytes(); // 设置header信息 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - return new ResponseEntity<>(bytes,HttpStatus.OK); + return new ResponseEntity<>(bytes,headers,HttpStatus.OK); + } + + /** + * 获取文件预览地址 + */ + public String getFilePreviewUrl(Long id) { + return this.getServerUrl() + "/file/preview/" + id; } + /** + * 获取文件预览地址前缀 + */ + public String getFilePreviewUrlPrefix() { + return this.getServerUrl() + "/file/preview/"; + } /** - * 分页 + * 获取文件地址 */ - public PageResult page(PageParam pageParam) { - return MpUtil.convert2DtoPageResult(updateFileManager.page(pageParam)); + public String getFileDownloadUrl(Long id) { + return this.getServerUrl() + "/file/download/" + id; } -// /** -// * 获取文件预览地址 -// */ -// public String getFilePreviewUrl(Long id) { -// return this.getServerUrl() + "/file/preview/" + id; -// } -// -// /** -// * 获取文件预览地址前缀 -// */ -// public String getFilePreviewUrlPrefix() { -// return this.getServerUrl() + "/file/preview/"; -// } -// -// /** -// * 获取文件地址 -// */ -// public String getFileDownloadUrl(Long id) { -// return this.getServerUrl() + "/file/download/" + id; -// } -// /** * 服务地址 */ -// private String getServerUrl() { -// fileStorageService.getProperties().getLocalPlus().get(0). -// String serverUrl = paramService.getValue("FileServerUrl"); -// return serverUrl; -// } -// -// public UpdateFileDto saveUploadResult(UpdateFileInfo uploadInfo) { -// -// uploadInfo.setId(IdUtil.getSnowflakeNextId()); -// updateFileManager.save(uploadInfo); -// return uploadInfo.toDto(); -// } + private String getServerUrl() { + return fileUploadProperties.getServerUrl(); + } + } diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml index ec3b83de..cbafeba7 100644 --- a/bootx-start/src/main/resources/application-dev.yml +++ b/bootx-start/src/main/resources/application-dev.yml @@ -90,12 +90,9 @@ dromara: default-platform: local #默认使用的存储平台 thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】 local-plus: + # 不启用自带的访问映射, 使用自定义的访问实现 - platform: local # 存储平台标识 - enable-storage: true #启用存储 - enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高) - domain: http://127.0.0.1:9999/ # 访问域名,例如:“http://127.0.0.1:8030/local-plus/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名 - path-patterns: /file/** # 访问路径不要用 /**, 会导致覆盖项目的资源 - storage-path: D:/Temp/ # 存储路径 + storage-path: D:/data/files/ # 存储路径 # Swagger 增强版 knife4j: enable: true -- Gitee From 05ef6ce645c0e8821ba0812427e9613efc241596 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Wed, 15 Nov 2023 17:24:00 +0800 Subject: [PATCH 08/38] =?UTF-8?q?feat=20=E6=96=87=E4=BB=B6=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/controller/FIleUpLoadController.java | 24 ++- .../starter/file/convert/FileConvert.java | 2 +- .../starter/file/dto/UploadFileDto.java | 156 +++++++++++++++--- .../file/entity/UploadFileContext.java | 25 --- .../starter/file/entity/UploadFileInfo.java | 150 +++++++++++++++-- .../file/service/FileUploadService.java | 34 +++- .../src/main/resources/application-dev.yml | 29 +--- 7 files changed, 309 insertions(+), 111 deletions(-) delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileContext.java diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java index 72cd70f6..86ce35c0 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java @@ -10,8 +10,6 @@ import cn.bootx.platform.starter.file.service.FileUploadService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.dromara.x.file.storage.core.FileInfo; -import org.dromara.x.file.storage.core.FileStorageService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -34,8 +32,6 @@ public class FIleUpLoadController { private final FileUploadService uploadService; - private final FileStorageService fileStorageService; - @IgnoreAuth(ignore = false) @Operation(summary = "分页") @GetMapping("/page") @@ -43,11 +39,11 @@ public class FIleUpLoadController { return Res.ok(uploadService.page(pageParam)); } - @IgnoreAuth(ignore = false, login = true) - @Operation(summary = "上传") - @PostMapping("/upload") - public ResResult local(MultipartFile file, String fileName) throws IOException { - return Res.ok(uploadService.upload(file, fileName)); + @IgnoreAuth(ignore = false) + @Operation(summary = "获取单条详情") + @GetMapping("/findById") + public ResResult findById(Long id) { + return Res.ok(uploadService.findById(id)); } @Operation(summary = "删除") @@ -57,11 +53,11 @@ public class FIleUpLoadController { return Res.ok(); } - @Operation(summary = "获取文件") - @GetMapping("/getFile") - public ResResult getFile(){ - FileInfo fileInfoByUrl = fileStorageService.getFileInfoByUrl(""); - return Res.ok(); + @IgnoreAuth(ignore = false, login = true) + @Operation(summary = "上传") + @PostMapping("/upload") + public ResResult local(MultipartFile file, String fileName) throws IOException { + return Res.ok(uploadService.upload(file, fileName)); } @Operation(summary = "获取文件预览地址(流量会经过后端)") diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java index 91f2b818..129d0ef2 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/convert/FileConvert.java @@ -11,7 +11,7 @@ import org.mapstruct.factory.Mappers; * @since 2022/1/12 */ @Mapper -public interface FileConvert { +public interface FileConvert { FileConvert CONVERT = Mappers.getMapper(FileConvert.class); diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UploadFileDto.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UploadFileDto.java index 2d084ecc..223897fa 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UploadFileDto.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dto/UploadFileDto.java @@ -1,12 +1,14 @@ package cn.bootx.platform.starter.file.dto; import cn.hutool.core.io.FileUtil; -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; +import cn.hutool.core.lang.Dict; import lombok.Data; import lombok.experimental.Accessors; +import org.dromara.x.file.storage.core.FileInfo; +import org.dromara.x.file.storage.core.constant.Constant; import java.time.LocalDateTime; +import java.util.Map; /** * 上传文件信息 @@ -18,37 +20,149 @@ import java.time.LocalDateTime; @Accessors(chain = true) public class UploadFileDto { - /** 主键 */ + /** + * 文件id + */ private Long id; - /** 存储位置 */ - private String filePath; + /** + * 文件访问地址 + */ + private String url; - /** 文件名称 */ - private String fileName; + /** + * 文件大小,单位字节 + */ + private Long size; - /** 文件后缀 */ - private String fileSuffix; + /** + * 文件名称 + */ + private String filename; - /** 文件类型 */ - private String fileType; + /** + * 原始文件名 + */ + private String originalFilename; - /** 文件大小 */ - private Long fileSize; + /** + * 基础存储路径 + */ + private String basePath; - /** 外部存储id */ - private String externalStorageId; + /** + * 存储路径 + */ + private String path; - /** 创建者ID */ - @TableField(fill = FieldFill.INSERT) - private Long creator; + /** + * 文件扩展名 + */ + private String ext; - /** 创建时间 */ - @TableField(fill = FieldFill.INSERT) + /** + * MIME 类型 + */ + private String contentType; + + /** + * 存储平台 + */ + private String platform; + + /** + * 缩略图访问路径 + */ + private String thUrl; + + /** + * 缩略图名称 + */ + private String thFilename; + + /** + * 缩略图大小,单位字节 + */ + private Long thSize; + + /** + * 缩略图 MIME 类型 + */ + private String thContentType; + + /** + * 文件所属对象id + */ + private String objectId; + + /** + * 文件所属对象类型,例如用户头像,评价图片 + */ + private String objectType; + + /** + * 文件元数据 + */ + private Map metadata; + + /** + * 文件用户元数据 + */ + private Map userMetadata; + + /** + * 缩略图元数据 + */ + private Map thMetadata; + + /** + * 缩略图用户元数据 + */ + private Map thUserMetadata; + + /** + * 附加属性字典 + */ + private Dict attr; + + /** + * 文件的访问控制列表,一般情况下只有对象存储支持该功能,支持 String 或对应存储平台的 ACL 对象 + *
+     * //方式一,通过字符串设置通用的 ACL 详情:{@link Constant.ACL }
+     * setFileAcl(ACL.PUBLIC_READ);
+     * //方式二,针对指定存储平台设置更复杂的权限控制,以华为云 OBS 为例
+     * AccessControlList acl = new AccessControlList();
+     * Owner owner = new Owner();
+     * owner.setId("ownerid");
+     * acl.setOwner(owner);
+     * // 保留Owner的完全控制权限(注:如果不设置该权限,该对象Owner自身将没有访问权限)
+     * acl.grantPermission(new CanonicalGrantee("ownerid"), Permission.PERMISSION_FULL_CONTROL);
+     * // 为指定用户设置完全控制权限
+     * acl.grantPermission(new CanonicalGrantee("userid"), Permission.PERMISSION_FULL_CONTROL);
+     * // 为所有用户设置读权限
+     * acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ);
+     * setFileAcl(acl);
+     * 
+     */
+    private Object fileAcl;
+
+    /**
+     * 缩略图的访问控制列表,一般情况下只有对象存储支持该功能
+     * 详情见{@link FileInfo#setFileAcl}
+     */
+    private Object thFileAcl;
+
+    /**
+     * 创建时间
+     */
     private LocalDateTime createTime;
 
+
+    /**
+     * 文件大小
+     */
     public String getFileSize() {
-        return FileUtil.readableFileSize(fileSize);
+        return FileUtil.readableFileSize(size);
     }
 
 }
diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileContext.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileContext.java
deleted file mode 100644
index 442a4d54..00000000
--- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileContext.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package cn.bootx.platform.starter.file.entity;
-
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * 上传文件上下文
- *
- * @author xxm
- * @since 2022/1/20
- */
-@Data
-@Accessors(chain = true)
-public class UploadFileContext {
-
-    /** 文件id */
-    private Long fileId;
-
-    /** 文件名称 */
-    private String fileName;
-
-    /** 文件后缀名 */
-    private String fileSuffix;
-
-}
diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileInfo.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileInfo.java
index 05c83b21..44db35a2 100644
--- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileInfo.java
+++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/entity/UploadFileInfo.java
@@ -1,9 +1,11 @@
 package cn.bootx.platform.starter.file.entity;
 
-import cn.bootx.platform.starter.file.convert.FileConvert;
 import cn.bootx.platform.common.core.function.EntityBaseFunction;
 import cn.bootx.platform.common.mybatisplus.base.MpIdEntity;
+import cn.bootx.platform.common.mybatisplus.handler.JacksonRawTypeHandler;
+import cn.bootx.platform.starter.file.convert.FileConvert;
 import cn.bootx.platform.starter.file.dto.UploadFileDto;
+import cn.hutool.core.lang.Dict;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -11,8 +13,10 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.dromara.x.file.storage.core.FileInfo;
+import org.dromara.x.file.storage.core.constant.Constant;
 
 import java.time.LocalDateTime;
+import java.util.Map;
 
 /**
  * 上传文件信息
@@ -23,30 +27,142 @@ import java.time.LocalDateTime;
 @EqualsAndHashCode(callSuper = true)
 @Data
 @Accessors(chain = true)
-@TableName(value = "starter_file_upload_info",autoResultMap = true)
+@TableName(value = "starter_file_upload_info", autoResultMap = true)
 public class UploadFileInfo extends MpIdEntity implements EntityBaseFunction {
 
-    /** 存储位置 */
-    private String filePath;
+    /**
+     * 文件访问地址
+     */
+    private String url;
 
-    /** 文件名称 */
-    private String fileName;
+    /**
+     * 文件大小,单位字节
+     */
+    private Long size;
 
-    /** 文件类型 */
-    private String fileType;
+    /**
+     * 文件名称
+     */
+    private String filename;
 
-    /** 文件后缀 */
-    private String fileSuffix;
+    /**
+     * 原始文件名
+     */
+    private String originalFilename;
 
-    /** 文件大小 */
-    private Long fileSize;
+    /**
+     * 基础存储路径
+     */
+    private String basePath;
 
-    /** 外部存储id */
-    private String externalStorageId;
+    /**
+     * 存储路径
+     */
+    private String path;
 
-    /** 创建者ID */
-    @TableField(fill = FieldFill.INSERT)
-    private Long creator;
+    /**
+     * 文件扩展名
+     */
+    private String ext;
+
+    /**
+     * MIME 类型
+     */
+    private String contentType;
+
+    /**
+     * 存储平台
+     */
+    private String platform;
+
+    /**
+     * 缩略图访问路径
+     */
+    private String thUrl;
+
+    /**
+     * 缩略图名称
+     */
+    private String thFilename;
+
+    /**
+     * 缩略图大小,单位字节
+     */
+    private Long thSize;
+
+    /**
+     * 缩略图 MIME 类型
+     */
+    private String thContentType;
+
+    /**
+     * 文件所属对象id
+     */
+    private String objectId;
+
+    /**
+     * 文件所属对象类型,例如用户头像,评价图片
+     */
+    private String objectType;
+
+    /**
+     * 文件元数据
+     */
+    @TableField(typeHandler = JacksonRawTypeHandler.class)
+    private Map metadata;
+
+    /**
+     * 文件用户元数据
+     */
+    @TableField(typeHandler = JacksonRawTypeHandler.class)
+    private Map userMetadata;
+
+    /**
+     * 缩略图元数据
+     */
+    @TableField(typeHandler = JacksonRawTypeHandler.class)
+    private Map thMetadata;
+
+    /**
+     * 缩略图用户元数据
+     */
+    @TableField(typeHandler = JacksonRawTypeHandler.class)
+    private Map thUserMetadata;
+
+    /**
+     * 附加属性字典
+     */
+    @TableField(typeHandler = JacksonRawTypeHandler.class)
+    private Dict attr;
+
+    /**
+     * 文件的访问控制列表,一般情况下只有对象存储支持该功能,支持 String 或对应存储平台的 ACL 对象
+     * 
+     * //方式一,通过字符串设置通用的 ACL 详情:{@link Constant.ACL }
+     * setFileAcl(ACL.PUBLIC_READ);
+     * //方式二,针对指定存储平台设置更复杂的权限控制,以华为云 OBS 为例
+     * AccessControlList acl = new AccessControlList();
+     * Owner owner = new Owner();
+     * owner.setId("ownerid");
+     * acl.setOwner(owner);
+     * // 保留Owner的完全控制权限(注:如果不设置该权限,该对象Owner自身将没有访问权限)
+     * acl.grantPermission(new CanonicalGrantee("ownerid"), Permission.PERMISSION_FULL_CONTROL);
+     * // 为指定用户设置完全控制权限
+     * acl.grantPermission(new CanonicalGrantee("userid"), Permission.PERMISSION_FULL_CONTROL);
+     * // 为所有用户设置读权限
+     * acl.grantPermission(GroupGrantee.ALL_USERS, Permission.PERMISSION_READ);
+     * setFileAcl(acl);
+     * 
+     */
+    @TableField(typeHandler = JacksonRawTypeHandler.class)
+    private Object fileAcl;
+
+    /**
+     * 缩略图的访问控制列表,一般情况下只有对象存储支持该功能
+     * 详情见{@link FileInfo#setFileAcl}
+     */
+    @TableField(typeHandler = JacksonRawTypeHandler.class)
+    private Object thFileAcl;
 
     /** 创建时间 */
     @TableField(fill = FieldFill.INSERT)
diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
index c5af2898..6b1bd6c1 100644
--- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
+++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
@@ -9,9 +9,12 @@ import cn.bootx.platform.starter.file.convert.FileConvert;
 import cn.bootx.platform.starter.file.dao.UploadFileManager;
 import cn.bootx.platform.starter.file.dto.UploadFileDto;
 import cn.bootx.platform.starter.file.entity.UploadFileInfo;
+import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.StrUtil;
 import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import lombok.val;
 import org.dromara.x.file.storage.core.FileInfo;
 import org.dromara.x.file.storage.core.FileStorageService;
 import org.dromara.x.file.storage.core.UploadPretreatment;
@@ -23,7 +26,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
 
 /**
  * 文件上传管理类
@@ -47,6 +52,14 @@ public class FileUploadService {
         return MpUtil.convert2DtoPageResult(uploadFileManager.page(pageParam));
     }
 
+    /**
+     * 获取单条详情
+     */
+    public UploadFileDto findById(Long id){
+        return uploadFileManager.findById(id)
+                .map(UploadFileInfo::toDto)
+               .orElseThrow(DataNotExistException::new);
+    }
 
     /**
      * 文件删除
@@ -58,8 +71,6 @@ public class FileUploadService {
         fileStorageService.delete(FileConvert.CONVERT.toFileInfo(uploadFileInfo));
     }
 
-
-
     /**
      * 文件上传
      * @param file 文件
@@ -68,7 +79,7 @@ public class FileUploadService {
     @Transactional(rollbackFor = Exception.class)
     public UploadFileDto upload(MultipartFile file, String fileName) {
         UploadPretreatment uploadPretreatment = fileStorageService.of(file);
-        if (StrUtil.isBlank(fileName)){
+        if (StrUtil.isNotBlank(fileName)){
             uploadPretreatment.setOriginalFilename(fileName);
         }
         FileInfo upload =uploadPretreatment.upload();
@@ -78,18 +89,30 @@ public class FileUploadService {
     /**
      * 浏览
      */
+    @SneakyThrows
     public void preview(Long id, HttpServletResponse response) {
-        byte[] bytes = fileStorageService.download(String.valueOf(id)).bytes();
+        FileInfo info = fileStorageService.getFileInfoByUrl(String.valueOf(id));
+        byte[] bytes = fileStorageService.download(info).bytes();
+        val is = new ByteArrayInputStream(bytes);
+        // 获取响应输出流
+        ServletOutputStream os = response.getOutputStream();
+        IoUtil.copy(is, os);
+        response.addHeader(HttpHeaders.CONTENT_DISPOSITION, info.getContentType());
+        IoUtil.close(is);
+        IoUtil.close(os);
     }
 
     /**
      * 文件下载
      */
     public ResponseEntity download(Long id) {
-        byte[] bytes = fileStorageService.download(String.valueOf(id)).bytes();
+        FileInfo fileInfo = fileStorageService.getFileInfoByUrl(String.valueOf(id));
+        byte[] bytes = fileStorageService.download(fileInfo).bytes();
         // 设置header信息
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+        String fileName = fileInfo.getOriginalFilename() + "." + fileInfo.getExt();
+        headers.setContentDispositionFormData("attachment", fileName);
         return new ResponseEntity<>(bytes,headers,HttpStatus.OK);
     }
 
@@ -120,5 +143,4 @@ public class FileUploadService {
     private String getServerUrl() {
         return fileUploadProperties.getServerUrl();
     }
-
 }
diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml
index cbafeba7..3b2c45b3 100644
--- a/bootx-start/src/main/resources/application-dev.yml
+++ b/bootx-start/src/main/resources/application-dev.yml
@@ -92,6 +92,7 @@ dromara:
     local-plus:
       # 不启用自带的访问映射, 使用自定义的访问实现
       - platform: local # 存储平台标识
+        enableStorage: true
         storage-path: D:/data/files/ # 存储路径
 # Swagger 增强版
 knife4j:
@@ -219,33 +220,7 @@ bootx:
         search-type: cache
     # 文件上传
     file-upload:
-      upload-type: jdbc
-      server-url: http://127.0.0.1:8080
-      local:
-        local-path: /data/file
-      mongo:
-        # 储存桶
-        bucket: fs
-      minio:
-        # 地址
-        endpoint: http://127.0.0.1:9000
-        # 账号
-        access-key: root
-        # 密码
-        access-secret: password
-        # 存储桶 需要至少三位
-        bucket: bootx
-      tencent-oss:
-          # 标识
-          secret-id: ''
-          # 密钥
-          secret-key: ''
-          # 地域
-          region: ''
-          # 会话token
-          session-token:
-           # 存储桶名称
-          bucket: bootx
+      server-url: http://127.0.0.1:9999
     # 数据权限
     data-perm:
       field-decrypt-key: "UCrtxSCwYZNCIlav"
-- 
Gitee


From a9a2da45217d3fe6b50aaca6cd6ad012ff655b3e Mon Sep 17 00:00:00 2001
From: nws <3239709711@qq.com>
Date: Wed, 15 Nov 2023 23:16:49 +0800
Subject: [PATCH 09/38] =?UTF-8?q?feat=20=E4=B8=8A=E4=BC=A0=E6=96=87?=
 =?UTF-8?q?=E4=BB=B6=E4=BF=A1=E6=81=AF=E6=9F=A5=E7=9C=8B=E5=92=8C=E4=B8=8B?=
 =?UTF-8?q?=E8=BD=BD=E6=96=87=E4=BB=B6=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?=
 =?UTF-8?q?=E8=A7=A3=E5=86=B3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../starter/file/UploadFileParam.java         | 39 +++++++++++++++++++
 .../FileUploadConfiguration.java              | 28 -------------
 .../file/controller/FIleUpLoadController.java |  5 ++-
 .../starter/file/dao/UploadFileManager.java   | 16 ++++++--
 .../file/service/FileUploadService.java       | 13 ++++---
 5 files changed, 63 insertions(+), 38 deletions(-)
 create mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/UploadFileParam.java
 delete mode 100644 bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadConfiguration.java

diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/UploadFileParam.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/UploadFileParam.java
new file mode 100644
index 00000000..8c69f086
--- /dev/null
+++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/UploadFileParam.java
@@ -0,0 +1,39 @@
+package cn.bootx.platform.starter.file;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ * 上传文件查询参数
+ * @author xxm
+ * @since 2023/11/15
+ */
+@Data
+@Accessors(chain = true)
+@Schema(title = "上传文件查询参数")
+public class UploadFileParam {
+
+    /** 原始文件名 */
+    @Schema(description = "原始文件名")
+    private String originalFilename;
+
+    /** 开始时间 */
+    @Schema(description = "开始时间")
+    private LocalDateTime startTime;
+
+    /** 结束时间 */
+    @Schema(description = "结束时间")
+    private LocalDateTime endTime;
+
+    /** 文件扩展名 */
+    @Schema(description = "文件扩展名")
+    private String ext;
+
+    /** MIME 类型 */
+    @Schema(description = "MIME 类型")
+    private String contentType;
+
+}
diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadConfiguration.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadConfiguration.java
deleted file mode 100644
index 4446d1a6..00000000
--- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadConfiguration.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package cn.bootx.platform.starter.file.configuration;
-
-import lombok.RequiredArgsConstructor;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * 文件上传配置
- *
- * @author xxm
- * @since 2022/2/15
- */
-@Configuration
-@ConditionalOnClass(name="org.springframework.data.mongodb.gridfs.GridFsTemplate")
-@RequiredArgsConstructor
-public class FileUploadConfiguration {
-
-    private final FileUploadProperties properties;
-
-    /**
-     * 自定义 GridFsTemplate
-     */
-//    @Bean
-//    public GridFsTemplate gridFsTemplate(MongoDatabaseFactory dbFactory, MongoConverter converter) {
-//        return new GridFsTemplate(dbFactory, converter, properties.getMongo().getBucket());
-//    }
-
-}
diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java
index 86ce35c0..3ab35b88 100644
--- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java
+++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/controller/FIleUpLoadController.java
@@ -5,6 +5,7 @@ import cn.bootx.platform.common.core.rest.PageResult;
 import cn.bootx.platform.common.core.rest.Res;
 import cn.bootx.platform.common.core.rest.ResResult;
 import cn.bootx.platform.common.core.rest.param.PageParam;
+import cn.bootx.platform.starter.file.UploadFileParam;
 import cn.bootx.platform.starter.file.dto.UploadFileDto;
 import cn.bootx.platform.starter.file.service.FileUploadService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -35,8 +36,8 @@ public class FIleUpLoadController {
     @IgnoreAuth(ignore = false)
     @Operation(summary = "分页")
     @GetMapping("/page")
-    public ResResult> page(PageParam pageParam) {
-        return Res.ok(uploadService.page(pageParam));
+    public ResResult> page(PageParam pageParam, UploadFileParam param) {
+        return Res.ok(uploadService.page(pageParam,param));
     }
 
     @IgnoreAuth(ignore = false)
diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java
index c8198dec..16683cfb 100644
--- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java
+++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/dao/UploadFileManager.java
@@ -1,14 +1,18 @@
 package cn.bootx.platform.starter.file.dao;
 
-import cn.bootx.platform.starter.file.entity.UploadFileInfo;
 import cn.bootx.platform.common.core.rest.param.PageParam;
 import cn.bootx.platform.common.mybatisplus.impl.BaseManager;
 import cn.bootx.platform.common.mybatisplus.util.MpUtil;
+import cn.bootx.platform.starter.file.UploadFileParam;
+import cn.bootx.platform.starter.file.entity.UploadFileInfo;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Repository;
 
+import java.util.Objects;
+
 /**
  * @author xxm
  * @since 2022/1/12
@@ -21,9 +25,15 @@ public class UploadFileManager extends BaseManager page(PageParam pageParam) {
+    public Page page(PageParam pageParam, UploadFileParam param) {
         Page mpPage = MpUtil.getMpPage(pageParam, UploadFileInfo.class);
-        return lambdaQuery().orderByDesc(UploadFileInfo::getId).page(mpPage);
+        return lambdaQuery()
+                .like(StrUtil.isNotBlank(param.getOriginalFilename()), UploadFileInfo::getOriginalFilename, param.getOriginalFilename())
+                .like(StrUtil.isNotBlank(param.getExt()), UploadFileInfo::getExt, param.getExt())
+                .like(StrUtil.isNotBlank(param.getContentType()), UploadFileInfo::getContentType, param.getContentType())
+                .ge(Objects.nonNull(param.getStartTime()), UploadFileInfo::getCreateTime, param.getStartTime())
+                .le(Objects.nonNull(param.getEndTime()), UploadFileInfo::getCreateTime, param.getEndTime())
+                .orderByDesc(UploadFileInfo::getId).page(mpPage);
     }
 
 }
diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
index 6b1bd6c1..fa78f497 100644
--- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
+++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java
@@ -4,12 +4,14 @@ import cn.bootx.platform.common.core.exception.DataNotExistException;
 import cn.bootx.platform.common.core.rest.PageResult;
 import cn.bootx.platform.common.core.rest.param.PageParam;
 import cn.bootx.platform.common.mybatisplus.util.MpUtil;
+import cn.bootx.platform.starter.file.UploadFileParam;
 import cn.bootx.platform.starter.file.configuration.FileUploadProperties;
 import cn.bootx.platform.starter.file.convert.FileConvert;
 import cn.bootx.platform.starter.file.dao.UploadFileManager;
 import cn.bootx.platform.starter.file.dto.UploadFileDto;
 import cn.bootx.platform.starter.file.entity.UploadFileInfo;
 import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.CharsetUtil;
 import cn.hutool.core.util.StrUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
@@ -29,6 +31,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.ByteArrayInputStream;
+import java.net.URLEncoder;
 
 /**
  * 文件上传管理类
@@ -44,12 +47,11 @@ public class FileUploadService {
     private final FileStorageService fileStorageService;
     private final FileUploadProperties fileUploadProperties;
 
-
     /**
      * 分页
      */
-    public PageResult page(PageParam pageParam) {
-        return MpUtil.convert2DtoPageResult(uploadFileManager.page(pageParam));
+    public PageResult page(PageParam pageParam, UploadFileParam param) {
+        return MpUtil.convert2DtoPageResult(uploadFileManager.page(pageParam,param));
     }
 
     /**
@@ -105,14 +107,15 @@ public class FileUploadService {
     /**
      * 文件下载
      */
+    @SneakyThrows
     public ResponseEntity download(Long id) {
         FileInfo fileInfo = fileStorageService.getFileInfoByUrl(String.valueOf(id));
         byte[] bytes = fileStorageService.download(fileInfo).bytes();
         // 设置header信息
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
-        String fileName = fileInfo.getOriginalFilename() + "." + fileInfo.getExt();
-        headers.setContentDispositionFormData("attachment", fileName);
+        String fileName = fileInfo.getOriginalFilename();
+        headers.setContentDispositionFormData("attachment", URLEncoder.encode(fileName, CharsetUtil.UTF_8));
         return new ResponseEntity<>(bytes,headers,HttpStatus.OK);
     }
 
-- 
Gitee


From 81fb6c9854c331614513ff40670f914537315a1e Mon Sep 17 00:00:00 2001
From: nws <3239709711@qq.com>
Date: Sat, 18 Nov 2023 15:12:07 +0800
Subject: [PATCH 10/38] =?UTF-8?q?style=20=E7=89=88=E6=9C=AC=E5=8F=B7?=
 =?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md                                              | 4 ++--
 _doc/ChangeLog.md                                      | 5 +++++
 bootx-common-core/pom.xml                              | 2 +-
 bootx-common-starters/common-starter-audit-log/pom.xml | 2 +-
 bootx-common-starters/common-starter-auth/pom.xml      | 2 +-
 bootx-common-starters/common-starter-code-gen/pom.xml  | 2 +-
 bootx-common-starters/common-starter-data-perm/pom.xml | 2 +-
 bootx-common-starters/common-starter-dingtalk/pom.xml  | 2 +-
 bootx-common-starters/common-starter-file/pom.xml      | 2 +-
 bootx-common-starters/common-starter-monitor/pom.xml   | 2 +-
 bootx-common-starters/common-starter-quartz/pom.xml    | 2 +-
 bootx-common-starters/common-starter-wechat/pom.xml    | 2 +-
 bootx-common-starters/common-starter-wecom/pom.xml     | 2 +-
 bootx-common-starters/pom.xml                          | 2 +-
 bootx-commons/common-cache/pom.xml                     | 2 +-
 bootx-commons/common-data-translate/pom.xml            | 2 +-
 bootx-commons/common-eventer/pom.xml                   | 2 +-
 bootx-commons/common-exception-handler/pom.xml         | 2 +-
 bootx-commons/common-header-holder/pom.xml             | 2 +-
 bootx-commons/common-idempotency/pom.xml               | 2 +-
 bootx-commons/common-jackson/pom.xml                   | 2 +-
 bootx-commons/common-log/pom.xml                       | 2 +-
 bootx-commons/common-mongo/pom.xml                     | 2 +-
 bootx-commons/common-mybatis-plus/pom.xml              | 2 +-
 bootx-commons/common-rabbitmq/pom.xml                  | 2 +-
 bootx-commons/common-redis-client/pom.xml              | 2 +-
 bootx-commons/common-sequence/pom.xml                  | 2 +-
 bootx-commons/common-spring/pom.xml                    | 2 +-
 bootx-commons/common-super-query/pom.xml               | 2 +-
 bootx-commons/common-swagger/pom.xml                   | 2 +-
 bootx-commons/common-websocket/pom.xml                 | 2 +-
 bootx-commons/common-xxl-job/pom.xml                   | 2 +-
 bootx-commons/pom.xml                                  | 2 +-
 bootx-demo/pom.xml                                     | 2 +-
 bootx-services/pom.xml                                 | 2 +-
 bootx-services/service-baseapi/pom.xml                 | 2 +-
 bootx-services/service-iam/pom.xml                     | 2 +-
 bootx-services/service-miniapp/pom.xml                 | 2 +-
 bootx-services/service-notice/pom.xml                  | 2 +-
 bootx-services/service-visualization/pom.xml           | 2 +-
 bootx-start/pom.xml                                    | 2 +-
 bootx-start/src/main/resources/application-dev.yml     | 2 +-
 pom.xml                                                | 4 ++--
 43 files changed, 49 insertions(+), 44 deletions(-)

diff --git a/README.md b/README.md
index b1f67ead..4d425335 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-# Bootx-Platform (v1.3.5-园博园)
+# Bootx-Platform (v1.3.6-园博园)
 
 

star - Build Status + Build Status Build Status Downloads diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index f8a443d4..e9d5f710 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,4 +1,9 @@ # CHANGELOG +## [v1.3.6] 一号线-园博园 +- 文件上传替换为基于`x-file-storage`定制 +- 密码安全配置设置为必填. 保存信息化状态变为查看状态 +- 密码过期后清除所有的权限,必须强制更改密码 + ## [v1.3.5] 一号线-园博园 - 新增: SQL查询功能 - 新增: SQL查询功能支持导出 diff --git a/bootx-common-core/pom.xml b/bootx-common-core/pom.xml index 78d8d545..e8f6ee33 100644 --- a/bootx-common-core/pom.xml +++ b/bootx-common-core/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-platform-parent - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-common-starters/common-starter-audit-log/pom.xml b/bootx-common-starters/common-starter-audit-log/pom.xml index 02e4d782..50f5c8b1 100644 --- a/bootx-common-starters/common-starter-audit-log/pom.xml +++ b/bootx-common-starters/common-starter-audit-log/pom.xml @@ -5,7 +5,7 @@ bootx-common-starters cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-common-starters/common-starter-auth/pom.xml b/bootx-common-starters/common-starter-auth/pom.xml index c3f79cd1..c8ed4555 100644 --- a/bootx-common-starters/common-starter-auth/pom.xml +++ b/bootx-common-starters/common-starter-auth/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-common-starters - 1.3.5 + 1.3.6 4.0.0 common-starter-auth diff --git a/bootx-common-starters/common-starter-code-gen/pom.xml b/bootx-common-starters/common-starter-code-gen/pom.xml index 1ebd300d..21bf7fd3 100644 --- a/bootx-common-starters/common-starter-code-gen/pom.xml +++ b/bootx-common-starters/common-starter-code-gen/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-common-starters - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-common-starters/common-starter-data-perm/pom.xml b/bootx-common-starters/common-starter-data-perm/pom.xml index eef935bf..4296524b 100644 --- a/bootx-common-starters/common-starter-data-perm/pom.xml +++ b/bootx-common-starters/common-starter-data-perm/pom.xml @@ -5,7 +5,7 @@ bootx-common-starters cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-common-starters/common-starter-dingtalk/pom.xml b/bootx-common-starters/common-starter-dingtalk/pom.xml index b4c08959..66ab3a84 100644 --- a/bootx-common-starters/common-starter-dingtalk/pom.xml +++ b/bootx-common-starters/common-starter-dingtalk/pom.xml @@ -5,7 +5,7 @@ bootx-common-starters cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-common-starters/common-starter-file/pom.xml b/bootx-common-starters/common-starter-file/pom.xml index c02a7ba7..bf524bfc 100644 --- a/bootx-common-starters/common-starter-file/pom.xml +++ b/bootx-common-starters/common-starter-file/pom.xml @@ -5,7 +5,7 @@ bootx-common-starters cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-common-starters/common-starter-monitor/pom.xml b/bootx-common-starters/common-starter-monitor/pom.xml index fda54f96..3dfa0800 100644 --- a/bootx-common-starters/common-starter-monitor/pom.xml +++ b/bootx-common-starters/common-starter-monitor/pom.xml @@ -5,7 +5,7 @@ bootx-common-starters cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 jar diff --git a/bootx-common-starters/common-starter-quartz/pom.xml b/bootx-common-starters/common-starter-quartz/pom.xml index 931c925b..76600697 100644 --- a/bootx-common-starters/common-starter-quartz/pom.xml +++ b/bootx-common-starters/common-starter-quartz/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-common-starters - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-common-starters/common-starter-wechat/pom.xml b/bootx-common-starters/common-starter-wechat/pom.xml index 169a71b1..0baae280 100644 --- a/bootx-common-starters/common-starter-wechat/pom.xml +++ b/bootx-common-starters/common-starter-wechat/pom.xml @@ -5,7 +5,7 @@ bootx-common-starters cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-common-starters/common-starter-wecom/pom.xml b/bootx-common-starters/common-starter-wecom/pom.xml index e91e9c03..0c52fbfc 100644 --- a/bootx-common-starters/common-starter-wecom/pom.xml +++ b/bootx-common-starters/common-starter-wecom/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-common-starters - 1.3.5 + 1.3.6 4.0.0 jar diff --git a/bootx-common-starters/pom.xml b/bootx-common-starters/pom.xml index 065167fd..d31add13 100644 --- a/bootx-common-starters/pom.xml +++ b/bootx-common-starters/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-platform-parent - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-cache/pom.xml b/bootx-commons/common-cache/pom.xml index 793b603d..64ff405b 100644 --- a/bootx-commons/common-cache/pom.xml +++ b/bootx-commons/common-cache/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-commons - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-data-translate/pom.xml b/bootx-commons/common-data-translate/pom.xml index 9ccc84e5..ae89a44c 100644 --- a/bootx-commons/common-data-translate/pom.xml +++ b/bootx-commons/common-data-translate/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-commons - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-eventer/pom.xml b/bootx-commons/common-eventer/pom.xml index affde9f6..8da165b3 100644 --- a/bootx-commons/common-eventer/pom.xml +++ b/bootx-commons/common-eventer/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-commons - 1.3.5 + 1.3.6 common-eventer diff --git a/bootx-commons/common-exception-handler/pom.xml b/bootx-commons/common-exception-handler/pom.xml index 97d95ddf..0d94bdd1 100644 --- a/bootx-commons/common-exception-handler/pom.xml +++ b/bootx-commons/common-exception-handler/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 common-exception-handler diff --git a/bootx-commons/common-header-holder/pom.xml b/bootx-commons/common-header-holder/pom.xml index e46dfd9d..b42a427e 100644 --- a/bootx-commons/common-header-holder/pom.xml +++ b/bootx-commons/common-header-holder/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-idempotency/pom.xml b/bootx-commons/common-idempotency/pom.xml index 411c31a2..fe73eb49 100644 --- a/bootx-commons/common-idempotency/pom.xml +++ b/bootx-commons/common-idempotency/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-jackson/pom.xml b/bootx-commons/common-jackson/pom.xml index c739d586..87d111b5 100644 --- a/bootx-commons/common-jackson/pom.xml +++ b/bootx-commons/common-jackson/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-commons - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-log/pom.xml b/bootx-commons/common-log/pom.xml index d1a8d812..37368d6c 100644 --- a/bootx-commons/common-log/pom.xml +++ b/bootx-commons/common-log/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-commons - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-mongo/pom.xml b/bootx-commons/common-mongo/pom.xml index 05c04eb0..3c50226e 100644 --- a/bootx-commons/common-mongo/pom.xml +++ b/bootx-commons/common-mongo/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-commons - 1.3.5 + 1.3.6 4.0.0 common-mongo diff --git a/bootx-commons/common-mybatis-plus/pom.xml b/bootx-commons/common-mybatis-plus/pom.xml index 4cebbe13..6f7ee90f 100644 --- a/bootx-commons/common-mybatis-plus/pom.xml +++ b/bootx-commons/common-mybatis-plus/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-rabbitmq/pom.xml b/bootx-commons/common-rabbitmq/pom.xml index 5efbeaaa..102251c9 100644 --- a/bootx-commons/common-rabbitmq/pom.xml +++ b/bootx-commons/common-rabbitmq/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-redis-client/pom.xml b/bootx-commons/common-redis-client/pom.xml index 29b72946..e38993b1 100644 --- a/bootx-commons/common-redis-client/pom.xml +++ b/bootx-commons/common-redis-client/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-sequence/pom.xml b/bootx-commons/common-sequence/pom.xml index 67bab2df..466ec48f 100644 --- a/bootx-commons/common-sequence/pom.xml +++ b/bootx-commons/common-sequence/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-spring/pom.xml b/bootx-commons/common-spring/pom.xml index 574b0b83..1197aa37 100644 --- a/bootx-commons/common-spring/pom.xml +++ b/bootx-commons/common-spring/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-super-query/pom.xml b/bootx-commons/common-super-query/pom.xml index 2477d870..8e9bdf12 100644 --- a/bootx-commons/common-super-query/pom.xml +++ b/bootx-commons/common-super-query/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-swagger/pom.xml b/bootx-commons/common-swagger/pom.xml index 32b3e31f..f8503b5b 100644 --- a/bootx-commons/common-swagger/pom.xml +++ b/bootx-commons/common-swagger/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-websocket/pom.xml b/bootx-commons/common-websocket/pom.xml index ebc401c7..d63b805b 100644 --- a/bootx-commons/common-websocket/pom.xml +++ b/bootx-commons/common-websocket/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/common-xxl-job/pom.xml b/bootx-commons/common-xxl-job/pom.xml index 33d496ef..8db5feba 100644 --- a/bootx-commons/common-xxl-job/pom.xml +++ b/bootx-commons/common-xxl-job/pom.xml @@ -5,7 +5,7 @@ bootx-commons cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-commons/pom.xml b/bootx-commons/pom.xml index 22954de8..9031e965 100644 --- a/bootx-commons/pom.xml +++ b/bootx-commons/pom.xml @@ -7,7 +7,7 @@ cn.bootx.platform bootx-platform-parent - 1.3.5 + 1.3.6 bootx-commons diff --git a/bootx-demo/pom.xml b/bootx-demo/pom.xml index a0411b05..966e0fab 100644 --- a/bootx-demo/pom.xml +++ b/bootx-demo/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-platform-parent - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-services/pom.xml b/bootx-services/pom.xml index a6fa9c76..07baad6a 100644 --- a/bootx-services/pom.xml +++ b/bootx-services/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-platform-parent - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-services/service-baseapi/pom.xml b/bootx-services/service-baseapi/pom.xml index 0f9c3c49..e3b22d96 100644 --- a/bootx-services/service-baseapi/pom.xml +++ b/bootx-services/service-baseapi/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-services - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-services/service-iam/pom.xml b/bootx-services/service-iam/pom.xml index 0f960c39..28c23d00 100644 --- a/bootx-services/service-iam/pom.xml +++ b/bootx-services/service-iam/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-services - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-services/service-miniapp/pom.xml b/bootx-services/service-miniapp/pom.xml index 1c2f40e9..82acf580 100644 --- a/bootx-services/service-miniapp/pom.xml +++ b/bootx-services/service-miniapp/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-services - 1.3.5 + 1.3.6 service-miniapp diff --git a/bootx-services/service-notice/pom.xml b/bootx-services/service-notice/pom.xml index 8093bc07..186e5715 100644 --- a/bootx-services/service-notice/pom.xml +++ b/bootx-services/service-notice/pom.xml @@ -5,7 +5,7 @@ bootx-services cn.bootx.platform - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-services/service-visualization/pom.xml b/bootx-services/service-visualization/pom.xml index da23b5f4..9715ac03 100644 --- a/bootx-services/service-visualization/pom.xml +++ b/bootx-services/service-visualization/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-services - 1.3.5 + 1.3.6 4.0.0 diff --git a/bootx-start/pom.xml b/bootx-start/pom.xml index a59ec9d5..deb8083d 100644 --- a/bootx-start/pom.xml +++ b/bootx-start/pom.xml @@ -5,7 +5,7 @@ cn.bootx.platform bootx-platform-parent - 1.3.5 + 1.3.6 4.0.0 bootx-start diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml index 3b2c45b3..9fb38497 100644 --- a/bootx-start/src/main/resources/application-dev.yml +++ b/bootx-start/src/main/resources/application-dev.yml @@ -104,7 +104,7 @@ bootx: swagger: enabled: true author: bootx - version: 1.3.5 + version: 1.3.6 title: bootx开发平台单体版 description: bootx-platform开发平台单体版 # basic认证 diff --git a/pom.xml b/pom.xml index a1f9219e..0156868c 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ cn.bootx.platform bootx-platform-parent pom - 1.3.5 + 1.3.6 bootx-platform @@ -75,7 +75,7 @@ 1.8 - 1.3.5 + 1.3.6 5.8.22 6.4.4 -- Gitee From e9e7f86586a1a8356589cc73615142410e12a535 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Sun, 19 Nov 2023 15:19:10 +0800 Subject: [PATCH 11/38] =?UTF-8?q?perf=20=E6=96=87=E4=BB=B6=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/configuration/FileUploadProperties.java | 8 +++++++- .../file/handler/FileDetailRecordHandler.java | 3 ++- .../starter/file/service/FileUploadService.java | 12 ++++++++++-- .../wechat/configuration/WeChatAppletProperties.java | 6 ++---- .../wechat/configuration/WeChatProperties.java | 8 ++++---- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadProperties.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadProperties.java index f9c90ad2..ef17f63c 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadProperties.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/configuration/FileUploadProperties.java @@ -16,7 +16,13 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class FileUploadProperties { /** - * 文件服务器地址, 需要与 x.file.storage 配置的 domain 一致 + * 是否通过后端服务进行文件访问的代理 + * 开启 Web -> 后端服务 -> 具体的的文件服务 + */ + private boolean serviceProxy = true; + + /** + * 文件服务访问地址 */ private String serverUrl = "http://127.0.0.1:9999"; diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java index ce60526f..ce5048eb 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/handler/FileDetailRecordHandler.java @@ -25,7 +25,8 @@ public class FileDetailRecordHandler implements FileRecorder { */ @Override public boolean save(FileInfo fileInfo) { - uploadFileManager.save(UploadFileInfo.init(fileInfo)); + UploadFileInfo save = uploadFileManager.save(UploadFileInfo.init(fileInfo)); + fileInfo.setId(String.valueOf(save.getId())); return true; } diff --git a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java index fa78f497..5a9daa17 100644 --- a/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java +++ b/bootx-common-starters/common-starter-file/src/main/java/cn/bootx/platform/starter/file/service/FileUploadService.java @@ -123,7 +123,11 @@ public class FileUploadService { * 获取文件预览地址 */ public String getFilePreviewUrl(Long id) { - return this.getServerUrl() + "/file/preview/" + id; + if (fileUploadProperties.isServiceProxy()){ + return this.getServerUrl() + "/file/preview/" + id; + } else { + return ""; + } } /** @@ -137,7 +141,11 @@ public class FileUploadService { * 获取文件地址 */ public String getFileDownloadUrl(Long id) { - return this.getServerUrl() + "/file/download/" + id; + if (fileUploadProperties.isServiceProxy()){ + return this.getServerUrl() + "/file/download/" + id; + } else { + return ""; + } } /** diff --git a/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatAppletProperties.java b/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatAppletProperties.java index 2dc48b7b..1a95ed7d 100644 --- a/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatAppletProperties.java +++ b/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatAppletProperties.java @@ -16,11 +16,9 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class WeChatAppletProperties { /** AppKey */ - private String appId; + private String appId = "?"; /** AppSecret */ - private String appSecret; - - + private String appSecret = "?"; } diff --git a/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatProperties.java b/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatProperties.java index 7d1c4353..b6246580 100644 --- a/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatProperties.java +++ b/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/configuration/WeChatProperties.java @@ -16,15 +16,15 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class WeChatProperties { /** AppKey */ - private String appId; + private String appId = "?"; /** AppSecret */ - private String appSecret; + private String appSecret = "?"; /** token */ - private String token; + private String token = "?"; /** 消息加解密密钥 */ - private String encodingAesKey; + private String encodingAesKey = "?"; } -- Gitee From 4eabf7cb7e4ea64038f956195d54ac51d03058bf Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Sun, 19 Nov 2023 18:34:56 +0800 Subject: [PATCH 12/38] =?UTF-8?q?doc=20=E6=BC=94=E7=A4=BA=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d425335..96ddc632 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ ## 📚资料和文档 -- 系统演示地址:[管理平台(vue3)](http://v3.platform.bootx.cn/)、[可视化大屏](http://visualization.platform.bootx.cn/) +- 系统演示地址:[管理平台(vue3)](https://admin.platform.demo.bootx.cn/)、[可视化大屏](https://visualization.platform.demo.bootx.cn/) - 前端项目地址:[前端项目(vue3)](https://gitee.com/bootx/bootx-platform-vue3)、[可视化大屏](https://gitee.com/bootx/bootx-platform-visualization)、[前端项目(vue2只维护不再更新)](https://gitee.com/bootx/bootx-platform-ui) - 移动端项目地址:[移动端项目(taro+vue3+ts)](https://gitee.com/xucun/bootx-platform-mobile) - 日志收集:[PlumeLog](http://139.198.29.219:8891/) -- Gitee From 27c0dbffd789e26424da9ba548429bc85ce1c18e Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Wed, 22 Nov 2023 22:10:59 +0800 Subject: [PATCH 13/38] =?UTF-8?q?doc=20=E9=97=AE=E9=A2=98=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_doc/Task.md b/_doc/Task.md index 38659ffb..6c4d098a 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -5,6 +5,7 @@ - 可视化大屏端支持一键登录 - 密码过期后清除所有的权限,必须强制更改密码 - 密码安全配置设置为必填. 保存信息化状态变为查看状态 +- 请求权限配置新建时偶发类型不可以更改 ## 1.3.x、1.4.x - 数据集功能 - 小程序工单功能 -- Gitee From a10b0c89ad54d6842c728000dcaeb1634aad936e Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Sat, 25 Nov 2023 21:25:13 +0800 Subject: [PATCH 14/38] =?UTF-8?q?feat=20=E5=AF=86=E7=A0=81=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E5=90=8E=E6=B8=85=E9=99=A4=E6=89=80=E6=9C=89=E7=9A=84?= =?UTF-8?q?=E6=9D=83=E9=99=90=EF=BC=8C=E5=BF=85=E9=A1=BB=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=AF=86=E7=A0=81(=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=92=8C=E6=9D=83=E9=99=90=E7=A0=81),=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=92=8C=E7=BC=96=E8=BE=91=E7=94=A8=E6=88=B7=E6=97=B6.=20?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E5=92=8C=E9=82=AE=E4=BB=B6=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E6=9C=89=E9=97=AE=E9=A2=98.=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E6=97=B6,=20=E8=84=B1?= =?UTF-8?q?=E6=95=8F=E7=9A=84=E5=AD=97=E6=AE=B5=E4=BF=9D=E5=AD=98=E6=97=B6?= =?UTF-8?q?=E6=9C=AA=E8=A2=AB=E5=BF=BD=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 16 ++++-- .../PasswordSecurityConfigController.java | 6 +-- .../core/auth/login/PasswordLoginHandler.java | 2 +- .../dao/PasswordChangeHistoryManager.java | 1 + .../entity/PasswordChangeHistory.java | 7 +-- .../PasswordLoginFailRecordService.java | 1 - .../service/PasswordSecurityCheckService.java | 50 ++++++++++--------- .../user/service/UserExpandInfoService.java | 34 +++++++++++++ .../core/user/service/UserInfoService.java | 19 ++----- .../platform/iam/dto/user/UserInfoDto.java | 3 -- 10 files changed, 84 insertions(+), 55 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 6c4d098a..3ce07d6c 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -4,12 +4,18 @@ - Websocket连接管理页 - 可视化大屏端支持一键登录 - 密码过期后清除所有的权限,必须强制更改密码 -- 密码安全配置设置为必填. 保存信息化状态变为查看状态 -- 请求权限配置新建时偶发类型不可以更改 -## 1.3.x、1.4.x + - x 菜单权限 + - 请求权限 +- 密码安全配置设置为必填. 保存信息状态变为查看状态 +- x 请求权限配置新建时偶发类型不可以更改 +- x 新增和编辑用户时. 手机号和邮件校验有问题 +- x 用户列表和详情字典显示有问题 +- x 更新用户信息时, 脱敏的字段保存时未被忽略 +- 数据权限重构为数据角色, 用于管理数据权限相关配置 - 数据集功能 -- 小程序工单功能 -- 小程序日报功能 +## 1.3.x、1.4.x +- 接口平台功能 +- 接入LiteFLow - PostgreSQL 数据库适配 - 添加短信模板功能, 可以与各短信商渠道进行同步 - 优化异常类,将各种异常类进行拆分出来 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java index cf314eb8..9f897771 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java @@ -48,8 +48,8 @@ public class PasswordSecurityConfigController { } @Operation(summary = "登录后检查密码相关的情况") - @GetMapping("/checkPasswordSecurity") - public ResResult checkPasswordSecurity(){ - return Res.ok(passwordSecurityCheckService.checkPasswordSecurity()); + @GetMapping("/check") + public ResResult check(){ + return Res.ok(passwordSecurityCheckService.check()); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/PasswordLoginHandler.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/PasswordLoginHandler.java index 7706301b..0d3fcf9f 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/PasswordLoginHandler.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/auth/login/PasswordLoginHandler.java @@ -107,7 +107,7 @@ public class PasswordLoginHandler implements UsernamePasswordAuthentication { } /** - * 认证后操作 将验证码设置为失效 + * 认证后操作 */ @Override public void authenticationAfter(AuthInfoResult authInfoResult, LoginAuthContext context) { diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/dao/PasswordChangeHistoryManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/dao/PasswordChangeHistoryManager.java index eb0ddb52..c03679aa 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/dao/PasswordChangeHistoryManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/dao/PasswordChangeHistoryManager.java @@ -25,6 +25,7 @@ public class PasswordChangeHistoryManager extends BaseManager userIds){ passwordLoginFailRecordManager.clearBatchFailCount(userIds); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java index e2589601..d16395f8 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/security/password/service/PasswordSecurityCheckService.java @@ -7,6 +7,7 @@ import cn.bootx.platform.iam.core.security.password.dao.PasswordChangeHistoryMan import cn.bootx.platform.iam.core.security.password.entity.PasswordChangeHistory; import cn.bootx.platform.iam.core.user.dao.UserExpandInfoManager; import cn.bootx.platform.iam.core.user.entity.UserExpandInfo; +import cn.bootx.platform.iam.core.user.service.UserExpandInfoService; import cn.bootx.platform.iam.dto.security.PasswordSecurityConfigDto; import cn.bootx.platform.iam.dto.security.passwordSecurityCheckResult; import cn.bootx.platform.iam.exception.user.UserInfoNotExistsException; @@ -36,11 +37,12 @@ public class PasswordSecurityCheckService { private final UserExpandInfoManager userExpandInfoManager; + private final UserExpandInfoService userExpandInfoService; /** * 登录后检查密码相关的情况 */ - public passwordSecurityCheckResult checkPasswordSecurity(){ + public passwordSecurityCheckResult check(){ passwordSecurityCheckResult result = new passwordSecurityCheckResult(); UserDetail userDetail = SecurityUtil.getCurrentUser() .orElseThrow(NotLoginException::new); @@ -48,15 +50,16 @@ public class PasswordSecurityCheckService { return result; } Long userId = userDetail.getId(); + UserExpandInfo userExpandInfo = userExpandInfoManager.findById(userId).orElseThrow(UserInfoNotExistsException::new); + PasswordSecurityConfigDto securityConfig = configService.getDefault(); // 检查是否是默认密码未进行修改 - if (this.isDefaultPassword(userId,securityConfig)){ + if (this.isDefaultPassword(userExpandInfo,securityConfig)){ return result.setDefaultPwd(true); } - int state = this.verifyPasswordExpire(userId, securityConfig); - // 检查密码是否已经过期 + int state = this.verifyPasswordExpire(userExpandInfo, securityConfig); + // 检查密码是否已经过期, 如果过期更新用户过期状态 if (state == 0){ - // 设置为 return result.setExpirePwd(true); } // 检查密码是否到了提示过期的时候 @@ -71,10 +74,8 @@ public class PasswordSecurityCheckService { /** * 判断用户初始化密码是否需要修改 */ - public boolean isDefaultPassword(Long userId, PasswordSecurityConfigDto securityConfig){ - UserExpandInfo userInfo = userExpandInfoManager.findById(userId) - .orElseThrow(UserInfoNotExistsException::new); - return userInfo.isInitialPassword() && securityConfig.isRequireChangePwd(); + public boolean isDefaultPassword(UserExpandInfo userExpandInfo, PasswordSecurityConfigDto securityConfig){ + return userExpandInfo.isInitialPassword() && securityConfig.isRequireChangePwd(); } @@ -84,34 +85,37 @@ public class PasswordSecurityCheckService { * 0. 密码已经过期 * -N. 密码还有几天过期, 需要进行提醒 */ - public int verifyPasswordExpire(Long userId,PasswordSecurityConfigDto securityConfig){ + public int verifyPasswordExpire(UserExpandInfo userExpandInfo,PasswordSecurityConfigDto securityConfig){ + // 已经是密码过期状态 + if (userExpandInfo.isExpirePassword()){ + return 0; + } // 判断用户密码是否需要强制进行更改 - List changeHistoryList = historyManager.findAllByUserAndCount(userId, 1); + List changeHistoryList = historyManager.findAllByUserAndCount(userExpandInfo.getId(), 1); if (CollUtil.isNotEmpty(changeHistoryList)){ PasswordChangeHistory passwordChangeHistory = changeHistoryList.get(0); LocalDateTime createTime = passwordChangeHistory.getCreateTime(); - // 判断距今的时间是否超过密码过期时间是多少 + // 判断上次更改密码的时间距今是多少 int keepPwdDay = (int) LocalDateTimeUtil.between(createTime, LocalDateTime.now(), ChronoUnit.DAYS); + int dealDay = securityConfig.getUpdateFrequency() - keepPwdDay; - // 判断密码是否已经过期 - if( dealDay >= 0 ){ - this.userExpirePwd(userId); - return 1; + // 密码过期 + if (dealDay < 0){ + // 更新过期状态 + userExpandInfoService.userExpirePwd(userExpandInfo.getId()); + return 0; } // 判断是否满足密码修改的倒计时提醒 if (dealDay < securityConfig.getExpireRemind()){ return -dealDay; } + // 密码未过期 + return 1; + } - return 0; + return 1; } - /** - * 密码过期处理, 更新状态用户状态 - */ - public void userExpirePwd(Long userId){ - - } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/service/UserExpandInfoService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/service/UserExpandInfoService.java index 02b45069..84240ec9 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/service/UserExpandInfoService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/service/UserExpandInfoService.java @@ -3,12 +3,17 @@ package cn.bootx.platform.iam.core.user.service; import cn.bootx.platform.common.core.exception.BizException; import cn.bootx.platform.iam.core.user.dao.UserExpandInfoManager; import cn.bootx.platform.iam.core.user.entity.UserExpandInfo; +import cn.bootx.platform.iam.event.user.UserChangePasswordEvent; +import cn.bootx.platform.iam.event.user.UserRestartPasswordEvent; +import cn.bootx.platform.iam.exception.user.UserInfoNotExistsException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.List; /** * 用户扩展信息服务 @@ -33,4 +38,33 @@ public class UserExpandInfoService { userExpandInfoManager.updateById(userExpandInfo); } + /** + * 密码过期处理, 更新状态用户状态 + */ + public void userExpirePwd(Long userId){ + UserExpandInfo userInfo = userExpandInfoManager.findById(userId) + .orElseThrow(UserInfoNotExistsException::new); + userInfo.setExpirePassword(true); + userExpandInfoManager.updateById(userInfo); + } + + /** + * 密码修改 + */ + @EventListener(UserChangePasswordEvent.class) + public void changePassword(UserChangePasswordEvent event){ + List userExpandInfos = userExpandInfoManager.findAllByIds(event.getUserIds()); + userExpandInfos.forEach(userExpandInfo -> userExpandInfo.setExpirePassword(false).setInitialPassword(false)); + userExpandInfoManager.updateAllById(userExpandInfos); + } + + /** + * 密码重置 + */ + @EventListener(UserRestartPasswordEvent.class) + public void restartPassword(UserRestartPasswordEvent event){ + List userExpandInfos = userExpandInfoManager.findAllByIds(event.getUserIds()); + userExpandInfos.forEach(userExpandInfo -> userExpandInfo.setExpirePassword(false).setInitialPassword(false)); + userExpandInfoManager.updateAllById(userExpandInfos); + } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/service/UserInfoService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/service/UserInfoService.java index c589e7be..a77a3051 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/service/UserInfoService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/service/UserInfoService.java @@ -10,6 +10,7 @@ import cn.bootx.platform.iam.dto.user.LoginAfterUserInfo; import cn.bootx.platform.iam.dto.user.UserBaseInfoDto; import cn.bootx.platform.iam.dto.user.UserInfoDto; import cn.bootx.platform.iam.event.user.UserChangePasswordEvent; +import cn.bootx.platform.iam.event.user.UserRestartPasswordEvent; import cn.bootx.platform.iam.event.user.UserUpdateEvent; import cn.bootx.platform.iam.exception.user.UserInfoNotExistsException; import cn.bootx.platform.iam.param.user.UserBaseInfoParam; @@ -22,8 +23,6 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; - /** * 用户 * @@ -112,8 +111,6 @@ public class UserInfoService { public void updatePassword(String password, String newPassword) { UserInfo userInfo = userInfoManager.findById(SecurityUtil.getUserId()) .orElseThrow(UserInfoNotExistsException::new); - UserExpandInfo userExpandInfo = userExpandInfoManager.findById(SecurityUtil.getUserId()) - .orElseThrow(UserInfoNotExistsException::new); // 新密码进行加密 newPassword = passwordEncoder.encode(newPassword); @@ -129,9 +126,7 @@ public class UserInfoService { userInfo.setPassword(newPassword); userInfoManager.updateById(userInfo); - userExpandInfo.setLastChangePasswordTime(LocalDateTime.now()); passwordChangeHistoryService.saveChangeHistory(userInfo.getId(), userInfo.getPassword()); - userExpandInfoManager.updateById(userExpandInfo); eventPublisher.publishEvent(new UserChangePasswordEvent(this,userInfo.getId())); } @@ -199,19 +194,15 @@ public class UserInfoService { throw new BizException("短信验证码不正确"); } UserInfo userInfo = userInfoManager.findByPhone(phone).orElseThrow(UserInfoNotExistsException::new); - UserExpandInfo userExpandInfo = userExpandInfoManager.findById(userInfo.getId()) - .orElseThrow(UserInfoNotExistsException::new); userInfo.setPassword(passwordEncoder.encode(password)); // 判断新密码是否在最近几次使用过 if (passwordChangeHistoryService.isRecentlyUsed(userInfo.getId(), userInfo.getPassword())){ throw new BizException("新密码不能与最近使用过的密码相同"); } - userExpandInfo.setLastChangePasswordTime(LocalDateTime.now()).setInitialPassword(false); userInfoManager.updateById(userInfo); - userExpandInfoManager.updateById(userExpandInfo); passwordChangeHistoryService.saveChangeHistory(userInfo.getId(), userInfo.getPassword()); userAssistService.deletePhoneForgetCaptcha(phone); - eventPublisher.publishEvent(new UserUpdateEvent(this, userInfo.toDto())); + eventPublisher.publishEvent(new UserRestartPasswordEvent(this, userInfo.getId())); } /** @@ -222,19 +213,15 @@ public class UserInfoService { throw new BizException("短信验证码不正确"); } UserInfo userInfo = userInfoManager.findByEmail(email).orElseThrow(UserInfoNotExistsException::new); - UserExpandInfo userExpandInfo = userExpandInfoManager.findById(userInfo.getId()) - .orElseThrow(UserInfoNotExistsException::new); userInfo.setPassword(passwordEncoder.encode(password)); // 判断新密码是否在最近几次使用过 if (passwordChangeHistoryService.isRecentlyUsed(userInfo.getId(), userInfo.getPassword())){ throw new BizException("新密码不能与最近使用过的密码相同"); } - userExpandInfo.setLastChangePasswordTime(LocalDateTime.now()).setInitialPassword(false); userInfoManager.updateById(userInfo); - userExpandInfoManager.updateById(userExpandInfo); passwordChangeHistoryService.saveChangeHistory(userInfo.getId(), userInfo.getPassword()); userAssistService.deleteEmailForgetCaptcha(email); - eventPublisher.publishEvent(new UserUpdateEvent(this, userInfo.toDto())); + eventPublisher.publishEvent(new UserRestartPasswordEvent(this, userInfo.getId())); } /** diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/user/UserInfoDto.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/user/UserInfoDto.java index 96c36bc8..6f0936c5 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/user/UserInfoDto.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/user/UserInfoDto.java @@ -10,7 +10,6 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.List; /** @@ -58,8 +57,6 @@ public class UserInfoDto extends BaseDto implements Serializable { @Schema(description = "账号状态") private String status; - @Schema(description = "注册时间") - private LocalDateTime registerTime; public UserDetail toUserDetail() { return new UserDetail().setId(this.getId()) -- Gitee From 88c5cd15510ec64f01a3c5a8cfde8fe8bc1614d3 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Sat, 25 Nov 2023 22:34:44 +0800 Subject: [PATCH 15/38] =?UTF-8?q?feat=20=E5=AF=86=E7=A0=81=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E5=90=8E=E6=B8=85=E9=99=A4=E6=89=80=E6=9C=89=E7=9A=84?= =?UTF-8?q?=E6=9D=83=E9=99=90=E8=AF=B7=E6=B1=82=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/auth/cache/SessionCacheLocal.java | 33 ++++++++++++---- .../starter/auth/entity/UserStatus.java | 26 +++++++++++++ .../starter/auth/handler/SaRouteHandler.java | 2 +- .../auth/impl/IgnoreAdminUserRouterCheck.java | 7 +--- .../impl/IgnoreAnnotationRouterCheck.java | 2 +- .../RouterCheck.java | 2 +- .../auth/service/UserStatusService.java | 16 ++++++++ .../starter/auth/util/SecurityUtil.java | 4 +- bootx-services/service-iam/pom.xml | 4 ++ .../PasswordSecurityConfigController.java | 2 + .../core/upms/service/RolePermService.java | 11 +++--- .../iam/core/user/entity/UserExpandInfo.java | 4 +- .../iam/handler/IgnorePathRouterCheck.java | 2 +- .../iam/handler/PermCodeRouterCheck.java | 13 ++++++- .../iam/handler/UserPathRouterCheck.java | 11 +++++- .../iam/handler/UserStatusServiceImpl.java | 38 +++++++++++++++++++ .../iam/task/CheckPasswordExpireTask.java | 26 +++++++++++++ .../platform/iam/task/UserUnlockTask.java | 23 +++++++++++ .../controller/SiteMessageController.java | 6 +++ .../core/site/service/SiteMessageService.java | 1 - .../src/main/resources/application-dev.yml | 1 - 21 files changed, 201 insertions(+), 33 deletions(-) create mode 100644 bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/entity/UserStatus.java rename bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/{authentication => service}/RouterCheck.java (82%) create mode 100644 bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/service/UserStatusService.java create mode 100644 bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserStatusServiceImpl.java create mode 100644 bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/task/CheckPasswordExpireTask.java create mode 100644 bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/task/UserUnlockTask.java diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/cache/SessionCacheLocal.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/cache/SessionCacheLocal.java index 273fa855..351e4c16 100644 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/cache/SessionCacheLocal.java +++ b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/cache/SessionCacheLocal.java @@ -1,6 +1,7 @@ package cn.bootx.platform.starter.auth.cache; import cn.bootx.platform.common.core.entity.UserDetail; +import cn.bootx.platform.starter.auth.entity.UserStatus; import com.alibaba.ttl.TransmittableThreadLocal; /** @@ -11,27 +12,43 @@ import com.alibaba.ttl.TransmittableThreadLocal; */ public final class SessionCacheLocal { - private static final ThreadLocal THREAD_LOCAL = new TransmittableThreadLocal<>(); + private static final ThreadLocal USER_INFO_LOCAL = new TransmittableThreadLocal<>(); + private static final ThreadLocal USER_STATUS_LOCAL = new TransmittableThreadLocal<>(); /** - * TTL 设置数据 + * 设置用户信息 */ - public static void put(UserDetail userDetail) { - THREAD_LOCAL.set(userDetail); + public static void putUserInfo(UserDetail userDetail) { + USER_INFO_LOCAL.set(userDetail); } /** - * 获取TTL中的数据 + * 获取用户信息 */ - public static UserDetail get() { - return THREAD_LOCAL.get(); + public static UserDetail getUserInfo() { + return USER_INFO_LOCAL.get(); + } + + /** + * 设置用户状态 + */ + public static void putUserStatus(UserStatus userStatus) { + USER_STATUS_LOCAL.set(userStatus); + } + + /** + * 获取用户状态上下文 + */ + public static UserStatus getUserStatusContext() { + return USER_STATUS_LOCAL.get(); } /** * 清除 */ public static void clear() { - THREAD_LOCAL.remove(); + USER_INFO_LOCAL.remove(); + USER_STATUS_LOCAL.remove(); } } diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/entity/UserStatus.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/entity/UserStatus.java new file mode 100644 index 00000000..2b11f41a --- /dev/null +++ b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/entity/UserStatus.java @@ -0,0 +1,26 @@ +package cn.bootx.platform.starter.auth.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.HashMap; + +/** + * 用户状态上下文 + * @author xxm + * @since 2023/11/25 + */ +@Getter +@Setter +@Accessors(chain = true) +public class UserStatus extends HashMap { + + /** 是否初始密码 */ + private boolean initialPassword; + + /** 密码是否过期 */ + private boolean expirePassword; + + +} diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/handler/SaRouteHandler.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/handler/SaRouteHandler.java index 0f9e8d7d..ee272941 100644 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/handler/SaRouteHandler.java +++ b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/handler/SaRouteHandler.java @@ -1,6 +1,6 @@ package cn.bootx.platform.starter.auth.handler; -import cn.bootx.platform.starter.auth.authentication.RouterCheck; +import cn.bootx.platform.starter.auth.service.RouterCheck; import cn.bootx.platform.starter.auth.exception.RouterCheckException; import cn.bootx.platform.common.spring.util.WebServletUtil; import cn.dev33.satoken.fun.SaFunction; diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/impl/IgnoreAdminUserRouterCheck.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/impl/IgnoreAdminUserRouterCheck.java index f4498114..a531f5cc 100644 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/impl/IgnoreAdminUserRouterCheck.java +++ b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/impl/IgnoreAdminUserRouterCheck.java @@ -1,7 +1,7 @@ package cn.bootx.platform.starter.auth.impl; import cn.bootx.platform.common.core.entity.UserDetail; -import cn.bootx.platform.starter.auth.authentication.RouterCheck; +import cn.bootx.platform.starter.auth.service.RouterCheck; import cn.bootx.platform.starter.auth.configuration.AuthProperties; import cn.bootx.platform.starter.auth.util.SecurityUtil; import lombok.RequiredArgsConstructor; @@ -19,11 +19,6 @@ public class IgnoreAdminUserRouterCheck implements RouterCheck { private final AuthProperties authProperties; - @Override - public int sortNo() { - return 0; - } - @Override public boolean check(Object handler) { if (authProperties.isEnableAdmin()) { diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/impl/IgnoreAnnotationRouterCheck.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/impl/IgnoreAnnotationRouterCheck.java index acc4934f..e2d67e0e 100644 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/impl/IgnoreAnnotationRouterCheck.java +++ b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/impl/IgnoreAnnotationRouterCheck.java @@ -1,7 +1,7 @@ package cn.bootx.platform.starter.auth.impl; import cn.bootx.platform.common.core.annotation.IgnoreAuth; -import cn.bootx.platform.starter.auth.authentication.RouterCheck; +import cn.bootx.platform.starter.auth.service.RouterCheck; import cn.bootx.platform.starter.auth.util.SecurityUtil; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/authentication/RouterCheck.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/service/RouterCheck.java similarity index 82% rename from bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/authentication/RouterCheck.java rename to bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/service/RouterCheck.java index 2f488a1b..2bc2ca9d 100644 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/authentication/RouterCheck.java +++ b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/service/RouterCheck.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.starter.auth.authentication; +package cn.bootx.platform.starter.auth.service; /** * 路由拦截检查 diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/service/UserStatusService.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/service/UserStatusService.java new file mode 100644 index 00000000..a44f676d --- /dev/null +++ b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/service/UserStatusService.java @@ -0,0 +1,16 @@ +package cn.bootx.platform.starter.auth.service; + +import cn.bootx.platform.starter.auth.entity.UserStatus; + +/** + * 用户状态服务 + * @author xxm + * @since 2023/11/25 + */ +public interface UserStatusService { + + /** + * 获取用户状态 + */ + UserStatus getUserStatus(); +} diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/util/SecurityUtil.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/util/SecurityUtil.java index e7867155..547395c5 100644 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/util/SecurityUtil.java +++ b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/util/SecurityUtil.java @@ -78,12 +78,12 @@ public class SecurityUtil { * 获取当前用户,无异常, 使用线程缓存来减少redis的访问频率 */ private Optional getCurrentUser0() { - Optional userDetail = Optional.ofNullable(SessionCacheLocal.get()); + Optional userDetail = Optional.ofNullable(SessionCacheLocal.getUserInfo()); if (!userDetail.isPresent()) { try { userDetail = Optional.ofNullable(StpUtil.getSession()) .map(saSession -> saSession.getModel(CommonCode.USER, UserDetail.class)); - SessionCacheLocal.put(userDetail.orElse(null)); + SessionCacheLocal.putUserInfo(userDetail.orElse(null)); } catch (SaTokenException e) { userDetail = Optional.empty(); diff --git a/bootx-services/service-iam/pom.xml b/bootx-services/service-iam/pom.xml index 28c23d00..b5c46600 100644 --- a/bootx-services/service-iam/pom.xml +++ b/bootx-services/service-iam/pom.xml @@ -63,6 +63,10 @@ cn.bootx.platform common-starter-wechat + + org.quartz-scheduler + quartz + diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java index 9f897771..39116701 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PasswordSecurityConfigController.java @@ -1,5 +1,6 @@ package cn.bootx.platform.iam.controller; +import cn.bootx.platform.common.core.annotation.IgnoreAuth; import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.iam.core.security.password.service.PasswordChangeHistoryService; @@ -47,6 +48,7 @@ public class PasswordSecurityConfigController { return Res.ok(passwordChangeHistoryService.isRecentlyUsed(SecurityUtil.getUserId(),password)); } + @IgnoreAuth @Operation(summary = "登录后检查密码相关的情况") @GetMapping("/check") public ResResult check(){ diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java index 26e05157..0c76acc6 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java @@ -10,11 +10,11 @@ import cn.bootx.platform.iam.core.permission.service.PermMenuService; import cn.bootx.platform.iam.core.upms.dao.RoleMenuManager; import cn.bootx.platform.iam.core.upms.entity.RoleMenu; import cn.bootx.platform.iam.core.user.dao.UserExpandInfoManager; -import cn.bootx.platform.iam.core.user.entity.UserExpandInfo; import cn.bootx.platform.iam.dto.permission.PermMenuDto; import cn.bootx.platform.iam.dto.upms.MenuAndResourceDto; +import cn.bootx.platform.starter.auth.entity.UserStatus; import cn.bootx.platform.starter.auth.exception.NotLoginException; -import cn.bootx.platform.starter.auth.exception.UserNotFoundException; +import cn.bootx.platform.starter.auth.service.UserStatusService; import cn.bootx.platform.starter.auth.util.SecurityUtil; import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; @@ -43,7 +43,7 @@ import static cn.bootx.platform.iam.code.CachingCode.USER_PERM_CODE; @RequiredArgsConstructor public class RolePermService { - private final UserExpandInfoManager userExpandInfoManager; + private final UserStatusService userStatusService; private final RoleMenuManager roleMenuManager; @@ -168,9 +168,8 @@ public class RolePermService { */ private List findPermissionsByUser(Long userId) { // 判断当前用户密码是否过期, 过期或者未修改密码, 返回权限为空 - UserExpandInfo userExpandInfo = userExpandInfoManager.findById(userId) - .orElseThrow(UserNotFoundException::new); - if (userExpandInfo.isExpirePassword() || userExpandInfo.isInitialPassword()){ + UserStatus userStatus = userStatusService.getUserStatus(); + if (userStatus.isExpirePassword() || userStatus.isInitialPassword()){ return new ArrayList<>(0); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserExpandInfo.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserExpandInfo.java index f02902d7..6b2a9b04 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserExpandInfo.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserExpandInfo.java @@ -1,10 +1,9 @@ package cn.bootx.platform.iam.core.user.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.iam.core.user.convert.UserConvert; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.platform.iam.core.user.convert.UserConvert; import cn.bootx.platform.iam.dto.user.UserExpandInfoDto; -import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.annotation.DbTable; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -49,7 +48,6 @@ public class UserExpandInfo extends MpBaseEntity implements EntityBaseFunction UserDetailOpt = SecurityUtil.getCurrentUser(); if (!UserDetailOpt.isPresent()) { return false; } + // 初始密码或者密码过期 + UserStatus userStatus = userStatusService.getUserStatus(); + if (userStatus.isExpirePassword()||userStatus.isInitialPassword()){ + return false; + } List userPermCodes = rolePermService.findEffectPermCodesByUserId(UserDetailOpt.get().getId()); return userPermCodes.stream().anyMatch(permCodes::contains); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserPathRouterCheck.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserPathRouterCheck.java index a371e427..ce9cddcd 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserPathRouterCheck.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserPathRouterCheck.java @@ -1,9 +1,11 @@ package cn.bootx.platform.iam.handler; import cn.bootx.platform.common.core.entity.UserDetail; -import cn.bootx.platform.starter.auth.authentication.RouterCheck; import cn.bootx.platform.common.spring.util.WebServletUtil; import cn.bootx.platform.iam.core.upms.service.RolePathService; +import cn.bootx.platform.starter.auth.entity.UserStatus; +import cn.bootx.platform.starter.auth.service.RouterCheck; +import cn.bootx.platform.starter.auth.service.UserStatusService; import cn.bootx.platform.starter.auth.util.SecurityUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -24,6 +26,8 @@ public class UserPathRouterCheck implements RouterCheck { private final RolePathService rolePathService; + private final UserStatusService userStatusService; + private final AntPathMatcher matcher = new AntPathMatcher(); @Override @@ -40,6 +44,11 @@ public class UserPathRouterCheck implements RouterCheck { if (!UserDetailOpt.isPresent()) { return false; } + // 初始密码或者密码过期 + UserStatus userStatus = userStatusService.getUserStatus(); + if (userStatus.isExpirePassword()||userStatus.isInitialPassword()){ + return false; + } UserDetail userDetail = UserDetailOpt.get(); List paths = rolePathService.findSimplePathsByUser(method, userDetail.getId()); return paths.stream().anyMatch(pattern -> matcher.match(pattern, path)); diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserStatusServiceImpl.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserStatusServiceImpl.java new file mode 100644 index 00000000..065068ad --- /dev/null +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/UserStatusServiceImpl.java @@ -0,0 +1,38 @@ +package cn.bootx.platform.iam.handler; + +import cn.bootx.platform.iam.core.user.dao.UserExpandInfoManager; +import cn.bootx.platform.iam.core.user.entity.UserExpandInfo; +import cn.bootx.platform.iam.exception.user.UserInfoNotExistsException; +import cn.bootx.platform.starter.auth.cache.SessionCacheLocal; +import cn.bootx.platform.starter.auth.entity.UserStatus; +import cn.bootx.platform.starter.auth.service.UserStatusService; +import cn.bootx.platform.starter.auth.util.SecurityUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserStatusServiceImpl implements UserStatusService { + + private final UserExpandInfoManager userExpandInfoManager; + + /** + * 获取用户状态 + */ + @Override + public UserStatus getUserStatus(){ + UserStatus userStatus = SessionCacheLocal.getUserStatusContext(); + if (Objects.isNull(userStatus)){ + UserExpandInfo userExpandInfo = userExpandInfoManager.findById(SecurityUtil.getUserId()).orElseThrow(UserInfoNotExistsException::new); + userStatus = new UserStatus() + .setExpirePassword(userExpandInfo.isExpirePassword()) + .setInitialPassword(userExpandInfo.isInitialPassword()); + SessionCacheLocal.putUserStatus(userStatus); + } + return userStatus; + } +} diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/task/CheckPasswordExpireTask.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/task/CheckPasswordExpireTask.java new file mode 100644 index 00000000..25f02931 --- /dev/null +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/task/CheckPasswordExpireTask.java @@ -0,0 +1,26 @@ +package cn.bootx.platform.iam.task; + +import cn.bootx.platform.iam.core.user.service.UserInfoService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.stereotype.Service; + +/** + * 密码过期检查任务 + * @author xxm + * @since 2023/11/25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CheckPasswordExpireTask implements Job { + private final UserInfoService userInfoService; + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + + } +} diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/task/UserUnlockTask.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/task/UserUnlockTask.java new file mode 100644 index 00000000..a500f08a --- /dev/null +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/task/UserUnlockTask.java @@ -0,0 +1,23 @@ +package cn.bootx.platform.iam.task; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.stereotype.Service; + +/** + * 用户解除锁定任务 + * @author xxm + * @since 2023/11/25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class UserUnlockTask implements Job { + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + + } +} diff --git a/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SiteMessageController.java b/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SiteMessageController.java index 8be46dca..0c173b26 100644 --- a/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SiteMessageController.java +++ b/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/controller/SiteMessageController.java @@ -1,5 +1,6 @@ package cn.bootx.platform.notice.controller; +import cn.bootx.platform.common.core.annotation.IgnoreAuth; import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; @@ -47,12 +48,14 @@ public class SiteMessageController { return Res.ok(siteMessageService.findById(id)); } + @IgnoreAuth @Operation(summary = "获取未读的接收消息条数") @GetMapping("/countByReceiveNotRead") public ResResult countByReceiveNotRead(SiteMessageInfo query) { return Res.ok(siteMessageService.countByReceiveNotRead(query)); } + @IgnoreAuth @Operation(summary = "接收消息分页") @GetMapping("/pageByReceive") public ResResult> pageByReceive(PageParam pageParam, SiteMessageInfo query) { @@ -79,12 +82,15 @@ public class SiteMessageController { return Res.ok(); } + @IgnoreAuth @Operation(summary = "标为已读") @PostMapping("/read") public ResResult read(Long id) { siteMessageService.read(id); return Res.ok(); } + + @IgnoreAuth @Operation(summary = "小程序获取未读的接收消息标题列表") @GetMapping("/listByReceiveNotRead") public ResResult> listByReceiveNotRead(SiteMessageInfo query) { diff --git a/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/service/SiteMessageService.java b/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/service/SiteMessageService.java index 32006082..d8312a70 100644 --- a/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/service/SiteMessageService.java +++ b/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/site/service/SiteMessageService.java @@ -222,7 +222,6 @@ public class SiteMessageService { */ public void read(Long messageId) { Long userId = SecurityUtil.getUserId(); - // Long userId = 0L; SiteMessageUser siteMessageUser = siteMessageUserManager.findByMessageId(messageId) .orElse(new SiteMessageUser().setReceiveId(userId).setMessageId(messageId)); siteMessageUser.setHaveRead(true).setReadTime(LocalDateTime.now()); diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml index 9fb38497..e3f74a9c 100644 --- a/bootx-start/src/main/resources/application-dev.yml +++ b/bootx-start/src/main/resources/application-dev.yml @@ -191,7 +191,6 @@ bootx: - '/css/**' - '/error' - '/favicon.ico' - - '/**' # 第三方登录 third-login: ding-talk: -- Gitee From 733526f40bbd0359b457a5cb17c663748e10f9b9 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Tue, 28 Nov 2023 23:46:05 +0800 Subject: [PATCH 16/38] =?UTF-8?q?ref=20=E6=95=B0=E6=8D=AE=E6=9D=83?= =?UTF-8?q?=E9=99=90=E9=87=8D=E6=9E=84=E4=B8=BA=E6=95=B0=E6=8D=AE=E8=A7=92?= =?UTF-8?q?=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 5 +- .../starter/data/perm/code/DataScopeEnum.java | 23 +-- .../configuration/DataPermProperties.java | 22 ++- .../data/perm/scope/DataScopeInterceptor.java | 17 ++- .../starter/quartz/task/TestTask.java | 1 - ...ontroller.java => DataRoleController.java} | 78 +++++----- ...oller.java => UserDataRoleController.java} | 42 +++--- .../core/scope/convert/DataScopeConvert.java | 10 +- ...tManager.java => DataRoleDeptManager.java} | 14 +- ...serMapper.java => DataRoleDeptMapper.java} | 4 +- ...ScopeManager.java => DataRoleManager.java} | 12 +- ...taScopeMapper.java => DataRoleMapper.java} | 4 +- ...rManager.java => DataRoleUserManager.java} | 12 +- ...eptMapper.java => DataRoleUserMapper.java} | 4 +- .../entity/{DataScope.java => DataRole.java} | 16 +- .../{DataScopeDept.java => DataRoleDept.java} | 6 +- .../{DataScopeUser.java => DataRoleUser.java} | 6 +- ...ScopeService.java => DataRoleService.java} | 100 ++++++------- ...rService.java => DataRoleUserService.java} | 54 +++---- ...eManager.java => UserDataRoleManager.java} | 22 +-- ...opeMapper.java => UserDataRoleMapper.java} | 7 +- .../{UserDataScope.java => UserDataRole.java} | 6 +- ...eService.java => UserDataRoleService.java} | 139 +++++++++++------- .../{DataScopeDto.java => DataRoleDto.java} | 6 +- ...eUserInfoDto.java => DataRoleUserDto.java} | 2 +- .../iam/handler/DataPermScopeHandlerImpl.java | 6 +- ...eDeptParam.java => DataRoleDeptParam.java} | 6 +- ...DataScopeParam.java => DataRoleParam.java} | 6 +- ...eUserParam.java => DataRoleUserParam.java} | 6 +- ...Param.java => UserDataRoleBatchParam.java} | 10 +- ...ScopeParam.java => UserDataRoleParam.java} | 12 +- ...ScopeMapper.xml => UserDataRoleMapper.xml} | 10 +- .../db/migration/V1.3.5_231021__release.sql | 2 +- 33 files changed, 359 insertions(+), 311 deletions(-) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/{DataScopeController.java => DataRoleController.java} (50%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/{UserDataScopeController.java => UserDataRoleController.java} (45%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/{DataScopeDeptManager.java => DataRoleDeptManager.java} (48%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/{DataScopeUserMapper.java => DataRoleDeptMapper.java} (60%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/{DataScopeManager.java => DataRoleManager.java} (58%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/{DataScopeMapper.java => DataRoleMapper.java} (62%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/{DataScopeUserManager.java => DataRoleUserManager.java} (45%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/{DataScopeDeptMapper.java => DataRoleUserMapper.java} (60%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/{DataScope.java => DataRole.java} (71%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/{DataScopeDept.java => DataRoleDept.java} (84%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/{DataScopeUser.java => DataRoleUser.java} (84%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/{DataScopeService.java => DataRoleService.java} (52%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/{DataScopeUserService.java => DataRoleUserService.java} (52%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/{UserDataScopeManager.java => UserDataRoleManager.java} (52%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/{UserDataScopeMapper.java => UserDataRoleMapper.java} (53%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/{UserDataScope.java => UserDataRole.java} (83%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/{UserDataScopeService.java => UserDataRoleService.java} (49%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/{DataScopeDto.java => DataRoleDto.java} (84%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/{DataScopeUserInfoDto.java => DataRoleUserDto.java} (94%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/{DataScopeDeptParam.java => DataRoleDeptParam.java} (77%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/{DataScopeParam.java => DataRoleParam.java} (84%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/{DataScopeUserParam.java => DataRoleUserParam.java} (76%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/{UserDataScopeBatchParam.java => UserDataRoleBatchParam.java} (57%) rename bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/{UserDataScopeParam.java => UserDataRoleParam.java} (46%) rename bootx-services/service-iam/src/main/resources/mapper/{UserDataScopeMapper.xml => UserDataRoleMapper.xml} (53%) diff --git a/_doc/Task.md b/_doc/Task.md index 3ce07d6c..dab8c4fe 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -5,13 +5,14 @@ - 可视化大屏端支持一键登录 - 密码过期后清除所有的权限,必须强制更改密码 - x 菜单权限 - - 请求权限 + - x 请求权限 - 密码安全配置设置为必填. 保存信息状态变为查看状态 - x 请求权限配置新建时偶发类型不可以更改 - x 新增和编辑用户时. 手机号和邮件校验有问题 - x 用户列表和详情字典显示有问题 - x 更新用户信息时, 脱敏的字段保存时未被忽略 -- 数据权限重构为数据角色, 用于管理数据权限相关配置 +- x 数据权限重构为数据角色, 用于管理数据权限相关配置 + - 增加关联部门及下级部门 - 数据集功能 ## 1.3.x、1.4.x - 接口平台功能 diff --git a/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/code/DataScopeEnum.java b/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/code/DataScopeEnum.java index 3963f835..d0b0d601 100644 --- a/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/code/DataScopeEnum.java +++ b/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/code/DataScopeEnum.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import java.util.Arrays; +import java.util.Objects; /** * 数据范围权限类型 @@ -17,28 +18,30 @@ import java.util.Arrays; public enum DataScopeEnum { /** 自己的数据 */ - SELF(1), + SELF("self"), /** 指定用户级别 */ - USER_SCOPE(2), + USER_SCOPE("user"), /** 指定部门级别 */ - DEPT_SCOPE(3), + DEPT_SCOPE("dept"), + /** 指定部门和下级部门 */ + DEPT_SCOPE_AND_SUB("dept_sub"), /** 指定部门与用户级别 */ - DEPT_AND_USER_SCOPE(4), + DEPT_AND_USER_SCOPE("dept_and_user"), /** 全部数据 */ - ALL_SCOPE(5), + ALL_SCOPE("all"), /** 所在部门 */ - BELONG_DEPT(6), + SELF_DEPT("self_dept"), /** 所在及下级部门 */ - BELONG_DEPT_AND_SUB(7); + SELF_DEPT_AND_SUB("self_dept_sub"); - private final int code; + private final String code; /** * 根据数字编号获取 */ - public static DataScopeEnum findByCode(int code) { + public static DataScopeEnum findByCode(String code) { return Arrays.stream(DataScopeEnum.values()) - .filter(e -> e.getCode() == code) + .filter(e -> Objects.equals(e.getCode(), code)) .findFirst() .orElseThrow(() -> new BizException("不支持的数据权限类型")); } diff --git a/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/configuration/DataPermProperties.java b/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/configuration/DataPermProperties.java index 530bb97e..2972e615 100644 --- a/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/configuration/DataPermProperties.java +++ b/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/configuration/DataPermProperties.java @@ -1,6 +1,8 @@ package cn.bootx.platform.starter.data.perm.configuration; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -24,28 +26,32 @@ public class DataPermProperties { /** 开启数据权限 */ private boolean enableDataPerm = true; - /** 数据权限配置 */ - private DataPerm dataPerm = new DataPerm(); + /** 部门关联类型数据权限关联表配置 */ + private DataPerm deptDataPerm = new DataPerm("iam_user_dept", "user_id", "dept_id"); + + /** 角色关联类型数据权限关联表配置 */ + private DataPerm roleDataPerm = new DataPerm("iam_user_role", "user_id", "role _id"); /** 开启查询字段权限 */ private boolean enableSelectFieldPerm = true; /** - * 数据权限(通常是用户/部门关联表) + * 部门相关数据权限 */ @Getter @Setter + @NoArgsConstructor + @AllArgsConstructor public static class DataPerm { /** 关联表名 */ - private String table = "iam_user_dept"; + private String table; - /** 查询字段(用户字段名) */ - private String queryField = "user_id"; + /** 查询字段(输出字段名, 通常为用户字段, 用于筛选出子查询的结果) */ + private String queryField; /** 条件字段(筛选条件字段名) */ - private String whereField = "dept_id"; - + private String whereField; } } diff --git a/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/scope/DataScopeInterceptor.java b/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/scope/DataScopeInterceptor.java index 14c4b371..457703e5 100644 --- a/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/scope/DataScopeInterceptor.java +++ b/bootx-common-starters/common-starter-data-perm/src/main/java/cn/bootx/platform/starter/data/perm/scope/DataScopeInterceptor.java @@ -170,6 +170,7 @@ public class DataScopeInterceptor extends JsqlParserSupport implements InnerInte queryExpression = this.selfScope(mainTableName); break; } + case DEPT_SCOPE_AND_SUB: case DEPT_SCOPE: { Expression deptScopeExpression = this.deptScope(dataPermScope.getDeptScopeIds(), mainTableName); // 追加查询自身的数据 @@ -177,16 +178,18 @@ public class DataScopeInterceptor extends JsqlParserSupport implements InnerInte break; } case USER_SCOPE: { + // 包含自身的数据 queryExpression = this.userScope(dataPermScope.getUserScopeIds(), mainTableName); break; } case DEPT_AND_USER_SCOPE: { + // 包含自身的数据 queryExpression = this.deptAndUserScope(dataPermScope.getDeptScopeIds(), dataPermScope.getUserScopeIds(), mainTableName); break; } - case BELONG_DEPT: - case BELONG_DEPT_AND_SUB: { + case SELF_DEPT: + case SELF_DEPT_AND_SUB: { queryExpression = this.deptScope(dataPermScope.getDeptScopeIds(), mainTableName); break; } @@ -234,17 +237,17 @@ public class DataScopeInterceptor extends JsqlParserSupport implements InnerInte * 查询部门范围的数据 */ protected Expression deptScope(Set deptIds, String mainTableName) { - DataPermProperties.DataPerm dataPerm = dataPermProperties.getDataPerm(); + DataPermProperties.DataPerm deptDataPerm = dataPermProperties.getDeptDataPerm(); // 创建嵌套子查询 PlainSelect plainSelect = new PlainSelect(); // 设置查询字段 SelectExpressionItem selectItem = new SelectExpressionItem(); - selectItem.setExpression(new Column(dataPerm.getQueryField())); + selectItem.setExpression(new Column(deptDataPerm.getQueryField())); plainSelect.addSelectItems(selectItem); // 过滤重复的子查询结果 plainSelect.setDistinct(new Distinct()); // 设置所查询表 - plainSelect.setFromItem(new Table(dataPerm.getTable())); + plainSelect.setFromItem(new Table(deptDataPerm.getTable())); // 构建查询条件 List deptExpressions = Optional.ofNullable(deptIds) @@ -253,12 +256,12 @@ public class DataScopeInterceptor extends JsqlParserSupport implements InnerInte .map(LongValue::new) .collect(Collectors.toList()); // 构造空查询 - if (deptExpressions.size() == 0) { + if (deptExpressions.isEmpty()) { deptExpressions.add(null); } // 设置查询条件 plainSelect - .setWhere(new InExpression(new Column(dataPerm.getWhereField()), new ExpressionList(deptExpressions))); + .setWhere(new InExpression(new Column(deptDataPerm.getWhereField()), new ExpressionList(deptExpressions))); // 拼接子查询 SubSelect subSelect = new SubSelect(); diff --git a/bootx-common-starters/common-starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/task/TestTask.java b/bootx-common-starters/common-starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/task/TestTask.java index 34d27555..0208fbca 100644 --- a/bootx-common-starters/common-starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/task/TestTask.java +++ b/bootx-common-starters/common-starter-quartz/src/main/java/cn/bootx/platform/starter/quartz/task/TestTask.java @@ -12,7 +12,6 @@ import org.springframework.stereotype.Component; /** * 测试定时任务 - * * @author xxm * @since 2021/11/8 */ diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/DataScopeController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/DataRoleController.java similarity index 50% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/DataScopeController.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/DataRoleController.java index 6e0cb7b6..ef660ce7 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/DataScopeController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/DataRoleController.java @@ -4,13 +4,13 @@ import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.iam.core.scope.service.DataScopeService; -import cn.bootx.platform.iam.core.scope.service.DataScopeUserService; -import cn.bootx.platform.iam.dto.scope.DataScopeDto; -import cn.bootx.platform.iam.dto.scope.DataScopeUserInfoDto; -import cn.bootx.platform.iam.param.scope.DataScopeDeptParam; -import cn.bootx.platform.iam.param.scope.DataScopeParam; -import cn.bootx.platform.iam.param.scope.DataScopeUserParam; +import cn.bootx.platform.iam.core.scope.service.DataRoleService; +import cn.bootx.platform.iam.core.scope.service.DataRoleUserService; +import cn.bootx.platform.iam.dto.scope.DataRoleDto; +import cn.bootx.platform.iam.dto.scope.DataRoleUserDto; +import cn.bootx.platform.iam.param.scope.DataRoleParam; +import cn.bootx.platform.iam.param.scope.DataRoleDeptParam; +import cn.bootx.platform.iam.param.scope.DataRoleUserParam; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -23,110 +23,110 @@ import java.util.List; * @author xxm * @since 2021/12/23 */ -@Tag(name = "数据范围权限配置") +@Tag(name = "数据角色配置") @RestController -@RequestMapping("/data/scope") +@RequestMapping("/data/role") @RequiredArgsConstructor -public class DataScopeController { +public class DataRoleController { - private final DataScopeService dataScopeService; + private final DataRoleService dataRoleService; - private final DataScopeUserService dataScopeUserService; + private final DataRoleUserService dataRoleUserService; @Operation(summary = "添加") @PostMapping("/add") - public ResResult add(@RequestBody DataScopeParam param) { - dataScopeService.add(param); + public ResResult add(@RequestBody DataRoleParam param) { + dataRoleService.add(param); return Res.ok(); } @Operation(summary = "更新") @PostMapping("/update") - public ResResult update(@RequestBody DataScopeParam param) { - dataScopeService.update(param); + public ResResult update(@RequestBody DataRoleParam param) { + dataRoleService.update(param); return Res.ok(); } @Operation(summary = "删除") @DeleteMapping("/delete") public ResResult delete(Long id) { - dataScopeService.delete(id); + dataRoleService.delete(id); return Res.ok(); } @Operation(summary = "保存关联部门") @PostMapping("/saveDeptAssign") - public ResResult saveDeptAssign(@RequestBody DataScopeDeptParam param) { - dataScopeService.saveDeptAssign(param); + public ResResult saveDeptAssign(@RequestBody DataRoleDeptParam param) { + dataRoleService.saveDeptAssign(param); return Res.ok(); } @Operation(summary = "获取关联部门id") @GetMapping("/getDeptIds") public ResResult> getDeptIds(Long id) { - return Res.ok(dataScopeService.findDeptIds(id)); + return Res.ok(dataRoleService.findDeptIds(id)); } @Operation(summary = "编码是否被使用") @GetMapping("/existsByCode") public ResResult existsByCode(String code) { - return Res.ok(dataScopeService.existsByCode(code)); + return Res.ok(dataRoleService.existsByCode(code)); } @Operation(summary = "编码是否被使用(不包含自己)") @GetMapping("/existsByCodeNotId") public ResResult existsByCode(String code, Long id) { - return Res.ok(dataScopeService.existsByCode(code, id)); + return Res.ok(dataRoleService.existsByCode(code, id)); } @Operation(summary = "名称是否被使用") @GetMapping("/existsByName") public ResResult existsByName(String name) { - return Res.ok(dataScopeService.existsByName(name)); + return Res.ok(dataRoleService.existsByName(name)); } @Operation(summary = "名称是否被使用(不包含自己)") @GetMapping("/existsByNameNotId") public ResResult existsByName(String name, Long id) { - return Res.ok(dataScopeService.existsByName(name, id)); + return Res.ok(dataRoleService.existsByName(name, id)); } @Operation(summary = "获取") @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(dataScopeService.findById(id)); + public ResResult findById(Long id) { + return Res.ok(dataRoleService.findById(id)); } @Operation(summary = "分页") @GetMapping("/page") - public ResResult> page(@ParameterObject PageParam pageParam, - @ParameterObject DataScopeParam param) { - return Res.ok(dataScopeService.page(pageParam, param)); + public ResResult> page(@ParameterObject PageParam pageParam, + @ParameterObject DataRoleParam param) { + return Res.ok(dataRoleService.page(pageParam, param)); } @Operation(summary = "查询全部") @GetMapping("/findAll") - public ResResult> findAll() { - return Res.ok(dataScopeService.findAll()); + public ResResult> findAll() { + return Res.ok(dataRoleService.findAll()); } @Operation(summary = "获取关联的用户列表") - @GetMapping("/findUsersByDataScopeId") - public ResResult> findUsersByDataScopeId(Long id) { - return Res.ok(dataScopeUserService.findUsersByDataScopeId(id)); + @GetMapping("/findUsersByDataRoleId") + public ResResult> findUsersByDataRoleId(Long id) { + return Res.ok(dataRoleUserService.findUsersByDataRoleId(id)); } - @Operation(summary = "保存关联用户权限") + @Operation(summary = "保存数据角色关联用户权限") @PostMapping("/saveUserAssign") - public ResResult saveUserAssign(@RequestBody DataScopeUserParam param) { - dataScopeUserService.saveUserAssign(param.getDataScopeId(), param.getUserIds()); + public ResResult saveUserAssign(@RequestBody DataRoleUserParam param) { + dataRoleUserService.saveUserAssign(param.getDataRoleId(), param.getUserIds()); return Res.ok(); } - @Operation(summary = "批量删除关联用户") + @Operation(summary = "批量删除数据角色关联用户") @DeleteMapping("/deleteUserAssigns") public ResResult deleteUserAssigns(@RequestBody List ids) { - dataScopeUserService.deleteBatch(ids); + dataRoleUserService.deleteBatch(ids); return Res.ok(); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/UserDataScopeController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/UserDataRoleController.java similarity index 45% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/UserDataScopeController.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/UserDataRoleController.java index 1765bc87..659b4903 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/UserDataScopeController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/UserDataRoleController.java @@ -3,10 +3,10 @@ package cn.bootx.platform.iam.controller; import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.common.core.util.ValidationUtil; -import cn.bootx.platform.iam.core.upms.service.UserDataScopeService; -import cn.bootx.platform.iam.dto.scope.DataScopeDto; -import cn.bootx.platform.iam.param.upms.UserDataScopeBatchParam; -import cn.bootx.platform.iam.param.upms.UserDataScopeParam; +import cn.bootx.platform.iam.core.upms.service.UserDataRoleService; +import cn.bootx.platform.iam.dto.scope.DataRoleDto; +import cn.bootx.platform.iam.param.upms.UserDataRoleBatchParam; +import cn.bootx.platform.iam.param.upms.UserDataRoleParam; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -16,39 +16,39 @@ import org.springframework.web.bind.annotation.*; * @author xxm * @since 2022/1/2 */ -@Tag(name = "用户数据权限配置") +@Tag(name = "用户数据角色配置") @RestController -@RequestMapping("/user/data/scope") +@RequestMapping("/user/data/role") @RequiredArgsConstructor -public class UserDataScopeController { +public class UserDataRoleController { - private final UserDataScopeService dataScopeService; + private final UserDataRoleService dataScopeService; - @Operation(summary = "给用户分配权限") + @Operation(summary = "给用户分配数据角色") @PostMapping("/saveAssign") - public ResResult saveAssign(@RequestBody UserDataScopeParam param) { + public ResResult saveAssign(@RequestBody UserDataRoleParam param) { ValidationUtil.validateParam(param); - dataScopeService.saveAssign(param.getUserId(), param.getDataScopeId()); + dataScopeService.saveAssign(param.getUserId(), param.getDataRoleId()); return Res.ok(); } @Operation(summary = "给用户分配权限(批量)") @PostMapping("/saveAssignBatch") - public ResResult saveAssignBatch(@RequestBody UserDataScopeBatchParam param) { - dataScopeService.saveAssignBatch(param.getUserIds(), param.getDataScopeId()); + public ResResult saveAssignBatch(@RequestBody UserDataRoleBatchParam param) { + dataScopeService.saveAssignBatch(param.getUserIds(), param.getDataRoleId()); return Res.ok(); } - @Operation(summary = "根据用户ID获取到数据权限") - @GetMapping(value = "/findDataScopeByUser") - public ResResult findDataScopeByUser(Long id) { - return Res.ok(dataScopeService.findDataScopeByUser(id)); + @Operation(summary = "根据用户ID获取到数据角色列表") + @GetMapping(value = "/findDataRoleByUser") + public ResResult findDataRoleByUser(Long id) { + return Res.ok(dataScopeService.findDataRoleByUser(id)); } - @Operation(summary = "根据用户ID获取到数据权限Id") - @GetMapping(value = "/findDataScopeIdByUser") - public ResResult findDataScopeIdByUser(Long id) { - return Res.ok(dataScopeService.findDataScopeIdByUser(id)); + @Operation(summary = "根据用户ID获取到数据角色Id") + @GetMapping(value = "/findDataRoleIdByUser") + public ResResult findDataRoleIdByUser(Long id) { + return Res.ok(dataScopeService.findDataRoleIdByUser(id)); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/convert/DataScopeConvert.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/convert/DataScopeConvert.java index fe9ed00b..e9a5e37c 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/convert/DataScopeConvert.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/convert/DataScopeConvert.java @@ -1,8 +1,8 @@ package cn.bootx.platform.iam.core.scope.convert; -import cn.bootx.platform.iam.param.scope.DataScopeParam; -import cn.bootx.platform.iam.core.scope.entity.DataScope; -import cn.bootx.platform.iam.dto.scope.DataScopeDto; +import cn.bootx.platform.iam.param.scope.DataRoleParam; +import cn.bootx.platform.iam.core.scope.entity.DataRole; +import cn.bootx.platform.iam.dto.scope.DataRoleDto; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -17,8 +17,8 @@ public interface DataScopeConvert { DataScopeConvert CONVERT = Mappers.getMapper(DataScopeConvert.class); - DataScope convert(DataScopeParam in); + DataRole convert(DataRoleParam in); - DataScopeDto convert(DataScope in); + DataRoleDto convert(DataRole in); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeDeptManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleDeptManager.java similarity index 48% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeDeptManager.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleDeptManager.java index 2bb40fb9..5fb26791 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeDeptManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleDeptManager.java @@ -1,7 +1,7 @@ package cn.bootx.platform.iam.core.scope.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.iam.core.scope.entity.DataScopeDept; +import cn.bootx.platform.iam.core.scope.entity.DataRoleDept; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; @@ -15,21 +15,21 @@ import java.util.List; @Slf4j @Repository @RequiredArgsConstructor -public class DataScopeDeptManager extends BaseManager { +public class DataRoleDeptManager extends BaseManager { - public void deleteByDataScopeId(Long dataScopeId) { - this.deleteByField(DataScopeDept::getDataScopeId, dataScopeId); + public void deleteByDataRoleId(Long dataRoleId) { + this.deleteByField(DataRoleDept::getRoleId, dataRoleId); } /** * 根据部门进行删除 */ public void deleteByDeptIds(List deptIds) { - this.deleteByFields(DataScopeDept::getDeptId, deptIds); + this.deleteByFields(DataRoleDept::getDeptId, deptIds); } - public List findByDateScopeId(Long dataScopeId) { - return this.findAllByField(DataScopeDept::getDataScopeId, dataScopeId); + public List findByDateRoleId(Long dataRoleId) { + return this.findAllByField(DataRoleDept::getRoleId, dataRoleId); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeUserMapper.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleDeptMapper.java similarity index 60% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeUserMapper.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleDeptMapper.java index d0b4b0b2..389ab9c8 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeUserMapper.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleDeptMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.iam.core.scope.dao; -import cn.bootx.platform.iam.core.scope.entity.DataScopeUser; +import cn.bootx.platform.iam.core.scope.entity.DataRoleDept; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -9,6 +9,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2021/12/23 */ @Mapper -public interface DataScopeUserMapper extends BaseMapper { +public interface DataRoleDeptMapper extends BaseMapper { } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleManager.java similarity index 58% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeManager.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleManager.java index 3b8e4165..86335795 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleManager.java @@ -1,7 +1,7 @@ package cn.bootx.platform.iam.core.scope.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.iam.core.scope.entity.DataScope; +import cn.bootx.platform.iam.core.scope.entity.DataRole; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; @@ -13,22 +13,22 @@ import org.springframework.stereotype.Repository; @Slf4j @Repository @RequiredArgsConstructor -public class DataScopeManager extends BaseManager { +public class DataRoleManager extends BaseManager { public boolean existsByCode(String code) { - return this.existedByField(DataScope::getCode, code); + return this.existedByField(DataRole::getCode, code); } public boolean existsByCode(String code, Long id) { - return this.existedByField(DataScope::getCode, code, id); + return this.existedByField(DataRole::getCode, code, id); } public boolean existsByName(String name) { - return this.existedByField(DataScope::getName, name); + return this.existedByField(DataRole::getName, name); } public boolean existsByName(String name, Long id) { - return this.existedByField(DataScope::getName, name, id); + return this.existedByField(DataRole::getName, name, id); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeMapper.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleMapper.java similarity index 62% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeMapper.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleMapper.java index ab11b70d..c5a3b18d 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeMapper.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.iam.core.scope.dao; -import cn.bootx.platform.iam.core.scope.entity.DataScope; +import cn.bootx.platform.iam.core.scope.entity.DataRole; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -9,6 +9,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2021/12/23 */ @Mapper -public interface DataScopeMapper extends BaseMapper { +public interface DataRoleMapper extends BaseMapper { } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeUserManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleUserManager.java similarity index 45% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeUserManager.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleUserManager.java index 5547226a..3b0ef826 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeUserManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleUserManager.java @@ -1,7 +1,7 @@ package cn.bootx.platform.iam.core.scope.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.iam.core.scope.entity.DataScopeUser; +import cn.bootx.platform.iam.core.scope.entity.DataRoleUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; @@ -15,14 +15,14 @@ import java.util.List; @Slf4j @Repository @RequiredArgsConstructor -public class DataScopeUserManager extends BaseManager { +public class DataRoleUserManager extends BaseManager { - public void deleteByDataScopeId(Long dataScopeId) { - this.deleteByField(DataScopeUser::getDataScopeId, dataScopeId); + public void deleteByDataRoleId(Long dataRoleId) { + this.deleteByField(DataRoleUser::getRoleId, dataRoleId); } - public List findByDateScopeId(Long dataScopeId) { - return this.findAllByField(DataScopeUser::getDataScopeId, dataScopeId); + public List findByDateRoleId(Long dataRoleId) { + return this.findAllByField(DataRoleUser::getRoleId, dataRoleId); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeDeptMapper.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleUserMapper.java similarity index 60% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeDeptMapper.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleUserMapper.java index b5cec7f8..5fc28f4d 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataScopeDeptMapper.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/dao/DataRoleUserMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.iam.core.scope.dao; -import cn.bootx.platform.iam.core.scope.entity.DataScopeDept; +import cn.bootx.platform.iam.core.scope.entity.DataRoleUser; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -9,6 +9,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2021/12/23 */ @Mapper -public interface DataScopeDeptMapper extends BaseMapper { +public interface DataRoleUserMapper extends BaseMapper { } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/DataScope.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/DataRole.java similarity index 71% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/DataScope.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/DataRole.java index caa5314a..2c3fbafd 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/DataScope.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/entity/DataRole.java @@ -2,17 +2,17 @@ package cn.bootx.platform.iam.core.scope.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.iam.core.scope.convert.DataScopeConvert; -import cn.bootx.platform.iam.param.scope.DataScopeParam; +import cn.bootx.platform.iam.dto.scope.DataRoleDto; +import cn.bootx.platform.iam.param.scope.DataRoleParam; import cn.bootx.platform.starter.data.perm.code.DataScopeEnum; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.iam.dto.scope.DataScopeDto; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** - * 数据范围配置 + * 数据角色 * * @author xxm * @since 2021/12/23 @@ -20,8 +20,8 @@ import lombok.experimental.Accessors; @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -@TableName("iam_data_scope") -public class DataScope extends MpBaseEntity implements EntityBaseFunction { +@TableName("iam_data_role") +public class DataRole extends MpBaseEntity implements EntityBaseFunction { /** 编码 */ private String code; @@ -33,17 +33,17 @@ public class DataScope extends MpBaseEntity implements EntityBaseFunction new BizException("数据不存在")); - BeanUtil.copyProperties(param, dataScope, CopyOptions.create().ignoreNullValue()); - dataScope.setType(null); - dataScopeManager.updateById(dataScope); + public void update(DataRoleParam param) { + DataRole dataRole = dataRoleManager.findById(param.getId()).orElseThrow(() -> new BizException("数据不存在")); + BeanUtil.copyProperties(param, dataRole, CopyOptions.create().ignoreNullValue()); + dataRole.setType(null); + dataRoleManager.updateById(dataRole); } /** @@ -78,15 +78,15 @@ public class DataScopeService { */ @Transactional(rollbackFor = Exception.class) public void delete(Long id) { - if (!dataScopeManager.existedById(id)) { + if (!dataRoleManager.existedById(id)) { throw new BizException("数据不存在"); } - if (userDataScopeManager.existsByDataScopeId(id)) { + if (userDataRoleManager.existsByDataRoleId(id)) { throw new BizException("该权限已经有用户在使用,无法删除"); } - dataScopeManager.deleteById(id); - dataScopeUserManager.deleteByDataScopeId(id); - dataScopeDeptManager.deleteByDataScopeId(id); + dataRoleManager.deleteById(id); + dataRoleUserManager.deleteByDataRoleId(id); + dataRoleDeptManager.deleteByDataRoleId(id); } /** @@ -94,31 +94,31 @@ public class DataScopeService { */ @Transactional(rollbackFor = Exception.class) @CacheEvict(value = { USER_DATA_SCOPE }, allEntries = true) - public void saveDeptAssign(DataScopeDeptParam param) { - DataScope dataScope = dataScopeManager.findById(param.getDataScopeId()).orElseThrow(DataNotExistException::new); + public void saveDeptAssign(DataRoleDeptParam param) { + DataRole dataRole = dataRoleManager.findById(param.getDataRoleId()).orElseThrow(DataNotExistException::new); val scope = CollUtil.newArrayList(DataScopeEnum.DEPT_SCOPE.getCode(), DataScopeEnum.DEPT_AND_USER_SCOPE.getCode()); - if (!scope.contains(dataScope.getType())) { + if (!scope.contains(dataRole.getType())) { throw new BizException("非法操作"); } // 先删后增 - List dateScopedDeptList = dataScopeDeptManager.findByDateScopeId(param.getDataScopeId()); - List deptIdsByDb = dateScopedDeptList.stream().map(DataScopeDept::getDeptId).collect(Collectors.toList()); + List dateScopedDeptList = dataRoleDeptManager.findByDateRoleId(param.getDataRoleId()); + List deptIdsByDb = dateScopedDeptList.stream().map(DataRoleDept::getDeptId).collect(Collectors.toList()); // 要删除的 List deptIds = param.getDeptIds(); List deleteIds = dateScopedDeptList.stream() - .filter(dataScopeDept -> !deptIds.contains(dataScopeDept.getDeptId())) + .filter(dataRoleDept -> !deptIds.contains(dataRoleDept.getDeptId())) .map(MpIdEntity::getId) .collect(Collectors.toList()); // 要增加的 - List dataScopeDepths = deptIds.stream() + List dataRoleDepths = deptIds.stream() .filter(id -> !deptIdsByDb.contains(id)) - .map(deptId -> new DataScopeDept(param.getDataScopeId(), deptId)) + .map(deptId -> new DataRoleDept(param.getDataRoleId(), deptId)) .collect(Collectors.toList()); - dataScopeDeptManager.deleteByIds(deleteIds); - dataScopeDeptManager.saveAll(dataScopeDepths); + dataRoleDeptManager.deleteByIds(deleteIds); + dataRoleDeptManager.saveAll(dataRoleDepths); } /** @@ -126,16 +126,16 @@ public class DataScopeService { */ @EventListener public void DeptDeleteEventListener(DeptDeleteEvent event) { - dataScopeDeptManager.deleteByDeptIds(event.getDeptIds()); + dataRoleDeptManager.deleteByDeptIds(event.getDeptIds()); } /** * 获取关联的部门id集合 */ public List findDeptIds(Long id) { - return dataScopeDeptManager.findByDateScopeId(id) + return dataRoleDeptManager.findByDateRoleId(id) .stream() - .map(DataScopeDept::getDeptId) + .map(DataRoleDept::getDeptId) .collect(Collectors.toList()); } @@ -143,49 +143,49 @@ public class DataScopeService { * 判断权限编码是否存在 */ public boolean existsByCode(String code) { - return dataScopeManager.existsByCode(code); + return dataRoleManager.existsByCode(code); } /** * 判断权限编码是否存在 */ public boolean existsByCode(String code, Long id) { - return dataScopeManager.existsByCode(code, id); + return dataRoleManager.existsByCode(code, id); } /** * name是否存在 */ public boolean existsByName(String name) { - return dataScopeManager.existsByName(name); + return dataRoleManager.existsByName(name); } /** * name是否存在 */ public boolean existsByName(String name, Long id) { - return dataScopeManager.existsByName(name, id); + return dataRoleManager.existsByName(name, id); } /** * 获取单条 */ - public DataScopeDto findById(Long id) { - return dataScopeManager.findById(id).map(DataScope::toDto).orElseThrow(() -> new BizException("数据不存在")); + public DataRoleDto findById(Long id) { + return dataRoleManager.findById(id).map(DataRole::toDto).orElseThrow(() -> new BizException("数据不存在")); } /** * 分页 */ - public PageResult page(PageParam pageParam, DataScopeParam param) { - return MpUtil.convert2DtoPageResult(dataScopeManager.page(MpUtil.getMpPage(pageParam, DataScope.class))); + public PageResult page(PageParam pageParam, DataRoleParam param) { + return MpUtil.convert2DtoPageResult(dataRoleManager.page(MpUtil.getMpPage(pageParam, DataRole.class))); } /** * 列表查询 */ - public List findAll() { - return ResultConvertUtil.dtoListConvert(dataScopeManager.findAll()); + public List findAll() { + return ResultConvertUtil.dtoListConvert(dataRoleManager.findAll()); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataScopeUserService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataRoleUserService.java similarity index 52% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataScopeUserService.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataRoleUserService.java index 97f1954e..39f97a9a 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataScopeUserService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataRoleUserService.java @@ -2,27 +2,29 @@ package cn.bootx.platform.iam.core.scope.service; import cn.bootx.platform.common.core.exception.BizException; import cn.bootx.platform.common.core.function.CollectorsFunction; -import cn.bootx.platform.starter.data.perm.code.DataScopeEnum; -import cn.bootx.platform.iam.core.scope.dao.DataScopeManager; -import cn.bootx.platform.iam.core.scope.dao.DataScopeUserManager; -import cn.bootx.platform.iam.core.scope.entity.DataScope; -import cn.bootx.platform.iam.core.scope.entity.DataScopeUser; +import cn.bootx.platform.common.core.util.CollUtil; +import cn.bootx.platform.iam.core.scope.dao.DataRoleManager; +import cn.bootx.platform.iam.core.scope.dao.DataRoleUserManager; +import cn.bootx.platform.iam.core.scope.entity.DataRole; +import cn.bootx.platform.iam.core.scope.entity.DataRoleUser; import cn.bootx.platform.iam.core.user.dao.UserInfoManager; import cn.bootx.platform.iam.core.user.entity.UserInfo; -import cn.bootx.platform.iam.dto.scope.DataScopeUserInfoDto; +import cn.bootx.platform.iam.dto.scope.DataRoleUserDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import lombok.val; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; import static cn.bootx.platform.iam.code.CachingCode.USER_DATA_SCOPE; +import static cn.bootx.platform.starter.data.perm.code.DataScopeEnum.DEPT_AND_USER_SCOPE; +import static cn.bootx.platform.starter.data.perm.code.DataScopeEnum.USER_SCOPE; /** * 数据范围权限限定用户级别 @@ -33,31 +35,31 @@ import static cn.bootx.platform.iam.code.CachingCode.USER_DATA_SCOPE; @Slf4j @Service @RequiredArgsConstructor -public class DataScopeUserService { +public class DataRoleUserService { - private final DataScopeManager dataScopeManager; + private final DataRoleManager dataRoleManager; - private final DataScopeUserManager dataScopeUserManager; + private final DataRoleUserManager dataRoleUserManager; private final UserInfoManager userInfoManager; /** * 关联用户列表 */ - public List findUsersByDataScopeId(Long dataScopeId) { - Map dataScopeUserMap = dataScopeUserManager.findByDateScopeId(dataScopeId) + public List findUsersByDataRoleId(Long dataRoleId) { + Map dataScopeUserMap = dataRoleUserManager.findByDateRoleId(dataRoleId) .stream() - .collect(Collectors.toMap(DataScopeUser::getUserId, Function.identity(), CollectorsFunction::retainLatest)); + .collect(Collectors.toMap(DataRoleUser::getUserId, Function.identity(), CollectorsFunction::retainLatest)); // 查询出用户id List userIds = dataScopeUserMap.values() .stream() - .map(DataScopeUser::getUserId) + .map(DataRoleUser::getUserId) .collect(Collectors.toList()); // 查询出用户 List userInfos = userInfoManager.findAllByIds(userIds); return userInfos.stream() - .map(userInfo -> new DataScopeUserInfoDto().setId(dataScopeUserMap.get(userInfo.getId()).getId()) + .map(userInfo -> new DataRoleUserDto().setId(dataScopeUserMap.get(userInfo.getId()).getId()) .setUserId(userInfo.getId()) .setUsername(userInfo.getUsername()) .setName(userInfo.getName())) @@ -69,22 +71,24 @@ public class DataScopeUserService { */ @Transactional(rollbackFor = Exception.class) @CacheEvict(value = { USER_DATA_SCOPE }, allEntries = true) - public void saveUserAssign(Long dataScopeId, List userIds) { - DataScope dataScope = dataScopeManager.findById(dataScopeId).orElseThrow(() -> new BizException("数据不存在")); - if (!Objects.equals(dataScope.getType(), DataScopeEnum.USER_SCOPE.getCode()) - && Objects.equals(dataScope.getType(), DataScopeEnum.DEPT_AND_USER_SCOPE.getCode())) { + public void saveUserAssign(Long dataRoleId, List userIds) { + DataRole dataRole = dataRoleManager.findById(dataRoleId).orElseThrow(() -> new BizException("数据不存在")); + + val scope = CollUtil.newArrayList(USER_SCOPE.getCode(), + DEPT_AND_USER_SCOPE.getCode()); + if (!scope.contains(dataRole.getType())) { throw new BizException("非法操作"); } - List dataScopeUserIds = dataScopeUserManager.findByDateScopeId(dataScopeId) + List dataScopeUserIds = dataRoleUserManager.findByDateRoleId(dataRoleId) .stream() - .map(DataScopeUser::getUserId) + .map(DataRoleUser::getUserId) .collect(Collectors.toList()); - List dataScopeUsers = userIds.stream() + List dataScopeUsers = userIds.stream() .filter(userId -> !dataScopeUserIds.contains(userId)) - .map(userId -> new DataScopeUser(dataScopeId, userId)) + .map(userId -> new DataRoleUser(dataRoleId, userId)) .collect(Collectors.toList()); - dataScopeUserManager.saveAll(dataScopeUsers); + dataRoleUserManager.saveAll(dataScopeUsers); } /** @@ -92,7 +96,7 @@ public class DataScopeUserService { */ @CacheEvict(value = { USER_DATA_SCOPE }, allEntries = true) public void deleteBatch(List ids) { - dataScopeUserManager.deleteByIds(ids); + dataRoleUserManager.deleteByIds(ids); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataScopeManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataRoleManager.java similarity index 52% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataScopeManager.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataRoleManager.java index 3e397a0b..2807eb80 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataScopeManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataRoleManager.java @@ -2,7 +2,7 @@ package cn.bootx.platform.iam.core.upms.dao; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.iam.core.upms.entity.UserDataScope; +import cn.bootx.platform.iam.core.upms.entity.UserDataRole; import cn.bootx.platform.starter.auth.util.SecurityUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,30 +18,30 @@ import java.util.Optional; @Slf4j @Repository @RequiredArgsConstructor -public class UserDataScopeManager extends BaseManager { +public class UserDataRoleManager extends BaseManager { - public boolean existsByDataScopeId(Long dataScopeId) { - return this.existedByField(UserDataScope::getDataScopeId, dataScopeId); + public boolean existsByDataRoleId(Long dataRoleId) { + return this.existedByField(UserDataRole::getRoleId, dataRoleId); } public void deleteByUser(Long userId) { - this.deleteByField(UserDataScope::getUserId, userId); + this.deleteByField(UserDataRole::getUserId, userId); } public void deleteByUsers(List userIds) { - this.deleteByFields(UserDataScope::getUserId, userIds); + this.deleteByFields(UserDataRole::getUserId, userIds); } - public List findAllByUserId(Long userId) { - return this.findAllByField(UserDataScope::getUserId, userId); + public List findAllByUserId(Long userId) { + return this.findAllByField(UserDataRole::getUserId, userId); } - public Optional findByUserId(Long userId) { - return this.findByField(UserDataScope::getUserId, userId); + public Optional findByUserId(Long userId) { + return this.findByField(UserDataRole::getUserId, userId); } @Override - public List saveAll(List dataScopes) { + public List saveAll(List dataScopes) { MpUtil.initEntityList(dataScopes, SecurityUtil.getUserIdOrDefaultId()); MpUtil.executeBatch(dataScopes, baseMapper::saveAll, this.DEFAULT_BATCH_SIZE); return dataScopes; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataScopeMapper.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataRoleMapper.java similarity index 53% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataScopeMapper.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataRoleMapper.java index 9627e8de..e8f8eda6 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataScopeMapper.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/UserDataRoleMapper.java @@ -1,6 +1,6 @@ package cn.bootx.platform.iam.core.upms.dao; -import cn.bootx.platform.iam.core.upms.entity.UserDataScope; +import cn.bootx.platform.iam.core.upms.entity.UserDataRole; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -8,12 +8,13 @@ import org.apache.ibatis.annotations.Param; import java.util.List; /** + * 用户数据权限角色关系 * @author xxm * @since 2021/12/23 */ @Mapper -public interface UserDataScopeMapper extends BaseMapper { +public interface UserDataRoleMapper extends BaseMapper { - void saveAll(@Param("userDataScopes") List userDataScopes); + void saveAll(@Param("userDataRoles") List userDataRoles); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/UserDataScope.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/UserDataRole.java similarity index 83% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/UserDataScope.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/UserDataRole.java index 065169a0..802b8252 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/UserDataScope.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/UserDataRole.java @@ -19,13 +19,13 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @AllArgsConstructor @NoArgsConstructor -@TableName("iam_user_data_scope") -public class UserDataScope extends MpIdEntity { +@TableName("iam_user_data_role") +public class UserDataRole extends MpIdEntity { /** 用户id */ private Long userId; /** 数据权限id */ - private Long dataScopeId; + private Long roleId; } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/UserDataScopeService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/UserDataRoleService.java similarity index 49% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/UserDataScopeService.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/UserDataRoleService.java index 8a057d40..40cd1c58 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/UserDataScopeService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/UserDataRoleService.java @@ -4,22 +4,22 @@ import cn.bootx.platform.common.core.annotation.CountTime; import cn.bootx.platform.common.core.annotation.NestedPermission; import cn.bootx.platform.common.core.exception.BizException; import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.iam.core.scope.dao.DataScopeDeptManager; -import cn.bootx.platform.iam.core.scope.dao.DataScopeManager; -import cn.bootx.platform.iam.core.scope.dao.DataScopeUserManager; -import cn.bootx.platform.iam.core.scope.entity.DataScope; -import cn.bootx.platform.iam.core.scope.entity.DataScopeDept; -import cn.bootx.platform.iam.core.scope.entity.DataScopeUser; +import cn.bootx.platform.iam.core.scope.dao.DataRoleDeptManager; +import cn.bootx.platform.iam.core.scope.dao.DataRoleManager; +import cn.bootx.platform.iam.core.scope.dao.DataRoleUserManager; +import cn.bootx.platform.iam.core.scope.entity.DataRole; +import cn.bootx.platform.iam.core.scope.entity.DataRoleDept; +import cn.bootx.platform.iam.core.scope.entity.DataRoleUser; +import cn.bootx.platform.iam.core.upms.entity.UserDataRole; import cn.bootx.platform.iam.core.user.dao.UserDeptManager; import cn.bootx.platform.iam.core.user.entity.UserDept; +import cn.bootx.platform.iam.dto.scope.DataRoleDto; import cn.bootx.platform.starter.data.perm.code.DataScopeEnum; import cn.bootx.platform.starter.data.perm.scope.DataPermScope; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.iam.core.dept.dao.DeptManager; import cn.bootx.platform.iam.core.dept.entity.Dept; -import cn.bootx.platform.iam.core.upms.dao.UserDataScopeManager; -import cn.bootx.platform.iam.core.upms.entity.UserDataScope; -import cn.bootx.platform.iam.dto.scope.DataScopeDto; +import cn.bootx.platform.iam.core.upms.dao.UserDataRoleManager; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -47,17 +47,17 @@ import static cn.bootx.platform.iam.code.CachingCode.USER_DATA_SCOPE; @Slf4j @Service @RequiredArgsConstructor -public class UserDataScopeService { +public class UserDataRoleService { - private final UserDataScopeManager userDataScopeManager; + private final UserDataRoleManager userDataRoleManager; private final UserDeptManager userDeptManager; - private final DataScopeManager dataScopeManager; + private final DataRoleManager dataRoleManager; - private final DataScopeUserManager dataScopeUserManager; + private final DataRoleUserManager dataRoleUserManager; - private final DataScopeDeptManager dataScopeDeptManager; + private final DataRoleDeptManager dataRoleDeptManager; private final DeptManager deptManager; @@ -66,45 +66,45 @@ public class UserDataScopeService { */ @Transactional(rollbackFor = Exception.class) @CacheEvict(value = { USER_DATA_SCOPE }, key = "#userId") - public void saveAssign(Long userId, Long dataScopeId) { + public void saveAssign(Long userId, Long roleId) { // 先删除用户拥有的数据权限 - userDataScopeManager.deleteByUser(userId); - if (Objects.nonNull(dataScopeId)) { - userDataScopeManager.save(new UserDataScope(userId, dataScopeId)); + userDataRoleManager.deleteByUser(userId); + if (Objects.nonNull(roleId)) { + userDataRoleManager.save(new UserDataRole(userId, roleId)); } } /** - * 给用户数据权限关联关系 + * 给用户数据角色关联关系 */ @Transactional(rollbackFor = Exception.class) @CacheEvict(value = { USER_DATA_SCOPE }, key = "#userIds") - public void saveAssignBatch(List userIds, Long dataScopeId) { + public void saveAssignBatch(List userIds, Long roleId) { // 先删除用户拥有的数据权限 - userDataScopeManager.deleteByUsers(userIds); - List userDataScopes = userIds.stream() - .map(userId -> new UserDataScope(userId, dataScopeId)) + userDataRoleManager.deleteByUsers(userIds); + List userDataRoles = userIds.stream() + .map(userId -> new UserDataRole(userId, roleId)) .collect(Collectors.toList()); - userDataScopeManager.saveAll(userDataScopes); + userDataRoleManager.saveAll(userDataRoles); } /** - * 查询用户所对应的数据权限信息 + * 查询用户所对应的数据角色信息 */ - public DataScopeDto findDataScopeByUser(Long userId) { - if (Objects.isNull(this.findDataScopeIdByUser(userId))) { - return new DataScopeDto(); + public DataRoleDto findDataRoleByUser(Long userId) { + if (Objects.isNull(this.findDataRoleIdByUser(userId))) { + return new DataRoleDto(); } - return dataScopeManager.findById(this.findDataScopeIdByUser(userId)) - .map(DataScope::toDto) + return dataRoleManager.findById(this.findDataRoleIdByUser(userId)) + .map(DataRole::toDto) .orElseThrow(DataNotExistException::new); } /** - * 查询用户所对应的数据权限id + * 查询用户所对应的数据角色id */ - public Long findDataScopeIdByUser(Long userId) { - return userDataScopeManager.findByUserId(userId).map(UserDataScope::getDataScopeId).orElse(null); + public Long findDataRoleIdByUser(Long userId) { + return userDataRoleManager.findByUserId(userId).map(UserDataRole::getRoleId).orElse(null); } @@ -116,46 +116,54 @@ public class UserDataScopeService { @Cacheable(value = USER_DATA_SCOPE, key = "#userId") public DataPermScope getDataPermScopeByUser(Long userId) { DataPermScope dataPermScope = new DataPermScope(); - List userDataScopes = userDataScopeManager.findAllByUserId(userId); + List userDataRoles = userDataRoleManager.findAllByUserId(userId); - if (CollUtil.isEmpty(userDataScopes)) { + if (CollUtil.isEmpty(userDataRoles)) { return dataPermScope.setScopeType(DataScopeEnum.SELF); } - UserDataScope userDataScope = userDataScopes.get(0); - DataScope dataScope = dataScopeManager.findById(userDataScope.getDataScopeId()) - .orElseThrow(() -> new BizException("数据权限[配置不存在")); + UserDataRole userDataRole = userDataRoles.get(0); + DataRole dataRole = dataRoleManager.findById(userDataRole.getRoleId()) + .orElseThrow(() -> new BizException("数据角色不存在")); - dataPermScope.setScopeType(DataScopeEnum.findByCode(dataScope.getType())); + dataPermScope.setScopeType(DataScopeEnum.findByCode(dataRole.getType())); // 用户 - if (Objects.equals(dataScope.getType(), DataScopeEnum.USER_SCOPE.getCode())) { - Set collect = dataScopeUserManager.findByDateScopeId(dataScope.getId()) + if (Objects.equals(dataRole.getType(), DataScopeEnum.USER_SCOPE.getCode())) { + Set userIds = dataRoleUserManager.findByDateRoleId(dataRole.getId()) .stream() - .map(DataScopeUser::getUserId) + .map(DataRoleUser::getUserId) .collect(Collectors.toSet()); - return dataPermScope.setUserScopeIds(collect); + return dataPermScope.setUserScopeIds(userIds); } // 部门 - else if (Objects.equals(dataScope.getType(), DataScopeEnum.DEPT_SCOPE.getCode())) { - Set collect = dataScopeDeptManager.findByDateScopeId(dataScope.getId()) + else if (Objects.equals(dataRole.getType(), DataScopeEnum.DEPT_SCOPE.getCode())) { + Set deptIds = dataRoleDeptManager.findByDateRoleId(dataRole.getId()) .stream() - .map(DataScopeDept::getDeptId) + .map(DataRoleDept::getDeptId) .collect(Collectors.toSet()); - return dataPermScope.setDeptScopeIds(collect); + return dataPermScope.setDeptScopeIds(deptIds); + } + // 部门+下属部门 + else if (Objects.equals(dataRole.getType(), DataScopeEnum.SELF_DEPT_AND_SUB.getCode())) { + Set deptIds = dataRoleDeptManager.findByDateRoleId(dataRole.getId()) + .stream() + .map(DataRoleDept::getDeptId) + .collect(Collectors.toSet()); + return dataPermScope.setDeptScopeIds(this.findDeptAndSub(deptIds)); } // 用户和部门 - else if (Objects.equals(dataScope.getType(), DataScopeEnum.DEPT_AND_USER_SCOPE.getCode())) { - Set userIds = dataScopeUserManager.findByDateScopeId(dataScope.getId()) + else if (Objects.equals(dataRole.getType(), DataScopeEnum.DEPT_AND_USER_SCOPE.getCode())) { + Set userIds = dataRoleUserManager.findByDateRoleId(dataRole.getId()) .stream() - .map(DataScopeUser::getUserId) + .map(DataRoleUser::getUserId) .collect(Collectors.toSet()); - Set deptIds = dataScopeDeptManager.findByDateScopeId(dataScope.getId()) + Set deptIds = dataRoleDeptManager.findByDateRoleId(dataRole.getId()) .stream() - .map(DataScopeDept::getDeptId) + .map(DataRoleDept::getDeptId) .collect(Collectors.toSet()); return dataPermScope.setDeptScopeIds(deptIds).setUserScopeIds(userIds); } // 自己所属的部门 - else if (Objects.equals(dataScope.getType(), DataScopeEnum.BELONG_DEPT.getCode())) { + else if (Objects.equals(dataRole.getType(), DataScopeEnum.SELF_DEPT.getCode())) { Set deptIds = userDeptManager.findDeptIdsByUser(userId) .stream() .map(UserDept::getDeptId) @@ -163,8 +171,8 @@ public class UserDataScopeService { return dataPermScope.setDeptScopeIds(deptIds); } // 自己所属的部门和下级部门 - else if (Objects.equals(dataScope.getType(), DataScopeEnum.BELONG_DEPT_AND_SUB.getCode())) { - Set deptIds = this.findSubDeptList(userId); + else if (Objects.equals(dataRole.getType(), DataScopeEnum.SELF_DEPT_AND_SUB.getCode())) { + Set deptIds = this.findSelfDeptAndSub(userId); return dataPermScope.setDeptScopeIds(deptIds); } else { @@ -176,7 +184,7 @@ public class UserDataScopeService { /** * 查找自己及子级部门 */ - private Set findSubDeptList(Long userId) { + private Set findSelfDeptAndSub(Long userId) { Set deptIds = userDeptManager.findDeptIdsByUser(userId) .stream() .map(UserDept::getDeptId) @@ -192,6 +200,25 @@ public class UserDataScopeService { .collect(Collectors.toSet()); } + + /** + * 查找部门及子级部门 + */ + private Set findDeptAndSub(Set deptIds) { + Map deptMap = deptManager.findAll() + .stream() + .collect(Collectors.toMap(MpIdEntity::getId, Function.identity())); + Set deptOrgCodes = deptIds.stream() + .map(deptMap::get) + .map(Dept::getOrgCode) + .collect(Collectors.toSet()); + return deptMap.values() + .stream() + .filter(dept -> this.judgeSubDept(dept.getOrgCode(), deptOrgCodes)) + .map(MpIdEntity::getId) + .collect(Collectors.toSet()); + } + /** * 判断是否是子部门 */ diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataScopeDto.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataRoleDto.java similarity index 84% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataScopeDto.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataRoleDto.java index 90f6d01f..9d216ea4 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataScopeDto.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataRoleDto.java @@ -13,8 +13,8 @@ import lombok.experimental.Accessors; @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -@Schema(title = "数据范围权限") -public class DataScopeDto extends BaseDto { +@Schema(title = "数据角色") +public class DataRoleDto extends BaseDto { @Schema(description = "编码") private String code; @@ -23,7 +23,7 @@ public class DataScopeDto extends BaseDto { private String name; @Schema(description = "类型") - private Integer type; + private String type; @Schema(description = "备注") private String remark; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataScopeUserInfoDto.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataRoleUserDto.java similarity index 94% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataScopeUserInfoDto.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataRoleUserDto.java index d16322a2..46415515 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataScopeUserInfoDto.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/scope/DataRoleUserDto.java @@ -13,7 +13,7 @@ import lombok.experimental.Accessors; @Data @Accessors(chain = true) @Schema(title = "用户数据范围权限详细信息") -public class DataScopeUserInfoDto { +public class DataRoleUserDto { @Schema(description = "权限关联id") private Long id; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/DataPermScopeHandlerImpl.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/DataPermScopeHandlerImpl.java index b76bcb6e..41855c67 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/DataPermScopeHandlerImpl.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/handler/DataPermScopeHandlerImpl.java @@ -1,11 +1,11 @@ package cn.bootx.platform.iam.handler; import cn.bootx.platform.common.core.entity.UserDetail; +import cn.bootx.platform.iam.core.upms.service.UserDataRoleService; import cn.bootx.platform.starter.data.perm.exception.NotLoginPermException; import cn.bootx.platform.starter.data.perm.local.DataPermContextHolder; import cn.bootx.platform.starter.data.perm.scope.DataPermScope; import cn.bootx.platform.starter.data.perm.scope.DataPermScopeHandler; -import cn.bootx.platform.iam.core.upms.service.UserDataScopeService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; @@ -26,7 +26,7 @@ public class DataPermScopeHandlerImpl implements DataPermScopeHandler { * 需要进行懒加载方式的注入, 因为 DataPermScopeHandler bean创建时机比UserDataScopeService早 */ @Lazy - private final UserDataScopeService userDataScopeService; + private final UserDataRoleService userDataRoleService; /** * 获取数据权限范围配置 @@ -36,7 +36,7 @@ public class DataPermScopeHandlerImpl implements DataPermScopeHandler { Long userId = DataPermContextHolder.getUserDetail() .map(UserDetail::getId) .orElseThrow(NotLoginPermException::new); - return userDataScopeService.getDataPermScopeByUser(userId); + return userDataRoleService.getDataPermScopeByUser(userId); } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeDeptParam.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleDeptParam.java similarity index 77% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeDeptParam.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleDeptParam.java index 6479128c..27a65c69 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeDeptParam.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleDeptParam.java @@ -13,10 +13,10 @@ import java.util.List; @Data @Accessors(chain = true) @Schema(title = "部门范围") -public class DataScopeDeptParam { +public class DataRoleDeptParam { - @Schema(description = "数据权限id") - private Long dataScopeId; + @Schema(description = "数据角色id") + private Long dataRoleId; @Schema(description = "部门id集合") private List deptIds; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeParam.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleParam.java similarity index 84% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeParam.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleParam.java index 22117080..a434c62f 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeParam.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleParam.java @@ -10,8 +10,8 @@ import lombok.experimental.Accessors; */ @Data @Accessors(chain = true) -@Schema(title = "数据范围权限") -public class DataScopeParam { +@Schema(title = "数据角色") +public class DataRoleParam { @Schema(description = "主键") private Long id; @@ -23,7 +23,7 @@ public class DataScopeParam { private String name; @Schema(description = "类型") - private Integer type; + private String type; @Schema(description = "备注") private String remark; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeUserParam.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleUserParam.java similarity index 76% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeUserParam.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleUserParam.java index 86dbce98..0d43e1b1 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataScopeUserParam.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/scope/DataRoleUserParam.java @@ -13,10 +13,10 @@ import java.util.List; @Data @Accessors(chain = true) @Schema(title = "部门范围") -public class DataScopeUserParam { +public class DataRoleUserParam { - @Schema(description = "数据权限id") - private Long dataScopeId; + @Schema(description = "数据角色id") + private Long dataRoleId; @Schema(description = "用户id") private List userIds; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataScopeBatchParam.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataRoleBatchParam.java similarity index 57% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataScopeBatchParam.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataRoleBatchParam.java index e533c1b2..1dec8937 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataScopeBatchParam.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataRoleBatchParam.java @@ -6,19 +6,21 @@ import lombok.Data; import javax.validation.constraints.NotEmpty; import java.util.List; +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + /** * @author xxm * @since 2022/6/7 */ @Data @Schema(title = "用户数据权限批量设置参数") -public class UserDataScopeBatchParam { +public class UserDataRoleBatchParam { - @Schema(description = "用户的ID", required = true) + @Schema(description = "用户的ID", requiredMode = REQUIRED) @NotEmpty(message = "用户集合不能为空") private List userIds; - @Schema(description = "数据权限的ID集合", required = true) - private Long dataScopeId; + @Schema(description = "数据角色ID", requiredMode = REQUIRED) + private Long dataRoleId; } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataScopeParam.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataRoleParam.java similarity index 46% rename from bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataScopeParam.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataRoleParam.java index 644b0318..67a6258b 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataScopeParam.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/UserDataRoleParam.java @@ -5,19 +5,21 @@ import lombok.Data; import javax.validation.constraints.NotNull; +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + /** * @author xxm * @since 2022/1/2 */ @Data @Schema(title = "用户数据权限参数") -public class UserDataScopeParam { +public class UserDataRoleParam { - @Schema(description = "用户的ID", required = true) - @NotNull(message = "用户 ID 不能为空") + @Schema(description = "用户的ID", requiredMode = REQUIRED) + @NotNull(message = "用户ID不能为空") private Long userId; - @Schema(description = "数据权限的ID集合", required = true) - private Long dataScopeId; + @Schema(description = "数据角色ID", requiredMode = REQUIRED) + private Long dataRoleId; } diff --git a/bootx-services/service-iam/src/main/resources/mapper/UserDataScopeMapper.xml b/bootx-services/service-iam/src/main/resources/mapper/UserDataRoleMapper.xml similarity index 53% rename from bootx-services/service-iam/src/main/resources/mapper/UserDataScopeMapper.xml rename to bootx-services/service-iam/src/main/resources/mapper/UserDataRoleMapper.xml index a9770402..4e7fbb13 100644 --- a/bootx-services/service-iam/src/main/resources/mapper/UserDataScopeMapper.xml +++ b/bootx-services/service-iam/src/main/resources/mapper/UserDataRoleMapper.xml @@ -1,16 +1,16 @@ - + - INSERT INTO iam_user_data_scope - (id, user_id, data_scope_id) + INSERT INTO iam_user_data_role + (id, user_id, data_role_id) values - + ( #{o.id}, #{o.userId}, - #{o.dataScopeId} + #{o.dataRoleId} ) diff --git a/bootx-start/src/main/resources/db/migration/V1.3.5_231021__release.sql b/bootx-start/src/main/resources/db/migration/V1.3.5_231021__release.sql index 8100f512..06f20976 100644 --- a/bootx-start/src/main/resources/db/migration/V1.3.5_231021__release.sql +++ b/bootx-start/src/main/resources/db/migration/V1.3.5_231021__release.sql @@ -3438,7 +3438,7 @@ INSERT INTO `iam_perm_menu` VALUES (1452569339987472384, 'admin', 14145960524970 INSERT INTO `iam_perm_menu` VALUES (1452569691537256448, 'admin', 1414596052497092608, '用户信息', 'userAuth', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/system/userAuth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:36:17', 1399985191002447872, '2021-10-25 17:36:17', 2, 0); INSERT INTO `iam_perm_menu` VALUES (1452571269199540224, 'admin', 1414596052497092608, '系统配置', 'systemConfig', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/system/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:42:33', 1399985191002447872, '2021-10-25 17:42:33', 2, 0); INSERT INTO `iam_perm_menu` VALUES (1452638905302966272, 'admin', 1452571269199540224, '系统参数', 'SystemParam', '', NULL, '', b'0', b'0', 'system/param/SystemParamList', NULL, '/system/config/param', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 22:11:18', 1399985191002447872, '2021-10-25 22:11:18', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1474694545336676352, 'admin', 1452569339987472384, '数据范围权限', 'DataScope', '', NULL, '', b'0', b'0', 'system/scope/DataScopeList', NULL, '/system/permission/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-12-25 18:52:33', 1399985191002447872, '2021-12-25 18:52:33', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1474694545336676352, 'admin', 1452569339987472384, '数据范围权限', 'DataRole', '', NULL, '', b'0', b'0', 'system/scope/DataScopeList', NULL, '/system/permission/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-12-25 18:52:33', 1399985191002447872, '2021-12-25 18:52:33', 1, 0); INSERT INTO `iam_perm_menu` VALUES (1480839877352476672, 'admin', 1452567897717321728, '数据版本日志', 'DataVersionLog', NULL, b'0', '', b'0', b'0', 'starter/log/DataVersionLogList', NULL, '/monitor/log/DataVersionLog', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-01-11 17:51:54', 1399985191002447872, '2022-10-20 20:38:18', 1, 0); INSERT INTO `iam_perm_menu` VALUES (1490984296616263680, 'admin', 1552207982510706688, '文件管理', 'FIleUpLoad', NULL, b'0', '', b'0', b'0', 'develop/file/FileUploadList', NULL, '/develop/file', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-08 17:42:12', 1399985191002447872, '2022-07-28 09:16:56', 2, 0); INSERT INTO `iam_perm_menu` VALUES (1495013564652429312, 'admin', 1552207982510706688, '代码生成', 'CodeGen', NULL, b'0', '', b'0', b'0', 'develop/codegen/CodeGenList', NULL, '/develop/codegen', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-19 20:33:04', 1399985191002447872, '2022-07-27 16:25:05', 1, 0); -- Gitee From d8226524050c5e8fa124d4faf66d8b6101dd04ba Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Wed, 29 Nov 2023 11:54:47 +0800 Subject: [PATCH 17/38] =?UTF-8?q?ref=20=E6=95=B0=E6=8D=AE=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E5=88=86=E9=85=8D=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 6 +++--- .../platform/iam/core/scope/service/DataRoleService.java | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index dab8c4fe..ac8a765b 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,18 +1,18 @@ ## 1.3.6 -- 文件上传替换为基于`x-file-storage`定制 +- x 文件上传替换为基于`x-file-storage`定制 - 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 - Websocket连接管理页 - 可视化大屏端支持一键登录 - 密码过期后清除所有的权限,必须强制更改密码 - x 菜单权限 - x 请求权限 -- 密码安全配置设置为必填. 保存信息状态变为查看状态 +- x 密码安全配置设置为必填. 保存信息状态变为查看状态 - x 请求权限配置新建时偶发类型不可以更改 - x 新增和编辑用户时. 手机号和邮件校验有问题 - x 用户列表和详情字典显示有问题 - x 更新用户信息时, 脱敏的字段保存时未被忽略 - x 数据权限重构为数据角色, 用于管理数据权限相关配置 - - 增加关联部门及下级部门 + - x 增加关联部门及下级部门 - 数据集功能 ## 1.3.x、1.4.x - 接口平台功能 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataRoleService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataRoleService.java index 3b05aa2b..9728c0d4 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataRoleService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/scope/service/DataRoleService.java @@ -69,7 +69,6 @@ public class DataRoleService { public void update(DataRoleParam param) { DataRole dataRole = dataRoleManager.findById(param.getId()).orElseThrow(() -> new BizException("数据不存在")); BeanUtil.copyProperties(param, dataRole, CopyOptions.create().ignoreNullValue()); - dataRole.setType(null); dataRoleManager.updateById(dataRole); } -- Gitee From cd3ab7baba2cf4b7c4b4be2df5024782e13bbbdf Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Wed, 29 Nov 2023 23:26:12 +0800 Subject: [PATCH 18/38] =?UTF-8?q?ref=20websocket=20Demo=E6=9B=B4=E6=8D=A2?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 13 ++- .../controller/WebsocketAdminController.java | 14 +++ .../SpringWebSocketSessionManager.java | 16 ++- .../manager/WebSocketSessionManager.java | 2 +- .../notice/UserNoticeWebSocketHandler.java | 4 +- .../service/WebSocketAdminService.java | 22 +++-- .../bootx/platform/demo/ws/WebSocketDemo.java | 98 ------------------- .../platform/demo/ws/WebSocketDemoConfig.java | 29 ++++++ .../demo/ws/WebSocketDemoHandler.java | 89 +++++++++++++++++ .../src/main/resources/application-dev.yml | 3 +- .../src/main/resources/application-prod.yml | 3 + 11 files changed, 170 insertions(+), 123 deletions(-) delete mode 100644 bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemo.java create mode 100644 bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemoConfig.java create mode 100644 bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemoHandler.java diff --git a/_doc/Task.md b/_doc/Task.md index ac8a765b..2ae5b12d 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,9 +1,7 @@ ## 1.3.6 - x 文件上传替换为基于`x-file-storage`定制 -- 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 - Websocket连接管理页 -- 可视化大屏端支持一键登录 -- 密码过期后清除所有的权限,必须强制更改密码 +- x 密码过期后清除所有的权限,必须强制更改密码 - x 菜单权限 - x 请求权限 - x 密码安全配置设置为必填. 保存信息状态变为查看状态 @@ -13,9 +11,16 @@ - x 更新用户信息时, 脱敏的字段保存时未被忽略 - x 数据权限重构为数据角色, 用于管理数据权限相关配置 - x 增加关联部门及下级部门 -- 数据集功能 +- 更新WebSocket的Demo样例 + +## 1.3.7 +- 角色分配后支持收回, 结构 Uid/Rid/分配者Id 通过分配者ID进行级联收回 +- 角色支持分配权限(Admin分配给B 权限X,B又分配给了C 权限X,Admin收回B的权限X时, C的X权限也会被收回) ## 1.3.x、1.4.x - 接口平台功能 +- 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 +- 可视化大屏端支持一键登录 +- 数据集功能 - 接入LiteFLow - PostgreSQL 数据库适配 - 添加短信模板功能, 可以与各短信商渠道进行同步 diff --git a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/controller/WebsocketAdminController.java b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/controller/WebsocketAdminController.java index 816b2f52..6a52e81f 100644 --- a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/controller/WebsocketAdminController.java +++ b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/controller/WebsocketAdminController.java @@ -1,8 +1,14 @@ package cn.bootx.platform.common.websocket.controller; +import cn.bootx.platform.common.core.rest.Res; +import cn.bootx.platform.common.core.rest.ResResult; +import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.websocket.service.WebSocketAdminService; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,4 +23,12 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor public class WebsocketAdminController { private final WebSocketAdminService webSocketAdminService; + + @Operation(summary = "分页") + @GetMapping("/page") + public ResResult page(@ParameterObject PageParam param){ + webSocketAdminService.page(); + return Res.ok(); + } + } diff --git a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/manager/SpringWebSocketSessionManager.java b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/manager/SpringWebSocketSessionManager.java index 57c902d9..fe05688e 100644 --- a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/manager/SpringWebSocketSessionManager.java +++ b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/manager/SpringWebSocketSessionManager.java @@ -19,19 +19,17 @@ import java.util.stream.Collectors; * @author xxm * @since 2022/5/27 */ +@Getter public class SpringWebSocketSessionManager { // session缓存 - @Getter - private static final Map sessionPool = new ConcurrentSkipListMap<>(); + private final Map sessionPool = new ConcurrentSkipListMap<>(); // sessionId 与 用户标识id 的映射关系 n:1 - @Getter - private static final Map sid2uid = new ConcurrentSkipListMap<>(); + private final Map sid2uid = new ConcurrentSkipListMap<>(); // 用户标识id 与 sessionId 的映射关系 1:n - @Getter - private static final Map> uid2sid = new ConcurrentSkipListMap<>(); + private final Map> uid2sid = new ConcurrentSkipListMap<>(); /** * 添加会话session关联 @@ -69,10 +67,10 @@ public class SpringWebSocketSessionManager { } /** - * 根据id获取关联的session列表 + * 根据userId获取关联的session列表 */ - public List getSessionsById(String id) { - List sessionIds = Optional.ofNullable(uid2sid.get(id)).orElse(Lists.newArrayList()); + public List getSessionsByUserId(String userId) { + List sessionIds = Optional.ofNullable(uid2sid.get(userId)).orElse(Lists.newArrayList()); return sessionIds.stream().map(sessionPool::get).collect(Collectors.toList()); } diff --git a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/manager/WebSocketSessionManager.java b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/manager/WebSocketSessionManager.java index 6bf60a1f..aa6c1d29 100644 --- a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/manager/WebSocketSessionManager.java +++ b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/manager/WebSocketSessionManager.java @@ -9,7 +9,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; /** - * websocket管理器 (java原生) + * websocket管理器 (java原生, 进攻演示, 通常使用 SpringWebSocketSessionManager ) * * @author xxm * @since 2022/5/27 diff --git a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/notice/UserNoticeWebSocketHandler.java b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/notice/UserNoticeWebSocketHandler.java index c24dbd8e..c9d21896 100644 --- a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/notice/UserNoticeWebSocketHandler.java +++ b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/notice/UserNoticeWebSocketHandler.java @@ -61,7 +61,7 @@ public class UserNoticeWebSocketHandler extends TextWebSocketHandler { @Override public void handleTextMessage(WebSocketSession session, TextMessage message) { // 不处理接收的消息, 通常只会接收到心跳请求 - // log.debug("心跳请求"); +// log.debug("心跳请求"); } /** @@ -77,7 +77,7 @@ public class UserNoticeWebSocketHandler extends TextWebSocketHandler { */ public void sendMessageByUser(String message, Long userId) { try { - List sessions = wsManager.getSessionsById(String.valueOf(userId)); + List sessions = wsManager.getSessionsByUserId(String.valueOf(userId)); for (WebSocketSession session : sessions) { session.sendMessage(new TextMessage(message)); diff --git a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/service/WebSocketAdminService.java b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/service/WebSocketAdminService.java index 74fb8191..69343db5 100644 --- a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/service/WebSocketAdminService.java +++ b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/service/WebSocketAdminService.java @@ -1,9 +1,9 @@ package cn.bootx.platform.common.websocket.service; import cn.bootx.platform.common.websocket.manager.SpringWebSocketSessionManager; +import cn.bootx.platform.common.websocket.notice.UserNoticeWebSocketHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import lombok.val; import org.springframework.stereotype.Service; import org.springframework.web.socket.WebSocketSession; @@ -21,25 +21,31 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class WebSocketAdminService { - /** * 分页 */ public void page(){ - Map> uid2sid = SpringWebSocketSessionManager.getUid2sid(); + SpringWebSocketSessionManager wsManager = UserNoticeWebSocketHandler.getWsManager(); + + // 获取用户ids + Map> uid2sid = wsManager.getUid2sid(); + for (String uid : uid2sid.keySet()) { + // 组装用户信息 + } } /** * 获取用户链接数 */ - public void getByUserId(String userId){ - List sessionIds = SpringWebSocketSessionManager.getUid2sid() + public void getSessionByUserId(String userId){ + SpringWebSocketSessionManager wsManager = UserNoticeWebSocketHandler.getWsManager(); + List sessionIds = wsManager.getUid2sid() .get(userId); - Map sessionPool = SpringWebSocketSessionManager.getSessionPool(); + Map sessionPool = wsManager.getSessionPool(); // 组装用户信息 - val userSession = sessionIds.stream() + List userSession = sessionIds.stream() .map(sessionPool::get) - .map(session->{ + .map(session -> { System.out.println(session.getRemoteAddress()); return session; }) diff --git a/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemo.java b/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemo.java deleted file mode 100644 index 56ce5764..00000000 --- a/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemo.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.bootx.platform.demo.ws; - -import cn.bootx.platform.common.websocket.manager.WebSocketSessionManager; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.websocket.*; -import javax.websocket.server.PathParam; -import javax.websocket.server.ServerEndpoint; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * websocket demo - * - * @author xxm - * @since 2022/3/27 - */ -@Slf4j -@Component -@ServerEndpoint("/test/ws/{userId}") -public class WebSocketDemo { - - private final WebSocketSessionManager wsManager = new WebSocketSessionManager(); - - /** 记录当前在线连接数 */ - private static final AtomicInteger onlineCount = new AtomicInteger(0); - - /** - * 连接建立成功调用的方法 - */ - @OnOpen - public void onOpen(@PathParam("userId") Long userId, Session session) { - wsManager.addSession(String.valueOf(userId), session); - onlineCount.incrementAndGet(); // 在线数加1 - log.info("有新连接加入:{},当前在线人数为:{}", userId, onlineCount.get()); - } - - /** - * 连接关闭调用的方法 - */ - @OnClose - public void onClose(Session session) { - onlineCount.decrementAndGet(); // 在线数减1 - String userId = wsManager.getIdBySession(session); - wsManager.removeSession(session); - log.info("有一连接关闭:{},当前在线人数为:{}", userId, onlineCount.get()); - } - - /** - * 收到客户端消息后调用的方法 - * @param message 客户端发送过来的消息 - */ - @OnMessage - public void onMessage(String message, Session session) { - Long userId = Long.valueOf(wsManager.getIdBySession(session)); - log.info("服务端收到客户端[{}]的消息:{}", userId, message); - this.sendMessage("响应: " + message, userId); - } - - @OnError - public void onError(Session session, Throwable error) { - log.error("{} 发生错误", session.getId()); - error.printStackTrace(); - } - - /** - * 服务端发送消息给客户端(单发) - */ - public void sendMessage(String message, Long userId) { - try { - List sessions = wsManager.getSessionsById(String.valueOf(userId)); - - for (Session session : sessions) { - session.getBasicRemote().sendText(message); - } - } - catch (Exception e) { - log.error("服务端发送消息给客户端失败:", e); - } - } - - /** - * 服务端发送消息给客户端(全发) - */ - public void sendMessage(String message) { - try { - List sessions = wsManager.getSessions(); - for (Session session : sessions) { - session.getBasicRemote().sendText(message); - } - } - catch (Exception e) { - log.error("服务端发送消息给客户端失败:", e); - } - } - -} diff --git a/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemoConfig.java b/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemoConfig.java new file mode 100644 index 00000000..65301ee2 --- /dev/null +++ b/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemoConfig.java @@ -0,0 +1,29 @@ +package cn.bootx.platform.demo.ws; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; + +/** + * + * @author xxm + * @since 2023/11/29 + */ +@Configuration +@RequiredArgsConstructor +public class WebSocketDemoConfig implements WebSocketConfigurer { + private final WebSocketDemoHandler webSocketDemoHandler; + + /** + * 拦截器 + */ + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry + // WebSocket 连接处理器 + .addHandler(webSocketDemoHandler, "/test/ws") + // 允许跨域 + .setAllowedOrigins("*"); + } +} diff --git a/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemoHandler.java b/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemoHandler.java new file mode 100644 index 00000000..60ba07e0 --- /dev/null +++ b/bootx-demo/src/main/java/cn/bootx/platform/demo/ws/WebSocketDemoHandler.java @@ -0,0 +1,89 @@ +package cn.bootx.platform.demo.ws; + +import cn.bootx.platform.common.websocket.manager.SpringWebSocketSessionManager; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.stereotype.Service; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Websock Spring 演示 + * @author xxm + * @since 2023/11/29 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WebSocketDemoHandler extends TextWebSocketHandler { + + + /** websocket连接管理器 */ + @Getter + private static final SpringWebSocketSessionManager wsManager = new SpringWebSocketSessionManager(); + + /** 记录当前在线连接数 */ + private static final AtomicInteger onlineCount = new AtomicInteger(0); + + /** + * 连接建立成功调用的方法 + */ + @Override + public void afterConnectionEstablished(WebSocketSession session) { + Map sessionPool = wsManager.getSessionPool(); + sessionPool.put(session.getId(),session); + onlineCount.incrementAndGet(); // 在线数加1 + this.sendMessage("连接成功",session.getId()); + log.info("有新连接加入,当前在线人数为:{}", onlineCount.get()); + } + + /** + * 关闭 + */ + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { + onlineCount.decrementAndGet(); // 在线数减1 + String userId = wsManager.getIdBySession(session); + wsManager.removeSession(session); + log.info("有一连接关闭,当前在线人数为:{}", onlineCount.get()); + } + + /** + * 接收消息 + */ + @Override + public void handleTextMessage(WebSocketSession session, TextMessage message) { + log.info("服务端收到客户端的消息:{}", message); + this.sendMessage("响应: " + message, session.getId()); + } + + /** + * 错误 + */ + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) { + log.error("{} 发生错误", session.getId()); + } + + + /** + * 服务端发送消息给客户端(单发) + */ + public void sendMessage(String message, String sid) { + try { + val session = wsManager.getSessionPool().get(sid); + session.sendMessage(new TextMessage(message)); + } + catch (Exception e) { + log.error("服务端发送消息给客户端失败:", e); + } + } + +} diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml index e3f74a9c..7582ffde 100644 --- a/bootx-start/src/main/resources/application-dev.yml +++ b/bootx-start/src/main/resources/application-dev.yml @@ -125,11 +125,12 @@ bootx: "[认证与权限]": - cn.bootx.platform.starter.auth - cn.bootx.platform.starter.data.perm - "[其他starter组件]": + "[其他组件]": - cn.bootx.platform.starter.audit.log - cn.bootx.platform.starter.file - cn.bootx.platform.starter.quartz - cn.bootx.platform.starter.monitor + - cn.bootx.platform.common.websocket # 缓存 cache: # 默认超时时间 30分钟 diff --git a/bootx-start/src/main/resources/application-prod.yml b/bootx-start/src/main/resources/application-prod.yml index 18585e07..3e55a2a7 100644 --- a/bootx-start/src/main/resources/application-prod.yml +++ b/bootx-start/src/main/resources/application-prod.yml @@ -59,6 +59,9 @@ spring: threadCount: 10 threadPriority: 5 threadsInheritContextClassLoaderOfInitializingThread: true +knife4j: + enable: true + production: true # 项目配置 bootx: common: -- Gitee From ac1e9a40a0c7f426913e078c84b94f210987a954 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Mon, 4 Dec 2023 17:28:07 +0800 Subject: [PATCH 19/38] =?UTF-8?q?feat=20=E5=9C=A8=E7=BA=BF=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=8A=9F=E8=83=BD=E5=92=8C=E5=8D=87=E7=BA=A7justauth?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/auth/online/OnlineUserDto.java | 53 --------- .../auth/online/OnlineUserService.java | 107 ------------------ .../controller/WebsocketAdminController.java | 34 ------ .../iam}/controller/OnlineUserController.java | 36 +++--- .../online/service/OnlineUserService.java | 58 +++++++--- .../iam/core/user/convert/UserConvert.java | 3 + .../iam/core/user/entity/UserInfo.java | 5 + .../iam/dto/online/OnlineUserInfoDto.java | 38 +++++++ .../iam/dto/online/OnlineUserSessionDto.java | 27 +++++ .../platform/iam/dto/user/UserInfoDto.java | 3 - pom.xml | 2 +- 11 files changed, 134 insertions(+), 232 deletions(-) delete mode 100644 bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/online/OnlineUserDto.java delete mode 100644 bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/online/OnlineUserService.java delete mode 100644 bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/controller/WebsocketAdminController.java rename {bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth => bootx-services/service-iam/src/main/java/cn/bootx/platform/iam}/controller/OnlineUserController.java (51%) rename bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/service/WebSocketAdminService.java => bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/online/service/OnlineUserService.java (34%) create mode 100644 bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/online/OnlineUserInfoDto.java create mode 100644 bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/online/OnlineUserSessionDto.java diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/online/OnlineUserDto.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/online/OnlineUserDto.java deleted file mode 100644 index 252f2b69..00000000 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/online/OnlineUserDto.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.bootx.platform.starter.auth.online; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author xxm - * @since 2021/9/8 - */ -@Data -@Accessors(chain = true) -@Schema(title = "在线用户") -public class OnlineUserDto { - - @Schema(description = "用户id") - private Long userId; - - @Schema(description = "会话id") - private String sessionId; - - @Schema(description = "用户名称") - private String name; - - @Schema(description = "用户账号") - private String userName; - - @Schema(description = "创建时间") - private LocalDateTime creationTime; - - @Schema(description = "剩余有效时间(秒)") - private Long timeout; - - @Schema(description = "Token列表") - private List tokenSigns; - - @Data - @Accessors(chain = true) - @Schema(title = "Token签名") - public static class TokenSign { - - @Schema(description = "token值") - private String value; - - @Schema(description = "所在设备标识") - private String device; - - } - -} diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/online/OnlineUserService.java b/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/online/OnlineUserService.java deleted file mode 100644 index 81e0dd5c..00000000 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/online/OnlineUserService.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.bootx.platform.starter.auth.online; - -import cn.bootx.platform.common.core.annotation.OperateLog; -import cn.bootx.platform.common.core.code.CommonCode; -import cn.bootx.platform.common.core.entity.UserDetail; -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.dev33.satoken.session.SaSession; -import cn.dev33.satoken.stp.StpUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * 在线用户 - * - * @author xxm - * @since 2021/9/8 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class OnlineUserService { - - @SuppressWarnings("FieldCanBeLocal") - private final String SessionPattern = "AccessToken:login:session:*"; - - private final StringRedisTemplate stringRedisTemplate; - - private final RedisTemplate objectRedisTemplate; - - /** - * 分页查询 - */ - public PageResult page(PageParam pageParam) { - ArrayList keys = Optional.ofNullable(stringRedisTemplate.keys(SessionPattern)) - .map(ArrayList::new) - .orElseGet(ArrayList::new); - List list = new ArrayList<>(); - int start = pageParam.start(); - int end = pageParam.end(); - for (int i = start; i < end; i++) { - if (i >= keys.size()) { - break; - } - else { - list.add(keys.get(i)); - } - } - List onlineUsers = Optional.ofNullable(objectRedisTemplate.opsForValue().multiGet(list)) - .orElseGet(ArrayList::new) - .stream() - .map(this::convert) - .collect(Collectors.toList()); - return new PageResult().setCurrent(pageParam.getCurrent()) - .setSize(pageParam.getSize()) - .setTotal(keys.size()) - .setRecords(onlineUsers); - } - - /** - * 获取单条 - */ - public OnlineUserDto findBySessionId(String sessionId) { - SaSession saSession = Optional.ofNullable(objectRedisTemplate.opsForValue().get(sessionId)) - .orElseThrow(() -> new BizException("会话不存在")); - return this.convert(saSession); - } - - /** - * 转换if在线用户对象 - */ - private OnlineUserDto convert(SaSession saSession) { - UserDetail userDetail = saSession.getModel(CommonCode.USER, UserDetail.class); - List tokenSignList = saSession.getTokenSignList() - .stream() - .map(tokenSign -> new OnlineUserDto.TokenSign().setDevice(tokenSign.getDevice()) - .setValue(tokenSign.getValue())) - .collect(Collectors.toList()); - - return new OnlineUserDto().setUserId(userDetail.getId()) - .setUserName(userDetail.getUsername()) - .setName(userDetail.getName()) - .setTimeout(saSession.getTimeout()) - .setCreationTime(LocalDateTimeUtil.of(saSession.getCreateTime())) - .setSessionId(saSession.getId()) - .setTokenSigns(tokenSignList); - } - - /** - * 下线 - */ - @OperateLog(title = "强退用户", businessType = OperateLog.BusinessType.FORCE, saveParam = true) - public void logoutByUserId(Long userId) { - StpUtil.kickout(userId); - } - -} diff --git a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/controller/WebsocketAdminController.java b/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/controller/WebsocketAdminController.java deleted file mode 100644 index 6a52e81f..00000000 --- a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/controller/WebsocketAdminController.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.common.websocket.controller; - -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.websocket.service.WebSocketAdminService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springdoc.api.annotations.ParameterObject; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * - * @author xxm - * @since 2023/10/15 - */ -@Tag(name = "websocket会话管理") -@RestController -@RequestMapping("/websocket/admin") -@RequiredArgsConstructor -public class WebsocketAdminController { - private final WebSocketAdminService webSocketAdminService; - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult page(@ParameterObject PageParam param){ - webSocketAdminService.page(); - return Res.ok(); - } - -} diff --git a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/controller/OnlineUserController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/OnlineUserController.java similarity index 51% rename from bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/controller/OnlineUserController.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/OnlineUserController.java index d52a3123..2ce461cd 100644 --- a/bootx-common-starters/common-starter-auth/src/main/java/cn/bootx/platform/starter/auth/controller/OnlineUserController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/OnlineUserController.java @@ -1,44 +1,42 @@ -package cn.bootx.platform.starter.auth.controller; +package cn.bootx.platform.iam.controller; import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.starter.auth.online.OnlineUserDto; -import cn.bootx.platform.starter.auth.online.OnlineUserService; +import cn.bootx.platform.iam.core.online.service.OnlineUserService; +import cn.bootx.platform.iam.dto.online.OnlineUserInfoDto; +import cn.bootx.platform.iam.dto.online.OnlineUserSessionDto; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + +/** + * 在线用户 + * @author xxm + * @since 2023/12/4 + */ @Tag(name = "在线用户") @RestController -@RequestMapping("/user/online") +@RequestMapping("/online/user") @RequiredArgsConstructor public class OnlineUserController { - private final OnlineUserService onlineUserService; @Operation(summary = "分页") @GetMapping("/page") - public ResResult> page(PageParam pageParam) { + public ResResult> page(PageParam pageParam){ return Res.ok(onlineUserService.page(pageParam)); } - @Operation(summary = "获取单条") - @GetMapping("/findBySessionId") - public ResResult findBySessionId(String sessionId) { - return Res.ok(onlineUserService.findBySessionId(sessionId)); + @Operation(summary = "获取用户链接信息") + @GetMapping("/getSessionByUserId") + public ResResult> getSessionByUserId(String userId){ + return Res.ok(onlineUserService.getSessionByUserId(userId)); } - - @Operation(summary = "踢人下线") - @PostMapping("/logoutByUserId") - public ResResult logoutByUserId(Long userId) { - onlineUserService.logoutByUserId(userId); - return Res.ok(); - } - } diff --git a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/service/WebSocketAdminService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/online/service/OnlineUserService.java similarity index 34% rename from bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/service/WebSocketAdminService.java rename to bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/online/service/OnlineUserService.java index 69343db5..065df6c4 100644 --- a/bootx-commons/common-websocket/src/main/java/cn/bootx/platform/common/websocket/service/WebSocketAdminService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/online/service/OnlineUserService.java @@ -1,7 +1,14 @@ -package cn.bootx.platform.common.websocket.service; +package cn.bootx.platform.iam.core.online.service; +import cn.bootx.platform.common.core.rest.PageResult; +import cn.bootx.platform.common.core.rest.param.PageParam; +import cn.bootx.platform.common.core.util.CollUtil; import cn.bootx.platform.common.websocket.manager.SpringWebSocketSessionManager; import cn.bootx.platform.common.websocket.notice.UserNoticeWebSocketHandler; +import cn.bootx.platform.iam.core.user.dao.UserInfoManager; +import cn.bootx.platform.iam.core.user.entity.UserInfo; +import cn.bootx.platform.iam.dto.online.OnlineUserInfoDto; +import cn.bootx.platform.iam.dto.online.OnlineUserSessionDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -9,6 +16,9 @@ import org.springframework.web.socket.WebSocketSession; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -19,36 +29,54 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class WebSocketAdminService { - +public class OnlineUserService { + private final UserInfoManager userInfoManager; /** - * 分页 + * 在线用户分页 */ - public void page(){ + public PageResult page(PageParam pageParam){ SpringWebSocketSessionManager wsManager = UserNoticeWebSocketHandler.getWsManager(); - // 获取用户ids Map> uid2sid = wsManager.getUid2sid(); - for (String uid : uid2sid.keySet()) { // 组装用户信息 + Set idSet = uid2sid.keySet(); + if (CollUtil.isNotEmpty(idSet)){ + List ids = CollUtil.sub(idSet, pageParam.start(), pageParam.end()) + .stream() + .map(Long::parseLong) + .collect(Collectors.toList()); + Map userMap = userInfoManager.findAllByIds(ids) + .stream() + .collect(Collectors.toMap(UserInfo::getId, Function.identity())); + List onlineUserInfos = ids.stream() + .map(userMap::get) + .filter(Objects::nonNull) + .map(UserInfo::toOnline) + .collect(Collectors.toList()); + return new PageResult() + .setRecords(onlineUserInfos) + .setSize(pageParam.getSize()) + .setTotal(idSet.size()) + .setCurrent(pageParam.getCurrent()); } + return new PageResult<>(); } /** - * 获取用户链接数 + * 获取用户链接信息 */ - public void getSessionByUserId(String userId){ + public List getSessionByUserId(String userId){ SpringWebSocketSessionManager wsManager = UserNoticeWebSocketHandler.getWsManager(); List sessionIds = wsManager.getUid2sid() .get(userId); Map sessionPool = wsManager.getSessionPool(); - // 组装用户信息 - List userSession = sessionIds.stream() + return sessionIds.stream() .map(sessionPool::get) - .map(session -> { - System.out.println(session.getRemoteAddress()); - return session; - }) + .map(session -> new OnlineUserSessionDto() + .setSessionId(session.getId()) + .setIp(session.getRemoteAddress().getAddress().getHostAddress()) + .setUri(session.getUri().toString()) + ) .collect(Collectors.toList()); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/convert/UserConvert.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/convert/UserConvert.java index 06368e77..38fd47f4 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/convert/UserConvert.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/convert/UserConvert.java @@ -1,5 +1,6 @@ package cn.bootx.platform.iam.core.user.convert; +import cn.bootx.platform.iam.dto.online.OnlineUserInfoDto; import cn.bootx.platform.iam.param.user.UserInfoParam; import cn.bootx.platform.iam.core.user.entity.UserExpandInfo; import cn.bootx.platform.iam.core.user.entity.UserInfo; @@ -19,4 +20,6 @@ public interface UserConvert { UserExpandInfoDto convert(UserExpandInfo in); + OnlineUserInfoDto toOnline(UserInfo in); + } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserInfo.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserInfo.java index 96794d97..106bd710 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserInfo.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/user/entity/UserInfo.java @@ -6,6 +6,7 @@ import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.common.mybatisplus.handler.LongListTypeHandler; import cn.bootx.platform.iam.code.UserStatusCode; import cn.bootx.platform.iam.core.user.convert.UserConvert; +import cn.bootx.platform.iam.dto.online.OnlineUserInfoDto; import cn.bootx.platform.iam.dto.user.UserInfoDto; import cn.bootx.platform.iam.param.user.UserInfoParam; import com.baomidou.mybatisplus.annotation.TableField; @@ -61,6 +62,10 @@ public class UserInfo extends MpBaseEntity implements EntityBaseFunction2.4.0 2.9.7 1.36.0 - 1.16.5 + 1.16.6 8.5.4 5.6.155 3.1.0 -- Gitee From 9751c1c32818b9d86f90738e47daea913d3aec6e Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Tue, 5 Dec 2023 17:29:52 +0800 Subject: [PATCH 20/38] =?UTF-8?q?feat=20=E8=A7=92=E8=89=B2=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=A0=91=E7=8A=B6=E7=BB=93=E6=9E=84,=20?= =?UTF-8?q?=E5=AD=90=E5=AD=99=E8=A7=92=E8=89=B2=E6=94=AF=E6=8C=81=E7=BA=A7?= =?UTF-8?q?=E8=81=94=E6=96=B0=E5=A2=9E=E5=92=8C=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 3 +- .../common/core/util/TreeBuildUtil.java | 34 ++++- .../parameter/entity/SystemParameter.java | 2 +- .../core/template/entity/GeneralTemplate.java | 5 +- .../bootx/platform/iam/code/IamErrorCode.java | 3 + .../iam/controller/RoleController.java | 6 + .../iam/controller/RoleMenuController.java | 4 +- .../iam/core/permission/entity/PermMenu.java | 8 +- .../permission/service/PermMenuService.java | 3 +- .../iam/core/role/dao/RoleManager.java | 3 + .../platform/iam/core/role/entity/Role.java | 3 + .../iam/core/role/service/RoleService.java | 89 ++++++++++++- .../iam/core/upms/dao/RoleMenuManager.java | 11 ++ .../iam/core/upms/entity/RoleMenu.java | 4 +- .../core/upms/service/RolePermService.java | 119 ++++++++++++------ .../bootx/platform/iam/dto/role/RoleDto.java | 9 +- .../role/RoleHaschildrenException.java | 17 +++ .../platform/iam/param/role/RoleParam.java | 3 + .../iam/param/upms/RolePermissionParam.java | 10 +- .../core/sms/entity/SmsChannelConfig.java | 9 +- pom.xml | 2 +- 21 files changed, 277 insertions(+), 70 deletions(-) create mode 100644 bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/exception/role/RoleHaschildrenException.java diff --git a/_doc/Task.md b/_doc/Task.md index 2ae5b12d..36295069 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -14,7 +14,8 @@ - 更新WebSocket的Demo样例 ## 1.3.7 -- 角色分配后支持收回, 结构 Uid/Rid/分配者Id 通过分配者ID进行级联收回 +- 角色结构改为树形结构 +- 角色删除分配的权限后, 支持进行级联收回, 也可以级联分配给下级 - 角色支持分配权限(Admin分配给B 权限X,B又分配给了C 权限X,Admin收回B的权限X时, C的X权限也会被收回) ## 1.3.x、1.4.x - 接口平台功能 diff --git a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/util/TreeBuildUtil.java b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/util/TreeBuildUtil.java index c67e143f..632c2cd2 100644 --- a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/util/TreeBuildUtil.java +++ b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/util/TreeBuildUtil.java @@ -3,6 +3,7 @@ package cn.bootx.platform.common.core.util; import cn.hutool.core.collection.CollectionUtil; import lombok.experimental.UtilityClass; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -28,7 +29,7 @@ public class TreeBuildUtil { * @param setChildren 设置子节点列表的方法引用 */ public List build(List list, Object pid, Function getId, Function getPid, - BiConsumer> setChildren) { + BiConsumer> setChildren) { return build(list, pid, getId, getPid, setChildren, null); } @@ -42,7 +43,7 @@ public class TreeBuildUtil { * @param comparator 节点顺序的排序规则 */ public List build(List list, Object pid, Function getId, Function getPid, - BiConsumer> setChildren, Comparator comparator) { + BiConsumer> setChildren, Comparator comparator) { List children = list.stream().filter(m -> Objects.equals(getPid.apply(m), pid)).collect(Collectors.toList()); if (CollectionUtil.isEmpty(children)) { return null; @@ -58,4 +59,33 @@ public class TreeBuildUtil { return children; } + /** + * 展开树为list列表 + * + * @param list 要进行展开的列表 + * @param getChildren 获取子节点列表的方法引用 + * @return 展开后的结果列表 + */ + public List unfold(List list, Function> getChildren){ + return unfold(list,getChildren, new ArrayList<>()); + } + + /** + * 展开树为list列表 + * + * @param list 要进行展开的列表 + * @param getChildren 获取子节点列表的方法引用 + * @param result 用于存储展开后的列表对象 + * @return 展开后的结果列表 + */ + private List unfold(List list, Function> getChildren, List result){ + if (CollectionUtil.isEmpty(list)) { + return null; + } + for (T region : list) { + unfold(getChildren.apply(region), getChildren, result); + result.add(region); + } + return result; + } } diff --git a/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/core/parameter/entity/SystemParameter.java b/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/core/parameter/entity/SystemParameter.java index 58676f5f..0172bb93 100644 --- a/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/core/parameter/entity/SystemParameter.java +++ b/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/core/parameter/entity/SystemParameter.java @@ -40,7 +40,7 @@ public class SystemParameter extends MpBaseEntity implements EntityBaseFunction< private Boolean enable; /** 内置参数 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.NEVER) private boolean internal; /** 备注 */ diff --git a/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/core/template/entity/GeneralTemplate.java b/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/core/template/entity/GeneralTemplate.java index 7f524072..029a03c4 100644 --- a/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/core/template/entity/GeneralTemplate.java +++ b/bootx-services/service-baseapi/src/main/java/cn/bootx/platform/baseapi/core/template/entity/GeneralTemplate.java @@ -1,12 +1,11 @@ package cn.bootx.platform.baseapi.core.template.entity; -import cn.bootx.table.modify.annotation.DbComment; -import cn.bootx.table.modify.annotation.DbTable; import cn.bootx.platform.baseapi.core.template.convert.GeneralTemplateConvert; import cn.bootx.platform.baseapi.dto.template.GeneralTemplateDto; import cn.bootx.platform.baseapi.param.template.GeneralTemplateParam; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; +import cn.bootx.table.modify.annotation.DbComment; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -57,7 +56,7 @@ public class GeneralTemplate extends MpBaseEntity implements EntityBaseFunction< /** 文件ID */ @DbComment("文件ID") - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.NEVER) private Long fileId; /** 备注 */ diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/code/IamErrorCode.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/code/IamErrorCode.java index 43cd6030..89d1e6c5 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/code/IamErrorCode.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/code/IamErrorCode.java @@ -52,6 +52,9 @@ public interface IamErrorCode { /** 角色已经被使用 */ int ROLE_ALREADY_USED = 21027; + /** 含有下级角色 */ + int ROLE_HAS_CHILD = 21028; + /** 权限操作错误 */ int PERMISSION_DB_ERROR = 21028; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleController.java index b3b4cee2..4c967a9b 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleController.java @@ -43,6 +43,12 @@ public class RoleController { return Res.ok(); } + @Operation(summary = "角色树") + @GetMapping("/tree") + public ResResult> tree(){ + return Res.ok(roleService.tree()); + } + @Operation(summary = "修改角色(返回角色对象)") @PostMapping(value = "/update") public ResResult update(@RequestBody RoleParam roleParam) { diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java index 3bb11af7..5e6e26fc 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java @@ -31,8 +31,8 @@ public class RoleMenuController { @Operation(summary = "保存请求权限关系") @PostMapping("/save") public ResResult save(@RequestBody RolePermissionParam param) { - ValidationUtil.validateParam(param, RolePermissionParam.PermMenu.class); - rolePermService.save(param.getRoleId(), param.getClientCode(), param.getPermissionIds()); + ValidationUtil.validateParam(param); + rolePermService.save(param.getRoleId(), param.getClientCode(), param.getPermissionIds(),param.isUpdateChildren()); return Res.ok(true); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/entity/PermMenu.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/entity/PermMenu.java index 0486b8a6..9ad3006e 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/entity/PermMenu.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/entity/PermMenu.java @@ -1,18 +1,18 @@ package cn.bootx.platform.iam.core.permission.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.iam.core.permission.convert.PermConvert; -import cn.bootx.platform.iam.param.permission.PermMenuParam; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.iam.code.PermissionCode; +import cn.bootx.platform.iam.core.permission.convert.PermConvert; import cn.bootx.platform.iam.dto.permission.PermMenuDto; +import cn.bootx.platform.iam.param.permission.PermMenuParam; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import static com.baomidou.mybatisplus.annotation.FieldStrategy.IGNORED; +import static com.baomidou.mybatisplus.annotation.FieldStrategy.NEVER; /** * 权限配置 @@ -27,7 +27,7 @@ import static com.baomidou.mybatisplus.annotation.FieldStrategy.IGNORED; public class PermMenu extends MpBaseEntity implements EntityBaseFunction { /** 父id */ - @TableField(updateStrategy = IGNORED) + @TableField(updateStrategy = NEVER) private Long parentId; /** 关联终端code */ diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/service/PermMenuService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/service/PermMenuService.java index c933bfd4..686bfb69 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/service/PermMenuService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/service/PermMenuService.java @@ -29,7 +29,7 @@ import java.util.stream.Collectors; import static cn.bootx.platform.iam.code.CachingCode.USER_PERM_CODE; /** - * 权限 + * 菜单权限 * * @author xxm * @since 2021/8/3 @@ -54,6 +54,7 @@ public class PermMenuService { if (PermissionCode.MENU_TYPE_TOP.equals(param.getMenuType())) { param.setParentId(null); } + // 增加判断是否循环依赖情况 PermMenu permission = PermMenu.init(param); return permMenuManager.save(permission).toDto(); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/dao/RoleManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/dao/RoleManager.java index ad89763a..482f62a0 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/dao/RoleManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/dao/RoleManager.java @@ -64,4 +64,7 @@ public class RoleManager extends BaseManager { .page(mpPage); } + public boolean existsByPid(Long roleId) { + return lambdaQuery().eq(Role::getPid, roleId).exists(); + } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/entity/Role.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/entity/Role.java index 7ef021db..23776e0e 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/entity/Role.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/entity/Role.java @@ -31,6 +31,9 @@ public class Role extends MpBaseEntity implements EntityBaseFunction { /** 是否系统内置 不能修改 */ private boolean internal; + /** 父级Id */ + private Long pid; + /** 描述 */ private String remark; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/service/RoleService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/service/RoleService.java index afbc43b1..879dbd20 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/service/RoleService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/service/RoleService.java @@ -1,25 +1,32 @@ package cn.bootx.platform.iam.core.role.service; +import cn.bootx.platform.common.core.entity.UserDetail; import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.dto.KeyValue; import cn.bootx.platform.common.core.rest.param.PageParam; import cn.bootx.platform.common.core.util.ResultConvertUtil; +import cn.bootx.platform.common.core.util.TreeBuildUtil; import cn.bootx.platform.common.mybatisplus.util.MpUtil; +import cn.bootx.platform.iam.core.role.dao.RoleManager; +import cn.bootx.platform.iam.core.role.entity.Role; import cn.bootx.platform.iam.core.upms.dao.RoleMenuManager; import cn.bootx.platform.iam.core.upms.dao.RolePathManager; import cn.bootx.platform.iam.core.upms.dao.UserRoleManager; +import cn.bootx.platform.iam.core.upms.entity.UserRole; +import cn.bootx.platform.iam.dto.role.RoleDto; import cn.bootx.platform.iam.event.role.RoleCreateEvent; import cn.bootx.platform.iam.event.role.RoleDeleteEvent; import cn.bootx.platform.iam.event.role.RoleUpdateEvent; import cn.bootx.platform.iam.exception.role.RoleAlreadyExistedException; import cn.bootx.platform.iam.exception.role.RoleAlreadyUsedException; +import cn.bootx.platform.iam.exception.role.RoleHaschildrenException; import cn.bootx.platform.iam.exception.role.RoleNotExistedException; import cn.bootx.platform.iam.param.role.RoleParam; -import cn.bootx.platform.iam.core.role.dao.RoleManager; -import cn.bootx.platform.iam.core.role.entity.Role; -import cn.bootx.platform.iam.dto.role.RoleDto; +import cn.bootx.platform.starter.auth.exception.NotLoginException; +import cn.bootx.platform.starter.auth.util.SecurityUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.collection.ListUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; @@ -27,8 +34,11 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import static cn.bootx.platform.iam.code.CachingCode.USER_PATH; @@ -58,7 +68,7 @@ public class RoleService { */ @Transactional(rollbackFor = Exception.class) public void add(RoleParam roleParam) { - // Name唯一性校验(名称code不能相同) + // name和code唯一性校验 if (roleManager.existsByCode(roleParam.getCode())) { throw new RoleAlreadyExistedException(); } @@ -76,7 +86,8 @@ public class RoleService { @Transactional(rollbackFor = Exception.class) public void update(RoleParam roleParam) { Long id = roleParam.getId(); - + // 角色的层级不可以被改变 + roleParam.setPid(null); // name和code唯一性校验 if (roleManager.existsByCode(roleParam.getCode(), id)) { throw new RoleAlreadyExistedException(); @@ -101,6 +112,10 @@ public class RoleService { if (Objects.isNull(roleId) || !roleManager.existsById(roleId)) { throw new RoleNotExistedException(); } + // 有下级角色不允许删除 + if (roleManager.existsByPid(roleId)) { + throw new RoleHaschildrenException(); + } // 存在当前角色用户的场合不允许删除 if (userRoleManager.existsByRoleId(roleId)) { throw new RoleAlreadyUsedException(); @@ -113,6 +128,46 @@ public class RoleService { eventPublisher.publishEvent(new RoleDeleteEvent(this,roleId)); } + /** + * 角色树 + */ + public List tree(){ + UserDetail userDetail = SecurityUtil.getCurrentUser().orElseThrow(NotLoginException::new); + // 查询所有的角色 + List allRoles = roleManager.findAll(); + List roleList = allRoles.stream() + .map(Role::toDto) + .collect(Collectors.toList()); + // 全部角色的数据树 + List tree = this.recursiveBuildTree(roleList); + // 系统管理员,获取全部的角色 + if (userDetail.isAdmin()) { + return tree; + } else { + // 普通用户, 查询已经分配的角色和下级角色,然后重新构建树 + return this.recursiveBuildTree(this.findRoleByUser(userDetail.getId(),tree)); + } + } + + /** + * 获取子孙角色 + */ + public List findChildren(Long ...ids) { + if (Objects.nonNull(ids)){ + ArrayList roleIds = ListUtil.toList(ids); + // 平铺树 + List tree = this.tree(); + List roleDtoList = TreeBuildUtil.unfold(tree, RoleDto::getChildren); + // 找到对应角色的分支树, 然后通过二次平铺树, 获取所有的子孙角色 + List collect = roleDtoList.stream() + .filter(roleDto -> roleIds.contains(roleDto.getId())) + .collect(Collectors.toList()); + // 二次平铺树 + return TreeBuildUtil.unfold(collect, RoleDto::getChildren); + } + return new ArrayList<>(); + } + /** * 角色列表 */ @@ -169,4 +224,28 @@ public class RoleService { return roleManager.existsByName(name, id); } + /** + * 获取用户可以管理的角色 + */ + private List findRoleByUser(Long userId,List tree){ + // 查找子级拥有的角色 + List roleIds = userRoleManager.findAllByUser(userId).stream() + .map(UserRole::getRoleId) + .collect(Collectors.toList()); + // 获取关联的角色和子角色 + List unfold = TreeBuildUtil.unfold(tree, RoleDto::getChildren); + return unfold.stream() + .filter(role -> roleIds.contains(role.getId())) + .collect(Collectors.toList()); + } + + /** + * 递归建树 + * @return 递归后的树列表 + */ + private List recursiveBuildTree(List roles) { + return TreeBuildUtil.build(roles, null, RoleDto::getId, RoleDto::getPid, + RoleDto::setChildren, Comparator.comparingLong(RoleDto::getId)); + + } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RoleMenuManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RoleMenuManager.java index 89bd2768..faff1b71 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RoleMenuManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RoleMenuManager.java @@ -38,6 +38,17 @@ public class RoleMenuManager extends BaseManager { } + /** + * 根据角色id、客户端code、权限id进行删除 + */ + public void deleteByPermIds(Long roleId, String clientCode,List permissionIds) { + lambdaUpdate() + .eq(RoleMenu::getRoleId, roleId) + .eq(RoleMenu::getClientCode,clientCode) + .in(RoleMenu::getPermissionId,permissionIds); + } + + @Override public List saveAll(List list) { list.forEach(roleMenu -> roleMenu.setId(IdUtil.getSnowflakeNextId())); diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/RoleMenu.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/RoleMenu.java index 90eba287..99a96e7d 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/RoleMenu.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/entity/RoleMenu.java @@ -8,7 +8,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.Accessors; /** - * 角色权限关联关系 + * 角色菜单(包含权限码)关联关系 * * @author xxm * @since 2021/8/3 @@ -31,7 +31,7 @@ public class RoleMenu extends MpIdEntity { private String clientCode; /** - * 菜单权限id + * 菜单或权限码id */ private Long permissionId; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java index 0c76acc6..20ab4e9c 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java @@ -4,13 +4,13 @@ import cn.bootx.platform.common.core.annotation.NestedPermission; import cn.bootx.platform.common.core.entity.UserDetail; import cn.bootx.platform.common.core.rest.dto.BaseDto; import cn.bootx.platform.common.core.util.TreeBuildUtil; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.iam.code.PermissionCode; import cn.bootx.platform.iam.core.permission.service.PermMenuService; +import cn.bootx.platform.iam.core.role.service.RoleService; import cn.bootx.platform.iam.core.upms.dao.RoleMenuManager; import cn.bootx.platform.iam.core.upms.entity.RoleMenu; -import cn.bootx.platform.iam.core.user.dao.UserExpandInfoManager; import cn.bootx.platform.iam.dto.permission.PermMenuDto; +import cn.bootx.platform.iam.dto.role.RoleDto; import cn.bootx.platform.iam.dto.upms.MenuAndResourceDto; import cn.bootx.platform.starter.auth.entity.UserStatus; import cn.bootx.platform.starter.auth.exception.NotLoginException; @@ -45,6 +45,8 @@ public class RolePermService { private final UserStatusService userStatusService; + private final RoleService roleService; + private final RoleMenuManager roleMenuManager; private final UserRoleService userRoleService; @@ -53,27 +55,73 @@ public class RolePermService { /** * 保存角色菜单授权 + * 如果删除角色关门的权限关系, 将会级联删除子孙角色的权限关系 + * 新增角色权限关系, 会根据 updateAddChildren 来决定是否级联新增子孙角色的权限关系 */ @CacheEvict(value = { USER_PERM_CODE }, allEntries = true) @Transactional(rollbackFor = Exception.class) - public void save(Long roleId, String clientCode, List permissionIds) { + public void save(Long roleId, String clientCode, List permissionIds, boolean updateAddChildren) { // 先删后增 List RoleMenus = roleMenuManager.findAllByRoleAndClientCode(roleId, clientCode); List roleMenuIds = RoleMenus.stream().map(RoleMenu::getPermissionId).collect(Collectors.toList()); - // 需要删除的 - List deleteIds = RoleMenus.stream() - .filter(rolePath -> !permissionIds.contains(rolePath.getPermissionId())) - .map(MpIdEntity::getId) - .collect(Collectors.toList()); - - List roleMenus = permissionIds.stream() - .filter(id -> !roleMenuIds.contains(id)) - .map(permissionId -> new RoleMenu(roleId, clientCode, permissionId)) - .collect(Collectors.toList()); + // 需要删除的菜单管理 + List deleteRoleMenus = RoleMenus.stream() + .filter(rolePath -> !permissionIds.contains(rolePath.getPermissionId())) + .collect(Collectors.toList()); + // 需要删除的权限ID + List deleteIds = deleteRoleMenus.stream().map(RoleMenu::getId).collect(Collectors.toList()); + + // 需要新增的角色权限关系 + List addRoleMenus = permissionIds.stream() + .filter(id -> !roleMenuIds.contains(id)) + .map(permissionId -> new RoleMenu(roleId, clientCode, permissionId)) + .collect(Collectors.toList()); roleMenuManager.deleteByIds(deleteIds); - roleMenuManager.saveAll(roleMenus); + roleMenuManager.saveAll(addRoleMenus); + // 级联更新子孙角色 + if (updateAddChildren) { + // 新增的进行追加 + List addRoleIds = addRoleMenus.stream() + .map(RoleMenu::getRoleId) + .collect(Collectors.toList()); + this.updateChildren(roleId, clientCode, addRoleIds, roleMenuIds); + } else { + // 新增的不进行追加 + this.updateChildren(roleId, clientCode, null, roleMenuIds); + } + } + + /** + * 更新子孙角色关联关系 + */ + private void updateChildren(Long roleId, String clientCode, List addPermIds, List deletePermIds){ + // 下属的子孙角色 + List children = roleService.findChildren(roleId); + + // 新增 + if (CollUtil.isNotEmpty(addPermIds)&&CollUtil.isNotEmpty(children)){ + + List addRoleMenus = new ArrayList<>(); + for (Long addPermId : addPermIds) { + for (RoleDto childrenRole : children) { + addRoleMenus.add(new RoleMenu(childrenRole.getId(), clientCode, addPermId)); + } + } + roleMenuManager.saveAll(addRoleMenus); + } + // 删除 + if (CollUtil.isNotEmpty(deletePermIds)&&CollUtil.isNotEmpty(children)) { + // 子孙角色 + List childrenIds = children.stream() + .map(BaseDto::getId) + .collect(Collectors.toList()); + for (Long childrenId : childrenIds) { + roleMenuManager.deleteByPermIds(childrenId,clientCode,deletePermIds); + } + } } + /** * 根据角色查询对应的权限id */ @@ -88,8 +136,8 @@ public class RolePermService { public List findMenuTree(String clientCode) { List permissions = this.findPermissions(clientCode); List permissionsByNotButton = permissions.stream() - .filter(o -> !Objects.equals(PermissionCode.MENU_TYPE_RESOURCE, o.getMenuType())) - .collect(Collectors.toList()); + .filter(o -> !Objects.equals(PermissionCode.MENU_TYPE_RESOURCE, o.getMenuType())) + .collect(Collectors.toList()); return this.recursiveBuildTree(permissionsByNotButton); } @@ -106,9 +154,9 @@ public class RolePermService { public List findMenuIds(String clientCode) { List permissions = this.findPermissions(clientCode); return permissions.stream() - .filter(o -> !Objects.equals(PermissionCode.MENU_TYPE_RESOURCE, o.getMenuType())) - .map(PermMenuDto::getId) - .collect(Collectors.toList()); + .filter(o -> !Objects.equals(PermissionCode.MENU_TYPE_RESOURCE, o.getMenuType())) + .map(PermMenuDto::getId) + .collect(Collectors.toList()); } /** @@ -117,13 +165,13 @@ public class RolePermService { public MenuAndResourceDto getPermissions(String clientCode) { List permissions = this.findPermissions(clientCode); List resourcePerms = permissions.stream() - .filter(o -> Objects.equals(PermissionCode.MENU_TYPE_RESOURCE, o.getMenuType())) - .filter(PermMenuDto::isEffect) - .map(PermMenuDto::getPermCode) - .collect(Collectors.toList()); + .filter(o -> Objects.equals(PermissionCode.MENU_TYPE_RESOURCE, o.getMenuType())) + .filter(PermMenuDto::isEffect) + .map(PermMenuDto::getPermCode) + .collect(Collectors.toList()); List menus = permissions.stream() - .filter(o -> !Objects.equals(PermissionCode.MENU_TYPE_RESOURCE, o.getMenuType())) - .collect(Collectors.toList()); + .filter(o -> !Objects.equals(PermissionCode.MENU_TYPE_RESOURCE, o.getMenuType())) + .collect(Collectors.toList()); return new MenuAndResourceDto().setResourcePerms(resourcePerms).setMenus(this.recursiveBuildTree(menus)); } @@ -141,9 +189,9 @@ public class RolePermService { else { // 非管理员获取自身拥有的权限 permissions = this.findPermissionsByUser(userDetail.getId()) - .stream() - .filter(o -> Objects.equals(clientCode, o.getClientCode())) - .collect(Collectors.toList()); + .stream() + .filter(o -> Objects.equals(clientCode, o.getClientCode())) + .collect(Collectors.toList()); } return permissions; } @@ -157,10 +205,10 @@ public class RolePermService { // 获取关联的的权限码 List permissions = this.findPermissionsByUser(userId); return permissions.stream() - .filter(o -> Objects.equals(o.getMenuType(), PermissionCode.MENU_TYPE_RESOURCE)) - .filter(PermMenuDto::isEffect) - .map(PermMenuDto::getPermCode) - .collect(Collectors.toList()); + .filter(o -> Objects.equals(o.getMenuType(), PermissionCode.MENU_TYPE_RESOURCE)) + .filter(PermMenuDto::isEffect) + .map(PermMenuDto::getPermCode) + .collect(Collectors.toList()); } /** @@ -180,9 +228,9 @@ public class RolePermService { } List roleMenus = roleMenuManager.findAllByRoles(roleIds); List permissionIds = roleMenus.stream() - .map(RoleMenu::getPermissionId) - .distinct() - .collect(Collectors.toList()); + .map(RoleMenu::getPermissionId) + .distinct() + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(permissionIds)) { permissions = permMenuService.findByIds(permissionIds); } @@ -199,5 +247,4 @@ public class RolePermService { PermMenuDto::setChildren, Comparator.comparingDouble(PermMenuDto::getSortNo)); } - } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/role/RoleDto.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/role/RoleDto.java index fcf9bf0c..01e5962f 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/role/RoleDto.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/role/RoleDto.java @@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.util.List; /** * @author xxm @@ -25,10 +26,16 @@ public class RoleDto extends BaseDto implements Serializable { @Schema(description = "角色名称") private String name; - @Schema(description = "是否系统内置 Y 内置 N 不是 内置 不能修改") + @Schema(description = "是否系统内置") private boolean internal; + @Schema(description = "父级Id") + private Long pid; + @Schema(description = "描述") private String remark; + @Schema(description = "子节点") + private List children; + } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/exception/role/RoleHaschildrenException.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/exception/role/RoleHaschildrenException.java new file mode 100644 index 00000000..d17139d5 --- /dev/null +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/exception/role/RoleHaschildrenException.java @@ -0,0 +1,17 @@ +package cn.bootx.platform.iam.exception.role; + +import cn.bootx.platform.common.core.exception.BizException; + +import static cn.bootx.platform.iam.code.IamErrorCode.ROLE_HAS_CHILD; + +/** + * 含有下级角色异常 + * @author xxm + * @since 2023/12/5 + */ +public class RoleHaschildrenException extends BizException { + + public RoleHaschildrenException() { + super(ROLE_HAS_CHILD, "该角色下分配了用户,您无法将其删除."); + } +} diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/role/RoleParam.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/role/RoleParam.java index f3343d8f..2de329db 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/role/RoleParam.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/role/RoleParam.java @@ -22,6 +22,9 @@ public class RoleParam { @Schema(description = "角色名称") private String name; + @Schema(description = "父级Id") + private Long pid; + @Schema(description = "描述") private String remark; diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/RolePermissionParam.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/RolePermissionParam.java index cb24437b..bae3df99 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/RolePermissionParam.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/RolePermissionParam.java @@ -15,7 +15,7 @@ import java.util.List; */ @Data @Accessors(chain = true) -@Schema(title = "角色权限(菜单/)") +@Schema(title = "角色权限(菜单/权限码)") public class RolePermissionParam implements Serializable { private static final long serialVersionUID = 4344723093613370279L; @@ -25,14 +25,12 @@ public class RolePermissionParam implements Serializable { private Long roleId; @Schema(description = "终端code") - @NotBlank(message = "终端不可为空", groups = { PermMenu.class }) + @NotBlank(message = "终端不可为空") private String clientCode; @Schema(description = "权限id") private List permissionIds; - public interface PermMenu { - - } - + @Schema(description = "新增时是否更新子节点") + private boolean updateChildren; } diff --git a/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java b/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java index ebc10ac6..bb7d969c 100644 --- a/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java +++ b/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java @@ -8,7 +8,6 @@ import cn.bootx.platform.notice.param.sms.SmsChannelConfigParam; import cn.bootx.table.modify.annotation.DbColumn; import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; -import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -16,7 +15,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.dromara.sms4j.provider.enumerate.SupplierType; -import static com.baomidou.mybatisplus.annotation.FieldStrategy.IGNORED; +import static com.baomidou.mybatisplus.annotation.FieldStrategy.NEVER; /** * 短信渠道配置 @@ -34,7 +33,7 @@ public class SmsChannelConfig extends MpBaseEntity implements EntityBaseFunction * @see SupplierType#name() */ @DbColumn(comment = "渠道类型编码") - @TableField(updateStrategy = FieldStrategy.NEVER) + @TableField(updateStrategy = NEVER) private String code; /** @@ -62,11 +61,11 @@ public class SmsChannelConfig extends MpBaseEntity implements EntityBaseFunction /** 配置字符串 */ @DbMySqlFieldType(MySqlFieldTypeEnum.TEXT) @DbColumn(comment = "配置字符串") - @TableField(updateStrategy = IGNORED) + @TableField(updateStrategy = NEVER) private String config; /** 图片 */ - @TableField(updateStrategy = IGNORED) + @TableField(updateStrategy = NEVER) @DbColumn(comment = "图片") private Long image; diff --git a/pom.xml b/pom.xml index 2faffba7..fe04a5ed 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.16 + 2.7.18 -- Gitee From b0943a971f3d951867639781d21bb12e89dff5bd Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Wed, 6 Dec 2023 17:15:29 +0800 Subject: [PATCH 21/38] =?UTF-8?q?feat=20=E8=A7=92=E8=89=B2=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=88=86=E9=85=8D=E7=9A=84=E6=9D=83=E9=99=90=E5=90=8E?= =?UTF-8?q?,=20=E6=94=AF=E6=8C=81=E8=BF=9B=E8=A1=8C=E7=BA=A7=E8=81=94?= =?UTF-8?q?=E6=94=B6=E5=9B=9E,=20=E4=B9=9F=E5=8F=AF=E4=BB=A5=E7=BA=A7?= =?UTF-8?q?=E8=81=94=E5=88=86=E9=85=8D=E7=BB=99=E4=B8=8B=E7=BA=A7,,?= =?UTF-8?q?=E7=BB=99=E8=A7=92=E8=89=B2=E5=88=86=E9=85=8D=E6=9D=83=E9=99=90?= =?UTF-8?q?=EF=BC=8C=E6=9F=A5=E7=9C=8B=E6=98=AF=E5=90=A6=E6=9C=89=E7=88=B6?= =?UTF-8?q?=E8=A7=92=E8=89=B2=EF=BC=8C=E5=A6=82=E6=9E=9C=E6=9C=89=EF=BC=8C?= =?UTF-8?q?=E9=99=90=E5=AE=9A=E5=8F=AA=E8=83=BD=E5=9C=A8=E7=88=B6=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E4=B8=8B=E8=BF=9B=E8=A1=8C=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 7 ++- .../iam/controller/PermMenuController.java | 4 +- .../iam/core/role/service/RoleService.java | 2 +- .../iam/core/upms/dao/RoleMenuManager.java | 7 ++- .../core/upms/service/RolePermService.java | 58 +++++++++++++------ 5 files changed, 55 insertions(+), 23 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 36295069..8c55fc53 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -14,9 +14,12 @@ - 更新WebSocket的Demo样例 ## 1.3.7 -- 角色结构改为树形结构 +- x 角色结构改为树形结构 - 角色删除分配的权限后, 支持进行级联收回, 也可以级联分配给下级 -- 角色支持分配权限(Admin分配给B 权限X,B又分配给了C 权限X,Admin收回B的权限X时, C的X权限也会被收回) + - x 菜单和权限码 + - 请求权限 +- 给角色分配权限是,查看是否有父角色,如果有,限定只能在父角色下进行分配 +- 菜单和请求权限只支持系统管理员配置, 没有数据权限的控制 ## 1.3.x、1.4.x - 接口平台功能 - 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java index f946dc38..bba48040 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java @@ -47,8 +47,8 @@ public class PermMenuController { @Operation(summary = "获取全部树") @GetMapping("/allTree") - public ResResult> allTree(String clientCode) { - return Res.ok(rolePermissionService.findAllTree(clientCode)); + public ResResult> allTree(String clientCode,Long roleId) { + return Res.ok(rolePermissionService.findAllTree(clientCode,roleId)); } @Operation(summary = "资源(权限码)列表") diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/service/RoleService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/service/RoleService.java index 879dbd20..db62c8e4 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/service/RoleService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/role/service/RoleService.java @@ -160,7 +160,7 @@ public class RoleService { List roleDtoList = TreeBuildUtil.unfold(tree, RoleDto::getChildren); // 找到对应角色的分支树, 然后通过二次平铺树, 获取所有的子孙角色 List collect = roleDtoList.stream() - .filter(roleDto -> roleIds.contains(roleDto.getId())) + .filter(roleDto -> roleIds.contains(roleDto.getPid())) .collect(Collectors.toList()); // 二次平铺树 return TreeBuildUtil.unfold(collect, RoleDto::getChildren); diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RoleMenuManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RoleMenuManager.java index faff1b71..6f3ae89e 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RoleMenuManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RoleMenuManager.java @@ -32,6 +32,10 @@ public class RoleMenuManager extends BaseManager { public List findAllByRoles(List roleIds) { return findAllByFields(RoleMenu::getRoleId, roleIds); } + public List findAllByRole(Long roleId) { + return findAllByField(RoleMenu::getRoleId, roleId); + } + public List findAllByRoleAndClientCode(Long roleId, String clientCode) { return lambdaQuery().eq(RoleMenu::getRoleId, roleId).eq(RoleMenu::getClientCode, clientCode).list(); @@ -45,7 +49,8 @@ public class RoleMenuManager extends BaseManager { lambdaUpdate() .eq(RoleMenu::getRoleId, roleId) .eq(RoleMenu::getClientCode,clientCode) - .in(RoleMenu::getPermissionId,permissionIds); + .in(RoleMenu::getPermissionId,permissionIds) + .remove(); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java index 20ab4e9c..e6164555 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java @@ -6,12 +6,15 @@ import cn.bootx.platform.common.core.rest.dto.BaseDto; import cn.bootx.platform.common.core.util.TreeBuildUtil; import cn.bootx.platform.iam.code.PermissionCode; import cn.bootx.platform.iam.core.permission.service.PermMenuService; +import cn.bootx.platform.iam.core.role.dao.RoleManager; +import cn.bootx.platform.iam.core.role.entity.Role; import cn.bootx.platform.iam.core.role.service.RoleService; import cn.bootx.platform.iam.core.upms.dao.RoleMenuManager; import cn.bootx.platform.iam.core.upms.entity.RoleMenu; import cn.bootx.platform.iam.dto.permission.PermMenuDto; import cn.bootx.platform.iam.dto.role.RoleDto; import cn.bootx.platform.iam.dto.upms.MenuAndResourceDto; +import cn.bootx.platform.iam.exception.role.RoleNotExistedException; import cn.bootx.platform.starter.auth.entity.UserStatus; import cn.bootx.platform.starter.auth.exception.NotLoginException; import cn.bootx.platform.starter.auth.service.UserStatusService; @@ -47,6 +50,8 @@ public class RolePermService { private final RoleService roleService; + private final RoleManager roleManager; + private final RoleMenuManager roleMenuManager; private final UserRoleService userRoleService; @@ -56,7 +61,7 @@ public class RolePermService { /** * 保存角色菜单授权 * 如果删除角色关门的权限关系, 将会级联删除子孙角色的权限关系 - * 新增角色权限关系, 会根据 updateAddChildren 来决定是否级联新增子孙角色的权限关系 + * 新增角色权限关系, 会根据 updateAddChildren状态 来决定是否级联新增子孙角色的权限关系 */ @CacheEvict(value = { USER_PERM_CODE }, allEntries = true) @Transactional(rollbackFor = Exception.class) @@ -68,26 +73,29 @@ public class RolePermService { List deleteRoleMenus = RoleMenus.stream() .filter(rolePath -> !permissionIds.contains(rolePath.getPermissionId())) .collect(Collectors.toList()); - // 需要删除的权限ID - List deleteIds = deleteRoleMenus.stream().map(RoleMenu::getId).collect(Collectors.toList()); + // 需要删除的关联ID + List deleteRoleMenuIds = deleteRoleMenus.stream().map(RoleMenu::getId).collect(Collectors.toList()); + roleMenuManager.deleteByIds(deleteRoleMenuIds); // 需要新增的角色权限关系 List addRoleMenus = permissionIds.stream() .filter(id -> !roleMenuIds.contains(id)) .map(permissionId -> new RoleMenu(roleId, clientCode, permissionId)) .collect(Collectors.toList()); - roleMenuManager.deleteByIds(deleteIds); roleMenuManager.saveAll(addRoleMenus); + + // 需要删除的权限ID + List deletePermIds = deleteRoleMenus.stream().map(RoleMenu::getPermissionId).collect(Collectors.toList()); // 级联更新子孙角色 if (updateAddChildren) { // 新增的进行追加 - List addRoleIds = addRoleMenus.stream() - .map(RoleMenu::getRoleId) + List addPermIds = addRoleMenus.stream() + .map(RoleMenu::getPermissionId) .collect(Collectors.toList()); - this.updateChildren(roleId, clientCode, addRoleIds, roleMenuIds); + this.updateChildren(roleId, clientCode, addPermIds, deletePermIds); } else { // 新增的不进行追加 - this.updateChildren(roleId, clientCode, null, roleMenuIds); + this.updateChildren(roleId, clientCode, null, deletePermIds); } } @@ -95,12 +103,13 @@ public class RolePermService { * 更新子孙角色关联关系 */ private void updateChildren(Long roleId, String clientCode, List addPermIds, List deletePermIds){ - // 下属的子孙角色 + if (CollUtil.isNotEmpty(addPermIds) && CollUtil.isNotEmpty(deletePermIds)){ + return; + } + // 当前角色的子孙角色 List children = roleService.findChildren(roleId); - // 新增 - if (CollUtil.isNotEmpty(addPermIds)&&CollUtil.isNotEmpty(children)){ - + if (CollUtil.isNotEmpty(addPermIds) && CollUtil.isNotEmpty(children)){ List addRoleMenus = new ArrayList<>(); for (Long addPermId : addPermIds) { for (RoleDto childrenRole : children) { @@ -110,7 +119,7 @@ public class RolePermService { roleMenuManager.saveAll(addRoleMenus); } // 删除 - if (CollUtil.isNotEmpty(deletePermIds)&&CollUtil.isNotEmpty(children)) { + if (CollUtil.isNotEmpty(deletePermIds) && CollUtil.isNotEmpty(children)) { // 子孙角色 List childrenIds = children.stream() .map(BaseDto::getId) @@ -121,7 +130,6 @@ public class RolePermService { } } - /** * 根据角色查询对应的权限id */ @@ -144,8 +152,24 @@ public class RolePermService { /** * 获取权限树, 包含菜单和资源权限(权限码) */ - public List findAllTree(String clientCode) { - return this.recursiveBuildTree(this.findPermissions(clientCode)); + public List findAllTree(String clientCode,Long roleId) { + List permissions = this.findPermissions(clientCode); + UserDetail userDetail = SecurityUtil.getCurrentUser().orElseThrow(NotLoginException::new); + // 管理员直接不限制 + if (userDetail.isAdmin()){ + return this.recursiveBuildTree(permissions); + } + // 只能查询到当前角色的父级角色已经分配下来的的权限 + Role role = roleManager.findById(roleId) + .orElseThrow(RoleNotExistedException::new); + List permissionIds = roleMenuManager.findAllByRole(role.getPid()) + .stream() + .map(RoleMenu::getPermissionId) + .collect(Collectors.toList()); + permissions = permissions.stream() + .filter(o->permissionIds.contains(o.getId())) + .collect(Collectors.toList()); + return this.recursiveBuildTree(permissions); } /** @@ -178,7 +202,7 @@ public class RolePermService { /** * 获取权限信息列表 */ - private List findPermissions(String clientCode) { + private List findPermissions(String clientCode) { UserDetail userDetail = SecurityUtil.getCurrentUser().orElseThrow(NotLoginException::new); List permissions; -- Gitee From f7576b92123152a2d91b1af26039040fa57081ea Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Wed, 6 Dec 2023 21:41:15 +0800 Subject: [PATCH 22/38] =?UTF-8?q?feat=20=E5=9C=A8=E7=BA=BF=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=92=8C=E7=99=BB=E5=BD=95=E7=94=A8=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 43 +++++++++---------- .../iam/controller/OnlineUserController.java | 12 ++++++ .../iam/dto/online/OnlineUserInfoDto.java | 7 ++- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 8c55fc53..dc2eae30 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,26 +1,25 @@ ## 1.3.6 -- x 文件上传替换为基于`x-file-storage`定制 -- Websocket连接管理页 -- x 密码过期后清除所有的权限,必须强制更改密码 - - x 菜单权限 - - x 请求权限 -- x 密码安全配置设置为必填. 保存信息状态变为查看状态 -- x 请求权限配置新建时偶发类型不可以更改 -- x 新增和编辑用户时. 手机号和邮件校验有问题 -- x 用户列表和详情字典显示有问题 -- x 更新用户信息时, 脱敏的字段保存时未被忽略 -- x 数据权限重构为数据角色, 用于管理数据权限相关配置 - - x 增加关联部门及下级部门 -- 更新WebSocket的Demo样例 - -## 1.3.7 -- x 角色结构改为树形结构 -- 角色删除分配的权限后, 支持进行级联收回, 也可以级联分配给下级 - - x 菜单和权限码 - - 请求权限 -- 给角色分配权限是,查看是否有父角色,如果有,限定只能在父角色下进行分配 -- 菜单和请求权限只支持系统管理员配置, 没有数据权限的控制 -## 1.3.x、1.4.x +- [x] 文件上传替换为基于`[x]-file-storage`定制 +- [ ] Websocket连接管理页 +- [x] 密码过期后清除所有的权限,必须强制更改密码 + - [x] 菜单权限 + - [x] 请求权限 +- [x] 密码安全配置设置为必填. 保存信息状态变为查看状态 +- [x] 请求权限配置新建时偶发类型不可以更改 +- [x] 新增和编辑用户时. 手机号和邮件校验有问题 +- [x] 用户列表和详情字典显示有问题 +- [x] 更新用户信息时, 脱敏的字段保存时未被忽略 +- [x] 数据权限重构为数据角色, 用于管理数据权限相关配置 + - [x] 增加关联部门及下级部门 +- [x] 更新WebSocket的Demo样例 +- 权限相关 +- [x] 角色结构改为树形结构 +- [ ] 角色删除分配的权限后, 支持进行级联收回, 也可以级联分配给下级 + - [x] 菜单和权限码 + - [ ] 请求权限 +- [ ] 给角色分配权限是,查看是否有父角色,如果有,限定只能在父角色下进行分配 +- [ ] 菜单和请求权限只支持系统管理员配置, 没有数据权限的控制 +## 1.3.[x]、1.4.[x] - 接口平台功能 - 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 - 可视化大屏端支持一键登录 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/OnlineUserController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/OnlineUserController.java index 2ce461cd..5097c5a9 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/OnlineUserController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/OnlineUserController.java @@ -39,4 +39,16 @@ public class OnlineUserController { public ResResult> getSessionByUserId(String userId){ return Res.ok(onlineUserService.getSessionByUserId(userId)); } + + @Operation(summary = "登录用户分页") + @GetMapping("/pageByLogin") + public ResResult pageByLogin(PageParam pageParam){ + return Res.ok(); + } + + @Operation(summary = "踢出用户") + @GetMapping("/kickOut") + public ResResult kickOut(String userId){ + return Res.ok(); + } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/online/OnlineUserInfoDto.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/online/OnlineUserInfoDto.java index 85773aeb..7a50ad00 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/online/OnlineUserInfoDto.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/dto/online/OnlineUserInfoDto.java @@ -24,10 +24,6 @@ public class OnlineUserInfoDto extends BaseDto { @Schema(description = "账号") private String username; - @Schema(description = "密码") - @SensitiveInfo(SensitiveInfo.SensitiveType.PASSWORD) - private String password; - @Schema(description = "手机号") @SensitiveInfo(SensitiveInfo.SensitiveType.MOBILE_PHONE) private String phone; @@ -35,4 +31,7 @@ public class OnlineUserInfoDto extends BaseDto { @Schema(description = "邮箱") @SensitiveInfo(SensitiveInfo.SensitiveType.EMAIL) private String email; + + @Schema(description = "状态") + private String status; } -- Gitee From e22839d6dd453159eadac9e531a3b24bfa91e415 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Thu, 7 Dec 2023 17:28:08 +0800 Subject: [PATCH 23/38] =?UTF-8?q?ref=20=E6=9D=83=E9=99=90=E4=BD=93?= =?UTF-8?q?=E7=B3=BB=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 11 +- .../iam/controller/PermMenuController.java | 18 ++- .../iam/controller/RoleMenuController.java | 4 +- .../iam/controller/RolePathController.java | 2 +- .../iam/core/upms/dao/RolePathManager.java | 9 ++ .../core/upms/service/RolePathService.java | 114 ++++++++++++++---- .../core/upms/service/RolePermService.java | 53 +++++--- .../iam/param/upms/RolePermissionParam.java | 10 +- 8 files changed, 164 insertions(+), 57 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index dc2eae30..f55ac429 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -14,11 +14,14 @@ - [x] 更新WebSocket的Demo样例 - 权限相关 - [x] 角色结构改为树形结构 +- [ ] 菜单和权限码, 子角色的权限不能大于父角色 +- [ ] 请求权限, 支持父子角色,子角色的权限不能大于父角色 - [ ] 角色删除分配的权限后, 支持进行级联收回, 也可以级联分配给下级 - - [x] 菜单和权限码 - - [ ] 请求权限 -- [ ] 给角色分配权限是,查看是否有父角色,如果有,限定只能在父角色下进行分配 -- [ ] 菜单和请求权限只支持系统管理员配置, 没有数据权限的控制 + - [x] 菜单和权限码 + - [x] 请求权限 +- [ ] 给角色分配权限时,查看是否有父角色,如果有,限定只能在父角色下进行分配 +- [ ] 菜单和请求权限只能系统管理员配置, 没有数据权限的控制 +- [ ] 权限相关缓存机制更改, 不能直接用户关联到具体的权限 ## 1.3.[x]、1.4.[x] - 接口平台功能 - 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java index bba48040..4472b8e8 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java @@ -45,18 +45,18 @@ public class PermMenuController { return Res.ok(rolePermissionService.findMenuTree(clientCode)); } - @Operation(summary = "获取全部树") - @GetMapping("/allTree") - public ResResult> allTree(String clientCode,Long roleId) { - return Res.ok(rolePermissionService.findAllTree(clientCode,roleId)); - } - @Operation(summary = "资源(权限码)列表") @GetMapping("/resourceList") public ResResult> resourceList(Long menuId) { return Res.ok(permissionService.findResourceByMenuId(menuId)); } + @Operation(summary = "获取菜单和权限码树") + @GetMapping("/menuAndPermCodeTree") + public ResResult> menuAndPermCodeTree(String clientCode) { + return Res.ok(rolePermissionService.findMenuAndPermCodeTree(clientCode)); + } + @Operation(summary = "根据id查询") @GetMapping("/findById") public ResResult findById(Long id) { @@ -82,4 +82,10 @@ public class PermMenuController { return Res.ok(permissionService.existsByPermCode(permCode, id)); } + @Operation(summary = "获取当前用户角色下可见的菜单树(分配时用)") + @GetMapping("/findTreeByRole") + public ResResult> findTreeByRole(String clientCode, Long roleId) { + return Res.ok(rolePermissionService.findTreeByRole(clientCode,roleId)); + } + } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java index 5e6e26fc..ac475760 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java @@ -31,8 +31,8 @@ public class RoleMenuController { @Operation(summary = "保存请求权限关系") @PostMapping("/save") public ResResult save(@RequestBody RolePermissionParam param) { - ValidationUtil.validateParam(param); - rolePermService.save(param.getRoleId(), param.getClientCode(), param.getPermissionIds(),param.isUpdateChildren()); + ValidationUtil.validateParam(param, RolePermissionParam.PermMenu.class); + rolePermService.saveRoleMenu(param.getRoleId(), param.getClientCode(), param.getPermissionIds(),param.isUpdateChildren()); return Res.ok(true); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RolePathController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RolePathController.java index f95eb300..3515d264 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RolePathController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RolePathController.java @@ -29,7 +29,7 @@ public class RolePathController { @PostMapping("/save") public ResResult save(@RequestBody RolePermissionParam param) { ValidationUtil.validateParam(param); - rolePathService.addRolePath(param.getRoleId(), param.getPermissionIds()); + rolePathService.addRolePath(param.getRoleId(), param.getPermissionIds(),param.isUpdateChildren()); return Res.ok(); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RolePathManager.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RolePathManager.java index 11745f41..33cbf40f 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RolePathManager.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/dao/RolePathManager.java @@ -51,4 +51,13 @@ public class RolePathManager extends BaseManager { return rolePaths; } + /** + * 根据角色id 权限ids 删除关联关系 + */ + public void deleteByPermIds(Long roleId, List permissionIds) { + lambdaUpdate() + .eq(RolePath::getRoleId, roleId) + .in(RolePath::getPermissionId,permissionIds) + .remove(); + } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePathService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePathService.java index 48d984b0..733504da 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePathService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePathService.java @@ -1,15 +1,20 @@ package cn.bootx.platform.iam.core.upms.service; import cn.bootx.platform.common.core.annotation.CountTime; +import cn.bootx.platform.common.core.rest.dto.BaseDto; import cn.bootx.platform.iam.core.permission.service.PermPathService; +import cn.bootx.platform.iam.core.role.dao.RoleManager; +import cn.bootx.platform.iam.core.role.entity.Role; +import cn.bootx.platform.iam.core.role.service.RoleService; +import cn.bootx.platform.iam.core.upms.dao.RolePathManager; +import cn.bootx.platform.iam.core.upms.entity.RolePath; import cn.bootx.platform.iam.core.user.dao.UserInfoManager; import cn.bootx.platform.iam.core.user.entity.UserInfo; +import cn.bootx.platform.iam.dto.permission.PermPathDto; +import cn.bootx.platform.iam.dto.role.RoleDto; +import cn.bootx.platform.iam.exception.role.RoleNotExistedException; import cn.bootx.platform.iam.exception.user.UserInfoNotExistsException; import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.iam.core.upms.dao.RolePathManager; -import cn.bootx.platform.iam.core.upms.entity.RolePath; -import cn.bootx.platform.iam.dto.permission.PermPathDto; import cn.hutool.core.collection.CollUtil; import cn.hutool.extra.spring.SpringUtil; import lombok.RequiredArgsConstructor; @@ -41,6 +46,10 @@ public class RolePathService { private final PermPathService pathService; + private final RoleService roleService; + + private final RoleManager roleManager; + private final UserInfoManager userInfoManager; private final UserRoleService userRoleService; @@ -51,22 +60,79 @@ public class RolePathService { @Transactional(rollbackFor = Exception.class) @CacheEvict(value = { USER_PATH }, allEntries = true) @CountTime - public void addRolePath(Long roleId, List permissionIds) { + public void addRolePath(Long roleId, List permissionIds,boolean updateAddChildren) { // 先删后增 List rolePaths = rolePathManager.findAllByRole(roleId); List rolePathIds = rolePaths.stream().map(RolePath::getPermissionId).collect(Collectors.toList()); - // 需要删除的 - List deleteIds = rolePaths.stream() - .filter(rolePath -> !permissionIds.contains(rolePath.getPermissionId())) - .map(MpIdEntity::getId) - .collect(Collectors.toList()); - - List rolePermissions = permissionIds.stream() - .filter(id -> !rolePathIds.contains(id)) - .map(permissionId -> new RolePath(roleId, permissionId)) - .collect(Collectors.toList()); + // 需要删除的请求权限 + List deleteRolePaths = rolePaths.stream() + .filter(rolePath -> !permissionIds.contains(rolePath.getPermissionId())) + .collect(Collectors.toList()); + // 需要删除的关联ID + List deleteIds = deleteRolePaths.stream().map(RolePath::getId).collect(Collectors.toList()); rolePathManager.deleteByIds(deleteIds); - rolePathManager.saveAll(rolePermissions); + + // 需要新增的权限关系 + List addRolePath = permissionIds.stream() + .filter(id -> !rolePathIds.contains(id)) + .map(permissionId -> new RolePath(roleId, permissionId)) + .collect(Collectors.toList()); + // 新增时验证是否超过了父级角色所拥有的权限 + Role role = roleManager.findById(roleId).orElseThrow(RoleNotExistedException::new); + if (Objects.nonNull(role.getPid())){ + List collect = rolePathManager.findAllByRole(role.getPid()) + .stream() + .map(RolePath::getPermissionId) + .collect(Collectors.toList()); + addRolePath = addRolePath.stream() + .filter(o->collect.contains(o.getPermissionId())) + .collect(Collectors.toList()); + } + rolePathManager.saveAll(addRolePath); + + // 级联更新子孙角色 + List deletePermIds = deleteRolePaths.stream().map(RolePath::getPermissionId).collect(Collectors.toList()); + if (updateAddChildren) { + // 新增的进行追加 + List addPermIds = addRolePath.stream() + .map(RolePath::getPermissionId) + .collect(Collectors.toList()); + this.updateChildren(roleId, addPermIds, deletePermIds); + } else { + // 新增的不进行追加 + this.updateChildren(roleId, null, deletePermIds); + } + } + + /** + * 更新子孙角色关联关系 + */ + private void updateChildren(Long roleId, List addPermIds, List deletePermIds) { + if (CollUtil.isNotEmpty(addPermIds) && CollUtil.isNotEmpty(deletePermIds)){ + return; + } + // 当前角色的子孙角色 + List children = roleService.findChildren(roleId); + // 新增 + if (CollUtil.isNotEmpty(addPermIds) && CollUtil.isNotEmpty(children)){ + List addRolePaths = new ArrayList<>(); + for (Long addPermId : addPermIds) { + for (RoleDto childrenRole : children) { + addRolePaths.add(new RolePath(childrenRole.getId(), addPermId)); + } + } + rolePathManager.saveAll(addRolePaths); + } + // 删除 + if (CollUtil.isNotEmpty(deletePermIds) && CollUtil.isNotEmpty(children)) { + // 子孙角色 + List childrenIds = children.stream() + .map(BaseDto::getId) + .collect(Collectors.toList()); + for (Long childrenId : childrenIds) { + rolePathManager.deleteByPermIds(childrenId,deletePermIds); + } + } } /** @@ -91,11 +157,11 @@ public class RolePathService { @Cacheable(value = USER_PATH, key = "#method+':'+#userId") public List findSimplePathsByUser(String method, Long userId) { return SpringUtil.getBean(this.getClass()) - .findPathsByUser(userId) - .stream() - .filter(permPathDto -> Objects.equals(method, permPathDto.getRequestType())) - .map(PermPathDto::getPath) - .collect(Collectors.toList()); + .findPathsByUser(userId) + .stream() + .filter(permPathDto -> Objects.equals(method, permPathDto.getRequestType())) + .map(PermPathDto::getPath) + .collect(Collectors.toList()); } /** @@ -126,9 +192,9 @@ public class RolePathService { } List rolePaths = rolePathManager.findAllByRoles(roleIds); List permissionIds = rolePaths.stream() - .map(RolePath::getPermissionId) - .distinct() - .collect(Collectors.toList()); + .map(RolePath::getPermissionId) + .distinct() + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(permissionIds)) { permissions = pathService.findByIds(permissionIds); } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java index e6164555..36558e6c 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java @@ -59,17 +59,16 @@ public class RolePermService { private final PermMenuService permMenuService; /** - * 保存角色菜单授权 + * 保存角色菜单(权限码)授权 * 如果删除角色关门的权限关系, 将会级联删除子孙角色的权限关系 * 新增角色权限关系, 会根据 updateAddChildren状态 来决定是否级联新增子孙角色的权限关系 */ @CacheEvict(value = { USER_PERM_CODE }, allEntries = true) @Transactional(rollbackFor = Exception.class) - public void save(Long roleId, String clientCode, List permissionIds, boolean updateAddChildren) { - // 先删后增 + public void saveRoleMenu(Long roleId, String clientCode, List permissionIds, boolean updateAddChildren) { List RoleMenus = roleMenuManager.findAllByRoleAndClientCode(roleId, clientCode); List roleMenuIds = RoleMenus.stream().map(RoleMenu::getPermissionId).collect(Collectors.toList()); - // 需要删除的菜单管理 + // 需要删除的菜单 List deleteRoleMenus = RoleMenus.stream() .filter(rolePath -> !permissionIds.contains(rolePath.getPermissionId())) .collect(Collectors.toList()); @@ -82,11 +81,22 @@ public class RolePermService { .filter(id -> !roleMenuIds.contains(id)) .map(permissionId -> new RoleMenu(roleId, clientCode, permissionId)) .collect(Collectors.toList()); + // 新增时验证是否超过了父级角色所拥有的权限 + Role role = roleManager.findById(roleId) + .orElseThrow(RoleNotExistedException::new); + if (Objects.nonNull(role.getPid())){ + List collect = roleMenuManager.findAllByRoleAndClientCode(role.getPid(), clientCode) + .stream() + .map(RoleMenu::getPermissionId) + .collect(Collectors.toList()); + addRoleMenus = addRoleMenus.stream() + .filter(o->collect.contains(o.getPermissionId())) + .collect(Collectors.toList()); + } roleMenuManager.saveAll(addRoleMenus); - // 需要删除的权限ID - List deletePermIds = deleteRoleMenus.stream().map(RoleMenu::getPermissionId).collect(Collectors.toList()); // 级联更新子孙角色 + List deletePermIds = deleteRoleMenus.stream().map(RoleMenu::getPermissionId).collect(Collectors.toList()); if (updateAddChildren) { // 新增的进行追加 List addPermIds = addRoleMenus.stream() @@ -100,7 +110,7 @@ public class RolePermService { } /** - * 更新子孙角色关联关系 + * 级联更新子孙角色关联关系 */ private void updateChildren(Long roleId, String clientCode, List addPermIds, List deletePermIds){ if (CollUtil.isNotEmpty(addPermIds) && CollUtil.isNotEmpty(deletePermIds)){ @@ -131,7 +141,7 @@ public class RolePermService { } /** - * 根据角色查询对应的权限id + * 查询当前角色已经选择的权限id */ public List findPermissionIdsByRole(Long roleId, String clientCode) { List rolePermissions = roleMenuManager.findAllByRoleAndClientCode(roleId, clientCode); @@ -140,6 +150,8 @@ public class RolePermService { /** * 获取菜单权限树, 不包含资源权限(权限码) + * 1. 用户为管理员, 返回所有菜单 + * 2. 如果用户为非管理员, 则返回当前用户角色下可见的菜单 */ public List findMenuTree(String clientCode) { List permissions = this.findPermissions(clientCode); @@ -150,15 +162,20 @@ public class RolePermService { } /** - * 获取权限树, 包含菜单和资源权限(权限码) + * 获取菜单和权限码树 + * 1. 用户为管理员, 返回所有菜单和资源权限(权限码) + * 2. 如果用户为非管理员, 则返回当前用户角色下可见的菜单和资源权限(权限码) */ - public List findAllTree(String clientCode,Long roleId) { + public List findMenuAndPermCodeTree(String clientCode){ + List permissions = this.findPermissions(clientCode); + return this.recursiveBuildTree(permissions); + } + + /** + * 获取当前用户角色下可见的菜单树, 包含菜单和资源权限(权限码) + */ + public List findTreeByRole(String clientCode, Long roleId) { List permissions = this.findPermissions(clientCode); - UserDetail userDetail = SecurityUtil.getCurrentUser().orElseThrow(NotLoginException::new); - // 管理员直接不限制 - if (userDetail.isAdmin()){ - return this.recursiveBuildTree(permissions); - } // 只能查询到当前角色的父级角色已经分配下来的的权限 Role role = roleManager.findById(roleId) .orElseThrow(RoleNotExistedException::new); @@ -209,8 +226,7 @@ public class RolePermService { // 系统管理员,获取全部的权限 if (userDetail.isAdmin()) { permissions = permMenuService.findAllByClientCode(clientCode); - } - else { + } else { // 非管理员获取自身拥有的权限 permissions = this.findPermissionsByUser(userDetail.getId()) .stream() @@ -236,7 +252,8 @@ public class RolePermService { } /** - * 查询用户查询拥有的权限信息(直接获取所有终端的权限码),如果当前用户密码是否过期, 过期或者未修改密码, 返回权限为空 + * 查询用户查询拥有的权限信息(直接获取所有终端的权限码), + * 如果当前用户密码是否过期, 过期或者未修改密码, 返回权限为空 */ private List findPermissionsByUser(Long userId) { // 判断当前用户密码是否过期, 过期或者未修改密码, 返回权限为空 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/RolePermissionParam.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/RolePermissionParam.java index bae3df99..f9a0ca97 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/RolePermissionParam.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/param/upms/RolePermissionParam.java @@ -15,7 +15,7 @@ import java.util.List; */ @Data @Accessors(chain = true) -@Schema(title = "角色权限(菜单/权限码)") +@Schema(title = "角色权限(菜单/权限码/请求)") public class RolePermissionParam implements Serializable { private static final long serialVersionUID = 4344723093613370279L; @@ -25,7 +25,7 @@ public class RolePermissionParam implements Serializable { private Long roleId; @Schema(description = "终端code") - @NotBlank(message = "终端不可为空") + @NotBlank(message = "终端不可为空", groups = {PermMenu.class}) private String clientCode; @Schema(description = "权限id") @@ -33,4 +33,10 @@ public class RolePermissionParam implements Serializable { @Schema(description = "新增时是否更新子节点") private boolean updateChildren; + + /** + * 菜单权限需要终端, 请求权限不需要 + */ + public interface PermMenu {} + } -- Gitee From 5fb651134774cd6710e7ee4e62d6f173c06ccf2d Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Fri, 22 Dec 2023 20:59:37 +0800 Subject: [PATCH 24/38] =?UTF-8?q?fix=20=E5=A4=84=E7=90=86=E5=9C=A8?= =?UTF-8?q?=E5=9C=A8=E6=97=A0plumelog=E6=83=85=E5=86=B5=E4=B8=8B=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E9=93=BE=E8=B7=AF=E4=BC=9A=E5=87=BA=E7=8E=B0=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bootx-commons/common-log/pom.xml | 2 +- .../common/log/handler/LogTraceHeaderHolderFilter.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bootx-commons/common-log/pom.xml b/bootx-commons/common-log/pom.xml index 37368d6c..98e46e19 100644 --- a/bootx-commons/common-log/pom.xml +++ b/bootx-commons/common-log/pom.xml @@ -27,7 +27,7 @@ com.plumelog - plumelog-lite-spring-boot-starter + plumelog-lite ${plumelog.version} provided diff --git a/bootx-commons/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java b/bootx-commons/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java index cdf58357..a340a534 100644 --- a/bootx-commons/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java +++ b/bootx-commons/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java @@ -34,8 +34,10 @@ public class LogTraceHeaderHolderFilter extends OncePerRequestFilter { try { String traceId = RandomUtil.randomString(12); // 添加普通日志和 plumelog 日志的 TraceId - TraceId.logTraceID.set(traceId); MDC.put(CommonCode.TRACE_ID, traceId); + try { + TraceId.logTraceID.set(traceId); + } catch (Exception ignored) {} chain.doFilter(request, response); } finally { -- Gitee From dee93d4d2360c8f0c170db5def68c39d91c3247a Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Tue, 2 Jan 2024 00:13:17 +0800 Subject: [PATCH 25/38] doc README.md --- README.md | 3 +-- _doc/images/qq_qun.jpg | Bin 0 -> 213609 bytes 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 _doc/images/qq_qun.jpg diff --git a/README.md b/README.md index 96ddc632..8b788e46 100644 --- a/README.md +++ b/README.md @@ -131,8 +131,7 @@ bootx-platform QQ扫码加入QQ交流群

- - +

## 🍻 鸣谢 diff --git a/_doc/images/qq_qun.jpg b/_doc/images/qq_qun.jpg new file mode 100644 index 0000000000000000000000000000000000000000..476dd54d36372aa4900cebb2c7c770ece2b4832e GIT binary patch literal 213609 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

9P8vU{3$7N%GQvFp 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 Date: Tue, 2 Jan 2024 13:32:49 +0800 Subject: [PATCH 26/38] =?UTF-8?q?fix=20=E8=8E=B7=E5=8F=96=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E4=B8=8B=E5=8F=AF?= =?UTF-8?q?=E8=A7=81=E7=9A=84=E8=8F=9C=E5=8D=95=E6=A0=91=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E8=B0=83=E6=95=B4=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/upms/service/RolePermService.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java index 36558e6c..8a174f03 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java @@ -173,19 +173,23 @@ public class RolePermService { /** * 获取当前用户角色下可见的菜单树, 包含菜单和资源权限(权限码) + * 如果是顶级角色, 查询到的是当前角色拥有的权限 + * 如果是子角色, 查询到父级角色分配的权限,范围不会超过父级角色拥有的权限 */ public List findTreeByRole(String clientCode, Long roleId) { List permissions = this.findPermissions(clientCode); - // 只能查询到当前角色的父级角色已经分配下来的的权限 Role role = roleManager.findById(roleId) .orElseThrow(RoleNotExistedException::new); - List permissionIds = roleMenuManager.findAllByRole(role.getPid()) - .stream() - .map(RoleMenu::getPermissionId) - .collect(Collectors.toList()); - permissions = permissions.stream() - .filter(o->permissionIds.contains(o.getId())) - .collect(Collectors.toList()); + // 如果有有父级角色, 进行过滤筛选, 防止越权 + if (Objects.nonNull(role.getPid())){ + List permissionIds = roleMenuManager.findAllByRole(role.getPid()) + .stream() + .map(RoleMenu::getPermissionId) + .collect(Collectors.toList()); + permissions = permissions.stream() + .filter(o->permissionIds.contains(o.getId())) + .collect(Collectors.toList()); + } return this.recursiveBuildTree(permissions); } -- Gitee From 9797d9715882a8b8c916d85b4be94bc0a796722e Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Tue, 2 Jan 2024 15:22:44 +0800 Subject: [PATCH 27/38] =?UTF-8?q?feat=20=E8=A7=92=E8=89=B2=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=88=86=E9=85=8D=E7=9A=84=E6=9D=83=E9=99=90=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=BA=A7=E8=81=94=E6=94=B6=E5=9B=9E=E5=92=8C=E7=BA=A7?= =?UTF-8?q?=E8=81=94=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 10 ++++----- .../iam/controller/PermMenuController.java | 10 ++------- .../iam/controller/PermPathController.java | 2 +- .../iam/controller/RoleMenuController.java | 12 ++++++++-- .../iam/controller/RolePathController.java | 10 ++++----- .../core/upms/service/RolePathService.java | 22 ++++++++++++++++++- .../core/upms/service/RolePermService.java | 2 +- 7 files changed, 45 insertions(+), 23 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index f55ac429..734d3d9c 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -14,18 +14,18 @@ - [x] 更新WebSocket的Demo样例 - 权限相关 - [x] 角色结构改为树形结构 -- [ ] 菜单和权限码, 子角色的权限不能大于父角色 -- [ ] 请求权限, 支持父子角色,子角色的权限不能大于父角色 -- [ ] 角色删除分配的权限后, 支持进行级联收回, 也可以级联分配给下级 +- [x] 菜单和权限码, 子角色的权限不能大于父角色 +- [x] 请求权限, 支持父子角色,子角色的权限不能大于父角色 +- [x] 角色删除分配的权限后, 支持进行级联收回, 也可以级联分配给下级 - [x] 菜单和权限码 - [x] 请求权限 -- [ ] 给角色分配权限时,查看是否有父角色,如果有,限定只能在父角色下进行分配 +- [x] 给角色分配权限时,查看是否有父角色,如果有,限定只能在父角色下进行分配 - [ ] 菜单和请求权限只能系统管理员配置, 没有数据权限的控制 - [ ] 权限相关缓存机制更改, 不能直接用户关联到具体的权限 ## 1.3.[x]、1.4.[x] +- 请求权限优化, 新增注解, 扫描时可以根据注解自动进行特定的处理 - 接口平台功能 - 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 -- 可视化大屏端支持一键登录 - 数据集功能 - 接入LiteFLow - PostgreSQL 数据库适配 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java index 4472b8e8..69e25477 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermMenuController.java @@ -14,10 +14,11 @@ import org.springframework.web.bind.annotation.*; import java.util.List; /** + * 菜单和权限码 * @author xxm * @since 2020/5/11 9:36 */ -@Tag(name = "菜单权限资源") +@Tag(name = "菜单和权限码") @RestController @RequestMapping("/perm/menu") @RequiredArgsConstructor @@ -81,11 +82,4 @@ public class PermMenuController { public ResResult existsByPermCode(String permCode, Long id) { return Res.ok(permissionService.existsByPermCode(permCode, id)); } - - @Operation(summary = "获取当前用户角色下可见的菜单树(分配时用)") - @GetMapping("/findTreeByRole") - public ResResult> findTreeByRole(String clientCode, Long roleId) { - return Res.ok(rolePermissionService.findTreeByRole(clientCode,roleId)); - } - } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermPathController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermPathController.java index 84392123..0ba30b49 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermPathController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/PermPathController.java @@ -24,7 +24,7 @@ import java.util.List; * @since 2020/5/11 9:36 */ @Validated -@Tag(name = "请求权限资源") +@Tag(name = "请求权限管理") @RestController @RequestMapping("/perm/path") @RequiredArgsConstructor diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java index ac475760..9e346ad4 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RoleMenuController.java @@ -5,6 +5,7 @@ import cn.bootx.platform.common.core.rest.Res; import cn.bootx.platform.common.core.rest.ResResult; import cn.bootx.platform.common.core.util.ValidationUtil; import cn.bootx.platform.iam.core.upms.service.RolePermService; +import cn.bootx.platform.iam.dto.permission.PermMenuDto; import cn.bootx.platform.iam.dto.upms.MenuAndResourceDto; import cn.bootx.platform.iam.param.upms.RolePermissionParam; import io.swagger.v3.oas.annotations.Operation; @@ -42,14 +43,21 @@ public class RoleMenuController { return Res.ok(rolePermService.findMenuIds(clientCode)); } - @Operation(summary = "根据角色id获取关联权限id集合(包含资源和菜单)") + @Operation(summary = "获取当前角色下关联权限id集合(包含权限码和菜单)") @GetMapping("/findPermissionIdsByRole") public ResResult> findPermissionIdsByRole(Long roleId, String clientCode) { return Res.ok(rolePermService.findPermissionIdsByRole(roleId, clientCode)); } + + @Operation(summary = "获取当前角色下可见的菜单和权限码树(分配时用)") + @GetMapping("/findTreeByRole") + public ResResult> findTreeByRole(Long roleId, String clientCode) { + return Res.ok(rolePermService.findTreeByRole(clientCode,roleId)); + } + @IgnoreAuth - @Operation(summary = "获取菜单和资源权限") + @Operation(summary = "获取菜单和权限码(根据用户进行筛选)") @GetMapping("/getPermissions") public ResResult getPermissions(String clientCode) { return Res.ok(rolePermService.getPermissions(clientCode)); diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RolePathController.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RolePathController.java index 3515d264..8044ecbc 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RolePathController.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/controller/RolePathController.java @@ -29,14 +29,14 @@ public class RolePathController { @PostMapping("/save") public ResResult save(@RequestBody RolePermissionParam param) { ValidationUtil.validateParam(param); - rolePathService.addRolePath(param.getRoleId(), param.getPermissionIds(),param.isUpdateChildren()); + rolePathService.addRolePath(param.getRoleId(), param.getPermissionIds(), param.isUpdateChildren()); return Res.ok(); } - @Operation(summary = "根据用户id获取角色授权(请求权限列表)") - @GetMapping("/findPathsByUser") - public ResResult> findPathsByUser() { - return Res.ok(rolePathService.findPathsByUser()); + @Operation(summary = "获取当前用户角色下可见的请求权限列表(分配时用)") + @GetMapping("/findPathsByRole") + public ResResult> findPathsByRole(Long roleId) { + return Res.ok(rolePathService.findPathsByRole(roleId)); } @Operation(summary = "根据角色id获取关联权限id") diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePathService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePathService.java index 733504da..a9b9c63c 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePathService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePathService.java @@ -169,7 +169,6 @@ public class RolePathService { */ public List findPathsByUser(Long userId) { UserInfo userInfo = userInfoManager.findById(userId).orElseThrow(UserInfoNotExistsException::new); - List paths; if (userInfo.isAdministrator()) { paths = pathService.findAll(); @@ -201,4 +200,25 @@ public class RolePathService { return permissions; } + /** + * 获取当前用户角色下可见的请求权限 + * 如果是顶级角色, 查询到的是当前角色拥有的权限 + * 如果是子角色, 查询到父级角色分配的权限,范围不会超过父级角色拥有的权限 + */ + public List findPathsByRole(Long roleId) { + List permPaths = pathService.findAll(); + Role role = roleManager.findById(roleId) + .orElseThrow(RoleNotExistedException::new); + // 如果有有父级角色, 进行过滤筛选, 防止越权 + if (Objects.nonNull(role.getPid())){ + List permissionIds = rolePathManager.findAllByRole(role.getPid()) + .stream() + .map(RolePath::getPermissionId) + .collect(Collectors.toList()); + permPaths = permPaths.stream() + .filter(o->permissionIds.contains(o.getId())) + .collect(Collectors.toList()); + } + return permPaths; + } } diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java index 8a174f03..91fcc7f8 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java @@ -205,7 +205,7 @@ public class RolePermService { } /** - * 获取菜单和资源权限(权限码) + * 获取菜单和资源权限(权限码) 根据用户进行筛选 */ public MenuAndResourceDto getPermissions(String clientCode) { List permissions = this.findPermissions(clientCode); -- Gitee From a027a38bf9242b9102ea047b928bccac99da0ef1 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Tue, 2 Jan 2024 22:23:39 +0800 Subject: [PATCH 28/38] =?UTF-8?q?fix=20plumeLog=E7=B1=BB=E4=B8=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86,=20=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/common/log/handler/LogTraceHeaderHolderFilter.java | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bootx-commons/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java b/bootx-commons/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java index a340a534..12aa194e 100644 --- a/bootx-commons/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java +++ b/bootx-commons/common-log/src/main/java/cn/bootx/platform/common/log/handler/LogTraceHeaderHolderFilter.java @@ -37,7 +37,7 @@ public class LogTraceHeaderHolderFilter extends OncePerRequestFilter { MDC.put(CommonCode.TRACE_ID, traceId); try { TraceId.logTraceID.set(traceId); - } catch (Exception ignored) {} + } catch (NoClassDefFoundError ignored) {} chain.doFilter(request, response); } finally { diff --git a/pom.xml b/pom.xml index fe04a5ed..eda53d8b 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 1.3.6 - 5.8.22 + 5.8.24 6.4.4 2.12.3 3.11 -- Gitee From 44d3f264e3b7c1b79360ee39d0286f95003fba63 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Wed, 3 Jan 2024 22:29:33 +0800 Subject: [PATCH 29/38] =?UTF-8?q?feat=20=E6=96=B0=E5=A2=9E=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E6=96=B0=E7=9A=84JSON=E5=AD=97=E6=AE=B5=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=BD=AC=E6=8D=A2=E6=8A=BD=E8=B1=A1=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E5=8F=AF=E5=BA=94=E7=94=A8=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=9A=84=E9=9B=86=E5=90=88=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=AD=97=E6=AE=B5,=20=E5=90=8C=E6=97=B6=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E7=9A=84json=E4=BE=9D=E7=84=B6=E4=B8=BA=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E7=9A=84json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 1 + .../common/jackson/jdk/Java8TimeModule.java | 6 ++- .../handler/JacksonRawTypeHandler.java | 5 ++- .../handler/JacksonTypeReferenceHandler.java | 45 +++++++++++++++++++ pom.xml | 2 +- 5 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/JacksonTypeReferenceHandler.java diff --git a/_doc/Task.md b/_doc/Task.md index 734d3d9c..83f76ce0 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,5 +1,6 @@ ## 1.3.6 - [x] 文件上传替换为基于`[x]-file-storage`定制 +- [x] 新增一种新的JSON字段类型转换抽象处理器,可应用复杂类型的集合类型字段 - [ ] Websocket连接管理页 - [x] 密码过期后清除所有的权限,必须强制更改密码 - [x] 菜单权限 diff --git a/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/jdk/Java8TimeModule.java b/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/jdk/Java8TimeModule.java index dfc1d39c..56bf5b72 100644 --- a/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/jdk/Java8TimeModule.java +++ b/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/jdk/Java8TimeModule.java @@ -15,8 +15,10 @@ import java.time.LocalTime; import java.time.format.DateTimeFormatter; /** - * java8 时间序列化 - * + * java8 时间序列化 受MySQL限制, 无法存储毫秒值. 所以值处理到秒级别 + * 目标: + * 写入时间支持传入秒和毫秒两种格式的时间, 存储时支持支持毫秒 + * 读取时间时携带毫秒信息 * @author xxm * @since 2020/4/14 13:33 */ diff --git a/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/JacksonRawTypeHandler.java b/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/JacksonRawTypeHandler.java index 68a0fe5a..3073d029 100644 --- a/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/JacksonRawTypeHandler.java +++ b/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/JacksonRawTypeHandler.java @@ -10,8 +10,9 @@ import org.apache.ibatis.type.MappedTypes; /** * Jackson 实现 JSON 字段类型处理器, 会记录对象属性类型, 通常用于储存不确定对象的属性上 - * 例如: 泛型对象、存储的数据是字段类型的子类等 - * + * 例如: object对象, 泛型对象、存储的数据是字段声明类型的子类等 + * 如果在使用知道明确类型的包装类是,如List、Set, 请使用 JacksonTypeReferenceHandler + * @see JacksonTypeReferenceHandler * @author xxm * @since 2022/7/11 */ diff --git a/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/JacksonTypeReferenceHandler.java b/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/JacksonTypeReferenceHandler.java new file mode 100644 index 00000000..580e10ba --- /dev/null +++ b/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/handler/JacksonTypeReferenceHandler.java @@ -0,0 +1,45 @@ +package cn.bootx.platform.common.mybatisplus.handler; + +import cn.bootx.platform.common.jackson.util.JacksonUtil; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import com.fasterxml.jackson.core.type.TypeReference; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +/** + * JSON字段类型转换抽象处理器, 需要进行继承实现, 可以在不在JSON字符串中记录数据类型,就可以对一些特殊类型进行反序列化 + * 例如: 集合类型List, 泛型对象ResResult 等 + * 通过 getTypeReference 接口, 将要进行反序列的对象传入 + * + * @author xxm + * @since 2024/1/3 + */ +@Slf4j +@MappedTypes({ Object.class }) +@MappedJdbcTypes(value = { JdbcType.VARCHAR, JdbcType.LONGVARCHAR }) +public abstract class JacksonTypeReferenceHandler extends AbstractJsonTypeHandler { + + /** + * 返回要反序列化的类型对象 + */ + public abstract TypeReference getTypeReference(); + + /** + * 反序列化 + */ + @Override + protected Object parse(String json) { + return JacksonUtil.toBean(json, this.getTypeReference()); + } + + /** + * 序列化 + */ + @Override + protected String toJson(Object obj) { + return JacksonUtil.toJson(obj); + } + +} diff --git a/pom.xml b/pom.xml index eda53d8b..bd527404 100644 --- a/pom.xml +++ b/pom.xml @@ -108,7 +108,7 @@ 3.6.1 1.7.0 3.23.0 - 4.2.0 + 4.4.0 1.5.5.Final 0.2.0 1.6.2 -- Gitee From c97610d5bc5207c24ce6bdde44b8766e9997c372 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Fri, 5 Jan 2024 20:01:12 +0800 Subject: [PATCH 30/38] =?UTF-8?q?build=20=20dependencyManagement=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E6=94=BE=E5=88=B0=E9=A1=B6=E7=BA=A7pom=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bootx-commons/pom.xml | 23 ----------------------- pom.xml | 41 ++++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/bootx-commons/pom.xml b/bootx-commons/pom.xml index 9031e965..e1813a8a 100644 --- a/bootx-commons/pom.xml +++ b/bootx-commons/pom.xml @@ -59,29 +59,6 @@ provided - - - - - org.springdoc - springdoc-openapi-ui - ${springdoc.version} - - - - org.redisson - redisson-spring-boot-starter - ${redisson.version} - - - - com.xuxueli - xxl-job-core - ${xxl-job.version} - - - - diff --git a/pom.xml b/pom.xml index bd527404..5ac42b75 100644 --- a/pom.xml +++ b/pom.xml @@ -128,7 +128,6 @@ - @@ -181,6 +180,27 @@ ${mapstruct.version} + + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + + + com.xuxueli + xxl-job-core + ${xxl-job.version} + + org.apache.velocity @@ -188,6 +208,13 @@ ${velocity.version} + + + cn.bootx + table-modify-mysql-boot-starter + ${table-modify.version} + + @@ -226,6 +253,12 @@ common-mybatis-plus ${bootx-platform.version} + + + cn.bootx.platform + common-super-query + ${bootx-platform.version} + cn.bootx.platform @@ -287,12 +320,6 @@ common-rabbitmq ${bootx-platform.version} - - - cn.bootx - table-modify-mysql-boot-starter - ${table-modify.version} - cn.bootx.platform -- Gitee From c8f9e4faa3a90a6f547fe24dcef4c8dd1eabb09a Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Sun, 7 Jan 2024 23:46:46 +0800 Subject: [PATCH 31/38] =?UTF-8?q?style=20=E6=B3=A8=E9=87=8A=E5=92=8C?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WeChatQrLoginController.java | 2 -- .../src/main/resources/application-dev.yml | 15 ++++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatQrLoginController.java b/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatQrLoginController.java index de3fda8b..825f5630 100644 --- a/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatQrLoginController.java +++ b/bootx-common-starters/common-starter-wechat/src/main/java/cn/bootx/platform/starter/wechat/controller/WeChatQrLoginController.java @@ -32,14 +32,12 @@ public class WeChatQrLoginController { @PostMapping("/applyQrCode") public ResResult applyQrCode() { return Res.ok(weChatQrLoginService.applyQrCode()); -// return Res.ok(new WeChatLoginQrCode().setQrCodeKey("123").setQrCodeUrl("xxkl")); } @Operation(summary = "获取扫码状态") @GetMapping("/getStatus") public ResResult getStatus(String qrCodeKey) { return Res.ok(weChatQrLoginService.getStatus(qrCodeKey)); -// return Res.ok("wait"); } } diff --git a/bootx-start/src/main/resources/application-dev.yml b/bootx-start/src/main/resources/application-dev.yml index 7582ffde..52ccbfb7 100644 --- a/bootx-start/src/main/resources/application-dev.yml +++ b/bootx-start/src/main/resources/application-dev.yml @@ -86,14 +86,19 @@ table-modify: scan-package: cn.bootx.platform database-type: mysql dromara: - x-file-storage: #文件存储配置, - default-platform: local #默认使用的存储平台 - thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】 + #文件存储配置, + x-file-storage: + #默认使用的存储平台 + default-platform: local + #缩略图后缀,例如【.min.jpg】【.png】 + thumbnail-suffix: ".min.jpg" local-plus: # 不启用自带的访问映射, 使用自定义的访问实现 - - platform: local # 存储平台标识 + # 存储平台标识 + - platform: local enableStorage: true - storage-path: D:/data/files/ # 存储路径 + # 文件存储路径 + storage-path: D:/data/files/ # Swagger 增强版 knife4j: enable: true -- Gitee From 3d183ae2f733baba373be8e63643cfd380e27e00 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Wed, 10 Jan 2024 15:54:51 +0800 Subject: [PATCH 32/38] =?UTF-8?q?fix=20=E9=83=A8=E5=88=86=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E9=85=8D=E7=BD=AE=E9=94=99=E8=AF=AF=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 1 + _doc/Task.md | 1 - .../bootx/platform/iam/core/permission/entity/PermMenu.java | 4 +--- .../iam/core/permission/service/PermMenuService.java | 2 ++ .../platform/notice/core/sms/entity/SmsChannelConfig.java | 5 +++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index e9d5f710..2f3bfaca 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -3,6 +3,7 @@ - 文件上传替换为基于`x-file-storage`定制 - 密码安全配置设置为必填. 保存信息化状态变为查看状态 - 密码过期后清除所有的权限,必须强制更改密码 +- fix: 部分实体类数据更新策略配置错误修复 ## [v1.3.5] 一号线-园博园 - 新增: SQL查询功能 diff --git a/_doc/Task.md b/_doc/Task.md index 83f76ce0..d9629b38 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,7 +1,6 @@ ## 1.3.6 - [x] 文件上传替换为基于`[x]-file-storage`定制 - [x] 新增一种新的JSON字段类型转换抽象处理器,可应用复杂类型的集合类型字段 -- [ ] Websocket连接管理页 - [x] 密码过期后清除所有的权限,必须强制更改密码 - [x] 菜单权限 - [x] 请求权限 diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/entity/PermMenu.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/entity/PermMenu.java index 9ad3006e..4b7b135e 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/entity/PermMenu.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/entity/PermMenu.java @@ -12,8 +12,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import static com.baomidou.mybatisplus.annotation.FieldStrategy.NEVER; - /** * 权限配置 * @@ -27,7 +25,7 @@ import static com.baomidou.mybatisplus.annotation.FieldStrategy.NEVER; public class PermMenu extends MpBaseEntity implements EntityBaseFunction { /** 父id */ - @TableField(updateStrategy = NEVER) +// @TableField(updateStrategy = NEVER) private Long parentId; /** 关联终端code */ diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/service/PermMenuService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/service/PermMenuService.java index 686bfb69..142ff45d 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/service/PermMenuService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/permission/service/PermMenuService.java @@ -73,6 +73,8 @@ public class PermMenuService { if (PermissionCode.MENU_TYPE_TOP.equals(permMenu.getMenuType())) { permMenu.setParentId(null); } + // TODO 检查上级菜单是否出现了循环依赖 + return permMenuManager.updateById(permMenu).toDto(); } diff --git a/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java b/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java index bb7d969c..bea4b695 100644 --- a/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java +++ b/bootx-services/service-notice/src/main/java/cn/bootx/platform/notice/core/sms/entity/SmsChannelConfig.java @@ -15,6 +15,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.dromara.sms4j.provider.enumerate.SupplierType; +import static com.baomidou.mybatisplus.annotation.FieldStrategy.ALWAYS; import static com.baomidou.mybatisplus.annotation.FieldStrategy.NEVER; /** @@ -61,11 +62,11 @@ public class SmsChannelConfig extends MpBaseEntity implements EntityBaseFunction /** 配置字符串 */ @DbMySqlFieldType(MySqlFieldTypeEnum.TEXT) @DbColumn(comment = "配置字符串") - @TableField(updateStrategy = NEVER) + @TableField(updateStrategy = ALWAYS) private String config; /** 图片 */ - @TableField(updateStrategy = NEVER) + @TableField(updateStrategy = ALWAYS) @DbColumn(comment = "图片") private Long image; -- Gitee From 7f066fd79d506e32a3df44bd5ff9746dd7644589 Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Sun, 14 Jan 2024 23:18:07 +0800 Subject: [PATCH 33/38] =?UTF-8?q?ref=20sql=E5=88=86=E9=A1=B5=E5=92=8C?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E6=97=B6,=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=BB=E9=94=AE=E5=80=92=E5=BA=8F,=20=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E7=89=B9=E6=80=A7=E7=9A=84=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 2 + .../common/core/annotation/QueryParam.java | 4 ++ .../core/rest/param/DateRangeParam.java | 62 +++++++++++++++++++ .../common/mybatisplus/base/MpIdEntity.java | 2 + .../generator/AnnotationQueryGenerator.java | 5 +- .../core/upms/service/RolePermService.java | 14 ++++- 6 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/DateRangeParam.java diff --git a/_doc/Task.md b/_doc/Task.md index d9629b38..db19a5b2 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -22,7 +22,9 @@ - [x] 给角色分配权限时,查看是否有父角色,如果有,限定只能在父角色下进行分配 - [ ] 菜单和请求权限只能系统管理员配置, 没有数据权限的控制 - [ ] 权限相关缓存机制更改, 不能直接用户关联到具体的权限 +- [x] MP分页和列表查询默认为ID降序 ## 1.3.[x]、1.4.[x] +- 查询构造器增加时间范围查询和和字段排序功能 - 请求权限优化, 新增注解, 扫描时可以根据注解自动进行特定的处理 - 接口平台功能 - 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 diff --git a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/annotation/QueryParam.java b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/annotation/QueryParam.java index d79dfc3e..00b1562e 100644 --- a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/annotation/QueryParam.java +++ b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/annotation/QueryParam.java @@ -54,6 +54,9 @@ public @interface QueryParam { /** 等于 */ EQ, + /** 范围查询 */ + BETWEEN, + /** 模糊匹配 */ LIKE, @@ -66,6 +69,7 @@ public @interface QueryParam { /** 是否为空, 只作用在布尔类型上, true 代表 is null, false 代表 not null */ IS_NULL; + } /** diff --git a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/DateRangeParam.java b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/DateRangeParam.java new file mode 100644 index 00000000..6b25cd64 --- /dev/null +++ b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/DateRangeParam.java @@ -0,0 +1,62 @@ +package cn.bootx.platform.common.core.rest.param; + +import cn.bootx.platform.common.core.annotation.QueryParam; +import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * 时间日期范围 + * @author xxm + * @since 2024/1/14 + */ +@Getter +@Setter +@QueryParam(ignore = true) +public class DateRangeParam { + + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Schema(description = "开始时间") + private LocalDate startTime; + + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Schema(description = "结束时间") + private LocalDate endTime; + + /** + * 获取开始时间 + */ + public String startTime(){ + return startTime("yyyy-MM-dd HH:mm:ss"); + } + + /** + * 获取开始时间 + */ + public String startTime(String format){ + return LocalDateTimeUtil.format(getStartTime().atStartOfDay(),format); + } + + /** + * 获取结束时间 + */ + public String endTime(){ + return endTime("yyyy-MM-dd HH:mm:ss"); + } + + + /** + * 获取结束时间 + */ + public String endTime(String format){ + return LocalDateTimeUtil.format(getEndTime().plusDays(1).atStartOfDay(),"yyyy-MM-dd HH:mm:ss"); + } + +} diff --git a/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/base/MpIdEntity.java b/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/base/MpIdEntity.java index 01855950..f722c95a 100644 --- a/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/base/MpIdEntity.java +++ b/bootx-commons/common-mybatis-plus/src/main/java/cn/bootx/platform/common/mybatisplus/base/MpIdEntity.java @@ -2,6 +2,7 @@ package cn.bootx.platform.common.mybatisplus.base; import cn.bootx.table.modify.annotation.DbColumn; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.OrderBy; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Getter; import lombok.Setter; @@ -24,6 +25,7 @@ public abstract class MpIdEntity implements Serializable { @DbColumn(comment = "主键", isKey = true, order = Integer.MIN_VALUE + 100) @TableId(type = IdType.ASSIGN_ID) + @OrderBy private Long id; } diff --git a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/AnnotationQueryGenerator.java b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/AnnotationQueryGenerator.java index cd0fd530..9bc390d5 100644 --- a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/AnnotationQueryGenerator.java +++ b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/AnnotationQueryGenerator.java @@ -142,6 +142,10 @@ public class AnnotationQueryGenerator { case LE: wrapper.le(columnName, paramValue); break; + case BETWEEN:{ + // 范围查询 + + } case LIKE: wrapper.like(columnName, paramValue); break; @@ -171,7 +175,6 @@ public class AnnotationQueryGenerator { /** * 获取查询参数注解 获取顺序: QueryParams 查询参数字段 > Entity 数据库实体字段 > QueryParams 查询类 > Entity * 数据库实体类 - * @return */ private Optional getQueryParamAnnotation(PropertyDescriptor paramDescriptor, Class paramClass, PropertyDescriptor entityDescriptor, Class entityClass) { diff --git a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java index 91fcc7f8..42139894 100644 --- a/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java +++ b/bootx-services/service-iam/src/main/java/cn/bootx/platform/iam/core/upms/service/RolePermService.java @@ -20,6 +20,7 @@ import cn.bootx.platform.starter.auth.exception.NotLoginException; import cn.bootx.platform.starter.auth.service.UserStatusService; import cn.bootx.platform.starter.auth.util.SecurityUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; @@ -28,7 +29,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -289,7 +289,17 @@ public class RolePermService { */ private List recursiveBuildTree(List permissions) { return TreeBuildUtil.build(permissions, null, BaseDto::getId, PermMenuDto::getParentId, - PermMenuDto::setChildren, Comparator.comparingDouble(PermMenuDto::getSortNo)); + PermMenuDto::setChildren, (o1, o2) -> { + // 先比较排序码 + if (ObjectUtil.isAllNotEmpty(o1.getSortNo(),o2.getSortNo())) { + int compare = o1.getSortNo().compareTo(o2.getSortNo()); + if (compare != 0) { + return compare; + } + } + // 后比较主键id + return o1.getId().compareTo(o2.getId()); + }); } } -- Gitee From ba86cb4a0edf7336e7cdbdfda9c36f2e1d9e9bca Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Mon, 15 Jan 2024 01:18:20 +0800 Subject: [PATCH 34/38] =?UTF-8?q?ref=20=E6=9F=A5=E8=AF=A2=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=99=A8=E5=AD=97=E6=AE=B5=E6=8E=92=E5=BA=8F=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E7=BB=A7=E6=89=BF=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/annotation/QueryParam.java | 11 ++- .../common/core/function/QueryBetween.java | 19 ++++++ .../core/rest/param/DateRangeParam.java | 35 +++++++++- .../common/core/rest/param}/QueryOrder.java | 6 +- .../platform/common/core/util/ClassUtils.java | 68 +++++++++++++++++++ .../common/query/entity/QueryParams.java | 1 + .../generator/AnnotationQueryGenerator.java | 33 ++++++--- .../query/generator/QueryGenerator.java | 2 +- .../query/generator/SuperQueryGenerator.java | 2 +- 9 files changed, 155 insertions(+), 22 deletions(-) create mode 100644 bootx-common-core/src/main/java/cn/bootx/platform/common/core/function/QueryBetween.java rename {bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/entity => bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param}/QueryOrder.java (71%) create mode 100644 bootx-common-core/src/main/java/cn/bootx/platform/common/core/util/ClassUtils.java diff --git a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/annotation/QueryParam.java b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/annotation/QueryParam.java index 00b1562e..a3d89271 100644 --- a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/annotation/QueryParam.java +++ b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/annotation/QueryParam.java @@ -13,14 +13,13 @@ import java.lang.annotation.*; @Documented @Inherited public @interface QueryParam { - /** * 匹配条件类型 */ CompareTypeEnum type() default CompareTypeEnum.EQ; /** - * 是否忽略 + * 生成查询条件时是否忽略 */ boolean ignore() default false; @@ -53,8 +52,7 @@ public @interface QueryParam { /** 等于 */ EQ, - - /** 范围查询 */ + /** 范围查询, 需要放在对象上, */ BETWEEN, /** 模糊匹配 */ @@ -67,9 +65,10 @@ public @interface QueryParam { LIKE_RIGHT, /** 是否为空, 只作用在布尔类型上, true 代表 is null, false 代表 not null */ - IS_NULL; - + IS_NULL, + /** 排序 */ + SORT; } /** diff --git a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/function/QueryBetween.java b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/function/QueryBetween.java new file mode 100644 index 00000000..23820285 --- /dev/null +++ b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/function/QueryBetween.java @@ -0,0 +1,19 @@ +package cn.bootx.platform.common.core.function; + +/** + * 查询生成器范围查询标识接口 + * @author xxm + * @since 2024/1/15 + */ +public interface QueryBetween { + + /** + * 获取开始值 + */ + Object getStart(); + + /** + * 获取结束值 + */ + Object getEnd(); +} diff --git a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/DateRangeParam.java b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/DateRangeParam.java index 6b25cd64..247fa0a0 100644 --- a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/DateRangeParam.java +++ b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/DateRangeParam.java @@ -51,12 +51,41 @@ public class DateRangeParam { return endTime("yyyy-MM-dd HH:mm:ss"); } - /** - * 获取结束时间 + * 获取结束日期 */ public String endTime(String format){ - return LocalDateTimeUtil.format(getEndTime().plusDays(1).atStartOfDay(),"yyyy-MM-dd HH:mm:ss"); + return LocalDateTimeUtil.format(getEndTime().plusDays(1).atStartOfDay(),"format"); + } + + + /** + * 获取开始日期 + */ + public String startDate(){ + return startDate("yyyy-MM-dd HH:mm:ss"); + } + + /** + * 获取开始日期 + */ + public String startDate(String format){ + return LocalDateTimeUtil.format(getStartTime(),format); + } + + + /** + * 获取开始日期 + */ + public String endDate(){ + return startDate("yyyy-MM-dd HH:mm:ss"); + } + + /** + * 获取结束日期 + */ + public String endDate(String format){ + return LocalDateTimeUtil.format(getEndTime(),format); } } diff --git a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/entity/QueryOrder.java b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/QueryOrder.java similarity index 71% rename from bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/entity/QueryOrder.java rename to bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/QueryOrder.java index bf0d6c46..9412a4f7 100644 --- a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/entity/QueryOrder.java +++ b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/rest/param/QueryOrder.java @@ -1,5 +1,6 @@ -package cn.bootx.platform.common.query.entity; +package cn.bootx.platform.common.core.rest.param; +import cn.bootx.platform.common.core.annotation.QueryParam; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -13,12 +14,15 @@ import lombok.experimental.Accessors; @Schema(title = "查询排序") public class QueryOrder { + @QueryParam(ignore = true) @Schema(description = "设置排序字段") private String sortField; + @QueryParam(ignore = true) @Schema(description = "是否升序") private boolean asc = true; + @QueryParam(ignore = true) @Schema(description = "参数名称是否需要转换成下划线命名") private boolean underLine = true; diff --git a/bootx-common-core/src/main/java/cn/bootx/platform/common/core/util/ClassUtils.java b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/util/ClassUtils.java new file mode 100644 index 00000000..281ffc45 --- /dev/null +++ b/bootx-common-core/src/main/java/cn/bootx/platform/common/core/util/ClassUtils.java @@ -0,0 +1,68 @@ +package cn.bootx.platform.common.core.util; + +import cn.hutool.core.util.ClassUtil; +import lombok.experimental.UtilityClass; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 类工具类 + * @author xxm + * @since 2023/5/30 + */ +@UtilityClass +public class ClassUtils { + + /** + * 获取字段属性 + */ + public Field getField(Class clas, String fieldName){ + if (Objects.isNull(clas)){ + throw new IllegalArgumentException("类为空"); + } + // 查询是否有该属性 + Field field = ClassUtil.getDeclaredField(clas, fieldName); + if (Objects.nonNull(field)){ + return field; + } + // 递归查询父类中的字段值 + if (Objects.nonNull(clas.getSuperclass())){ + return getField(clas.getSuperclass(),fieldName); + } + return null; + } + + /** + * 递归扫描父类的fields + * @param clas 类 + * @param fields 属性 + */ + public Field[] recursionParents(Class clas, Field[] fields) { + if (Objects.nonNull(clas.getSuperclass())) { + Class clsSup = clas.getSuperclass(); + List fieldList = new ArrayList<>(Arrays.asList(fields)); + // 获取当前class的所有fields的name列表 + List fdNames = fieldList.stream().map(Field::getName).collect(Collectors.toList()); + for (Field pfd : clsSup.getDeclaredFields()) { + // 避免重载属性 + if (fdNames.contains(pfd.getName())) { + continue; + } + fieldList.add(pfd); + } + fields = new Field[fieldList.size()]; + int i = 0; + for (Object field : fieldList.toArray()) { + fields[i] = (Field) field; + i++; + } + fields = recursionParents(clsSup, fields); + } + return fields; + } +} diff --git a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/entity/QueryParams.java b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/entity/QueryParams.java index 790a2349..55adb748 100644 --- a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/entity/QueryParams.java +++ b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/entity/QueryParams.java @@ -1,5 +1,6 @@ package cn.bootx.platform.common.query.entity; +import cn.bootx.platform.common.core.rest.param.QueryOrder; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; diff --git a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/AnnotationQueryGenerator.java b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/AnnotationQueryGenerator.java index 9bc390d5..8c0762ea 100644 --- a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/AnnotationQueryGenerator.java +++ b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/AnnotationQueryGenerator.java @@ -2,8 +2,10 @@ package cn.bootx.platform.common.query.generator; import cn.bootx.platform.common.core.annotation.QueryParam; import cn.bootx.platform.common.core.function.CollectorsFunction; +import cn.bootx.platform.common.core.function.QueryBetween; +import cn.bootx.platform.common.core.rest.param.QueryOrder; +import cn.bootx.platform.common.core.util.ClassUtils; import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.entity.QueryOrder; import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; @@ -83,7 +85,7 @@ public class AnnotationQueryGenerator { * @param 泛型 * @return 查询器 */ - QueryWrapper generator(Object queryParams, QueryOrder...queryOrder) { + QueryWrapper generator(Object queryParams, QueryOrder...queryOrders) { QueryWrapper wrapper = new QueryWrapper<>(); if (Objects.isNull(queryParams)) { @@ -115,8 +117,13 @@ public class AnnotationQueryGenerator { } // 处理排序条件 - initQueryOrder(wrapper,Objects.isNull(queryOrder)?null: Lists.newArrayList(queryOrder)); - + if (queryOrders.length > 0){ + initQueryOrder(wrapper,Lists.newArrayList(queryOrders)); + } else if (queryParams instanceof QueryOrder){ + // 如果没有显式传入排序参数, 则判断查询参数是否继承了QueryOrder对象, 如果继承了, 则使用该对象的排序条件 + QueryOrder order = (QueryOrder) queryParams; + initQueryOrder(wrapper, Collections.singletonList(order)); + } return wrapper; } @@ -143,8 +150,13 @@ public class AnnotationQueryGenerator { wrapper.le(columnName, paramValue); break; case BETWEEN:{ - // 范围查询 - + if (paramValue instanceof QueryBetween) { + QueryBetween queryBetween = (QueryBetween) paramValue; + wrapper.between(columnName, queryBetween.getStart(), queryBetween.getEnd()); + } else { + throw new IllegalArgumentException("Between查询条件值必须是实现QueryBetween接口"); + } + break; } case LIKE: wrapper.like(columnName, paramValue); @@ -157,7 +169,7 @@ public class AnnotationQueryGenerator { break; case IS_NULL: if (paramValue instanceof Boolean) { - if (((Boolean) paramValue).booleanValue()) { + if ((Boolean) paramValue) { wrapper.isNull(columnName); } else { @@ -180,7 +192,7 @@ public class AnnotationQueryGenerator { PropertyDescriptor entityDescriptor, Class entityClass) { // 参数字段 - Field paramField = ClassUtil.getDeclaredField(paramClass, paramDescriptor.getName()); + Field paramField = ClassUtils.getField(paramClass, paramDescriptor.getName()); if (AnnotationUtil.hasAnnotation(paramField, QueryParam.class)) { return Optional.ofNullable(AnnotationUtil.getAnnotation(paramField, QueryParam.class)); } @@ -190,6 +202,7 @@ public class AnnotationQueryGenerator { return Optional.ofNullable(AnnotationUtil.getAnnotation(entityField, QueryParam.class)); } } + // 参数类 if (AnnotationUtil.hasAnnotation(paramClass, QueryParam.class)) { return Optional.ofNullable(AnnotationUtil.getAnnotation(paramClass, QueryParam.class)); } @@ -238,10 +251,10 @@ public class AnnotationQueryGenerator { } for (QueryOrder queryOrder : queryOrders) { if (queryOrder.isUnderLine()) { - queryWrapper.orderBy(true, queryOrder.isAsc(), StrUtil.toUnderlineCase(queryOrder.getSortField())); + queryWrapper.orderBy(StrUtil.isNotBlank(queryOrder.getSortField()), queryOrder.isAsc(), StrUtil.toUnderlineCase(queryOrder.getSortField())); } else { - queryWrapper.orderBy(true, queryOrder.isAsc(), queryOrder.getSortField()); + queryWrapper.orderBy(StrUtil.isNotBlank(queryOrder.getSortField()), queryOrder.isAsc(), queryOrder.getSortField()); } } } diff --git a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/QueryGenerator.java b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/QueryGenerator.java index 555b1324..d516c846 100644 --- a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/QueryGenerator.java +++ b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/QueryGenerator.java @@ -1,6 +1,6 @@ package cn.bootx.platform.common.query.generator; -import cn.bootx.platform.common.query.entity.QueryOrder; +import cn.bootx.platform.common.core.rest.param.QueryOrder; import cn.bootx.platform.common.query.entity.QueryParams; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; diff --git a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/SuperQueryGenerator.java b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/SuperQueryGenerator.java index 1121ffbd..ebc89acf 100644 --- a/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/SuperQueryGenerator.java +++ b/bootx-commons/common-super-query/src/main/java/cn/bootx/platform/common/query/generator/SuperQueryGenerator.java @@ -3,7 +3,7 @@ package cn.bootx.platform.common.query.generator; import cn.bootx.platform.common.core.exception.BizException; import cn.bootx.platform.common.query.code.CompareTypeEnum; import cn.bootx.platform.common.query.entity.QueryBetweenParam; -import cn.bootx.platform.common.query.entity.QueryOrder; +import cn.bootx.platform.common.core.rest.param.QueryOrder; import cn.bootx.platform.common.query.entity.QueryParam; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -- Gitee From a0f6fce8daa2c99b7f4b90d4da842db7aaa09a27 Mon Sep 17 00:00:00 2001 From: bootx Date: Mon, 15 Jan 2024 22:17:29 +0800 Subject: [PATCH 35/38] =?UTF-8?q?doc=20=E4=BB=BB=E5=8A=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_doc/Task.md b/_doc/Task.md index db19a5b2..65994d53 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -23,6 +23,7 @@ - [ ] 菜单和请求权限只能系统管理员配置, 没有数据权限的控制 - [ ] 权限相关缓存机制更改, 不能直接用户关联到具体的权限 - [x] MP分页和列表查询默认为ID降序 +- [x] 查询构造器字段排序支持查询参数直接继承实现 ## 1.3.[x]、1.4.[x] - 查询构造器增加时间范围查询和和字段排序功能 - 请求权限优化, 新增注解, 扫描时可以根据注解自动进行特定的处理 -- Gitee From 0f5ca8b59ba2f82b3bce08a5debbb3c69b2b33c0 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Tue, 16 Jan 2024 14:17:48 +0800 Subject: [PATCH 36/38] =?UTF-8?q?feat=20=E6=97=B6=E9=97=B4=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96,=20=E6=94=AF=E6=8C=81=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E7=A7=92=E5=92=8C=E6=AF=AB=E7=A7=92?= =?UTF-8?q?=E7=BA=A7=E5=88=AB=E7=9A=84=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 2 ++ .../BootxLocalDateTimeDeserializer.java | 32 +++++++++++++++++++ .../BootxLocalTimeDeserializer.java | 31 ++++++++++++++++++ .../common/jackson/jdk/Java8TimeModule.java | 19 ++++++----- pom.xml | 6 ++++ 5 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/deserializer/BootxLocalDateTimeDeserializer.java create mode 100644 bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/deserializer/BootxLocalTimeDeserializer.java diff --git a/_doc/Task.md b/_doc/Task.md index 65994d53..8d59abef 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -12,6 +12,8 @@ - [x] 数据权限重构为数据角色, 用于管理数据权限相关配置 - [x] 增加关联部门及下级部门 - [x] 更新WebSocket的Demo样例 +- [x] Swagger相关配置不进行配置会无法启动处理 +- [x] 时间反序列化时, 支持反序列化秒和毫秒级别的时间 - 权限相关 - [x] 角色结构改为树形结构 - [x] 菜单和权限码, 子角色的权限不能大于父角色 diff --git a/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/deserializer/BootxLocalDateTimeDeserializer.java b/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/deserializer/BootxLocalDateTimeDeserializer.java new file mode 100644 index 00000000..f92d37e5 --- /dev/null +++ b/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/deserializer/BootxLocalDateTimeDeserializer.java @@ -0,0 +1,32 @@ +package cn.bootx.platform.common.jackson.deserializer; + +import cn.bootx.platform.common.core.util.LocalDateTimeUtil; +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeParseException; + +/** + * java8日期时间反序列化, 支持反序列化秒和毫秒级别的时间 + * @author xxm + * @since 2024/1/16 + */ +public class BootxLocalDateTimeDeserializer extends LocalDateTimeDeserializer { + + /** + * 解析日期时间 + */ + @Override + protected LocalDateTime _fromString(JsonParser p, DeserializationContext ctxt, String string0) throws IOException { + // 首先解析毫秒级时间, 如果解析失败, 则解析秒级时间 + try { + return LocalDateTimeUtil.parse(string0, DatePattern.NORM_DATETIME_MS_PATTERN); + } catch (DateTimeParseException e) { + return LocalDateTimeUtil.parse(string0, DatePattern.NORM_DATETIME_PATTERN); + } + } +} diff --git a/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/deserializer/BootxLocalTimeDeserializer.java b/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/deserializer/BootxLocalTimeDeserializer.java new file mode 100644 index 00000000..1f177e94 --- /dev/null +++ b/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/deserializer/BootxLocalTimeDeserializer.java @@ -0,0 +1,31 @@ +package cn.bootx.platform.common.jackson.deserializer; + +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; + +import java.io.IOException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + +/** + * java时间反序列化, 支持反序列化秒和毫秒级别的时间 + * @author xxm + * @since 2024/1/16 + */ +public class BootxLocalTimeDeserializer extends LocalTimeDeserializer { + + /** + * 反序列化 + */ + @Override + protected LocalTime _fromString(JsonParser p, DeserializationContext ctxt, String string0) throws IOException { + try { + return LocalTime.parse(string0, DateTimeFormatter.ofPattern("HH:mm:ss.SSS")); + } catch (DateTimeParseException e) { + return LocalTime.parse(string0, DatePattern.NORM_TIME_FORMATTER); + } + } +} diff --git a/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/jdk/Java8TimeModule.java b/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/jdk/Java8TimeModule.java index 56bf5b72..e9297813 100644 --- a/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/jdk/Java8TimeModule.java +++ b/bootx-commons/common-jackson/src/main/java/cn/bootx/platform/common/jackson/jdk/Java8TimeModule.java @@ -1,10 +1,10 @@ package cn.bootx.platform.common.jackson.jdk; +import cn.bootx.platform.common.jackson.deserializer.BootxLocalDateTimeDeserializer; +import cn.bootx.platform.common.jackson.deserializer.BootxLocalTimeDeserializer; import cn.hutool.core.date.DatePattern; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; @@ -15,28 +15,27 @@ import java.time.LocalTime; import java.time.format.DateTimeFormatter; /** - * java8 时间序列化 受MySQL限制, 无法存储毫秒值. 所以值处理到秒级别 - * 目标: - * 写入时间支持传入秒和毫秒两种格式的时间, 存储时支持支持毫秒 - * 读取时间时携带毫秒信息 + * java8 时间序列化 受MySQL限制, 无法存储毫秒值. 只能处理到秒级别 + * 写入时间支持毫秒格式的时间 + * 读取时间时可以处理到秒或毫秒 * @author xxm * @since 2020/4/14 13:33 */ public class Java8TimeModule extends SimpleModule { public Java8TimeModule() { + // 序列化 this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))); - this.addDeserializer(LocalDateTime.class, - new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); + // 反序列化 + this.addDeserializer(LocalDateTime.class, new BootxLocalDateTimeDeserializer()); this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); - this.addDeserializer(LocalTime.class, - new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))); + this.addDeserializer(LocalTime.class,new BootxLocalTimeDeserializer()); } } diff --git a/pom.xml b/pom.xml index 5ac42b75..69d295f3 100644 --- a/pom.xml +++ b/pom.xml @@ -283,6 +283,12 @@ common-sequence ${bootx-platform.version} + + + cn.bootx.platform + common-super-query + ${bootx-platform.version} + cn.bootx.platform -- Gitee From 7217ce4b5c9f5324e57a330a29eb7c17403611b6 Mon Sep 17 00:00:00 2001 From: bootx Date: Sat, 27 Jan 2024 00:36:01 +0800 Subject: [PATCH 37/38] =?UTF-8?q?doc=20=E4=BB=BB=E5=8A=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_doc/Task.md b/_doc/Task.md index 8d59abef..aeae5486 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -27,6 +27,7 @@ - [x] MP分页和列表查询默认为ID降序 - [x] 查询构造器字段排序支持查询参数直接继承实现 ## 1.3.[x]、1.4.[x] +- 查询构造器支持帮助功能 - 查询构造器增加时间范围查询和和字段排序功能 - 请求权限优化, 新增注解, 扫描时可以根据注解自动进行特定的处理 - 接口平台功能 -- Gitee From 251b3f2623b48de851dde9257023c3962d161968 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Wed, 31 Jan 2024 10:50:53 +0800 Subject: [PATCH 38/38] =?UTF-8?q?build=20SQL=E8=84=9A=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=92=8C=E4=BB=BB=E5=8A=A1=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config/sql/bootx-platform.sql | 2702 ++++++++--------- _doc/ChangeLog.md | 18 +- _doc/Task.md | 12 +- ...release.sql => V1.3.6_240131__release.sql} | 2702 ++++++++--------- 4 files changed, 2682 insertions(+), 2752 deletions(-) rename bootx-start/src/main/resources/db/migration/{V1.3.5_231021__release.sql => V1.3.6_240131__release.sql} (91%) diff --git a/_config/sql/bootx-platform.sql b/_config/sql/bootx-platform.sql index 8100f512..a14d5966 100644 --- a/_config/sql/bootx-platform.sql +++ b/_config/sql/bootx-platform.sql @@ -6,7 +6,7 @@ Target Server Type : MySQL File Encoding : 65001 - Date: 21/10/2023 18:53:38 + Date: 31/01/2024 10:42:54 */ SET NAMES utf8mb4; @@ -3012,6 +3012,29 @@ INSERT INTO `base_area` VALUES ('659009', '昆玉市', '6590'); INSERT INTO `base_area` VALUES ('659010', '胡杨河市', '6590'); INSERT INTO `base_area` VALUES ('659011', '新星市', '6590'); +-- ---------------------------- +-- Table structure for base_china_word +-- ---------------------------- +DROP TABLE IF EXISTS `base_china_word`; +CREATE TABLE `base_china_word` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `word` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '敏感词', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '分类', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '描述', + `enable` bit(1) NULL DEFAULT NULL COMMENT '是否启用', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `white` bit(1) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '敏感词' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of base_china_word +-- ---------------------------- + -- ---------------------------- -- Table structure for base_city -- ---------------------------- @@ -3370,181 +3393,71 @@ INSERT INTO `base_city` VALUES ('6543', '阿勒泰地区', '65'); INSERT INTO `base_city` VALUES ('6590', '自治区直辖县级行政区划', '65'); -- ---------------------------- --- Table structure for iam_perm_menu +-- Table structure for base_data_result_sql -- ---------------------------- -DROP TABLE IF EXISTS `iam_perm_menu`; -CREATE TABLE `iam_perm_menu` ( +DROP TABLE IF EXISTS `base_data_result_sql`; +CREATE TABLE `base_data_result_sql` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `database_id` bigint(20) NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `is_list` bit(1) NULL DEFAULT NULL, + `sql` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, + `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '数据集SQL语句' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of base_data_result_sql +-- ---------------------------- + +-- ---------------------------- +-- Table structure for base_dict +-- ---------------------------- +DROP TABLE IF EXISTS `base_dict`; +CREATE TABLE `base_dict` ( `id` bigint(20) NOT NULL, - `client_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '终端code', - `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父id', - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由名称', - `perm_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单权限编码', - `effect` bit(1) NULL DEFAULT NULL COMMENT '是否有效', - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标', - `hidden` bit(1) NOT NULL COMMENT '是否隐藏', - `hide_children_in_menu` bit(1) NOT NULL COMMENT '是否隐藏子菜单', - `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件', - `component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件名字', - `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路径', - `redirect` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单跳转地址(重定向)', - `sort_no` double NOT NULL COMMENT '菜单排序', - `menu_type` int(5) NOT NULL COMMENT '类型(0:一级菜单;1:子菜单 ;2:按钮权限)', - `leaf` bit(1) NULL DEFAULT NULL COMMENT '是否叶子节点', - `keep_alive` bit(1) NULL DEFAULT NULL COMMENT '是否缓存页面', - `target_outside` bit(1) NULL DEFAULT NULL COMMENT '是否外部打开方式', - `hidden_header_content` bit(1) NULL DEFAULT NULL COMMENT '隐藏的标题内容', - `admin` bit(1) NOT NULL COMMENT '系统菜单', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编码', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', + `enable` bit(1) NOT NULL DEFAULT b'1' COMMENT '启用状态', + `group_tag` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '分类标签', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(8) NULL DEFAULT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限_菜单' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_perm_menu +-- Records of base_dict -- ---------------------------- -INSERT INTO `iam_perm_menu` VALUES (1414596052497092608, 'admin', NULL, '系统管理', 'system', '', NULL, 'desktop', b'0', b'0', 'RouteView', '', '/system', '/system/user', -99999, 0, b'0', b'1', b'0', b'0', b'1', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-27 10:02:16', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596647509446656, 'admin', 1452569691537256448, '用户管理', 'User', '', NULL, '', b'0', b'0', 'system/user/UserList', '', '/system/userAuth/user', '', 0, 1, b'0', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-27 10:17:40', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596773275652096, 'admin', 1414596052497092608, '菜单管理', 'Menu', '', NULL, '', b'0', b'0', 'system/menu/MenuList', '', '/system/permission/menu', '', 0, 1, b'0', b'1', b'0', b'0', b'1', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-26 23:56:16', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596805538238464, 'admin', 1452569339987472384, '角色管理', 'Role', '', NULL, '', b'0', b'0', 'system/role/RoleList', '', '/system/permission/role', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-26 23:56:04', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596842322284544, 'admin', 1452569691537256448, '部门管理', 'Dept', '', NULL, '', b'0', b'0', 'system/dept/DeptList', '', '/system/userAuth/dept', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-26 23:56:31', 7, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596877617352704, 'admin', 1452571269199540224, '数据字典', 'Dict', '', b'0', '', b'0', b'0', 'system/dict/DictList', '', '/system/config/dict', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2022-05-19 09:04:55', 11, 0); -INSERT INTO `iam_perm_menu` VALUES (1431082258161434624, 'admin', 1452569691537256448, '在线用户管理', 'OnlineUser', '', NULL, '', b'0', b'0', 'system/online/OnlineUserList', NULL, '/system/userAuth/online', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-27 10:32:53', 6, 0); -INSERT INTO `iam_perm_menu` VALUES (1431083330909208576, 'admin', 1541427353886859264, '登录方式', 'LoginType', '', b'0', '', b'0', b'0', 'system/client/LoginTypeList', NULL, '/system/config/loginType', '', 9, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:37:09', 1399985191002447872, '2022-07-05 21:18:12', 11, 0); -INSERT INTO `iam_perm_menu` VALUES (1431089129232498688, 'admin', 1452569339987472384, '请求权限管理', 'Path', '', NULL, '', b'0', b'0', 'system/path/PathList', NULL, '/system/permission/path', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 11:00:11', 1399985191002447872, '2021-08-27 11:00:11', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1431152689832525824, 'admin', NULL, '系统监控', 'monitor', '', b'0', 'radar-chart', b'0', b'0', 'RouteView', NULL, '/monitor', '', 0, 0, b'1', b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2021-08-27 15:12:45', 1399985191002447872, '2022-06-17 17:57:30', 21, 0); -INSERT INTO `iam_perm_menu` VALUES (1431153358157348864, 'admin', 1431152689832525824, '接口文档', 'ApiSwagger', '', b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/doc.html', '', 0, 1, b'1', b'1', b'1', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 15:15:25', 1399985191002447872, '2022-10-14 17:47:12', 18, 0); -INSERT INTO `iam_perm_menu` VALUES (1435143678721236992, 'admin', 1452567897717321728, '登录日志', 'LoginLog', '', b'0', '', b'0', b'0', 'starter/log/LoginLogList', NULL, '/monitor/log/loginLog', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-07 15:31:31', 1399985191002447872, '2022-10-20 20:38:06', 6, 0); -INSERT INTO `iam_perm_menu` VALUES (1435476255797624832, 'admin', 1452567897717321728, '操作日志', 'OperateLog', '', b'0', '', b'0', b'0', 'starter/log/OperateLogList', NULL, '/monitor/log/OperateLog', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-08 13:33:04', 1399985191002447872, '2022-10-20 20:38:12', 8, 0); -INSERT INTO `iam_perm_menu` VALUES (1438061887002759168, 'admin', NULL, '通知管理', 'notice', '', NULL, 'message', b'0', b'0', 'RouteView', NULL, '/notice', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-15 16:47:26', 1399985191002447872, '2021-09-15 16:47:26', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1438072357281542144, 'admin', 1438061887002759168, '邮件配置', 'MailConfig', '', NULL, '', b'0', b'0', 'notice/mail/MailConfigList', NULL, '/notice/mailConfig', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-15 17:29:03', 1399985191002447872, '2021-09-15 17:29:03', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1439196893514031104, 'admin', 1438061887002759168, '消息模板', 'MessageTemplate', '', NULL, '', b'0', b'0', 'notice/template/TemplateList', NULL, '/notice/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-18 19:57:33', 1399985191002447872, '2021-09-18 19:57:33', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1440216178722050048, 'admin', 1438061887002759168, '钉钉', 'DingTalk', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/notice/dingTalk', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-21 15:27:50', 1399985191002447872, '2021-09-21 15:27:50', 0, 1); -INSERT INTO `iam_perm_menu` VALUES (1440216612211757056, 'admin', 1450822511087271936, '钉钉机器人', 'DingTalkRobot', '', b'0', '', b'0', b'0', 'third/dingtalk/robot/DingRobotConfigList', NULL, '/third/dingTalk/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-21 15:29:33', 1399985191002447872, '2022-07-26 13:34:35', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1450473063320526848, 'admin', 1452569691537256448, '第三方登录', 'Social', '', b'0', '', b'1', b'0', 'system/social/SocialList', NULL, '/system/userAuth/social', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-19 22:45:01', 1399985191002447872, '2022-07-26 13:35:47', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1450803906215886848, 'admin', 1452571269199540224, '定时任务', 'QuartzJobList', '', NULL, '', b'0', b'0', 'starter/quartz/QuartzJobList', NULL, '/system/config/quartz', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 20:39:41', 1399985191002447872, '2021-10-20 20:39:41', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1450819607680991232, 'admin', NULL, '第三方对接', 'third', '', b'0', 'branches', b'0', b'0', 'RouteView', NULL, '/third', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 21:42:04', 1399985191002447872, '2022-07-26 13:34:02', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1450821723027881984, 'admin', 1450819607680991232, '微信', 'WeChat', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/third/wechat', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 21:50:28', 1399985191002447872, '2022-08-03 23:23:10', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1450821877831254016, 'admin', 1450819607680991232, '企业微信', 'WeCom', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/third/wecom', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 21:51:05', 1399985191002447872, '2022-08-03 23:22:58', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1450822511087271936, 'admin', 1450819607680991232, '钉钉', 'DingTalk', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/third/dingtalk', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 21:53:36', 1399985191002447872, '2022-08-03 23:23:29', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1450827660459458560, 'admin', 1438061887002759168, '微信', 'NoticeWeChat', '', b'0', '', b'0', b'0', 'Dev', NULL, '/notice/wechat', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 22:14:04', 1399985191002447872, '2022-06-21 20:53:04', 1, 1); -INSERT INTO `iam_perm_menu` VALUES (1452567897717321728, 'admin', 1431152689832525824, '审计日志', 'auditLog', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/monitor/log', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:29:09', 1399985191002447872, '2022-10-20 20:37:46', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1452569339987472384, 'admin', 1414596052497092608, '权限管理', 'permission', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/system/permission', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:34:53', 1399985191002447872, '2021-10-25 17:34:53', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1452569691537256448, 'admin', 1414596052497092608, '用户信息', 'userAuth', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/system/userAuth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:36:17', 1399985191002447872, '2021-10-25 17:36:17', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1452571269199540224, 'admin', 1414596052497092608, '系统配置', 'systemConfig', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/system/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:42:33', 1399985191002447872, '2021-10-25 17:42:33', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1452638905302966272, 'admin', 1452571269199540224, '系统参数', 'SystemParam', '', NULL, '', b'0', b'0', 'system/param/SystemParamList', NULL, '/system/config/param', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 22:11:18', 1399985191002447872, '2021-10-25 22:11:18', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1474694545336676352, 'admin', 1452569339987472384, '数据范围权限', 'DataScope', '', NULL, '', b'0', b'0', 'system/scope/DataScopeList', NULL, '/system/permission/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-12-25 18:52:33', 1399985191002447872, '2021-12-25 18:52:33', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1480839877352476672, 'admin', 1452567897717321728, '数据版本日志', 'DataVersionLog', NULL, b'0', '', b'0', b'0', 'starter/log/DataVersionLogList', NULL, '/monitor/log/DataVersionLog', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-01-11 17:51:54', 1399985191002447872, '2022-10-20 20:38:18', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1490984296616263680, 'admin', 1552207982510706688, '文件管理', 'FIleUpLoad', NULL, b'0', '', b'0', b'0', 'develop/file/FileUploadList', NULL, '/develop/file', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-08 17:42:12', 1399985191002447872, '2022-07-28 09:16:56', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1495013564652429312, 'admin', 1552207982510706688, '代码生成', 'CodeGen', NULL, b'0', '', b'0', b'0', 'develop/codegen/CodeGenList', NULL, '/develop/codegen', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-19 20:33:04', 1399985191002447872, '2022-07-27 16:25:05', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1495968302034210816, 'admin', NULL, '功能演示', 'Demo', NULL, b'0', 'block', b'0', b'0', 'RouteView', NULL, '/demo', '', 99, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-22 11:46:52', 1399985191002447872, '2022-05-10 11:02:05', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1495969099987963904, 'admin', 1495968302034210816, '数据相关', 'DemoData', NULL, b'0', '', b'0', b'0', 'RouteView', NULL, '/demo/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-22 11:50:02', 1399985191002447872, '2022-03-24 16:27:46', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1496020308992143360, 'admin', 1495968302034210816, '超级查询', 'SuperQueryDemo', NULL, b'0', '', b'0', b'0', 'demo/query/SuperQueryDemoList', NULL, '/demo/query/super', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-22 15:13:31', 1399985191002447872, '2022-05-27 17:34:41', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1506910599819165696, 'admin', 1495969099987963904, '数据权限', 'DataPermDemoList', NULL, b'0', '', b'0', b'0', 'demo/data/perm/DataPermDemoList', NULL, '/demo/data/perm', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-24 16:27:39', 1399985191002447872, '2022-03-24 16:28:56', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1506910885463851008, 'admin', 1495969099987963904, '加密解密', 'DataEncryptDemo', NULL, b'0', '', b'0', b'0', 'demo/data/encrypt/DataEncryptDemoList', NULL, '/demo/data/encrypt', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-24 16:28:47', 1399985191002447872, '2022-03-24 16:28:47', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1506911113394913280, 'admin', 1495969099987963904, '数据脱敏', 'DataSensitiveDemo', NULL, b'0', '', b'0', b'0', 'demo/data/sensitive/DataSensitiveDemoList', NULL, '/demo/data/sensitive', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-24 16:29:41', 1399985191002447872, '2022-03-24 17:16:03', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1507998458886197248, 'admin', 1495968302034210816, 'WS演示', 'WebsocketDemo', NULL, b'0', '', b'0', b'0', 'demo/ws/WebsocketDemo', NULL, '/demo/ws', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-27 16:30:25', 1399985191002447872, '2022-03-27 16:30:25', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1509488473583562752, 'admin', 1495968302034210816, '幂等请求演示', 'IdempotentDemo', NULL, b'0', '', b'0', b'0', 'demo/idempotent/Idempotent', NULL, '/demo/idempotent', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-31 19:11:12', 1399985191002447872, '2022-05-27 17:35:00', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1511266086400524288, 'admin', 1450822511087271936, '钉钉配置', 'DingTalkConfig', NULL, b'0', '', b'1', b'0', 'third/dingtalk/config/DingTalkConfigList', NULL, '/third/dingtalk/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-04-05 16:54:48', 1399985191002447872, '2022-07-26 13:34:44', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1530120084482084864, 'admin', 1495968302034210816, '消息中间件演示', 'MQDemo', NULL, b'0', '', b'0', b'0', 'demo/mq/MqDemo', NULL, '/demo/mq', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-05-27 17:33:51', 1399985191002447872, '2022-05-31 15:12:15', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1530120684645044224, 'admin', 1530120084482084864, 'MQTT消息', 'MqttDemo', NULL, b'0', '', b'0', b'0', '', NULL, '/demo/mq/mqtt', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-05-27 17:36:14', 1399985191002447872, '2022-05-27 17:36:14', 0, 1); -INSERT INTO `iam_perm_menu` VALUES (1530120821144473600, 'admin', 1530120084482084864, 'RabbitMQ', 'RabbitDemo', NULL, b'0', '', b'0', b'0', '', NULL, '/demo/mq/rabbit', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-05-27 17:36:47', 1399985191002447872, '2022-05-27 17:36:47', 0, 1); -INSERT INTO `iam_perm_menu` VALUES (1534000136370204672, 'admin', 1431152689832525824, 'ELK日志', 'ELK', '', b'0', '', b'1', b'0', '', NULL, 'http://elk.dev.bootx.cn:5601/app/discover', '', 0, 1, NULL, b'1', b'1', b'0', b'0', NULL, 1399985191002447872, '2022-06-07 10:31:48', 1399985191002447872, '2022-06-07 10:31:48', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1534008203006652416, 'admin', 1431152689832525824, 'PlumeLog日志', 'PlumeLog', '', b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/plumelog/#/', '', 0, 1, NULL, b'1', b'1', b'0', b'0', NULL, 1399985191002447872, '2022-06-07 11:03:51', 1399985191002447872, '2022-06-07 11:06:13', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1535451167008436224, 'admin', 1431152689832525824, '系统信息', 'SysInfo', NULL, b'0', '', b'0', b'0', 'starter/monitor/SystemInfoMonitor', NULL, '/monitor/sysinfo', '', 0, 1, NULL, b'0', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-11 10:37:40', 1399985191002447872, '2022-06-13 13:07:46', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1535965936371085312, 'admin', 1431152689832525824, 'Redis监控', 'RedisInfoMonitor', NULL, b'0', '', b'0', b'0', 'starter/monitor/RedisInfoMonitor', NULL, '/monitor/redis', '', 0, 1, NULL, b'0', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-12 20:43:11', 1399985191002447872, '2022-06-13 13:07:38', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1537730140522348544, 'admin', 1438061887002759168, '站内信', 'SiteMessageSender', '', b'0', '', b'0', b'0', 'notice/site/sender/SiteMessageList', NULL, '/notice/siteMessage', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-17 17:33:30', 1399985191002447872, '2022-08-20 21:12:30', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1538160478872625152, 'admin', 1495968302034210816, '富文本编辑', 'WangEditorDemo', NULL, b'0', '', b'0', b'0', 'demo/wangeditor/WangEditorDemo', NULL, '/demo/wangEditor', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-18 22:03:30', 1399985191002447872, '2022-06-18 22:03:31', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1541355214204030976, 'admin', 1541427353886859264, '认证终端', 'Client', '', b'0', '', b'0', b'0', 'system/client/ClientList', NULL, '/system/config/client', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:37:08', 1399985191002447872, '2022-07-05 21:17:45', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1541427353886859264, 'admin', 1414596052497092608, '认证管理', 'Auth', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/system/auth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-27 22:24:54', 1399985191002447872, '2022-06-27 22:24:54', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1551803592828932096, 'admin', 1450821877831254016, '企微机器人', 'WeComRobot', '', b'0', '', b'0', b'0', 'third/wecom/robot/WeComRobotConfigList', NULL, '/third/wecom/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-07-26 13:36:22', 1399985191002447872, '2022-10-24 11:07:27', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1552207982510706688, 'admin', NULL, '开发管理', 'develop', NULL, b'0', 'gold', b'0', b'0', 'RouteView', NULL, '/develop', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-07-27 16:23:16', 1399985191002447872, '2022-07-27 16:39:09', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1552208167664062464, 'admin', 1552207982510706688, '动态表单', 'DynamicForm', NULL, b'0', '', b'0', b'0', 'develop/dynamicform/DynamicFormList', NULL, '/develop/form', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-07-27 16:24:00', 1399985191002447872, '2022-07-27 16:38:05', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1554720980865380352, 'admin', 1495968302034210816, '消息通知', 'NoticeDemo', NULL, b'0', '', b'0', b'0', 'RouteView', NULL, '/demo/notice', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-03 14:49:02', 1399985191002447872, '2022-08-03 14:49:02', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1554721654336385024, 'admin', 1554720980865380352, '邮件发送', 'EmailDemo', NULL, b'0', '', b'0', b'0', 'demo/notice/email/EmailSender', NULL, '/demo/notice/email', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-03 14:51:42', 1399985191002447872, '2022-08-03 14:51:42', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1554850179754975232, 'admin', 1450821723027881984, '消息模板', 'WeChatTemplate', NULL, b'0', '', b'0', b'0', 'third/wechat/template/WeChatTemplateList', NULL, '/third/wechat/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-03 23:22:25', 1399985191002447872, '2022-08-03 23:23:18', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1555835229426368512, 'admin', 1450821723027881984, '自定义菜单', 'WeChatMenu', NULL, b'0', '', b'0', b'0', 'third/wechat/menu/WeChatMenuList', NULL, '/third/wechat/menu', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-06 16:36:39', 1399985191002447872, '2022-08-08 12:14:14', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1556997405528805376, 'admin', 1450821723027881984, '素材管理', 'WeChatMedia', NULL, b'0', '', b'0', b'0', 'third/wechat/media/WeChatMediaList', NULL, '/third/wechat/media', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-09 21:34:44', 1399985191002447872, '2022-08-09 21:34:44', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1573669546890297344, 'admin', 1552207982510706688, '动态数据源', 'DynamicSource', NULL, b'0', '', b'0', b'0', 'develop/dynamicsource/DynamicDataSourceList', NULL, '/develop/source', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-09-24 21:43:52', 1399985191002447872, '2022-09-24 21:43:52', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1580740450633101312, 'adminv3', NULL, '系统管理', 'System', NULL, b'0', 'ant-design:setting-outlined', b'0', b'0', 'Layout', NULL, '/system', '/system1/client', -99999, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:01:07', 1414143554414059520, '2022-10-18 15:32:09', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1580740637841666048, 'adminv3', 1582253306356649984, '终端管理', 'ClientList', NULL, b'0', '', b'0', b'0', '/modules/system/client/ClientList.vue', NULL, '/system/client', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:01:51', 1414143554414059520, '2022-10-18 14:13:27', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1580740758629232640, 'adminv3', 1582253306356649984, '登录方式', 'LoginTypeList', NULL, b'0', '', b'0', b'0', '/modules/system/loginType/LoginTypeList.vue', NULL, '/system/loginType', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:02:20', 1414143554414059520, '2022-10-18 14:13:40', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1580858583654051840, 'adminv3', 1580740450633101312, '测试Iframe', 'Iframe', NULL, b'0', '', b'0', b'0', 'Iframe', NULL, '/system/Iframe', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 17:50:32', 1414143554414059520, '2022-10-17 17:46:19', 5, 1); -INSERT INTO `iam_perm_menu` VALUES (1580917438227075072, 'adminv3', 1580740450633101312, '三极目录', 'hello', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system1/a', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 21:44:24', 1399985191002447872, '2022-10-14 23:38:16', 2, 1); -INSERT INTO `iam_perm_menu` VALUES (1580917571069071360, 'adminv3', 1580917438227075072, '百度', 'baidu', NULL, b'0', '', b'0', b'0', '', NULL, 'https://www.baidu.com/', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 21:44:56', 1399985191002447872, '2022-10-14 23:37:44', 3, 1); -INSERT INTO `iam_perm_menu` VALUES (1580928436300337152, 'adminv3', 1580740450633101312, '菜单管理', 'MenuList', NULL, b'0', '', b'0', b'0', '/modules/system/menu/MenuList.vue', NULL, '/system/menu', '', -99, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 22:28:06', 1399985191002447872, '2022-10-14 22:28:32', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582249924602580992, 'adminv3', 1580740450633101312, '权限管理', 'Permission', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/permission', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 13:59:13', 1414143554414059520, '2022-10-18 13:59:13', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582253011803262976, 'adminv3', 1580740450633101312, '用户信息', 'UserAuth', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/user', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:11:30', 1414143554414059520, '2022-10-18 14:11:30', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582253152903843840, 'adminv3', 1580740450633101312, '系统配置', 'SystemConfig', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:12:03', 1414143554414059520, '2022-10-18 14:12:03', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582253306356649984, 'adminv3', 1580740450633101312, '认证管理', 'Auth', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/auth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:12:40', 1414143554414059520, '2022-10-18 14:13:13', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582275875424129024, 'adminv3', NULL, '系统监控', 'Monitor', NULL, b'0', 'ant-design:monitor-outlined', b'0', b'0', 'Layout', NULL, '/monitor', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:42:21', 1414143554414059520, '2022-10-19 17:29:29', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582275984849326080, 'adminv3', NULL, '通知管理', 'Notice', NULL, b'0', 'ant-design:message-outlined', b'0', b'0', 'Layout', NULL, '/notice', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:42:47', 1414143554414059520, '2022-10-19 17:30:06', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582276092038959104, 'adminv3', NULL, '第三方对接', 'Third', NULL, b'0', 'ant-design:api-twotone', b'0', b'0', 'Layout', NULL, '/third', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:43:12', 1414143554414059520, '2022-10-19 17:32:04', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582276341792985088, 'adminv3', NULL, '开发管理', 'Develop', NULL, b'0', 'ant-design:apartment-outlined', b'0', b'0', 'Layout', NULL, '/develop', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:44:12', 1414143554414059520, '2022-10-19 15:24:22', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582276516905177088, 'adminv3', NULL, '功能演示', 'Demo', NULL, b'0', 'ant-design:appstore-twotone', b'0', b'0', 'Layout', NULL, '/demo', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:44:54', 1414143554414059520, '2022-10-19 17:34:26', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582277076421136384, 'adminv3', 1582249924602580992, '角色管理', 'RoleList', NULL, b'0', '', b'0', b'0', '/modules/system/role/RoleList.vue', NULL, '/system/permission/role', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:47:07', 1414143554414059520, '2022-10-18 15:59:37', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582301940364308480, 'adminv3', 1582249924602580992, '请求权限管理', 'PermPathList', NULL, b'0', '', b'0', b'0', '/modules/system/path/PermPathList.vue', NULL, '/system/permission/path', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:25:55', 1414143554414059520, '2022-10-18 20:41:22', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582302180999917568, 'adminv3', 1582249924602580992, '数据范围权限', 'DataScopeList', NULL, b'0', '', b'0', b'0', '/modules/system/scope/DataScopeList.vue', NULL, '/system/permission/scope', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:26:52', 1414143554414059520, '2022-10-18 17:26:52', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582302542955769856, 'adminv3', 1582253011803262976, '用户管理', 'UserList', NULL, b'0', '', b'0', b'0', '/modules/system/user/UserList.vue', NULL, '/system/user/info', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:28:19', 1414143554414059520, '2022-10-18 17:28:19', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582302764129808384, 'adminv3', 1582253011803262976, '部门管理', 'DeptList', NULL, b'0', '', b'0', b'0', '/modules/system/dept/DeptList.vue', NULL, '/system/user/dept', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:29:11', 1414143554414059520, '2022-10-18 17:32:26', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582303143110340608, 'adminv3', 1582253152903843840, '数据字典', 'DictList', NULL, b'0', '', b'0', b'0', '/modules/system/dict/DictList.vue', NULL, '/system/config/dict', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:30:42', 1414143554414059520, '2022-10-18 17:30:42', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582303290070364160, 'adminv3', 1582253152903843840, '定时任务', 'QuartzJobList', NULL, b'0', '', b'0', b'0', '/modules/baseapi/quartz/QuartzJobList.vue', NULL, '/system/config/quartz', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:31:17', 1414143554414059520, '2023-08-09 15:50:46', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1582303447428067328, 'adminv3', 1582253152903843840, '系统参数', 'SystemParamList', NULL, b'0', '', b'0', b'0', '/modules/system/param/SystemParamList.vue', NULL, '/system/config/param', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:31:54', 1414143554414059520, '2022-10-19 23:14:16', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582632873244172288, 'adminv3', 1582276341792985088, '文件管理', 'FileUploadList', NULL, b'0', '', b'0', b'0', '/modules/develop/file/FileUploadList.vue', NULL, '/develop/file', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:20:56', 1414143554414059520, '2022-10-19 15:20:56', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582633196587261952, 'adminv3', 1582276341792985088, '代码生成', 'CodeGenList', NULL, b'0', '', b'0', b'0', '/modules/develop/codegen/CodeGenList.vue', NULL, '/develop/codegen', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:22:13', 1414143554414059520, '2022-10-19 15:23:17', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582633307786649600, 'adminv3', 1582276341792985088, '动态表单', 'DynamicFormList', NULL, b'0', '', b'0', b'0', '/modules/develop/dynamicform/DynamicFormList.vue', NULL, '/develop/form', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:22:39', 1414143554414059520, '2022-10-19 15:22:39', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582633620321017856, 'adminv3', 1582276341792985088, '动态数据源', 'DynamicDataSourceList', NULL, b'0', '', b'0', b'0', '/modules/develop/dynamicsource/DynamicDataSourceList.vue', NULL, '/develop/source', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:23:54', 1414143554414059520, '2022-10-19 15:23:54', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583074308040925184, 'adminv3', 1582275875424129024, '接口文档', 'ApiSwagger', NULL, b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/doc.html', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:35:02', 1414143554414059520, '2022-11-23 13:59:09', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1583075229563068416, 'adminv3', 1582275875424129024, '审计日志', 'AuditLog', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/monitor/log', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:38:42', 1414143554414059520, '2022-10-20 20:41:38', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1583076217481043968, 'adminv3', 1583075229563068416, '登录日志', 'LoginLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/login/LoginLogList.vue', NULL, '/monitor/log/login', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:42:37', 1414143554414059520, '2022-10-20 20:43:36', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1583076424935514112, 'adminv3', 1583075229563068416, '操作日志', 'OperateLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/operate/OperateLogList.vue', NULL, '/monitor/log/operate', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:43:26', 1414143554414059520, '2022-10-20 20:43:26', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583076670881112064, 'adminv3', 1583075229563068416, '数据版本日志', 'DataVersionLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/data/DataVersionLogList.vue', NULL, '/monitor/log/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:44:25', 1414143554414059520, '2022-10-20 20:44:25', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583076878956339200, 'adminv3', 1582275875424129024, 'ELK日志', 'ELK', NULL, b'0', '', b'1', b'0', '', NULL, 'http://elk.dev.bootx.cn:5601/app/discover', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:45:15', 1414143554414059520, '2023-08-12 19:26:12', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1583077015434797056, 'adminv3', 1582275875424129024, 'PlumeLog日志', 'PlumeLog', NULL, b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/plumelog/#/', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:45:47', 1414143554414059520, '2022-10-20 20:45:47', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583077198772019200, 'adminv3', 1582275875424129024, '系统信息', 'SystemInfoMonitor', NULL, b'0', '', b'0', b'0', '/modules/monitor/system/SystemInfoMonitor.vue', NULL, '/monitor/sysinfo', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:46:31', 1414143554414059520, '2022-10-20 20:46:31', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583077360827342848, 'adminv3', 1582275875424129024, 'Redis监控', 'RedisInfoMonitor', NULL, b'0', '', b'0', b'0', '/modules/monitor/redis/RedisInfoMonitor.vue', NULL, '/monitor/redis', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:47:10', 1414143554414059520, '2022-10-20 20:47:10', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584378294652051456, 'adminv3', 1582275984849326080, '邮件配置', 'MailConfigList', NULL, b'0', '', b'0', b'0', '/modules/notice/mail/MailConfigList.vue', NULL, '/notice/notice', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:56:36', 1414143554414059520, '2022-10-24 16:14:34', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1584378497824137216, 'adminv3', 1582275984849326080, '消息模板', 'MessageTemplateList', NULL, b'0', '', b'0', b'0', '/modules/notice/template/MessageTemplateList.vue', NULL, '/notice/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:57:25', 1414143554414059520, '2022-10-25 22:14:14', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1584378671266996224, 'adminv3', 1582275984849326080, '站内信', 'SiteMessageList', NULL, b'0', '', b'0', b'0', '/modules/notice/site/sender/SiteMessageList.vue', NULL, '/notice/siteMessage', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:58:06', 1414143554414059520, '2022-10-24 10:58:06', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584379602188574720, 'adminv3', 1582276092038959104, '微信', 'WeChat', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/wechat', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:01:48', 1414143554414059520, '2022-10-24 11:01:48', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584379704122744832, 'adminv3', 1582276092038959104, '企业微信', 'WeCom', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/wecom', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:02:12', 1414143554414059520, '2022-10-24 11:02:12', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584380087805091840, 'adminv3', 1582276092038959104, '钉钉', 'DingTalk', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/dingtalk', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:03:44', 1414143554414059520, '2022-10-24 11:03:44', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584380527829524480, 'adminv3', 1584379602188574720, '消息模板', 'WechatTemplateList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/template/WechatTemplateList.vue', NULL, '/third/wechat/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:05:29', 1414143554414059520, '2022-10-26 15:58:56', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1584380679478779904, 'adminv3', 1584379602188574720, '自定义菜单', 'WechatMenuList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/menu/WechatMenuList.vue', NULL, '/third/wechat/menu', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:06:05', 1414143554414059520, '2022-10-27 10:15:24', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1584380824308097024, 'adminv3', 1584379602188574720, '素材管理', 'WechatMediaList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/media/WechatMediaList.vue', NULL, '/third/wechat/media', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:06:40', 1414143554414059520, '2022-10-27 16:38:47', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1584381134950834176, 'adminv3', 1584379704122744832, '企微机器人', 'WeComRobotConfigList', NULL, b'0', '', b'0', b'0', '/modules/third/wecom/robot/WecomRobotConfigList.vue', NULL, '/third/wecom/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:07:54', 1414143554414059520, '2022-11-12 20:58:25', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1584381322184564736, 'adminv3', 1584380087805091840, '钉钉机器人', 'DingRobotConfigList', NULL, b'0', '', b'0', b'0', '/modules/third/dingtalk/robot/DingRobotConfigList.vue', NULL, '/third/dingTalk/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:08:38', 1414143554414059520, '2022-11-12 20:58:37', 6, 0); -INSERT INTO `iam_perm_menu` VALUES (1584381477986181120, 'adminv3', 1584380087805091840, '钉钉配置', 'DingRobotConfigList', NULL, b'0', '', b'1', b'0', '/modules/third/dingtalk/config/DingTalkConfigList.vue', NULL, '/third/dingtalk/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:09:15', 1414143554414059520, '2022-11-11 16:04:47', 1, 1); -INSERT INTO `iam_perm_menu` VALUES (1597044371008516096, 'adminv3', NULL, '功能演示', 'Demo', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/demo', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 09:47:04', 1414143554414059520, '2022-11-28 09:47:04', 0, 1); -INSERT INTO `iam_perm_menu` VALUES (1597102799370317824, 'adminv3', 1582276516905177088, '数据相关', 'DemoData', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/demo/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 13:39:15', 1414143554414059520, '2022-11-28 13:39:15', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1597210969883275264, 'adminv3', 1582276516905177088, '超级查询', 'SuperQueryDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/query/SuperQueryDemoList.vue', NULL, '/demo/query/super', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 20:49:05', 1414143554414059520, '2022-11-28 21:00:14', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1599337250200440832, 'adminv3', NULL, '关于', '', NULL, b'0', 'simple-icons:about-dot-me', b'0', b'0', '', NULL, '/about/index', '', 99, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 17:38:09', 1414143554414059520, '2022-12-04 17:43:32', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1599378494880436224, 'adminv3', 1582276516905177088, 'WS演示', 'WebsocketDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/ws/WebsocketDemo', NULL, '/demo/ws', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:03', 1414143554414059520, '2023-02-08 12:17:58', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1599378579513102336, 'adminv3', 1582276516905177088, '幂等请求演示', 'IdempotentDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/idempotent/IdempotentDemo', NULL, '/demo/idempotent', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:23', 1414143554414059520, '2023-02-08 11:46:00', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1599378728490586112, 'adminv3', 1582276516905177088, '消息中间件演示', 'MqDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/mq/MqDemo', NULL, '/demo/mq', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:59', 1414143554414059520, '2023-02-08 22:09:04', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1599378838519762944, 'adminv3', 1582276516905177088, '富文本编辑', 'WangEditorDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/wangeditor/WangEditorDemo.vue', NULL, '/demo/wangEditor', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:23:25', 1414143554414059520, '2023-02-10 09:05:16', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1617847577158324224, 'adminv3', 1597102799370317824, '数据权限', 'DataPermDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/perm/DataPermDemoList.vue', NULL, '/demo/data/perm', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:31:35', 1414143554414059520, '2023-01-24 20:06:04', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1617847653746315264, 'adminv3', 1597102799370317824, '加密解密', 'DataEncryptDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/encrypt/DataEncryptDemoList.vue', NULL, '/demo/data/encrypt', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:31:53', 1414143554414059520, '2023-01-24 20:05:45', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1617847747375763456, 'adminv3', 1597102799370317824, '数据脱敏', 'DataSensitiveDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/sensitive/DataSensitiveDemoList.vue', NULL, '/demo/data/sensitive', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:32:16', 1414143554414059520, '2023-01-24 20:06:58', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1621150743447965696, 'admin', 1495968302034210816, '省市区联动', 'ChinaRegionDemo', NULL, b'0', '', b'0', b'0', 'demo/chinaregion/ChinaRegionDemo', NULL, '/demo/chinaregion', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-02-02 22:17:11', 1399985191002447872, '2023-02-08 09:43:39', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1623156857846034432, 'adminv3', 1582276516905177088, '省市区联动', 'ChinaRegionDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/chinaregion/ChinaRegionDemo', NULL, '/demo/chinaregion', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-08 11:08:46', 1414143554414059520, '2023-02-08 11:08:46', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1623325795944439808, 'adminv3', 1599378992811429888, '邮件通知', 'EmailSenderDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/notice/email/EmailSenderDemo.vue', NULL, '/demo/notice/email', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-08 22:20:04', 1414143554414059520, '2023-02-20 10:38:55', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1623494586215579648, 'admin', 1552207982510706688, '行政区划', 'ChinaRegion', NULL, b'0', '', b'1', b'0', 'develop/region/ChinaRegionList', NULL, '/develop/region', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-02-09 09:30:47', 1399985191002447872, '2023-02-09 17:50:05', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1629039360928075776, 'adminv3', 1582276341792985088, '可视化大屏', 'ProjectInfoList', NULL, b'0', '', b'0', b'0', '/modules/develop/report/ProjectInfoList', NULL, '/develop/report', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-24 16:43:44', 1414143554414059520, '2023-02-24 16:44:17', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1631946120891707392, 'admin', 1552207982510706688, '可视化大屏', 'ProjectInfoList', NULL, b'0', '', b'0', b'0', 'develop/report/ProjectInfoList', NULL, '/develop/report', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-03-04 17:14:10', 1399985191002447872, '2023-03-04 17:14:10', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1635274568758435840, 'adminv3', 1582276341792985088, '数据集管理', 'DataResultSqlList', NULL, b'0', '', b'0', b'0', '/modules/develop/dataresult/DataResultSqlList', NULL, '/develop/dataresult', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-03-13 21:40:14', 1414143554414059520, '2023-09-18 14:26:51', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1687369862646558720, 'adminv3', 1582275984849326080, '短信管理', 'Sms', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/notice/sms', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:48:20', 1414143554414059520, '2023-08-04 15:48:32', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1687370142234669056, 'adminv3', 1687369862646558720, '短信配置', 'SmsChannelConfigList', NULL, b'0', '', b'0', b'0', '/modules/notice/sms/config/SmsChannelConfigList', NULL, '/notice/sms/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:49:26', 1414143554414059520, '2023-08-04 15:49:26', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1687370277496778752, 'adminv3', 1687369862646558720, '短信模板', 'SmsTemplateList', NULL, b'0', '', b'0', b'0', '/modules/notice/sms/template/SmsTemplateList', NULL, '/notice/sms/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:49:59', 1414143554414059520, '2023-08-04 15:50:38', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1689181991598997504, 'adminv3', 1582253152903843840, '敏感词管理', 'ChinaWord', NULL, b'0', '', b'0', b'0', '/modules/baseapi/chianword/ChinaWordList.vue', NULL, '/system/config/chinaword', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-09 15:49:05', 1414143554414059520, '2023-08-09 15:49:05', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1690324070514782208, 'adminv3', 1582276341792985088, '通用模板', 'GeneralTemplateList', NULL, b'0', '', b'0', b'0', '/modules/develop/template/GeneralTemplateList', NULL, '/develop/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-12 19:27:18', 1414143554414059520, '2023-08-12 19:31:26', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1703665090038800384, 'adminv3', 1582276341792985088, '在线SQL', 'SqlQueryInfo', NULL, b'0', '', b'0', b'0', '/modules/develop/query/SqlQueryInfo', NULL, '/develop/sqlquery', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-09-18 14:59:45', 1414143554414059520, '2023-09-18 14:59:45', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1713931084759293952, 'adminv3', 1582253306356649984, '密码安全', 'PassowrdSecurity', NULL, b'0', '', b'0', b'0', '/modules/system/security/password/PasswordSecurityConfig.vue', NULL, '/system/config/passowrd', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-10-16 22:53:09', 1399985191002447872, '2023-10-16 22:58:59', 2, 0); +INSERT INTO `base_dict` VALUES (1422929378374828033, 'Sex', '性别', b'1', '基础属性', '性别', 0, '2021-08-04 22:36:15', 1399985191002447872, '2022-05-11 19:48:40', 0, 6); +INSERT INTO `base_dict` VALUES (1425744045414772737, 'MenuType', '菜单类型', b'1', '系统属性', '菜单类型', 0, '2021-08-12 17:00:44', 1399985191002447872, '2022-05-11 19:48:44', 0, 4); +INSERT INTO `base_dict` VALUES (1430063572491411456, 'loginType', '字典类型', b'1', '基础属性', '字典类型', 1399985191002447872, '2021-08-24 15:05:00', 1399985191002447872, '2021-08-24 15:05:00', 1, 2); +INSERT INTO `base_dict` VALUES (1435829999592759296, 'UserStatusCode', '用户状态码', b'1', '系统属性', '用户状态码', 1399985191002447872, '2021-09-09 12:58:43', 1399985191002447872, '2022-05-11 19:48:56', 0, 2); +INSERT INTO `base_dict` VALUES (1435838066191458304, 'LogBusinessType', '业务操作类型', b'1', '系统属性', '操作日志记录的业务操作类型', 1399985191002447872, '2021-09-09 13:30:46', 1399985191002447872, '2022-05-11 19:49:00', 0, 2); +INSERT INTO `base_dict` VALUES (1438078864509317120, 'MailSecurityCode', '邮箱安全方式编码', b'1', '消息服务', '邮箱安全方式编码', 1399985191002447872, '2021-09-15 17:54:54', 1399985191002447872, '2022-05-11 19:49:06', 0, 2); +INSERT INTO `base_dict` VALUES (1439961232651034624, 'MessageTemplateCode', '消息模板类型', b'1', '消息服务', '消息模板类型', 1399985191002447872, '2021-09-20 22:34:46', 1399985191002447872, '2022-05-11 19:48:34', 0, 1); +INSERT INTO `base_dict` VALUES (1452836604783845376, 'SocialType', '三方系统类型', b'1', '系统属性', '三方系统类型', 1399985191002447872, '2021-10-26 11:16:54', 1399985191002447872, '2022-05-11 19:48:28', 0, 3); +INSERT INTO `base_dict` VALUES (1452843488735621120, 'ParamType', '参数类型', b'1', '系统属性', '参数类型', 1399985191002447872, '2021-10-26 11:44:15', 1399985191002447872, '2022-05-11 19:48:21', 0, 2); +INSERT INTO `base_dict` VALUES (1496024933900169216, 'Political', '政治面貌', b'1', '基础数据', '政治面貌', 1399985191002447872, '2022-02-22 15:31:54', 1399985191002447872, '2022-05-11 19:48:04', 0, 1); +INSERT INTO `base_dict` VALUES (1556996322223968256, 'WeChatMediaType', '微信媒体类型', b'1', '微信', '微信媒体类型', 1399985191002447872, '2022-08-09 21:30:25', 1399985191002447872, '2022-08-09 21:30:26', 0, 0); +INSERT INTO `base_dict` VALUES (1561003021674987520, 'SiteMessageReceive', '消息接收类型', b'1', '站内信', '站内信接收类型', 1399985191002447872, '2022-08-20 22:51:37', 1399985191002447872, '2022-08-20 22:51:37', 0, 0); +INSERT INTO `base_dict` VALUES (1561003189111603200, 'SiteMessageState', '消息发布状态', b'1', '站内信', '站内信消息发布状态', 1399985191002447872, '2022-08-20 22:52:17', 1399985191002447872, '2022-08-20 22:52:17', 0, 0); +INSERT INTO `base_dict` VALUES (1589527951317389312, 'DataScopePerm', '数据权限类型', b'1', '系统属性', '数据权限类型', 1414143554414059520, '2022-11-07 15:59:30', 1399985191002447872, '2023-11-28 23:14:24', 0, 4); +INSERT INTO `base_dict` VALUES (1633393287952257024, 'DatabaseType', '数据库类型', b'1', '开发', '数据库类型', 1414143554414059520, '2023-03-08 17:04:41', 1414143554414059520, '2023-03-08 17:04:41', 0, 0); +INSERT INTO `base_dict` VALUES (1688742690398617600, 'SmsChannel', '短信渠道商', b'1', '消息服务', '短信渠道商', 1414143554414059520, '2023-08-08 10:43:27', 1414143554414059520, '2023-08-12 20:24:03', 0, 1); +INSERT INTO `base_dict` VALUES (1690338321769918464, 'GeneralTemplateUseType', '通用模板类型', b'1', '系统属性', '通用模板类型', 1414143554414059520, '2023-08-12 20:23:56', 1414143554414059520, '2023-08-12 20:24:22', 0, 1); +INSERT INTO `base_dict` VALUES (1690338545284378624, 'GeneralTemplateState', '通用模板状态', b'1', '系统属性', '通用模板状态', 1414143554414059520, '2023-08-12 20:24:49', 1414143554414059520, '2023-08-12 20:24:49', 0, 0); -- ---------------------------- -- Table structure for base_dict_item @@ -3560,9 +3473,9 @@ CREATE TABLE `base_dict_item` ( `sort_no` double(8, 2) NOT NULL COMMENT '排序', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE, @@ -3578,9 +3491,9 @@ INSERT INTO `base_dict_item` VALUES (1425744258544136194, 1425744045414772737, ' INSERT INTO `base_dict_item` VALUES (1425744436592340993, 1425744045414772737, 'MenuType', '1', '子菜单', b'1', 0.00, '子菜单', 0, '2021-08-12 17:02:17', 0, '2021-08-12 17:02:17', 0, 0); INSERT INTO `base_dict_item` VALUES (1425744470582980610, 1425744045414772737, 'MenuType', '2', '按钮权限', b'1', 0.00, '按钮权限', 0, '2021-08-12 17:02:26', 0, '2021-08-12 17:02:26', 0, 0); INSERT INTO `base_dict_item` VALUES (1430094707250413568, 1422929378374828033, 'Sex', '0', '未知', b'1', 0.00, '不确定性别', 1399985191002447872, '2021-08-24 17:08:43', 1399985191002447872, '2021-08-24 17:08:43', 0, 0); -INSERT INTO `base_dict_item` VALUES (1435830086406463488, 1435829999592759296, 'UserStatusCode', '1', '正常', b'1', 0.00, 'NORMAL', 1399985191002447872, '2021-09-09 12:59:04', 1399985191002447872, '2021-09-09 12:59:04', 0, 0); -INSERT INTO `base_dict_item` VALUES (1435830141855162368, 1435829999592759296, 'UserStatusCode', '2', '锁定', b'1', 0.00, 'LOCK, 多次登录失败被锁定', 1399985191002447872, '2021-09-09 12:59:17', 1399985191002447872, '2021-09-09 12:59:17', 0, 1); -INSERT INTO `base_dict_item` VALUES (1435830260503633920, 1435829999592759296, 'UserStatusCode', '3', '封禁', b'1', 0.00, 'BAN', 1399985191002447872, '2021-09-09 12:59:45', 1399985191002447872, '2021-09-09 12:59:45', 0, 0); +INSERT INTO `base_dict_item` VALUES (1435830086406463488, 1435829999592759296, 'UserStatusCode', 'normal', '正常', b'1', 0.00, 'NORMAL', 1399985191002447872, '2021-09-09 12:59:04', 1399985191002447872, '2023-11-25 15:32:04', 0, 1); +INSERT INTO `base_dict_item` VALUES (1435830141855162368, 1435829999592759296, 'UserStatusCode', 'lock', '锁定', b'1', 0.00, 'LOCK, 多次登录失败被锁定', 1399985191002447872, '2021-09-09 12:59:17', 1399985191002447872, '2023-11-25 15:32:14', 0, 2); +INSERT INTO `base_dict_item` VALUES (1435830260503633920, 1435829999592759296, 'UserStatusCode', 'ban', '封禁', b'1', 0.00, 'BAN', 1399985191002447872, '2021-09-09 12:59:45', 1399985191002447872, '2023-11-25 15:32:20', 0, 1); INSERT INTO `base_dict_item` VALUES (1435838374749626368, 1435838066191458304, 'LogBusinessType', 'other', '其它', b'1', 0.00, '', 1399985191002447872, '2021-09-09 13:32:00', 1399985191002447872, '2021-09-09 13:32:00', 0, 0); INSERT INTO `base_dict_item` VALUES (1435838414436130816, 1435838066191458304, 'LogBusinessType', 'insert', '新增', b'1', 0.00, '', 1399985191002447872, '2021-09-09 13:32:09', 1399985191002447872, '2021-09-09 13:32:09', 0, 0); INSERT INTO `base_dict_item` VALUES (1435838467624099840, 1435838066191458304, 'LogBusinessType', 'update', '修改', b'1', 0.00, '', 1399985191002447872, '2021-09-09 13:32:22', 1399985191002447872, '2021-09-09 13:32:22', 0, 0); @@ -3622,13 +3535,13 @@ INSERT INTO `base_dict_item` VALUES (1561003539772194816, 1561003189111603200, ' INSERT INTO `base_dict_item` VALUES (1561003575608328192, 1561003189111603200, 'SiteMessageState', 'cancel', '撤销', b'1', 0.00, '', 1399985191002447872, '2022-08-20 22:53:49', 1399985191002447872, '2022-08-20 22:53:49', 0, 0); INSERT INTO `base_dict_item` VALUES (1561245469535080448, 1561003189111603200, 'SiteMessageState', 'draft', '草稿', b'1', 0.00, '', 1399985191002447872, '2022-08-21 14:55:01', 1399985191002447872, '2022-08-21 14:55:01', 0, 0); INSERT INTO `base_dict_item` VALUES (1573665422392098816, 1439961232651034624, 'MessageTemplateCode', '0', '站内信', b'1', -11.00, 'SITE', 1399985191002447872, '2022-09-24 21:27:29', 1399985191002447872, '2022-09-24 21:27:39', 0, 1); -INSERT INTO `base_dict_item` VALUES (1589528254477488128, 1589527951317389312, 'DataScopePerm', '7', '所在及下级部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:43', 1414143554414059520, '2022-11-07 16:00:43', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528283539820544, 1589527951317389312, 'DataScopePerm', '6', '所在部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:49', 1414143554414059520, '2022-11-07 16:00:49', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528315672383488, 1589527951317389312, 'DataScopePerm', '5', '全部数据', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:57', 1414143554414059520, '2022-11-07 16:00:57', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528340267782144, 1589527951317389312, 'DataScopePerm', '4', '部门和用户范围', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:03', 1414143554414059520, '2022-11-07 16:01:03', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528367228768256, 1589527951317389312, 'DataScopePerm', '3', '部门范围', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:09', 1414143554414059520, '2022-11-07 16:01:09', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528393292173312, 1589527951317389312, 'DataScopePerm', '2', '用户范围', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:16', 1414143554414059520, '2022-11-07 16:01:16', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528423956729856, 1589527951317389312, 'DataScopePerm', '1', '自身数据', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:23', 1414143554414059520, '2022-11-07 16:01:23', 0, 0); +INSERT INTO `base_dict_item` VALUES (1589528254477488128, 1589527951317389312, 'DataScopePerm', 'self_dept_sub', '所在及下级部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:43', 1399985191002447872, '2023-11-28 23:16:02', 0, 2); +INSERT INTO `base_dict_item` VALUES (1589528283539820544, 1589527951317389312, 'DataScopePerm', 'self_dept', '所在部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:49', 1399985191002447872, '2023-11-28 23:15:52', 0, 2); +INSERT INTO `base_dict_item` VALUES (1589528315672383488, 1589527951317389312, 'DataScopePerm', 'all', '全部数据', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:57', 1399985191002447872, '2023-11-25 22:51:28', 0, 1); +INSERT INTO `base_dict_item` VALUES (1589528340267782144, 1589527951317389312, 'DataScopePerm', 'dept_and_user', '自定义部门和用户', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:03', 1399985191002447872, '2023-11-29 15:25:01', 0, 3); +INSERT INTO `base_dict_item` VALUES (1589528367228768256, 1589527951317389312, 'DataScopePerm', 'dept', '自定义部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:09', 1399985191002447872, '2023-11-29 15:24:47', 0, 2); +INSERT INTO `base_dict_item` VALUES (1589528393292173312, 1589527951317389312, 'DataScopePerm', 'user', '指定用户', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:16', 1399985191002447872, '2023-11-29 15:25:16', 0, 2); +INSERT INTO `base_dict_item` VALUES (1589528423956729856, 1589527951317389312, 'DataScopePerm', 'self', '自身数据', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:23', 1399985191002447872, '2023-11-25 22:50:41', 0, 1); INSERT INTO `base_dict_item` VALUES (1633403429028536320, 1633393287952257024, 'DatabaseType', 'mysql', 'MySQL', b'1', 1.00, '', 1414143554414059520, '2023-03-08 17:44:59', 1414143554414059520, '2023-03-08 17:44:59', 0, 0); INSERT INTO `base_dict_item` VALUES (1633403459470794752, 1633393287952257024, 'DatabaseType', 'oracle', 'Oracle', b'1', 2.00, '', 1414143554414059520, '2023-03-08 17:45:07', 1414143554414059520, '2023-03-08 17:45:07', 0, 0); INSERT INTO `base_dict_item` VALUES (1633403498695925760, 1633393287952257024, 'DatabaseType', 'mssql', 'SQLServer', b'1', 3.00, '', 1414143554414059520, '2023-03-08 17:45:16', 1414143554414059520, '2023-03-08 17:45:16', 0, 0); @@ -3646,248 +3559,109 @@ INSERT INTO `base_dict_item` VALUES (1690338619024437248, 1690338321769918464, ' INSERT INTO `base_dict_item` VALUES (1690338653442895872, 1690338321769918464, 'GeneralTemplateUseType', 'export', '导出', b'1', 0.00, '', 1414143554414059520, '2023-08-12 20:25:15', 1414143554414059520, '2023-08-12 20:25:15', 0, 0); INSERT INTO `base_dict_item` VALUES (1690338707129987072, 1690338545284378624, 'GeneralTemplateState', 'enable', '启用', b'1', 0.00, '', 1414143554414059520, '2023-08-12 20:25:27', 1414143554414059520, '2023-08-12 20:25:27', 0, 0); INSERT INTO `base_dict_item` VALUES (1690338748032839680, 1690338545284378624, 'GeneralTemplateState', 'disable', '停用', b'1', 0.00, '', 1414143554414059520, '2023-08-12 20:25:37', 1414143554414059520, '2023-08-12 20:25:37', 0, 0); +INSERT INTO `base_dict_item` VALUES (1729519341702086656, 1589527951317389312, 'DataScopePerm', 'dept_sub', '指定部门及下级部门', b'1', 0.00, '', 1399985191002447872, '2023-11-28 23:15:19', 1399985191002447872, '2023-11-28 23:15:19', 0, 0); -- ---------------------------- --- Table structure for base_province +-- Table structure for base_dynamic_data_source -- ---------------------------- -DROP TABLE IF EXISTS `base_province`; -CREATE TABLE `base_province` ( - `code` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '省份编码', - `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '省份名称', - PRIMARY KEY (`code`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '省份表' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `base_dynamic_data_source`; +CREATE TABLE `base_dynamic_data_source` ( + `id` bigint(20) NOT NULL, + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据源编码', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据源名称', + `database_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库类型', + `auto_load` bit(1) NULL DEFAULT NULL COMMENT '是否启动自动加载', + `db_driver` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '驱动类', + `db_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库地址', + `db_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库名称', + `db_username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `db_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '动态数据源管理' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_province +-- Records of base_dynamic_data_source -- ---------------------------- -INSERT INTO `base_province` VALUES ('11', '北京市'); -INSERT INTO `base_province` VALUES ('12', '天津市'); -INSERT INTO `base_province` VALUES ('13', '河北省'); -INSERT INTO `base_province` VALUES ('14', '山西省'); -INSERT INTO `base_province` VALUES ('15', '内蒙古自治区'); -INSERT INTO `base_province` VALUES ('21', '辽宁省'); -INSERT INTO `base_province` VALUES ('22', '吉林省'); -INSERT INTO `base_province` VALUES ('23', '黑龙江省'); -INSERT INTO `base_province` VALUES ('31', '上海市'); -INSERT INTO `base_province` VALUES ('32', '江苏省'); -INSERT INTO `base_province` VALUES ('33', '浙江省'); -INSERT INTO `base_province` VALUES ('34', '安徽省'); -INSERT INTO `base_province` VALUES ('35', '福建省'); -INSERT INTO `base_province` VALUES ('36', '江西省'); -INSERT INTO `base_province` VALUES ('37', '山东省'); -INSERT INTO `base_province` VALUES ('41', '河南省'); -INSERT INTO `base_province` VALUES ('42', '湖北省'); -INSERT INTO `base_province` VALUES ('43', '湖南省'); -INSERT INTO `base_province` VALUES ('44', '广东省'); -INSERT INTO `base_province` VALUES ('45', '广西壮族自治区'); -INSERT INTO `base_province` VALUES ('46', '海南省'); -INSERT INTO `base_province` VALUES ('50', '重庆市'); -INSERT INTO `base_province` VALUES ('51', '四川省'); -INSERT INTO `base_province` VALUES ('52', '贵州省'); -INSERT INTO `base_province` VALUES ('53', '云南省'); -INSERT INTO `base_province` VALUES ('54', '西藏自治区'); -INSERT INTO `base_province` VALUES ('61', '陕西省'); -INSERT INTO `base_province` VALUES ('62', '甘肃省'); -INSERT INTO `base_province` VALUES ('63', '青海省'); -INSERT INTO `base_province` VALUES ('64', '宁夏回族自治区'); -INSERT INTO `base_province` VALUES ('65', '新疆维吾尔自治区'); -- ---------------------------- --- Table structure for base_dict +-- Table structure for base_dynamic_form -- ---------------------------- -DROP TABLE IF EXISTS `base_dict`; -CREATE TABLE `base_dict` ( +DROP TABLE IF EXISTS `base_dynamic_form`; +CREATE TABLE `base_dynamic_form` ( `id` bigint(20) NOT NULL, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编码', - `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', - `enable` bit(1) NOT NULL DEFAULT b'1' COMMENT '启用状态', - `group_tag` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '分类标签', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单键名', + `value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '表单内容', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(8) NULL DEFAULT NULL COMMENT '版本', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '动态表单' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_dict --- ---------------------------- -INSERT INTO `base_dict` VALUES (1422929378374828033, 'Sex', '性别', b'1', '基础属性', '性别', 0, '2021-08-04 22:36:15', 1399985191002447872, '2022-05-11 19:48:40', 0, 6); -INSERT INTO `base_dict` VALUES (1425744045414772737, 'MenuType', '菜单类型', b'1', '系统属性', '菜单类型', 0, '2021-08-12 17:00:44', 1399985191002447872, '2022-05-11 19:48:44', 0, 4); -INSERT INTO `base_dict` VALUES (1430063572491411456, 'loginType', '字典类型', b'1', '基础属性', '字典类型', 1399985191002447872, '2021-08-24 15:05:00', 1399985191002447872, '2021-08-24 15:05:00', 1, 2); -INSERT INTO `base_dict` VALUES (1435829999592759296, 'UserStatusCode', '用户状态码', b'1', '系统属性', '用户状态码', 1399985191002447872, '2021-09-09 12:58:43', 1399985191002447872, '2022-05-11 19:48:56', 0, 2); -INSERT INTO `base_dict` VALUES (1435838066191458304, 'LogBusinessType', '业务操作类型', b'1', '系统属性', '操作日志记录的业务操作类型', 1399985191002447872, '2021-09-09 13:30:46', 1399985191002447872, '2022-05-11 19:49:00', 0, 2); -INSERT INTO `base_dict` VALUES (1438078864509317120, 'MailSecurityCode', '邮箱安全方式编码', b'1', '消息服务', '邮箱安全方式编码', 1399985191002447872, '2021-09-15 17:54:54', 1399985191002447872, '2022-05-11 19:49:06', 0, 2); -INSERT INTO `base_dict` VALUES (1439961232651034624, 'MessageTemplateCode', '消息模板类型', b'1', '消息服务', '消息模板类型', 1399985191002447872, '2021-09-20 22:34:46', 1399985191002447872, '2022-05-11 19:48:34', 0, 1); -INSERT INTO `base_dict` VALUES (1452836604783845376, 'SocialType', '三方系统类型', b'1', '系统属性', '三方系统类型', 1399985191002447872, '2021-10-26 11:16:54', 1399985191002447872, '2022-05-11 19:48:28', 0, 3); -INSERT INTO `base_dict` VALUES (1452843488735621120, 'ParamType', '参数类型', b'1', '系统属性', '参数类型', 1399985191002447872, '2021-10-26 11:44:15', 1399985191002447872, '2022-05-11 19:48:21', 0, 2); -INSERT INTO `base_dict` VALUES (1496024933900169216, 'Political', '政治面貌', b'1', '基础数据', '政治面貌', 1399985191002447872, '2022-02-22 15:31:54', 1399985191002447872, '2022-05-11 19:48:04', 0, 1); -INSERT INTO `base_dict` VALUES (1556996322223968256, 'WeChatMediaType', '微信媒体类型', b'1', '微信', '微信媒体类型', 1399985191002447872, '2022-08-09 21:30:25', 1399985191002447872, '2022-08-09 21:30:26', 0, 0); -INSERT INTO `base_dict` VALUES (1561003021674987520, 'SiteMessageReceive', '消息接收类型', b'1', '站内信', '站内信接收类型', 1399985191002447872, '2022-08-20 22:51:37', 1399985191002447872, '2022-08-20 22:51:37', 0, 0); -INSERT INTO `base_dict` VALUES (1561003189111603200, 'SiteMessageState', '消息发布状态', b'1', '站内信', '站内信消息发布状态', 1399985191002447872, '2022-08-20 22:52:17', 1399985191002447872, '2022-08-20 22:52:17', 0, 0); -INSERT INTO `base_dict` VALUES (1589527951317389312, 'DataScopePerm', '数据范围权限', b'1', '系统属性', '数据范围权限', 1414143554414059520, '2022-11-07 15:59:30', 1399985191002447872, '2022-12-09 22:09:25', 0, 3); -INSERT INTO `base_dict` VALUES (1633393287952257024, 'DatabaseType', '数据库类型', b'1', '开发', '数据库类型', 1414143554414059520, '2023-03-08 17:04:41', 1414143554414059520, '2023-03-08 17:04:41', 0, 0); -INSERT INTO `base_dict` VALUES (1688742690398617600, 'SmsChannel', '短信渠道商', b'1', '消息服务', '短信渠道商', 1414143554414059520, '2023-08-08 10:43:27', 1414143554414059520, '2023-08-12 20:24:03', 0, 1); -INSERT INTO `base_dict` VALUES (1690338321769918464, 'GeneralTemplateUseType', '通用模板类型', b'1', '系统属性', '通用模板类型', 1414143554414059520, '2023-08-12 20:23:56', 1414143554414059520, '2023-08-12 20:24:22', 0, 1); -INSERT INTO `base_dict` VALUES (1690338545284378624, 'GeneralTemplateState', '通用模板状态', b'1', '系统属性', '通用模板状态', 1414143554414059520, '2023-08-12 20:24:49', 1414143554414059520, '2023-08-12 20:24:49', 0, 0); - --- ---------------------------- --- Table structure for iam_dept --- ---------------------------- -DROP TABLE IF EXISTS `iam_dept`; -CREATE TABLE `iam_dept` ( - `id` bigint(20) NOT NULL COMMENT 'ID', - `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父机构ID', - `dept_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构/部门名称', - `sort_no` int(11) NOT NULL DEFAULT 0 COMMENT '排序', - `org_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '机构类别 1公司 2部门 3岗位', - `org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构编码', - `mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号', - `fax` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '传真', - `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', - `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门组织机构表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_dept --- ---------------------------- -INSERT INTO `iam_dept` VALUES (1259382878857957377, NULL, 'Bootx Platform总公司', 0, '1', '1', '', NULL, '济南市高新区齐鲁软件园', NULL, -1, '2020-05-10 15:20:51', -1, '2020-05-10 17:52:15', 4, 0); -INSERT INTO `iam_dept` VALUES (1477976804995026944, NULL, 'Bootx Cloud公司', 0, '1', '1', '', NULL, '济南市高新区汉峪金谷', '', 1399985191002447872, '2022-01-03 20:15:04', 1399985191002447872, '2022-01-03 20:15:05', 0, 1); -INSERT INTO `iam_dept` VALUES (1477977184768282624, NULL, 'Bootx Cloud公司', 0, '1', '1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:16:35', 1399985191002447872, '2022-01-03 20:16:35', 0, 1); -INSERT INTO `iam_dept` VALUES (1477977301365739520, NULL, 'Bootx Cloud总公司', 0, '1', '2', '', NULL, '济南市高新区汉峪金谷', '', 1399985191002447872, '2022-01-03 20:17:03', 1399985191002447872, '2022-01-03 20:17:03', 1, 0); -INSERT INTO `iam_dept` VALUES (1477977592291053568, 1259382878857957377, 'bp济南分公司', 0, '1', '1_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:18:12', 1399985191002447872, '2022-01-03 20:18:12', 1, 0); -INSERT INTO `iam_dept` VALUES (1477977690928500736, 1259382878857957377, '历城分公司', 0, '1', '1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:18:36', 1399985191002447872, '2022-01-03 20:18:36', 0, 1); -INSERT INTO `iam_dept` VALUES (1477977827897692160, 1259382878857957377, 'bp潍坊分公司', 0, '1', '1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:08', 1399985191002447872, '2022-01-03 20:19:08', 0, 0); -INSERT INTO `iam_dept` VALUES (1477977880947249152, 1477977301365739520, 'bc菏泽分公司', 0, '1', '2_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:21', 1399985191002447872, '2022-01-03 20:19:21', 0, 0); -INSERT INTO `iam_dept` VALUES (1477977930175795200, 1477977301365739520, 'bc日照分公司', 0, '1', '2_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:33', 1399985191002447872, '2022-01-03 20:19:33', 0, 0); -INSERT INTO `iam_dept` VALUES (1477978464559484928, 1477977592291053568, '历城办事部', 0, '2', '1_1_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:21:40', 1399985191002447872, '2022-01-03 20:21:40', 1, 0); -INSERT INTO `iam_dept` VALUES (1477978512177418240, 1477977592291053568, '历下办事部', 0, '2', '1_1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:21:51', 1399985191002447872, '2022-01-03 20:21:52', 0, 0); -INSERT INTO `iam_dept` VALUES (1477978610865197056, 1477977592291053568, '高新办事部', 0, '2', '1_1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:22:15', 1399985191002447872, '2022-01-03 20:22:15', 0, 0); -INSERT INTO `iam_dept` VALUES (1477978810526650368, 1477977827897692160, '奎文办事部', 0, '2', '1_2_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:23:03', 1399985191002447872, '2022-01-03 20:23:03', 0, 0); -INSERT INTO `iam_dept` VALUES (1477978883247493120, 1477977827897692160, '潍城办事部', 0, '2', '1_2_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:23:20', 1399985191002447872, '2022-01-03 20:23:20', 0, 0); - --- ---------------------------- --- Table structure for iam_data_scope --- ---------------------------- -DROP TABLE IF EXISTS `iam_data_scope`; -CREATE TABLE `iam_data_scope` ( - `id` bigint(20) NOT NULL COMMENT '角色ID', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编码', - `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `type` int(4) NOT NULL COMMENT '类型', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据范围权限' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_data_scope --- ---------------------------- -INSERT INTO `iam_data_scope` VALUES (1474706893178871808, 'self', '自身数据', 1, '只能查看自身范围的数据', 1399985191002447872, '2021-12-25 19:41:37', 1399985191002447872, '2021-12-25 19:41:37', 1, 0); -INSERT INTO `iam_data_scope` VALUES (1474717084985270272, 'user', '用户数据权限', 2, '用户数据权限', 1399985191002447872, '2021-12-25 20:22:07', 1399985191002447872, '2021-12-25 20:22:07', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1474717160671485952, 'dept', '部门权限', 3, '', 1399985191002447872, '2021-12-25 20:22:25', 1399985191002447872, '2021-12-25 20:22:25', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1474717276908232704, 'userAndDept', '用户和部门权限', 4, '', 1399985191002447872, '2021-12-25 20:22:52', 1399985191002447872, '2021-12-25 20:22:52', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1474717344562356224, 'all', '全部数据', 5, '', 1399985191002447872, '2021-12-25 20:23:09', 1399985191002447872, '2021-12-25 20:23:09', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1477990268903804928, 'belong_dept', '所在部门', 6, '', 1399985191002447872, '2022-01-03 21:08:34', 1399985191002447872, '2022-01-03 21:08:35', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1477990290521247744, 'belong_dept', '所在部门', 6, '', 1399985191002447872, '2022-01-03 21:08:40', 1399985191002447872, '2022-01-03 21:08:40', 0, 1); -INSERT INTO `iam_data_scope` VALUES (1477990439800721408, 'belong_dept_and_sub', '所在及下级部门', 7, '', 1399985191002447872, '2022-01-03 21:09:15', 1399985191002447872, '2022-01-03 21:09:15', 0, 0); - --- ---------------------------- --- Table structure for iam_user_dept --- ---------------------------- -DROP TABLE IF EXISTS `iam_user_dept`; -CREATE TABLE `iam_user_dept` ( - `id` bigint(20) NOT NULL, - `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 = utf8 COLLATE = utf8_general_ci COMMENT = '用户部门关联表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_user_dept +-- Records of base_dynamic_form -- ---------------------------- +INSERT INTO `base_dynamic_form` VALUES (1552656018381422592, '测试表单', 'test', '{\"list\":[{\"type\":\"input\",\"label\":\"输入框\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":true,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"aa\",\"key\":\"input_1659059676533\",\"help\":\"测试\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"textarea\",\"label\":\"文本框\",\"options\":{\"width\":\"100%\",\"minRows\":4,\"maxRows\":6,\"maxLength\":null,\"defaultValue\":\"\",\"clearable\":true,\"hidden\":false,\"disabled\":false,\"placeholder\":\"请输入\"},\"model\":\"bb\",\"key\":\"textarea_1659020414125\",\"help\":\"\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"slider\",\"label\":\"滑动输入条\",\"options\":{\"width\":\"100%\",\"defaultValue\":34,\"disabled\":false,\"hidden\":false,\"min\":0,\"max\":100,\"step\":1,\"showInput\":false},\"model\":\"cc\",\"key\":\"slider_1659020433092\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]}],\"config\":{\"layout\":\"horizontal\",\"labelCol\":{\"xs\":4,\"sm\":4,\"md\":4,\"lg\":4,\"xl\":4,\"xxl\":4},\"labelWidth\":100,\"labelLayout\":\"flex\",\"wrapperCol\":{\"xs\":18,\"sm\":18,\"md\":18,\"lg\":18,\"xl\":18,\"xxl\":18},\"hideRequiredMark\":false,\"customStyle\":\"\"}}', '测试动态表单', 1399985191002447872, '2022-07-28 22:03:36', 1399985191002447872, '2022-07-29 09:55:22', 0, 7); +INSERT INTO `base_dynamic_form` VALUES (1552656018381422593, '测试表单1', 'test1', '{\"list\":[{\"type\":\"input\",\"label\":\"申请人\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":true,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"apply_by\",\"key\":\"input_1659059676533\",\"help\":\"测试\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"input\",\"label\":\"请假天数\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":false,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"leave_days\",\"key\":\"input_1662106166142\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"textarea\",\"label\":\"备注\",\"options\":{\"width\":\"100%\",\"minRows\":4,\"maxRows\":6,\"maxLength\":null,\"defaultValue\":\"\",\"clearable\":true,\"hidden\":false,\"disabled\":false,\"placeholder\":\"请输入\"},\"model\":\"remark\",\"key\":\"textarea_1659020414125\",\"help\":\"\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"switch\",\"label\":\"开关\",\"options\":{\"defaultValue\":false,\"hidden\":false,\"disabled\":false},\"model\":\"switch_1662108221389\",\"key\":\"switch_1662108221389\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"slider\",\"label\":\"滑动输入条\",\"options\":{\"width\":\"100%\",\"defaultValue\":34,\"disabled\":false,\"hidden\":false,\"min\":0,\"max\":100,\"step\":1,\"showInput\":false},\"model\":\"cc\",\"key\":\"slider_1659020433092\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"table\",\"label\":\"表格布局\",\"trs\":[{\"tds\":[{\"colspan\":1,\"rowspan\":1,\"list\":[]},{\"colspan\":1,\"rowspan\":1,\"list\":[]}]},{\"tds\":[{\"colspan\":1,\"rowspan\":1,\"list\":[{\"type\":\"editor\",\"label\":\"富文本\",\"icon\":\"icon-LC_icon_edit_line_1\",\"list\":[],\"options\":{\"height\":300,\"placeholder\":\"请输入\",\"defaultValue\":\"\",\"chinesization\":true,\"hidden\":false,\"disabled\":false,\"showLabel\":false,\"width\":\"100%\"},\"model\":\"editor_1662106288134\",\"key\":\"editor_1662106288134\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]}]},{\"colspan\":1,\"rowspan\":1,\"list\":[]}]}],\"options\":{\"width\":\"100%\",\"bordered\":true,\"bright\":false,\"small\":true,\"customStyle\":\"\"},\"key\":\"table_1662106283652\"}],\"config\":{\"layout\":\"vertical\",\"labelCol\":{\"xs\":6,\"sm\":6,\"md\":6,\"lg\":6,\"xl\":6,\"xxl\":6},\"labelWidth\":100,\"labelLayout\":\"Grid\",\"wrapperCol\":{\"xs\":18,\"sm\":18,\"md\":18,\"lg\":18,\"xl\":18,\"xxl\":18},\"hideRequiredMark\":false,\"customStyle\":\"\"}}', '测试动态表单', 1399985191002447872, '2022-07-28 22:03:36', 1414143554414059520, '2022-09-02 16:44:01', 0, 12); -- ---------------------------- --- Table structure for iam_login_type +-- Table structure for base_general_template -- ---------------------------- -DROP TABLE IF EXISTS `iam_login_type`; -CREATE TABLE `iam_login_type` ( +DROP TABLE IF EXISTS `base_general_template`; +CREATE TABLE `base_general_template` ( `id` bigint(20) NOT NULL COMMENT '主键', - `code` varchar(21) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', - `internal` bit(1) NOT NULL COMMENT '是否系统内置', - `timeout` bigint(11) NULL DEFAULT NULL COMMENT '在线时长(秒)', - `captcha_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '验证码类型', - `captcha` bit(1) NOT NULL COMMENT '启用验证码', - `enable` bit(1) NOT NULL COMMENT '是否可用', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板名称', + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板代码', + `use_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '使用类型(导入/导出)', + `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板类型', + `file_suffix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板后缀名', + `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '状态', + `file_id` bigint(20) NULL DEFAULT NULL COMMENT '文件ID', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '删除标志', + `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登录方式' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '通用模板管理' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_login_type +-- Records of base_general_template -- ---------------------------- -INSERT INTO `iam_login_type` VALUES (1430430071299207168, 'password', '账号密码登陆', 'password', b'1', 3600, '-1', b'0', b'1', NULL, 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2022-11-03 22:24:53', 20, b'0'); -INSERT INTO `iam_login_type` VALUES (1430478946919653376, 'miniApp', '微信小程序', 'openId', b'0', 99999, '0', b'0', b'1', NULL, 1399985191002447872, '2021-08-25 18:35:33', 1399985191002447872, '2022-07-16 12:32:26', 3, b'0'); -INSERT INTO `iam_login_type` VALUES (1435138582839009280, 'phone', '手机短信登录', 'openId', b'0', 3600, '0', b'0', b'1', NULL, 1399985191002447872, '2021-09-07 15:11:16', 1399985191002447872, '2022-07-16 12:32:19', 5, b'0'); -INSERT INTO `iam_login_type` VALUES (1542091599907115008, 'dingTalk', '钉钉', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-06-29 18:24:23', 1399985191002447872, '2022-07-02 14:55:01', 5, b'0'); -INSERT INTO `iam_login_type` VALUES (1542804450312122368, 'weCom', '企业微信', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-07-01 17:37:00', 1399985191002447872, '2022-07-01 17:37:00', 0, b'0'); -INSERT INTO `iam_login_type` VALUES (1543126042909016064, 'weChat', '微信登录', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-07-02 14:54:53', 0, '2022-10-12 22:15:05', 2, b'0'); -INSERT INTO `iam_login_type` VALUES (1626845524617203712, 'passwordGoView', '可视化平台登录', 'password', b'0', 3600, '-1', b'0', b'1', '', 1414143554414059520, '2023-02-18 15:26:13', 1414143554414059520, '2023-02-18 15:26:13', 0, b'0'); -- ---------------------------- --- Table structure for demo_super_query +-- Table structure for base_key_value -- ---------------------------- -DROP TABLE IF EXISTS `demo_super_query`; -CREATE TABLE `demo_super_query` ( - `id` bigint(20) NOT NULL COMMENT '角色ID', - `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `age` int(5) NULL DEFAULT NULL COMMENT '年龄', - `vip` bit(1) NULL DEFAULT NULL COMMENT '是否vip', - `birthday` date NULL DEFAULT NULL COMMENT '生日', - `work_time` time(0) NULL DEFAULT NULL COMMENT '上班时间', - `registration_time` datetime(0) NULL DEFAULT NULL COMMENT '注册时间', - `political` 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 '备注', +DROP TABLE IF EXISTS `base_key_value`; +CREATE TABLE `base_key_value` ( + `id` bigint(20) NOT NULL, + `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数键名', + `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数值', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '超级查询演示' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'kv存储' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of demo_super_query +-- Records of base_key_value -- ---------------------------- -INSERT INTO `demo_super_query` VALUES (1496046463434567680, '小小明', 18, b'1', '1998-01-23', '08:30:00', '2022-02-22 16:57:27', '13', '这是备注', 1399985191002447872, '2022-02-22 16:57:27', 1399985191002447872, '2022-02-22 17:03:34', 1, 0); -INSERT INTO `demo_super_query` VALUES (1496372341213433856, '关羽', 52, b'1', '2000-02-23', '14:31:36', '2022-02-23 14:32:22', '1', '', 1399985191002447872, '2022-02-23 14:32:22', 1399985191002447872, '2022-02-23 14:32:22', 0, 0); -INSERT INTO `demo_super_query` VALUES (1496372489909899264, '张飞', 54, b'0', '1996-02-11', '08:00:00', '2022-02-23 14:32:58', '7', '备注', 1399985191002447872, '2022-02-23 14:32:58', 1399985191002447872, '2022-02-23 14:32:58', 0, 0); -INSERT INTO `demo_super_query` VALUES (1496372766427779072, '梁冀', 38, b'1', '1958-02-08', '08:30:00', '2022-02-23 14:34:03', '1', '', 1399985191002447872, '2022-02-23 14:34:03', 1399985191002447872, '2022-02-23 14:34:03', 0, 0); -INSERT INTO `demo_super_query` VALUES (1496373512871284736, '刘备', 108, b'0', '1993-11-12', '09:30:10', '2022-02-23 14:37:01', '2', '刘羽禅的粑粑', 1399985191002447872, '2022-02-23 14:37:01', 1399985191002447872, '2022-02-23 14:37:01', 0, 0); -- ---------------------------- -- Table structure for base_param @@ -3903,9 +3677,9 @@ CREATE TABLE `base_param` ( `internal` bit(1) NOT NULL COMMENT '内置参数', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE @@ -3916,158 +3690,182 @@ CREATE TABLE `base_param` ( -- ---------------------------- INSERT INTO `base_param` VALUES (1452842684284891136, '测试', 'test.v1', '123', 1, b'1', b'0', NULL, 1399985191002447872, '2021-10-26 11:41:03', 1399985191002447872, '2021-10-26 11:41:03', 0, 0); INSERT INTO `base_param` VALUES (1520668030248361984, '文件服务器地址', 'FileServerUrl', 'http://127.0.0.1:9999', 1, b'1', b'1', '', 1399985191002447872, '2022-05-01 15:34:46', 1399985191002447872, '2022-05-19 12:53:21', 0, 5); -INSERT INTO `base_param` VALUES (1529281530059161600, 'websocket服务器地址', 'WebsocketServerUrl', 'ws://127.0.0.1:9999', 1, b'1', b'1', '', 1399985191002447872, '2022-05-25 10:01:44', 1399985191002447872, '2022-05-25 10:01:44', 0, 0); +INSERT INTO `base_param` VALUES (1529281530059161600, 'websocket服务器地址', 'WebsocketServerUrl', 'ws://127.0.0.1:9999', 1, b'1', b'1', '', 1399985191002447872, '2022-05-25 10:01:44', 1399985191002447872, '2023-10-21 22:31:38', 0, 2); INSERT INTO `base_param` VALUES (1545765299880448000, '服务器地址', 'ServerUrl', 'http://127.0.0.1:9999', 1, b'1', b'1', '优先级高于配置文件内进行的配置', 1399985191002447872, '2022-07-09 21:42:21', 1414143554414059520, '2023-08-05 16:40:05', 0, 1); INSERT INTO `base_param` VALUES (1547511252795912192, '微信jsapi支付回调服务地址', 'JsapiRedirectUrl', 'http://127.0.0.1/api/', 1, b'1', b'1', '用于微信扫码登录使用', 1414143554414059520, '2022-07-14 17:20:09', 1414143554414059520, '2023-08-18 15:49:21', 0, 1); -- ---------------------------- --- Table structure for iam_role +-- Table structure for base_province -- ---------------------------- -DROP TABLE IF EXISTS `iam_role`; -CREATE TABLE `iam_role` ( - `id` bigint(20) NOT NULL COMMENT '角色ID', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编码', - `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `internal` bit(1) NOT NULL COMMENT '是否系统内置', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `base_province`; +CREATE TABLE `base_province` ( + `code` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '省份编码', + `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '省份名称', + PRIMARY KEY (`code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '省份表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_role +-- Records of base_province -- ---------------------------- -INSERT INTO `iam_role` VALUES (1405414804771971072, 'admin', '管理员', b'1', '管理员', 1, '2021-06-17 14:39:35', 1399985191002447872, '2021-07-18 22:31:02', 6, 0); -INSERT INTO `iam_role` VALUES (1416730722714144768, 'test', '测试', b'0', '测试角色', 1399985191002447872, '2021-07-18 20:05:01', 1399985191002447872, '2021-07-18 20:16:15', 1, 0); -INSERT INTO `iam_role` VALUES (1422832797731778562, 'user', '用户', b'0', '用户角色', 0, '2021-08-04 16:12:29', 1399985191002447872, '2021-08-04 16:15:03', 7, 1); -INSERT INTO `iam_role` VALUES (1428891259564445696, 'manager', '管理者', b'0', 'manager管理者', 1399985191002447872, '2021-08-21 09:26:38', 1399985191002447872, '2021-08-21 09:26:39', 0, 1); +INSERT INTO `base_province` VALUES ('11', '北京市'); +INSERT INTO `base_province` VALUES ('12', '天津市'); +INSERT INTO `base_province` VALUES ('13', '河北省'); +INSERT INTO `base_province` VALUES ('14', '山西省'); +INSERT INTO `base_province` VALUES ('15', '内蒙古自治区'); +INSERT INTO `base_province` VALUES ('21', '辽宁省'); +INSERT INTO `base_province` VALUES ('22', '吉林省'); +INSERT INTO `base_province` VALUES ('23', '黑龙江省'); +INSERT INTO `base_province` VALUES ('31', '上海市'); +INSERT INTO `base_province` VALUES ('32', '江苏省'); +INSERT INTO `base_province` VALUES ('33', '浙江省'); +INSERT INTO `base_province` VALUES ('34', '安徽省'); +INSERT INTO `base_province` VALUES ('35', '福建省'); +INSERT INTO `base_province` VALUES ('36', '江西省'); +INSERT INTO `base_province` VALUES ('37', '山东省'); +INSERT INTO `base_province` VALUES ('41', '河南省'); +INSERT INTO `base_province` VALUES ('42', '湖北省'); +INSERT INTO `base_province` VALUES ('43', '湖南省'); +INSERT INTO `base_province` VALUES ('44', '广东省'); +INSERT INTO `base_province` VALUES ('45', '广西壮族自治区'); +INSERT INTO `base_province` VALUES ('46', '海南省'); +INSERT INTO `base_province` VALUES ('50', '重庆市'); +INSERT INTO `base_province` VALUES ('51', '四川省'); +INSERT INTO `base_province` VALUES ('52', '贵州省'); +INSERT INTO `base_province` VALUES ('53', '云南省'); +INSERT INTO `base_province` VALUES ('54', '西藏自治区'); +INSERT INTO `base_province` VALUES ('61', '陕西省'); +INSERT INTO `base_province` VALUES ('62', '甘肃省'); +INSERT INTO `base_province` VALUES ('63', '青海省'); +INSERT INTO `base_province` VALUES ('64', '宁夏回族自治区'); +INSERT INTO `base_province` VALUES ('65', '新疆维吾尔自治区'); -- ---------------------------- --- Table structure for iam_client +-- Table structure for base_query_sql -- ---------------------------- -DROP TABLE IF EXISTS `iam_client`; -CREATE TABLE `iam_client` ( +DROP TABLE IF EXISTS `base_query_sql`; +CREATE TABLE `base_query_sql` ( `id` bigint(20) NOT NULL COMMENT '主键', - `code` varchar(21) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `internal` bit(1) NOT NULL COMMENT '是否系统内置', - `enable` bit(1) NOT NULL COMMENT '是否可用', - `default_endow` bit(1) NULL DEFAULT NULL COMMENT '新注册的用户是否默认赋予该终端', - `login_type_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联登录方式\r\n', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `database_id` bigint(20) NULL DEFAULT NULL COMMENT '数据源ID', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称', + `is_list` bit(1) NULL DEFAULT NULL COMMENT '是否集合', + `sql` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'sql语句', + `params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'SQL查询参数', + `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'SQL查询结果字段', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '认证终端' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_client --- ---------------------------- -INSERT INTO `iam_client` VALUES (1430430071299207168, 'admin', 'pc管理端', b'1', b'1', b'1', '1430430071299207168,1435138582839009280,1430478946919653376,1542091599907115008,1542804450312122368,1543126042909016064', 'pc浏览器', 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2023-10-19 19:58:31', 5, b'0'); -INSERT INTO `iam_client` VALUES (1430430071299207169, 'h5', 'h5端', b'1', b'1', b'1', '1430430071299207168,1435138582839009280', '手机wap', 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2023-10-19 19:58:27', 2, b'0'); -INSERT INTO `iam_client` VALUES (1580487061605175296, 'adminv3', 'pc管理端(vue3版)', b'0', b'1', b'1', '1430430071299207168,1430478946919653376,1435138582839009280,1542091599907115008,1542804450312122368,1543126042909016064', 'vue3版本', 1399985191002447872, '2022-10-13 17:14:14', 1399985191002447872, '2023-10-19 19:58:21', 3, b'0'); -INSERT INTO `iam_client` VALUES (1626840094767714304, 'GoView', '可视化平台', b'0', b'1', b'1', '1430430071299207168', '', 1414143554414059520, '2023-02-18 15:04:38', 1399985191002447872, '2023-10-19 19:58:34', 1, b'0'); +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'SQL查询语句' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Table structure for demo_data_perm +-- Records of base_query_sql -- ---------------------------- -DROP TABLE IF EXISTS `demo_data_perm`; -CREATE TABLE `demo_data_perm` ( - `id` bigint(20) NOT NULL COMMENT '角色ID', - `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `creator_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者名称', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据权限演示' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of demo_data_perm +-- Table structure for base_street -- ---------------------------- -INSERT INTO `demo_data_perm` VALUES (1495969849707220992, '33', 'xxm', '444', 1399985191002447872, '2022-02-22 11:53:01', 1399985191002447872, '2022-02-22 11:53:01', 0, 0); -INSERT INTO `demo_data_perm` VALUES (1506921683460521984, '测试', '小小明', NULL, 1399985191002447872, '2022-03-24 17:11:41', 1399985191002447872, '2022-03-24 17:11:41', 0, 0); -INSERT INTO `demo_data_perm` VALUES (1531547191561072640, '测试', '测试', '123', 1435967884114194432, '2022-05-31 16:04:40', 1435967884114194432, '2022-05-31 16:04:40', 0, 0); +DROP TABLE IF EXISTS `base_street`; +CREATE TABLE `base_street` ( + `code` char(9) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编码', + `name` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '街道名称', + `area_code` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '县区编码', + PRIMARY KEY (`code`) USING BTREE, + INDEX `inx_area_code`(`area_code`) USING BTREE COMMENT '县区' +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '街道表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Table structure for starter_quartz_job +-- Records of base_street -- ---------------------------- -DROP TABLE IF EXISTS `starter_quartz_job`; -CREATE TABLE `starter_quartz_job` ( + +-- ---------------------------- +-- Table structure for base_village +-- ---------------------------- +DROP TABLE IF EXISTS `base_village`; +CREATE TABLE `base_village` ( + `code` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '编码', + `name` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '名称', + `street_code` char(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '社区/乡镇编码', + PRIMARY KEY (`code`) USING BTREE, + INDEX `inx_street_code`(`street_code`) USING BTREE COMMENT '所属街道索引' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '村庄/社区' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of base_village +-- ---------------------------- + +-- ---------------------------- +-- Table structure for common_sequence_range +-- ---------------------------- +DROP TABLE IF EXISTS `common_sequence_range`; +CREATE TABLE `common_sequence_range` ( `id` bigint(20) NOT NULL COMMENT '主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务名称', - `job_class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务类名', - `cron` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'cron表达式', - `parameter` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数', - `state` int(4) NULL DEFAULT NULL COMMENT '状态', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `range_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '区间key', + `range_value` bigint(20) NOT NULL COMMENT '区间开始值', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '序列生成器队列区间管理' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_quartz_job +-- Records of common_sequence_range -- ---------------------------- -INSERT INTO `starter_quartz_job` VALUES (1456579473573867520, '测试任务', 'cn.bootx.starter.quartz.task.TestTask', '50 0 * * * ? *', '{\"aaa\":\"5255\"}', 0, '测试任务', 1399985191002447872, '2021-11-05 19:09:43', 1399985191002447872, '2022-06-22 00:37:48', 25, 0); -INSERT INTO `starter_quartz_job` VALUES (1546857070483939328, '支付单超时检测', 'cn.bootx.payment.task.PayExpiredTimeTask', '0/5 * * * * ? *', NULL, 1, '检测超时的支付单, 超时后发送超时事件', 1399985191002447872, '2022-07-12 22:00:39', 1399985191002447872, '2022-07-12 22:00:45', 1, 0); +INSERT INTO `common_sequence_range` VALUES (1470679520373862400, 'Sequence:cs', 2006, 0, '2021-12-14 16:58:16', 0, '2021-12-14 16:58:16', 6, 0); +INSERT INTO `common_sequence_range` VALUES (1470679955230908416, 'cs', 2020, 0, '2021-12-14 17:00:00', 0, '2021-12-14 17:00:00', 13, 0); -- ---------------------------- --- Table structure for starter_audit_data_version +-- Table structure for demo_data_encrypt -- ---------------------------- -DROP TABLE IF EXISTS `starter_audit_data_version`; -CREATE TABLE `starter_audit_data_version` ( +DROP TABLE IF EXISTS `demo_data_encrypt`; +CREATE TABLE `demo_data_encrypt` ( `id` bigint(20) NOT NULL, - `table_name` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据表名称', - `data_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据名称', - `data_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据主键', - `data_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '数据内容', - `change_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '数据更新内容', - `version` int(10) NOT NULL COMMENT '版本', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据版本日志' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据加密解密演示' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_audit_data_version +-- Records of demo_data_encrypt -- ---------------------------- -INSERT INTO `starter_audit_data_version` VALUES (1480550993828446208, '', 'client', '1', '{\"dataName\":\"client\",\"dataId\":\"1\",\"dataContent\":{\"id\":\"1\",\"creator\":null,\"createTime\":\"2022-01-10 22:43:58\",\"lastModifier\":null,\"lastModifiedTime\":null,\"deleted\":false,\"version\":0,\"code\":null,\"name\":null,\"timeout\":null,\"captcha\":false,\"enable\":false,\"description\":null}}', NULL, 1, 0, '2022-01-10 22:43:59'); -INSERT INTO `starter_audit_data_version` VALUES (1480551021779288064, '', 'client', '1', '{\"dataName\":\"client\",\"dataId\":\"1\",\"dataContent\":{\"id\":\"1\",\"creator\":null,\"createTime\":\"2022-01-10 22:44:05\",\"lastModifier\":null,\"lastModifiedTime\":null,\"deleted\":false,\"version\":0,\"code\":null,\"name\":null,\"timeout\":null,\"captcha\":false,\"enable\":false,\"description\":null}}', NULL, 2, 0, '2022-01-10 22:44:06'); +INSERT INTO `demo_data_encrypt` VALUES (1506922411881103360, '测试加密效果', 'eI2RIrRLG+QUna3jMK+kejyJTTKdPFhaYWP4EhktJ2lkGTEsIxZesetNTzcqUA934ZN/OUdw4aj4t5Q+u1sH7A==', 1399985191002447872, '2022-03-24 17:14:35', 1399985191002447872, '2022-03-24 17:23:41', 1, 0); +INSERT INTO `demo_data_encrypt` VALUES (1506943412354408448, '测试下', 'Dgv5OSNiXuknceoZzeOUOQ==', 1399985191002447872, '2022-03-24 17:14:35', 1399985191002447872, '2022-03-24 17:23:41', 1, 0); -- ---------------------------- --- Table structure for iam_data_scope_dept +-- Table structure for demo_data_perm -- ---------------------------- -DROP TABLE IF EXISTS `iam_data_scope_dept`; -CREATE TABLE `iam_data_scope_dept` ( - `id` bigint(20) NOT NULL, - `data_scope_id` bigint(20) NOT NULL COMMENT '数据范围id', - `dept_id` bigint(20) NOT NULL COMMENT '部门id', +DROP TABLE IF EXISTS `demo_data_perm`; +CREATE TABLE `demo_data_perm` ( + `id` bigint(20) NOT NULL COMMENT '角色ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `creator_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者名称', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据范围部门关联配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据权限演示' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_data_scope_dept +-- Records of demo_data_perm -- ---------------------------- -INSERT INTO `iam_data_scope_dept` VALUES (1478742690014101504, 1474717160671485952, 1477978464559484928); -INSERT INTO `iam_data_scope_dept` VALUES (1478742920071675904, 1474717160671485952, 1477977592291053568); +INSERT INTO `demo_data_perm` VALUES (1495969849707220992, '33', 'xxm', '444', 1399985191002447872, '2022-02-22 11:53:01', 1399985191002447872, '2022-02-22 11:53:01', 0, 0); +INSERT INTO `demo_data_perm` VALUES (1506921683460521984, '测试', '小小明', NULL, 1399985191002447872, '2022-03-24 17:11:41', 1399985191002447872, '2022-03-24 17:11:41', 0, 0); +INSERT INTO `demo_data_perm` VALUES (1531547191561072640, '测试', '测试', '123', 1435967884114194432, '2022-05-31 16:04:40', 1435967884114194432, '2022-05-31 16:04:40', 0, 0); -- ---------------------------- -- Table structure for demo_data_sensitive @@ -4083,9 +3881,9 @@ CREATE TABLE `demo_data_sensitive` ( `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电子邮件', `other` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '其他', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE @@ -4098,737 +3896,822 @@ INSERT INTO `demo_data_sensitive` VALUES (1506942377435037696, '刘向东', '123 INSERT INTO `demo_data_sensitive` VALUES (1506943326094352384, '成是非', '99885511', '101278112512107721', '18855446622', '汉S123456', 'chengshifei@foxmail.com', '这个就是就是就是就是就是就是这样的', 1399985191002447872, '2022-03-24 18:33:55', 1399985191002447872, '2022-03-24 18:35:00', 1, 0); -- ---------------------------- --- Table structure for demo_data_encrypt +-- Table structure for demo_super_query -- ---------------------------- -DROP TABLE IF EXISTS `demo_data_encrypt`; -CREATE TABLE `demo_data_encrypt` ( - `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容', +DROP TABLE IF EXISTS `demo_super_query`; +CREATE TABLE `demo_super_query` ( + `id` bigint(20) NOT NULL COMMENT '角色ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `age` int(5) NULL DEFAULT NULL COMMENT '年龄', + `vip` bit(1) NULL DEFAULT NULL COMMENT '是否vip', + `birthday` date NULL DEFAULT NULL COMMENT '生日', + `work_time` time NULL DEFAULT NULL COMMENT '上班时间', + `registration_time` datetime NULL DEFAULT NULL COMMENT '注册时间', + `political` 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 '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据加密解密演示' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '超级查询演示' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of demo_data_encrypt +-- Records of demo_super_query -- ---------------------------- -INSERT INTO `demo_data_encrypt` VALUES (1506922411881103360, '测试加密效果', 'eI2RIrRLG+QUna3jMK+kejyJTTKdPFhaYWP4EhktJ2lkGTEsIxZesetNTzcqUA934ZN/OUdw4aj4t5Q+u1sH7A==', 1399985191002447872, '2022-03-24 17:14:35', 1399985191002447872, '2022-03-24 17:23:41', 1, 0); -INSERT INTO `demo_data_encrypt` VALUES (1506943412354408448, '测试下', 'Dgv5OSNiXuknceoZzeOUOQ==', 1399985191002447872, '2022-03-24 17:14:35', 1399985191002447872, '2022-03-24 17:23:41', 1, 0); +INSERT INTO `demo_super_query` VALUES (1496046463434567680, '小小明', 18, b'1', '1998-01-23', '08:30:00', '2022-02-22 16:57:27', '13', '这是备注', 1399985191002447872, '2022-02-22 16:57:27', 1399985191002447872, '2022-02-22 17:03:34', 1, 0); +INSERT INTO `demo_super_query` VALUES (1496372341213433856, '关羽', 52, b'1', '2000-02-23', '14:31:36', '2022-02-23 14:32:22', '1', '', 1399985191002447872, '2022-02-23 14:32:22', 1399985191002447872, '2022-02-23 14:32:22', 0, 0); +INSERT INTO `demo_super_query` VALUES (1496372489909899264, '张飞', 54, b'0', '1996-02-11', '08:00:00', '2022-02-23 14:32:58', '7', '备注', 1399985191002447872, '2022-02-23 14:32:58', 1399985191002447872, '2022-02-23 14:32:58', 0, 0); +INSERT INTO `demo_super_query` VALUES (1496372766427779072, '梁冀', 38, b'1', '1958-02-08', '08:30:00', '2022-02-23 14:34:03', '1', '', 1399985191002447872, '2022-02-23 14:34:03', 1399985191002447872, '2022-02-23 14:34:03', 0, 0); +INSERT INTO `demo_super_query` VALUES (1496373512871284736, '刘备', 108, b'0', '1993-11-12', '09:30:10', '2022-02-23 14:37:01', '2', '刘羽禅的粑粑', 1399985191002447872, '2022-02-23 14:37:01', 1399985191002447872, '2022-02-23 14:37:01', 0, 0); -- ---------------------------- --- Table structure for common_sequence_range +-- Table structure for iam_client -- ---------------------------- -DROP TABLE IF EXISTS `common_sequence_range`; -CREATE TABLE `common_sequence_range` ( +DROP TABLE IF EXISTS `iam_client`; +CREATE TABLE `iam_client` ( `id` bigint(20) NOT NULL COMMENT '主键', - `range_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '区间key', - `range_value` bigint(20) NOT NULL COMMENT '区间开始值', + `code` varchar(21) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `internal` bit(1) NOT NULL COMMENT '是否系统内置', + `enable` bit(1) NOT NULL COMMENT '是否可用', + `default_endow` bit(1) NULL DEFAULT NULL COMMENT '新注册的用户是否默认赋予该终端', + `login_type_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联登录方式\r\n', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '认证终端' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of iam_client +-- ---------------------------- +INSERT INTO `iam_client` VALUES (1430430071299207168, 'admin', 'pc管理端', b'1', b'1', b'1', '1430430071299207168,1435138582839009280,1430478946919653376,1542091599907115008,1542804450312122368,1543126042909016064', 'pc浏览器', 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2023-10-19 19:58:31', 5, b'0'); +INSERT INTO `iam_client` VALUES (1430430071299207169, 'h5', 'h5端', b'1', b'1', b'1', '1430430071299207168,1435138582839009280', '手机wap', 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2023-10-19 19:58:27', 2, b'0'); +INSERT INTO `iam_client` VALUES (1580487061605175296, 'adminv3', 'pc管理端(vue3版)', b'0', b'1', b'1', '1430430071299207168,1430478946919653376,1435138582839009280,1542091599907115008,1542804450312122368,1543126042909016064', 'vue3版本', 1399985191002447872, '2022-10-13 17:14:14', 1399985191002447872, '2023-10-19 19:58:21', 3, b'0'); +INSERT INTO `iam_client` VALUES (1626840094767714304, 'GoView', '可视化平台', b'0', b'1', b'1', '1430430071299207168', '', 1414143554414059520, '2023-02-18 15:04:38', 1399985191002447872, '2023-10-19 19:58:34', 1, b'0'); + +-- ---------------------------- +-- Table structure for iam_data_role +-- ---------------------------- +DROP TABLE IF EXISTS `iam_data_role`; +CREATE TABLE `iam_data_role` ( + `id` bigint(20) NOT NULL COMMENT '角色ID', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编码', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '序列生成器队列区间管理' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据范围权限' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of common_sequence_range +-- Records of iam_data_role -- ---------------------------- -INSERT INTO `common_sequence_range` VALUES (1470679520373862400, 'Sequence:cs', 2006, 0, '2021-12-14 16:58:16', 0, '2021-12-14 16:58:16', 6, 0); -INSERT INTO `common_sequence_range` VALUES (1470679955230908416, 'cs', 2020, 0, '2021-12-14 17:00:00', 0, '2021-12-14 17:00:00', 13, 0); +INSERT INTO `iam_data_role` VALUES (1474706893178871808, 'self', '自身数据', 'self', '只能查看自身范围的数据', 1399985191002447872, '2021-12-25 19:41:37', 1399985191002447872, '2021-12-25 19:41:37', 0, 0); +INSERT INTO `iam_data_role` VALUES (1474717084985270272, 'user', '用户(测试)', 'user', '用户数据权限', 1399985191002447872, '2021-12-25 20:22:07', 1399985191002447872, '2023-11-29 10:34:24', 1, 0); +INSERT INTO `iam_data_role` VALUES (1474717160671485952, 'dept', '部门(测试)', 'dept', '', 1399985191002447872, '2021-12-25 20:22:25', 1399985191002447872, '2023-11-29 10:34:04', 1, 0); +INSERT INTO `iam_data_role` VALUES (1474717276908232704, 'userAndDept', '用户和部门(测试)', 'dept_and_user', '', 1399985191002447872, '2021-12-25 20:22:52', 1399985191002447872, '2023-11-29 10:34:13', 1, 0); +INSERT INTO `iam_data_role` VALUES (1474717344562356224, 'all', '全部数据', 'all', '', 1399985191002447872, '2021-12-25 20:23:09', 1399985191002447872, '2023-11-29 10:28:40', 1, 0); +INSERT INTO `iam_data_role` VALUES (1477990268903804928, 'self_dept', '所在部门', 'self_dept', '', 1399985191002447872, '2022-01-03 21:08:34', 1399985191002447872, '2023-11-29 10:33:38', 5, 0); +INSERT INTO `iam_data_role` VALUES (1477990439800721408, 'self_dept_and_sub', '当前加下级部门', 'self_dept_sub', '', 1399985191002447872, '2022-01-03 21:09:15', 1399985191002447872, '2023-11-29 13:55:12', 9, 0); -- ---------------------------- --- Table structure for base_dynamic_form +-- Table structure for iam_data_role_dept -- ---------------------------- -DROP TABLE IF EXISTS `base_dynamic_form`; -CREATE TABLE `base_dynamic_form` ( +DROP TABLE IF EXISTS `iam_data_role_dept`; +CREATE TABLE `iam_data_role_dept` ( `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单名称', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单键名', - `value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '表单内容', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(8) NOT NULL COMMENT '版本', + `role_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_bin COMMENT = '动态表单' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据范围部门关联配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_dynamic_form +-- Records of iam_data_role_dept -- ---------------------------- -INSERT INTO `base_dynamic_form` VALUES (1552656018381422592, '测试表单', 'test', '{\"list\":[{\"type\":\"input\",\"label\":\"输入框\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":true,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"aa\",\"key\":\"input_1659059676533\",\"help\":\"测试\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"textarea\",\"label\":\"文本框\",\"options\":{\"width\":\"100%\",\"minRows\":4,\"maxRows\":6,\"maxLength\":null,\"defaultValue\":\"\",\"clearable\":true,\"hidden\":false,\"disabled\":false,\"placeholder\":\"请输入\"},\"model\":\"bb\",\"key\":\"textarea_1659020414125\",\"help\":\"\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"slider\",\"label\":\"滑动输入条\",\"options\":{\"width\":\"100%\",\"defaultValue\":34,\"disabled\":false,\"hidden\":false,\"min\":0,\"max\":100,\"step\":1,\"showInput\":false},\"model\":\"cc\",\"key\":\"slider_1659020433092\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]}],\"config\":{\"layout\":\"horizontal\",\"labelCol\":{\"xs\":4,\"sm\":4,\"md\":4,\"lg\":4,\"xl\":4,\"xxl\":4},\"labelWidth\":100,\"labelLayout\":\"flex\",\"wrapperCol\":{\"xs\":18,\"sm\":18,\"md\":18,\"lg\":18,\"xl\":18,\"xxl\":18},\"hideRequiredMark\":false,\"customStyle\":\"\"}}', '测试动态表单', 1399985191002447872, '2022-07-28 22:03:36', 1399985191002447872, '2022-07-29 09:55:22', 0, 7); -INSERT INTO `base_dynamic_form` VALUES (1552656018381422593, '测试表单1', 'test1', '{\"list\":[{\"type\":\"input\",\"label\":\"申请人\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":true,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"apply_by\",\"key\":\"input_1659059676533\",\"help\":\"测试\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"input\",\"label\":\"请假天数\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":false,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"leave_days\",\"key\":\"input_1662106166142\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"textarea\",\"label\":\"备注\",\"options\":{\"width\":\"100%\",\"minRows\":4,\"maxRows\":6,\"maxLength\":null,\"defaultValue\":\"\",\"clearable\":true,\"hidden\":false,\"disabled\":false,\"placeholder\":\"请输入\"},\"model\":\"remark\",\"key\":\"textarea_1659020414125\",\"help\":\"\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"switch\",\"label\":\"开关\",\"options\":{\"defaultValue\":false,\"hidden\":false,\"disabled\":false},\"model\":\"switch_1662108221389\",\"key\":\"switch_1662108221389\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"slider\",\"label\":\"滑动输入条\",\"options\":{\"width\":\"100%\",\"defaultValue\":34,\"disabled\":false,\"hidden\":false,\"min\":0,\"max\":100,\"step\":1,\"showInput\":false},\"model\":\"cc\",\"key\":\"slider_1659020433092\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"table\",\"label\":\"表格布局\",\"trs\":[{\"tds\":[{\"colspan\":1,\"rowspan\":1,\"list\":[]},{\"colspan\":1,\"rowspan\":1,\"list\":[]}]},{\"tds\":[{\"colspan\":1,\"rowspan\":1,\"list\":[{\"type\":\"editor\",\"label\":\"富文本\",\"icon\":\"icon-LC_icon_edit_line_1\",\"list\":[],\"options\":{\"height\":300,\"placeholder\":\"请输入\",\"defaultValue\":\"\",\"chinesization\":true,\"hidden\":false,\"disabled\":false,\"showLabel\":false,\"width\":\"100%\"},\"model\":\"editor_1662106288134\",\"key\":\"editor_1662106288134\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]}]},{\"colspan\":1,\"rowspan\":1,\"list\":[]}]}],\"options\":{\"width\":\"100%\",\"bordered\":true,\"bright\":false,\"small\":true,\"customStyle\":\"\"},\"key\":\"table_1662106283652\"}],\"config\":{\"layout\":\"vertical\",\"labelCol\":{\"xs\":6,\"sm\":6,\"md\":6,\"lg\":6,\"xl\":6,\"xxl\":6},\"labelWidth\":100,\"labelLayout\":\"Grid\",\"wrapperCol\":{\"xs\":18,\"sm\":18,\"md\":18,\"lg\":18,\"xl\":18,\"xxl\":18},\"hideRequiredMark\":false,\"customStyle\":\"\"}}', '测试动态表单', 1399985191002447872, '2022-07-28 22:03:36', 1414143554414059520, '2022-09-02 16:44:01', 0, 12); -- ---------------------------- --- Table structure for notice_message_template +-- Table structure for iam_data_role_user -- ---------------------------- -DROP TABLE IF EXISTS `notice_message_template`; -CREATE TABLE `notice_message_template` ( +DROP TABLE IF EXISTS `iam_data_role_user`; +CREATE TABLE `iam_data_role_user` ( `id` bigint(20) NOT NULL, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模板数据', - `type` varchar(50) 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 '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `role_id` bigint(20) NOT NULL COMMENT '数据角色id', + `user_id` bigint(20) NOT NULL COMMENT '用户id', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息模板' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据范围用户关联配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_message_template +-- Records of iam_data_role_user -- ---------------------------- -INSERT INTO `notice_message_template` VALUES (1424936204932169730, 'cs', '测试', 'hello ${msg}6666666666666666666666666666', '1', '测试模板', 0, '2021-08-10 11:30:40', 0, '2021-08-10 11:30:40', 0, 0); -- ---------------------------- --- Table structure for iam_user_info +-- Table structure for iam_dept -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_info`; -CREATE TABLE `iam_user_info` ( - `id` bigint(20) NOT NULL, - `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', - `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号', - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码', - `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '手机号', - `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱', - `client_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '关联终端ds', - `administrator` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否超级管理员', - `status` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号状态', +DROP TABLE IF EXISTS `iam_dept`; +CREATE TABLE `iam_dept` ( + `id` bigint(20) NOT NULL COMMENT 'ID', + `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父机构ID', + `dept_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构/部门名称', + `sort_no` int(11) NOT NULL DEFAULT 0 COMMENT '排序', + `org_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '机构类别 1公司 2部门 3岗位', + `org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构编码', + `mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号', + `fax` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '传真', + `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门组织机构表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_info +-- Records of iam_dept -- ---------------------------- -INSERT INTO `iam_user_info` VALUES (1399985191002447872, 'Bootx', 'bootx', 'f52020dca765fd3943ed40a615dc2c5c', '13333333333', 'bootx@bootx.com', '1430430071299207168,1430430071299207169,1626840094767714304,1580487061605175296', b'1', 'norm', 1, '2021-06-02 15:04:15', 1399985191002447872, '2023-10-19 14:14:46', 58, 0); +INSERT INTO `iam_dept` VALUES (1259382878857957377, NULL, 'Bootx Platform总公司', 0, '1', '1', '', NULL, '济南市高新区齐鲁软件园', NULL, -1, '2020-05-10 15:20:51', -1, '2020-05-10 17:52:15', 4, 0); +INSERT INTO `iam_dept` VALUES (1477976804995026944, NULL, 'Bootx Cloud公司', 0, '1', '1', '', NULL, '济南市高新区汉峪金谷', '', 1399985191002447872, '2022-01-03 20:15:04', 1399985191002447872, '2022-01-03 20:15:05', 0, 1); +INSERT INTO `iam_dept` VALUES (1477977184768282624, NULL, 'Bootx Cloud公司', 0, '1', '1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:16:35', 1399985191002447872, '2022-01-03 20:16:35', 0, 1); +INSERT INTO `iam_dept` VALUES (1477977301365739520, NULL, 'Bootx Cloud总公司', 0, '1', '2', '', NULL, '济南市高新区汉峪金谷', '', 1399985191002447872, '2022-01-03 20:17:03', 1399985191002447872, '2022-01-03 20:17:03', 1, 0); +INSERT INTO `iam_dept` VALUES (1477977592291053568, 1259382878857957377, 'bp济南分公司', 0, '1', '1_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:18:12', 1399985191002447872, '2022-01-03 20:18:12', 1, 0); +INSERT INTO `iam_dept` VALUES (1477977690928500736, 1259382878857957377, '历城分公司', 0, '1', '1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:18:36', 1399985191002447872, '2022-01-03 20:18:36', 0, 1); +INSERT INTO `iam_dept` VALUES (1477977827897692160, 1259382878857957377, 'bp潍坊分公司', 0, '1', '1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:08', 1399985191002447872, '2022-01-03 20:19:08', 0, 0); +INSERT INTO `iam_dept` VALUES (1477977880947249152, 1477977301365739520, 'bc菏泽分公司', 0, '1', '2_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:21', 1399985191002447872, '2022-01-03 20:19:21', 0, 0); +INSERT INTO `iam_dept` VALUES (1477977930175795200, 1477977301365739520, 'bc日照分公司', 0, '1', '2_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:33', 1399985191002447872, '2022-01-03 20:19:33', 0, 0); +INSERT INTO `iam_dept` VALUES (1477978464559484928, 1477977592291053568, '历城办事部', 0, '2', '1_1_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:21:40', 1399985191002447872, '2022-01-03 20:21:40', 1, 0); +INSERT INTO `iam_dept` VALUES (1477978512177418240, 1477977592291053568, '历下办事部', 0, '2', '1_1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:21:51', 1399985191002447872, '2022-01-03 20:21:52', 0, 0); +INSERT INTO `iam_dept` VALUES (1477978610865197056, 1477977592291053568, '高新办事部', 0, '2', '1_1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:22:15', 1399985191002447872, '2022-01-03 20:22:15', 0, 0); +INSERT INTO `iam_dept` VALUES (1477978810526650368, 1477977827897692160, '奎文办事部', 0, '2', '1_2_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:23:03', 1399985191002447872, '2022-01-03 20:23:03', 0, 0); +INSERT INTO `iam_dept` VALUES (1477978883247493120, 1477977827897692160, '潍城办事部', 0, '2', '1_2_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:23:20', 1399985191002447872, '2022-01-03 20:23:20', 0, 0); -- ---------------------------- --- Table structure for iam_user_expand_info +-- Table structure for iam_login_security_config -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_expand_info`; -CREATE TABLE `iam_user_expand_info` ( +DROP TABLE IF EXISTS `iam_login_security_config`; +CREATE TABLE `iam_login_security_config` ( `id` bigint(20) NOT NULL COMMENT '主键', - `sex` int(4) NULL DEFAULT NULL COMMENT '性别', - `birthday` date NULL DEFAULT NULL COMMENT '生日', - `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像', - `last_login_time` datetime(0) NULL DEFAULT NULL COMMENT '上次登录时间', - `current_login_time` datetime(0) NULL DEFAULT NULL COMMENT '本次登录时间', - `initial_password` bit(1) NOT NULL COMMENT '是否初始密码', - `last_change_password_time` datetime(0) NULL DEFAULT NULL COMMENT '上次修改密码时间', - `register_time` datetime(0) NOT NULL COMMENT '注册时间', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '删除标志', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户扩展信息' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_user_expand_info --- ---------------------------- -INSERT INTO `iam_user_expand_info` VALUES (1399985191002447872, 1, '1996-12-01', NULL, '2023-10-19 19:21:46', '2023-10-20 09:31:26', b'0', '2023-10-19 14:14:08', '2021-08-01 18:52:37', 1, '2021-06-02 15:04:15', 1, '2023-10-20 09:31:26', 382, b'0'); - --- ---------------------------- --- Table structure for iam_password_security_config --- ---------------------------- -DROP TABLE IF EXISTS `iam_password_security_config`; -CREATE TABLE `iam_password_security_config` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `max_pwd_error_count` int(11) NULL DEFAULT NULL COMMENT '最大密码错误数', - `error_lock_time` int(11) NULL DEFAULT NULL COMMENT '密码错误锁定时间(分钟)', - `require_change_pwd` bit(1) NULL DEFAULT NULL COMMENT '强制修改初始密码', - `update_frequency` int(11) NULL DEFAULT NULL COMMENT '更新频率', - `expire_remind` int(11) NULL DEFAULT NULL COMMENT '到期提醒(天数)', - `same_as_login_name` bit(1) NULL DEFAULT NULL COMMENT '与登录名相同', - `recent_password` int(11) NULL DEFAULT NULL COMMENT '不能与近期多少次密码相同', + `client_id` bigint(20) NULL DEFAULT NULL COMMENT '关联终端ID', + `require_login_change_pwd` bit(1) NULL DEFAULT NULL COMMENT '修改密码是否需要重新登录', + `captcha_enable` bit(1) NULL DEFAULT NULL COMMENT '默认启用验证码', + `max_captcha_error_count` int(11) NULL DEFAULT NULL COMMENT '出现验证码的错误次数', + `allow_multi_login` bit(1) NULL DEFAULT NULL COMMENT '同端是否允许同时登录', + `allow_multi_terminal_login` bit(1) NULL DEFAULT NULL COMMENT '多终端是否允许同时登录', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码安全策略' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_password_security_config --- ---------------------------- -INSERT INTO `iam_password_security_config` VALUES (1714844168393515008, 5, 10, b'1', 90, 14, b'0', 5, 1399985191002447872, '2023-10-19 11:21:25', 1399985191002447872, '2023-10-19 11:21:25', 0, b'0'); - --- ---------------------------- --- Table structure for starter_wx_template --- ---------------------------- -DROP TABLE IF EXISTS `starter_wx_template`; -CREATE TABLE `starter_wx_template` ( - `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', - `enable` bit(1) NOT NULL COMMENT '是否启用', - `template_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板ID', - `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板标题', - `primary_industry` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板所属行业的一级行业', - `deputy_industry` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板所属行业的二级行业', - `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板内容', - `example` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '示例', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `inx_`(`template_id`) USING BTREE COMMENT '模板id' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信消息模板' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '登录安全策略' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_wx_template +-- Records of iam_login_security_config -- ---------------------------- -- ---------------------------- --- Table structure for starter_wx_menu +-- Table structure for iam_login_type -- ---------------------------- -DROP TABLE IF EXISTS `starter_wx_menu`; -CREATE TABLE `starter_wx_menu` ( +DROP TABLE IF EXISTS `iam_login_type`; +CREATE TABLE `iam_login_type` ( `id` bigint(20) NOT NULL COMMENT '主键', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称', - `menu_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '菜单信息', - `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', - `publish` bit(1) NOT NULL COMMENT '是否发布', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(11) NOT NULL COMMENT '版本', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '微信自定义菜单' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of starter_wx_menu --- ---------------------------- - --- ---------------------------- --- Table structure for starter_wx_fans --- ---------------------------- -DROP TABLE IF EXISTS `starter_wx_fans`; -CREATE TABLE `starter_wx_fans` ( - `id` bigint(20) NOT NULL, - `openid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联OpenId', - `subscribe_status` bit(1) NULL DEFAULT NULL COMMENT '订阅状态', - `subscribe_time` datetime(0) NULL DEFAULT NULL COMMENT '订阅时间', - `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', - `sex` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', - `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '语言', - `country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '国家', - `province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '省份', - `city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市', - `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像地址', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信公众号粉丝' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of starter_wx_fans --- ---------------------------- - --- ---------------------------- --- Table structure for starter_wecom_robot_config --- ---------------------------- -DROP TABLE IF EXISTS `starter_wecom_robot_config`; -CREATE TABLE `starter_wecom_robot_config` ( - `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', - `webhook_key` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'webhook地址的key值', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(6) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` bit(1) NOT NULL COMMENT '0:未删除。1:已删除', + `code` varchar(21) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', + `internal` bit(1) NOT NULL COMMENT '是否系统内置', + `timeout` bigint(11) NULL DEFAULT NULL COMMENT '在线时长(秒)', + `captcha_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '验证码类型', + `captcha` bit(1) NOT NULL COMMENT '启用验证码', + `enable` bit(1) NOT NULL COMMENT '是否可用', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '企业微信机器人配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登录方式' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_wecom_robot_config +-- Records of iam_login_type -- ---------------------------- +INSERT INTO `iam_login_type` VALUES (1430430071299207168, 'password', '账号密码登陆', 'password', b'1', 3600, '-1', b'0', b'1', NULL, 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2022-11-03 22:24:53', 20, b'0'); +INSERT INTO `iam_login_type` VALUES (1430478946919653376, 'miniApp', '微信小程序', 'openId', b'0', 99999, '0', b'0', b'1', NULL, 1399985191002447872, '2021-08-25 18:35:33', 1399985191002447872, '2022-07-16 12:32:26', 3, b'0'); +INSERT INTO `iam_login_type` VALUES (1435138582839009280, 'phone', '手机短信登录', 'openId', b'0', 3600, '0', b'0', b'1', NULL, 1399985191002447872, '2021-09-07 15:11:16', 1399985191002447872, '2022-07-16 12:32:19', 5, b'0'); +INSERT INTO `iam_login_type` VALUES (1542091599907115008, 'dingTalk', '钉钉', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-06-29 18:24:23', 1399985191002447872, '2022-07-02 14:55:01', 5, b'0'); +INSERT INTO `iam_login_type` VALUES (1542804450312122368, 'weCom', '企业微信', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-07-01 17:37:00', 1399985191002447872, '2022-07-01 17:37:00', 0, b'0'); +INSERT INTO `iam_login_type` VALUES (1543126042909016064, 'weChat', '微信登录', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-07-02 14:54:53', 0, '2022-10-12 22:15:05', 2, b'0'); +INSERT INTO `iam_login_type` VALUES (1626845524617203712, 'passwordGoView', '可视化平台登录', 'password', b'0', 3600, '-1', b'0', b'1', '', 1414143554414059520, '2023-02-18 15:26:13', 1414143554414059520, '2023-02-18 15:26:13', 0, b'0'); -- ---------------------------- --- Table structure for starter_quartz_job_log +-- Table structure for iam_password_change_history -- ---------------------------- -DROP TABLE IF EXISTS `starter_quartz_job_log`; -CREATE TABLE `starter_quartz_job_log` ( +DROP TABLE IF EXISTS `iam_password_change_history`; +CREATE TABLE `iam_password_change_history` ( `id` bigint(20) NOT NULL COMMENT '主键', - `handler_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理器名称', - `class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理器全限定名', - `success` bit(1) NOT NULL COMMENT '是否执行成功', - `error_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误信息', - `start_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间', - `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', - `duration` bigint(255) NULL DEFAULT NULL COMMENT '执行时长', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户Id', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务执行日志' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码更改历史' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_quartz_job_log +-- Records of iam_password_change_history -- ---------------------------- -- ---------------------------- --- Table structure for starter_file_upload_info +-- Table structure for iam_password_login_fail_record -- ---------------------------- -DROP TABLE IF EXISTS `starter_file_upload_info`; -CREATE TABLE `starter_file_upload_info` ( +DROP TABLE IF EXISTS `iam_password_login_fail_record`; +CREATE TABLE `iam_password_login_fail_record` ( `id` bigint(20) NOT NULL COMMENT '主键', - `file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '存储位置', - `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件名称', - `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件类型', - `file_suffix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件后缀', - `file_size` bigint(20) NULL DEFAULT NULL COMMENT '文件大小', - `external_storage_id` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '外部关联id', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', + `fail_count` int(11) NULL DEFAULT NULL COMMENT '登录失败次数', + `fail_time` datetime NULL DEFAULT NULL COMMENT '登录失败时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '上传文件信息' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码登录失败记录' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_file_upload_info +-- Records of iam_password_login_fail_record -- ---------------------------- -- ---------------------------- --- Table structure for starter_file_data +-- Table structure for iam_password_security_config -- ---------------------------- -DROP TABLE IF EXISTS `starter_file_data`; -CREATE TABLE `starter_file_data` ( +DROP TABLE IF EXISTS `iam_password_security_config`; +CREATE TABLE `iam_password_security_config` ( `id` bigint(20) NOT NULL COMMENT '主键', - `base64` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'base64方式存储', - `data` longblob NULL COMMENT '数据方式存储', + `max_pwd_error_count` int(11) NULL DEFAULT NULL COMMENT '最大密码错误数', + `error_lock_time` int(11) NULL DEFAULT NULL COMMENT '密码错误锁定时间(分钟)', + `require_change_pwd` bit(1) NULL DEFAULT NULL COMMENT '强制修改初始密码', + `update_frequency` int(11) NULL DEFAULT NULL COMMENT '更新频率', + `expire_remind` int(11) NULL DEFAULT NULL COMMENT '到期提醒(天数)', + `same_as_login_name` bit(1) NULL DEFAULT NULL COMMENT '与登录名相同', + `recent_password` int(11) NULL DEFAULT NULL COMMENT '不能与近期多少次密码相同', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '上传文件数据' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码安全策略' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_file_data +-- Records of iam_password_security_config -- ---------------------------- +INSERT INTO `iam_password_security_config` VALUES (1714844168393515008, 5, 10, b'1', 90, 14, b'0', 5, 1399985191002447872, '2023-10-19 11:21:25', 1399985191002447872, '2023-10-19 11:21:25', 0, b'0'); -- ---------------------------- --- Table structure for starter_ding_robot_config +-- Table structure for iam_perm_menu -- ---------------------------- -DROP TABLE IF EXISTS `starter_ding_robot_config`; -CREATE TABLE `starter_ding_robot_config` ( +DROP TABLE IF EXISTS `iam_perm_menu`; +CREATE TABLE `iam_perm_menu` ( `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', - `access_token` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉机器人访问token', - `enable_signature_check` bit(1) NOT NULL COMMENT '是否开启验签', - `sign_secret` 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 '备注', + `client_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '终端code', + `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父id', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由名称', + `perm_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单权限编码', + `effect` bit(1) NULL DEFAULT NULL COMMENT '是否有效', + `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标', + `hidden` bit(1) NOT NULL COMMENT '是否隐藏', + `hide_children_in_menu` bit(1) NOT NULL COMMENT '是否隐藏子菜单', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件', + `component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件名字', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路径', + `redirect` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单跳转地址(重定向)', + `sort_no` double NOT NULL COMMENT '菜单排序', + `menu_type` int(5) NOT NULL COMMENT '类型(0:一级菜单;1:子菜单 ;2:按钮权限)', + `leaf` bit(1) NULL DEFAULT NULL COMMENT '是否叶子节点', + `keep_alive` bit(1) NULL DEFAULT NULL COMMENT '是否缓存页面', + `target_outside` bit(1) NULL DEFAULT NULL COMMENT '是否外部打开方式', + `hidden_header_content` bit(1) NULL DEFAULT NULL COMMENT '隐藏的标题内容', + `admin` bit(1) NOT NULL COMMENT '系统菜单', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(6) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', - `deleted` bit(1) NOT NULL COMMENT '0:未删除。1:已删除', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '钉钉机器人配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限_菜单' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_ding_robot_config +-- Records of iam_perm_menu -- ---------------------------- +INSERT INTO `iam_perm_menu` VALUES (1580740450633101312, 'adminv3', NULL, '系统管理', 'System', NULL, b'0', 'ant-design:setting-outlined', b'0', b'0', 'Layout', NULL, '/system', '/system1/client', -99999, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:01:07', 1414143554414059520, '2022-10-18 15:32:09', 4, 0); +INSERT INTO `iam_perm_menu` VALUES (1580740637841666048, 'adminv3', 1582253306356649984, '终端管理', 'ClientList', NULL, b'0', '', b'0', b'0', '/modules/system/client/ClientList.vue', NULL, '/system/client', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:01:51', 1414143554414059520, '2022-10-18 14:13:27', 5, 0); +INSERT INTO `iam_perm_menu` VALUES (1580740758629232640, 'adminv3', 1582253306356649984, '登录方式', 'LoginTypeList', NULL, b'0', '', b'0', b'0', '/modules/system/loginType/LoginTypeList.vue', NULL, '/system/loginType', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:02:20', 1414143554414059520, '2022-10-18 14:13:40', 5, 0); +INSERT INTO `iam_perm_menu` VALUES (1580858583654051840, 'adminv3', 1580740450633101312, '测试Iframe', 'Iframe', NULL, b'0', '', b'0', b'0', 'Iframe', NULL, '/system/Iframe', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 17:50:32', 1414143554414059520, '2022-10-17 17:46:19', 5, 1); +INSERT INTO `iam_perm_menu` VALUES (1580917438227075072, 'adminv3', 1580740450633101312, '三极目录', 'hello', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system1/a', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 21:44:24', 1399985191002447872, '2022-10-14 23:38:16', 2, 1); +INSERT INTO `iam_perm_menu` VALUES (1580917571069071360, 'adminv3', 1580917438227075072, '百度', 'baidu', NULL, b'0', '', b'0', b'0', '', NULL, 'https://www.baidu.com/', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 21:44:56', 1399985191002447872, '2022-10-14 23:37:44', 3, 1); +INSERT INTO `iam_perm_menu` VALUES (1580928436300337152, 'adminv3', 1580740450633101312, '菜单管理', 'MenuList', NULL, b'0', '', b'0', b'0', '/modules/system/menu/MenuList.vue', NULL, '/system/menu', '', -99, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 22:28:06', 1399985191002447872, '2022-10-14 22:28:32', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582249924602580992, 'adminv3', 1580740450633101312, '权限管理', 'Permission', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/permission', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 13:59:13', 1414143554414059520, '2022-10-18 13:59:13', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582253011803262976, 'adminv3', 1580740450633101312, '用户信息', 'UserAuth', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/user', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:11:30', 1414143554414059520, '2022-10-18 14:11:30', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582253152903843840, 'adminv3', 1580740450633101312, '系统配置', 'SystemConfig', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:12:03', 1414143554414059520, '2022-10-18 14:12:03', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582253306356649984, 'adminv3', 1580740450633101312, '认证管理', 'Auth', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/auth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:12:40', 1414143554414059520, '2022-10-18 14:13:13', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582275875424129024, 'adminv3', NULL, '系统监控', 'Monitor', NULL, b'0', 'ant-design:monitor-outlined', b'0', b'0', 'Layout', NULL, '/monitor', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:42:21', 1414143554414059520, '2022-10-19 17:29:29', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582275984849326080, 'adminv3', NULL, '通知管理', 'Notice', NULL, b'0', 'ant-design:message-outlined', b'0', b'0', 'Layout', NULL, '/notice', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:42:47', 1414143554414059520, '2022-10-19 17:30:06', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582276092038959104, 'adminv3', NULL, '第三方对接', 'Third', NULL, b'0', 'ant-design:api-twotone', b'0', b'0', 'Layout', NULL, '/third', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:43:12', 1414143554414059520, '2022-10-19 17:32:04', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582276341792985088, 'adminv3', NULL, '开发管理', 'Develop', NULL, b'0', 'ant-design:apartment-outlined', b'0', b'0', 'Layout', NULL, '/develop', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:44:12', 1414143554414059520, '2022-10-19 15:24:22', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582276516905177088, 'adminv3', NULL, '功能演示', 'Demo', NULL, b'0', 'ant-design:appstore-twotone', b'0', b'0', 'Layout', NULL, '/demo', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:44:54', 1414143554414059520, '2022-10-19 17:34:26', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582277076421136384, 'adminv3', 1582249924602580992, '角色管理', 'RoleList', NULL, b'0', '', b'0', b'0', '/modules/system/role/RoleList.vue', NULL, '/system/permission/role', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:47:07', 1414143554414059520, '2022-10-18 15:59:37', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582301940364308480, 'adminv3', 1582249924602580992, '请求权限', 'PermPathList', NULL, b'0', '', b'0', b'0', '/modules/system/path/PermPathList.vue', NULL, '/system/permission/path', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:25:55', 1399985191002447872, '2023-11-29 13:57:56', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1582302180999917568, 'adminv3', 1582249924602580992, '数据角色', 'DataRoleList', NULL, b'0', '', b'0', b'0', '/modules/system/scope/DataRoleList.vue', NULL, '/system/permission/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:26:52', 1399985191002447872, '2023-11-28 21:02:57', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1582302542955769856, 'adminv3', 1582253011803262976, '用户管理', 'UserList', NULL, b'0', '', b'0', b'0', '/modules/system/user/UserList.vue', NULL, '/system/user/info', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:28:19', 1414143554414059520, '2022-10-18 17:28:19', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582302764129808384, 'adminv3', 1582253011803262976, '部门管理', 'DeptList', NULL, b'0', '', b'0', b'0', '/modules/system/dept/DeptList.vue', NULL, '/system/user/dept', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:29:11', 1414143554414059520, '2022-10-18 17:32:26', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582303143110340608, 'adminv3', 1582253152903843840, '数据字典', 'DictList', NULL, b'0', '', b'0', b'0', '/modules/system/dict/DictList.vue', NULL, '/system/config/dict', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:30:42', 1414143554414059520, '2022-10-18 17:30:42', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582303290070364160, 'adminv3', 1582253152903843840, '定时任务', 'QuartzJobList', NULL, b'0', '', b'0', b'0', '/modules/baseapi/quartz/QuartzJobList.vue', NULL, '/system/config/quartz', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:31:17', 1414143554414059520, '2023-08-09 15:50:46', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1582303447428067328, 'adminv3', 1582253152903843840, '系统参数', 'SystemParamList', NULL, b'0', '', b'0', b'0', '/modules/system/param/SystemParamList.vue', NULL, '/system/config/param', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:31:54', 1414143554414059520, '2022-10-19 23:14:16', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582632873244172288, 'adminv3', 1582276341792985088, '文件管理', 'FileUploadList', NULL, b'0', '', b'0', b'0', '/modules/develop/file/FileUploadList.vue', NULL, '/develop/file', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:20:56', 1414143554414059520, '2022-10-19 15:20:56', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582633196587261952, 'adminv3', 1582276341792985088, '代码生成', 'CodeGenList', NULL, b'0', '', b'0', b'0', '/modules/develop/codegen/CodeGenList.vue', NULL, '/develop/codegen', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:22:13', 1414143554414059520, '2022-10-19 15:23:17', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582633307786649600, 'adminv3', 1582276341792985088, '动态表单', 'DynamicFormList', NULL, b'0', '', b'0', b'0', '/modules/develop/dynamicform/DynamicFormList.vue', NULL, '/develop/form', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:22:39', 1414143554414059520, '2022-10-19 15:22:39', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582633620321017856, 'adminv3', 1582276341792985088, '动态数据源', 'DynamicDataSourceList', NULL, b'0', '', b'0', b'0', '/modules/develop/dynamicsource/DynamicDataSourceList.vue', NULL, '/develop/source', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:23:54', 1414143554414059520, '2022-10-19 15:23:54', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583074308040925184, 'adminv3', 1582275875424129024, '接口文档', 'ApiSwagger', NULL, b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/doc.html', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:35:02', 1414143554414059520, '2022-11-23 13:59:09', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1583075229563068416, 'adminv3', 1582275875424129024, '审计日志', 'AuditLog', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/monitor/log', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:38:42', 1414143554414059520, '2022-10-20 20:41:38', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1583076217481043968, 'adminv3', 1583075229563068416, '登录日志', 'LoginLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/login/LoginLogList.vue', NULL, '/monitor/log/login', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:42:37', 1414143554414059520, '2022-10-20 20:43:36', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1583076424935514112, 'adminv3', 1583075229563068416, '操作日志', 'OperateLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/operate/OperateLogList.vue', NULL, '/monitor/log/operate', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:43:26', 1414143554414059520, '2022-10-20 20:43:26', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583076670881112064, 'adminv3', 1583075229563068416, '数据版本日志', 'DataVersionLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/data/DataVersionLogList.vue', NULL, '/monitor/log/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:44:25', 1414143554414059520, '2022-10-20 20:44:25', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583076878956339200, 'adminv3', 1582275875424129024, 'ELK日志', 'ELK', NULL, b'0', '', b'1', b'0', '', NULL, 'http://elk.dev.bootx.cn:5601/app/discover', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:45:15', 1414143554414059520, '2023-08-12 19:26:12', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1583077015434797056, 'adminv3', 1582275875424129024, 'PlumeLog日志', 'PlumeLog', NULL, b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/plumelog/#/', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:45:47', 1414143554414059520, '2022-10-20 20:45:47', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583077198772019200, 'adminv3', 1582275875424129024, '系统信息', 'SystemInfoMonitor', NULL, b'0', '', b'0', b'0', '/modules/monitor/system/SystemInfoMonitor.vue', NULL, '/monitor/sysinfo', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:46:31', 1414143554414059520, '2022-10-20 20:46:31', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583077360827342848, 'adminv3', 1582275875424129024, 'Redis监控', 'RedisInfoMonitor', NULL, b'0', '', b'0', b'0', '/modules/monitor/redis/RedisInfoMonitor.vue', NULL, '/monitor/redis', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:47:10', 1414143554414059520, '2022-10-20 20:47:10', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584378294652051456, 'adminv3', 1582275984849326080, '邮件配置', 'MailConfigList', NULL, b'0', '', b'0', b'0', '/modules/notice/mail/MailConfigList.vue', NULL, '/notice/notice', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:56:36', 1414143554414059520, '2022-10-24 16:14:34', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1584378497824137216, 'adminv3', 1582275984849326080, '消息模板', 'MessageTemplateList', NULL, b'0', '', b'0', b'0', '/modules/notice/template/MessageTemplateList.vue', NULL, '/notice/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:57:25', 1414143554414059520, '2022-10-25 22:14:14', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1584378671266996224, 'adminv3', 1582275984849326080, '站内信', 'SiteMessageList', NULL, b'0', '', b'0', b'0', '/modules/notice/site/sender/SiteMessageList.vue', NULL, '/notice/siteMessage', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:58:06', 1414143554414059520, '2022-10-24 10:58:06', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584379602188574720, 'adminv3', 1582276092038959104, '微信', 'WeChat', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/wechat', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:01:48', 1414143554414059520, '2022-10-24 11:01:48', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584379704122744832, 'adminv3', 1582276092038959104, '企业微信', 'WeCom', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/wecom', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:02:12', 1414143554414059520, '2022-10-24 11:02:12', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584380087805091840, 'adminv3', 1582276092038959104, '钉钉', 'DingTalk', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/dingtalk', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:03:44', 1414143554414059520, '2022-10-24 11:03:44', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584380527829524480, 'adminv3', 1584379602188574720, '消息模板', 'WechatTemplateList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/template/WechatTemplateList.vue', NULL, '/third/wechat/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:05:29', 1414143554414059520, '2022-10-26 15:58:56', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1584380679478779904, 'adminv3', 1584379602188574720, '自定义菜单', 'WechatMenuList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/menu/WechatMenuList.vue', NULL, '/third/wechat/menu', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:06:05', 1414143554414059520, '2022-10-27 10:15:24', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1584380824308097024, 'adminv3', 1584379602188574720, '素材管理', 'WechatMediaList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/media/WechatMediaList.vue', NULL, '/third/wechat/media', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:06:40', 1414143554414059520, '2022-10-27 16:38:47', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1584381134950834176, 'adminv3', 1584379704122744832, '企微机器人', 'WeComRobotConfigList', NULL, b'0', '', b'0', b'0', '/modules/third/wecom/robot/WecomRobotConfigList.vue', NULL, '/third/wecom/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:07:54', 1414143554414059520, '2022-11-12 20:58:25', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1584381322184564736, 'adminv3', 1584380087805091840, '钉钉机器人', 'DingRobotConfigList', NULL, b'0', '', b'0', b'0', '/modules/third/dingtalk/robot/DingRobotConfigList.vue', NULL, '/third/dingTalk/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:08:38', 1414143554414059520, '2022-11-12 20:58:37', 6, 0); +INSERT INTO `iam_perm_menu` VALUES (1584381477986181120, 'adminv3', 1584380087805091840, '钉钉配置', 'DingRobotConfigList', NULL, b'0', '', b'1', b'0', '/modules/third/dingtalk/config/DingTalkConfigList.vue', NULL, '/third/dingtalk/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:09:15', 1414143554414059520, '2022-11-11 16:04:47', 1, 1); +INSERT INTO `iam_perm_menu` VALUES (1597044371008516096, 'adminv3', NULL, '功能演示', 'Demo', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/demo', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 09:47:04', 1414143554414059520, '2022-11-28 09:47:04', 0, 1); +INSERT INTO `iam_perm_menu` VALUES (1597102799370317824, 'adminv3', 1582276516905177088, '数据相关', 'DemoData', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/demo/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 13:39:15', 1414143554414059520, '2022-11-28 13:39:15', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1597210969883275264, 'adminv3', 1582276516905177088, '超级查询', 'SuperQueryDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/query/SuperQueryDemoList.vue', NULL, '/demo/query/super', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 20:49:05', 1414143554414059520, '2022-11-28 21:00:14', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1599337250200440832, 'adminv3', NULL, '关于', '', NULL, b'0', 'simple-icons:about-dot-me', b'0', b'0', '', NULL, '/about/index', '', 99, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 17:38:09', 1414143554414059520, '2022-12-04 17:43:32', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1599378494880436224, 'adminv3', 1582276516905177088, 'WS演示', 'WebsocketDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/ws/WebsocketDemo', NULL, '/demo/ws', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:03', 1414143554414059520, '2023-02-08 12:17:58', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1599378579513102336, 'adminv3', 1582276516905177088, '幂等请求演示', 'IdempotentDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/idempotent/IdempotentDemo', NULL, '/demo/idempotent', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:23', 1414143554414059520, '2023-02-08 11:46:00', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1599378728490586112, 'adminv3', 1582276516905177088, '消息中间件演示', 'MqDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/mq/MqDemo', NULL, '/demo/mq', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:59', 1414143554414059520, '2023-02-08 22:09:04', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1599378838519762944, 'adminv3', 1582276516905177088, '富文本编辑', 'WangEditorDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/wangeditor/WangEditorDemo.vue', NULL, '/demo/wangEditor', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:23:25', 1414143554414059520, '2023-02-10 09:05:16', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1617847577158324224, 'adminv3', 1597102799370317824, '数据权限', 'DataPermDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/perm/DataPermDemoList.vue', NULL, '/demo/data/perm', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:31:35', 1414143554414059520, '2023-01-24 20:06:04', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1617847653746315264, 'adminv3', 1597102799370317824, '加密解密', 'DataEncryptDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/encrypt/DataEncryptDemoList.vue', NULL, '/demo/data/encrypt', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:31:53', 1414143554414059520, '2023-01-24 20:05:45', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1617847747375763456, 'adminv3', 1597102799370317824, '数据脱敏', 'DataSensitiveDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/sensitive/DataSensitiveDemoList.vue', NULL, '/demo/data/sensitive', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:32:16', 1414143554414059520, '2023-01-24 20:06:58', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1621150743447965696, 'admin', 1495968302034210816, '省市区联动', 'ChinaRegionDemo', NULL, b'0', '', b'0', b'0', 'demo/chinaregion/ChinaRegionDemo', NULL, '/demo/chinaregion', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-02-02 22:17:11', 1399985191002447872, '2023-02-08 09:43:39', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1623156857846034432, 'adminv3', 1582276516905177088, '省市区联动', 'ChinaRegionDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/chinaregion/ChinaRegionDemo', NULL, '/demo/chinaregion', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-08 11:08:46', 1414143554414059520, '2023-02-08 11:08:46', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1623325795944439808, 'adminv3', 1599378992811429888, '邮件通知', 'EmailSenderDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/notice/email/EmailSenderDemo.vue', NULL, '/demo/notice/email', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-08 22:20:04', 1414143554414059520, '2023-02-20 10:38:55', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1623494586215579648, 'admin', 1552207982510706688, '行政区划', 'ChinaRegion', NULL, b'0', '', b'1', b'0', 'develop/region/ChinaRegionList', NULL, '/develop/region', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-02-09 09:30:47', 1399985191002447872, '2023-02-09 17:50:05', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1629039360928075776, 'adminv3', 1582276341792985088, '可视化大屏', 'ProjectInfoList', NULL, b'0', '', b'0', b'0', '/modules/develop/report/ProjectInfoList', NULL, '/develop/report', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-24 16:43:44', 1414143554414059520, '2023-02-24 16:44:17', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1631946120891707392, 'admin', 1552207982510706688, '可视化大屏', 'ProjectInfoList', NULL, b'0', '', b'0', b'0', 'develop/report/ProjectInfoList', NULL, '/develop/report', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-03-04 17:14:10', 1399985191002447872, '2023-03-04 17:14:10', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1635274568758435840, 'adminv3', 1582276341792985088, '数据集管理', 'DataResultSqlList', NULL, b'0', '', b'0', b'0', '/modules/develop/dataresult/DataResultSqlList', NULL, '/develop/dataresult', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-03-13 21:40:14', 1414143554414059520, '2023-09-18 14:26:51', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1687369862646558720, 'adminv3', 1582275984849326080, '短信管理', 'Sms', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/notice/sms', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:48:20', 1414143554414059520, '2023-08-04 15:48:32', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1687370142234669056, 'adminv3', 1687369862646558720, '短信配置', 'SmsChannelConfigList', NULL, b'0', '', b'0', b'0', '/modules/notice/sms/config/SmsChannelConfigList', NULL, '/notice/sms/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:49:26', 1414143554414059520, '2023-08-04 15:49:26', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1687370277496778752, 'adminv3', 1687369862646558720, '短信模板', 'SmsTemplateList', NULL, b'0', '', b'0', b'0', '/modules/notice/sms/template/SmsTemplateList', NULL, '/notice/sms/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:49:59', 1414143554414059520, '2023-08-04 15:50:38', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1689181991598997504, 'adminv3', 1582253152903843840, '敏感词管理', 'ChinaWord', NULL, b'0', '', b'0', b'0', '/modules/baseapi/chianword/ChinaWordList.vue', NULL, '/system/config/chinaword', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-09 15:49:05', 1414143554414059520, '2023-08-09 15:49:05', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1690324070514782208, 'adminv3', 1582276341792985088, '通用模板', 'GeneralTemplateList', NULL, b'0', '', b'0', b'0', '/modules/develop/template/GeneralTemplateList', NULL, '/develop/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-12 19:27:18', 1414143554414059520, '2023-08-12 19:31:26', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1703665090038800384, 'adminv3', 1582276341792985088, '在线SQL', 'SqlQueryInfo', NULL, b'0', '', b'0', b'0', '/modules/develop/query/SqlQueryInfo', NULL, '/develop/sqlquery', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-09-18 14:59:45', 1414143554414059520, '2023-09-18 14:59:45', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1713931084759293952, 'adminv3', 1582253306356649984, '密码安全', 'PassowrdSecurity', NULL, b'0', '', b'0', b'0', '/modules/system/security/password/PasswordSecurityConfig.vue', NULL, '/system/config/passowrd', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-10-16 22:53:09', 1399985191002447872, '2023-10-16 22:58:59', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1719311626751950848, 'adminv3', 1582276516905177088, '大屏', '', NULL, b'0', '', b'0', b'0', 'Iframe', NULL, '/demo/big', 'http://localhost:8112/#/index', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-10-31 19:13:30', 1399985191002447872, '2023-11-15 11:11:26', 0, 1); +INSERT INTO `iam_perm_menu` VALUES (1733829906427682816, 'adminv3', 1582275875424129024, '在线用户', 'OnlineUserList', NULL, b'0', '', b'0', b'0', '/modules/monitor/user/online/OnlineUserList', NULL, '/monitor/user/online', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-12-10 20:43:57', 1399985191002447872, '2023-12-10 20:43:57', 0, 0); -- ---------------------------- --- Table structure for starter_ding_media_md5 +-- Table structure for iam_perm_path -- ---------------------------- -DROP TABLE IF EXISTS `starter_ding_media_md5`; -CREATE TABLE `starter_ding_media_md5` ( +DROP TABLE IF EXISTS `iam_perm_path`; +CREATE TABLE `iam_perm_path` ( `id` bigint(20) NOT NULL, - `media_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '媒体id', - `md5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'md5值', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `code` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限标识', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限名称', + `request_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求类型', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求路径', + `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分组名称', + `enable` bit(1) NOT NULL COMMENT '启用状态', + `generate` bit(1) NOT NULL COMMENT '是否通过系统生成的权限', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `creator` bigint(20) NULL DEFAULT NULL, + `create_time` datetime(6) NULL DEFAULT NULL, + `last_modifier` bigint(20) NULL DEFAULT NULL, + `last_modified_time` datetime(6) NULL DEFAULT NULL, + `deleted` bit(1) NOT NULL, + `version` int(11) NOT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '钉钉媒体文件MD5值关联关系' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限_请求' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_ding_media_md5 +-- Records of iam_perm_path -- ---------------------------- -- ---------------------------- --- Table structure for starter_audit_operate_log +-- Table structure for iam_role -- ---------------------------- -DROP TABLE IF EXISTS `starter_audit_operate_log`; -CREATE TABLE `starter_audit_operate_log` ( - `id` bigint(20) NOT NULL, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作模块', - `operate_id` bigint(20) NULL DEFAULT NULL COMMENT '操作人员id', - `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作人员账号', - `business_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '业务类型', - `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法', - `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方式', - `operate_url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求url', - `operate_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作ip', - `operate_location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作地点', - `operate_param` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求参数', - `operate_return` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '返回参数', - `success` bit(1) NULL DEFAULT NULL COMMENT '是否成功', - `error_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '错误提示', - `operate_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', +DROP TABLE IF EXISTS `iam_role`; +CREATE TABLE `iam_role` ( + `id` bigint(20) NOT NULL COMMENT '角色ID', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编码', + `pid` bigint(20) NULL DEFAULT NULL COMMENT '父ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `internal` bit(1) NOT NULL COMMENT '是否系统内置', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_audit_operate_log +-- Records of iam_role -- ---------------------------- +INSERT INTO `iam_role` VALUES (1405414804771971072, 'admin', NULL, '管理员', b'1', '管理员', 1, '2021-06-17 14:39:35', 1399985191002447872, '2021-07-18 22:31:02', 6, 0); +INSERT INTO `iam_role` VALUES (1416730722714144768, 'test', NULL, '测试', b'0', '测试角色', 1399985191002447872, '2021-07-18 20:05:01', 1399985191002447872, '2021-07-18 20:16:15', 1, 0); +INSERT INTO `iam_role` VALUES (1422832797731778562, 'user', NULL, '用户', b'0', '用户角色', 0, '2021-08-04 16:12:29', 1399985191002447872, '2021-08-04 16:15:03', 7, 0); +INSERT INTO `iam_role` VALUES (1428891259564445696, 'manager', NULL, '管理者', b'0', 'manager管理者', 1399985191002447872, '2021-08-21 09:26:38', 1399985191002447872, '2021-08-21 09:26:39', 0, 0); -- ---------------------------- --- Table structure for starter_audit_login_log +-- Table structure for iam_role_menu -- ---------------------------- -DROP TABLE IF EXISTS `starter_audit_login_log`; -CREATE TABLE `starter_audit_login_log` ( +DROP TABLE IF EXISTS `iam_role_menu`; +CREATE TABLE `iam_role_menu` ( `id` bigint(20) NOT NULL, - `user_id` bigint(11) NULL DEFAULT NULL COMMENT '用户id', - `account` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称', - `login` bit(1) NULL DEFAULT NULL COMMENT '登录成功状态', - `client` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '终端', - `login_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录方式', - `ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录IP地址', - `login_location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录地点', - `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作系统', - `browser` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '浏览器类型', - `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '提示消息', - `login_time` datetime(0) NULL DEFAULT NULL COMMENT '访问时间', + `role_id` bigint(20) NOT NULL COMMENT '角色id', + `client_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '终端code', + `permission_id` bigint(20) NOT NULL COMMENT '菜单权限id', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登陆日志' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色菜单权限表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_audit_login_log +-- Records of iam_role_menu -- ---------------------------- -- ---------------------------- --- Table structure for report_project_info_publish +-- Table structure for iam_role_path -- ---------------------------- -DROP TABLE IF EXISTS `report_project_info_publish`; -CREATE TABLE `report_project_info_publish` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表内容', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', +DROP TABLE IF EXISTS `iam_role_path`; +CREATE TABLE `iam_role_path` ( + `id` bigint(20) NOT NULL, + `role_id` bigint(20) NOT NULL COMMENT '角色id', + `permission_id` bigint(20) NOT NULL COMMENT '请求权限id', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '自定义大屏发布信息' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色请求权限表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of report_project_info_publish +-- Records of iam_role_path -- ---------------------------- -- ---------------------------- --- Table structure for report_project_info +-- Table structure for iam_user_data_role -- ---------------------------- -DROP TABLE IF EXISTS `report_project_info`; -CREATE TABLE `report_project_info` ( +DROP TABLE IF EXISTS `iam_user_data_role`; +CREATE TABLE `iam_user_data_role` ( `id` bigint(20) NOT NULL COMMENT '主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '项目名称', - `state` int(11) NULL DEFAULT NULL COMMENT '发布状态', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表内容', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', - `index_image` bigint(20) NULL DEFAULT NULL COMMENT '预览图片id', - `edit` bit(1) 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 = '自定义大屏信息' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户数据范围关系\r\n' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of report_project_info +-- Records of iam_user_data_role -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_triggers +-- Table structure for iam_user_dept -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_triggers`; -CREATE TABLE `qrtz_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `NEXT_FIRE_TIME` bigint(13) NULL DEFAULT NULL, - `PREV_FIRE_TIME` bigint(13) NULL DEFAULT NULL, - `PRIORITY` int(11) NULL DEFAULT NULL, - `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `START_TIME` bigint(13) NOT NULL, - `END_TIME` bigint(13) NULL DEFAULT NULL, - `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `MISFIRE_INSTR` smallint(2) NULL DEFAULT NULL, - `JOB_DATA` blob NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME`, `TRIGGER_STATE`, `NEXT_FIRE_TIME`) USING BTREE, - INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, - INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME`, `NEXT_FIRE_TIME`) USING BTREE, - INDEX `IDX_QRTZ_T_C`(`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE, - INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_STATE`) USING BTREE, - INDEX `IDX_QRTZ_T_G`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_T_J`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, - INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`) USING BTREE, - INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME`, `TRIGGER_STATE`) USING BTREE, - INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, - CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_dept`; +CREATE TABLE `iam_user_dept` ( + `id` bigint(20) NOT NULL, + `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 = utf8 COLLATE = utf8_general_ci COMMENT = '用户部门关联表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_triggers +-- Records of iam_user_dept -- ---------------------------- --- ---------------------------- --- Table structure for qrtz_simprop_triggers --- ---------------------------- -DROP TABLE IF EXISTS `qrtz_simprop_triggers`; -CREATE TABLE `qrtz_simprop_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `INT_PROP_1` int(11) NULL DEFAULT NULL, - `INT_PROP_2` int(11) NULL DEFAULT NULL, - `LONG_PROP_1` bigint(20) NULL DEFAULT NULL, - `LONG_PROP_2` bigint(20) NULL DEFAULT NULL, - `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, - `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, - `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Table structure for iam_user_expand_info +-- ---------------------------- +DROP TABLE IF EXISTS `iam_user_expand_info`; +CREATE TABLE `iam_user_expand_info` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `sex` int(4) NULL DEFAULT NULL COMMENT '性别', + `birthday` date NULL DEFAULT NULL COMMENT '生日', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像', + `last_login_time` datetime NULL DEFAULT NULL COMMENT '上次登录时间', + `current_login_time` datetime NULL DEFAULT NULL COMMENT '本次登录时间', + `initial_password` bit(1) NOT NULL COMMENT '是否初始密码', + `expire_password` bit(1) NOT NULL COMMENT '密码是否过期', + `last_change_password_time` datetime NULL DEFAULT NULL COMMENT '上次修改密码时间', + `register_time` datetime NOT NULL COMMENT '注册时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户扩展信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_simprop_triggers +-- Records of iam_user_expand_info -- ---------------------------- +INSERT INTO `iam_user_expand_info` VALUES (1399985191002447872, 1, '1996-12-01', NULL, '2023-10-19 19:21:46', '2023-10-20 09:31:26', b'0', b'0', '2023-10-19 14:14:08', '2021-08-01 18:52:37', 1, '2021-06-02 15:04:15', 1, '2023-10-20 09:31:26', 382, b'0'); -- ---------------------------- --- Table structure for qrtz_simple_triggers +-- Table structure for iam_user_info -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_simple_triggers`; -CREATE TABLE `qrtz_simple_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `REPEAT_COUNT` bigint(7) NOT NULL, - `REPEAT_INTERVAL` bigint(12) NOT NULL, - `TIMES_TRIGGERED` bigint(10) NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_info`; +CREATE TABLE `iam_user_info` ( + `id` bigint(20) NOT NULL, + `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码', + `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '手机号', + `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱', + `client_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '关联终端ds', + `administrator` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否超级管理员', + `status` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号状态', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_simple_triggers +-- Records of iam_user_info -- ---------------------------- +INSERT INTO `iam_user_info` VALUES (1399985191002447872, 'Bootx', 'bootx', 'f52020dca765fd3943ed40a615dc2c5c', '13333333333', 'bootx@bootx.com', '1430430071299207168,1430430071299207169,1626840094767714304,1580487061605175296', b'1', 'norm', 1, '2021-06-02 15:04:15', 1399985191002447872, '2023-10-19 14:14:46', 58, 0); -- ---------------------------- --- Table structure for qrtz_scheduler_state +-- Table structure for iam_user_role -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_scheduler_state`; -CREATE TABLE `qrtz_scheduler_state` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `LAST_CHECKIN_TIME` bigint(13) NOT NULL, - `CHECKIN_INTERVAL` bigint(13) NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_role`; +CREATE TABLE `iam_user_role` ( + `id` bigint(20) NOT 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_unicode_ci COMMENT = '用户角色关系\r\n' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_scheduler_state +-- Records of iam_user_role -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_paused_trigger_grps +-- Table structure for iam_user_third -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; -CREATE TABLE `qrtz_paused_trigger_grps` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_third`; +CREATE TABLE `iam_user_third` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', + `we_chat_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信openId', + `we_chat_open_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信开放平台id', + `qq_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'qqId', + `weibo_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微博Id', + `gitee_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '码云唯一标识', + `ding_talk_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉唯一标识', + `we_com_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业微信唯一标识', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE, + INDEX `pk_user_index`(`user_id`) USING BTREE COMMENT '用户id索引' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户三方登录绑定' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_paused_trigger_grps +-- Records of iam_user_third -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_locks +-- Table structure for iam_user_third_info -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_locks`; -CREATE TABLE `qrtz_locks` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_third_info`; +CREATE TABLE `iam_user_third_info` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `user_id` bigint(20) NOT NULL COMMENT '用户id', + `client_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '第三方终端类型', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户昵称', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户头像', + `third_user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '关联第三方平台的用户id', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + PRIMARY KEY (`id`) USING BTREE, + INDEX `pk_user_client`(`user_id`, `client_code`) USING BTREE COMMENT '用户id和终端code' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户三方登录绑定详情' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_locks +-- Records of iam_user_third_info -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_job_details +-- Table structure for notice_mail_config -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_job_details`; -CREATE TABLE `qrtz_job_details` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_DATA` blob NULL, - PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME`, `REQUESTS_RECOVERY`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_mail_config`; +CREATE TABLE `notice_mail_config` ( + `id` bigint(20) NOT NULL, + `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编号', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器host', + `port` int(5) NOT NULL COMMENT '邮箱服务器 port', + `username` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器 username', + `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器 password', + `sender` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱服务器 sender', + `from_` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱服务器 from', + `activity` tinyint(1) NULL DEFAULT 0 COMMENT '是否默认配置,0:否。1:是', + `security_type` int(2) NULL DEFAULT NULL COMMENT '安全传输方式 1:plain 2:tls 3:ssl', + `creator` bigint(18) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(18) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(8) NULL DEFAULT NULL COMMENT '版本', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮件配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_job_details +-- Records of notice_mail_config -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_fired_triggers +-- Table structure for notice_message_template -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_fired_triggers`; -CREATE TABLE `qrtz_fired_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `FIRED_TIME` bigint(13) NOT NULL, - `SCHED_TIME` bigint(13) NOT NULL, - `PRIORITY` int(11) NOT NULL, - `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE, - INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE, - INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME`, `INSTANCE_NAME`, `REQUESTS_RECOVERY`) USING BTREE, - INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_message_template`; +CREATE TABLE `notice_message_template` ( + `id` bigint(20) NOT NULL, + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模板数据', + `type` varchar(50) 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 '备注', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息模板' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_fired_triggers +-- Records of notice_message_template -- ---------------------------- +INSERT INTO `notice_message_template` VALUES (1424936204932169730, 'cs', '测试', 'hello ${msg}6666666666666666666666666666', '1', '测试模板', 0, '2021-08-10 11:30:40', 0, '2021-08-10 11:30:40', 0, 0); -- ---------------------------- --- Table structure for qrtz_cron_triggers +-- Table structure for notice_site_message -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_cron_triggers`; -CREATE TABLE `qrtz_cron_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_site_message`; +CREATE TABLE `notice_site_message` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息标题', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '消息内容', + `sender_id` bigint(20) NULL DEFAULT NULL COMMENT '发送者id', + `sender_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送者姓名', + `sender_time` datetime NULL DEFAULT NULL COMMENT '发送时间', + `receive_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息类型', + `send_state` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发布状态', + `efficient_time` datetime NULL DEFAULT NULL COMMENT '截至有效期', + `cancel_time` datetime NULL DEFAULT NULL COMMENT '撤回时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '站内信' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_cron_triggers +-- Records of notice_site_message -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_calendars +-- Table structure for notice_site_message_user -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_calendars`; -CREATE TABLE `qrtz_calendars` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `CALENDAR` blob NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_site_message_user`; +CREATE TABLE `notice_site_message_user` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `message_id` bigint(20) NOT NULL COMMENT '消息id', + `receive_id` bigint(20) NOT NULL COMMENT '接收者id', + `have_read` bit(1) NOT NULL COMMENT '已读/未读', + `read_time` datetime NULL DEFAULT NULL COMMENT '已读时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uni_receive_message`(`receive_id`, `message_id`) USING BTREE COMMENT '接收人和消息联合索引', + INDEX `inx_message`(`message_id`) USING BTREE COMMENT '消息索引' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '消息用户关联' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_calendars +-- Records of notice_site_message_user -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_blob_triggers +-- Table structure for notice_sms_channel_config -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_blob_triggers`; -CREATE TABLE `qrtz_blob_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `BLOB_DATA` blob NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `SCHED_NAME`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_sms_channel_config`; +CREATE TABLE `notice_sms_channel_config` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道类型编码', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道类型名称', + `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态', + `access_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AccessKey', + `config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '配置字符串', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `access_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AccessSecret', + `image` bigint(20) NULL DEFAULT NULL COMMENT '图片', + `sort_no` double(10, 0) NULL DEFAULT NULL COMMENT '排序', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '短信渠道配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_blob_triggers +-- Records of notice_sms_channel_config -- ---------------------------- +INSERT INTO `notice_sms_channel_config` VALUES (1688432603289337856, 'alibaba', '阿里云短信', 'normal', '1', '{\"accessKeyId\":\"1231231231232111\",\"accessKeySecret\":\"12312312321111\",\"signature\":\"1231\",\"templateId\":\"2312313\",\"templateName\":\"123\",\"requestUrl\":\"五千二无二\",\"action\":\"SendSms\",\"version\":\"11\",\"regionId\":\"cn-hangzhou\"}', NULL, '1', 1688450284000247808, 0, 1414143554414059520, '2023-08-07 14:11:17', 1414143554414059520, '2023-08-07 15:35:34', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688456604610953216, 'huawei', '华为云短信', 'normal', '1', '{\"appKey\":\"1231231231232\",\"appSecret\":\"1111\",\"signature\":\"1\",\"sender\":\"1\",\"templateId\":\"12\",\"statusCallBack\":\"1\",\"url\":\"1\"}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-07 15:46:39', 1414143554414059520, '2023-08-07 15:46:49', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688461302302732288, 'yunpian', '云片短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"callbackUrl\":null,\"templateName\":null}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-07 16:05:19', 1414143554414059520, '2023-08-08 14:12:23', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788784751001600, 'tencent', '腾讯短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"sdkAppId\":null,\"territory\":\"ap-guangzhou\",\"connTimeout\":60,\"requestUrl\":\"sms.tencentcloudapi.com\",\"action\":\"SendSms\",\"version\":\"2021-01-11\",\"service\":\"sms\"}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:46:37', 1414143554414059520, '2023-08-08 13:46:37', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788807228276736, 'uni_sms', '合一短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"isSimple\":true,\"templateName\":null}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:46:42', 1414143554414059520, '2023-08-08 13:46:43', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788823900635136, 'netease', '网易云短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"templateName\":null,\"templateUrl\":\"https://api.netease.im/sms/sendtemplate.action\",\"codeUrl\":\"https://api.netease.im/sms/sendcode.action\",\"verifyUrl\":\"https://api.netease.im/sms/verifycode.action\",\"needUp\":null}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:46:46', 1414143554414059520, '2023-08-08 13:46:47', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788846944141312, 'ctyun', '天翼云短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"templateName\":null,\"requestUrl\":\"https://sms-global.ctapi.ctyun.cn/sms/api/v1\",\"action\":\"SendSms\"}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:46:52', 1414143554414059520, '2023-08-08 13:46:52', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788862987354112, 'emay', '亿美短信', 'normal', '1', '{\"appId\":\"1\",\"secretKey\":\"1\",\"requestUrl\":null}', NULL, '1', 1688792913003102208, 0, 1414143554414059520, '2023-08-08 13:46:56', 1414143554414059520, '2023-08-08 14:03:04', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788885141667840, 'cloopen', '容联短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"appId\":null,\"baseUrl\":\"https://app.cloopen.com:8883/2013-12-26\",\"serverIp\":null,\"serverPort\":null}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:47:01', 1414143554414059520, '2023-08-08 13:47:01', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788904481603584, 'jd_cloud', '京东短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"region\":\"cn-north-1\"}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:47:06', 1414143554414059520, '2023-08-08 13:47:06', 0, b'0'); -- ---------------------------- --- Table structure for notice_wechat_config +-- Table structure for notice_sms_config -- ---------------------------- -DROP TABLE IF EXISTS `notice_wechat_config`; -CREATE TABLE `notice_wechat_config` ( +DROP TABLE IF EXISTS `notice_sms_config`; +CREATE TABLE `notice_sms_config` ( `id` bigint(18) NOT NULL, `tid` bigint(18) NOT NULL COMMENT '租户id', `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `corp_id` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `corp_secret` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `account_sid` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `path_sid` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送号码的唯一标识(基于twillio的命名风格)', + `auth_token` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `from_num` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `is_default` tinyint(1) NULL DEFAULT 0 COMMENT '是否默认配置,0:否。1:是', `creator` bigint(18) NULL DEFAULT NULL, - `create_time` datetime(0) NULL DEFAULT NULL, + `create_time` datetime NULL DEFAULT NULL, `last_modifier` bigint(18) NULL DEFAULT NULL, - `last_modified_time` datetime(0) NULL DEFAULT NULL, + `last_modified_time` datetime NULL DEFAULT NULL, `version` int(10) NULL DEFAULT NULL, `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `secret` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `isp` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `reply_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '微信消息配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_wechat_config +-- Records of notice_sms_config -- ---------------------------- -- ---------------------------- @@ -4842,9 +4725,9 @@ CREATE TABLE `notice_sms_template` ( `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '短信模板名称', `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '短信模板内容', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE @@ -4855,546 +4738,623 @@ CREATE TABLE `notice_sms_template` ( -- ---------------------------- -- ---------------------------- --- Table structure for notice_sms_config +-- Table structure for notice_wechat_config -- ---------------------------- -DROP TABLE IF EXISTS `notice_sms_config`; -CREATE TABLE `notice_sms_config` ( +DROP TABLE IF EXISTS `notice_wechat_config`; +CREATE TABLE `notice_wechat_config` ( `id` bigint(18) NOT NULL, `tid` bigint(18) NOT NULL COMMENT '租户id', `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `account_sid` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `path_sid` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送号码的唯一标识(基于twillio的命名风格)', - `auth_token` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `from_num` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `corp_id` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `corp_secret` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `is_default` tinyint(1) NULL DEFAULT 0 COMMENT '是否默认配置,0:否。1:是', `creator` bigint(18) NULL DEFAULT NULL, - `create_time` datetime(0) NULL DEFAULT NULL, + `create_time` datetime NULL DEFAULT NULL, `last_modifier` bigint(18) NULL DEFAULT NULL, - `last_modified_time` datetime(0) NULL DEFAULT NULL, + `last_modified_time` datetime NULL DEFAULT NULL, `version` int(10) NULL DEFAULT NULL, `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `secret` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `isp` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `reply_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信配置' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of notice_sms_config --- ---------------------------- - --- ---------------------------- --- Table structure for notice_sms_channel_config --- ---------------------------- -DROP TABLE IF EXISTS `notice_sms_channel_config`; -CREATE TABLE `notice_sms_channel_config` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道类型编码', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道类型名称', - `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态', - `access_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AccessKey', - `config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '配置字符串', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - `access_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AccessSecret', - `image` bigint(20) NULL DEFAULT NULL COMMENT '图片', - `sort_no` double(10, 0) NULL DEFAULT NULL COMMENT '排序', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '短信渠道配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '微信消息配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_sms_channel_config +-- Records of notice_wechat_config -- ---------------------------- -- ---------------------------- --- Table structure for notice_site_message_user +-- Table structure for qrtz_blob_triggers -- ---------------------------- -DROP TABLE IF EXISTS `notice_site_message_user`; -CREATE TABLE `notice_site_message_user` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `message_id` bigint(20) NOT NULL COMMENT '消息id', - `receive_id` bigint(20) NOT NULL COMMENT '接收者id', - `have_read` bit(1) NOT NULL COMMENT '已读/未读', - `read_time` datetime(0) NULL DEFAULT NULL COMMENT '已读时间', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uni_receive_message`(`receive_id`, `message_id`) USING BTREE COMMENT '接收人和消息联合索引', - INDEX `inx_message`(`message_id`) USING BTREE COMMENT '消息索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '消息用户关联' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `BLOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `SCHED_NAME`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_site_message_user +-- Records of qrtz_blob_triggers -- ---------------------------- -- ---------------------------- --- Table structure for notice_site_message +-- Table structure for qrtz_calendars -- ---------------------------- -DROP TABLE IF EXISTS `notice_site_message`; -CREATE TABLE `notice_site_message` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息标题', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '消息内容', - `sender_id` bigint(20) NULL DEFAULT NULL COMMENT '发送者id', - `sender_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送者姓名', - `sender_time` datetime(0) NULL DEFAULT NULL COMMENT '发送时间', - `receive_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息类型', - `send_state` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发布状态', - `efficient_time` datetime(0) NULL DEFAULT NULL COMMENT '截至有效期', - `cancel_time` datetime(0) NULL DEFAULT NULL COMMENT '撤回时间', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '站内信' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_site_message +-- Records of qrtz_calendars -- ---------------------------- -- ---------------------------- --- Table structure for notice_mail_config +-- Table structure for qrtz_cron_triggers -- ---------------------------- -DROP TABLE IF EXISTS `notice_mail_config`; -CREATE TABLE `notice_mail_config` ( - `id` bigint(20) NOT NULL, - `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编号', - `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器host', - `port` int(5) NOT NULL COMMENT '邮箱服务器 port', - `username` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器 username', - `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器 password', - `sender` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱服务器 sender', - `from_` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱服务器 from', - `activity` tinyint(1) NULL DEFAULT 0 COMMENT '是否默认配置,0:否。1:是', - `security_type` int(2) NULL DEFAULT NULL COMMENT '安全传输方式 1:plain 2:tls 3:ssl', - `creator` bigint(18) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(18) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(8) NULL DEFAULT NULL COMMENT '版本', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮件配置' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_mail_config +-- Records of qrtz_cron_triggers -- ---------------------------- -- ---------------------------- --- Table structure for iam_user_third_info +-- Table structure for qrtz_fired_triggers -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_third_info`; -CREATE TABLE `iam_user_third_info` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NOT NULL COMMENT '用户id', - `client_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '第三方终端类型', - `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', - `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户昵称', - `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户头像', - `third_user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '关联第三方平台的用户id', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - PRIMARY KEY (`id`) USING BTREE, - INDEX `pk_user_client`(`user_id`, `client_code`) USING BTREE COMMENT '用户id和终端code' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户三方登录绑定详情' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FIRED_TIME` bigint(13) NOT NULL, + `SCHED_TIME` bigint(13) NOT NULL, + `PRIORITY` int(11) NOT NULL, + `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE, + INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE, + INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME`, `INSTANCE_NAME`, `REQUESTS_RECOVERY`) USING BTREE, + INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_third_info +-- Records of qrtz_fired_triggers -- ---------------------------- -- ---------------------------- --- Table structure for iam_user_third +-- Table structure for qrtz_job_details -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_third`; -CREATE TABLE `iam_user_third` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', - `we_chat_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信openId', - `we_chat_open_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信开放平台id', - `qq_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'qqId', - `weibo_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微博Id', - `gitee_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '码云唯一标识', - `ding_talk_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉唯一标识', - `we_com_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业微信唯一标识', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE, - INDEX `pk_user_index`(`user_id`) USING BTREE COMMENT '用户id索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户三方登录绑定' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME`, `REQUESTS_RECOVERY`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_third +-- Records of qrtz_job_details -- ---------------------------- -- ---------------------------- --- Table structure for iam_user_role +-- Table structure for qrtz_locks -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_role`; -CREATE TABLE `iam_user_role` ( - `id` bigint(20) NOT 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_unicode_ci COMMENT = '用户角色关系\r\n' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_role +-- Records of qrtz_locks -- ---------------------------- -- ---------------------------- --- Table structure for iam_user_data_scope +-- Table structure for qrtz_paused_trigger_grps -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_data_scope`; -CREATE TABLE `iam_user_data_scope` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NOT NULL COMMENT '用户ID', - `data_scope_id` bigint(20) NOT NULL COMMENT '数据权限ID', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户数据范围关系\r\n' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_data_scope +-- Records of qrtz_paused_trigger_grps -- ---------------------------- -- ---------------------------- --- Table structure for iam_role_path +-- Table structure for qrtz_scheduler_state -- ---------------------------- -DROP TABLE IF EXISTS `iam_role_path`; -CREATE TABLE `iam_role_path` ( - `id` bigint(20) NOT NULL, - `role_id` bigint(20) NOT NULL COMMENT '角色id', - `permission_id` bigint(20) NOT NULL COMMENT '请求权限id', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色请求权限表' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `LAST_CHECKIN_TIME` bigint(13) NOT NULL, + `CHECKIN_INTERVAL` bigint(13) NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_role_path +-- Records of qrtz_scheduler_state -- ---------------------------- -- ---------------------------- --- Table structure for iam_role_menu +-- Table structure for qrtz_simple_triggers -- ---------------------------- -DROP TABLE IF EXISTS `iam_role_menu`; -CREATE TABLE `iam_role_menu` ( - `id` bigint(20) NOT NULL, - `role_id` bigint(20) NOT NULL COMMENT '角色id', - `client_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '终端code', - `permission_id` bigint(20) NOT NULL COMMENT '菜单权限id', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色菜单权限表' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REPEAT_COUNT` bigint(7) NOT NULL, + `REPEAT_INTERVAL` bigint(12) NOT NULL, + `TIMES_TRIGGERED` bigint(10) NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_role_menu +-- Records of qrtz_simple_triggers -- ---------------------------- -- ---------------------------- --- Table structure for iam_perm_path +-- Table structure for qrtz_simprop_triggers -- ---------------------------- -DROP TABLE IF EXISTS `iam_perm_path`; -CREATE TABLE `iam_perm_path` ( - `id` bigint(20) NOT NULL, - `code` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限标识', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限名称', - `request_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求类型', - `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求路径', - `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分组名称', - `enable` bit(1) NOT NULL COMMENT '启用状态', - `generate` bit(1) NOT NULL COMMENT '是否通过系统生成的权限', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', - `creator` bigint(20) NULL DEFAULT NULL, - `create_time` datetime(6) NULL DEFAULT NULL, - `last_modifier` bigint(20) NULL DEFAULT NULL, - `last_modified_time` datetime(6) NULL DEFAULT NULL, - `deleted` bit(1) NOT NULL, - `version` int(11) NOT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限_请求' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `INT_PROP_1` int(11) NULL DEFAULT NULL, + `INT_PROP_2` int(11) NULL DEFAULT NULL, + `LONG_PROP_1` bigint(20) NULL DEFAULT NULL, + `LONG_PROP_2` bigint(20) NULL DEFAULT NULL, + `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, + `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, + `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_perm_path +-- Records of qrtz_simprop_triggers -- ---------------------------- -- ---------------------------- --- Table structure for iam_password_login_fail_record +-- Table structure for qrtz_triggers -- ---------------------------- -DROP TABLE IF EXISTS `iam_password_login_fail_record`; -CREATE TABLE `iam_password_login_fail_record` ( +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `NEXT_FIRE_TIME` bigint(13) NULL DEFAULT NULL, + `PREV_FIRE_TIME` bigint(13) NULL DEFAULT NULL, + `PRIORITY` int(11) NULL DEFAULT NULL, + `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `START_TIME` bigint(13) NOT NULL, + `END_TIME` bigint(13) NULL DEFAULT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `MISFIRE_INSTR` smallint(2) NULL DEFAULT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME`, `TRIGGER_STATE`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_C`(`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_G`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_J`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for report_project_info +-- ---------------------------- +DROP TABLE IF EXISTS `report_project_info`; +CREATE TABLE `report_project_info` ( `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', - `fail_count` int(11) NULL DEFAULT NULL COMMENT '登录失败次数', - `fail_time` datetime(0) NULL DEFAULT NULL COMMENT '登录失败时间', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '项目名称', + `state` int(11) NULL DEFAULT NULL COMMENT '发布状态', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表内容', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', + `index_image` bigint(20) NULL DEFAULT NULL COMMENT '预览图片id', + `edit` bit(1) NULL DEFAULT NULL COMMENT '是否在编辑中', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码登录失败记录' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '自定义大屏信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_password_login_fail_record +-- Records of report_project_info -- ---------------------------- -- ---------------------------- --- Table structure for iam_password_change_history +-- Table structure for report_project_info_publish -- ---------------------------- -DROP TABLE IF EXISTS `iam_password_change_history`; -CREATE TABLE `iam_password_change_history` ( +DROP TABLE IF EXISTS `report_project_info_publish`; +CREATE TABLE `report_project_info_publish` ( `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户Id', - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表内容', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码更改历史,' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '自定义大屏发布信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_password_change_history +-- Records of report_project_info_publish -- ---------------------------- -- ---------------------------- --- Table structure for iam_login_security_config +-- Table structure for starter_audit_data_version -- ---------------------------- -DROP TABLE IF EXISTS `iam_login_security_config`; -CREATE TABLE `iam_login_security_config` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `client_id` bigint(20) NULL DEFAULT NULL COMMENT '关联终端ID', - `require_login_change_pwd` bit(1) NULL DEFAULT NULL COMMENT '修改密码是否需要重新登录', - `captcha_enable` bit(1) NULL DEFAULT NULL COMMENT '默认启用验证码', - `max_captcha_error_count` int(11) NULL DEFAULT NULL COMMENT '出现验证码的错误次数', - `allow_multi_login` bit(1) NULL DEFAULT NULL COMMENT '同端是否允许同时登录', - `allow_multi_terminal_login` bit(1) NULL DEFAULT NULL COMMENT '多终端是否允许同时登录', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', +DROP TABLE IF EXISTS `starter_audit_data_version`; +CREATE TABLE `starter_audit_data_version` ( + `id` bigint(20) NOT NULL, + `table_name` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据表名称', + `data_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据名称', + `data_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据主键', + `data_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '数据内容', + `change_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '数据更新内容', + `version` int(10) NOT NULL COMMENT '版本', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据版本日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of starter_audit_data_version +-- ---------------------------- +INSERT INTO `starter_audit_data_version` VALUES (1480550993828446208, '', 'client', '1', '{\"dataName\":\"client\",\"dataId\":\"1\",\"dataContent\":{\"id\":\"1\",\"creator\":null,\"createTime\":\"2022-01-10 22:43:58\",\"lastModifier\":null,\"lastModifiedTime\":null,\"deleted\":false,\"version\":0,\"code\":null,\"name\":null,\"timeout\":null,\"captcha\":false,\"enable\":false,\"description\":null}}', NULL, 1, 0, '2022-01-10 22:43:59'); +INSERT INTO `starter_audit_data_version` VALUES (1480551021779288064, '', 'client', '1', '{\"dataName\":\"client\",\"dataId\":\"1\",\"dataContent\":{\"id\":\"1\",\"creator\":null,\"createTime\":\"2022-01-10 22:44:05\",\"lastModifier\":null,\"lastModifiedTime\":null,\"deleted\":false,\"version\":0,\"code\":null,\"name\":null,\"timeout\":null,\"captcha\":false,\"enable\":false,\"description\":null}}', NULL, 2, 0, '2022-01-10 22:44:06'); + +-- ---------------------------- +-- Table structure for starter_audit_login_log +-- ---------------------------- +DROP TABLE IF EXISTS `starter_audit_login_log`; +CREATE TABLE `starter_audit_login_log` ( + `id` bigint(20) NOT NULL, + `user_id` bigint(11) NULL DEFAULT NULL COMMENT '用户id', + `account` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称', + `login` bit(1) NULL DEFAULT NULL COMMENT '登录成功状态', + `client` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '终端', + `login_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录方式', + `ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录IP地址', + `login_location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录地点', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作系统', + `browser` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '浏览器类型', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '提示消息', + `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登陆日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of starter_audit_login_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for starter_audit_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS `starter_audit_operate_log`; +CREATE TABLE `starter_audit_operate_log` ( + `id` bigint(20) NOT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作模块', + `operate_id` bigint(20) NULL DEFAULT NULL COMMENT '操作人员id', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作人员账号', + `business_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '业务类型', + `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法', + `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方式', + `operate_url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求url', + `operate_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作ip', + `operate_location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作地点', + `operate_param` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求参数', + `operate_return` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '返回参数', + `success` bit(1) NULL DEFAULT NULL COMMENT '是否成功', + `error_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '错误提示', + `operate_time` datetime NULL DEFAULT NULL COMMENT '操作时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '登录安全策略' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_login_security_config +-- Records of starter_audit_operate_log -- ---------------------------- -- ---------------------------- --- Table structure for iam_data_scope_user +-- Table structure for starter_ding_media_md5 -- ---------------------------- -DROP TABLE IF EXISTS `iam_data_scope_user`; -CREATE TABLE `iam_data_scope_user` ( +DROP TABLE IF EXISTS `starter_ding_media_md5`; +CREATE TABLE `starter_ding_media_md5` ( `id` bigint(20) NOT NULL, - `data_scope_id` bigint(20) NOT NULL COMMENT '数据范围id', - `user_id` bigint(20) NOT NULL COMMENT '用户id', + `media_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '媒体id', + `md5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'md5值', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据范围用户关联配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '钉钉媒体文件MD5值关联关系' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_data_scope_user +-- Records of starter_ding_media_md5 -- ---------------------------- -- ---------------------------- --- Table structure for base_village +-- Table structure for starter_ding_robot_config -- ---------------------------- -DROP TABLE IF EXISTS `base_village`; -CREATE TABLE `base_village` ( - `code` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '编码', - `name` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '名称', - `street_code` char(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '社区/乡镇编码', - PRIMARY KEY (`code`) USING BTREE, - INDEX `inx_street_code`(`street_code`) USING BTREE COMMENT '所属街道索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '村庄/社区' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `starter_ding_robot_config`; +CREATE TABLE `starter_ding_robot_config` ( + `id` bigint(20) NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', + `access_token` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉机器人访问token', + `enable_signature_check` bit(1) NOT NULL COMMENT '是否开启验签', + `sign_secret` 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 '备注', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime(6) NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` bit(1) NOT NULL COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '钉钉机器人配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_village +-- Records of starter_ding_robot_config -- ---------------------------- -- ---------------------------- --- Table structure for base_street +-- Table structure for starter_file_data -- ---------------------------- -DROP TABLE IF EXISTS `base_street`; -CREATE TABLE `base_street` ( - `code` char(9) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编码', - `name` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '街道名称', - `area_code` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '县区编码', - PRIMARY KEY (`code`) USING BTREE, - INDEX `inx_area_code`(`area_code`) USING BTREE COMMENT '县区' -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '街道表' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `starter_file_data`; +CREATE TABLE `starter_file_data` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `base64` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'base64方式存储', + `data` longblob NULL COMMENT '数据方式存储', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '上传文件数据' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_street +-- Records of starter_file_data -- ---------------------------- -- ---------------------------- --- Table structure for base_query_sql +-- Table structure for starter_file_upload_info -- ---------------------------- -DROP TABLE IF EXISTS `base_query_sql`; -CREATE TABLE `base_query_sql` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `database_id` bigint(20) NULL DEFAULT NULL COMMENT '数据源ID', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称', - `is_list` bit(1) NULL DEFAULT NULL COMMENT '是否集合', - `sql` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'sql语句', - `params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'SQL查询参数', - `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'SQL查询结果字段', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', +DROP TABLE IF EXISTS `starter_file_upload_info`; +CREATE TABLE `starter_file_upload_info` ( + `id` bigint(20) NOT NULL COMMENT '文件id', + `url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件访问地址', + `size` bigint(20) NULL DEFAULT NULL COMMENT '文件大小,单位字节', + `filename` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称', + `original_filename` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '原始文件名', + `base_path` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '基础存储路径', + `path` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '存储路径', + `ext` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件扩展名', + `content_type` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'MIME类型', + `platform` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '存储平台', + `th_url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩略图访问路径', + `th_filename` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩略图名称', + `th_size` bigint(20) NULL DEFAULT NULL COMMENT '缩略图大小,单位字节', + `th_content_type` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩略图MIME类型', + `object_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件所属对象id', + `object_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件所属对象类型,例如用户头像,评价图片', + `metadata` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '文件元数据', + `user_metadata` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '文件用户元数据', + `th_metadata` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缩略图元数据', + `th_user_metadata` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缩略图用户元数据', + `attr` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '附加属性', + `file_acl` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件ACL', + `th_file_acl` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩略图文件ACL', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'SQL查询语句' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '文件记录表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_query_sql +-- Records of starter_file_upload_info -- ---------------------------- -- ---------------------------- --- Table structure for base_key_value +-- Table structure for starter_quartz_job -- ---------------------------- -DROP TABLE IF EXISTS `base_key_value`; -CREATE TABLE `base_key_value` ( - `id` bigint(20) NOT NULL, - `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数键名', - `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数值', +DROP TABLE IF EXISTS `starter_quartz_job`; +CREATE TABLE `starter_quartz_job` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务名称', + `job_class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务类名', + `cron` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'cron表达式', + `parameter` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数', + `state` int(4) NULL DEFAULT NULL COMMENT '状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'kv存储' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_key_value +-- Records of starter_quartz_job -- ---------------------------- +INSERT INTO `starter_quartz_job` VALUES (1456579473573867520, '测试任务', 'cn.bootx.starter.quartz.task.TestTask', '50 0 * * * ? *', '{\"aaa\":\"5255\"}', 0, '测试任务', 1399985191002447872, '2021-11-05 19:09:43', 1399985191002447872, '2022-06-22 00:37:48', 25, 0); +INSERT INTO `starter_quartz_job` VALUES (1546857070483939328, '支付单超时检测', 'cn.bootx.payment.task.PayExpiredTimeTask', '0/5 * * * * ? *', NULL, 1, '检测超时的支付单, 超时后发送超时事件', 1399985191002447872, '2022-07-12 22:00:39', 1399985191002447872, '2022-07-12 22:00:45', 1, 0); -- ---------------------------- --- Table structure for base_general_template +-- Table structure for starter_quartz_job_log -- ---------------------------- -DROP TABLE IF EXISTS `base_general_template`; -CREATE TABLE `base_general_template` ( +DROP TABLE IF EXISTS `starter_quartz_job_log`; +CREATE TABLE `starter_quartz_job_log` ( `id` bigint(20) NOT NULL COMMENT '主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板名称', - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板代码', - `use_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '使用类型(导入/导出)', - `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板类型', - `file_suffix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板后缀名', - `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '状态', - `file_id` bigint(20) NULL DEFAULT NULL COMMENT '文件ID', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', + `handler_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理器名称', + `class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理器全限定名', + `success` bit(1) NOT NULL COMMENT '是否执行成功', + `error_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误信息', + `start_time` datetime NULL DEFAULT NULL COMMENT '开始时间', + `end_time` datetime NULL DEFAULT NULL COMMENT '结束时间', + `duration` bigint(255) NULL DEFAULT NULL COMMENT '执行时长', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '通用模板管理' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务执行日志' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_general_template +-- Records of starter_quartz_job_log -- ---------------------------- -- ---------------------------- --- Table structure for base_dynamic_data_source +-- Table structure for starter_wecom_robot_config -- ---------------------------- -DROP TABLE IF EXISTS `base_dynamic_data_source`; -CREATE TABLE `base_dynamic_data_source` ( +DROP TABLE IF EXISTS `starter_wecom_robot_config`; +CREATE TABLE `starter_wecom_robot_config` ( `id` bigint(20) NOT NULL, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据源编码', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据源名称', - `database_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库类型', - `auto_load` bit(1) NULL DEFAULT NULL COMMENT '是否启动自动加载', - `db_driver` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '驱动类', - `db_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库地址', - `db_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库名称', - `db_username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', - `db_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', + `webhook_key` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'webhook地址的key值', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime(6) NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `deleted` bit(1) NOT NULL COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '动态数据源管理' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '企业微信机器人配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_dynamic_data_source +-- Records of starter_wecom_robot_config -- ---------------------------- -- ---------------------------- --- Table structure for base_data_result_sql +-- Table structure for starter_wx_fans -- ---------------------------- -DROP TABLE IF EXISTS `base_data_result_sql`; -CREATE TABLE `base_data_result_sql` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `database_id` bigint(20) NULL DEFAULT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `is_list` bit(1) NULL DEFAULT NULL, - `sql` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, - `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', +DROP TABLE IF EXISTS `starter_wx_fans`; +CREATE TABLE `starter_wx_fans` ( + `id` bigint(20) NOT NULL, + `openid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联OpenId', + `subscribe_status` bit(1) NULL DEFAULT NULL COMMENT '订阅状态', + `subscribe_time` datetime NULL DEFAULT NULL COMMENT '订阅时间', + `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', + `sex` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', + `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '语言', + `country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '国家', + `province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '省份', + `city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市', + `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像地址', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '数据集SQL语句' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信公众号粉丝' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_data_result_sql +-- Records of starter_wx_fans -- ---------------------------- -- ---------------------------- --- Table structure for base_china_word +-- Table structure for starter_wx_menu -- ---------------------------- -DROP TABLE IF EXISTS `base_china_word`; -CREATE TABLE `base_china_word` ( +DROP TABLE IF EXISTS `starter_wx_menu`; +CREATE TABLE `starter_wx_menu` ( `id` bigint(20) NOT NULL COMMENT '主键', - `word` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '敏感词', - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '分类', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '描述', - `enable` bit(1) NULL DEFAULT NULL COMMENT '是否启用', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `white` bit(1) NULL DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称', + `menu_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '菜单信息', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `publish` bit(1) NOT NULL COMMENT '是否发布', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(11) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '敏感词' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '微信自定义菜单' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_china_word +-- Records of starter_wx_menu +-- ---------------------------- + +-- ---------------------------- +-- Table structure for starter_wx_template +-- ---------------------------- +DROP TABLE IF EXISTS `starter_wx_template`; +CREATE TABLE `starter_wx_template` ( + `id` bigint(20) NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `enable` bit(1) NOT NULL COMMENT '是否启用', + `template_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板ID', + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板标题', + `primary_industry` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板所属行业的一级行业', + `deputy_industry` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板所属行业的二级行业', + `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板内容', + `example` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '示例', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `inx_`(`template_id`) USING BTREE COMMENT '模板id' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信消息模板' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of starter_wx_template -- ---------------------------- SET FOREIGN_KEY_CHECKS = 1; diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 2f3bfaca..963f2132 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,10 +1,20 @@ # CHANGELOG ## [v1.3.6] 一号线-园博园 -- 文件上传替换为基于`x-file-storage`定制 -- 密码安全配置设置为必填. 保存信息化状态变为查看状态 -- 密码过期后清除所有的权限,必须强制更改密码 +- 新增: 文件上传替换为基于`x-file-storage`定制 +- 新增: 角色结构改为树形结构, 支持父子角色, 权限分配时支持进行级联收回, 也可以级联分配给下级 +- 优化: 密码过期后清除所有的权限,必须强制更改密码 +- 优化: 密码安全配置设置为必填. 保存信息状态变为查看状态 +- 优化: 密码安全配置设置为必填. 保存信息化状态变为查看状态 +- 优化: 数据权限重构为数据角色, 用于管理数据权限相关配置 +- 优化: Swagger相关配置不进行配置会无法启动处理 +- 优化: 时间反序列化时, 支持反序列化秒和毫秒级别的时间 +- 优化: MP分页和列表查询默认为ID降序 +- 优化: 查询构造器字段排序支持查询参数直接继承实现 +- fix: 请求权限配置新建时偶发类型不可以更改 - fix: 部分实体类数据更新策略配置错误修复 - +- fix: 新增和编辑用户时. 手机号和邮件校验有问题 +- fix: 用户列表和详情字典显示有问题 +- fix: 更新用户信息时, 脱敏的字段保存时未被忽略 ## [v1.3.5] 一号线-园博园 - 新增: SQL查询功能 - 新增: SQL查询功能支持导出 diff --git a/_doc/Task.md b/_doc/Task.md index aeae5486..cf75e30f 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -22,14 +22,15 @@ - [x] 菜单和权限码 - [x] 请求权限 - [x] 给角色分配权限时,查看是否有父角色,如果有,限定只能在父角色下进行分配 -- [ ] 菜单和请求权限只能系统管理员配置, 没有数据权限的控制 -- [ ] 权限相关缓存机制更改, 不能直接用户关联到具体的权限 - [x] MP分页和列表查询默认为ID降序 - [x] 查询构造器字段排序支持查询参数直接继承实现 +## 1.3.7 +- [ ] 权限相关缓存机制更改, 不能直接用户关联到具体的权限 +- [ ] 菜单和请求权限只能系统管理员配置, 没有数据权限的控制 +- [ ] 查询构造器支持帮助功能 +- [ ] 请求权限优化, 新增注解, 扫描时可以根据注解自动进行特定的处理 +- [ ] 查询构造器增加时间范围查询和和字段排序功能 ## 1.3.[x]、1.4.[x] -- 查询构造器支持帮助功能 -- 查询构造器增加时间范围查询和和字段排序功能 -- 请求权限优化, 新增注解, 扫描时可以根据注解自动进行特定的处理 - 接口平台功能 - 添加配置备份功能(菜单/系统参数/字典), csv或者表格方式 - 数据集功能 @@ -40,7 +41,6 @@ - 优化参数校验, 将各种入参进行校验 - 代码生成模板支持配置 - 支持预览编辑完成的富文本 -- 添加配置备份功能(菜单/系统参数/字典), csv方式 - 添加各种批量操作功能 - 一键缓存同步和更新操作(字典/参数) - 加密模块支持主键加密 diff --git a/bootx-start/src/main/resources/db/migration/V1.3.5_231021__release.sql b/bootx-start/src/main/resources/db/migration/V1.3.6_240131__release.sql similarity index 91% rename from bootx-start/src/main/resources/db/migration/V1.3.5_231021__release.sql rename to bootx-start/src/main/resources/db/migration/V1.3.6_240131__release.sql index 06f20976..a14d5966 100644 --- a/bootx-start/src/main/resources/db/migration/V1.3.5_231021__release.sql +++ b/bootx-start/src/main/resources/db/migration/V1.3.6_240131__release.sql @@ -6,7 +6,7 @@ Target Server Type : MySQL File Encoding : 65001 - Date: 21/10/2023 18:53:38 + Date: 31/01/2024 10:42:54 */ SET NAMES utf8mb4; @@ -3012,6 +3012,29 @@ INSERT INTO `base_area` VALUES ('659009', '昆玉市', '6590'); INSERT INTO `base_area` VALUES ('659010', '胡杨河市', '6590'); INSERT INTO `base_area` VALUES ('659011', '新星市', '6590'); +-- ---------------------------- +-- Table structure for base_china_word +-- ---------------------------- +DROP TABLE IF EXISTS `base_china_word`; +CREATE TABLE `base_china_word` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `word` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '敏感词', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '分类', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '描述', + `enable` bit(1) NULL DEFAULT NULL COMMENT '是否启用', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `white` bit(1) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '敏感词' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of base_china_word +-- ---------------------------- + -- ---------------------------- -- Table structure for base_city -- ---------------------------- @@ -3370,181 +3393,71 @@ INSERT INTO `base_city` VALUES ('6543', '阿勒泰地区', '65'); INSERT INTO `base_city` VALUES ('6590', '自治区直辖县级行政区划', '65'); -- ---------------------------- --- Table structure for iam_perm_menu +-- Table structure for base_data_result_sql -- ---------------------------- -DROP TABLE IF EXISTS `iam_perm_menu`; -CREATE TABLE `iam_perm_menu` ( +DROP TABLE IF EXISTS `base_data_result_sql`; +CREATE TABLE `base_data_result_sql` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `database_id` bigint(20) NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `is_list` bit(1) NULL DEFAULT NULL, + `sql` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, + `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '数据集SQL语句' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of base_data_result_sql +-- ---------------------------- + +-- ---------------------------- +-- Table structure for base_dict +-- ---------------------------- +DROP TABLE IF EXISTS `base_dict`; +CREATE TABLE `base_dict` ( `id` bigint(20) NOT NULL, - `client_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '终端code', - `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父id', - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由名称', - `perm_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单权限编码', - `effect` bit(1) NULL DEFAULT NULL COMMENT '是否有效', - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标', - `hidden` bit(1) NOT NULL COMMENT '是否隐藏', - `hide_children_in_menu` bit(1) NOT NULL COMMENT '是否隐藏子菜单', - `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件', - `component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件名字', - `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路径', - `redirect` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单跳转地址(重定向)', - `sort_no` double NOT NULL COMMENT '菜单排序', - `menu_type` int(5) NOT NULL COMMENT '类型(0:一级菜单;1:子菜单 ;2:按钮权限)', - `leaf` bit(1) NULL DEFAULT NULL COMMENT '是否叶子节点', - `keep_alive` bit(1) NULL DEFAULT NULL COMMENT '是否缓存页面', - `target_outside` bit(1) NULL DEFAULT NULL COMMENT '是否外部打开方式', - `hidden_header_content` bit(1) NULL DEFAULT NULL COMMENT '隐藏的标题内容', - `admin` bit(1) NOT NULL COMMENT '系统菜单', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编码', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', + `enable` bit(1) NOT NULL DEFAULT b'1' COMMENT '启用状态', + `group_tag` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '分类标签', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(8) NULL DEFAULT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限_菜单' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_perm_menu +-- Records of base_dict -- ---------------------------- -INSERT INTO `iam_perm_menu` VALUES (1414596052497092608, 'admin', NULL, '系统管理', 'system', '', NULL, 'desktop', b'0', b'0', 'RouteView', '', '/system', '/system/user', -99999, 0, b'0', b'1', b'0', b'0', b'1', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-27 10:02:16', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596647509446656, 'admin', 1452569691537256448, '用户管理', 'User', '', NULL, '', b'0', b'0', 'system/user/UserList', '', '/system/userAuth/user', '', 0, 1, b'0', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-27 10:17:40', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596773275652096, 'admin', 1414596052497092608, '菜单管理', 'Menu', '', NULL, '', b'0', b'0', 'system/menu/MenuList', '', '/system/permission/menu', '', 0, 1, b'0', b'1', b'0', b'0', b'1', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-26 23:56:16', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596805538238464, 'admin', 1452569339987472384, '角色管理', 'Role', '', NULL, '', b'0', b'0', 'system/role/RoleList', '', '/system/permission/role', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-26 23:56:04', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596842322284544, 'admin', 1452569691537256448, '部门管理', 'Dept', '', NULL, '', b'0', b'0', 'system/dept/DeptList', '', '/system/userAuth/dept', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-26 23:56:31', 7, 0); -INSERT INTO `iam_perm_menu` VALUES (1414596877617352704, 'admin', 1452571269199540224, '数据字典', 'Dict', '', b'0', '', b'0', b'0', 'system/dict/DictList', '', '/system/config/dict', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2022-05-19 09:04:55', 11, 0); -INSERT INTO `iam_perm_menu` VALUES (1431082258161434624, 'admin', 1452569691537256448, '在线用户管理', 'OnlineUser', '', NULL, '', b'0', b'0', 'system/online/OnlineUserList', NULL, '/system/userAuth/online', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:32:53', 1399985191002447872, '2021-08-27 10:32:53', 6, 0); -INSERT INTO `iam_perm_menu` VALUES (1431083330909208576, 'admin', 1541427353886859264, '登录方式', 'LoginType', '', b'0', '', b'0', b'0', 'system/client/LoginTypeList', NULL, '/system/config/loginType', '', 9, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:37:09', 1399985191002447872, '2022-07-05 21:18:12', 11, 0); -INSERT INTO `iam_perm_menu` VALUES (1431089129232498688, 'admin', 1452569339987472384, '请求权限管理', 'Path', '', NULL, '', b'0', b'0', 'system/path/PathList', NULL, '/system/permission/path', '', 0, 1, b'1', b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 11:00:11', 1399985191002447872, '2021-08-27 11:00:11', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1431152689832525824, 'admin', NULL, '系统监控', 'monitor', '', b'0', 'radar-chart', b'0', b'0', 'RouteView', NULL, '/monitor', '', 0, 0, b'1', b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2021-08-27 15:12:45', 1399985191002447872, '2022-06-17 17:57:30', 21, 0); -INSERT INTO `iam_perm_menu` VALUES (1431153358157348864, 'admin', 1431152689832525824, '接口文档', 'ApiSwagger', '', b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/doc.html', '', 0, 1, b'1', b'1', b'1', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 15:15:25', 1399985191002447872, '2022-10-14 17:47:12', 18, 0); -INSERT INTO `iam_perm_menu` VALUES (1435143678721236992, 'admin', 1452567897717321728, '登录日志', 'LoginLog', '', b'0', '', b'0', b'0', 'starter/log/LoginLogList', NULL, '/monitor/log/loginLog', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-07 15:31:31', 1399985191002447872, '2022-10-20 20:38:06', 6, 0); -INSERT INTO `iam_perm_menu` VALUES (1435476255797624832, 'admin', 1452567897717321728, '操作日志', 'OperateLog', '', b'0', '', b'0', b'0', 'starter/log/OperateLogList', NULL, '/monitor/log/OperateLog', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-08 13:33:04', 1399985191002447872, '2022-10-20 20:38:12', 8, 0); -INSERT INTO `iam_perm_menu` VALUES (1438061887002759168, 'admin', NULL, '通知管理', 'notice', '', NULL, 'message', b'0', b'0', 'RouteView', NULL, '/notice', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-15 16:47:26', 1399985191002447872, '2021-09-15 16:47:26', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1438072357281542144, 'admin', 1438061887002759168, '邮件配置', 'MailConfig', '', NULL, '', b'0', b'0', 'notice/mail/MailConfigList', NULL, '/notice/mailConfig', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-15 17:29:03', 1399985191002447872, '2021-09-15 17:29:03', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1439196893514031104, 'admin', 1438061887002759168, '消息模板', 'MessageTemplate', '', NULL, '', b'0', b'0', 'notice/template/TemplateList', NULL, '/notice/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-18 19:57:33', 1399985191002447872, '2021-09-18 19:57:33', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1440216178722050048, 'admin', 1438061887002759168, '钉钉', 'DingTalk', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/notice/dingTalk', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-21 15:27:50', 1399985191002447872, '2021-09-21 15:27:50', 0, 1); -INSERT INTO `iam_perm_menu` VALUES (1440216612211757056, 'admin', 1450822511087271936, '钉钉机器人', 'DingTalkRobot', '', b'0', '', b'0', b'0', 'third/dingtalk/robot/DingRobotConfigList', NULL, '/third/dingTalk/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-09-21 15:29:33', 1399985191002447872, '2022-07-26 13:34:35', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1450473063320526848, 'admin', 1452569691537256448, '第三方登录', 'Social', '', b'0', '', b'1', b'0', 'system/social/SocialList', NULL, '/system/userAuth/social', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-19 22:45:01', 1399985191002447872, '2022-07-26 13:35:47', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1450803906215886848, 'admin', 1452571269199540224, '定时任务', 'QuartzJobList', '', NULL, '', b'0', b'0', 'starter/quartz/QuartzJobList', NULL, '/system/config/quartz', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 20:39:41', 1399985191002447872, '2021-10-20 20:39:41', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1450819607680991232, 'admin', NULL, '第三方对接', 'third', '', b'0', 'branches', b'0', b'0', 'RouteView', NULL, '/third', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 21:42:04', 1399985191002447872, '2022-07-26 13:34:02', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1450821723027881984, 'admin', 1450819607680991232, '微信', 'WeChat', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/third/wechat', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 21:50:28', 1399985191002447872, '2022-08-03 23:23:10', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1450821877831254016, 'admin', 1450819607680991232, '企业微信', 'WeCom', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/third/wecom', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 21:51:05', 1399985191002447872, '2022-08-03 23:22:58', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1450822511087271936, 'admin', 1450819607680991232, '钉钉', 'DingTalk', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/third/dingtalk', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 21:53:36', 1399985191002447872, '2022-08-03 23:23:29', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1450827660459458560, 'admin', 1438061887002759168, '微信', 'NoticeWeChat', '', b'0', '', b'0', b'0', 'Dev', NULL, '/notice/wechat', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-20 22:14:04', 1399985191002447872, '2022-06-21 20:53:04', 1, 1); -INSERT INTO `iam_perm_menu` VALUES (1452567897717321728, 'admin', 1431152689832525824, '审计日志', 'auditLog', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/monitor/log', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:29:09', 1399985191002447872, '2022-10-20 20:37:46', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1452569339987472384, 'admin', 1414596052497092608, '权限管理', 'permission', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/system/permission', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:34:53', 1399985191002447872, '2021-10-25 17:34:53', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1452569691537256448, 'admin', 1414596052497092608, '用户信息', 'userAuth', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/system/userAuth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:36:17', 1399985191002447872, '2021-10-25 17:36:17', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1452571269199540224, 'admin', 1414596052497092608, '系统配置', 'systemConfig', '', NULL, '', b'0', b'0', 'RouteView', NULL, '/system/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 17:42:33', 1399985191002447872, '2021-10-25 17:42:33', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1452638905302966272, 'admin', 1452571269199540224, '系统参数', 'SystemParam', '', NULL, '', b'0', b'0', 'system/param/SystemParamList', NULL, '/system/config/param', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-10-25 22:11:18', 1399985191002447872, '2021-10-25 22:11:18', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1474694545336676352, 'admin', 1452569339987472384, '数据范围权限', 'DataRole', '', NULL, '', b'0', b'0', 'system/scope/DataScopeList', NULL, '/system/permission/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-12-25 18:52:33', 1399985191002447872, '2021-12-25 18:52:33', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1480839877352476672, 'admin', 1452567897717321728, '数据版本日志', 'DataVersionLog', NULL, b'0', '', b'0', b'0', 'starter/log/DataVersionLogList', NULL, '/monitor/log/DataVersionLog', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-01-11 17:51:54', 1399985191002447872, '2022-10-20 20:38:18', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1490984296616263680, 'admin', 1552207982510706688, '文件管理', 'FIleUpLoad', NULL, b'0', '', b'0', b'0', 'develop/file/FileUploadList', NULL, '/develop/file', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-08 17:42:12', 1399985191002447872, '2022-07-28 09:16:56', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1495013564652429312, 'admin', 1552207982510706688, '代码生成', 'CodeGen', NULL, b'0', '', b'0', b'0', 'develop/codegen/CodeGenList', NULL, '/develop/codegen', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-19 20:33:04', 1399985191002447872, '2022-07-27 16:25:05', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1495968302034210816, 'admin', NULL, '功能演示', 'Demo', NULL, b'0', 'block', b'0', b'0', 'RouteView', NULL, '/demo', '', 99, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-22 11:46:52', 1399985191002447872, '2022-05-10 11:02:05', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1495969099987963904, 'admin', 1495968302034210816, '数据相关', 'DemoData', NULL, b'0', '', b'0', b'0', 'RouteView', NULL, '/demo/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-22 11:50:02', 1399985191002447872, '2022-03-24 16:27:46', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1496020308992143360, 'admin', 1495968302034210816, '超级查询', 'SuperQueryDemo', NULL, b'0', '', b'0', b'0', 'demo/query/SuperQueryDemoList', NULL, '/demo/query/super', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-02-22 15:13:31', 1399985191002447872, '2022-05-27 17:34:41', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1506910599819165696, 'admin', 1495969099987963904, '数据权限', 'DataPermDemoList', NULL, b'0', '', b'0', b'0', 'demo/data/perm/DataPermDemoList', NULL, '/demo/data/perm', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-24 16:27:39', 1399985191002447872, '2022-03-24 16:28:56', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1506910885463851008, 'admin', 1495969099987963904, '加密解密', 'DataEncryptDemo', NULL, b'0', '', b'0', b'0', 'demo/data/encrypt/DataEncryptDemoList', NULL, '/demo/data/encrypt', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-24 16:28:47', 1399985191002447872, '2022-03-24 16:28:47', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1506911113394913280, 'admin', 1495969099987963904, '数据脱敏', 'DataSensitiveDemo', NULL, b'0', '', b'0', b'0', 'demo/data/sensitive/DataSensitiveDemoList', NULL, '/demo/data/sensitive', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-24 16:29:41', 1399985191002447872, '2022-03-24 17:16:03', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1507998458886197248, 'admin', 1495968302034210816, 'WS演示', 'WebsocketDemo', NULL, b'0', '', b'0', b'0', 'demo/ws/WebsocketDemo', NULL, '/demo/ws', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-27 16:30:25', 1399985191002447872, '2022-03-27 16:30:25', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1509488473583562752, 'admin', 1495968302034210816, '幂等请求演示', 'IdempotentDemo', NULL, b'0', '', b'0', b'0', 'demo/idempotent/Idempotent', NULL, '/demo/idempotent', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-03-31 19:11:12', 1399985191002447872, '2022-05-27 17:35:00', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1511266086400524288, 'admin', 1450822511087271936, '钉钉配置', 'DingTalkConfig', NULL, b'0', '', b'1', b'0', 'third/dingtalk/config/DingTalkConfigList', NULL, '/third/dingtalk/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-04-05 16:54:48', 1399985191002447872, '2022-07-26 13:34:44', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1530120084482084864, 'admin', 1495968302034210816, '消息中间件演示', 'MQDemo', NULL, b'0', '', b'0', b'0', 'demo/mq/MqDemo', NULL, '/demo/mq', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-05-27 17:33:51', 1399985191002447872, '2022-05-31 15:12:15', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1530120684645044224, 'admin', 1530120084482084864, 'MQTT消息', 'MqttDemo', NULL, b'0', '', b'0', b'0', '', NULL, '/demo/mq/mqtt', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-05-27 17:36:14', 1399985191002447872, '2022-05-27 17:36:14', 0, 1); -INSERT INTO `iam_perm_menu` VALUES (1530120821144473600, 'admin', 1530120084482084864, 'RabbitMQ', 'RabbitDemo', NULL, b'0', '', b'0', b'0', '', NULL, '/demo/mq/rabbit', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-05-27 17:36:47', 1399985191002447872, '2022-05-27 17:36:47', 0, 1); -INSERT INTO `iam_perm_menu` VALUES (1534000136370204672, 'admin', 1431152689832525824, 'ELK日志', 'ELK', '', b'0', '', b'1', b'0', '', NULL, 'http://elk.dev.bootx.cn:5601/app/discover', '', 0, 1, NULL, b'1', b'1', b'0', b'0', NULL, 1399985191002447872, '2022-06-07 10:31:48', 1399985191002447872, '2022-06-07 10:31:48', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1534008203006652416, 'admin', 1431152689832525824, 'PlumeLog日志', 'PlumeLog', '', b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/plumelog/#/', '', 0, 1, NULL, b'1', b'1', b'0', b'0', NULL, 1399985191002447872, '2022-06-07 11:03:51', 1399985191002447872, '2022-06-07 11:06:13', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1535451167008436224, 'admin', 1431152689832525824, '系统信息', 'SysInfo', NULL, b'0', '', b'0', b'0', 'starter/monitor/SystemInfoMonitor', NULL, '/monitor/sysinfo', '', 0, 1, NULL, b'0', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-11 10:37:40', 1399985191002447872, '2022-06-13 13:07:46', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1535965936371085312, 'admin', 1431152689832525824, 'Redis监控', 'RedisInfoMonitor', NULL, b'0', '', b'0', b'0', 'starter/monitor/RedisInfoMonitor', NULL, '/monitor/redis', '', 0, 1, NULL, b'0', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-12 20:43:11', 1399985191002447872, '2022-06-13 13:07:38', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1537730140522348544, 'admin', 1438061887002759168, '站内信', 'SiteMessageSender', '', b'0', '', b'0', b'0', 'notice/site/sender/SiteMessageList', NULL, '/notice/siteMessage', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-17 17:33:30', 1399985191002447872, '2022-08-20 21:12:30', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1538160478872625152, 'admin', 1495968302034210816, '富文本编辑', 'WangEditorDemo', NULL, b'0', '', b'0', b'0', 'demo/wangeditor/WangEditorDemo', NULL, '/demo/wangEditor', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-18 22:03:30', 1399985191002447872, '2022-06-18 22:03:31', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1541355214204030976, 'admin', 1541427353886859264, '认证终端', 'Client', '', b'0', '', b'0', b'0', 'system/client/ClientList', NULL, '/system/config/client', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2021-08-27 10:37:08', 1399985191002447872, '2022-07-05 21:17:45', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1541427353886859264, 'admin', 1414596052497092608, '认证管理', 'Auth', '', b'0', '', b'0', b'0', 'RouteView', NULL, '/system/auth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-06-27 22:24:54', 1399985191002447872, '2022-06-27 22:24:54', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1551803592828932096, 'admin', 1450821877831254016, '企微机器人', 'WeComRobot', '', b'0', '', b'0', b'0', 'third/wecom/robot/WeComRobotConfigList', NULL, '/third/wecom/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-07-26 13:36:22', 1399985191002447872, '2022-10-24 11:07:27', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1552207982510706688, 'admin', NULL, '开发管理', 'develop', NULL, b'0', 'gold', b'0', b'0', 'RouteView', NULL, '/develop', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-07-27 16:23:16', 1399985191002447872, '2022-07-27 16:39:09', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1552208167664062464, 'admin', 1552207982510706688, '动态表单', 'DynamicForm', NULL, b'0', '', b'0', b'0', 'develop/dynamicform/DynamicFormList', NULL, '/develop/form', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-07-27 16:24:00', 1399985191002447872, '2022-07-27 16:38:05', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1554720980865380352, 'admin', 1495968302034210816, '消息通知', 'NoticeDemo', NULL, b'0', '', b'0', b'0', 'RouteView', NULL, '/demo/notice', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-03 14:49:02', 1399985191002447872, '2022-08-03 14:49:02', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1554721654336385024, 'admin', 1554720980865380352, '邮件发送', 'EmailDemo', NULL, b'0', '', b'0', b'0', 'demo/notice/email/EmailSender', NULL, '/demo/notice/email', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-03 14:51:42', 1399985191002447872, '2022-08-03 14:51:42', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1554850179754975232, 'admin', 1450821723027881984, '消息模板', 'WeChatTemplate', NULL, b'0', '', b'0', b'0', 'third/wechat/template/WeChatTemplateList', NULL, '/third/wechat/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-03 23:22:25', 1399985191002447872, '2022-08-03 23:23:18', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1555835229426368512, 'admin', 1450821723027881984, '自定义菜单', 'WeChatMenu', NULL, b'0', '', b'0', b'0', 'third/wechat/menu/WeChatMenuList', NULL, '/third/wechat/menu', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-06 16:36:39', 1399985191002447872, '2022-08-08 12:14:14', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1556997405528805376, 'admin', 1450821723027881984, '素材管理', 'WeChatMedia', NULL, b'0', '', b'0', b'0', 'third/wechat/media/WeChatMediaList', NULL, '/third/wechat/media', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-08-09 21:34:44', 1399985191002447872, '2022-08-09 21:34:44', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1573669546890297344, 'admin', 1552207982510706688, '动态数据源', 'DynamicSource', NULL, b'0', '', b'0', b'0', 'develop/dynamicsource/DynamicDataSourceList', NULL, '/develop/source', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-09-24 21:43:52', 1399985191002447872, '2022-09-24 21:43:52', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1580740450633101312, 'adminv3', NULL, '系统管理', 'System', NULL, b'0', 'ant-design:setting-outlined', b'0', b'0', 'Layout', NULL, '/system', '/system1/client', -99999, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:01:07', 1414143554414059520, '2022-10-18 15:32:09', 4, 0); -INSERT INTO `iam_perm_menu` VALUES (1580740637841666048, 'adminv3', 1582253306356649984, '终端管理', 'ClientList', NULL, b'0', '', b'0', b'0', '/modules/system/client/ClientList.vue', NULL, '/system/client', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:01:51', 1414143554414059520, '2022-10-18 14:13:27', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1580740758629232640, 'adminv3', 1582253306356649984, '登录方式', 'LoginTypeList', NULL, b'0', '', b'0', b'0', '/modules/system/loginType/LoginTypeList.vue', NULL, '/system/loginType', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:02:20', 1414143554414059520, '2022-10-18 14:13:40', 5, 0); -INSERT INTO `iam_perm_menu` VALUES (1580858583654051840, 'adminv3', 1580740450633101312, '测试Iframe', 'Iframe', NULL, b'0', '', b'0', b'0', 'Iframe', NULL, '/system/Iframe', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 17:50:32', 1414143554414059520, '2022-10-17 17:46:19', 5, 1); -INSERT INTO `iam_perm_menu` VALUES (1580917438227075072, 'adminv3', 1580740450633101312, '三极目录', 'hello', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system1/a', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 21:44:24', 1399985191002447872, '2022-10-14 23:38:16', 2, 1); -INSERT INTO `iam_perm_menu` VALUES (1580917571069071360, 'adminv3', 1580917438227075072, '百度', 'baidu', NULL, b'0', '', b'0', b'0', '', NULL, 'https://www.baidu.com/', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 21:44:56', 1399985191002447872, '2022-10-14 23:37:44', 3, 1); -INSERT INTO `iam_perm_menu` VALUES (1580928436300337152, 'adminv3', 1580740450633101312, '菜单管理', 'MenuList', NULL, b'0', '', b'0', b'0', '/modules/system/menu/MenuList.vue', NULL, '/system/menu', '', -99, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 22:28:06', 1399985191002447872, '2022-10-14 22:28:32', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582249924602580992, 'adminv3', 1580740450633101312, '权限管理', 'Permission', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/permission', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 13:59:13', 1414143554414059520, '2022-10-18 13:59:13', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582253011803262976, 'adminv3', 1580740450633101312, '用户信息', 'UserAuth', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/user', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:11:30', 1414143554414059520, '2022-10-18 14:11:30', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582253152903843840, 'adminv3', 1580740450633101312, '系统配置', 'SystemConfig', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:12:03', 1414143554414059520, '2022-10-18 14:12:03', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582253306356649984, 'adminv3', 1580740450633101312, '认证管理', 'Auth', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/auth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:12:40', 1414143554414059520, '2022-10-18 14:13:13', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582275875424129024, 'adminv3', NULL, '系统监控', 'Monitor', NULL, b'0', 'ant-design:monitor-outlined', b'0', b'0', 'Layout', NULL, '/monitor', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:42:21', 1414143554414059520, '2022-10-19 17:29:29', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582275984849326080, 'adminv3', NULL, '通知管理', 'Notice', NULL, b'0', 'ant-design:message-outlined', b'0', b'0', 'Layout', NULL, '/notice', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:42:47', 1414143554414059520, '2022-10-19 17:30:06', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582276092038959104, 'adminv3', NULL, '第三方对接', 'Third', NULL, b'0', 'ant-design:api-twotone', b'0', b'0', 'Layout', NULL, '/third', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:43:12', 1414143554414059520, '2022-10-19 17:32:04', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582276341792985088, 'adminv3', NULL, '开发管理', 'Develop', NULL, b'0', 'ant-design:apartment-outlined', b'0', b'0', 'Layout', NULL, '/develop', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:44:12', 1414143554414059520, '2022-10-19 15:24:22', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582276516905177088, 'adminv3', NULL, '功能演示', 'Demo', NULL, b'0', 'ant-design:appstore-twotone', b'0', b'0', 'Layout', NULL, '/demo', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:44:54', 1414143554414059520, '2022-10-19 17:34:26', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582277076421136384, 'adminv3', 1582249924602580992, '角色管理', 'RoleList', NULL, b'0', '', b'0', b'0', '/modules/system/role/RoleList.vue', NULL, '/system/permission/role', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:47:07', 1414143554414059520, '2022-10-18 15:59:37', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582301940364308480, 'adminv3', 1582249924602580992, '请求权限管理', 'PermPathList', NULL, b'0', '', b'0', b'0', '/modules/system/path/PermPathList.vue', NULL, '/system/permission/path', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:25:55', 1414143554414059520, '2022-10-18 20:41:22', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582302180999917568, 'adminv3', 1582249924602580992, '数据范围权限', 'DataScopeList', NULL, b'0', '', b'0', b'0', '/modules/system/scope/DataScopeList.vue', NULL, '/system/permission/scope', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:26:52', 1414143554414059520, '2022-10-18 17:26:52', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582302542955769856, 'adminv3', 1582253011803262976, '用户管理', 'UserList', NULL, b'0', '', b'0', b'0', '/modules/system/user/UserList.vue', NULL, '/system/user/info', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:28:19', 1414143554414059520, '2022-10-18 17:28:19', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582302764129808384, 'adminv3', 1582253011803262976, '部门管理', 'DeptList', NULL, b'0', '', b'0', b'0', '/modules/system/dept/DeptList.vue', NULL, '/system/user/dept', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:29:11', 1414143554414059520, '2022-10-18 17:32:26', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582303143110340608, 'adminv3', 1582253152903843840, '数据字典', 'DictList', NULL, b'0', '', b'0', b'0', '/modules/system/dict/DictList.vue', NULL, '/system/config/dict', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:30:42', 1414143554414059520, '2022-10-18 17:30:42', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582303290070364160, 'adminv3', 1582253152903843840, '定时任务', 'QuartzJobList', NULL, b'0', '', b'0', b'0', '/modules/baseapi/quartz/QuartzJobList.vue', NULL, '/system/config/quartz', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:31:17', 1414143554414059520, '2023-08-09 15:50:46', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1582303447428067328, 'adminv3', 1582253152903843840, '系统参数', 'SystemParamList', NULL, b'0', '', b'0', b'0', '/modules/system/param/SystemParamList.vue', NULL, '/system/config/param', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:31:54', 1414143554414059520, '2022-10-19 23:14:16', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582632873244172288, 'adminv3', 1582276341792985088, '文件管理', 'FileUploadList', NULL, b'0', '', b'0', b'0', '/modules/develop/file/FileUploadList.vue', NULL, '/develop/file', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:20:56', 1414143554414059520, '2022-10-19 15:20:56', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582633196587261952, 'adminv3', 1582276341792985088, '代码生成', 'CodeGenList', NULL, b'0', '', b'0', b'0', '/modules/develop/codegen/CodeGenList.vue', NULL, '/develop/codegen', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:22:13', 1414143554414059520, '2022-10-19 15:23:17', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1582633307786649600, 'adminv3', 1582276341792985088, '动态表单', 'DynamicFormList', NULL, b'0', '', b'0', b'0', '/modules/develop/dynamicform/DynamicFormList.vue', NULL, '/develop/form', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:22:39', 1414143554414059520, '2022-10-19 15:22:39', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1582633620321017856, 'adminv3', 1582276341792985088, '动态数据源', 'DynamicDataSourceList', NULL, b'0', '', b'0', b'0', '/modules/develop/dynamicsource/DynamicDataSourceList.vue', NULL, '/develop/source', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:23:54', 1414143554414059520, '2022-10-19 15:23:54', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583074308040925184, 'adminv3', 1582275875424129024, '接口文档', 'ApiSwagger', NULL, b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/doc.html', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:35:02', 1414143554414059520, '2022-11-23 13:59:09', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1583075229563068416, 'adminv3', 1582275875424129024, '审计日志', 'AuditLog', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/monitor/log', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:38:42', 1414143554414059520, '2022-10-20 20:41:38', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1583076217481043968, 'adminv3', 1583075229563068416, '登录日志', 'LoginLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/login/LoginLogList.vue', NULL, '/monitor/log/login', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:42:37', 1414143554414059520, '2022-10-20 20:43:36', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1583076424935514112, 'adminv3', 1583075229563068416, '操作日志', 'OperateLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/operate/OperateLogList.vue', NULL, '/monitor/log/operate', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:43:26', 1414143554414059520, '2022-10-20 20:43:26', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583076670881112064, 'adminv3', 1583075229563068416, '数据版本日志', 'DataVersionLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/data/DataVersionLogList.vue', NULL, '/monitor/log/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:44:25', 1414143554414059520, '2022-10-20 20:44:25', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583076878956339200, 'adminv3', 1582275875424129024, 'ELK日志', 'ELK', NULL, b'0', '', b'1', b'0', '', NULL, 'http://elk.dev.bootx.cn:5601/app/discover', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:45:15', 1414143554414059520, '2023-08-12 19:26:12', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1583077015434797056, 'adminv3', 1582275875424129024, 'PlumeLog日志', 'PlumeLog', NULL, b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/plumelog/#/', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:45:47', 1414143554414059520, '2022-10-20 20:45:47', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583077198772019200, 'adminv3', 1582275875424129024, '系统信息', 'SystemInfoMonitor', NULL, b'0', '', b'0', b'0', '/modules/monitor/system/SystemInfoMonitor.vue', NULL, '/monitor/sysinfo', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:46:31', 1414143554414059520, '2022-10-20 20:46:31', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1583077360827342848, 'adminv3', 1582275875424129024, 'Redis监控', 'RedisInfoMonitor', NULL, b'0', '', b'0', b'0', '/modules/monitor/redis/RedisInfoMonitor.vue', NULL, '/monitor/redis', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:47:10', 1414143554414059520, '2022-10-20 20:47:10', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584378294652051456, 'adminv3', 1582275984849326080, '邮件配置', 'MailConfigList', NULL, b'0', '', b'0', b'0', '/modules/notice/mail/MailConfigList.vue', NULL, '/notice/notice', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:56:36', 1414143554414059520, '2022-10-24 16:14:34', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1584378497824137216, 'adminv3', 1582275984849326080, '消息模板', 'MessageTemplateList', NULL, b'0', '', b'0', b'0', '/modules/notice/template/MessageTemplateList.vue', NULL, '/notice/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:57:25', 1414143554414059520, '2022-10-25 22:14:14', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1584378671266996224, 'adminv3', 1582275984849326080, '站内信', 'SiteMessageList', NULL, b'0', '', b'0', b'0', '/modules/notice/site/sender/SiteMessageList.vue', NULL, '/notice/siteMessage', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:58:06', 1414143554414059520, '2022-10-24 10:58:06', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584379602188574720, 'adminv3', 1582276092038959104, '微信', 'WeChat', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/wechat', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:01:48', 1414143554414059520, '2022-10-24 11:01:48', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584379704122744832, 'adminv3', 1582276092038959104, '企业微信', 'WeCom', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/wecom', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:02:12', 1414143554414059520, '2022-10-24 11:02:12', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584380087805091840, 'adminv3', 1582276092038959104, '钉钉', 'DingTalk', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/dingtalk', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:03:44', 1414143554414059520, '2022-10-24 11:03:44', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1584380527829524480, 'adminv3', 1584379602188574720, '消息模板', 'WechatTemplateList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/template/WechatTemplateList.vue', NULL, '/third/wechat/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:05:29', 1414143554414059520, '2022-10-26 15:58:56', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1584380679478779904, 'adminv3', 1584379602188574720, '自定义菜单', 'WechatMenuList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/menu/WechatMenuList.vue', NULL, '/third/wechat/menu', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:06:05', 1414143554414059520, '2022-10-27 10:15:24', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1584380824308097024, 'adminv3', 1584379602188574720, '素材管理', 'WechatMediaList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/media/WechatMediaList.vue', NULL, '/third/wechat/media', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:06:40', 1414143554414059520, '2022-10-27 16:38:47', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1584381134950834176, 'adminv3', 1584379704122744832, '企微机器人', 'WeComRobotConfigList', NULL, b'0', '', b'0', b'0', '/modules/third/wecom/robot/WecomRobotConfigList.vue', NULL, '/third/wecom/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:07:54', 1414143554414059520, '2022-11-12 20:58:25', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1584381322184564736, 'adminv3', 1584380087805091840, '钉钉机器人', 'DingRobotConfigList', NULL, b'0', '', b'0', b'0', '/modules/third/dingtalk/robot/DingRobotConfigList.vue', NULL, '/third/dingTalk/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:08:38', 1414143554414059520, '2022-11-12 20:58:37', 6, 0); -INSERT INTO `iam_perm_menu` VALUES (1584381477986181120, 'adminv3', 1584380087805091840, '钉钉配置', 'DingRobotConfigList', NULL, b'0', '', b'1', b'0', '/modules/third/dingtalk/config/DingTalkConfigList.vue', NULL, '/third/dingtalk/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:09:15', 1414143554414059520, '2022-11-11 16:04:47', 1, 1); -INSERT INTO `iam_perm_menu` VALUES (1597044371008516096, 'adminv3', NULL, '功能演示', 'Demo', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/demo', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 09:47:04', 1414143554414059520, '2022-11-28 09:47:04', 0, 1); -INSERT INTO `iam_perm_menu` VALUES (1597102799370317824, 'adminv3', 1582276516905177088, '数据相关', 'DemoData', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/demo/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 13:39:15', 1414143554414059520, '2022-11-28 13:39:15', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1597210969883275264, 'adminv3', 1582276516905177088, '超级查询', 'SuperQueryDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/query/SuperQueryDemoList.vue', NULL, '/demo/query/super', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 20:49:05', 1414143554414059520, '2022-11-28 21:00:14', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1599337250200440832, 'adminv3', NULL, '关于', '', NULL, b'0', 'simple-icons:about-dot-me', b'0', b'0', '', NULL, '/about/index', '', 99, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 17:38:09', 1414143554414059520, '2022-12-04 17:43:32', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1599378494880436224, 'adminv3', 1582276516905177088, 'WS演示', 'WebsocketDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/ws/WebsocketDemo', NULL, '/demo/ws', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:03', 1414143554414059520, '2023-02-08 12:17:58', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1599378579513102336, 'adminv3', 1582276516905177088, '幂等请求演示', 'IdempotentDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/idempotent/IdempotentDemo', NULL, '/demo/idempotent', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:23', 1414143554414059520, '2023-02-08 11:46:00', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1599378728490586112, 'adminv3', 1582276516905177088, '消息中间件演示', 'MqDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/mq/MqDemo', NULL, '/demo/mq', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:59', 1414143554414059520, '2023-02-08 22:09:04', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1599378838519762944, 'adminv3', 1582276516905177088, '富文本编辑', 'WangEditorDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/wangeditor/WangEditorDemo.vue', NULL, '/demo/wangEditor', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:23:25', 1414143554414059520, '2023-02-10 09:05:16', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1617847577158324224, 'adminv3', 1597102799370317824, '数据权限', 'DataPermDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/perm/DataPermDemoList.vue', NULL, '/demo/data/perm', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:31:35', 1414143554414059520, '2023-01-24 20:06:04', 2, 0); -INSERT INTO `iam_perm_menu` VALUES (1617847653746315264, 'adminv3', 1597102799370317824, '加密解密', 'DataEncryptDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/encrypt/DataEncryptDemoList.vue', NULL, '/demo/data/encrypt', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:31:53', 1414143554414059520, '2023-01-24 20:05:45', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1617847747375763456, 'adminv3', 1597102799370317824, '数据脱敏', 'DataSensitiveDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/sensitive/DataSensitiveDemoList.vue', NULL, '/demo/data/sensitive', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:32:16', 1414143554414059520, '2023-01-24 20:06:58', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1621150743447965696, 'admin', 1495968302034210816, '省市区联动', 'ChinaRegionDemo', NULL, b'0', '', b'0', b'0', 'demo/chinaregion/ChinaRegionDemo', NULL, '/demo/chinaregion', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-02-02 22:17:11', 1399985191002447872, '2023-02-08 09:43:39', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1623156857846034432, 'adminv3', 1582276516905177088, '省市区联动', 'ChinaRegionDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/chinaregion/ChinaRegionDemo', NULL, '/demo/chinaregion', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-08 11:08:46', 1414143554414059520, '2023-02-08 11:08:46', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1623325795944439808, 'adminv3', 1599378992811429888, '邮件通知', 'EmailSenderDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/notice/email/EmailSenderDemo.vue', NULL, '/demo/notice/email', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-08 22:20:04', 1414143554414059520, '2023-02-20 10:38:55', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1623494586215579648, 'admin', 1552207982510706688, '行政区划', 'ChinaRegion', NULL, b'0', '', b'1', b'0', 'develop/region/ChinaRegionList', NULL, '/develop/region', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-02-09 09:30:47', 1399985191002447872, '2023-02-09 17:50:05', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1629039360928075776, 'adminv3', 1582276341792985088, '可视化大屏', 'ProjectInfoList', NULL, b'0', '', b'0', b'0', '/modules/develop/report/ProjectInfoList', NULL, '/develop/report', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-24 16:43:44', 1414143554414059520, '2023-02-24 16:44:17', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1631946120891707392, 'admin', 1552207982510706688, '可视化大屏', 'ProjectInfoList', NULL, b'0', '', b'0', b'0', 'develop/report/ProjectInfoList', NULL, '/develop/report', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-03-04 17:14:10', 1399985191002447872, '2023-03-04 17:14:10', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1635274568758435840, 'adminv3', 1582276341792985088, '数据集管理', 'DataResultSqlList', NULL, b'0', '', b'0', b'0', '/modules/develop/dataresult/DataResultSqlList', NULL, '/develop/dataresult', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-03-13 21:40:14', 1414143554414059520, '2023-09-18 14:26:51', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1687369862646558720, 'adminv3', 1582275984849326080, '短信管理', 'Sms', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/notice/sms', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:48:20', 1414143554414059520, '2023-08-04 15:48:32', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1687370142234669056, 'adminv3', 1687369862646558720, '短信配置', 'SmsChannelConfigList', NULL, b'0', '', b'0', b'0', '/modules/notice/sms/config/SmsChannelConfigList', NULL, '/notice/sms/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:49:26', 1414143554414059520, '2023-08-04 15:49:26', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1687370277496778752, 'adminv3', 1687369862646558720, '短信模板', 'SmsTemplateList', NULL, b'0', '', b'0', b'0', '/modules/notice/sms/template/SmsTemplateList', NULL, '/notice/sms/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:49:59', 1414143554414059520, '2023-08-04 15:50:38', 1, 0); -INSERT INTO `iam_perm_menu` VALUES (1689181991598997504, 'adminv3', 1582253152903843840, '敏感词管理', 'ChinaWord', NULL, b'0', '', b'0', b'0', '/modules/baseapi/chianword/ChinaWordList.vue', NULL, '/system/config/chinaword', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-09 15:49:05', 1414143554414059520, '2023-08-09 15:49:05', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1690324070514782208, 'adminv3', 1582276341792985088, '通用模板', 'GeneralTemplateList', NULL, b'0', '', b'0', b'0', '/modules/develop/template/GeneralTemplateList', NULL, '/develop/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-12 19:27:18', 1414143554414059520, '2023-08-12 19:31:26', 3, 0); -INSERT INTO `iam_perm_menu` VALUES (1703665090038800384, 'adminv3', 1582276341792985088, '在线SQL', 'SqlQueryInfo', NULL, b'0', '', b'0', b'0', '/modules/develop/query/SqlQueryInfo', NULL, '/develop/sqlquery', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-09-18 14:59:45', 1414143554414059520, '2023-09-18 14:59:45', 0, 0); -INSERT INTO `iam_perm_menu` VALUES (1713931084759293952, 'adminv3', 1582253306356649984, '密码安全', 'PassowrdSecurity', NULL, b'0', '', b'0', b'0', '/modules/system/security/password/PasswordSecurityConfig.vue', NULL, '/system/config/passowrd', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-10-16 22:53:09', 1399985191002447872, '2023-10-16 22:58:59', 2, 0); +INSERT INTO `base_dict` VALUES (1422929378374828033, 'Sex', '性别', b'1', '基础属性', '性别', 0, '2021-08-04 22:36:15', 1399985191002447872, '2022-05-11 19:48:40', 0, 6); +INSERT INTO `base_dict` VALUES (1425744045414772737, 'MenuType', '菜单类型', b'1', '系统属性', '菜单类型', 0, '2021-08-12 17:00:44', 1399985191002447872, '2022-05-11 19:48:44', 0, 4); +INSERT INTO `base_dict` VALUES (1430063572491411456, 'loginType', '字典类型', b'1', '基础属性', '字典类型', 1399985191002447872, '2021-08-24 15:05:00', 1399985191002447872, '2021-08-24 15:05:00', 1, 2); +INSERT INTO `base_dict` VALUES (1435829999592759296, 'UserStatusCode', '用户状态码', b'1', '系统属性', '用户状态码', 1399985191002447872, '2021-09-09 12:58:43', 1399985191002447872, '2022-05-11 19:48:56', 0, 2); +INSERT INTO `base_dict` VALUES (1435838066191458304, 'LogBusinessType', '业务操作类型', b'1', '系统属性', '操作日志记录的业务操作类型', 1399985191002447872, '2021-09-09 13:30:46', 1399985191002447872, '2022-05-11 19:49:00', 0, 2); +INSERT INTO `base_dict` VALUES (1438078864509317120, 'MailSecurityCode', '邮箱安全方式编码', b'1', '消息服务', '邮箱安全方式编码', 1399985191002447872, '2021-09-15 17:54:54', 1399985191002447872, '2022-05-11 19:49:06', 0, 2); +INSERT INTO `base_dict` VALUES (1439961232651034624, 'MessageTemplateCode', '消息模板类型', b'1', '消息服务', '消息模板类型', 1399985191002447872, '2021-09-20 22:34:46', 1399985191002447872, '2022-05-11 19:48:34', 0, 1); +INSERT INTO `base_dict` VALUES (1452836604783845376, 'SocialType', '三方系统类型', b'1', '系统属性', '三方系统类型', 1399985191002447872, '2021-10-26 11:16:54', 1399985191002447872, '2022-05-11 19:48:28', 0, 3); +INSERT INTO `base_dict` VALUES (1452843488735621120, 'ParamType', '参数类型', b'1', '系统属性', '参数类型', 1399985191002447872, '2021-10-26 11:44:15', 1399985191002447872, '2022-05-11 19:48:21', 0, 2); +INSERT INTO `base_dict` VALUES (1496024933900169216, 'Political', '政治面貌', b'1', '基础数据', '政治面貌', 1399985191002447872, '2022-02-22 15:31:54', 1399985191002447872, '2022-05-11 19:48:04', 0, 1); +INSERT INTO `base_dict` VALUES (1556996322223968256, 'WeChatMediaType', '微信媒体类型', b'1', '微信', '微信媒体类型', 1399985191002447872, '2022-08-09 21:30:25', 1399985191002447872, '2022-08-09 21:30:26', 0, 0); +INSERT INTO `base_dict` VALUES (1561003021674987520, 'SiteMessageReceive', '消息接收类型', b'1', '站内信', '站内信接收类型', 1399985191002447872, '2022-08-20 22:51:37', 1399985191002447872, '2022-08-20 22:51:37', 0, 0); +INSERT INTO `base_dict` VALUES (1561003189111603200, 'SiteMessageState', '消息发布状态', b'1', '站内信', '站内信消息发布状态', 1399985191002447872, '2022-08-20 22:52:17', 1399985191002447872, '2022-08-20 22:52:17', 0, 0); +INSERT INTO `base_dict` VALUES (1589527951317389312, 'DataScopePerm', '数据权限类型', b'1', '系统属性', '数据权限类型', 1414143554414059520, '2022-11-07 15:59:30', 1399985191002447872, '2023-11-28 23:14:24', 0, 4); +INSERT INTO `base_dict` VALUES (1633393287952257024, 'DatabaseType', '数据库类型', b'1', '开发', '数据库类型', 1414143554414059520, '2023-03-08 17:04:41', 1414143554414059520, '2023-03-08 17:04:41', 0, 0); +INSERT INTO `base_dict` VALUES (1688742690398617600, 'SmsChannel', '短信渠道商', b'1', '消息服务', '短信渠道商', 1414143554414059520, '2023-08-08 10:43:27', 1414143554414059520, '2023-08-12 20:24:03', 0, 1); +INSERT INTO `base_dict` VALUES (1690338321769918464, 'GeneralTemplateUseType', '通用模板类型', b'1', '系统属性', '通用模板类型', 1414143554414059520, '2023-08-12 20:23:56', 1414143554414059520, '2023-08-12 20:24:22', 0, 1); +INSERT INTO `base_dict` VALUES (1690338545284378624, 'GeneralTemplateState', '通用模板状态', b'1', '系统属性', '通用模板状态', 1414143554414059520, '2023-08-12 20:24:49', 1414143554414059520, '2023-08-12 20:24:49', 0, 0); -- ---------------------------- -- Table structure for base_dict_item @@ -3560,9 +3473,9 @@ CREATE TABLE `base_dict_item` ( `sort_no` double(8, 2) NOT NULL COMMENT '排序', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE, @@ -3578,9 +3491,9 @@ INSERT INTO `base_dict_item` VALUES (1425744258544136194, 1425744045414772737, ' INSERT INTO `base_dict_item` VALUES (1425744436592340993, 1425744045414772737, 'MenuType', '1', '子菜单', b'1', 0.00, '子菜单', 0, '2021-08-12 17:02:17', 0, '2021-08-12 17:02:17', 0, 0); INSERT INTO `base_dict_item` VALUES (1425744470582980610, 1425744045414772737, 'MenuType', '2', '按钮权限', b'1', 0.00, '按钮权限', 0, '2021-08-12 17:02:26', 0, '2021-08-12 17:02:26', 0, 0); INSERT INTO `base_dict_item` VALUES (1430094707250413568, 1422929378374828033, 'Sex', '0', '未知', b'1', 0.00, '不确定性别', 1399985191002447872, '2021-08-24 17:08:43', 1399985191002447872, '2021-08-24 17:08:43', 0, 0); -INSERT INTO `base_dict_item` VALUES (1435830086406463488, 1435829999592759296, 'UserStatusCode', '1', '正常', b'1', 0.00, 'NORMAL', 1399985191002447872, '2021-09-09 12:59:04', 1399985191002447872, '2021-09-09 12:59:04', 0, 0); -INSERT INTO `base_dict_item` VALUES (1435830141855162368, 1435829999592759296, 'UserStatusCode', '2', '锁定', b'1', 0.00, 'LOCK, 多次登录失败被锁定', 1399985191002447872, '2021-09-09 12:59:17', 1399985191002447872, '2021-09-09 12:59:17', 0, 1); -INSERT INTO `base_dict_item` VALUES (1435830260503633920, 1435829999592759296, 'UserStatusCode', '3', '封禁', b'1', 0.00, 'BAN', 1399985191002447872, '2021-09-09 12:59:45', 1399985191002447872, '2021-09-09 12:59:45', 0, 0); +INSERT INTO `base_dict_item` VALUES (1435830086406463488, 1435829999592759296, 'UserStatusCode', 'normal', '正常', b'1', 0.00, 'NORMAL', 1399985191002447872, '2021-09-09 12:59:04', 1399985191002447872, '2023-11-25 15:32:04', 0, 1); +INSERT INTO `base_dict_item` VALUES (1435830141855162368, 1435829999592759296, 'UserStatusCode', 'lock', '锁定', b'1', 0.00, 'LOCK, 多次登录失败被锁定', 1399985191002447872, '2021-09-09 12:59:17', 1399985191002447872, '2023-11-25 15:32:14', 0, 2); +INSERT INTO `base_dict_item` VALUES (1435830260503633920, 1435829999592759296, 'UserStatusCode', 'ban', '封禁', b'1', 0.00, 'BAN', 1399985191002447872, '2021-09-09 12:59:45', 1399985191002447872, '2023-11-25 15:32:20', 0, 1); INSERT INTO `base_dict_item` VALUES (1435838374749626368, 1435838066191458304, 'LogBusinessType', 'other', '其它', b'1', 0.00, '', 1399985191002447872, '2021-09-09 13:32:00', 1399985191002447872, '2021-09-09 13:32:00', 0, 0); INSERT INTO `base_dict_item` VALUES (1435838414436130816, 1435838066191458304, 'LogBusinessType', 'insert', '新增', b'1', 0.00, '', 1399985191002447872, '2021-09-09 13:32:09', 1399985191002447872, '2021-09-09 13:32:09', 0, 0); INSERT INTO `base_dict_item` VALUES (1435838467624099840, 1435838066191458304, 'LogBusinessType', 'update', '修改', b'1', 0.00, '', 1399985191002447872, '2021-09-09 13:32:22', 1399985191002447872, '2021-09-09 13:32:22', 0, 0); @@ -3622,13 +3535,13 @@ INSERT INTO `base_dict_item` VALUES (1561003539772194816, 1561003189111603200, ' INSERT INTO `base_dict_item` VALUES (1561003575608328192, 1561003189111603200, 'SiteMessageState', 'cancel', '撤销', b'1', 0.00, '', 1399985191002447872, '2022-08-20 22:53:49', 1399985191002447872, '2022-08-20 22:53:49', 0, 0); INSERT INTO `base_dict_item` VALUES (1561245469535080448, 1561003189111603200, 'SiteMessageState', 'draft', '草稿', b'1', 0.00, '', 1399985191002447872, '2022-08-21 14:55:01', 1399985191002447872, '2022-08-21 14:55:01', 0, 0); INSERT INTO `base_dict_item` VALUES (1573665422392098816, 1439961232651034624, 'MessageTemplateCode', '0', '站内信', b'1', -11.00, 'SITE', 1399985191002447872, '2022-09-24 21:27:29', 1399985191002447872, '2022-09-24 21:27:39', 0, 1); -INSERT INTO `base_dict_item` VALUES (1589528254477488128, 1589527951317389312, 'DataScopePerm', '7', '所在及下级部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:43', 1414143554414059520, '2022-11-07 16:00:43', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528283539820544, 1589527951317389312, 'DataScopePerm', '6', '所在部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:49', 1414143554414059520, '2022-11-07 16:00:49', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528315672383488, 1589527951317389312, 'DataScopePerm', '5', '全部数据', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:57', 1414143554414059520, '2022-11-07 16:00:57', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528340267782144, 1589527951317389312, 'DataScopePerm', '4', '部门和用户范围', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:03', 1414143554414059520, '2022-11-07 16:01:03', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528367228768256, 1589527951317389312, 'DataScopePerm', '3', '部门范围', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:09', 1414143554414059520, '2022-11-07 16:01:09', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528393292173312, 1589527951317389312, 'DataScopePerm', '2', '用户范围', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:16', 1414143554414059520, '2022-11-07 16:01:16', 0, 0); -INSERT INTO `base_dict_item` VALUES (1589528423956729856, 1589527951317389312, 'DataScopePerm', '1', '自身数据', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:23', 1414143554414059520, '2022-11-07 16:01:23', 0, 0); +INSERT INTO `base_dict_item` VALUES (1589528254477488128, 1589527951317389312, 'DataScopePerm', 'self_dept_sub', '所在及下级部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:43', 1399985191002447872, '2023-11-28 23:16:02', 0, 2); +INSERT INTO `base_dict_item` VALUES (1589528283539820544, 1589527951317389312, 'DataScopePerm', 'self_dept', '所在部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:49', 1399985191002447872, '2023-11-28 23:15:52', 0, 2); +INSERT INTO `base_dict_item` VALUES (1589528315672383488, 1589527951317389312, 'DataScopePerm', 'all', '全部数据', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:00:57', 1399985191002447872, '2023-11-25 22:51:28', 0, 1); +INSERT INTO `base_dict_item` VALUES (1589528340267782144, 1589527951317389312, 'DataScopePerm', 'dept_and_user', '自定义部门和用户', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:03', 1399985191002447872, '2023-11-29 15:25:01', 0, 3); +INSERT INTO `base_dict_item` VALUES (1589528367228768256, 1589527951317389312, 'DataScopePerm', 'dept', '自定义部门', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:09', 1399985191002447872, '2023-11-29 15:24:47', 0, 2); +INSERT INTO `base_dict_item` VALUES (1589528393292173312, 1589527951317389312, 'DataScopePerm', 'user', '指定用户', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:16', 1399985191002447872, '2023-11-29 15:25:16', 0, 2); +INSERT INTO `base_dict_item` VALUES (1589528423956729856, 1589527951317389312, 'DataScopePerm', 'self', '自身数据', b'1', 0.00, '', 1414143554414059520, '2022-11-07 16:01:23', 1399985191002447872, '2023-11-25 22:50:41', 0, 1); INSERT INTO `base_dict_item` VALUES (1633403429028536320, 1633393287952257024, 'DatabaseType', 'mysql', 'MySQL', b'1', 1.00, '', 1414143554414059520, '2023-03-08 17:44:59', 1414143554414059520, '2023-03-08 17:44:59', 0, 0); INSERT INTO `base_dict_item` VALUES (1633403459470794752, 1633393287952257024, 'DatabaseType', 'oracle', 'Oracle', b'1', 2.00, '', 1414143554414059520, '2023-03-08 17:45:07', 1414143554414059520, '2023-03-08 17:45:07', 0, 0); INSERT INTO `base_dict_item` VALUES (1633403498695925760, 1633393287952257024, 'DatabaseType', 'mssql', 'SQLServer', b'1', 3.00, '', 1414143554414059520, '2023-03-08 17:45:16', 1414143554414059520, '2023-03-08 17:45:16', 0, 0); @@ -3646,248 +3559,109 @@ INSERT INTO `base_dict_item` VALUES (1690338619024437248, 1690338321769918464, ' INSERT INTO `base_dict_item` VALUES (1690338653442895872, 1690338321769918464, 'GeneralTemplateUseType', 'export', '导出', b'1', 0.00, '', 1414143554414059520, '2023-08-12 20:25:15', 1414143554414059520, '2023-08-12 20:25:15', 0, 0); INSERT INTO `base_dict_item` VALUES (1690338707129987072, 1690338545284378624, 'GeneralTemplateState', 'enable', '启用', b'1', 0.00, '', 1414143554414059520, '2023-08-12 20:25:27', 1414143554414059520, '2023-08-12 20:25:27', 0, 0); INSERT INTO `base_dict_item` VALUES (1690338748032839680, 1690338545284378624, 'GeneralTemplateState', 'disable', '停用', b'1', 0.00, '', 1414143554414059520, '2023-08-12 20:25:37', 1414143554414059520, '2023-08-12 20:25:37', 0, 0); +INSERT INTO `base_dict_item` VALUES (1729519341702086656, 1589527951317389312, 'DataScopePerm', 'dept_sub', '指定部门及下级部门', b'1', 0.00, '', 1399985191002447872, '2023-11-28 23:15:19', 1399985191002447872, '2023-11-28 23:15:19', 0, 0); -- ---------------------------- --- Table structure for base_province +-- Table structure for base_dynamic_data_source -- ---------------------------- -DROP TABLE IF EXISTS `base_province`; -CREATE TABLE `base_province` ( - `code` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '省份编码', - `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '省份名称', - PRIMARY KEY (`code`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '省份表' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `base_dynamic_data_source`; +CREATE TABLE `base_dynamic_data_source` ( + `id` bigint(20) NOT NULL, + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据源编码', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据源名称', + `database_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库类型', + `auto_load` bit(1) NULL DEFAULT NULL COMMENT '是否启动自动加载', + `db_driver` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '驱动类', + `db_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库地址', + `db_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库名称', + `db_username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `db_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '动态数据源管理' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_province +-- Records of base_dynamic_data_source -- ---------------------------- -INSERT INTO `base_province` VALUES ('11', '北京市'); -INSERT INTO `base_province` VALUES ('12', '天津市'); -INSERT INTO `base_province` VALUES ('13', '河北省'); -INSERT INTO `base_province` VALUES ('14', '山西省'); -INSERT INTO `base_province` VALUES ('15', '内蒙古自治区'); -INSERT INTO `base_province` VALUES ('21', '辽宁省'); -INSERT INTO `base_province` VALUES ('22', '吉林省'); -INSERT INTO `base_province` VALUES ('23', '黑龙江省'); -INSERT INTO `base_province` VALUES ('31', '上海市'); -INSERT INTO `base_province` VALUES ('32', '江苏省'); -INSERT INTO `base_province` VALUES ('33', '浙江省'); -INSERT INTO `base_province` VALUES ('34', '安徽省'); -INSERT INTO `base_province` VALUES ('35', '福建省'); -INSERT INTO `base_province` VALUES ('36', '江西省'); -INSERT INTO `base_province` VALUES ('37', '山东省'); -INSERT INTO `base_province` VALUES ('41', '河南省'); -INSERT INTO `base_province` VALUES ('42', '湖北省'); -INSERT INTO `base_province` VALUES ('43', '湖南省'); -INSERT INTO `base_province` VALUES ('44', '广东省'); -INSERT INTO `base_province` VALUES ('45', '广西壮族自治区'); -INSERT INTO `base_province` VALUES ('46', '海南省'); -INSERT INTO `base_province` VALUES ('50', '重庆市'); -INSERT INTO `base_province` VALUES ('51', '四川省'); -INSERT INTO `base_province` VALUES ('52', '贵州省'); -INSERT INTO `base_province` VALUES ('53', '云南省'); -INSERT INTO `base_province` VALUES ('54', '西藏自治区'); -INSERT INTO `base_province` VALUES ('61', '陕西省'); -INSERT INTO `base_province` VALUES ('62', '甘肃省'); -INSERT INTO `base_province` VALUES ('63', '青海省'); -INSERT INTO `base_province` VALUES ('64', '宁夏回族自治区'); -INSERT INTO `base_province` VALUES ('65', '新疆维吾尔自治区'); -- ---------------------------- --- Table structure for base_dict +-- Table structure for base_dynamic_form -- ---------------------------- -DROP TABLE IF EXISTS `base_dict`; -CREATE TABLE `base_dict` ( +DROP TABLE IF EXISTS `base_dynamic_form`; +CREATE TABLE `base_dynamic_form` ( `id` bigint(20) NOT NULL, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '编码', - `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', - `enable` bit(1) NOT NULL DEFAULT b'1' COMMENT '启用状态', - `group_tag` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '分类标签', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单键名', + `value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '表单内容', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(8) NULL DEFAULT NULL COMMENT '版本', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '动态表单' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_dict --- ---------------------------- -INSERT INTO `base_dict` VALUES (1422929378374828033, 'Sex', '性别', b'1', '基础属性', '性别', 0, '2021-08-04 22:36:15', 1399985191002447872, '2022-05-11 19:48:40', 0, 6); -INSERT INTO `base_dict` VALUES (1425744045414772737, 'MenuType', '菜单类型', b'1', '系统属性', '菜单类型', 0, '2021-08-12 17:00:44', 1399985191002447872, '2022-05-11 19:48:44', 0, 4); -INSERT INTO `base_dict` VALUES (1430063572491411456, 'loginType', '字典类型', b'1', '基础属性', '字典类型', 1399985191002447872, '2021-08-24 15:05:00', 1399985191002447872, '2021-08-24 15:05:00', 1, 2); -INSERT INTO `base_dict` VALUES (1435829999592759296, 'UserStatusCode', '用户状态码', b'1', '系统属性', '用户状态码', 1399985191002447872, '2021-09-09 12:58:43', 1399985191002447872, '2022-05-11 19:48:56', 0, 2); -INSERT INTO `base_dict` VALUES (1435838066191458304, 'LogBusinessType', '业务操作类型', b'1', '系统属性', '操作日志记录的业务操作类型', 1399985191002447872, '2021-09-09 13:30:46', 1399985191002447872, '2022-05-11 19:49:00', 0, 2); -INSERT INTO `base_dict` VALUES (1438078864509317120, 'MailSecurityCode', '邮箱安全方式编码', b'1', '消息服务', '邮箱安全方式编码', 1399985191002447872, '2021-09-15 17:54:54', 1399985191002447872, '2022-05-11 19:49:06', 0, 2); -INSERT INTO `base_dict` VALUES (1439961232651034624, 'MessageTemplateCode', '消息模板类型', b'1', '消息服务', '消息模板类型', 1399985191002447872, '2021-09-20 22:34:46', 1399985191002447872, '2022-05-11 19:48:34', 0, 1); -INSERT INTO `base_dict` VALUES (1452836604783845376, 'SocialType', '三方系统类型', b'1', '系统属性', '三方系统类型', 1399985191002447872, '2021-10-26 11:16:54', 1399985191002447872, '2022-05-11 19:48:28', 0, 3); -INSERT INTO `base_dict` VALUES (1452843488735621120, 'ParamType', '参数类型', b'1', '系统属性', '参数类型', 1399985191002447872, '2021-10-26 11:44:15', 1399985191002447872, '2022-05-11 19:48:21', 0, 2); -INSERT INTO `base_dict` VALUES (1496024933900169216, 'Political', '政治面貌', b'1', '基础数据', '政治面貌', 1399985191002447872, '2022-02-22 15:31:54', 1399985191002447872, '2022-05-11 19:48:04', 0, 1); -INSERT INTO `base_dict` VALUES (1556996322223968256, 'WeChatMediaType', '微信媒体类型', b'1', '微信', '微信媒体类型', 1399985191002447872, '2022-08-09 21:30:25', 1399985191002447872, '2022-08-09 21:30:26', 0, 0); -INSERT INTO `base_dict` VALUES (1561003021674987520, 'SiteMessageReceive', '消息接收类型', b'1', '站内信', '站内信接收类型', 1399985191002447872, '2022-08-20 22:51:37', 1399985191002447872, '2022-08-20 22:51:37', 0, 0); -INSERT INTO `base_dict` VALUES (1561003189111603200, 'SiteMessageState', '消息发布状态', b'1', '站内信', '站内信消息发布状态', 1399985191002447872, '2022-08-20 22:52:17', 1399985191002447872, '2022-08-20 22:52:17', 0, 0); -INSERT INTO `base_dict` VALUES (1589527951317389312, 'DataScopePerm', '数据范围权限', b'1', '系统属性', '数据范围权限', 1414143554414059520, '2022-11-07 15:59:30', 1399985191002447872, '2022-12-09 22:09:25', 0, 3); -INSERT INTO `base_dict` VALUES (1633393287952257024, 'DatabaseType', '数据库类型', b'1', '开发', '数据库类型', 1414143554414059520, '2023-03-08 17:04:41', 1414143554414059520, '2023-03-08 17:04:41', 0, 0); -INSERT INTO `base_dict` VALUES (1688742690398617600, 'SmsChannel', '短信渠道商', b'1', '消息服务', '短信渠道商', 1414143554414059520, '2023-08-08 10:43:27', 1414143554414059520, '2023-08-12 20:24:03', 0, 1); -INSERT INTO `base_dict` VALUES (1690338321769918464, 'GeneralTemplateUseType', '通用模板类型', b'1', '系统属性', '通用模板类型', 1414143554414059520, '2023-08-12 20:23:56', 1414143554414059520, '2023-08-12 20:24:22', 0, 1); -INSERT INTO `base_dict` VALUES (1690338545284378624, 'GeneralTemplateState', '通用模板状态', b'1', '系统属性', '通用模板状态', 1414143554414059520, '2023-08-12 20:24:49', 1414143554414059520, '2023-08-12 20:24:49', 0, 0); - --- ---------------------------- --- Table structure for iam_dept --- ---------------------------- -DROP TABLE IF EXISTS `iam_dept`; -CREATE TABLE `iam_dept` ( - `id` bigint(20) NOT NULL COMMENT 'ID', - `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父机构ID', - `dept_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构/部门名称', - `sort_no` int(11) NOT NULL DEFAULT 0 COMMENT '排序', - `org_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '机构类别 1公司 2部门 3岗位', - `org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构编码', - `mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号', - `fax` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '传真', - `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', - `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门组织机构表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_dept --- ---------------------------- -INSERT INTO `iam_dept` VALUES (1259382878857957377, NULL, 'Bootx Platform总公司', 0, '1', '1', '', NULL, '济南市高新区齐鲁软件园', NULL, -1, '2020-05-10 15:20:51', -1, '2020-05-10 17:52:15', 4, 0); -INSERT INTO `iam_dept` VALUES (1477976804995026944, NULL, 'Bootx Cloud公司', 0, '1', '1', '', NULL, '济南市高新区汉峪金谷', '', 1399985191002447872, '2022-01-03 20:15:04', 1399985191002447872, '2022-01-03 20:15:05', 0, 1); -INSERT INTO `iam_dept` VALUES (1477977184768282624, NULL, 'Bootx Cloud公司', 0, '1', '1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:16:35', 1399985191002447872, '2022-01-03 20:16:35', 0, 1); -INSERT INTO `iam_dept` VALUES (1477977301365739520, NULL, 'Bootx Cloud总公司', 0, '1', '2', '', NULL, '济南市高新区汉峪金谷', '', 1399985191002447872, '2022-01-03 20:17:03', 1399985191002447872, '2022-01-03 20:17:03', 1, 0); -INSERT INTO `iam_dept` VALUES (1477977592291053568, 1259382878857957377, 'bp济南分公司', 0, '1', '1_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:18:12', 1399985191002447872, '2022-01-03 20:18:12', 1, 0); -INSERT INTO `iam_dept` VALUES (1477977690928500736, 1259382878857957377, '历城分公司', 0, '1', '1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:18:36', 1399985191002447872, '2022-01-03 20:18:36', 0, 1); -INSERT INTO `iam_dept` VALUES (1477977827897692160, 1259382878857957377, 'bp潍坊分公司', 0, '1', '1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:08', 1399985191002447872, '2022-01-03 20:19:08', 0, 0); -INSERT INTO `iam_dept` VALUES (1477977880947249152, 1477977301365739520, 'bc菏泽分公司', 0, '1', '2_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:21', 1399985191002447872, '2022-01-03 20:19:21', 0, 0); -INSERT INTO `iam_dept` VALUES (1477977930175795200, 1477977301365739520, 'bc日照分公司', 0, '1', '2_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:33', 1399985191002447872, '2022-01-03 20:19:33', 0, 0); -INSERT INTO `iam_dept` VALUES (1477978464559484928, 1477977592291053568, '历城办事部', 0, '2', '1_1_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:21:40', 1399985191002447872, '2022-01-03 20:21:40', 1, 0); -INSERT INTO `iam_dept` VALUES (1477978512177418240, 1477977592291053568, '历下办事部', 0, '2', '1_1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:21:51', 1399985191002447872, '2022-01-03 20:21:52', 0, 0); -INSERT INTO `iam_dept` VALUES (1477978610865197056, 1477977592291053568, '高新办事部', 0, '2', '1_1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:22:15', 1399985191002447872, '2022-01-03 20:22:15', 0, 0); -INSERT INTO `iam_dept` VALUES (1477978810526650368, 1477977827897692160, '奎文办事部', 0, '2', '1_2_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:23:03', 1399985191002447872, '2022-01-03 20:23:03', 0, 0); -INSERT INTO `iam_dept` VALUES (1477978883247493120, 1477977827897692160, '潍城办事部', 0, '2', '1_2_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:23:20', 1399985191002447872, '2022-01-03 20:23:20', 0, 0); - --- ---------------------------- --- Table structure for iam_data_scope --- ---------------------------- -DROP TABLE IF EXISTS `iam_data_scope`; -CREATE TABLE `iam_data_scope` ( - `id` bigint(20) NOT NULL COMMENT '角色ID', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编码', - `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `type` int(4) NOT NULL COMMENT '类型', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据范围权限' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_data_scope --- ---------------------------- -INSERT INTO `iam_data_scope` VALUES (1474706893178871808, 'self', '自身数据', 1, '只能查看自身范围的数据', 1399985191002447872, '2021-12-25 19:41:37', 1399985191002447872, '2021-12-25 19:41:37', 1, 0); -INSERT INTO `iam_data_scope` VALUES (1474717084985270272, 'user', '用户数据权限', 2, '用户数据权限', 1399985191002447872, '2021-12-25 20:22:07', 1399985191002447872, '2021-12-25 20:22:07', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1474717160671485952, 'dept', '部门权限', 3, '', 1399985191002447872, '2021-12-25 20:22:25', 1399985191002447872, '2021-12-25 20:22:25', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1474717276908232704, 'userAndDept', '用户和部门权限', 4, '', 1399985191002447872, '2021-12-25 20:22:52', 1399985191002447872, '2021-12-25 20:22:52', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1474717344562356224, 'all', '全部数据', 5, '', 1399985191002447872, '2021-12-25 20:23:09', 1399985191002447872, '2021-12-25 20:23:09', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1477990268903804928, 'belong_dept', '所在部门', 6, '', 1399985191002447872, '2022-01-03 21:08:34', 1399985191002447872, '2022-01-03 21:08:35', 0, 0); -INSERT INTO `iam_data_scope` VALUES (1477990290521247744, 'belong_dept', '所在部门', 6, '', 1399985191002447872, '2022-01-03 21:08:40', 1399985191002447872, '2022-01-03 21:08:40', 0, 1); -INSERT INTO `iam_data_scope` VALUES (1477990439800721408, 'belong_dept_and_sub', '所在及下级部门', 7, '', 1399985191002447872, '2022-01-03 21:09:15', 1399985191002447872, '2022-01-03 21:09:15', 0, 0); - --- ---------------------------- --- Table structure for iam_user_dept --- ---------------------------- -DROP TABLE IF EXISTS `iam_user_dept`; -CREATE TABLE `iam_user_dept` ( - `id` bigint(20) NOT NULL, - `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 = utf8 COLLATE = utf8_general_ci COMMENT = '用户部门关联表' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_user_dept +-- Records of base_dynamic_form -- ---------------------------- +INSERT INTO `base_dynamic_form` VALUES (1552656018381422592, '测试表单', 'test', '{\"list\":[{\"type\":\"input\",\"label\":\"输入框\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":true,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"aa\",\"key\":\"input_1659059676533\",\"help\":\"测试\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"textarea\",\"label\":\"文本框\",\"options\":{\"width\":\"100%\",\"minRows\":4,\"maxRows\":6,\"maxLength\":null,\"defaultValue\":\"\",\"clearable\":true,\"hidden\":false,\"disabled\":false,\"placeholder\":\"请输入\"},\"model\":\"bb\",\"key\":\"textarea_1659020414125\",\"help\":\"\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"slider\",\"label\":\"滑动输入条\",\"options\":{\"width\":\"100%\",\"defaultValue\":34,\"disabled\":false,\"hidden\":false,\"min\":0,\"max\":100,\"step\":1,\"showInput\":false},\"model\":\"cc\",\"key\":\"slider_1659020433092\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]}],\"config\":{\"layout\":\"horizontal\",\"labelCol\":{\"xs\":4,\"sm\":4,\"md\":4,\"lg\":4,\"xl\":4,\"xxl\":4},\"labelWidth\":100,\"labelLayout\":\"flex\",\"wrapperCol\":{\"xs\":18,\"sm\":18,\"md\":18,\"lg\":18,\"xl\":18,\"xxl\":18},\"hideRequiredMark\":false,\"customStyle\":\"\"}}', '测试动态表单', 1399985191002447872, '2022-07-28 22:03:36', 1399985191002447872, '2022-07-29 09:55:22', 0, 7); +INSERT INTO `base_dynamic_form` VALUES (1552656018381422593, '测试表单1', 'test1', '{\"list\":[{\"type\":\"input\",\"label\":\"申请人\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":true,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"apply_by\",\"key\":\"input_1659059676533\",\"help\":\"测试\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"input\",\"label\":\"请假天数\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":false,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"leave_days\",\"key\":\"input_1662106166142\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"textarea\",\"label\":\"备注\",\"options\":{\"width\":\"100%\",\"minRows\":4,\"maxRows\":6,\"maxLength\":null,\"defaultValue\":\"\",\"clearable\":true,\"hidden\":false,\"disabled\":false,\"placeholder\":\"请输入\"},\"model\":\"remark\",\"key\":\"textarea_1659020414125\",\"help\":\"\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"switch\",\"label\":\"开关\",\"options\":{\"defaultValue\":false,\"hidden\":false,\"disabled\":false},\"model\":\"switch_1662108221389\",\"key\":\"switch_1662108221389\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"slider\",\"label\":\"滑动输入条\",\"options\":{\"width\":\"100%\",\"defaultValue\":34,\"disabled\":false,\"hidden\":false,\"min\":0,\"max\":100,\"step\":1,\"showInput\":false},\"model\":\"cc\",\"key\":\"slider_1659020433092\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"table\",\"label\":\"表格布局\",\"trs\":[{\"tds\":[{\"colspan\":1,\"rowspan\":1,\"list\":[]},{\"colspan\":1,\"rowspan\":1,\"list\":[]}]},{\"tds\":[{\"colspan\":1,\"rowspan\":1,\"list\":[{\"type\":\"editor\",\"label\":\"富文本\",\"icon\":\"icon-LC_icon_edit_line_1\",\"list\":[],\"options\":{\"height\":300,\"placeholder\":\"请输入\",\"defaultValue\":\"\",\"chinesization\":true,\"hidden\":false,\"disabled\":false,\"showLabel\":false,\"width\":\"100%\"},\"model\":\"editor_1662106288134\",\"key\":\"editor_1662106288134\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]}]},{\"colspan\":1,\"rowspan\":1,\"list\":[]}]}],\"options\":{\"width\":\"100%\",\"bordered\":true,\"bright\":false,\"small\":true,\"customStyle\":\"\"},\"key\":\"table_1662106283652\"}],\"config\":{\"layout\":\"vertical\",\"labelCol\":{\"xs\":6,\"sm\":6,\"md\":6,\"lg\":6,\"xl\":6,\"xxl\":6},\"labelWidth\":100,\"labelLayout\":\"Grid\",\"wrapperCol\":{\"xs\":18,\"sm\":18,\"md\":18,\"lg\":18,\"xl\":18,\"xxl\":18},\"hideRequiredMark\":false,\"customStyle\":\"\"}}', '测试动态表单', 1399985191002447872, '2022-07-28 22:03:36', 1414143554414059520, '2022-09-02 16:44:01', 0, 12); -- ---------------------------- --- Table structure for iam_login_type +-- Table structure for base_general_template -- ---------------------------- -DROP TABLE IF EXISTS `iam_login_type`; -CREATE TABLE `iam_login_type` ( +DROP TABLE IF EXISTS `base_general_template`; +CREATE TABLE `base_general_template` ( `id` bigint(20) NOT NULL COMMENT '主键', - `code` varchar(21) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', - `internal` bit(1) NOT NULL COMMENT '是否系统内置', - `timeout` bigint(11) NULL DEFAULT NULL COMMENT '在线时长(秒)', - `captcha_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '验证码类型', - `captcha` bit(1) NOT NULL COMMENT '启用验证码', - `enable` bit(1) NOT NULL COMMENT '是否可用', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板名称', + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板代码', + `use_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '使用类型(导入/导出)', + `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板类型', + `file_suffix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板后缀名', + `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '状态', + `file_id` bigint(20) NULL DEFAULT NULL COMMENT '文件ID', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '删除标志', + `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登录方式' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '通用模板管理' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_login_type +-- Records of base_general_template -- ---------------------------- -INSERT INTO `iam_login_type` VALUES (1430430071299207168, 'password', '账号密码登陆', 'password', b'1', 3600, '-1', b'0', b'1', NULL, 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2022-11-03 22:24:53', 20, b'0'); -INSERT INTO `iam_login_type` VALUES (1430478946919653376, 'miniApp', '微信小程序', 'openId', b'0', 99999, '0', b'0', b'1', NULL, 1399985191002447872, '2021-08-25 18:35:33', 1399985191002447872, '2022-07-16 12:32:26', 3, b'0'); -INSERT INTO `iam_login_type` VALUES (1435138582839009280, 'phone', '手机短信登录', 'openId', b'0', 3600, '0', b'0', b'1', NULL, 1399985191002447872, '2021-09-07 15:11:16', 1399985191002447872, '2022-07-16 12:32:19', 5, b'0'); -INSERT INTO `iam_login_type` VALUES (1542091599907115008, 'dingTalk', '钉钉', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-06-29 18:24:23', 1399985191002447872, '2022-07-02 14:55:01', 5, b'0'); -INSERT INTO `iam_login_type` VALUES (1542804450312122368, 'weCom', '企业微信', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-07-01 17:37:00', 1399985191002447872, '2022-07-01 17:37:00', 0, b'0'); -INSERT INTO `iam_login_type` VALUES (1543126042909016064, 'weChat', '微信登录', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-07-02 14:54:53', 0, '2022-10-12 22:15:05', 2, b'0'); -INSERT INTO `iam_login_type` VALUES (1626845524617203712, 'passwordGoView', '可视化平台登录', 'password', b'0', 3600, '-1', b'0', b'1', '', 1414143554414059520, '2023-02-18 15:26:13', 1414143554414059520, '2023-02-18 15:26:13', 0, b'0'); -- ---------------------------- --- Table structure for demo_super_query +-- Table structure for base_key_value -- ---------------------------- -DROP TABLE IF EXISTS `demo_super_query`; -CREATE TABLE `demo_super_query` ( - `id` bigint(20) NOT NULL COMMENT '角色ID', - `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `age` int(5) NULL DEFAULT NULL COMMENT '年龄', - `vip` bit(1) NULL DEFAULT NULL COMMENT '是否vip', - `birthday` date NULL DEFAULT NULL COMMENT '生日', - `work_time` time(0) NULL DEFAULT NULL COMMENT '上班时间', - `registration_time` datetime(0) NULL DEFAULT NULL COMMENT '注册时间', - `political` 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 '备注', +DROP TABLE IF EXISTS `base_key_value`; +CREATE TABLE `base_key_value` ( + `id` bigint(20) NOT NULL, + `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数键名', + `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数值', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '超级查询演示' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'kv存储' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of demo_super_query +-- Records of base_key_value -- ---------------------------- -INSERT INTO `demo_super_query` VALUES (1496046463434567680, '小小明', 18, b'1', '1998-01-23', '08:30:00', '2022-02-22 16:57:27', '13', '这是备注', 1399985191002447872, '2022-02-22 16:57:27', 1399985191002447872, '2022-02-22 17:03:34', 1, 0); -INSERT INTO `demo_super_query` VALUES (1496372341213433856, '关羽', 52, b'1', '2000-02-23', '14:31:36', '2022-02-23 14:32:22', '1', '', 1399985191002447872, '2022-02-23 14:32:22', 1399985191002447872, '2022-02-23 14:32:22', 0, 0); -INSERT INTO `demo_super_query` VALUES (1496372489909899264, '张飞', 54, b'0', '1996-02-11', '08:00:00', '2022-02-23 14:32:58', '7', '备注', 1399985191002447872, '2022-02-23 14:32:58', 1399985191002447872, '2022-02-23 14:32:58', 0, 0); -INSERT INTO `demo_super_query` VALUES (1496372766427779072, '梁冀', 38, b'1', '1958-02-08', '08:30:00', '2022-02-23 14:34:03', '1', '', 1399985191002447872, '2022-02-23 14:34:03', 1399985191002447872, '2022-02-23 14:34:03', 0, 0); -INSERT INTO `demo_super_query` VALUES (1496373512871284736, '刘备', 108, b'0', '1993-11-12', '09:30:10', '2022-02-23 14:37:01', '2', '刘羽禅的粑粑', 1399985191002447872, '2022-02-23 14:37:01', 1399985191002447872, '2022-02-23 14:37:01', 0, 0); -- ---------------------------- -- Table structure for base_param @@ -3903,9 +3677,9 @@ CREATE TABLE `base_param` ( `internal` bit(1) NOT NULL COMMENT '内置参数', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE @@ -3916,158 +3690,182 @@ CREATE TABLE `base_param` ( -- ---------------------------- INSERT INTO `base_param` VALUES (1452842684284891136, '测试', 'test.v1', '123', 1, b'1', b'0', NULL, 1399985191002447872, '2021-10-26 11:41:03', 1399985191002447872, '2021-10-26 11:41:03', 0, 0); INSERT INTO `base_param` VALUES (1520668030248361984, '文件服务器地址', 'FileServerUrl', 'http://127.0.0.1:9999', 1, b'1', b'1', '', 1399985191002447872, '2022-05-01 15:34:46', 1399985191002447872, '2022-05-19 12:53:21', 0, 5); -INSERT INTO `base_param` VALUES (1529281530059161600, 'websocket服务器地址', 'WebsocketServerUrl', 'ws://127.0.0.1:9999', 1, b'1', b'1', '', 1399985191002447872, '2022-05-25 10:01:44', 1399985191002447872, '2022-05-25 10:01:44', 0, 0); +INSERT INTO `base_param` VALUES (1529281530059161600, 'websocket服务器地址', 'WebsocketServerUrl', 'ws://127.0.0.1:9999', 1, b'1', b'1', '', 1399985191002447872, '2022-05-25 10:01:44', 1399985191002447872, '2023-10-21 22:31:38', 0, 2); INSERT INTO `base_param` VALUES (1545765299880448000, '服务器地址', 'ServerUrl', 'http://127.0.0.1:9999', 1, b'1', b'1', '优先级高于配置文件内进行的配置', 1399985191002447872, '2022-07-09 21:42:21', 1414143554414059520, '2023-08-05 16:40:05', 0, 1); INSERT INTO `base_param` VALUES (1547511252795912192, '微信jsapi支付回调服务地址', 'JsapiRedirectUrl', 'http://127.0.0.1/api/', 1, b'1', b'1', '用于微信扫码登录使用', 1414143554414059520, '2022-07-14 17:20:09', 1414143554414059520, '2023-08-18 15:49:21', 0, 1); -- ---------------------------- --- Table structure for iam_role +-- Table structure for base_province -- ---------------------------- -DROP TABLE IF EXISTS `iam_role`; -CREATE TABLE `iam_role` ( - `id` bigint(20) NOT NULL COMMENT '角色ID', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编码', - `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `internal` bit(1) NOT NULL COMMENT '是否系统内置', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `base_province`; +CREATE TABLE `base_province` ( + `code` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '省份编码', + `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '省份名称', + PRIMARY KEY (`code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '省份表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_role +-- Records of base_province -- ---------------------------- -INSERT INTO `iam_role` VALUES (1405414804771971072, 'admin', '管理员', b'1', '管理员', 1, '2021-06-17 14:39:35', 1399985191002447872, '2021-07-18 22:31:02', 6, 0); -INSERT INTO `iam_role` VALUES (1416730722714144768, 'test', '测试', b'0', '测试角色', 1399985191002447872, '2021-07-18 20:05:01', 1399985191002447872, '2021-07-18 20:16:15', 1, 0); -INSERT INTO `iam_role` VALUES (1422832797731778562, 'user', '用户', b'0', '用户角色', 0, '2021-08-04 16:12:29', 1399985191002447872, '2021-08-04 16:15:03', 7, 1); -INSERT INTO `iam_role` VALUES (1428891259564445696, 'manager', '管理者', b'0', 'manager管理者', 1399985191002447872, '2021-08-21 09:26:38', 1399985191002447872, '2021-08-21 09:26:39', 0, 1); +INSERT INTO `base_province` VALUES ('11', '北京市'); +INSERT INTO `base_province` VALUES ('12', '天津市'); +INSERT INTO `base_province` VALUES ('13', '河北省'); +INSERT INTO `base_province` VALUES ('14', '山西省'); +INSERT INTO `base_province` VALUES ('15', '内蒙古自治区'); +INSERT INTO `base_province` VALUES ('21', '辽宁省'); +INSERT INTO `base_province` VALUES ('22', '吉林省'); +INSERT INTO `base_province` VALUES ('23', '黑龙江省'); +INSERT INTO `base_province` VALUES ('31', '上海市'); +INSERT INTO `base_province` VALUES ('32', '江苏省'); +INSERT INTO `base_province` VALUES ('33', '浙江省'); +INSERT INTO `base_province` VALUES ('34', '安徽省'); +INSERT INTO `base_province` VALUES ('35', '福建省'); +INSERT INTO `base_province` VALUES ('36', '江西省'); +INSERT INTO `base_province` VALUES ('37', '山东省'); +INSERT INTO `base_province` VALUES ('41', '河南省'); +INSERT INTO `base_province` VALUES ('42', '湖北省'); +INSERT INTO `base_province` VALUES ('43', '湖南省'); +INSERT INTO `base_province` VALUES ('44', '广东省'); +INSERT INTO `base_province` VALUES ('45', '广西壮族自治区'); +INSERT INTO `base_province` VALUES ('46', '海南省'); +INSERT INTO `base_province` VALUES ('50', '重庆市'); +INSERT INTO `base_province` VALUES ('51', '四川省'); +INSERT INTO `base_province` VALUES ('52', '贵州省'); +INSERT INTO `base_province` VALUES ('53', '云南省'); +INSERT INTO `base_province` VALUES ('54', '西藏自治区'); +INSERT INTO `base_province` VALUES ('61', '陕西省'); +INSERT INTO `base_province` VALUES ('62', '甘肃省'); +INSERT INTO `base_province` VALUES ('63', '青海省'); +INSERT INTO `base_province` VALUES ('64', '宁夏回族自治区'); +INSERT INTO `base_province` VALUES ('65', '新疆维吾尔自治区'); -- ---------------------------- --- Table structure for iam_client +-- Table structure for base_query_sql -- ---------------------------- -DROP TABLE IF EXISTS `iam_client`; -CREATE TABLE `iam_client` ( +DROP TABLE IF EXISTS `base_query_sql`; +CREATE TABLE `base_query_sql` ( `id` bigint(20) NOT NULL COMMENT '主键', - `code` varchar(21) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `internal` bit(1) NOT NULL COMMENT '是否系统内置', - `enable` bit(1) NOT NULL COMMENT '是否可用', - `default_endow` bit(1) NULL DEFAULT NULL COMMENT '新注册的用户是否默认赋予该终端', - `login_type_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联登录方式\r\n', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `database_id` bigint(20) NULL DEFAULT NULL COMMENT '数据源ID', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称', + `is_list` bit(1) NULL DEFAULT NULL COMMENT '是否集合', + `sql` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'sql语句', + `params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'SQL查询参数', + `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'SQL查询结果字段', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '认证终端' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_client --- ---------------------------- -INSERT INTO `iam_client` VALUES (1430430071299207168, 'admin', 'pc管理端', b'1', b'1', b'1', '1430430071299207168,1435138582839009280,1430478946919653376,1542091599907115008,1542804450312122368,1543126042909016064', 'pc浏览器', 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2023-10-19 19:58:31', 5, b'0'); -INSERT INTO `iam_client` VALUES (1430430071299207169, 'h5', 'h5端', b'1', b'1', b'1', '1430430071299207168,1435138582839009280', '手机wap', 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2023-10-19 19:58:27', 2, b'0'); -INSERT INTO `iam_client` VALUES (1580487061605175296, 'adminv3', 'pc管理端(vue3版)', b'0', b'1', b'1', '1430430071299207168,1430478946919653376,1435138582839009280,1542091599907115008,1542804450312122368,1543126042909016064', 'vue3版本', 1399985191002447872, '2022-10-13 17:14:14', 1399985191002447872, '2023-10-19 19:58:21', 3, b'0'); -INSERT INTO `iam_client` VALUES (1626840094767714304, 'GoView', '可视化平台', b'0', b'1', b'1', '1430430071299207168', '', 1414143554414059520, '2023-02-18 15:04:38', 1399985191002447872, '2023-10-19 19:58:34', 1, b'0'); +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'SQL查询语句' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Table structure for demo_data_perm +-- Records of base_query_sql -- ---------------------------- -DROP TABLE IF EXISTS `demo_data_perm`; -CREATE TABLE `demo_data_perm` ( - `id` bigint(20) NOT NULL COMMENT '角色ID', - `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `creator_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者名称', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据权限演示' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of demo_data_perm +-- Table structure for base_street -- ---------------------------- -INSERT INTO `demo_data_perm` VALUES (1495969849707220992, '33', 'xxm', '444', 1399985191002447872, '2022-02-22 11:53:01', 1399985191002447872, '2022-02-22 11:53:01', 0, 0); -INSERT INTO `demo_data_perm` VALUES (1506921683460521984, '测试', '小小明', NULL, 1399985191002447872, '2022-03-24 17:11:41', 1399985191002447872, '2022-03-24 17:11:41', 0, 0); -INSERT INTO `demo_data_perm` VALUES (1531547191561072640, '测试', '测试', '123', 1435967884114194432, '2022-05-31 16:04:40', 1435967884114194432, '2022-05-31 16:04:40', 0, 0); +DROP TABLE IF EXISTS `base_street`; +CREATE TABLE `base_street` ( + `code` char(9) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编码', + `name` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '街道名称', + `area_code` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '县区编码', + PRIMARY KEY (`code`) USING BTREE, + INDEX `inx_area_code`(`area_code`) USING BTREE COMMENT '县区' +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '街道表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Table structure for starter_quartz_job +-- Records of base_street -- ---------------------------- -DROP TABLE IF EXISTS `starter_quartz_job`; -CREATE TABLE `starter_quartz_job` ( + +-- ---------------------------- +-- Table structure for base_village +-- ---------------------------- +DROP TABLE IF EXISTS `base_village`; +CREATE TABLE `base_village` ( + `code` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '编码', + `name` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '名称', + `street_code` char(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '社区/乡镇编码', + PRIMARY KEY (`code`) USING BTREE, + INDEX `inx_street_code`(`street_code`) USING BTREE COMMENT '所属街道索引' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '村庄/社区' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of base_village +-- ---------------------------- + +-- ---------------------------- +-- Table structure for common_sequence_range +-- ---------------------------- +DROP TABLE IF EXISTS `common_sequence_range`; +CREATE TABLE `common_sequence_range` ( `id` bigint(20) NOT NULL COMMENT '主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务名称', - `job_class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务类名', - `cron` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'cron表达式', - `parameter` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数', - `state` int(4) NULL DEFAULT NULL COMMENT '状态', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `range_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '区间key', + `range_value` bigint(20) NOT NULL COMMENT '区间开始值', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '序列生成器队列区间管理' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_quartz_job +-- Records of common_sequence_range -- ---------------------------- -INSERT INTO `starter_quartz_job` VALUES (1456579473573867520, '测试任务', 'cn.bootx.starter.quartz.task.TestTask', '50 0 * * * ? *', '{\"aaa\":\"5255\"}', 0, '测试任务', 1399985191002447872, '2021-11-05 19:09:43', 1399985191002447872, '2022-06-22 00:37:48', 25, 0); -INSERT INTO `starter_quartz_job` VALUES (1546857070483939328, '支付单超时检测', 'cn.bootx.payment.task.PayExpiredTimeTask', '0/5 * * * * ? *', NULL, 1, '检测超时的支付单, 超时后发送超时事件', 1399985191002447872, '2022-07-12 22:00:39', 1399985191002447872, '2022-07-12 22:00:45', 1, 0); +INSERT INTO `common_sequence_range` VALUES (1470679520373862400, 'Sequence:cs', 2006, 0, '2021-12-14 16:58:16', 0, '2021-12-14 16:58:16', 6, 0); +INSERT INTO `common_sequence_range` VALUES (1470679955230908416, 'cs', 2020, 0, '2021-12-14 17:00:00', 0, '2021-12-14 17:00:00', 13, 0); -- ---------------------------- --- Table structure for starter_audit_data_version +-- Table structure for demo_data_encrypt -- ---------------------------- -DROP TABLE IF EXISTS `starter_audit_data_version`; -CREATE TABLE `starter_audit_data_version` ( +DROP TABLE IF EXISTS `demo_data_encrypt`; +CREATE TABLE `demo_data_encrypt` ( `id` bigint(20) NOT NULL, - `table_name` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据表名称', - `data_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据名称', - `data_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据主键', - `data_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '数据内容', - `change_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '数据更新内容', - `version` int(10) NOT NULL COMMENT '版本', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据版本日志' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据加密解密演示' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_audit_data_version +-- Records of demo_data_encrypt -- ---------------------------- -INSERT INTO `starter_audit_data_version` VALUES (1480550993828446208, '', 'client', '1', '{\"dataName\":\"client\",\"dataId\":\"1\",\"dataContent\":{\"id\":\"1\",\"creator\":null,\"createTime\":\"2022-01-10 22:43:58\",\"lastModifier\":null,\"lastModifiedTime\":null,\"deleted\":false,\"version\":0,\"code\":null,\"name\":null,\"timeout\":null,\"captcha\":false,\"enable\":false,\"description\":null}}', NULL, 1, 0, '2022-01-10 22:43:59'); -INSERT INTO `starter_audit_data_version` VALUES (1480551021779288064, '', 'client', '1', '{\"dataName\":\"client\",\"dataId\":\"1\",\"dataContent\":{\"id\":\"1\",\"creator\":null,\"createTime\":\"2022-01-10 22:44:05\",\"lastModifier\":null,\"lastModifiedTime\":null,\"deleted\":false,\"version\":0,\"code\":null,\"name\":null,\"timeout\":null,\"captcha\":false,\"enable\":false,\"description\":null}}', NULL, 2, 0, '2022-01-10 22:44:06'); +INSERT INTO `demo_data_encrypt` VALUES (1506922411881103360, '测试加密效果', 'eI2RIrRLG+QUna3jMK+kejyJTTKdPFhaYWP4EhktJ2lkGTEsIxZesetNTzcqUA934ZN/OUdw4aj4t5Q+u1sH7A==', 1399985191002447872, '2022-03-24 17:14:35', 1399985191002447872, '2022-03-24 17:23:41', 1, 0); +INSERT INTO `demo_data_encrypt` VALUES (1506943412354408448, '测试下', 'Dgv5OSNiXuknceoZzeOUOQ==', 1399985191002447872, '2022-03-24 17:14:35', 1399985191002447872, '2022-03-24 17:23:41', 1, 0); -- ---------------------------- --- Table structure for iam_data_scope_dept +-- Table structure for demo_data_perm -- ---------------------------- -DROP TABLE IF EXISTS `iam_data_scope_dept`; -CREATE TABLE `iam_data_scope_dept` ( - `id` bigint(20) NOT NULL, - `data_scope_id` bigint(20) NOT NULL COMMENT '数据范围id', - `dept_id` bigint(20) NOT NULL COMMENT '部门id', +DROP TABLE IF EXISTS `demo_data_perm`; +CREATE TABLE `demo_data_perm` ( + `id` bigint(20) NOT NULL COMMENT '角色ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `creator_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者名称', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据范围部门关联配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据权限演示' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_data_scope_dept +-- Records of demo_data_perm -- ---------------------------- -INSERT INTO `iam_data_scope_dept` VALUES (1478742690014101504, 1474717160671485952, 1477978464559484928); -INSERT INTO `iam_data_scope_dept` VALUES (1478742920071675904, 1474717160671485952, 1477977592291053568); +INSERT INTO `demo_data_perm` VALUES (1495969849707220992, '33', 'xxm', '444', 1399985191002447872, '2022-02-22 11:53:01', 1399985191002447872, '2022-02-22 11:53:01', 0, 0); +INSERT INTO `demo_data_perm` VALUES (1506921683460521984, '测试', '小小明', NULL, 1399985191002447872, '2022-03-24 17:11:41', 1399985191002447872, '2022-03-24 17:11:41', 0, 0); +INSERT INTO `demo_data_perm` VALUES (1531547191561072640, '测试', '测试', '123', 1435967884114194432, '2022-05-31 16:04:40', 1435967884114194432, '2022-05-31 16:04:40', 0, 0); -- ---------------------------- -- Table structure for demo_data_sensitive @@ -4083,9 +3881,9 @@ CREATE TABLE `demo_data_sensitive` ( `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电子邮件', `other` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '其他', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE @@ -4098,737 +3896,822 @@ INSERT INTO `demo_data_sensitive` VALUES (1506942377435037696, '刘向东', '123 INSERT INTO `demo_data_sensitive` VALUES (1506943326094352384, '成是非', '99885511', '101278112512107721', '18855446622', '汉S123456', 'chengshifei@foxmail.com', '这个就是就是就是就是就是就是这样的', 1399985191002447872, '2022-03-24 18:33:55', 1399985191002447872, '2022-03-24 18:35:00', 1, 0); -- ---------------------------- --- Table structure for demo_data_encrypt +-- Table structure for demo_super_query -- ---------------------------- -DROP TABLE IF EXISTS `demo_data_encrypt`; -CREATE TABLE `demo_data_encrypt` ( - `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容', +DROP TABLE IF EXISTS `demo_super_query`; +CREATE TABLE `demo_super_query` ( + `id` bigint(20) NOT NULL COMMENT '角色ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `age` int(5) NULL DEFAULT NULL COMMENT '年龄', + `vip` bit(1) NULL DEFAULT NULL COMMENT '是否vip', + `birthday` date NULL DEFAULT NULL COMMENT '生日', + `work_time` time NULL DEFAULT NULL COMMENT '上班时间', + `registration_time` datetime NULL DEFAULT NULL COMMENT '注册时间', + `political` 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 '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据加密解密演示' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '超级查询演示' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of demo_data_encrypt +-- Records of demo_super_query -- ---------------------------- -INSERT INTO `demo_data_encrypt` VALUES (1506922411881103360, '测试加密效果', 'eI2RIrRLG+QUna3jMK+kejyJTTKdPFhaYWP4EhktJ2lkGTEsIxZesetNTzcqUA934ZN/OUdw4aj4t5Q+u1sH7A==', 1399985191002447872, '2022-03-24 17:14:35', 1399985191002447872, '2022-03-24 17:23:41', 1, 0); -INSERT INTO `demo_data_encrypt` VALUES (1506943412354408448, '测试下', 'Dgv5OSNiXuknceoZzeOUOQ==', 1399985191002447872, '2022-03-24 17:14:35', 1399985191002447872, '2022-03-24 17:23:41', 1, 0); +INSERT INTO `demo_super_query` VALUES (1496046463434567680, '小小明', 18, b'1', '1998-01-23', '08:30:00', '2022-02-22 16:57:27', '13', '这是备注', 1399985191002447872, '2022-02-22 16:57:27', 1399985191002447872, '2022-02-22 17:03:34', 1, 0); +INSERT INTO `demo_super_query` VALUES (1496372341213433856, '关羽', 52, b'1', '2000-02-23', '14:31:36', '2022-02-23 14:32:22', '1', '', 1399985191002447872, '2022-02-23 14:32:22', 1399985191002447872, '2022-02-23 14:32:22', 0, 0); +INSERT INTO `demo_super_query` VALUES (1496372489909899264, '张飞', 54, b'0', '1996-02-11', '08:00:00', '2022-02-23 14:32:58', '7', '备注', 1399985191002447872, '2022-02-23 14:32:58', 1399985191002447872, '2022-02-23 14:32:58', 0, 0); +INSERT INTO `demo_super_query` VALUES (1496372766427779072, '梁冀', 38, b'1', '1958-02-08', '08:30:00', '2022-02-23 14:34:03', '1', '', 1399985191002447872, '2022-02-23 14:34:03', 1399985191002447872, '2022-02-23 14:34:03', 0, 0); +INSERT INTO `demo_super_query` VALUES (1496373512871284736, '刘备', 108, b'0', '1993-11-12', '09:30:10', '2022-02-23 14:37:01', '2', '刘羽禅的粑粑', 1399985191002447872, '2022-02-23 14:37:01', 1399985191002447872, '2022-02-23 14:37:01', 0, 0); -- ---------------------------- --- Table structure for common_sequence_range +-- Table structure for iam_client -- ---------------------------- -DROP TABLE IF EXISTS `common_sequence_range`; -CREATE TABLE `common_sequence_range` ( +DROP TABLE IF EXISTS `iam_client`; +CREATE TABLE `iam_client` ( `id` bigint(20) NOT NULL COMMENT '主键', - `range_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '区间key', - `range_value` bigint(20) NOT NULL COMMENT '区间开始值', + `code` varchar(21) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `internal` bit(1) NOT NULL COMMENT '是否系统内置', + `enable` bit(1) NOT NULL COMMENT '是否可用', + `default_endow` bit(1) NULL DEFAULT NULL COMMENT '新注册的用户是否默认赋予该终端', + `login_type_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联登录方式\r\n', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '认证终端' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of iam_client +-- ---------------------------- +INSERT INTO `iam_client` VALUES (1430430071299207168, 'admin', 'pc管理端', b'1', b'1', b'1', '1430430071299207168,1435138582839009280,1430478946919653376,1542091599907115008,1542804450312122368,1543126042909016064', 'pc浏览器', 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2023-10-19 19:58:31', 5, b'0'); +INSERT INTO `iam_client` VALUES (1430430071299207169, 'h5', 'h5端', b'1', b'1', b'1', '1430430071299207168,1435138582839009280', '手机wap', 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2023-10-19 19:58:27', 2, b'0'); +INSERT INTO `iam_client` VALUES (1580487061605175296, 'adminv3', 'pc管理端(vue3版)', b'0', b'1', b'1', '1430430071299207168,1430478946919653376,1435138582839009280,1542091599907115008,1542804450312122368,1543126042909016064', 'vue3版本', 1399985191002447872, '2022-10-13 17:14:14', 1399985191002447872, '2023-10-19 19:58:21', 3, b'0'); +INSERT INTO `iam_client` VALUES (1626840094767714304, 'GoView', '可视化平台', b'0', b'1', b'1', '1430430071299207168', '', 1414143554414059520, '2023-02-18 15:04:38', 1399985191002447872, '2023-10-19 19:58:34', 1, b'0'); + +-- ---------------------------- +-- Table structure for iam_data_role +-- ---------------------------- +DROP TABLE IF EXISTS `iam_data_role`; +CREATE TABLE `iam_data_role` ( + `id` bigint(20) NOT NULL COMMENT '角色ID', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编码', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '序列生成器队列区间管理' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据范围权限' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of common_sequence_range +-- Records of iam_data_role -- ---------------------------- -INSERT INTO `common_sequence_range` VALUES (1470679520373862400, 'Sequence:cs', 2006, 0, '2021-12-14 16:58:16', 0, '2021-12-14 16:58:16', 6, 0); -INSERT INTO `common_sequence_range` VALUES (1470679955230908416, 'cs', 2020, 0, '2021-12-14 17:00:00', 0, '2021-12-14 17:00:00', 13, 0); +INSERT INTO `iam_data_role` VALUES (1474706893178871808, 'self', '自身数据', 'self', '只能查看自身范围的数据', 1399985191002447872, '2021-12-25 19:41:37', 1399985191002447872, '2021-12-25 19:41:37', 0, 0); +INSERT INTO `iam_data_role` VALUES (1474717084985270272, 'user', '用户(测试)', 'user', '用户数据权限', 1399985191002447872, '2021-12-25 20:22:07', 1399985191002447872, '2023-11-29 10:34:24', 1, 0); +INSERT INTO `iam_data_role` VALUES (1474717160671485952, 'dept', '部门(测试)', 'dept', '', 1399985191002447872, '2021-12-25 20:22:25', 1399985191002447872, '2023-11-29 10:34:04', 1, 0); +INSERT INTO `iam_data_role` VALUES (1474717276908232704, 'userAndDept', '用户和部门(测试)', 'dept_and_user', '', 1399985191002447872, '2021-12-25 20:22:52', 1399985191002447872, '2023-11-29 10:34:13', 1, 0); +INSERT INTO `iam_data_role` VALUES (1474717344562356224, 'all', '全部数据', 'all', '', 1399985191002447872, '2021-12-25 20:23:09', 1399985191002447872, '2023-11-29 10:28:40', 1, 0); +INSERT INTO `iam_data_role` VALUES (1477990268903804928, 'self_dept', '所在部门', 'self_dept', '', 1399985191002447872, '2022-01-03 21:08:34', 1399985191002447872, '2023-11-29 10:33:38', 5, 0); +INSERT INTO `iam_data_role` VALUES (1477990439800721408, 'self_dept_and_sub', '当前加下级部门', 'self_dept_sub', '', 1399985191002447872, '2022-01-03 21:09:15', 1399985191002447872, '2023-11-29 13:55:12', 9, 0); -- ---------------------------- --- Table structure for base_dynamic_form +-- Table structure for iam_data_role_dept -- ---------------------------- -DROP TABLE IF EXISTS `base_dynamic_form`; -CREATE TABLE `base_dynamic_form` ( +DROP TABLE IF EXISTS `iam_data_role_dept`; +CREATE TABLE `iam_data_role_dept` ( `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单名称', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '表单键名', - `value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '表单内容', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(8) NOT NULL COMMENT '版本', + `role_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_bin COMMENT = '动态表单' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据范围部门关联配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_dynamic_form +-- Records of iam_data_role_dept -- ---------------------------- -INSERT INTO `base_dynamic_form` VALUES (1552656018381422592, '测试表单', 'test', '{\"list\":[{\"type\":\"input\",\"label\":\"输入框\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":true,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"aa\",\"key\":\"input_1659059676533\",\"help\":\"测试\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"textarea\",\"label\":\"文本框\",\"options\":{\"width\":\"100%\",\"minRows\":4,\"maxRows\":6,\"maxLength\":null,\"defaultValue\":\"\",\"clearable\":true,\"hidden\":false,\"disabled\":false,\"placeholder\":\"请输入\"},\"model\":\"bb\",\"key\":\"textarea_1659020414125\",\"help\":\"\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"slider\",\"label\":\"滑动输入条\",\"options\":{\"width\":\"100%\",\"defaultValue\":34,\"disabled\":false,\"hidden\":false,\"min\":0,\"max\":100,\"step\":1,\"showInput\":false},\"model\":\"cc\",\"key\":\"slider_1659020433092\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]}],\"config\":{\"layout\":\"horizontal\",\"labelCol\":{\"xs\":4,\"sm\":4,\"md\":4,\"lg\":4,\"xl\":4,\"xxl\":4},\"labelWidth\":100,\"labelLayout\":\"flex\",\"wrapperCol\":{\"xs\":18,\"sm\":18,\"md\":18,\"lg\":18,\"xl\":18,\"xxl\":18},\"hideRequiredMark\":false,\"customStyle\":\"\"}}', '测试动态表单', 1399985191002447872, '2022-07-28 22:03:36', 1399985191002447872, '2022-07-29 09:55:22', 0, 7); -INSERT INTO `base_dynamic_form` VALUES (1552656018381422593, '测试表单1', 'test1', '{\"list\":[{\"type\":\"input\",\"label\":\"申请人\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":true,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"apply_by\",\"key\":\"input_1659059676533\",\"help\":\"测试\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"input\",\"label\":\"请假天数\",\"options\":{\"type\":\"text\",\"width\":\"100%\",\"defaultValue\":\"\",\"placeholder\":\"请输入\",\"clearable\":false,\"maxLength\":null,\"addonBefore\":\"\",\"addonAfter\":\"\",\"hidden\":false,\"disabled\":false},\"model\":\"leave_days\",\"key\":\"input_1662106166142\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"textarea\",\"label\":\"备注\",\"options\":{\"width\":\"100%\",\"minRows\":4,\"maxRows\":6,\"maxLength\":null,\"defaultValue\":\"\",\"clearable\":true,\"hidden\":false,\"disabled\":false,\"placeholder\":\"请输入\"},\"model\":\"remark\",\"key\":\"textarea_1659020414125\",\"help\":\"\",\"rules\":[{\"required\":true,\"message\":\"必填项\"}]},{\"type\":\"switch\",\"label\":\"开关\",\"options\":{\"defaultValue\":false,\"hidden\":false,\"disabled\":false},\"model\":\"switch_1662108221389\",\"key\":\"switch_1662108221389\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"slider\",\"label\":\"滑动输入条\",\"options\":{\"width\":\"100%\",\"defaultValue\":34,\"disabled\":false,\"hidden\":false,\"min\":0,\"max\":100,\"step\":1,\"showInput\":false},\"model\":\"cc\",\"key\":\"slider_1659020433092\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]},{\"type\":\"table\",\"label\":\"表格布局\",\"trs\":[{\"tds\":[{\"colspan\":1,\"rowspan\":1,\"list\":[]},{\"colspan\":1,\"rowspan\":1,\"list\":[]}]},{\"tds\":[{\"colspan\":1,\"rowspan\":1,\"list\":[{\"type\":\"editor\",\"label\":\"富文本\",\"icon\":\"icon-LC_icon_edit_line_1\",\"list\":[],\"options\":{\"height\":300,\"placeholder\":\"请输入\",\"defaultValue\":\"\",\"chinesization\":true,\"hidden\":false,\"disabled\":false,\"showLabel\":false,\"width\":\"100%\"},\"model\":\"editor_1662106288134\",\"key\":\"editor_1662106288134\",\"help\":\"\",\"rules\":[{\"required\":false,\"message\":\"必填项\"}]}]},{\"colspan\":1,\"rowspan\":1,\"list\":[]}]}],\"options\":{\"width\":\"100%\",\"bordered\":true,\"bright\":false,\"small\":true,\"customStyle\":\"\"},\"key\":\"table_1662106283652\"}],\"config\":{\"layout\":\"vertical\",\"labelCol\":{\"xs\":6,\"sm\":6,\"md\":6,\"lg\":6,\"xl\":6,\"xxl\":6},\"labelWidth\":100,\"labelLayout\":\"Grid\",\"wrapperCol\":{\"xs\":18,\"sm\":18,\"md\":18,\"lg\":18,\"xl\":18,\"xxl\":18},\"hideRequiredMark\":false,\"customStyle\":\"\"}}', '测试动态表单', 1399985191002447872, '2022-07-28 22:03:36', 1414143554414059520, '2022-09-02 16:44:01', 0, 12); -- ---------------------------- --- Table structure for notice_message_template +-- Table structure for iam_data_role_user -- ---------------------------- -DROP TABLE IF EXISTS `notice_message_template`; -CREATE TABLE `notice_message_template` ( +DROP TABLE IF EXISTS `iam_data_role_user`; +CREATE TABLE `iam_data_role_user` ( `id` bigint(20) NOT NULL, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模板数据', - `type` varchar(50) 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 '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `role_id` bigint(20) NOT NULL COMMENT '数据角色id', + `user_id` bigint(20) NOT NULL COMMENT '用户id', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息模板' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据范围用户关联配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_message_template +-- Records of iam_data_role_user -- ---------------------------- -INSERT INTO `notice_message_template` VALUES (1424936204932169730, 'cs', '测试', 'hello ${msg}6666666666666666666666666666', '1', '测试模板', 0, '2021-08-10 11:30:40', 0, '2021-08-10 11:30:40', 0, 0); -- ---------------------------- --- Table structure for iam_user_info +-- Table structure for iam_dept -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_info`; -CREATE TABLE `iam_user_info` ( - `id` bigint(20) NOT NULL, - `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', - `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号', - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码', - `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '手机号', - `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱', - `client_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '关联终端ds', - `administrator` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否超级管理员', - `status` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号状态', +DROP TABLE IF EXISTS `iam_dept`; +CREATE TABLE `iam_dept` ( + `id` bigint(20) NOT NULL COMMENT 'ID', + `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父机构ID', + `dept_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构/部门名称', + `sort_no` int(11) NOT NULL DEFAULT 0 COMMENT '排序', + `org_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '机构类别 1公司 2部门 3岗位', + `org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构编码', + `mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号', + `fax` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '传真', + `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', + `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门组织机构表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_info +-- Records of iam_dept -- ---------------------------- -INSERT INTO `iam_user_info` VALUES (1399985191002447872, 'Bootx', 'bootx', 'f52020dca765fd3943ed40a615dc2c5c', '13333333333', 'bootx@bootx.com', '1430430071299207168,1430430071299207169,1626840094767714304,1580487061605175296', b'1', 'norm', 1, '2021-06-02 15:04:15', 1399985191002447872, '2023-10-19 14:14:46', 58, 0); +INSERT INTO `iam_dept` VALUES (1259382878857957377, NULL, 'Bootx Platform总公司', 0, '1', '1', '', NULL, '济南市高新区齐鲁软件园', NULL, -1, '2020-05-10 15:20:51', -1, '2020-05-10 17:52:15', 4, 0); +INSERT INTO `iam_dept` VALUES (1477976804995026944, NULL, 'Bootx Cloud公司', 0, '1', '1', '', NULL, '济南市高新区汉峪金谷', '', 1399985191002447872, '2022-01-03 20:15:04', 1399985191002447872, '2022-01-03 20:15:05', 0, 1); +INSERT INTO `iam_dept` VALUES (1477977184768282624, NULL, 'Bootx Cloud公司', 0, '1', '1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:16:35', 1399985191002447872, '2022-01-03 20:16:35', 0, 1); +INSERT INTO `iam_dept` VALUES (1477977301365739520, NULL, 'Bootx Cloud总公司', 0, '1', '2', '', NULL, '济南市高新区汉峪金谷', '', 1399985191002447872, '2022-01-03 20:17:03', 1399985191002447872, '2022-01-03 20:17:03', 1, 0); +INSERT INTO `iam_dept` VALUES (1477977592291053568, 1259382878857957377, 'bp济南分公司', 0, '1', '1_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:18:12', 1399985191002447872, '2022-01-03 20:18:12', 1, 0); +INSERT INTO `iam_dept` VALUES (1477977690928500736, 1259382878857957377, '历城分公司', 0, '1', '1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:18:36', 1399985191002447872, '2022-01-03 20:18:36', 0, 1); +INSERT INTO `iam_dept` VALUES (1477977827897692160, 1259382878857957377, 'bp潍坊分公司', 0, '1', '1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:08', 1399985191002447872, '2022-01-03 20:19:08', 0, 0); +INSERT INTO `iam_dept` VALUES (1477977880947249152, 1477977301365739520, 'bc菏泽分公司', 0, '1', '2_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:21', 1399985191002447872, '2022-01-03 20:19:21', 0, 0); +INSERT INTO `iam_dept` VALUES (1477977930175795200, 1477977301365739520, 'bc日照分公司', 0, '1', '2_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:19:33', 1399985191002447872, '2022-01-03 20:19:33', 0, 0); +INSERT INTO `iam_dept` VALUES (1477978464559484928, 1477977592291053568, '历城办事部', 0, '2', '1_1_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:21:40', 1399985191002447872, '2022-01-03 20:21:40', 1, 0); +INSERT INTO `iam_dept` VALUES (1477978512177418240, 1477977592291053568, '历下办事部', 0, '2', '1_1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:21:51', 1399985191002447872, '2022-01-03 20:21:52', 0, 0); +INSERT INTO `iam_dept` VALUES (1477978610865197056, 1477977592291053568, '高新办事部', 0, '2', '1_1_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:22:15', 1399985191002447872, '2022-01-03 20:22:15', 0, 0); +INSERT INTO `iam_dept` VALUES (1477978810526650368, 1477977827897692160, '奎文办事部', 0, '2', '1_2_1', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:23:03', 1399985191002447872, '2022-01-03 20:23:03', 0, 0); +INSERT INTO `iam_dept` VALUES (1477978883247493120, 1477977827897692160, '潍城办事部', 0, '2', '1_2_2', '', NULL, '', '', 1399985191002447872, '2022-01-03 20:23:20', 1399985191002447872, '2022-01-03 20:23:20', 0, 0); -- ---------------------------- --- Table structure for iam_user_expand_info +-- Table structure for iam_login_security_config -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_expand_info`; -CREATE TABLE `iam_user_expand_info` ( +DROP TABLE IF EXISTS `iam_login_security_config`; +CREATE TABLE `iam_login_security_config` ( `id` bigint(20) NOT NULL COMMENT '主键', - `sex` int(4) NULL DEFAULT NULL COMMENT '性别', - `birthday` date NULL DEFAULT NULL COMMENT '生日', - `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像', - `last_login_time` datetime(0) NULL DEFAULT NULL COMMENT '上次登录时间', - `current_login_time` datetime(0) NULL DEFAULT NULL COMMENT '本次登录时间', - `initial_password` bit(1) NOT NULL COMMENT '是否初始密码', - `last_change_password_time` datetime(0) NULL DEFAULT NULL COMMENT '上次修改密码时间', - `register_time` datetime(0) NOT NULL COMMENT '注册时间', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL DEFAULT 0 COMMENT '删除标志', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户扩展信息' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_user_expand_info --- ---------------------------- -INSERT INTO `iam_user_expand_info` VALUES (1399985191002447872, 1, '1996-12-01', NULL, '2023-10-19 19:21:46', '2023-10-20 09:31:26', b'0', '2023-10-19 14:14:08', '2021-08-01 18:52:37', 1, '2021-06-02 15:04:15', 1, '2023-10-20 09:31:26', 382, b'0'); - --- ---------------------------- --- Table structure for iam_password_security_config --- ---------------------------- -DROP TABLE IF EXISTS `iam_password_security_config`; -CREATE TABLE `iam_password_security_config` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `max_pwd_error_count` int(11) NULL DEFAULT NULL COMMENT '最大密码错误数', - `error_lock_time` int(11) NULL DEFAULT NULL COMMENT '密码错误锁定时间(分钟)', - `require_change_pwd` bit(1) NULL DEFAULT NULL COMMENT '强制修改初始密码', - `update_frequency` int(11) NULL DEFAULT NULL COMMENT '更新频率', - `expire_remind` int(11) NULL DEFAULT NULL COMMENT '到期提醒(天数)', - `same_as_login_name` bit(1) NULL DEFAULT NULL COMMENT '与登录名相同', - `recent_password` int(11) NULL DEFAULT NULL COMMENT '不能与近期多少次密码相同', + `client_id` bigint(20) NULL DEFAULT NULL COMMENT '关联终端ID', + `require_login_change_pwd` bit(1) NULL DEFAULT NULL COMMENT '修改密码是否需要重新登录', + `captcha_enable` bit(1) NULL DEFAULT NULL COMMENT '默认启用验证码', + `max_captcha_error_count` int(11) NULL DEFAULT NULL COMMENT '出现验证码的错误次数', + `allow_multi_login` bit(1) NULL DEFAULT NULL COMMENT '同端是否允许同时登录', + `allow_multi_terminal_login` bit(1) NULL DEFAULT NULL COMMENT '多终端是否允许同时登录', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码安全策略' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of iam_password_security_config --- ---------------------------- -INSERT INTO `iam_password_security_config` VALUES (1714844168393515008, 5, 10, b'1', 90, 14, b'0', 5, 1399985191002447872, '2023-10-19 11:21:25', 1399985191002447872, '2023-10-19 11:21:25', 0, b'0'); - --- ---------------------------- --- Table structure for starter_wx_template --- ---------------------------- -DROP TABLE IF EXISTS `starter_wx_template`; -CREATE TABLE `starter_wx_template` ( - `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', - `enable` bit(1) NOT NULL COMMENT '是否启用', - `template_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板ID', - `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板标题', - `primary_industry` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板所属行业的一级行业', - `deputy_industry` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板所属行业的二级行业', - `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板内容', - `example` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '示例', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `inx_`(`template_id`) USING BTREE COMMENT '模板id' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信消息模板' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '登录安全策略' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_wx_template +-- Records of iam_login_security_config -- ---------------------------- -- ---------------------------- --- Table structure for starter_wx_menu +-- Table structure for iam_login_type -- ---------------------------- -DROP TABLE IF EXISTS `starter_wx_menu`; -CREATE TABLE `starter_wx_menu` ( +DROP TABLE IF EXISTS `iam_login_type`; +CREATE TABLE `iam_login_type` ( `id` bigint(20) NOT NULL COMMENT '主键', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称', - `menu_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '菜单信息', - `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', - `publish` bit(1) NOT NULL COMMENT '是否发布', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(11) NOT NULL COMMENT '版本', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '微信自定义菜单' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of starter_wx_menu --- ---------------------------- - --- ---------------------------- --- Table structure for starter_wx_fans --- ---------------------------- -DROP TABLE IF EXISTS `starter_wx_fans`; -CREATE TABLE `starter_wx_fans` ( - `id` bigint(20) NOT NULL, - `openid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联OpenId', - `subscribe_status` bit(1) NULL DEFAULT NULL COMMENT '订阅状态', - `subscribe_time` datetime(0) NULL DEFAULT NULL COMMENT '订阅时间', - `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', - `sex` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', - `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '语言', - `country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '国家', - `province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '省份', - `city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市', - `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像地址', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信公众号粉丝' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of starter_wx_fans --- ---------------------------- - --- ---------------------------- --- Table structure for starter_wecom_robot_config --- ---------------------------- -DROP TABLE IF EXISTS `starter_wecom_robot_config`; -CREATE TABLE `starter_wecom_robot_config` ( - `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', - `webhook_key` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'webhook地址的key值', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(6) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` bit(1) NOT NULL COMMENT '0:未删除。1:已删除', + `code` varchar(21) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', + `internal` bit(1) NOT NULL COMMENT '是否系统内置', + `timeout` bigint(11) NULL DEFAULT NULL COMMENT '在线时长(秒)', + `captcha_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '验证码类型', + `captcha` bit(1) NOT NULL COMMENT '启用验证码', + `enable` bit(1) NOT NULL COMMENT '是否可用', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '企业微信机器人配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登录方式' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_wecom_robot_config +-- Records of iam_login_type -- ---------------------------- +INSERT INTO `iam_login_type` VALUES (1430430071299207168, 'password', '账号密码登陆', 'password', b'1', 3600, '-1', b'0', b'1', NULL, 1399985191002447872, '2021-08-25 15:21:20', 1399985191002447872, '2022-11-03 22:24:53', 20, b'0'); +INSERT INTO `iam_login_type` VALUES (1430478946919653376, 'miniApp', '微信小程序', 'openId', b'0', 99999, '0', b'0', b'1', NULL, 1399985191002447872, '2021-08-25 18:35:33', 1399985191002447872, '2022-07-16 12:32:26', 3, b'0'); +INSERT INTO `iam_login_type` VALUES (1435138582839009280, 'phone', '手机短信登录', 'openId', b'0', 3600, '0', b'0', b'1', NULL, 1399985191002447872, '2021-09-07 15:11:16', 1399985191002447872, '2022-07-16 12:32:19', 5, b'0'); +INSERT INTO `iam_login_type` VALUES (1542091599907115008, 'dingTalk', '钉钉', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-06-29 18:24:23', 1399985191002447872, '2022-07-02 14:55:01', 5, b'0'); +INSERT INTO `iam_login_type` VALUES (1542804450312122368, 'weCom', '企业微信', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-07-01 17:37:00', 1399985191002447872, '2022-07-01 17:37:00', 0, b'0'); +INSERT INTO `iam_login_type` VALUES (1543126042909016064, 'weChat', '微信登录', 'openId', b'0', 5, '-1', b'0', b'1', '', 1399985191002447872, '2022-07-02 14:54:53', 0, '2022-10-12 22:15:05', 2, b'0'); +INSERT INTO `iam_login_type` VALUES (1626845524617203712, 'passwordGoView', '可视化平台登录', 'password', b'0', 3600, '-1', b'0', b'1', '', 1414143554414059520, '2023-02-18 15:26:13', 1414143554414059520, '2023-02-18 15:26:13', 0, b'0'); -- ---------------------------- --- Table structure for starter_quartz_job_log +-- Table structure for iam_password_change_history -- ---------------------------- -DROP TABLE IF EXISTS `starter_quartz_job_log`; -CREATE TABLE `starter_quartz_job_log` ( +DROP TABLE IF EXISTS `iam_password_change_history`; +CREATE TABLE `iam_password_change_history` ( `id` bigint(20) NOT NULL COMMENT '主键', - `handler_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理器名称', - `class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理器全限定名', - `success` bit(1) NOT NULL COMMENT '是否执行成功', - `error_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误信息', - `start_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间', - `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间', - `duration` bigint(255) NULL DEFAULT NULL COMMENT '执行时长', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户Id', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务执行日志' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码更改历史' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_quartz_job_log +-- Records of iam_password_change_history -- ---------------------------- -- ---------------------------- --- Table structure for starter_file_upload_info +-- Table structure for iam_password_login_fail_record -- ---------------------------- -DROP TABLE IF EXISTS `starter_file_upload_info`; -CREATE TABLE `starter_file_upload_info` ( +DROP TABLE IF EXISTS `iam_password_login_fail_record`; +CREATE TABLE `iam_password_login_fail_record` ( `id` bigint(20) NOT NULL COMMENT '主键', - `file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '存储位置', - `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件名称', - `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件类型', - `file_suffix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件后缀', - `file_size` bigint(20) NULL DEFAULT NULL COMMENT '文件大小', - `external_storage_id` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '外部关联id', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', + `fail_count` int(11) NULL DEFAULT NULL COMMENT '登录失败次数', + `fail_time` datetime NULL DEFAULT NULL COMMENT '登录失败时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '上传文件信息' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码登录失败记录' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_file_upload_info +-- Records of iam_password_login_fail_record -- ---------------------------- -- ---------------------------- --- Table structure for starter_file_data +-- Table structure for iam_password_security_config -- ---------------------------- -DROP TABLE IF EXISTS `starter_file_data`; -CREATE TABLE `starter_file_data` ( +DROP TABLE IF EXISTS `iam_password_security_config`; +CREATE TABLE `iam_password_security_config` ( `id` bigint(20) NOT NULL COMMENT '主键', - `base64` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'base64方式存储', - `data` longblob NULL COMMENT '数据方式存储', + `max_pwd_error_count` int(11) NULL DEFAULT NULL COMMENT '最大密码错误数', + `error_lock_time` int(11) NULL DEFAULT NULL COMMENT '密码错误锁定时间(分钟)', + `require_change_pwd` bit(1) NULL DEFAULT NULL COMMENT '强制修改初始密码', + `update_frequency` int(11) NULL DEFAULT NULL COMMENT '更新频率', + `expire_remind` int(11) NULL DEFAULT NULL COMMENT '到期提醒(天数)', + `same_as_login_name` bit(1) NULL DEFAULT NULL COMMENT '与登录名相同', + `recent_password` int(11) NULL DEFAULT NULL COMMENT '不能与近期多少次密码相同', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '上传文件数据' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码安全策略' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_file_data +-- Records of iam_password_security_config -- ---------------------------- +INSERT INTO `iam_password_security_config` VALUES (1714844168393515008, 5, 10, b'1', 90, 14, b'0', 5, 1399985191002447872, '2023-10-19 11:21:25', 1399985191002447872, '2023-10-19 11:21:25', 0, b'0'); -- ---------------------------- --- Table structure for starter_ding_robot_config +-- Table structure for iam_perm_menu -- ---------------------------- -DROP TABLE IF EXISTS `starter_ding_robot_config`; -CREATE TABLE `starter_ding_robot_config` ( +DROP TABLE IF EXISTS `iam_perm_menu`; +CREATE TABLE `iam_perm_menu` ( `id` bigint(20) NOT NULL, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', - `access_token` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉机器人访问token', - `enable_signature_check` bit(1) NOT NULL COMMENT '是否开启验签', - `sign_secret` 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 '备注', + `client_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '终端code', + `parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父id', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由名称', + `perm_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单权限编码', + `effect` bit(1) NULL DEFAULT NULL COMMENT '是否有效', + `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标', + `hidden` bit(1) NOT NULL COMMENT '是否隐藏', + `hide_children_in_menu` bit(1) NOT NULL COMMENT '是否隐藏子菜单', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件', + `component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件名字', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路径', + `redirect` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单跳转地址(重定向)', + `sort_no` double NOT NULL COMMENT '菜单排序', + `menu_type` int(5) NOT NULL COMMENT '类型(0:一级菜单;1:子菜单 ;2:按钮权限)', + `leaf` bit(1) NULL DEFAULT NULL COMMENT '是否叶子节点', + `keep_alive` bit(1) NULL DEFAULT NULL COMMENT '是否缓存页面', + `target_outside` bit(1) NULL DEFAULT NULL COMMENT '是否外部打开方式', + `hidden_header_content` bit(1) NULL DEFAULT NULL COMMENT '隐藏的标题内容', + `admin` bit(1) NOT NULL COMMENT '系统菜单', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(6) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', - `deleted` bit(1) NOT NULL COMMENT '0:未删除。1:已删除', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '钉钉机器人配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限_菜单' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_ding_robot_config +-- Records of iam_perm_menu -- ---------------------------- +INSERT INTO `iam_perm_menu` VALUES (1580740450633101312, 'adminv3', NULL, '系统管理', 'System', NULL, b'0', 'ant-design:setting-outlined', b'0', b'0', 'Layout', NULL, '/system', '/system1/client', -99999, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:01:07', 1414143554414059520, '2022-10-18 15:32:09', 4, 0); +INSERT INTO `iam_perm_menu` VALUES (1580740637841666048, 'adminv3', 1582253306356649984, '终端管理', 'ClientList', NULL, b'0', '', b'0', b'0', '/modules/system/client/ClientList.vue', NULL, '/system/client', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:01:51', 1414143554414059520, '2022-10-18 14:13:27', 5, 0); +INSERT INTO `iam_perm_menu` VALUES (1580740758629232640, 'adminv3', 1582253306356649984, '登录方式', 'LoginTypeList', NULL, b'0', '', b'0', b'0', '/modules/system/loginType/LoginTypeList.vue', NULL, '/system/loginType', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 10:02:20', 1414143554414059520, '2022-10-18 14:13:40', 5, 0); +INSERT INTO `iam_perm_menu` VALUES (1580858583654051840, 'adminv3', 1580740450633101312, '测试Iframe', 'Iframe', NULL, b'0', '', b'0', b'0', 'Iframe', NULL, '/system/Iframe', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 17:50:32', 1414143554414059520, '2022-10-17 17:46:19', 5, 1); +INSERT INTO `iam_perm_menu` VALUES (1580917438227075072, 'adminv3', 1580740450633101312, '三极目录', 'hello', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system1/a', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 21:44:24', 1399985191002447872, '2022-10-14 23:38:16', 2, 1); +INSERT INTO `iam_perm_menu` VALUES (1580917571069071360, 'adminv3', 1580917438227075072, '百度', 'baidu', NULL, b'0', '', b'0', b'0', '', NULL, 'https://www.baidu.com/', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 21:44:56', 1399985191002447872, '2022-10-14 23:37:44', 3, 1); +INSERT INTO `iam_perm_menu` VALUES (1580928436300337152, 'adminv3', 1580740450633101312, '菜单管理', 'MenuList', NULL, b'0', '', b'0', b'0', '/modules/system/menu/MenuList.vue', NULL, '/system/menu', '', -99, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2022-10-14 22:28:06', 1399985191002447872, '2022-10-14 22:28:32', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582249924602580992, 'adminv3', 1580740450633101312, '权限管理', 'Permission', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/permission', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 13:59:13', 1414143554414059520, '2022-10-18 13:59:13', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582253011803262976, 'adminv3', 1580740450633101312, '用户信息', 'UserAuth', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/user', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:11:30', 1414143554414059520, '2022-10-18 14:11:30', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582253152903843840, 'adminv3', 1580740450633101312, '系统配置', 'SystemConfig', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:12:03', 1414143554414059520, '2022-10-18 14:12:03', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582253306356649984, 'adminv3', 1580740450633101312, '认证管理', 'Auth', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/system/auth', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 14:12:40', 1414143554414059520, '2022-10-18 14:13:13', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582275875424129024, 'adminv3', NULL, '系统监控', 'Monitor', NULL, b'0', 'ant-design:monitor-outlined', b'0', b'0', 'Layout', NULL, '/monitor', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:42:21', 1414143554414059520, '2022-10-19 17:29:29', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582275984849326080, 'adminv3', NULL, '通知管理', 'Notice', NULL, b'0', 'ant-design:message-outlined', b'0', b'0', 'Layout', NULL, '/notice', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:42:47', 1414143554414059520, '2022-10-19 17:30:06', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582276092038959104, 'adminv3', NULL, '第三方对接', 'Third', NULL, b'0', 'ant-design:api-twotone', b'0', b'0', 'Layout', NULL, '/third', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:43:12', 1414143554414059520, '2022-10-19 17:32:04', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582276341792985088, 'adminv3', NULL, '开发管理', 'Develop', NULL, b'0', 'ant-design:apartment-outlined', b'0', b'0', 'Layout', NULL, '/develop', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:44:12', 1414143554414059520, '2022-10-19 15:24:22', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582276516905177088, 'adminv3', NULL, '功能演示', 'Demo', NULL, b'0', 'ant-design:appstore-twotone', b'0', b'0', 'Layout', NULL, '/demo', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:44:54', 1414143554414059520, '2022-10-19 17:34:26', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582277076421136384, 'adminv3', 1582249924602580992, '角色管理', 'RoleList', NULL, b'0', '', b'0', b'0', '/modules/system/role/RoleList.vue', NULL, '/system/permission/role', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 15:47:07', 1414143554414059520, '2022-10-18 15:59:37', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582301940364308480, 'adminv3', 1582249924602580992, '请求权限', 'PermPathList', NULL, b'0', '', b'0', b'0', '/modules/system/path/PermPathList.vue', NULL, '/system/permission/path', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:25:55', 1399985191002447872, '2023-11-29 13:57:56', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1582302180999917568, 'adminv3', 1582249924602580992, '数据角色', 'DataRoleList', NULL, b'0', '', b'0', b'0', '/modules/system/scope/DataRoleList.vue', NULL, '/system/permission/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:26:52', 1399985191002447872, '2023-11-28 21:02:57', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1582302542955769856, 'adminv3', 1582253011803262976, '用户管理', 'UserList', NULL, b'0', '', b'0', b'0', '/modules/system/user/UserList.vue', NULL, '/system/user/info', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:28:19', 1414143554414059520, '2022-10-18 17:28:19', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582302764129808384, 'adminv3', 1582253011803262976, '部门管理', 'DeptList', NULL, b'0', '', b'0', b'0', '/modules/system/dept/DeptList.vue', NULL, '/system/user/dept', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:29:11', 1414143554414059520, '2022-10-18 17:32:26', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582303143110340608, 'adminv3', 1582253152903843840, '数据字典', 'DictList', NULL, b'0', '', b'0', b'0', '/modules/system/dict/DictList.vue', NULL, '/system/config/dict', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:30:42', 1414143554414059520, '2022-10-18 17:30:42', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582303290070364160, 'adminv3', 1582253152903843840, '定时任务', 'QuartzJobList', NULL, b'0', '', b'0', b'0', '/modules/baseapi/quartz/QuartzJobList.vue', NULL, '/system/config/quartz', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:31:17', 1414143554414059520, '2023-08-09 15:50:46', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1582303447428067328, 'adminv3', 1582253152903843840, '系统参数', 'SystemParamList', NULL, b'0', '', b'0', b'0', '/modules/system/param/SystemParamList.vue', NULL, '/system/config/param', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-18 17:31:54', 1414143554414059520, '2022-10-19 23:14:16', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582632873244172288, 'adminv3', 1582276341792985088, '文件管理', 'FileUploadList', NULL, b'0', '', b'0', b'0', '/modules/develop/file/FileUploadList.vue', NULL, '/develop/file', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:20:56', 1414143554414059520, '2022-10-19 15:20:56', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582633196587261952, 'adminv3', 1582276341792985088, '代码生成', 'CodeGenList', NULL, b'0', '', b'0', b'0', '/modules/develop/codegen/CodeGenList.vue', NULL, '/develop/codegen', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:22:13', 1414143554414059520, '2022-10-19 15:23:17', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1582633307786649600, 'adminv3', 1582276341792985088, '动态表单', 'DynamicFormList', NULL, b'0', '', b'0', b'0', '/modules/develop/dynamicform/DynamicFormList.vue', NULL, '/develop/form', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:22:39', 1414143554414059520, '2022-10-19 15:22:39', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1582633620321017856, 'adminv3', 1582276341792985088, '动态数据源', 'DynamicDataSourceList', NULL, b'0', '', b'0', b'0', '/modules/develop/dynamicsource/DynamicDataSourceList.vue', NULL, '/develop/source', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-19 15:23:54', 1414143554414059520, '2022-10-19 15:23:54', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583074308040925184, 'adminv3', 1582275875424129024, '接口文档', 'ApiSwagger', NULL, b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/doc.html', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:35:02', 1414143554414059520, '2022-11-23 13:59:09', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1583075229563068416, 'adminv3', 1582275875424129024, '审计日志', 'AuditLog', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/monitor/log', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:38:42', 1414143554414059520, '2022-10-20 20:41:38', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1583076217481043968, 'adminv3', 1583075229563068416, '登录日志', 'LoginLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/login/LoginLogList.vue', NULL, '/monitor/log/login', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:42:37', 1414143554414059520, '2022-10-20 20:43:36', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1583076424935514112, 'adminv3', 1583075229563068416, '操作日志', 'OperateLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/operate/OperateLogList.vue', NULL, '/monitor/log/operate', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:43:26', 1414143554414059520, '2022-10-20 20:43:26', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583076670881112064, 'adminv3', 1583075229563068416, '数据版本日志', 'DataVersionLogList', NULL, b'0', '', b'0', b'0', '/modules/monitor/data/DataVersionLogList.vue', NULL, '/monitor/log/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:44:25', 1414143554414059520, '2022-10-20 20:44:25', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583076878956339200, 'adminv3', 1582275875424129024, 'ELK日志', 'ELK', NULL, b'0', '', b'1', b'0', '', NULL, 'http://elk.dev.bootx.cn:5601/app/discover', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:45:15', 1414143554414059520, '2023-08-12 19:26:12', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1583077015434797056, 'adminv3', 1582275875424129024, 'PlumeLog日志', 'PlumeLog', NULL, b'0', '', b'0', b'0', '', NULL, 'http://127.0.0.1:9999/plumelog/#/', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:45:47', 1414143554414059520, '2022-10-20 20:45:47', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583077198772019200, 'adminv3', 1582275875424129024, '系统信息', 'SystemInfoMonitor', NULL, b'0', '', b'0', b'0', '/modules/monitor/system/SystemInfoMonitor.vue', NULL, '/monitor/sysinfo', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:46:31', 1414143554414059520, '2022-10-20 20:46:31', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1583077360827342848, 'adminv3', 1582275875424129024, 'Redis监控', 'RedisInfoMonitor', NULL, b'0', '', b'0', b'0', '/modules/monitor/redis/RedisInfoMonitor.vue', NULL, '/monitor/redis', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-20 20:47:10', 1414143554414059520, '2022-10-20 20:47:10', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584378294652051456, 'adminv3', 1582275984849326080, '邮件配置', 'MailConfigList', NULL, b'0', '', b'0', b'0', '/modules/notice/mail/MailConfigList.vue', NULL, '/notice/notice', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:56:36', 1414143554414059520, '2022-10-24 16:14:34', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1584378497824137216, 'adminv3', 1582275984849326080, '消息模板', 'MessageTemplateList', NULL, b'0', '', b'0', b'0', '/modules/notice/template/MessageTemplateList.vue', NULL, '/notice/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:57:25', 1414143554414059520, '2022-10-25 22:14:14', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1584378671266996224, 'adminv3', 1582275984849326080, '站内信', 'SiteMessageList', NULL, b'0', '', b'0', b'0', '/modules/notice/site/sender/SiteMessageList.vue', NULL, '/notice/siteMessage', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 10:58:06', 1414143554414059520, '2022-10-24 10:58:06', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584379602188574720, 'adminv3', 1582276092038959104, '微信', 'WeChat', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/wechat', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:01:48', 1414143554414059520, '2022-10-24 11:01:48', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584379704122744832, 'adminv3', 1582276092038959104, '企业微信', 'WeCom', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/wecom', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:02:12', 1414143554414059520, '2022-10-24 11:02:12', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584380087805091840, 'adminv3', 1582276092038959104, '钉钉', 'DingTalk', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/third/dingtalk', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:03:44', 1414143554414059520, '2022-10-24 11:03:44', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1584380527829524480, 'adminv3', 1584379602188574720, '消息模板', 'WechatTemplateList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/template/WechatTemplateList.vue', NULL, '/third/wechat/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:05:29', 1414143554414059520, '2022-10-26 15:58:56', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1584380679478779904, 'adminv3', 1584379602188574720, '自定义菜单', 'WechatMenuList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/menu/WechatMenuList.vue', NULL, '/third/wechat/menu', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:06:05', 1414143554414059520, '2022-10-27 10:15:24', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1584380824308097024, 'adminv3', 1584379602188574720, '素材管理', 'WechatMediaList', NULL, b'0', '', b'0', b'0', '/modules/third/wechat/media/WechatMediaList.vue', NULL, '/third/wechat/media', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:06:40', 1414143554414059520, '2022-10-27 16:38:47', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1584381134950834176, 'adminv3', 1584379704122744832, '企微机器人', 'WeComRobotConfigList', NULL, b'0', '', b'0', b'0', '/modules/third/wecom/robot/WecomRobotConfigList.vue', NULL, '/third/wecom/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:07:54', 1414143554414059520, '2022-11-12 20:58:25', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1584381322184564736, 'adminv3', 1584380087805091840, '钉钉机器人', 'DingRobotConfigList', NULL, b'0', '', b'0', b'0', '/modules/third/dingtalk/robot/DingRobotConfigList.vue', NULL, '/third/dingTalk/robot', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:08:38', 1414143554414059520, '2022-11-12 20:58:37', 6, 0); +INSERT INTO `iam_perm_menu` VALUES (1584381477986181120, 'adminv3', 1584380087805091840, '钉钉配置', 'DingRobotConfigList', NULL, b'0', '', b'1', b'0', '/modules/third/dingtalk/config/DingTalkConfigList.vue', NULL, '/third/dingtalk/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-10-24 11:09:15', 1414143554414059520, '2022-11-11 16:04:47', 1, 1); +INSERT INTO `iam_perm_menu` VALUES (1597044371008516096, 'adminv3', NULL, '功能演示', 'Demo', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/demo', '', 0, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 09:47:04', 1414143554414059520, '2022-11-28 09:47:04', 0, 1); +INSERT INTO `iam_perm_menu` VALUES (1597102799370317824, 'adminv3', 1582276516905177088, '数据相关', 'DemoData', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/demo/data', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 13:39:15', 1414143554414059520, '2022-11-28 13:39:15', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1597210969883275264, 'adminv3', 1582276516905177088, '超级查询', 'SuperQueryDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/query/SuperQueryDemoList.vue', NULL, '/demo/query/super', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-11-28 20:49:05', 1414143554414059520, '2022-11-28 21:00:14', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1599337250200440832, 'adminv3', NULL, '关于', '', NULL, b'0', 'simple-icons:about-dot-me', b'0', b'0', '', NULL, '/about/index', '', 99, 0, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 17:38:09', 1414143554414059520, '2022-12-04 17:43:32', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1599378494880436224, 'adminv3', 1582276516905177088, 'WS演示', 'WebsocketDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/ws/WebsocketDemo', NULL, '/demo/ws', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:03', 1414143554414059520, '2023-02-08 12:17:58', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1599378579513102336, 'adminv3', 1582276516905177088, '幂等请求演示', 'IdempotentDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/idempotent/IdempotentDemo', NULL, '/demo/idempotent', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:23', 1414143554414059520, '2023-02-08 11:46:00', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1599378728490586112, 'adminv3', 1582276516905177088, '消息中间件演示', 'MqDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/mq/MqDemo', NULL, '/demo/mq', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:22:59', 1414143554414059520, '2023-02-08 22:09:04', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1599378838519762944, 'adminv3', 1582276516905177088, '富文本编辑', 'WangEditorDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/wangeditor/WangEditorDemo.vue', NULL, '/demo/wangEditor', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2022-12-04 20:23:25', 1414143554414059520, '2023-02-10 09:05:16', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1617847577158324224, 'adminv3', 1597102799370317824, '数据权限', 'DataPermDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/perm/DataPermDemoList.vue', NULL, '/demo/data/perm', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:31:35', 1414143554414059520, '2023-01-24 20:06:04', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1617847653746315264, 'adminv3', 1597102799370317824, '加密解密', 'DataEncryptDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/encrypt/DataEncryptDemoList.vue', NULL, '/demo/data/encrypt', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:31:53', 1414143554414059520, '2023-01-24 20:05:45', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1617847747375763456, 'adminv3', 1597102799370317824, '数据脱敏', 'DataSensitiveDemoList', NULL, b'0', '', b'0', b'0', '/modules/demo/data/sensitive/DataSensitiveDemoList.vue', NULL, '/demo/data/sensitive', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-01-24 19:32:16', 1414143554414059520, '2023-01-24 20:06:58', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1621150743447965696, 'admin', 1495968302034210816, '省市区联动', 'ChinaRegionDemo', NULL, b'0', '', b'0', b'0', 'demo/chinaregion/ChinaRegionDemo', NULL, '/demo/chinaregion', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-02-02 22:17:11', 1399985191002447872, '2023-02-08 09:43:39', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1623156857846034432, 'adminv3', 1582276516905177088, '省市区联动', 'ChinaRegionDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/chinaregion/ChinaRegionDemo', NULL, '/demo/chinaregion', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-08 11:08:46', 1414143554414059520, '2023-02-08 11:08:46', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1623325795944439808, 'adminv3', 1599378992811429888, '邮件通知', 'EmailSenderDemo', NULL, b'0', '', b'0', b'0', '/modules/demo/notice/email/EmailSenderDemo.vue', NULL, '/demo/notice/email', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-08 22:20:04', 1414143554414059520, '2023-02-20 10:38:55', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1623494586215579648, 'admin', 1552207982510706688, '行政区划', 'ChinaRegion', NULL, b'0', '', b'1', b'0', 'develop/region/ChinaRegionList', NULL, '/develop/region', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-02-09 09:30:47', 1399985191002447872, '2023-02-09 17:50:05', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1629039360928075776, 'adminv3', 1582276341792985088, '可视化大屏', 'ProjectInfoList', NULL, b'0', '', b'0', b'0', '/modules/develop/report/ProjectInfoList', NULL, '/develop/report', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-02-24 16:43:44', 1414143554414059520, '2023-02-24 16:44:17', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1631946120891707392, 'admin', 1552207982510706688, '可视化大屏', 'ProjectInfoList', NULL, b'0', '', b'0', b'0', 'develop/report/ProjectInfoList', NULL, '/develop/report', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-03-04 17:14:10', 1399985191002447872, '2023-03-04 17:14:10', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1635274568758435840, 'adminv3', 1582276341792985088, '数据集管理', 'DataResultSqlList', NULL, b'0', '', b'0', b'0', '/modules/develop/dataresult/DataResultSqlList', NULL, '/develop/dataresult', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-03-13 21:40:14', 1414143554414059520, '2023-09-18 14:26:51', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1687369862646558720, 'adminv3', 1582275984849326080, '短信管理', 'Sms', NULL, b'0', '', b'0', b'0', 'Layout', NULL, '/notice/sms', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:48:20', 1414143554414059520, '2023-08-04 15:48:32', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1687370142234669056, 'adminv3', 1687369862646558720, '短信配置', 'SmsChannelConfigList', NULL, b'0', '', b'0', b'0', '/modules/notice/sms/config/SmsChannelConfigList', NULL, '/notice/sms/config', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:49:26', 1414143554414059520, '2023-08-04 15:49:26', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1687370277496778752, 'adminv3', 1687369862646558720, '短信模板', 'SmsTemplateList', NULL, b'0', '', b'0', b'0', '/modules/notice/sms/template/SmsTemplateList', NULL, '/notice/sms/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-04 15:49:59', 1414143554414059520, '2023-08-04 15:50:38', 1, 0); +INSERT INTO `iam_perm_menu` VALUES (1689181991598997504, 'adminv3', 1582253152903843840, '敏感词管理', 'ChinaWord', NULL, b'0', '', b'0', b'0', '/modules/baseapi/chianword/ChinaWordList.vue', NULL, '/system/config/chinaword', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-09 15:49:05', 1414143554414059520, '2023-08-09 15:49:05', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1690324070514782208, 'adminv3', 1582276341792985088, '通用模板', 'GeneralTemplateList', NULL, b'0', '', b'0', b'0', '/modules/develop/template/GeneralTemplateList', NULL, '/develop/template', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-08-12 19:27:18', 1414143554414059520, '2023-08-12 19:31:26', 3, 0); +INSERT INTO `iam_perm_menu` VALUES (1703665090038800384, 'adminv3', 1582276341792985088, '在线SQL', 'SqlQueryInfo', NULL, b'0', '', b'0', b'0', '/modules/develop/query/SqlQueryInfo', NULL, '/develop/sqlquery', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1414143554414059520, '2023-09-18 14:59:45', 1414143554414059520, '2023-09-18 14:59:45', 0, 0); +INSERT INTO `iam_perm_menu` VALUES (1713931084759293952, 'adminv3', 1582253306356649984, '密码安全', 'PassowrdSecurity', NULL, b'0', '', b'0', b'0', '/modules/system/security/password/PasswordSecurityConfig.vue', NULL, '/system/config/passowrd', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-10-16 22:53:09', 1399985191002447872, '2023-10-16 22:58:59', 2, 0); +INSERT INTO `iam_perm_menu` VALUES (1719311626751950848, 'adminv3', 1582276516905177088, '大屏', '', NULL, b'0', '', b'0', b'0', 'Iframe', NULL, '/demo/big', 'http://localhost:8112/#/index', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-10-31 19:13:30', 1399985191002447872, '2023-11-15 11:11:26', 0, 1); +INSERT INTO `iam_perm_menu` VALUES (1733829906427682816, 'adminv3', 1582275875424129024, '在线用户', 'OnlineUserList', NULL, b'0', '', b'0', b'0', '/modules/monitor/user/online/OnlineUserList', NULL, '/monitor/user/online', '', 0, 1, NULL, b'1', b'0', b'0', b'0', NULL, 1399985191002447872, '2023-12-10 20:43:57', 1399985191002447872, '2023-12-10 20:43:57', 0, 0); -- ---------------------------- --- Table structure for starter_ding_media_md5 +-- Table structure for iam_perm_path -- ---------------------------- -DROP TABLE IF EXISTS `starter_ding_media_md5`; -CREATE TABLE `starter_ding_media_md5` ( +DROP TABLE IF EXISTS `iam_perm_path`; +CREATE TABLE `iam_perm_path` ( `id` bigint(20) NOT NULL, - `media_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '媒体id', - `md5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'md5值', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `code` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限标识', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限名称', + `request_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求类型', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求路径', + `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分组名称', + `enable` bit(1) NOT NULL COMMENT '启用状态', + `generate` bit(1) NOT NULL COMMENT '是否通过系统生成的权限', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', + `creator` bigint(20) NULL DEFAULT NULL, + `create_time` datetime(6) NULL DEFAULT NULL, + `last_modifier` bigint(20) NULL DEFAULT NULL, + `last_modified_time` datetime(6) NULL DEFAULT NULL, + `deleted` bit(1) NOT NULL, + `version` int(11) NOT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '钉钉媒体文件MD5值关联关系' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限_请求' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_ding_media_md5 +-- Records of iam_perm_path -- ---------------------------- -- ---------------------------- --- Table structure for starter_audit_operate_log +-- Table structure for iam_role -- ---------------------------- -DROP TABLE IF EXISTS `starter_audit_operate_log`; -CREATE TABLE `starter_audit_operate_log` ( - `id` bigint(20) NOT NULL, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作模块', - `operate_id` bigint(20) NULL DEFAULT NULL COMMENT '操作人员id', - `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作人员账号', - `business_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '业务类型', - `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法', - `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方式', - `operate_url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求url', - `operate_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作ip', - `operate_location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作地点', - `operate_param` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求参数', - `operate_return` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '返回参数', - `success` bit(1) NULL DEFAULT NULL COMMENT '是否成功', - `error_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '错误提示', - `operate_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', +DROP TABLE IF EXISTS `iam_role`; +CREATE TABLE `iam_role` ( + `id` bigint(20) NOT NULL COMMENT '角色ID', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编码', + `pid` bigint(20) NULL DEFAULT NULL COMMENT '父ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `internal` bit(1) NOT NULL COMMENT '是否系统内置', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '说明', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_audit_operate_log +-- Records of iam_role -- ---------------------------- +INSERT INTO `iam_role` VALUES (1405414804771971072, 'admin', NULL, '管理员', b'1', '管理员', 1, '2021-06-17 14:39:35', 1399985191002447872, '2021-07-18 22:31:02', 6, 0); +INSERT INTO `iam_role` VALUES (1416730722714144768, 'test', NULL, '测试', b'0', '测试角色', 1399985191002447872, '2021-07-18 20:05:01', 1399985191002447872, '2021-07-18 20:16:15', 1, 0); +INSERT INTO `iam_role` VALUES (1422832797731778562, 'user', NULL, '用户', b'0', '用户角色', 0, '2021-08-04 16:12:29', 1399985191002447872, '2021-08-04 16:15:03', 7, 0); +INSERT INTO `iam_role` VALUES (1428891259564445696, 'manager', NULL, '管理者', b'0', 'manager管理者', 1399985191002447872, '2021-08-21 09:26:38', 1399985191002447872, '2021-08-21 09:26:39', 0, 0); -- ---------------------------- --- Table structure for starter_audit_login_log +-- Table structure for iam_role_menu -- ---------------------------- -DROP TABLE IF EXISTS `starter_audit_login_log`; -CREATE TABLE `starter_audit_login_log` ( +DROP TABLE IF EXISTS `iam_role_menu`; +CREATE TABLE `iam_role_menu` ( `id` bigint(20) NOT NULL, - `user_id` bigint(11) NULL DEFAULT NULL COMMENT '用户id', - `account` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称', - `login` bit(1) NULL DEFAULT NULL COMMENT '登录成功状态', - `client` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '终端', - `login_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录方式', - `ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录IP地址', - `login_location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录地点', - `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作系统', - `browser` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '浏览器类型', - `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '提示消息', - `login_time` datetime(0) NULL DEFAULT NULL COMMENT '访问时间', + `role_id` bigint(20) NOT NULL COMMENT '角色id', + `client_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '终端code', + `permission_id` bigint(20) NOT NULL COMMENT '菜单权限id', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登陆日志' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色菜单权限表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of starter_audit_login_log +-- Records of iam_role_menu -- ---------------------------- -- ---------------------------- --- Table structure for report_project_info_publish +-- Table structure for iam_role_path -- ---------------------------- -DROP TABLE IF EXISTS `report_project_info_publish`; -CREATE TABLE `report_project_info_publish` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表内容', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', +DROP TABLE IF EXISTS `iam_role_path`; +CREATE TABLE `iam_role_path` ( + `id` bigint(20) NOT NULL, + `role_id` bigint(20) NOT NULL COMMENT '角色id', + `permission_id` bigint(20) NOT NULL COMMENT '请求权限id', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '自定义大屏发布信息' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色请求权限表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of report_project_info_publish +-- Records of iam_role_path -- ---------------------------- -- ---------------------------- --- Table structure for report_project_info +-- Table structure for iam_user_data_role -- ---------------------------- -DROP TABLE IF EXISTS `report_project_info`; -CREATE TABLE `report_project_info` ( +DROP TABLE IF EXISTS `iam_user_data_role`; +CREATE TABLE `iam_user_data_role` ( `id` bigint(20) NOT NULL COMMENT '主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '项目名称', - `state` int(11) NULL DEFAULT NULL COMMENT '发布状态', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表内容', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', - `index_image` bigint(20) NULL DEFAULT NULL COMMENT '预览图片id', - `edit` bit(1) 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 = '自定义大屏信息' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户数据范围关系\r\n' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of report_project_info +-- Records of iam_user_data_role -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_triggers +-- Table structure for iam_user_dept -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_triggers`; -CREATE TABLE `qrtz_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `NEXT_FIRE_TIME` bigint(13) NULL DEFAULT NULL, - `PREV_FIRE_TIME` bigint(13) NULL DEFAULT NULL, - `PRIORITY` int(11) NULL DEFAULT NULL, - `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `START_TIME` bigint(13) NOT NULL, - `END_TIME` bigint(13) NULL DEFAULT NULL, - `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `MISFIRE_INSTR` smallint(2) NULL DEFAULT NULL, - `JOB_DATA` blob NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME`, `TRIGGER_STATE`, `NEXT_FIRE_TIME`) USING BTREE, - INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, - INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME`, `NEXT_FIRE_TIME`) USING BTREE, - INDEX `IDX_QRTZ_T_C`(`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE, - INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_STATE`) USING BTREE, - INDEX `IDX_QRTZ_T_G`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_T_J`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, - INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`) USING BTREE, - INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME`, `TRIGGER_STATE`) USING BTREE, - INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, - CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_dept`; +CREATE TABLE `iam_user_dept` ( + `id` bigint(20) NOT NULL, + `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 = utf8 COLLATE = utf8_general_ci COMMENT = '用户部门关联表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_triggers +-- Records of iam_user_dept -- ---------------------------- --- ---------------------------- --- Table structure for qrtz_simprop_triggers --- ---------------------------- -DROP TABLE IF EXISTS `qrtz_simprop_triggers`; -CREATE TABLE `qrtz_simprop_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `INT_PROP_1` int(11) NULL DEFAULT NULL, - `INT_PROP_2` int(11) NULL DEFAULT NULL, - `LONG_PROP_1` bigint(20) NULL DEFAULT NULL, - `LONG_PROP_2` bigint(20) NULL DEFAULT NULL, - `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, - `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, - `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Table structure for iam_user_expand_info +-- ---------------------------- +DROP TABLE IF EXISTS `iam_user_expand_info`; +CREATE TABLE `iam_user_expand_info` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `sex` int(4) NULL DEFAULT NULL COMMENT '性别', + `birthday` date NULL DEFAULT NULL COMMENT '生日', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像', + `last_login_time` datetime NULL DEFAULT NULL COMMENT '上次登录时间', + `current_login_time` datetime NULL DEFAULT NULL COMMENT '本次登录时间', + `initial_password` bit(1) NOT NULL COMMENT '是否初始密码', + `expire_password` bit(1) NOT NULL COMMENT '密码是否过期', + `last_change_password_time` datetime NULL DEFAULT NULL COMMENT '上次修改密码时间', + `register_time` datetime NOT NULL COMMENT '注册时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户扩展信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_simprop_triggers +-- Records of iam_user_expand_info -- ---------------------------- +INSERT INTO `iam_user_expand_info` VALUES (1399985191002447872, 1, '1996-12-01', NULL, '2023-10-19 19:21:46', '2023-10-20 09:31:26', b'0', b'0', '2023-10-19 14:14:08', '2021-08-01 18:52:37', 1, '2021-06-02 15:04:15', 1, '2023-10-20 09:31:26', 382, b'0'); -- ---------------------------- --- Table structure for qrtz_simple_triggers +-- Table structure for iam_user_info -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_simple_triggers`; -CREATE TABLE `qrtz_simple_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `REPEAT_COUNT` bigint(7) NOT NULL, - `REPEAT_INTERVAL` bigint(12) NOT NULL, - `TIMES_TRIGGERED` bigint(10) NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_info`; +CREATE TABLE `iam_user_info` ( + `id` bigint(20) NOT NULL, + `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码', + `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '手机号', + `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱', + `client_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '关联终端ds', + `administrator` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否超级管理员', + `status` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号状态', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_simple_triggers +-- Records of iam_user_info -- ---------------------------- +INSERT INTO `iam_user_info` VALUES (1399985191002447872, 'Bootx', 'bootx', 'f52020dca765fd3943ed40a615dc2c5c', '13333333333', 'bootx@bootx.com', '1430430071299207168,1430430071299207169,1626840094767714304,1580487061605175296', b'1', 'norm', 1, '2021-06-02 15:04:15', 1399985191002447872, '2023-10-19 14:14:46', 58, 0); -- ---------------------------- --- Table structure for qrtz_scheduler_state +-- Table structure for iam_user_role -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_scheduler_state`; -CREATE TABLE `qrtz_scheduler_state` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `LAST_CHECKIN_TIME` bigint(13) NOT NULL, - `CHECKIN_INTERVAL` bigint(13) NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_role`; +CREATE TABLE `iam_user_role` ( + `id` bigint(20) NOT 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_unicode_ci COMMENT = '用户角色关系\r\n' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_scheduler_state +-- Records of iam_user_role -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_paused_trigger_grps +-- Table structure for iam_user_third -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; -CREATE TABLE `qrtz_paused_trigger_grps` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_third`; +CREATE TABLE `iam_user_third` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', + `we_chat_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信openId', + `we_chat_open_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信开放平台id', + `qq_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'qqId', + `weibo_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微博Id', + `gitee_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '码云唯一标识', + `ding_talk_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉唯一标识', + `we_com_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业微信唯一标识', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE, + INDEX `pk_user_index`(`user_id`) USING BTREE COMMENT '用户id索引' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户三方登录绑定' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_paused_trigger_grps +-- Records of iam_user_third -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_locks +-- Table structure for iam_user_third_info -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_locks`; -CREATE TABLE `qrtz_locks` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `iam_user_third_info`; +CREATE TABLE `iam_user_third_info` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `user_id` bigint(20) NOT NULL COMMENT '用户id', + `client_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '第三方终端类型', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户昵称', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户头像', + `third_user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '关联第三方平台的用户id', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + PRIMARY KEY (`id`) USING BTREE, + INDEX `pk_user_client`(`user_id`, `client_code`) USING BTREE COMMENT '用户id和终端code' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户三方登录绑定详情' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_locks +-- Records of iam_user_third_info -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_job_details +-- Table structure for notice_mail_config -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_job_details`; -CREATE TABLE `qrtz_job_details` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_DATA` blob NULL, - PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME`, `REQUESTS_RECOVERY`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_mail_config`; +CREATE TABLE `notice_mail_config` ( + `id` bigint(20) NOT NULL, + `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编号', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', + `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器host', + `port` int(5) NOT NULL COMMENT '邮箱服务器 port', + `username` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器 username', + `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器 password', + `sender` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱服务器 sender', + `from_` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱服务器 from', + `activity` tinyint(1) NULL DEFAULT 0 COMMENT '是否默认配置,0:否。1:是', + `security_type` int(2) NULL DEFAULT NULL COMMENT '安全传输方式 1:plain 2:tls 3:ssl', + `creator` bigint(18) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(18) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(8) NULL DEFAULT NULL COMMENT '版本', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮件配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_job_details +-- Records of notice_mail_config -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_fired_triggers +-- Table structure for notice_message_template -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_fired_triggers`; -CREATE TABLE `qrtz_fired_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `FIRED_TIME` bigint(13) NOT NULL, - `SCHED_TIME` bigint(13) NOT NULL, - `PRIORITY` int(11) NOT NULL, - `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE, - INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE, - INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME`, `INSTANCE_NAME`, `REQUESTS_RECOVERY`) USING BTREE, - INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_message_template`; +CREATE TABLE `notice_message_template` ( + `id` bigint(20) NOT NULL, + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模板数据', + `type` varchar(50) 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 '备注', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息模板' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_fired_triggers +-- Records of notice_message_template -- ---------------------------- +INSERT INTO `notice_message_template` VALUES (1424936204932169730, 'cs', '测试', 'hello ${msg}6666666666666666666666666666', '1', '测试模板', 0, '2021-08-10 11:30:40', 0, '2021-08-10 11:30:40', 0, 0); -- ---------------------------- --- Table structure for qrtz_cron_triggers +-- Table structure for notice_site_message -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_cron_triggers`; -CREATE TABLE `qrtz_cron_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_site_message`; +CREATE TABLE `notice_site_message` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息标题', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '消息内容', + `sender_id` bigint(20) NULL DEFAULT NULL COMMENT '发送者id', + `sender_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送者姓名', + `sender_time` datetime NULL DEFAULT NULL COMMENT '发送时间', + `receive_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息类型', + `send_state` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发布状态', + `efficient_time` datetime NULL DEFAULT NULL COMMENT '截至有效期', + `cancel_time` datetime NULL DEFAULT NULL COMMENT '撤回时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '站内信' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_cron_triggers +-- Records of notice_site_message -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_calendars +-- Table structure for notice_site_message_user -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_calendars`; -CREATE TABLE `qrtz_calendars` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `CALENDAR` blob NOT NULL, - PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_site_message_user`; +CREATE TABLE `notice_site_message_user` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `message_id` bigint(20) NOT NULL COMMENT '消息id', + `receive_id` bigint(20) NOT NULL COMMENT '接收者id', + `have_read` bit(1) NOT NULL COMMENT '已读/未读', + `read_time` datetime NULL DEFAULT NULL COMMENT '已读时间', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uni_receive_message`(`receive_id`, `message_id`) USING BTREE COMMENT '接收人和消息联合索引', + INDEX `inx_message`(`message_id`) USING BTREE COMMENT '消息索引' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '消息用户关联' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_calendars +-- Records of notice_site_message_user -- ---------------------------- -- ---------------------------- --- Table structure for qrtz_blob_triggers +-- Table structure for notice_sms_channel_config -- ---------------------------- -DROP TABLE IF EXISTS `qrtz_blob_triggers`; -CREATE TABLE `qrtz_blob_triggers` ( - `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `BLOB_DATA` blob NULL, - PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - INDEX `SCHED_NAME`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, - CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `notice_sms_channel_config`; +CREATE TABLE `notice_sms_channel_config` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道类型编码', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道类型名称', + `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态', + `access_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AccessKey', + `config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '配置字符串', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `access_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AccessSecret', + `image` bigint(20) NULL DEFAULT NULL COMMENT '图片', + `sort_no` double(10, 0) NULL DEFAULT NULL COMMENT '排序', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '乐观锁', + `deleted` bit(1) NOT NULL COMMENT '删除标志', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '短信渠道配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of qrtz_blob_triggers +-- Records of notice_sms_channel_config -- ---------------------------- +INSERT INTO `notice_sms_channel_config` VALUES (1688432603289337856, 'alibaba', '阿里云短信', 'normal', '1', '{\"accessKeyId\":\"1231231231232111\",\"accessKeySecret\":\"12312312321111\",\"signature\":\"1231\",\"templateId\":\"2312313\",\"templateName\":\"123\",\"requestUrl\":\"五千二无二\",\"action\":\"SendSms\",\"version\":\"11\",\"regionId\":\"cn-hangzhou\"}', NULL, '1', 1688450284000247808, 0, 1414143554414059520, '2023-08-07 14:11:17', 1414143554414059520, '2023-08-07 15:35:34', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688456604610953216, 'huawei', '华为云短信', 'normal', '1', '{\"appKey\":\"1231231231232\",\"appSecret\":\"1111\",\"signature\":\"1\",\"sender\":\"1\",\"templateId\":\"12\",\"statusCallBack\":\"1\",\"url\":\"1\"}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-07 15:46:39', 1414143554414059520, '2023-08-07 15:46:49', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688461302302732288, 'yunpian', '云片短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"callbackUrl\":null,\"templateName\":null}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-07 16:05:19', 1414143554414059520, '2023-08-08 14:12:23', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788784751001600, 'tencent', '腾讯短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"sdkAppId\":null,\"territory\":\"ap-guangzhou\",\"connTimeout\":60,\"requestUrl\":\"sms.tencentcloudapi.com\",\"action\":\"SendSms\",\"version\":\"2021-01-11\",\"service\":\"sms\"}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:46:37', 1414143554414059520, '2023-08-08 13:46:37', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788807228276736, 'uni_sms', '合一短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"isSimple\":true,\"templateName\":null}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:46:42', 1414143554414059520, '2023-08-08 13:46:43', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788823900635136, 'netease', '网易云短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"templateName\":null,\"templateUrl\":\"https://api.netease.im/sms/sendtemplate.action\",\"codeUrl\":\"https://api.netease.im/sms/sendcode.action\",\"verifyUrl\":\"https://api.netease.im/sms/verifycode.action\",\"needUp\":null}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:46:46', 1414143554414059520, '2023-08-08 13:46:47', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788846944141312, 'ctyun', '天翼云短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"templateName\":null,\"requestUrl\":\"https://sms-global.ctapi.ctyun.cn/sms/api/v1\",\"action\":\"SendSms\"}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:46:52', 1414143554414059520, '2023-08-08 13:46:52', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788862987354112, 'emay', '亿美短信', 'normal', '1', '{\"appId\":\"1\",\"secretKey\":\"1\",\"requestUrl\":null}', NULL, '1', 1688792913003102208, 0, 1414143554414059520, '2023-08-08 13:46:56', 1414143554414059520, '2023-08-08 14:03:04', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788885141667840, 'cloopen', '容联短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"appId\":null,\"baseUrl\":\"https://app.cloopen.com:8883/2013-12-26\",\"serverIp\":null,\"serverPort\":null}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:47:01', 1414143554414059520, '2023-08-08 13:47:01', 0, b'0'); +INSERT INTO `notice_sms_channel_config` VALUES (1688788904481603584, 'jd_cloud', '京东短信', 'normal', '1', '{\"accessKeyId\":\"1\",\"accessKeySecret\":\"1\",\"signature\":null,\"templateId\":null,\"region\":\"cn-north-1\"}', NULL, '1', NULL, 0, 1414143554414059520, '2023-08-08 13:47:06', 1414143554414059520, '2023-08-08 13:47:06', 0, b'0'); -- ---------------------------- --- Table structure for notice_wechat_config +-- Table structure for notice_sms_config -- ---------------------------- -DROP TABLE IF EXISTS `notice_wechat_config`; -CREATE TABLE `notice_wechat_config` ( +DROP TABLE IF EXISTS `notice_sms_config`; +CREATE TABLE `notice_sms_config` ( `id` bigint(18) NOT NULL, `tid` bigint(18) NOT NULL COMMENT '租户id', `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `corp_id` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `corp_secret` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `account_sid` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `path_sid` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送号码的唯一标识(基于twillio的命名风格)', + `auth_token` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `from_num` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `is_default` tinyint(1) NULL DEFAULT 0 COMMENT '是否默认配置,0:否。1:是', `creator` bigint(18) NULL DEFAULT NULL, - `create_time` datetime(0) NULL DEFAULT NULL, + `create_time` datetime NULL DEFAULT NULL, `last_modifier` bigint(18) NULL DEFAULT NULL, - `last_modified_time` datetime(0) NULL DEFAULT NULL, + `last_modified_time` datetime NULL DEFAULT NULL, `version` int(10) NULL DEFAULT NULL, `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `secret` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `isp` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `reply_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '微信消息配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_wechat_config +-- Records of notice_sms_config -- ---------------------------- -- ---------------------------- @@ -4842,9 +4725,9 @@ CREATE TABLE `notice_sms_template` ( `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '短信模板名称', `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '短信模板内容', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE @@ -4855,546 +4738,623 @@ CREATE TABLE `notice_sms_template` ( -- ---------------------------- -- ---------------------------- --- Table structure for notice_sms_config +-- Table structure for notice_wechat_config -- ---------------------------- -DROP TABLE IF EXISTS `notice_sms_config`; -CREATE TABLE `notice_sms_config` ( +DROP TABLE IF EXISTS `notice_wechat_config`; +CREATE TABLE `notice_wechat_config` ( `id` bigint(18) NOT NULL, `tid` bigint(18) NOT NULL COMMENT '租户id', `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `account_sid` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `path_sid` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送号码的唯一标识(基于twillio的命名风格)', - `auth_token` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `from_num` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `corp_id` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `corp_secret` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `is_default` tinyint(1) NULL DEFAULT 0 COMMENT '是否默认配置,0:否。1:是', `creator` bigint(18) NULL DEFAULT NULL, - `create_time` datetime(0) NULL DEFAULT NULL, + `create_time` datetime NULL DEFAULT NULL, `last_modifier` bigint(18) NULL DEFAULT NULL, - `last_modified_time` datetime(0) NULL DEFAULT NULL, + `last_modified_time` datetime NULL DEFAULT NULL, `version` int(10) NULL DEFAULT NULL, `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `secret` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `isp` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - `reply_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信配置' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of notice_sms_config --- ---------------------------- - --- ---------------------------- --- Table structure for notice_sms_channel_config --- ---------------------------- -DROP TABLE IF EXISTS `notice_sms_channel_config`; -CREATE TABLE `notice_sms_channel_config` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道类型编码', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道类型名称', - `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态', - `access_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AccessKey', - `config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '配置字符串', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', - `access_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AccessSecret', - `image` bigint(20) NULL DEFAULT NULL COMMENT '图片', - `sort_no` double(10, 0) NULL DEFAULT NULL COMMENT '排序', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '短信渠道配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '微信消息配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_sms_channel_config +-- Records of notice_wechat_config -- ---------------------------- -- ---------------------------- --- Table structure for notice_site_message_user +-- Table structure for qrtz_blob_triggers -- ---------------------------- -DROP TABLE IF EXISTS `notice_site_message_user`; -CREATE TABLE `notice_site_message_user` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `message_id` bigint(20) NOT NULL COMMENT '消息id', - `receive_id` bigint(20) NOT NULL COMMENT '接收者id', - `have_read` bit(1) NOT NULL COMMENT '已读/未读', - `read_time` datetime(0) NULL DEFAULT NULL COMMENT '已读时间', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uni_receive_message`(`receive_id`, `message_id`) USING BTREE COMMENT '接收人和消息联合索引', - INDEX `inx_message`(`message_id`) USING BTREE COMMENT '消息索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '消息用户关联' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `BLOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `SCHED_NAME`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_site_message_user +-- Records of qrtz_blob_triggers -- ---------------------------- -- ---------------------------- --- Table structure for notice_site_message +-- Table structure for qrtz_calendars -- ---------------------------- -DROP TABLE IF EXISTS `notice_site_message`; -CREATE TABLE `notice_site_message` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息标题', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '消息内容', - `sender_id` bigint(20) NULL DEFAULT NULL COMMENT '发送者id', - `sender_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送者姓名', - `sender_time` datetime(0) NULL DEFAULT NULL COMMENT '发送时间', - `receive_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息类型', - `send_state` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发布状态', - `efficient_time` datetime(0) NULL DEFAULT NULL COMMENT '截至有效期', - `cancel_time` datetime(0) NULL DEFAULT NULL COMMENT '撤回时间', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '站内信' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_site_message +-- Records of qrtz_calendars -- ---------------------------- -- ---------------------------- --- Table structure for notice_mail_config +-- Table structure for qrtz_cron_triggers -- ---------------------------- -DROP TABLE IF EXISTS `notice_mail_config`; -CREATE TABLE `notice_mail_config` ( - `id` bigint(20) NOT NULL, - `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编号', - `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称', - `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器host', - `port` int(5) NOT NULL COMMENT '邮箱服务器 port', - `username` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器 username', - `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱服务器 password', - `sender` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱服务器 sender', - `from_` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱服务器 from', - `activity` tinyint(1) NULL DEFAULT 0 COMMENT '是否默认配置,0:否。1:是', - `security_type` int(2) NULL DEFAULT NULL COMMENT '安全传输方式 1:plain 2:tls 3:ssl', - `creator` bigint(18) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(18) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(8) NULL DEFAULT NULL COMMENT '版本', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮件配置' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of notice_mail_config +-- Records of qrtz_cron_triggers -- ---------------------------- -- ---------------------------- --- Table structure for iam_user_third_info +-- Table structure for qrtz_fired_triggers -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_third_info`; -CREATE TABLE `iam_user_third_info` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NOT NULL COMMENT '用户id', - `client_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '第三方终端类型', - `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', - `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户昵称', - `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户头像', - `third_user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '关联第三方平台的用户id', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - PRIMARY KEY (`id`) USING BTREE, - INDEX `pk_user_client`(`user_id`, `client_code`) USING BTREE COMMENT '用户id和终端code' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户三方登录绑定详情' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FIRED_TIME` bigint(13) NOT NULL, + `SCHED_TIME` bigint(13) NOT NULL, + `PRIORITY` int(11) NOT NULL, + `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE, + INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE, + INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME`, `INSTANCE_NAME`, `REQUESTS_RECOVERY`) USING BTREE, + INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_third_info +-- Records of qrtz_fired_triggers -- ---------------------------- -- ---------------------------- --- Table structure for iam_user_third +-- Table structure for qrtz_job_details -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_third`; -CREATE TABLE `iam_user_third` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', - `we_chat_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信openId', - `we_chat_open_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信开放平台id', - `qq_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'qqId', - `weibo_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微博Id', - `gitee_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '码云唯一标识', - `ding_talk_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉唯一标识', - `we_com_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业微信唯一标识', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - PRIMARY KEY (`id`) USING BTREE, - INDEX `pk_user_index`(`user_id`) USING BTREE COMMENT '用户id索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户三方登录绑定' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME`, `REQUESTS_RECOVERY`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_third +-- Records of qrtz_job_details -- ---------------------------- -- ---------------------------- --- Table structure for iam_user_role +-- Table structure for qrtz_locks -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_role`; -CREATE TABLE `iam_user_role` ( - `id` bigint(20) NOT 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_unicode_ci COMMENT = '用户角色关系\r\n' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_role +-- Records of qrtz_locks -- ---------------------------- -- ---------------------------- --- Table structure for iam_user_data_scope +-- Table structure for qrtz_paused_trigger_grps -- ---------------------------- -DROP TABLE IF EXISTS `iam_user_data_scope`; -CREATE TABLE `iam_user_data_scope` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NOT NULL COMMENT '用户ID', - `data_scope_id` bigint(20) NOT NULL COMMENT '数据权限ID', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户数据范围关系\r\n' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_user_data_scope +-- Records of qrtz_paused_trigger_grps -- ---------------------------- -- ---------------------------- --- Table structure for iam_role_path +-- Table structure for qrtz_scheduler_state -- ---------------------------- -DROP TABLE IF EXISTS `iam_role_path`; -CREATE TABLE `iam_role_path` ( - `id` bigint(20) NOT NULL, - `role_id` bigint(20) NOT NULL COMMENT '角色id', - `permission_id` bigint(20) NOT NULL COMMENT '请求权限id', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色请求权限表' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `LAST_CHECKIN_TIME` bigint(13) NOT NULL, + `CHECKIN_INTERVAL` bigint(13) NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_role_path +-- Records of qrtz_scheduler_state -- ---------------------------- -- ---------------------------- --- Table structure for iam_role_menu +-- Table structure for qrtz_simple_triggers -- ---------------------------- -DROP TABLE IF EXISTS `iam_role_menu`; -CREATE TABLE `iam_role_menu` ( - `id` bigint(20) NOT NULL, - `role_id` bigint(20) NOT NULL COMMENT '角色id', - `client_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '终端code', - `permission_id` bigint(20) NOT NULL COMMENT '菜单权限id', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色菜单权限表' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REPEAT_COUNT` bigint(7) NOT NULL, + `REPEAT_INTERVAL` bigint(12) NOT NULL, + `TIMES_TRIGGERED` bigint(10) NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_role_menu +-- Records of qrtz_simple_triggers -- ---------------------------- -- ---------------------------- --- Table structure for iam_perm_path +-- Table structure for qrtz_simprop_triggers -- ---------------------------- -DROP TABLE IF EXISTS `iam_perm_path`; -CREATE TABLE `iam_perm_path` ( - `id` bigint(20) NOT NULL, - `code` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '权限标识', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限名称', - `request_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求类型', - `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求路径', - `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分组名称', - `enable` bit(1) NOT NULL COMMENT '启用状态', - `generate` bit(1) NOT NULL COMMENT '是否通过系统生成的权限', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', - `creator` bigint(20) NULL DEFAULT NULL, - `create_time` datetime(6) NULL DEFAULT NULL, - `last_modifier` bigint(20) NULL DEFAULT NULL, - `last_modified_time` datetime(6) NULL DEFAULT NULL, - `deleted` bit(1) NOT NULL, - `version` int(11) NOT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '权限_请求' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `INT_PROP_1` int(11) NULL DEFAULT NULL, + `INT_PROP_2` int(11) NULL DEFAULT NULL, + `LONG_PROP_1` bigint(20) NULL DEFAULT NULL, + `LONG_PROP_2` bigint(20) NULL DEFAULT NULL, + `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, + `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, + `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_perm_path +-- Records of qrtz_simprop_triggers -- ---------------------------- -- ---------------------------- --- Table structure for iam_password_login_fail_record +-- Table structure for qrtz_triggers -- ---------------------------- -DROP TABLE IF EXISTS `iam_password_login_fail_record`; -CREATE TABLE `iam_password_login_fail_record` ( +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `NEXT_FIRE_TIME` bigint(13) NULL DEFAULT NULL, + `PREV_FIRE_TIME` bigint(13) NULL DEFAULT NULL, + `PRIORITY` int(11) NULL DEFAULT NULL, + `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `START_TIME` bigint(13) NOT NULL, + `END_TIME` bigint(13) NULL DEFAULT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `MISFIRE_INSTR` smallint(2) NULL DEFAULT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME`, `TRIGGER_STATE`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_C`(`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_G`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_J`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`) USING BTREE, + INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME`, `TRIGGER_STATE`) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for report_project_info +-- ---------------------------- +DROP TABLE IF EXISTS `report_project_info`; +CREATE TABLE `report_project_info` ( `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户id', - `fail_count` int(11) NULL DEFAULT NULL COMMENT '登录失败次数', - `fail_time` datetime(0) NULL DEFAULT NULL COMMENT '登录失败时间', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '项目名称', + `state` int(11) NULL DEFAULT NULL COMMENT '发布状态', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表内容', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', + `index_image` bigint(20) NULL DEFAULT NULL COMMENT '预览图片id', + `edit` bit(1) NULL DEFAULT NULL COMMENT '是否在编辑中', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码登录失败记录' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '自定义大屏信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_password_login_fail_record +-- Records of report_project_info -- ---------------------------- -- ---------------------------- --- Table structure for iam_password_change_history +-- Table structure for report_project_info_publish -- ---------------------------- -DROP TABLE IF EXISTS `iam_password_change_history`; -CREATE TABLE `iam_password_change_history` ( +DROP TABLE IF EXISTS `report_project_info_publish`; +CREATE TABLE `report_project_info_publish` ( `id` bigint(20) NOT NULL COMMENT '主键', - `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户Id', - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表内容', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '乐观锁', `deleted` bit(1) NOT NULL COMMENT '删除标志', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '密码更改历史,' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '自定义大屏发布信息' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_password_change_history +-- Records of report_project_info_publish -- ---------------------------- -- ---------------------------- --- Table structure for iam_login_security_config +-- Table structure for starter_audit_data_version -- ---------------------------- -DROP TABLE IF EXISTS `iam_login_security_config`; -CREATE TABLE `iam_login_security_config` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `client_id` bigint(20) NULL DEFAULT NULL COMMENT '关联终端ID', - `require_login_change_pwd` bit(1) NULL DEFAULT NULL COMMENT '修改密码是否需要重新登录', - `captcha_enable` bit(1) NULL DEFAULT NULL COMMENT '默认启用验证码', - `max_captcha_error_count` int(11) NULL DEFAULT NULL COMMENT '出现验证码的错误次数', - `allow_multi_login` bit(1) NULL DEFAULT NULL COMMENT '同端是否允许同时登录', - `allow_multi_terminal_login` bit(1) NULL DEFAULT NULL COMMENT '多终端是否允许同时登录', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', +DROP TABLE IF EXISTS `starter_audit_data_version`; +CREATE TABLE `starter_audit_data_version` ( + `id` bigint(20) NOT NULL, + `table_name` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据表名称', + `data_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据名称', + `data_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据主键', + `data_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '数据内容', + `change_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '数据更新内容', + `version` int(10) NOT NULL COMMENT '版本', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据版本日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of starter_audit_data_version +-- ---------------------------- +INSERT INTO `starter_audit_data_version` VALUES (1480550993828446208, '', 'client', '1', '{\"dataName\":\"client\",\"dataId\":\"1\",\"dataContent\":{\"id\":\"1\",\"creator\":null,\"createTime\":\"2022-01-10 22:43:58\",\"lastModifier\":null,\"lastModifiedTime\":null,\"deleted\":false,\"version\":0,\"code\":null,\"name\":null,\"timeout\":null,\"captcha\":false,\"enable\":false,\"description\":null}}', NULL, 1, 0, '2022-01-10 22:43:59'); +INSERT INTO `starter_audit_data_version` VALUES (1480551021779288064, '', 'client', '1', '{\"dataName\":\"client\",\"dataId\":\"1\",\"dataContent\":{\"id\":\"1\",\"creator\":null,\"createTime\":\"2022-01-10 22:44:05\",\"lastModifier\":null,\"lastModifiedTime\":null,\"deleted\":false,\"version\":0,\"code\":null,\"name\":null,\"timeout\":null,\"captcha\":false,\"enable\":false,\"description\":null}}', NULL, 2, 0, '2022-01-10 22:44:06'); + +-- ---------------------------- +-- Table structure for starter_audit_login_log +-- ---------------------------- +DROP TABLE IF EXISTS `starter_audit_login_log`; +CREATE TABLE `starter_audit_login_log` ( + `id` bigint(20) NOT NULL, + `user_id` bigint(11) NULL DEFAULT NULL COMMENT '用户id', + `account` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称', + `login` bit(1) NULL DEFAULT NULL COMMENT '登录成功状态', + `client` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '终端', + `login_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录方式', + `ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录IP地址', + `login_location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录地点', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作系统', + `browser` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '浏览器类型', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '提示消息', + `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登陆日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of starter_audit_login_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for starter_audit_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS `starter_audit_operate_log`; +CREATE TABLE `starter_audit_operate_log` ( + `id` bigint(20) NOT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作模块', + `operate_id` bigint(20) NULL DEFAULT NULL COMMENT '操作人员id', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作人员账号', + `business_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '业务类型', + `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法', + `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方式', + `operate_url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求url', + `operate_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作ip', + `operate_location` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作地点', + `operate_param` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求参数', + `operate_return` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '返回参数', + `success` bit(1) NULL DEFAULT NULL COMMENT '是否成功', + `error_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '错误提示', + `operate_time` datetime NULL DEFAULT NULL COMMENT '操作时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '登录安全策略' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_login_security_config +-- Records of starter_audit_operate_log -- ---------------------------- -- ---------------------------- --- Table structure for iam_data_scope_user +-- Table structure for starter_ding_media_md5 -- ---------------------------- -DROP TABLE IF EXISTS `iam_data_scope_user`; -CREATE TABLE `iam_data_scope_user` ( +DROP TABLE IF EXISTS `starter_ding_media_md5`; +CREATE TABLE `starter_ding_media_md5` ( `id` bigint(20) NOT NULL, - `data_scope_id` bigint(20) NOT NULL COMMENT '数据范围id', - `user_id` bigint(20) NOT NULL COMMENT '用户id', + `media_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '媒体id', + `md5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'md5值', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据范围用户关联配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '钉钉媒体文件MD5值关联关系' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of iam_data_scope_user +-- Records of starter_ding_media_md5 -- ---------------------------- -- ---------------------------- --- Table structure for base_village +-- Table structure for starter_ding_robot_config -- ---------------------------- -DROP TABLE IF EXISTS `base_village`; -CREATE TABLE `base_village` ( - `code` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '编码', - `name` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '名称', - `street_code` char(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '社区/乡镇编码', - PRIMARY KEY (`code`) USING BTREE, - INDEX `inx_street_code`(`street_code`) USING BTREE COMMENT '所属街道索引' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '村庄/社区' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `starter_ding_robot_config`; +CREATE TABLE `starter_ding_robot_config` ( + `id` bigint(20) NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', + `access_token` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉机器人访问token', + `enable_signature_check` bit(1) NOT NULL COMMENT '是否开启验签', + `sign_secret` 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 '备注', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime(6) NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + `deleted` bit(1) NOT NULL COMMENT '0:未删除。1:已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '钉钉机器人配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_village +-- Records of starter_ding_robot_config -- ---------------------------- -- ---------------------------- --- Table structure for base_street +-- Table structure for starter_file_data -- ---------------------------- -DROP TABLE IF EXISTS `base_street`; -CREATE TABLE `base_street` ( - `code` char(9) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编码', - `name` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '街道名称', - `area_code` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '县区编码', - PRIMARY KEY (`code`) USING BTREE, - INDEX `inx_area_code`(`area_code`) USING BTREE COMMENT '县区' -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '街道表' ROW_FORMAT = DYNAMIC; +DROP TABLE IF EXISTS `starter_file_data`; +CREATE TABLE `starter_file_data` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `base64` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'base64方式存储', + `data` longblob NULL COMMENT '数据方式存储', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '上传文件数据' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_street +-- Records of starter_file_data -- ---------------------------- -- ---------------------------- --- Table structure for base_query_sql +-- Table structure for starter_file_upload_info -- ---------------------------- -DROP TABLE IF EXISTS `base_query_sql`; -CREATE TABLE `base_query_sql` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `database_id` bigint(20) NULL DEFAULT NULL COMMENT '数据源ID', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称', - `is_list` bit(1) NULL DEFAULT NULL COMMENT '是否集合', - `sql` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'sql语句', - `params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'SQL查询参数', - `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'SQL查询结果字段', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', +DROP TABLE IF EXISTS `starter_file_upload_info`; +CREATE TABLE `starter_file_upload_info` ( + `id` bigint(20) NOT NULL COMMENT '文件id', + `url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件访问地址', + `size` bigint(20) NULL DEFAULT NULL COMMENT '文件大小,单位字节', + `filename` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称', + `original_filename` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '原始文件名', + `base_path` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '基础存储路径', + `path` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '存储路径', + `ext` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件扩展名', + `content_type` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'MIME类型', + `platform` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '存储平台', + `th_url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩略图访问路径', + `th_filename` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩略图名称', + `th_size` bigint(20) NULL DEFAULT NULL COMMENT '缩略图大小,单位字节', + `th_content_type` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩略图MIME类型', + `object_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件所属对象id', + `object_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件所属对象类型,例如用户头像,评价图片', + `metadata` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '文件元数据', + `user_metadata` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '文件用户元数据', + `th_metadata` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缩略图元数据', + `th_user_metadata` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缩略图用户元数据', + `attr` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '附加属性', + `file_acl` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件ACL', + `th_file_acl` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩略图文件ACL', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'SQL查询语句' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '文件记录表' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_query_sql +-- Records of starter_file_upload_info -- ---------------------------- -- ---------------------------- --- Table structure for base_key_value +-- Table structure for starter_quartz_job -- ---------------------------- -DROP TABLE IF EXISTS `base_key_value`; -CREATE TABLE `base_key_value` ( - `id` bigint(20) NOT NULL, - `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数键名', - `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '参数值', +DROP TABLE IF EXISTS `starter_quartz_job`; +CREATE TABLE `starter_quartz_job` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务名称', + `job_class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务类名', + `cron` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'cron表达式', + `parameter` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数', + `state` int(4) NULL DEFAULT NULL COMMENT '状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '更新人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', - `version` int(8) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'kv存储' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_key_value +-- Records of starter_quartz_job -- ---------------------------- +INSERT INTO `starter_quartz_job` VALUES (1456579473573867520, '测试任务', 'cn.bootx.starter.quartz.task.TestTask', '50 0 * * * ? *', '{\"aaa\":\"5255\"}', 0, '测试任务', 1399985191002447872, '2021-11-05 19:09:43', 1399985191002447872, '2022-06-22 00:37:48', 25, 0); +INSERT INTO `starter_quartz_job` VALUES (1546857070483939328, '支付单超时检测', 'cn.bootx.payment.task.PayExpiredTimeTask', '0/5 * * * * ? *', NULL, 1, '检测超时的支付单, 超时后发送超时事件', 1399985191002447872, '2022-07-12 22:00:39', 1399985191002447872, '2022-07-12 22:00:45', 1, 0); -- ---------------------------- --- Table structure for base_general_template +-- Table structure for starter_quartz_job_log -- ---------------------------- -DROP TABLE IF EXISTS `base_general_template`; -CREATE TABLE `base_general_template` ( +DROP TABLE IF EXISTS `starter_quartz_job_log`; +CREATE TABLE `starter_quartz_job_log` ( `id` bigint(20) NOT NULL COMMENT '主键', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板名称', - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板代码', - `use_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '使用类型(导入/导出)', - `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板类型', - `file_suffix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板后缀名', - `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '状态', - `file_id` bigint(20) NULL DEFAULT NULL COMMENT '文件ID', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', + `handler_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理器名称', + `class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理器全限定名', + `success` bit(1) NOT NULL COMMENT '是否执行成功', + `error_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误信息', + `start_time` datetime NULL DEFAULT NULL COMMENT '开始时间', + `end_time` datetime NULL DEFAULT NULL COMMENT '结束时间', + `duration` bigint(255) NULL DEFAULT NULL COMMENT '执行时长', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '通用模板管理' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务执行日志' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_general_template +-- Records of starter_quartz_job_log -- ---------------------------- -- ---------------------------- --- Table structure for base_dynamic_data_source +-- Table structure for starter_wecom_robot_config -- ---------------------------- -DROP TABLE IF EXISTS `base_dynamic_data_source`; -CREATE TABLE `base_dynamic_data_source` ( +DROP TABLE IF EXISTS `starter_wecom_robot_config`; +CREATE TABLE `starter_wecom_robot_config` ( `id` bigint(20) NOT NULL, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据源编码', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据源名称', - `database_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库类型', - `auto_load` bit(1) NULL DEFAULT NULL COMMENT '是否启动自动加载', - `db_driver` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '驱动类', - `db_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库地址', - `db_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '数据库名称', - `db_username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', - `db_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号', + `webhook_key` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'webhook地址的key值', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `create_time` datetime(6) NULL DEFAULT NULL COMMENT '创建时间', `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', + `last_modified_time` datetime(6) NULL DEFAULT NULL COMMENT '最后修改时间', `version` int(11) NOT NULL COMMENT '版本', - `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `deleted` bit(1) NOT NULL COMMENT '0:未删除。1:已删除', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '动态数据源管理' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '企业微信机器人配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_dynamic_data_source +-- Records of starter_wecom_robot_config -- ---------------------------- -- ---------------------------- --- Table structure for base_data_result_sql +-- Table structure for starter_wx_fans -- ---------------------------- -DROP TABLE IF EXISTS `base_data_result_sql`; -CREATE TABLE `base_data_result_sql` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `database_id` bigint(20) NULL DEFAULT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `is_list` bit(1) NULL DEFAULT NULL, - `sql` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, - `params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, - `fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL, - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `deleted` bit(1) NOT NULL COMMENT '删除标志', +DROP TABLE IF EXISTS `starter_wx_fans`; +CREATE TABLE `starter_wx_fans` ( + `id` bigint(20) NOT NULL, + `openid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联OpenId', + `subscribe_status` bit(1) NULL DEFAULT NULL COMMENT '订阅状态', + `subscribe_time` datetime NULL DEFAULT NULL COMMENT '订阅时间', + `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', + `sex` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别', + `language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '语言', + `country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '国家', + `province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '省份', + `city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市', + `avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像地址', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '数据集SQL语句' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信公众号粉丝' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_data_result_sql +-- Records of starter_wx_fans -- ---------------------------- -- ---------------------------- --- Table structure for base_china_word +-- Table structure for starter_wx_menu -- ---------------------------- -DROP TABLE IF EXISTS `base_china_word`; -CREATE TABLE `base_china_word` ( +DROP TABLE IF EXISTS `starter_wx_menu`; +CREATE TABLE `starter_wx_menu` ( `id` bigint(20) NOT NULL COMMENT '主键', - `word` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '敏感词', - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '分类', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '描述', - `enable` bit(1) NULL DEFAULT NULL COMMENT '是否启用', - `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修者ID', - `last_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int(11) NOT NULL COMMENT '乐观锁', - `white` bit(1) NULL DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '名称', + `menu_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '菜单信息', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `publish` bit(1) NOT NULL COMMENT '是否发布', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:未删除。1:已删除', + `version` int(11) NOT NULL COMMENT '版本', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '敏感词' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '微信自定义菜单' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of base_china_word +-- Records of starter_wx_menu +-- ---------------------------- + +-- ---------------------------- +-- Table structure for starter_wx_template +-- ---------------------------- +DROP TABLE IF EXISTS `starter_wx_template`; +CREATE TABLE `starter_wx_template` ( + `id` bigint(20) NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `enable` bit(1) NOT NULL COMMENT '是否启用', + `template_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模板ID', + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板标题', + `primary_industry` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板所属行业的一级行业', + `deputy_industry` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板所属行业的二级行业', + `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板内容', + `example` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '示例', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint(20) NULL DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int(11) NOT NULL COMMENT '版本', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `inx_`(`template_id`) USING BTREE COMMENT '模板id' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信消息模板' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of starter_wx_template -- ---------------------------- SET FOREIGN_KEY_CHECKS = 1; -- Gitee