Browse Source

养老项目提交

S0025136190 10 months ago
commit
25ff8b2db0
100 changed files with 16448 additions and 0 deletions
  1. 18 0
      .editorconfig
  2. 49 0
      .gitee/ISSUE_TEMPLATE.zh-CN.md
  3. 50 0
      .gitee/ISSUE_TEMPLATE/bug.yml
  4. 5 0
      .gitee/ISSUE_TEMPLATE/config.yml
  5. 43 0
      .gitee/ISSUE_TEMPLATE/feature.yml
  6. 7 0
      .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md
  7. 48 0
      .gitignore
  8. 12 0
      .run/ruoyi-monitor-admin.run.xml
  9. 12 0
      .run/ruoyi-powerjob-server.run.xml
  10. 12 0
      .run/ruoyi-server.run.xml
  11. 20 0
      LICENSE
  12. 185 0
      README.md
  13. 1 0
      plus-ui-ts
  14. 483 0
      pom.xml
  15. 68 0
      script/bin/ry.bat
  16. 86 0
      script/bin/ry.sh
  17. 61 0
      script/docker/database.yml
  18. 158 0
      script/docker/docker-compose.yml
  19. 111 0
      script/docker/nginx/conf/nginx.conf
  20. 28 0
      script/docker/redis/conf/redis.conf
  21. 1 0
      script/docker/redis/data/README.md
  22. 1251 0
      script/sql/oracle/oracle_ry_vue_5.X.sql
  23. 204 0
      script/sql/oracle/oracle_test.sql
  24. 694 0
      script/sql/oracle/powerjob.sql
  25. 1268 0
      script/sql/postgres/postgres_ry_vue_5.X.sql
  26. 204 0
      script/sql/postgres/postgres_test.sql
  27. 258 0
      script/sql/postgres/powerjob.sql
  28. 233 0
      script/sql/powerjob.sql
  29. 882 0
      script/sql/ry_vue_5.X.sql
  30. 517 0
      script/sql/sqlserver/powerjob.sql
  31. 3192 0
      script/sql/sqlserver/sqlserver_ry_vue_5.X.sql
  32. 510 0
      script/sql/sqlserver/sqlserver_test.sql
  33. 175 0
      script/sql/test.sql
  34. 151 0
      script/sql/update/oracle/update_5.0-5.1.sql
  35. 150 0
      script/sql/update/postgres/update_5.0-5.1.sql
  36. 409 0
      script/sql/update/sqlserver/update_5.0-5.1.sql
  37. 101 0
      script/sql/update/update_5.0-5.1.sql
  38. 23 0
      takai-admin/Dockerfile
  39. 136 0
      takai-admin/pom.xml
  40. 23 0
      takai-admin/src/main/java/org/dromara/DromaraApplication.java
  41. 18 0
      takai-admin/src/main/java/org/dromara/DromaraServletInitializer.java
  42. 186 0
      takai-admin/src/main/java/org/dromara/web/controller/AuthController.java
  43. 131 0
      takai-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
  44. 32 0
      takai-admin/src/main/java/org/dromara/web/controller/IndexController.java
  45. 25 0
      takai-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java
  46. 25 0
      takai-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java
  47. 54 0
      takai-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java
  48. 22 0
      takai-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java
  49. 45 0
      takai-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java
  50. 227 0
      takai-admin/src/main/java/org/dromara/web/service/SysLoginService.java
  51. 106 0
      takai-admin/src/main/java/org/dromara/web/service/SysRegisterService.java
  52. 113 0
      takai-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java
  53. 132 0
      takai-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
  54. 113 0
      takai-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java
  55. 138 0
      takai-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
  56. 94 0
      takai-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java
  57. 252 0
      takai-admin/src/main/resources/application-dev.yml
  58. 253 0
      takai-admin/src/main/resources/application-prod.yml
  59. 272 0
      takai-admin/src/main/resources/application.yml
  60. 8 0
      takai-admin/src/main/resources/banner.txt
  61. 57 0
      takai-admin/src/main/resources/i18n/messages.properties
  62. 57 0
      takai-admin/src/main/resources/i18n/messages_en_US.properties
  63. 57 0
      takai-admin/src/main/resources/i18n/messages_zh_CN.properties
  64. BIN
      takai-admin/src/main/resources/ip2region.xdb
  65. 129 0
      takai-admin/src/main/resources/logback-plus.xml
  66. 28 0
      takai-admin/src/main/resources/spy.properties
  67. 45 0
      takai-admin/src/test/java/org/dromara/test/AssertUnitTest.java
  68. 70 0
      takai-admin/src/test/java/org/dromara/test/DemoUnitTest.java
  69. 72 0
      takai-admin/src/test/java/org/dromara/test/ParamUnitTest.java
  70. 54 0
      takai-admin/src/test/java/org/dromara/test/TagUnitTest.java
  71. 45 0
      takai-common/pom.xml
  72. 178 0
      takai-common/takai-common-bom/pom.xml
  73. 105 0
      takai-common/takai-common-core/pom.xml
  74. 16 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java
  75. 48 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java
  76. 33 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java
  77. 78 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java
  78. 40 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java
  79. 30 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java
  80. 25 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java
  81. 63 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  82. 81 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/Constants.java
  83. 39 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java
  84. 93 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java
  85. 45 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java
  86. 142 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java
  87. 110 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/R.java
  88. 38 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java
  89. 62 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java
  90. 35 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java
  91. 120 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java
  92. 128 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java
  93. 17 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java
  94. 34 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java
  95. 21 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java
  96. 27 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java
  97. 37 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
  98. 44 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java
  99. 30 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/enums/TenantStatus.java
  100. 30 0
      takai-common/takai-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java

+ 18 - 0
.editorconfig

@@ -0,0 +1,18 @@
+# http://editorconfig.org
+root = true
+
+# 空格替代Tab缩进在各种编辑工具下效果一致
+[*]
+indent_style = space
+indent_size = 4
+charset = utf-8
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.{json,yml,yaml}]
+indent_size = 2
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false

+ 49 - 0
.gitee/ISSUE_TEMPLATE.zh-CN.md

@@ -0,0 +1,49 @@
+### 使用版本(未按照模板填写直接删除)
+
+- jdk版本(带上尾号): 例如 1.8.0_202
+- 框架版本(项目启动时输出的版本号): 例如 4.4.0
+- 其他依赖版本(你觉得有必要的):
+
+### 问题前提
+
+> 功能不好用 不会用 是否已经看过项目文档
+> 项目运行报错 是否已经拿着报错信息去百度 常见报错百度百度足以
+> 是否搜索过其他issue 一些已经解决的问题 会在issue内留下解决方法
+> 无法线上解决或者与框架无关的问题的欢迎加VIP群跟作者一对一谈
+
+### 异常模块
+
+> 此报错都涉及到那些系统模块
+
+例如 ruoyi-system ruoyi-auth 等等
+
+### 问题描述
+
+> 越详细越容易直击问题所在
+
+已知: XXX功能不好用 或 XXX数据不正常 等等
+
+### 希望结果
+
+> 想知道你觉得怎么样是正常或者合理的
+
+希望功能可以有XXX结果 或者 XXX现象
+
+### 重现步骤
+
+> 作者并不知道这个问题是如何出现的
+
+- 1
+- 2
+- 3
+
+### 相关代码与报错信息(请勿发混乱格式)
+
+> 代码可按照如下形式提供或者截图均可 越详细越好
+> 大多数问题都是 代码编写错误问题 逻辑问题 或者用法错误等问题
+
+```java
+public class XXX {
+
+}
+```

+ 50 - 0
.gitee/ISSUE_TEMPLATE/bug.yml

@@ -0,0 +1,50 @@
+name: Bug 反馈
+description: 当你中发现了一个 Bug,导致应用崩溃或抛出异常,或者有一个组件存在问题,或者某些地方看起来不对劲。
+title: "[Bug]: "
+labels: ["bug"]
+body:
+  - type: textarea
+    id: version
+    attributes:
+      label: 版本
+      description: 你当前正在使用我们软件的哪个版本(pom文件内的版本号)?
+      value: |
+        jdk版本(带上尾号): 例如 1.8.0
+        框架版本(项目启动时输出的版本号): 例如 4.4.0
+        其他依赖版本(你觉得有必要的):
+    validations:
+      required: true
+  - type: checkboxes
+    attributes:
+      label: 功能不好用不会用是否已经看过项目文档?
+      options:
+        - label: https://plus-doc.dromara.org
+          required: true
+  - type: checkboxes
+    attributes:
+      label: 这个问题是否已经存在?
+      options:
+        - label: 我已经搜索过现有的问题 (https://gitee.com/dromara/RuoYi-Vue-Plus/issues)
+          required: true
+  - type: textarea
+    attributes:
+      label: 希望结果
+      description: 想知道你觉得怎么样是正常或者合理的。
+    validations:
+      required: true
+  - type: markdown
+    attributes:
+      label: 如何复现
+      description: 请详细告诉我们如何复现你遇到的问题
+      value: |
+        如涉及代码 可提供一个最小代码示例 并使用```附上它 或者截图均可 越详细越好<br>
+        大多数问题都是 代码编写错误问题 逻辑问题 或者用法错误等问题
+    validations:
+      required: true
+  - type: textarea
+    attributes:
+      label: 相关代码与报错信息(请勿发混乱格式)
+      description: 如果可以的话,上传任何关于 bug 的截图。
+      value: |
+        [在这里上传图片]
+

+ 5 - 0
.gitee/ISSUE_TEMPLATE/config.yml

@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+  - name: RuoYi-Vue-Plus 文档中心
+    url: https://plus-doc.dromara.org
+    about: 提供 RuoYi-Vue-Plus 搭建使用指南、平台基本开发使用方式、介绍、基础知识和常见问题解答

+ 43 - 0
.gitee/ISSUE_TEMPLATE/feature.yml

@@ -0,0 +1,43 @@
+name: 功能建议
+description: 对本项目提出一个功能建议
+title: "[功能建议]: "
+labels: ["enhancement"]
+body:
+  - type: markdown
+    attributes:
+      value: |
+        感谢提出功能建议,我们将仔细考虑!请持续关注该issues,在加入计划后我们会有贡献者设置为负责人,同时状态成为进行中。
+  - type: textarea
+    id: related-problem
+    attributes:
+      label: 你的功能建议是否和某个问题相关?
+      description: 清晰并简洁地描述问题是什么,例如,当我...时,我总是感到困扰。
+    validations:
+      required: false
+  - type: textarea
+    id: desired-solution
+    attributes:
+      label: 你希望看到什么解决方案?
+      description: 清晰并简洁地描述你希望发生的事情。
+    validations:
+      required: true
+  - type: textarea
+    id: alternatives
+    attributes:
+      label: 你考虑过哪些替代方案?
+      description: 清晰并简洁地描述你考虑过的任何替代解决方案或功能。
+    validations:
+      required: false
+  - type: textarea
+    id: additional-context
+    attributes:
+      label: 你有其他上下文或截图吗?
+      description: 在此处添加有关功能请求的任何其他上下文或截图。
+    validations:
+      required: false
+  - type: checkboxes
+    attributes:
+      label: 意向参与贡献
+      options:
+        - label: 我有意向参与具体功能的开发实现并将代码贡献回到上游社区
+          required: false

+ 7 - 0
.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md

@@ -0,0 +1,7 @@
+### 更改目的 解决了什么问题(请提交到dev分支)
+
+
+### 改动逻辑 这么写的思路(让作者更好的理解你的意图)
+
+
+### 测试 都做了哪些测试(未经过测试不采纳)

+ 48 - 0
.gitignore

@@ -0,0 +1,48 @@
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### JRebel ###
+rebel.xml
+
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.xml.versionsBackup
+*.swp
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml
+
+.flattened-pom.xml

+ 12 - 0
.run/ruoyi-monitor-admin.run.xml

@@ -0,0 +1,12 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
+    <deployment type="dockerfile">
+      <settings>
+        <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.1.0" />
+        <option name="buildOnly" value="true" />
+        <option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" />
+      </settings>
+    </deployment>
+    <method v="2" />
+  </configuration>
+</component>

+ 12 - 0
.run/ruoyi-powerjob-server.run.xml

@@ -0,0 +1,12 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="ruoyi-powerjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
+    <deployment type="dockerfile">
+      <settings>
+        <option name="imageTag" value="ruoyi/ruoyi-powerjob-server:5.1.0" />
+        <option name="buildOnly" value="true" />
+        <option name="sourceFilePath" value="ruoyi-extend/ruoyi-powerjob-server/Dockerfile" />
+      </settings>
+    </deployment>
+    <method v="2" />
+  </configuration>
+</component>

+ 12 - 0
.run/ruoyi-server.run.xml

@@ -0,0 +1,12 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
+    <deployment type="dockerfile">
+      <settings>
+        <option name="imageTag" value="ruoyi/ruoyi-server:5.1.0" />
+        <option name="buildOnly" value="true" />
+        <option name="sourceFilePath" value="ruoyi-admin/Dockerfile" />
+      </settings>
+    </deployment>
+    <method v="2" />
+  </configuration>
+</component>

+ 20 - 0
LICENSE

@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 Takai-Vue-Plus
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 185 - 0
README.md

@@ -0,0 +1,185 @@
+<img src="https://foruda.gitee.com/images/1679673773341074847/178e8451_1766278.png" width="50%" height="50%">
+<div style="height: 10px; clear: both;"></div>
+
+- - -
+## 平台简介
+
+[![码云Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/dromara/RuoYi-Vue-Plus)
+[![GitHub](https://img.shields.io/github/stars/dromara/RuoYi-Vue-Plus.svg?style=social&label=Stars)](https://github.com/dromara/RuoYi-Vue-Plus)
+[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE)
+[![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
+<br>
+[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.1.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
+[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.0-blue.svg)]()
+[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
+[![JDK-19](https://img.shields.io/badge/JDK-19-green.svg)]()
+
+> RuoYi-Vue-Plus 是重写 RuoYi-Vue 针对 `分布式集群与多租户` 场景全方位升级(不兼容原框架)
+
+> 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可<br>
+活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源
+
+> 系统演示: [传送门](https://plus-doc.dromara.org/#/common/demo_system)
+
+> 前端项目地址: [plus-ui](https://gitee.com/JavaLionLi/plus-ui)
+
+> 文档地址: [plus-doc](https://plus-doc.dromara.org) - [plus-doc(国内备用)](https://dromara.gitee.io/plus-doc)
+
+# 本框架与RuoYi的功能差异
+
+| 功能          | 本框架                                                                                                               | RuoYi                                                                              |
+|-------------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------|
+| 前端项目        | 采用 Vue3 + TS + ElementPlus 重写                                                                                     | 基于Vue2/Vue3 + JS                                                                   | 
+| 后端项目结构      | 采用插件化 + 扩展包形式 结构解耦 易于扩展                                                                                           | 模块相互注入耦合严重难以扩展                                                                     | 
+| 后端代码风格      | 严格遵守Alibaba规范与项目统一配置的代码格式化                                                                                        | 代码书写与常规结构不同阅读障碍大                                                                   |
+| Web容器       | 采用 Undertow 基于 XNIO 的高性能容器                                                                                        | 采用 Tomcat                                                                          |
+| 权限认证        | 采用 Sa-Token、Jwt 静态使用功能齐全 低耦合 高扩展                                                                                  | Spring Security 配置繁琐扩展性极差                                                          |
+| 权限注解        | 采用 Sa-Token 支持注解 登录校验、角色校验、权限校验、二级认证校验、HttpBasic校验、忽略校验<br/>角色与权限校验支持多种条件 如 `AND` `OR` 或 `权限 OR 角色` 等复杂表达式        | 只支持是否存在匹配                                                                          |
+| 三方鉴权        | 采用 JustAuth 第三方登录组件 支持微信、钉钉等数十种三方认证                                                                               | 无                                                                                  |
+| 关系数据库支持     | 原生支持 MySQL、Oracle、PostgreSQL、SQLServer<br/>可同时使用异构切换                                                              | 支持 Mysql、Oracle 不支持同时使用、不支持异构切换                                                    |
+| 缓存数据库       | 支持 Redis 5-7 支持大部分新功能特性 如 分布式限流、分布式队列                                                                             | Redis 简单 get set 支持                                                                |
+| Redis客户端    | 采用 Redisson Redis官方推荐 基于Netty的客户端工具<br/>支持Redis 90%以上的命令 底层优化规避很多不正确的用法 例如: keys被转换为scan<br/>支持单机、哨兵、单主集群、多主集群等模式 | Lettuce + RedisTemplate 支持模式少 工具使用繁琐<br/>连接池采用 common-pool Bug多经常性出问题              |
+| 缓存注解        | 采用 Spring-Cache 注解 对其扩展了实现支持了更多功能<br/>例如 过期时间 最大空闲时间 组最大长度等 只需一个注解即可完成数据自动缓存                                      | 需手动编写Redis代码逻辑                                                                     |
+| ORM框架       | 采用 Mybatis-Plus 基于对象几乎不用写SQL全java操作 功能强大插件众多<br/>例如多租户插件 分页插件 乐观锁插件等等                                             | 采用 Mybatis 基于XML需要手写SQL                                                            |
+| SQL监控       | 采用 p6spy 可输出完整SQL与执行时间监控                                                                                          | log输出 需手动拼接sql与参数无法快速查看调试问题                                                        |
+| 数据分页        | 采用 Mybatis-Plus 分页插件<br/>框架对其进行了扩展 对象化分页对象 支持多种方式传参 支持前端多排序 复杂排序                                                  | 采用 PageHelper 仅支持单查询分页 参数只能从param传 只能单排序 功能扩展性差 体验不好                               |
+| 数据权限        | 采用 Mybatis-Plus 插件 自行分析拼接SQL 无感式过滤<br/>只需为Mapper设置好注解条件 支持多种自定义 不限于部门角色                                           | 采用 注解+aop 实现 基于部门角色 生成的sql兼容性差 不支持其他业务扩展<br/>生成sql后需手动拼接到具体业务sql上 对于多个Mapper查询不起作用 |
+| 数据脱敏        | 采用 注解 + jackson 序列化期间脱敏 支持不同模块不同的脱敏条件<br/>支持多种策略 如身份证、手机号、地址、邮箱、银行卡等 可自行扩展                                        | 无                                                                                  |
+| 数据加解密       | 采用 注解 + mybatis 拦截器 对存取数据期间自动加解密<br/>支持多种策略 如BASE64、AES、RSA、SM2、SM4等                                              | 无                                                                                  |
+| 接口传输加密      | 采用 动态 AES + RSA 加密请求 body 每一次请求秘钥都不同大幅度降低可破解性                                                                     | 无                                                                                  |
+| 数据翻译        | 采用 注解 + jackson 序列化期间动态修改数据 数据进行翻译<br/>支持多种模式: `映射翻译` `直接翻译` `其他扩展条件翻译` 接口化两步即可完成自定义扩展 内置多种翻译实现                   | 无                                                                                  |
+| 多数据源框架      | 采用 dynamic-datasource 支持世面大部分数据库<br/>通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源<br/>支持spel表达式从请求头参数等条件切换数据源            | 基于 druid 手动编写代码配置数据源 配置繁琐 支持性差                                                     |
+| 多数据源事务      | 采用 dynamic-datasource 支持多数据源不同种类的数据库事务回滚                                                                          | 不支持                                                                                |
+| 数据库连接池      | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下                                                                        | 采用 druid bug众多 社区维护差 活跃度低 配置众多繁琐性能一般                                               |
+| 数据库主键       | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁                                                                  | 采用 数据库自增ID 支持数据量有限 不支持多数据源主键唯一                                                     |
+| WebSocket协议 | 基于 Spring 封装的 WebSocket 协议 扩展了Token鉴权与分布式会话同步 不再只是基于单机的废物                                                         | 无                                                                                  |
+| 序列化         | 采用 Jackson Spring官方内置序列化 靠谱!!!                                                                                    | 采用 fastjson bugjson 远近闻名                                                           | 
+| 分布式幂等       | 参考美团GTIS防重系统简化实现(细节可看文档)                                                                                          | 手动编写注解基于aop实现                                                                      |
+| 分布式锁        | 采用 Lock4j 底层基于 Redisson                                                                                           | 无                                                                                  |
+| 分布式任务调度     | 采用 PowerJob 天生支持分布式 统一的管理中心                                                                                       | 采用 Quartz 基于数据库锁性能差 集群需要做很多配置与改造                                                   | 
+| 文件存储        | 采用 Minio 分布式文件存储 天生支持多机、多硬盘、多分片、多副本存储<br/>支持权限管理 安全可靠 文件可加密存储                                                     | 采用 本机文件存储 文件裸漏 易丢失泄漏 不支持集群有单点效应                                                    |
+| 云存储         | 采用 AWS S3 协议客户端 支持 七牛、阿里、腾讯 等一切支持S3协议的厂家                                                                          | 不支持                                                                                |
+| 短信          | 采用 sms4j 短信融合包 支持数十种短信厂家 只需在yml配置好厂家密钥即可使用 可多厂家共用                                                                 | 不支持                                                                                |
+| 邮件          | 采用 mail-api 通用协议支持大部分邮件厂商                                                                                         | 不支持                                                                                |
+| 接口文档        | 采用 SpringDoc、javadoc 无注解零入侵基于java注释<br/>只需把注释写好 无需再写一大堆的文档注解了                                                     | 采用 Springfox 已停止维护 需要编写大量的注解来支持文档生成                                                | 
+| 校验框架        | 采用 Validation 支持注解与工具类校验 注解支持国际化                                                                                  | 仅支持注解 且注解不支持国际化                                                                    |
+| Excel框架     | 采用 Alibaba EasyExcel 基于插件化<br/>框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等                                               | 基于 POI 手写实现 功能有限 复杂 扩展性差                                                           |
+| 工具类框架       | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码                                                       | 手写工具稳定性差易出问题 工具数量有限 代码臃肿需自己手写 get set 等                                            | 
+| 监控框架        | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制<br/>实时监控服务状态 框架还为其扩展了在线日志查看监控                                    | 无                                                                                  | 
+| 链路追踪        | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗<br/>用了它即可实时查看请求经过的每一处每一个节点                                            | 无                                                                                  |
+| 代码生成器       | 只需设计好表结构 一键生成所有crud代码与页面<br/>降低80%的开发量 把精力都投入到业务设计上<br/>框架为其适配MP、SpringDoc规范化代码 同时支持动态多数据源代码生成                    | 代码生成原生结构 只支持单数据源生成                                                                 |
+| 部署方式        | 支持 Docker 编排 一键搭建所有环境 让开发人员从此不再为搭建环境而烦恼                                                                           | 原生jar部署 其他环境需手动下载安装 自行搭建                                                           | 
+| 项目路径修改      | 提供详细的修改方案文档 并为其做了一些改动 非常简单即可修改成自己想要的                                                                              | 需要做很多改造 文档说明有限                                                                     |
+| 国际化         | 基于请求头动态返回不同语种的文本内容 开发难度低 有对应的工具类 支持大部分注解内容国际化                                                                     | 只提供基础功能 其他需自行编写扩展                                                                  |
+| 代码单例测试      | 提供单例测试 使用方式编写方法与maven多环境单测插件                                                                                      | 只提供基础功能 其他需自行编写扩展                                                                  |
+| Demo案例      | 提供框架功能的实际使用案例 单独一个模块提供了很多很全                                                                                       | 无                                                                                  |
+
+
+## 本框架与RuoYi的业务差异
+
+| 业务     | 功能说明                                                                 | 本框架 | RuoYi            |
+|--------|----------------------------------------------------------------------|-----|------------------|
+| 租户管理   | 系统内租户的管理 如:租户套餐、过期时间、用户数量、企业信息等                                      | 支持  | 无                |
+| 租户套餐管理 | 系统内租户所能使用的套餐管理 如:套餐内所包含的菜单等                                          | 支持  | 无                |
+| 客户端管理  | 系统内对接的所有客户端管理 如: pc端、小程序端等<br>支持动态授权登录方式 如: 短信登录、密码登录等 支持动态控制token时效 | 支持  | 无                |
+| 用户管理   | 用户的管理配置 如:新增用户、分配用户所属部门、角色、岗位等                                       | 支持  | 支持               |
+| 部门管理   | 配置系统组织机构(公司、部门、小组) 树结构展现支持数据权限                                       | 支持  | 支持               |
+| 岗位管理   | 配置系统用户所属担任职务                                                         | 支持  | 支持               |
+| 菜单管理   | 配置系统菜单、操作权限、按钮权限标识等                                                  | 支持  | 支持               |
+| 角色管理   | 角色菜单权限分配、设置角色按机构进行数据范围权限划分                                           | 支持  | 支持               |
+| 字典管理   | 对系统中经常使用的一些较为固定的数据进行维护                                               | 支持  | 支持               |
+| 参数管理   | 对系统动态配置常用参数                                                          | 支持  | 支持               |
+| 通知公告   | 系统通知公告信息发布维护                                                         | 支持  | 支持               |
+| 操作日志   | 系统正常操作日志记录和查询 系统异常信息日志记录和查询                                          | 支持  | 支持               |
+| 登录日志   | 系统登录日志记录查询包含登录异常                                                     | 支持  | 支持               |
+| 文件管理   | 系统文件展示、上传、下载、删除等管理                                                   | 支持  | 无                |
+| 文件配置管理 | 系统文件上传、下载所需要的配置信息动态添加、修改、删除等管理                                       | 支持  | 无                |
+| 在线用户管理 | 已登录系统的在线用户信息监控与强制踢出操作                                                | 支持  | 支持               |
+| 定时任务   | 运行报表、任务管理(添加、修改、删除)、日志管理、执行器管理等                                      | 支持  | 仅支持任务与日志管理       |
+| 代码生成   | 多数据源前后端代码的生成(java、html、xml、sql)支持CRUD下载                              | 支持  | 仅支持单数据源          |
+| 系统接口   | 根据业务代码自动生成相关的api接口文档                                                 | 支持  | 支持               |
+| 服务监控   | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等                                  | 支持  | 仅支持单机CPU、内存、磁盘监控 |
+| 缓存监控   | 对系统的缓存信息查询,命令统计等。                                                    | 支持  | 支持               |
+| 在线构建器  | 拖动表单元素生成相应的HTML代码。                                                   | 支持  | 支持               |
+| 使用案例   | 系统的一些功能案例                                                            | 支持  | 不支持              |
+
+## 参考文档
+
+使用框架前请仔细阅读文档重点注意事项
+<br>
+>[初始化项目 必看](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init)
+>>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/init)
+>
+>[专栏与视频 入门必看](https://plus-doc.dromara.org/#/common/column)
+>>[https://plus-doc.dromara.org/#/common/column](https://plus-doc.dromara.org/#/common/column)
+>
+>[部署项目 必看](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy)
+>>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy)
+> 
+>[参考文档 Wiki](https://plus-doc.dromara.org)
+>>[https://plus-doc.dromara.org](https://plus-doc.dromara.org)
+> 
+>[参考文档(国内备份)](https://dromara.gitee.io/plus-doc)
+>>[https://dromara.gitee.io/plus-doc](https://dromara.gitee.io/plus-doc)
+
+
+## 软件架构图
+
+![Plus部署架构图](https://foruda.gitee.com/images/1678981882624240692/ae2a3f3e_1766278.png "Plus部署架构图.png")
+
+## 如何参与贡献
+
+[参与贡献的方式 https://plus-doc.dromara.org/#/common/contribution](https://plus-doc.dromara.org/#/common/contribution)
+
+### 其他
+
+* 定期同步升级 RuoYi-Vue 有用的更新
+* GitHub 地址 [RuoYi-Vue-Plus](https://github.com/dromara/RuoYi-Vue-Plus)
+* 微服务 分支 [RuoYi-Cloud-Plus](https://gitee.com/JavaLionLi/RuoYi-Cloud-Plus)
+* 前端项目 地址 [plus-ui](https://gitee.com/JavaLionLi/plus-ui)
+* 用户扩展项目 [扩展项目列表](https://plus-doc.dromara.org/#/ruoyi-vue-plus/extend-project/list)
+
+## 加群与捐献
+>[加群与捐献](https://plus-doc.dromara.org/#/ruoyi-vue-plus/other/group_chat)
+>>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/other/group_chat](https://plus-doc.dromara.org/#/ruoyi-vue-plus/other/group_chat)
+
+## 捐献作者
+作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭  
+<img src="https://foruda.gitee.com/images/1678975784848381069/d8661ed9_1766278.png" width="300px" height="450px" />
+<img src="https://foruda.gitee.com/images/1678975801230205215/6f96229d_1766278.png" width="300px" height="450px" />
+
+## 演示图例
+
+|                                                                                            |                                                                                            |
+|--------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
+| ![输入图片说明](https://foruda.gitee.com/images/1680077524361362822/270bb429_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680077619939771291/989bf9b6_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680077681751513929/1c27c5bd_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680077721559267315/74d63e23_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680077765638904515/1b75d4a6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078026375951297/eded7a4b_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078237104531207/0eb1b6a7_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078254306078709/5931e22f_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078287971528493/0b9af60a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078308138770249/8d3b6696_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078352553634393/db5ef880_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078378238393374/601e4357_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078414983206024/2aae27c1_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078446738419874/ecce7d59_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078475971341775/149e8634_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078491666717143/3fadece7_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078558863188826/fb8ced2a_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078574561685461/ae68a0b2_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078594932772013/9d8bfec6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078626493093532/fcfe4ff6_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078643608812515/0295bd4f_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078685196286463/d7612c81_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078703877318597/56fce0bc_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078716586545643/b6dbd68f_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078734103217688/eb1e6aa6_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078759131415480/73c525d8_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078779416197879/75e3ed02_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078802329118061/77e10915_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078893627848351/34a1c342_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078928175016986/f126ec4a_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078941718318363/b68a0f72_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078963175518631/3bb769a1_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078982294090567/b31c343d_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079000642440444/77ca82a9_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680079020995074177/03b7d52e_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079039367822173/76811806_1766278.png "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1680079274333484664/4dfdc7c0_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079290467458224/d6715fcf_1766278.png "屏幕截图") |
+
+
+
+
+
+
+
+
+
+
+
+

+ 1 - 0
plus-ui-ts

@@ -0,0 +1 @@
+Subproject commit 23a3015c849203e782aed09c0ff9b5ddd4a2a930

+ 483 - 0
pom.xml

@@ -0,0 +1,483 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.dromara</groupId>
+    <artifactId>takai-plus</artifactId>
+    <version>${revision}</version>
+
+    <name>Takai-Plus</name>
+<!--    <url>https://gitee.com/dromara/RuoYi-Vue-Plus</url>-->
+    <description>Takai-Plus多租户管理系统</description>
+
+    <properties>
+        <revision>5.1.0-BETA</revision>
+        <spring-boot.version>3.1.3</spring-boot.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>17</java.version>
+        <spring-boot.mybatis>3.0.2</spring-boot.mybatis>
+        <springdoc.version>2.2.0</springdoc.version>
+        <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
+        <poi.version>5.2.3</poi.version>
+        <easyexcel.version>3.3.2</easyexcel.version>
+        <velocity.version>2.3</velocity.version>
+        <satoken.version>1.35.0.RC</satoken.version>
+        <mybatis-plus.version>3.5.3.2</mybatis-plus.version>
+        <p6spy.version>3.9.1</p6spy.version>
+        <hutool.version>5.8.20</hutool.version>
+        <okhttp.version>4.10.0</okhttp.version>
+        <spring-boot-admin.version>3.1.5</spring-boot-admin.version>
+        <redisson.version>3.23.1</redisson.version>
+        <lock4j.version>2.2.4</lock4j.version>
+        <dynamic-ds.version>4.1.3</dynamic-ds.version>
+        <alibaba-ttl.version>2.14.2</alibaba-ttl.version>
+        <powerjob.version>4.3.3</powerjob.version>
+        <mapstruct-plus.version>1.3.5</mapstruct-plus.version>
+        <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
+        <lombok.version>1.18.26</lombok.version>
+        <bouncycastle.version>1.72</bouncycastle.version>
+        <justauth.version>1.16.5</justauth.version>
+        <!-- 离线IP地址定位库 -->
+        <ip2region.version>2.7.0</ip2region.version>
+
+        <!-- 临时修复 snakeyaml 漏洞 -->
+        <snakeyaml.version>1.33</snakeyaml.version>
+
+        <!-- OSS 配置 -->
+        <aws-java-sdk-s3.version>1.12.517</aws-java-sdk-s3.version>
+        <!-- SMS 配置 -->
+        <sms4j.version>2.2.0</sms4j.version>
+
+        <!-- 插件版本 -->
+        <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
+        <maven-war-plugin.version>3.2.2</maven-war-plugin.version>
+        <maven-compiler-plugin.verison>3.11.0</maven-compiler-plugin.verison>
+        <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
+        <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
+    </properties>
+
+    <profiles>
+        <profile>
+            <id>local</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>local</profiles.active>
+                <logging.level>debug</logging.level>
+            </properties>
+        </profile>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>dev</profiles.active>
+                <logging.level>debug</logging.level>
+            </properties>
+            <activation>
+                <!-- 默认环境 -->
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <profiles.active>prod</profiles.active>
+                <logging.level>warn</logging.level>
+            </properties>
+        </profile>
+    </profiles>
+
+    <!-- 依赖声明 -->
+    <dependencyManagement>
+        <dependencies>
+
+            <!-- SpringBoot的依赖配置-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- hutool 的依赖配置-->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-bom</artifactId>
+                <version>${hutool.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- JustAuth 的依赖配置-->
+            <dependency>
+                <groupId>me.zhyd.oauth</groupId>
+                <artifactId>JustAuth</artifactId>
+                <version>${justauth.version}</version>
+            </dependency>
+
+            <!-- common 的依赖配置-->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-bom</artifactId>
+                <version>${revision}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springdoc</groupId>
+                <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
+                <version>${springdoc.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.github.therapi</groupId>
+                <artifactId>therapi-runtime-javadoc</artifactId>
+                <version>${therapi-javadoc.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.poi</groupId>
+                        <artifactId>poi-ooxml-schemas</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
+            <!-- velocity代码生成使用模板 -->
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity-engine-core</artifactId>
+                <version>${velocity.version}</version>
+            </dependency>
+
+            <!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-spring-boot3-starter</artifactId>
+                <version>${satoken.version}</version>
+            </dependency>
+            <!-- Sa-Token 整合 jwt -->
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-jwt</artifactId>
+                <version>${satoken.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>cn.hutool</groupId>
+                        <artifactId>hutool-all</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-core</artifactId>
+                <version>${satoken.version}</version>
+            </dependency>
+
+            <!-- dynamic-datasource 多数据源-->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
+                <version>${dynamic-ds.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.mybatis.spring.boot</groupId>
+                <artifactId>mybatis-spring-boot-starter</artifactId>
+                <version>${spring-boot.mybatis}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-annotation</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+
+            <!-- sql性能分析插件 -->
+            <dependency>
+                <groupId>p6spy</groupId>
+                <artifactId>p6spy</artifactId>
+                <version>${p6spy.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.squareup.okhttp3</groupId>
+                <artifactId>okhttp</artifactId>
+                <version>${okhttp.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.amazonaws</groupId>
+                <artifactId>aws-java-sdk-s3</artifactId>
+                <version>${aws-java-sdk-s3.version}</version>
+            </dependency>
+            <!--短信sms4j-->
+            <dependency>
+                <groupId>org.dromara.sms4j</groupId>
+                <artifactId>sms4j-spring-boot-starter</artifactId>
+                <version>${sms4j.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>de.codecentric</groupId>
+                <artifactId>spring-boot-admin-starter-server</artifactId>
+                <version>${spring-boot-admin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>de.codecentric</groupId>
+                <artifactId>spring-boot-admin-starter-client</artifactId>
+                <version>${spring-boot-admin.version}</version>
+            </dependency>
+
+            <!--redisson-->
+            <dependency>
+                <groupId>org.redisson</groupId>
+                <artifactId>redisson-spring-boot-starter</artifactId>
+                <version>${redisson.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
+                <version>${lock4j.version}</version>
+            </dependency>
+
+            <!-- PowerJob -->
+            <dependency>
+                <groupId>tech.powerjob</groupId>
+                <artifactId>powerjob-worker-spring-boot-starter</artifactId>
+                <version>${powerjob.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>tech.powerjob</groupId>
+                <artifactId>powerjob-official-processors</artifactId>
+                <version>${powerjob.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>transmittable-thread-local</artifactId>
+                <version>${alibaba-ttl.version}</version>
+            </dependency>
+
+            <!-- 临时修复 snakeyaml 漏洞 -->
+            <dependency>
+                <groupId>org.yaml</groupId>
+                <artifactId>snakeyaml</artifactId>
+                <version>${snakeyaml.version}</version>
+            </dependency>
+
+            <!-- 加密包引入 -->
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcprov-jdk15to18</artifactId>
+                <version>${bouncycastle.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>io.github.linpeilie</groupId>
+                <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
+                <version>${mapstruct-plus.version}</version>
+            </dependency>
+
+            <!-- 离线IP地址定位库 ip2region -->
+            <dependency>
+                <groupId>org.lionsoul</groupId>
+                <artifactId>ip2region</artifactId>
+                <version>${ip2region.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-system</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-job</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-generator</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-demo</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+    <modules>
+        <module>takai-admin</module>
+        <module>takai-common</module>
+        <module>takai-extend</module>
+        <module>takai-modules</module>
+    </modules>
+    <packaging>pom</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.verison}</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>com.github.therapi</groupId>
+                            <artifactId>therapi-runtime-javadoc-scribe</artifactId>
+                            <version>${therapi-javadoc.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                            <version>${lombok.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.springframework.boot</groupId>
+                            <artifactId>spring-boot-configuration-processor</artifactId>
+                            <version>${spring-boot.version}</version>
+                        </path>
+                        <path>
+                            <groupId>io.github.linpeilie</groupId>
+                            <artifactId>mapstruct-plus-processor</artifactId>
+                            <version>${mapstruct-plus.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok-mapstruct-binding</artifactId>
+                            <version>${mapstruct-plus.lombok.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                    <compilerArgs>
+                        <arg>-parameters</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <!-- 单元测试使用 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${maven-surefire-plugin.version}</version>
+                <configuration>
+                    <!-- 根据打包环境执行对应的@Tag测试方法 -->
+                    <groups>${profiles.active}</groups>
+                    <!-- 排除标签 -->
+                    <excludedGroups>exclude</excludedGroups>
+                </configuration>
+            </plugin>
+            <!-- 统一版本号管理 -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>flatten-maven-plugin</artifactId>
+                <version>${flatten-maven-plugin.version}</version>
+                <configuration>
+                    <updatePomFile>true</updatePomFile>
+                    <flattenMode>resolveCiFriendliesOnly</flattenMode>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>flatten</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>flatten</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>flatten.clean</id>
+                        <phase>clean</phase>
+                        <goals>
+                            <goal>clean</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <!-- 关闭过滤 -->
+                <filtering>false</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <!-- 引入所有 匹配文件进行过滤 -->
+                <includes>
+                    <include>application*</include>
+                    <include>bootstrap*</include>
+                    <include>banner*</include>
+                </includes>
+                <!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>huawei nexus</name>
+            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>huawei nexus</name>
+            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>
+
+

+ 68 - 0
script/bin/ry.bat

@@ -0,0 +1,68 @@
+rem 使用者应根据自身平台编码自行转换 防止乱码 例如 win使用gbk编码
+@echo off
+
+rem jar平级目录
+set AppName=ruoyi-admin.jar
+
+rem JVM参数
+set JVM_OPTS="-Dname=%AppName%  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
+
+
+ECHO.
+	ECHO.  [1] 启动%AppName%
+	ECHO.  [2] 关闭%AppName%
+	ECHO.  [3] 重启%AppName%
+	ECHO.  [4] 启动状态 %AppName%
+	ECHO.  [5] 退 出
+ECHO.
+
+ECHO.请输入选择项目的序号:
+set /p ID=
+	IF "%id%"=="1" GOTO start
+	IF "%id%"=="2" GOTO stop
+	IF "%id%"=="3" GOTO restart
+	IF "%id%"=="4" GOTO status
+	IF "%id%"=="5" EXIT
+PAUSE
+:start
+    for /f "usebackq s=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
+		set pid=%%a
+		set image_name=%%b
+	)
+	if  defined pid (
+		echo %%is running
+		PAUSE
+	)
+
+start javaw %JVM_OPTS% -jar %AppName%
+
+echo  starting……
+echo  Start %AppName% success...
+goto:eof
+
+rem 函数stop通过jps命令查找pid并结束进程
+:stop
+	for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
+		set pid=%%a
+		set image_name=%%b
+	)
+	if not defined pid (echo process %AppName% does not exists) else (
+		echo prepare to kill %image_name%
+		echo start kill %pid% ...
+		rem 根据进程ID,kill进程
+		taskkill /f /pid %pid%
+	)
+goto:eof
+:restart
+	call :stop
+    call :start
+goto:eof
+:status
+	for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
+		set pid=%%a
+		set image_name=%%b
+	)
+	if not defined pid (echo process %AppName% is dead ) else (
+		echo %image_name% is running
+	)
+goto:eof

+ 86 - 0
script/bin/ry.sh

@@ -0,0 +1,86 @@
+#!/bin/sh
+# ./ry.sh start 启动 stop 停止 restart 重启 status 状态
+AppName=ruoyi-admin.jar
+
+# JVM参数
+JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
+APP_HOME=`pwd`
+LOG_PATH=$APP_HOME/logs/$AppName.log
+
+if [ "$1" = "" ];
+then
+    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
+    exit 1
+fi
+
+if [ "$AppName" = "" ];
+then
+    echo -e "\033[0;31m 未输入应用名 \033[0m"
+    exit 1
+fi
+
+function start()
+{
+    PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
+
+    if [ x"$PID" != x"" ]; then
+        echo "$AppName is running..."
+    else
+        nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 &
+        echo "Start $AppName success..."
+    fi
+}
+
+function stop()
+{
+    echo "Stop $AppName"
+
+    PID=""
+    query(){
+        PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
+    }
+
+    query
+    if [ x"$PID" != x"" ]; then
+        kill -TERM $PID
+        echo "$AppName (pid:$PID) exiting..."
+        while [ x"$PID" != x"" ]
+        do
+            sleep 1
+            query
+        done
+        echo "$AppName exited."
+    else
+        echo "$AppName already stopped."
+    fi
+}
+
+function restart()
+{
+    stop
+    sleep 2
+    start
+}
+
+function status()
+{
+    PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
+    if [ $PID != 0 ];then
+        echo "$AppName is running..."
+    else
+        echo "$AppName is not running..."
+    fi
+}
+
+case $1 in
+    start)
+    start;;
+    stop)
+    stop;;
+    restart)
+    restart;;
+    status)
+    status;;
+    *)
+
+esac

+ 61 - 0
script/docker/database.yml

@@ -0,0 +1,61 @@
+version: '3'
+
+services:
+  # 此镜像仅用于测试 正式环境需自行安装数据库
+  # SID: XE user: system password: oracle
+  oracle:
+    image: tekintian/oracle12c:latest
+    container_name: oracle
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+      DBCA_TOTAL_MEMORY: 16192
+    ports:
+      - "18080:8080"
+      - "1521:1521"
+    volumes:
+      # 数据挂载
+      - "/docker/oracle/data:/u01/app/oracle"
+    network_mode: "host"
+
+  # 此镜像仅用于测试 正式环境需自行安装数据库
+  sqlserver:
+    image: mcr.microsoft.com/mssql/server:2017-latest
+    container_name: sqlserver
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+      ACCEPT_EULA: "Y"
+      SA_PASSWORD: "Ruoyi@123"
+    ports:
+      - "1433:1433"
+    volumes:
+      # 数据挂载
+      - "/docker/sqlserver/data:/var/opt/mssql"
+    network_mode: "host"
+
+  postgres:
+    image: postgres:14.2
+    container_name: postgres
+    environment:
+      POSTGRES_USER: root
+      POSTGRES_PASSWORD: root
+      POSTGRES_DB: postgres
+    ports:
+      - "5432:5432"
+    volumes:
+      - /docker/postgres/data:/var/lib/postgresql/data
+    network_mode: "host"
+
+  postgres13:
+    image: postgres:13.6
+    container_name: postgres13
+    environment:
+      POSTGRES_USER: root
+      POSTGRES_PASSWORD: root
+      POSTGRES_DB: postgres
+    ports:
+      - "5433:5432"
+    volumes:
+      - /docker/postgres13/data:/var/lib/postgresql/data
+    network_mode: "host"

+ 158 - 0
script/docker/docker-compose.yml

@@ -0,0 +1,158 @@
+version: '3'
+
+services:
+  mysql:
+    image: mysql:8.0.33
+    container_name: mysql
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+      # root 密码
+      MYSQL_ROOT_PASSWORD: root
+      # 初始化数据库(后续的初始化sql会在这个库执行)
+      MYSQL_DATABASE: ry-vue
+    ports:
+      - "3306:3306"
+    volumes:
+      # 数据挂载
+      - /docker/mysql/data/:/var/lib/mysql/
+      # 配置挂载
+      - /docker/mysql/conf/:/etc/mysql/conf.d/
+    command:
+      # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
+      --default-authentication-plugin=mysql_native_password
+      --character-set-server=utf8mb4
+      --collation-server=utf8mb4_general_ci
+      --explicit_defaults_for_timestamp=true
+      --lower_case_table_names=1
+    privileged: true
+    network_mode: "host"
+
+  nginx-web:
+    image: nginx:1.23.4
+    container_name: nginx-web
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+    ports:
+      - "80:80"
+      - "443:443"
+    volumes:
+      # 证书映射
+      - /docker/nginx/cert:/etc/nginx/cert
+      # 配置文件映射
+      - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
+      # 页面目录
+      - /docker/nginx/html:/usr/share/nginx/html
+      # 日志目录
+      - /docker/nginx/log:/var/log/nginx
+    privileged: true
+    network_mode: "host"
+
+  redis:
+    image: redis:6.2.12
+    container_name: redis
+    ports:
+      - "6379:6379"
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+    volumes:
+      # 配置文件
+      - /docker/redis/conf:/redis/config:rw
+      # 数据文件
+      - /docker/redis/data/:/redis/data/:rw
+    command: "redis-server /redis/config/redis.conf"
+    privileged: true
+    network_mode: "host"
+
+  minio:
+    image: minio/minio:RELEASE.2023-04-13T03-08-07Z
+    container_name: minio
+    ports:
+      # api 端口
+      - "9000:9000"
+      # 控制台端口
+      - "9001:9001"
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+      # 管理后台用户名
+      MINIO_ROOT_USER: ruoyi
+      # 管理后台密码,最小8个字符
+      MINIO_ROOT_PASSWORD: ruoyi123
+      # https需要指定域名
+      #MINIO_SERVER_URL: "https://xxx.com:9000"
+      #MINIO_BROWSER_REDIRECT_URL: "https://xxx.com:9001"
+      # 开启压缩 on 开启 off 关闭
+      MINIO_COMPRESS: "off"
+      # 扩展名 .pdf,.doc 为空 所有类型均压缩
+      MINIO_COMPRESS_EXTENSIONS: ""
+      # mime 类型 application/pdf 为空 所有类型均压缩
+      MINIO_COMPRESS_MIME_TYPES: ""
+    volumes:
+      # 映射当前目录下的data目录至容器内/data目录
+      - /docker/minio/data:/data
+      # 映射配置目录
+      - /docker/minio/config:/root/.minio/
+    command: server --address ':9000' --console-address ':9001' /data  # 指定容器中的目录 /data
+    privileged: true
+    network_mode: "host"
+
+  ruoyi-server1:
+    image: ruoyi/ruoyi-server:5.1.0
+    container_name: ruoyi-server1
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+      SERVER_PORT: 8080
+    volumes:
+      # 配置文件
+      - /docker/server1/logs/:/ruoyi/server/logs/
+      # skywalking 探针
+#      - /docker/skywalking/agent/:/ruoyi/skywalking/agent
+    privileged: true
+    network_mode: "host"
+
+  ruoyi-server2:
+    image: ruoyi/ruoyi-server:5.1.0
+    container_name: ruoyi-server2
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+      SERVER_PORT: 8081
+    volumes:
+      # 配置文件
+      - /docker/server2/logs/:/ruoyi/server/logs/
+      # skywalking 探针
+#      - /docker/skywalking/agent/:/ruoyi/skywalking/agent
+    privileged: true
+    network_mode: "host"
+
+  ruoyi-monitor-admin:
+    image: ruoyi/ruoyi-monitor-admin:5.1.0
+    container_name: ruoyi-monitor-admin
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+    volumes:
+      # 配置文件
+      - /docker/monitor/logs/:/ruoyi/monitor/logs
+    privileged: true
+    network_mode: "host"
+
+  ruoyi-powerjob-server:
+    image: ruoyi/ruoyi-powerjob-server:5.1.0
+    container_name: ruoyi-powerjob-server
+    environment:
+      # 时区上海
+      TZ: Asia/Shanghai
+    ports:
+      - "7700:7700"
+      - "10086:10086"
+      - "10010:10010"
+    volumes:
+      - /docker/powerjob/logs/:/ruoyi/powerjob/logs
+    privileged: true
+    network_mode: "host"
+

+ 111 - 0
script/docker/nginx/conf/nginx.conf

@@ -0,0 +1,111 @@
+worker_processes  1;
+
+error_log  /var/log/nginx/error.log warn;
+pid        /var/run/nginx.pid;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    include       mime.types;
+    default_type  application/octet-stream;
+    sendfile        on;
+    keepalive_timeout  65;
+    # 限制body大小
+    client_max_body_size 100m;
+
+    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+                          '$status $body_bytes_sent "$http_referer" '
+                          '"$http_user_agent" "$http_x_forwarded_for"';
+
+    access_log  /var/log/nginx/access.log  main;
+
+    upstream server {
+        ip_hash;
+        server 127.0.0.1:8080;
+        server 127.0.0.1:8081;
+    }
+
+    upstream monitor-admin {
+        server 127.0.0.1:9090;
+    }
+
+    upstream powerjob-server {
+        server 127.0.0.1:7700;
+    }
+
+    server {
+        listen       80;
+        server_name  localhost;
+
+        # https配置参考 start
+        #listen       443 ssl;
+
+        # 证书直接存放 /docker/nginx/cert/ 目录下即可 更改证书名称即可 无需更改证书路径
+        #ssl on;
+        #ssl_certificate      /etc/nginx/cert/xxx.local.crt; # /etc/nginx/cert/ 为docker映射路径 不允许更改
+        #ssl_certificate_key  /etc/nginx/cert/xxx.local.key; # /etc/nginx/cert/ 为docker映射路径 不允许更改
+        #ssl_session_timeout 5m;
+        #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
+        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+        #ssl_prefer_server_ciphers on;
+        # https配置参考 end
+
+        # 演示环境配置 拦截除 GET POST 之外的所有请求
+        # if ($request_method !~* GET|POST) {
+        #     rewrite  ^/(.*)$  /403;
+        # }
+
+        # location = /403 {
+        #     default_type application/json;
+        #     return 200 '{"msg":"演示模式,不允许操作","code":500}';
+        # }
+
+        # 限制外网访问内网 actuator 相关路径
+        location ~ ^(/[^/]*)?/actuator(/.*)?$ {
+            return 403;
+        }
+
+        location / {
+            root   /usr/share/nginx/html;
+            try_files $uri $uri/ /index.html;
+            index  index.html index.htm;
+        }
+
+        location /prod-api/ {
+            proxy_set_header Host $http_host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header REMOTE-HOST $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://server/;
+        }
+
+        # https 会拦截内链所有的 http 请求 造成功能无法使用
+        # 解决方案1 将 admin 服务 也配置成 https
+        # 解决方案2 将菜单配置为外链访问 走独立页面 http 访问
+        location /admin/ {
+            proxy_set_header Host $http_host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header REMOTE-HOST $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://monitor-admin/admin/;
+        }
+
+        # https 会拦截内链所有的 http 请求 造成功能无法使用
+        # 解决方案1 将 powerjob 服务 也配置成 https
+        # 解决方案2 将菜单配置为外链访问 走独立页面 http 访问
+        location /powerjob/ {
+            proxy_set_header Host $http_host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header REMOTE-HOST $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://powerjob-server/;
+        }
+
+        error_page   500 502 503 504  /50x.html;
+        location = /50x.html {
+            root   html;
+        }
+    }
+}

+ 28 - 0
script/docker/redis/conf/redis.conf

@@ -0,0 +1,28 @@
+# redis 密码
+requirepass ruoyi123
+
+# key 监听器配置
+# notify-keyspace-events Ex
+
+# 配置持久化文件存储路径
+dir /redis/data
+# 配置rdb
+# 15分钟内有至少1个key被更改则进行快照
+save 900 1
+# 5分钟内有至少10个key被更改则进行快照
+save 300 10
+# 1分钟内有至少10000个key被更改则进行快照
+save 60 10000
+# 开启压缩
+rdbcompression yes
+# rdb文件名 用默认的即可
+dbfilename dump.rdb
+
+# 开启aof
+appendonly yes
+# 文件名
+appendfilename "appendonly.aof"
+# 持久化策略,no:不同步,everysec:每秒一次,always:总是同步,速度比较慢
+# appendfsync always
+appendfsync everysec
+# appendfsync no

+ 1 - 0
script/docker/redis/data/README.md

@@ -0,0 +1 @@
+数据目录 请执行 `chmod 777 /docker/redis/data` 赋予读写权限 否则将无法写入数据

+ 1251 - 0
script/sql/oracle/oracle_ry_vue_5.X.sql

@@ -0,0 +1,1251 @@
+-- ----------------------------
+-- 第三方平台授权表
+-- ----------------------------
+create table sys_social
+(
+    id                 number(20)        not null,
+    user_id            number(20)        not null,
+    tenant_id          varchar2(20)      default null,
+    auth_id            varchar2(255)     not null,
+    source             varchar2(255)     not null,
+    open_id            varchar2(255)     default null,
+    user_name          varchar2(30)      not null,
+    nick_name          varchar2(30)      default '',
+    email              varchar2(255)     default '',
+    avatar             varchar2(500)     default '',
+    access_token       varchar2(255)     not null,
+    expire_in          number(20)        default null,
+    refresh_token      varchar2(255)     default null,
+    access_code        varchar2(255)     default null,
+    union_id           varchar2(255)     default null,
+    scope              varchar2(255)     default null,
+    token_type         varchar2(255)     default null,
+    id_token           varchar2(255)     default null,
+    mac_algorithm      varchar2(255)     default null,
+    mac_key            varchar2(255)     default null,
+    code               varchar2(255)     default null,
+    oauth_token        varchar2(255)     default null,
+    oauth_token_secret varchar2(255)     default null,
+    create_dept        number(20),
+    create_by          number(20),
+    create_time        date,
+    update_by          number(20),
+    update_time        date,
+    del_flag           char(1)          default '0'
+);
+
+alter table sys_social add constraint pk_sys_social primary key (id);
+
+comment on table   sys_social                   is '社会化关系表';
+comment on column  sys_social.id                is '主键';
+comment on column  sys_social.user_id           is '用户ID';
+comment on column  sys_social.tenant_id         is '租户id';
+comment on column  sys_social.auth_id           is '平台+平台唯一id';
+comment on column  sys_social.source            is '用户来源';
+comment on column  sys_social.open_id           is '平台编号唯一id';
+comment on column  sys_social.user_name         is '登录账号';
+comment on column  sys_social.nick_name         is '用户昵称';
+comment on column  sys_social.email             is '用户邮箱';
+comment on column  sys_social.avatar            is '头像地址';
+comment on column  sys_social.access_token      is '用户的授权令牌';
+comment on column  sys_social.expire_in         is '用户的授权令牌的有效期,部分平台可能没有';
+comment on column  sys_social.refresh_token     is '刷新令牌,部分平台可能没有';
+comment on column  sys_social.access_code       is '平台的授权信息,部分平台可能没有';
+comment on column  sys_social.union_id          is '用户的 unionid';
+comment on column  sys_social.scope             is '授予的权限,部分平台可能没有';
+comment on column  sys_social.token_type        is '个别平台的授权信息,部分平台可能没有';
+comment on column  sys_social.id_token          is 'id token,部分平台可能没有';
+comment on column  sys_social.mac_algorithm     is '小米平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.mac_key           is '小米平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.code              is '用户的授权code,部分平台可能没有';
+comment on column  sys_social.oauth_token       is 'Twitter平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.oauth_token_secret is 'Twitter平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.create_dept       is '创建部门';
+comment on column  sys_social.create_by         is '创建者';
+comment on column  sys_social.create_time       is '创建时间';
+comment on column  sys_social.update_by         is '更新者';
+comment on column  sys_social.update_time       is '更新时间';
+comment on column  sys_social.del_flag          is '删除标志(0代表存在 2代表删除)';
+
+-- ----------------------------
+-- 租户表
+-- ----------------------------
+create table sys_tenant (
+    id                number(20)    not null,
+    tenant_id         varchar2(20)  not null,
+    contact_user_name varchar2(20)  default '',
+    contact_phone     varchar2(20)  default '',
+    company_name      varchar2(50)  default '',
+    license_number    varchar2(30)  default '',
+    address           varchar2(200) default '',
+    intro             varchar2(200) default '',
+    domain            varchar2(200) default '',
+    remark            varchar2(200) default '',
+    package_id        number(20)    default null,
+    expire_time       date          default null,
+    account_count     number(4)     default -1,
+    status            char(1)       default '0',
+    del_flag          char(1)       default '0',
+    create_dept       number(20)    default null,
+    create_by         number(20)    default null,
+    create_time       date,
+    update_by         number(20)    default null,
+    update_time       date
+);
+
+alter table sys_tenant add constraint pk_sys_tenant primary key (id);
+
+comment on table   sys_tenant                    is '租户表';
+comment on column  sys_tenant.tenant_id          is '租户编号';
+comment on column  sys_tenant.contact_phone      is '联系电话';
+comment on column  sys_tenant.company_name       is '企业名称';
+comment on column  sys_tenant.company_name       is '联系人';
+comment on column  sys_tenant.license_number     is '统一社会信用代码';
+comment on column  sys_tenant.address            is '地址';
+comment on column  sys_tenant.intro              is '企业简介';
+comment on column  sys_tenant.remark             is '备注';
+comment on column  sys_tenant.package_id         is '租户套餐编号';
+comment on column  sys_tenant.expire_time        is '过期时间';
+comment on column  sys_tenant.account_count      is '用户数量(-1不限制)';
+comment on column  sys_tenant.status             is '租户状态(0正常 1停用)';
+comment on column  sys_tenant.del_flag           is '删除标志(0代表存在 2代表删除)';
+comment on column  sys_tenant.create_dept        is '创建部门';
+comment on column  sys_tenant.create_by          is '创建者';
+comment on column  sys_tenant.create_time        is '创建时间';
+comment on column  sys_tenant.update_by          is '更新者';
+comment on column  sys_tenant.update_time        is '更新时间';
+
+-- ----------------------------
+-- 初始化-租户表数据
+-- ----------------------------
+
+insert into sys_tenant values(1, '000000', '管理组', '15888888888', 'XXX有限公司', null, null, '多租户通用后台管理管理系统', null, null, null, null, -1, '0', '0', 103, 1, sysdate, null, null);
+
+
+-- ----------------------------
+-- 租户套餐表
+-- ----------------------------
+create table sys_tenant_package (
+    package_id              number(20)      not null,
+    package_name            varchar2(20)    default '',
+    menu_ids                varchar2(3000)  default '',
+    remark                  varchar2(200)   default '',
+    menu_check_strictly     number(1)       default 1,
+    status                  char(1)         default '0',
+    del_flag                char(1)         default '0',
+    create_dept             number(20)      default null,
+    create_by               number(20)      default null,
+    create_time             date,
+    update_by               number(20)      default null,
+    update_time             date
+);
+
+alter table sys_tenant_package add constraint pk_sys_tenant_package primary key (package_id);
+
+comment on table   sys_tenant_package                    is '租户套餐表';
+comment on column  sys_tenant_package.package_id         is '租户套餐id';
+comment on column  sys_tenant_package.package_name       is '套餐名称';
+comment on column  sys_tenant_package.menu_ids           is '关联菜单id';
+comment on column  sys_tenant_package.remark             is '备注';
+comment on column  sys_tenant_package.status             is '状态(0正常 1停用)';
+comment on column  sys_tenant_package.del_flag           is '删除标志(0代表存在 2代表删除)';
+comment on column  sys_tenant_package.create_dept        is '创建部门';
+comment on column  sys_tenant_package.create_by          is '创建者';
+comment on column  sys_tenant_package.create_time        is '创建时间';
+comment on column  sys_tenant_package.update_by          is '更新者';
+comment on column  sys_tenant_package.update_time        is '更新时间';
+
+
+-- ----------------------------
+-- 1、部门表
+-- ----------------------------
+create table sys_dept (
+  dept_id           number(20)      not null,
+  tenant_id         varchar2(20)    default '000000',
+  parent_id         number(20)      default 0,
+  ancestors         varchar2(500)   default '',
+  dept_name         varchar2(30)    default '',
+  order_num         number(4)       default 0,
+  leader            number(20)     default null,
+  phone             varchar2(11)    default null,
+  email             varchar2(50)    default null,
+  status            char(1)         default '0',
+  del_flag          char(1)         default '0',
+  create_dept       number(20)      default null,
+  create_by         number(20)      default null,
+  create_time       date,
+  update_by         number(20)      default null,
+  update_time       date
+);
+
+alter table sys_dept add constraint pk_sys_dept primary key (dept_id);
+
+comment on table  sys_dept              is '部门表';
+comment on column sys_dept.dept_id      is '部门id';
+comment on column sys_dept.tenant_id    is '租户编号';
+comment on column sys_dept.parent_id    is '父部门id';
+comment on column sys_dept.ancestors    is '祖级列表';
+comment on column sys_dept.dept_name    is '部门名称';
+comment on column sys_dept.order_num    is '显示顺序';
+comment on column sys_dept.leader       is '负责人';
+comment on column sys_dept.phone        is '联系电话';
+comment on column sys_dept.email        is '邮箱';
+comment on column sys_dept.status       is '部门状态(0正常 1停用)';
+comment on column sys_dept.del_flag     is '删除标志(0代表存在 2代表删除)';
+comment on column sys_dept.create_dept  is '创建部门';
+comment on column sys_dept.create_by    is '创建者';
+comment on column sys_dept.create_time  is '创建时间';
+comment on column sys_dept.update_by    is '更新者';
+comment on column sys_dept.update_time  is '更新时间';
+
+-- ----------------------------
+-- 初始化-部门表数据
+-- ----------------------------
+insert into sys_dept values(100, '000000', 0,   '0',          'XXX科技',   0, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(101, '000000', 100, '0,100',      '深圳总公司', 1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(102, '000000', 100, '0,100',      '长沙分公司', 2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(103, '000000', 101, '0,100,101',  '研发部门',   1, 1, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(104, '000000', 101, '0,100,101',  '市场部门',   2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(105, '000000', 101, '0,100,101',  '测试部门',   3, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(106, '000000', 101, '0,100,101',  '财务部门',   4, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(107, '000000', 101, '0,100,101',  '运维部门',   5, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(108, '000000', 102, '0,100,102',  '市场部门',   1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+insert into sys_dept values(109, '000000', 102, '0,100,102',  '财务部门',   2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate, null, null);
+
+
+-- ----------------------------
+-- 2、用户信息表
+-- ----------------------------
+create table sys_user (
+  user_id           number(20)      not null,
+  tenant_id         varchar2(20)    default '000000',
+  dept_id           number(20)      default null,
+  user_name         varchar2(40)    not null,
+  nick_name         varchar2(40)    not null,
+  user_type         varchar2(10)    default 'sys_user',
+  email             varchar2(50)    default '',
+  phonenumber       varchar2(11)    default '',
+  sex               char(1)         default '0',
+  avatar            number(20)      default null,
+  password          varchar2(100)   default '',
+  status            char(1)         default '0',
+  del_flag          char(1)         default '0',
+  login_ip          varchar2(128)   default '',
+  login_date        date,
+  create_dept       number(20)      default null,
+  create_by         number(20)      default null,
+  create_time       date,
+  update_by         number(20)      default null,
+  update_time       date,
+  remark            varchar2(500)   default ''
+);
+
+alter table sys_user add constraint pk_sys_user primary key (user_id);
+
+comment on table  sys_user              is '用户信息表';
+comment on column sys_user.user_id      is '用户ID';
+comment on column sys_user.tenant_id    is '租户编号';
+comment on column sys_user.dept_id      is '部门ID';
+comment on column sys_user.user_name    is '用户账号';
+comment on column sys_user.nick_name    is '用户昵称';
+comment on column sys_user.user_type    is '用户类型(sys_user系统用户)';
+comment on column sys_user.email        is '用户邮箱';
+comment on column sys_user.phonenumber  is '手机号码';
+comment on column sys_user.sex          is '用户性别(0男 1女 2未知)';
+comment on column sys_user.avatar       is '头像路径';
+comment on column sys_user.password     is '密码';
+comment on column sys_user.status       is '帐号状态(0正常 1停用)';
+comment on column sys_user.del_flag     is '删除标志(0代表存在 2代表删除)';
+comment on column sys_user.login_ip     is '最后登录IP';
+comment on column sys_user.login_date   is '最后登录时间';
+comment on column sys_user.create_dept  is '创建部门';
+comment on column sys_user.create_by    is '创建者';
+comment on column sys_user.create_time  is '创建时间';
+comment on column sys_user.update_by    is '更新者';
+comment on column sys_user.update_time  is '更新时间';
+comment on column sys_user.remark       is '备注';
+
+-- ----------------------------
+-- 初始化-用户信息表数据
+-- ----------------------------
+insert into sys_user values(1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate, 103, 1, sysdate, null, null, '管理员');
+insert into sys_user values(2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@qq.com',  '15666666666', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate, 103, 1, sysdate, null, null, '测试员');
+
+
+-- ----------------------------
+-- 3、岗位信息表
+-- ----------------------------
+create table sys_post (
+  post_id           number(20)      not null,
+  tenant_id         varchar2(20)    default '000000',
+  post_code         varchar2(64)    not null,
+  post_name         varchar2(50)    not null,
+  post_sort         number(4)       not null,
+  status            char(1)         not null,
+  create_dept       number(20)      default null,
+  create_by         number(20)      default null,
+  create_time       date,
+  update_by         number(20)      default null,
+  update_time       date,
+  remark            varchar2(500)
+);
+
+alter table sys_post add constraint pk_sys_post primary key (post_id);
+
+comment on table  sys_post              is '岗位信息表';
+comment on column sys_post.post_id      is '岗位ID';
+comment on column sys_post.tenant_id    is '租户编号';
+comment on column sys_post.post_code    is '岗位编码';
+comment on column sys_post.post_name    is '岗位名称';
+comment on column sys_post.post_sort    is '显示顺序';
+comment on column sys_post.status       is '状态(0正常 1停用)';
+comment on column sys_post.create_dept  is '创建部门';
+comment on column sys_post.create_by    is '创建者';
+comment on column sys_post.create_time  is '创建时间';
+comment on column sys_post.update_by    is '更新者';
+comment on column sys_post.update_time  is '更新时间';
+comment on column sys_post.remark       is '备注';
+
+-- ----------------------------
+-- 初始化-岗位信息表数据
+-- ----------------------------
+insert into sys_post values(1, '000000', 'ceo',  '董事长',    1, '0', 103, 1, sysdate, null, null, '');
+insert into sys_post values(2, '000000', 'se',   '项目经理',  2, '0', 103, 1, sysdate, null, null, '');
+insert into sys_post values(3, '000000', 'hr',   '人力资源',  3, '0', 103, 1, sysdate, null, null, '');
+insert into sys_post values(4, '000000', 'user', '普通员工',  4, '0', 103, 1, sysdate, null, null, '');
+
+
+-- ----------------------------
+-- 4、角色信息表
+-- ----------------------------
+create table sys_role (
+  role_id              number(20)      not null,
+  tenant_id            varchar2(20)    default '000000',
+  role_name            varchar2(30)    not null,
+  role_key             varchar2(100)   not null,
+  role_sort            number(4)       not null,
+  data_scope           char(1)         default '1',
+  menu_check_strictly  number(1)       default 1,
+  dept_check_strictly  number(1)       default 1,
+  status               char(1)         not null,
+  del_flag             char(1)         default '0',
+  create_dept          number(20)      default null,
+  create_by            number(20)      default null,
+  create_time          date,
+  update_by            number(20)      default null,
+  update_time          date,
+  remark               varchar2(500)   default null
+);
+
+alter table sys_role add constraint pk_sys_role primary key (role_id);
+
+comment on table  sys_role                       is '角色信息表';
+comment on column sys_role.role_id               is '角色ID';
+comment on column sys_role.tenant_id             is '租户编号';
+comment on column sys_role.role_name             is '角色名称';
+comment on column sys_role.role_key              is '角色权限字符串';
+comment on column sys_role.role_sort             is '显示顺序';
+comment on column sys_role.data_scope            is '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)';
+comment on column sys_role.menu_check_strictly   is '菜单树选择项是否关联显示';
+comment on column sys_role.dept_check_strictly   is '部门树选择项是否关联显示';
+comment on column sys_role.status                is '角色状态(0正常 1停用)';
+comment on column sys_role.del_flag              is '删除标志(0代表存在 2代表删除)';
+comment on column sys_role.create_dept           is '创建部门';
+comment on column sys_role.create_by             is '创建者';
+comment on column sys_role.create_time           is '创建时间';
+comment on column sys_role.update_by             is '更新者';
+comment on column sys_role.update_time           is '更新时间';
+comment on column sys_role.remark                is '备注';
+
+-- ----------------------------
+-- 初始化-角色信息表数据
+-- ----------------------------
+insert into sys_role values('1', '000000', '超级管理员',  'superadmin',  1, 1, 1, 1, '0', '0', 103, 1, sysdate, null, null, '超级管理员');
+insert into sys_role values('2', '000000', '普通角色',    'common', 2, 2, 1, 1, '0', '0', 103, 1, sysdate, null, null, '普通角色');
+
+
+-- ----------------------------
+-- 5、菜单权限表
+-- ----------------------------
+create table sys_menu (
+  menu_id           number(20)      not null,
+  menu_name         varchar2(50)    not null,
+  parent_id         number(20)      default 0,
+  order_num         number(4)       default 0,
+  path              varchar2(200)    default '',
+  component         varchar2(255)    default null,
+  query_param       varchar2(255)    default null,
+  is_frame          number(1)       default 1,
+  is_cache          number(1)       default 0,
+  menu_type         char(1)         default '',
+  visible           char(1)         default 0,
+  status            char(1)         default 0,
+  perms             varchar2(100)   default null,
+  icon              varchar2(100)   default '#',
+  create_dept       number(20)      default null,
+  create_by         number(20)      default null,
+  create_time       date,
+  update_by         number(20)      default null,
+  update_time       date ,
+  remark            varchar2(500)   default ''
+);
+
+alter table sys_menu add constraint pk_sys_menu primary key (menu_id);
+
+comment on table  sys_menu              is '菜单权限表';
+comment on column sys_menu.menu_id      is '菜单ID';
+comment on column sys_menu.menu_name    is '菜单名称';
+comment on column sys_menu.parent_id    is '父菜单ID';
+comment on column sys_menu.order_num    is '显示顺序';
+comment on column sys_menu.path         is '请求地址';
+comment on column sys_menu.component    is '路由地址';
+comment on column sys_menu.query_param  is '路由参数';
+comment on column sys_menu.is_frame     is '是否为外链(0是 1否)';
+comment on column sys_menu.is_cache     is '是否缓存(0缓存 1不缓存)';
+comment on column sys_menu.menu_type    is '菜单类型(M目录 C菜单 F按钮)';
+comment on column sys_menu.visible      is '显示状态(0显示 1隐藏)';
+comment on column sys_menu.status       is '菜单状态(0正常 1停用)';
+comment on column sys_menu.perms        is '权限标识';
+comment on column sys_menu.icon         is '菜单图标';
+comment on column sys_menu.create_dept  is '创建部门';
+comment on column sys_menu.create_by    is '创建者';
+comment on column sys_menu.create_time  is '创建时间';
+comment on column sys_menu.update_by    is '更新者';
+comment on column sys_menu.update_time  is '更新时间';
+comment on column sys_menu.remark       is '备注';
+
+-- ----------------------------
+-- 初始化-菜单信息表数据
+-- ----------------------------
+-- 一级菜单
+insert into sys_menu values('1', '系统管理', '0', '1', 'system',           null, '', 1, 0, 'M', '0', '0', '', 'system',   103, 1, sysdate, null, null, '系统管理目录');
+insert into sys_menu values('6', '租户管理', '0', '2', 'tenant',           null, '', 1, 0, 'M', '0', '0', '', 'chart',    103, 1, sysdate, null, null, '租户管理目录');
+insert into sys_menu values('2', '系统监控', '0', '3', 'monitor',          null, '', 1, 0, 'M', '0', '0', '', 'monitor',  103, 1, sysdate, null, null, '系统监控目录');
+insert into sys_menu values('3', '系统工具', '0', '4', 'tool',             null, '', 1, 0, 'M', '0', '0', '', 'tool',     103, 1, sysdate, null, null, '系统工具目录');
+insert into sys_menu values('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide',    103, 1, sysdate, null, null, 'RuoYi-Vue-Plus官网地址');
+-- 二级菜单
+insert into sys_menu values('100',  '用户管理',     '1',   '1', 'user',             'system/user/index',            '', 1, 0, 'C', '0', '0', 'system:user:list',            'user',          103, 1, sysdate, null, null, '用户管理菜单');
+insert into sys_menu values('101',  '角色管理',     '1',   '2', 'role',             'system/role/index',            '', 1, 0, 'C', '0', '0', 'system:role:list',            'peoples',       103, 1, sysdate, null, null, '角色管理菜单');
+insert into sys_menu values('102',  '菜单管理',     '1',   '3', 'menu',             'system/menu/index',            '', 1, 0, 'C', '0', '0', 'system:menu:list',            'tree-table',    103, 1, sysdate, null, null, '菜单管理菜单');
+insert into sys_menu values('103',  '部门管理',     '1',   '4', 'dept',             'system/dept/index',            '', 1, 0, 'C', '0', '0', 'system:dept:list',            'tree',          103, 1, sysdate, null, null, '部门管理菜单');
+insert into sys_menu values('104',  '岗位管理',     '1',   '5', 'post',             'system/post/index',            '', 1, 0, 'C', '0', '0', 'system:post:list',            'post',          103, 1, sysdate, null, null, '岗位管理菜单');
+insert into sys_menu values('105',  '字典管理',     '1',   '6', 'dict',             'system/dict/index',            '', 1, 0, 'C', '0', '0', 'system:dict:list',            'dict',          103, 1, sysdate, null, null, '字典管理菜单');
+insert into sys_menu values('106',  '参数设置',     '1',   '7', 'config',           'system/config/index',          '', 1, 0, 'C', '0', '0', 'system:config:list',          'edit',          103, 1, sysdate, null, null, '参数设置菜单');
+insert into sys_menu values('107',  '通知公告',     '1',   '8', 'notice',           'system/notice/index',          '', 1, 0, 'C', '0', '0', 'system:notice:list',          'message',       103, 1, sysdate, null, null, '通知公告菜单');
+insert into sys_menu values('108',  '日志管理',     '1',   '9', 'log',              '',                             '', 1, 0, 'M', '0', '0', '',                            'log',           103, 1, sysdate, null, null, '日志管理菜单');
+insert into sys_menu values('109',  '在线用户',     '2',   '1', 'online',           'monitor/online/index',         '', 1, 0, 'C', '0', '0', 'monitor:online:list',         'online',        103, 1, sysdate, null, null, '在线用户菜单');
+insert into sys_menu values('113',  '缓存监控',     '2',   '5', 'cache',            'monitor/cache/index',          '', 1, 0, 'C', '0', '0', 'monitor:cache:list',          'redis',         103, 1, sysdate, null, null, '缓存监控菜单');
+insert into sys_menu values('114',  '表单构建',     '3',   '1', 'build',            'tool/build/index',             '', 1, 0, 'C', '0', '0', 'tool:build:list',             'build',         103, 1, sysdate, null, null, '表单构建菜单');
+insert into sys_menu values('115',  '代码生成',     '3',   '2', 'gen',              'tool/gen/index',               '', 1, 0, 'C', '0', '0', 'tool:gen:list',               'code',          103, 1, sysdate, null, null, '代码生成菜单');
+insert into sys_menu values('121',  '租户管理',     '6',   '1', 'tenant',           'system/tenant/index',          '', 1, 0, 'C', '0', '0', 'system:tenant:list',          'list',          103, 1, sysdate, null, null, '租户管理菜单');
+insert into sys_menu values('122',  '租户套餐管理', '6',   '2', 'tenantPackage',    'system/tenantPackage/index',   '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list',   'form',          103, 1, sysdate, null, null, '租户套餐管理菜单');
+insert into sys_menu values('123',  '客户端管理',   '1',   '11', 'client',           'system/client/index',          '', 1, 0, 'C', '0', '0', 'system:client:list',          'international', 103, 1, sysdate, null, null, '客户端管理菜单');
+-- springboot-admin监控
+insert into sys_menu values('117',  'Admin监控',   '2',    '5', 'Admin',            'monitor/admin/index',         '', 1, 0, 'C', '0', '0', 'monitor:admin:list',          'dashboard',     103, 1, sysdate, null, null, 'Admin监控菜单');
+-- oss菜单
+insert into sys_menu values('118',  '文件管理',     '1',    '10', 'oss',             'system/oss/index',            '', 1, 0, 'C', '0', '0', 'system:oss:list',             'upload',        103, 1, sysdate, null, null, '文件管理菜单');
+-- powerjob server控制台
+insert into sys_menu values('120',  '任务调度中心',  '2',    '5', 'powerjob',           'monitor/powerjob/index',        '', 1, 0, 'C', '0', '0', 'monitor:powerjob:list',         'job',           103, 1, sysdate, null, null, 'PowerJob控制台菜单');
+
+-- 三级菜单
+insert into sys_menu values('500',  '操作日志', '108', '1', 'operlog',    'monitor/operlog/index',    '', 1, 0, 'C', '0', '0', 'monitor:operlog:list',    'form',          103, 1, sysdate, null, null, '操作日志菜单');
+insert into sys_menu values('501',  '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor',    103, 1, sysdate, null, null, '登录日志菜单');
+-- 用户管理按钮
+insert into sys_menu values('1001', '用户查询', '100', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:query',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1002', '用户新增', '100', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:add',            '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1003', '用户修改', '100', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit',           '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1004', '用户删除', '100', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1005', '用户导出', '100', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:export',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1006', '用户导入', '100', '6',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:import',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1007', '重置密码', '100', '7',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd',       '#', 103, 1, sysdate, null, null, '');
+-- 角色管理按钮
+insert into sys_menu values('1008', '角色查询', '101', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:query',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1009', '角色新增', '101', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:add',            '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1010', '角色修改', '101', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit',           '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1011', '角色删除', '101', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1012', '角色导出', '101', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:export',         '#', 103, 1, sysdate, null, null, '');
+-- 菜单管理按钮
+insert into sys_menu values('1013', '菜单查询', '102', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1014', '菜单新增', '102', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add',            '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1015', '菜单修改', '102', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit',           '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1016', '菜单删除', '102', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove',         '#', 103, 1, sysdate, null, null, '');
+-- 部门管理按钮
+insert into sys_menu values('1017', '部门查询', '103', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1018', '部门新增', '103', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add',            '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1019', '部门修改', '103', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit',           '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1020', '部门删除', '103', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove',         '#', 103, 1, sysdate, null, null, '');
+-- 岗位管理按钮
+insert into sys_menu values('1021', '岗位查询', '104', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:query',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1022', '岗位新增', '104', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:add',            '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1023', '岗位修改', '104', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit',           '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1024', '岗位删除', '104', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1025', '岗位导出', '104', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:export',         '#', 103, 1, sysdate, null, null, '');
+-- 字典管理按钮
+insert into sys_menu values('1026', '字典查询', '105', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1027', '字典新增', '105', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add',            '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1028', '字典修改', '105', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit',           '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1029', '字典删除', '105', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1030', '字典导出', '105', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export',         '#', 103, 1, sysdate, null, null, '');
+-- 参数设置按钮
+insert into sys_menu values('1031', '参数查询', '106', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query',        '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1032', '参数新增', '106', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1033', '参数修改', '106', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1034', '参数删除', '106', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove',       '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1035', '参数导出', '106', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export',       '#', 103, 1, sysdate, null, null, '');
+-- 通知公告按钮
+insert into sys_menu values('1036', '公告查询', '107', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query',        '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1037', '公告新增', '107', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1038', '公告修改', '107', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1039', '公告删除', '107', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove',       '#', 103, 1, sysdate, null, null, '');
+-- 操作日志按钮
+insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query',      '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove',     '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export',     '#', 103, 1, sysdate, null, null, '');
+-- 登录日志按钮
+insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query',   '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove',  '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export',  '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock',  '#', 103, 1, sysdate, null, null, '');
+-- 在线用户按钮
+insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query',       '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1, sysdate, null, null, '');
+-- 代码生成按钮
+insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query',             '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit',              '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove',            '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import',            '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview',           '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code',              '#', 103, 1, sysdate, null, null, '');
+-- oss相关按钮
+insert into sys_menu values('1600', '文件查询', '118', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query',        '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1601', '文件上传', '118', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload',       '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1602', '文件下载', '118', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download',     '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1603', '文件删除', '118', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove',       '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1604', '配置添加', '118', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:add',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1605', '配置编辑', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:edit',         '#', 103, 1, sysdate, null, null, '');
+-- 租户管理相关按钮
+insert into sys_menu values('1606', '租户查询', '121', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query',   '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1607', '租户新增', '121', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add',     '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1608', '租户修改', '121', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit',    '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1609', '租户删除', '121', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove',  '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1610', '租户导出', '121', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export',  '#', 103, 1, sysdate, null, null, '');
+-- 租户套餐管理相关按钮
+insert into sys_menu values('1611', '租户套餐查询', '122', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query',   '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1612', '租户套餐新增', '122', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add',     '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit',    '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove',  '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export',  '#', 103, 1, sysdate, null, null, '');
+-- 客户端管理按钮
+insert into sys_menu values('1061', '客户端管理查询', '123', '1',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query',        '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1062', '客户端管理新增', '123', '2',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1063', '客户端管理修改', '123', '3',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1064', '客户端管理删除', '123', '4',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove',       '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1065', '客户端管理导出', '123', '5',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export',       '#', 103, 1, sysdate, null, null, '');
+
+-- ----------------------------
+-- 6、用户和角色关联表  用户N-1角色
+-- ----------------------------
+create table sys_user_role (
+  user_id  number(20)  not null,
+  role_id  number(20)  not null
+);
+
+alter table sys_user_role add constraint pk_sys_user_role primary key (user_id, role_id);
+
+comment on table  sys_user_role              is '用户和角色关联表';
+comment on column sys_user_role.user_id      is '用户ID';
+comment on column sys_user_role.role_id      is '角色ID';
+
+-- ----------------------------
+-- 初始化-用户和角色关联表数据
+-- ----------------------------
+insert into sys_user_role values ('1', '1');
+insert into sys_user_role values ('2', '2');
+
+
+-- ----------------------------
+-- 7、角色和菜单关联表  角色1-N菜单
+-- ----------------------------
+create table sys_role_menu (
+  role_id  number(20)  not null,
+  menu_id  number(20)  not null
+);
+
+alter table sys_role_menu add constraint pk_sys_role_menu primary key (role_id, menu_id);
+
+comment on table  sys_role_menu              is '角色和菜单关联表';
+comment on column sys_role_menu.role_id      is '角色ID';
+comment on column sys_role_menu.menu_id      is '菜单ID';
+
+-- ----------------------------
+-- 初始化-角色和菜单关联表数据
+-- ----------------------------
+insert into sys_role_menu values ('2', '1');
+insert into sys_role_menu values ('2', '2');
+insert into sys_role_menu values ('2', '3');
+insert into sys_role_menu values ('2', '4');
+insert into sys_role_menu values ('2', '100');
+insert into sys_role_menu values ('2', '101');
+insert into sys_role_menu values ('2', '102');
+insert into sys_role_menu values ('2', '103');
+insert into sys_role_menu values ('2', '104');
+insert into sys_role_menu values ('2', '105');
+insert into sys_role_menu values ('2', '106');
+insert into sys_role_menu values ('2', '107');
+insert into sys_role_menu values ('2', '108');
+insert into sys_role_menu values ('2', '109');
+insert into sys_role_menu values ('2', '110');
+insert into sys_role_menu values ('2', '111');
+insert into sys_role_menu values ('2', '112');
+insert into sys_role_menu values ('2', '113');
+insert into sys_role_menu values ('2', '114');
+insert into sys_role_menu values ('2', '115');
+insert into sys_role_menu values ('2', '116');
+insert into sys_role_menu values ('2', '500');
+insert into sys_role_menu values ('2', '501');
+insert into sys_role_menu values ('2', '1000');
+insert into sys_role_menu values ('2', '1001');
+insert into sys_role_menu values ('2', '1002');
+insert into sys_role_menu values ('2', '1003');
+insert into sys_role_menu values ('2', '1004');
+insert into sys_role_menu values ('2', '1005');
+insert into sys_role_menu values ('2', '1006');
+insert into sys_role_menu values ('2', '1007');
+insert into sys_role_menu values ('2', '1008');
+insert into sys_role_menu values ('2', '1009');
+insert into sys_role_menu values ('2', '1010');
+insert into sys_role_menu values ('2', '1011');
+insert into sys_role_menu values ('2', '1012');
+insert into sys_role_menu values ('2', '1013');
+insert into sys_role_menu values ('2', '1014');
+insert into sys_role_menu values ('2', '1015');
+insert into sys_role_menu values ('2', '1016');
+insert into sys_role_menu values ('2', '1017');
+insert into sys_role_menu values ('2', '1018');
+insert into sys_role_menu values ('2', '1019');
+insert into sys_role_menu values ('2', '1020');
+insert into sys_role_menu values ('2', '1021');
+insert into sys_role_menu values ('2', '1022');
+insert into sys_role_menu values ('2', '1023');
+insert into sys_role_menu values ('2', '1024');
+insert into sys_role_menu values ('2', '1025');
+insert into sys_role_menu values ('2', '1026');
+insert into sys_role_menu values ('2', '1027');
+insert into sys_role_menu values ('2', '1028');
+insert into sys_role_menu values ('2', '1029');
+insert into sys_role_menu values ('2', '1030');
+insert into sys_role_menu values ('2', '1031');
+insert into sys_role_menu values ('2', '1032');
+insert into sys_role_menu values ('2', '1033');
+insert into sys_role_menu values ('2', '1034');
+insert into sys_role_menu values ('2', '1035');
+insert into sys_role_menu values ('2', '1036');
+insert into sys_role_menu values ('2', '1037');
+insert into sys_role_menu values ('2', '1038');
+insert into sys_role_menu values ('2', '1039');
+insert into sys_role_menu values ('2', '1040');
+insert into sys_role_menu values ('2', '1041');
+insert into sys_role_menu values ('2', '1042');
+insert into sys_role_menu values ('2', '1043');
+insert into sys_role_menu values ('2', '1044');
+insert into sys_role_menu values ('2', '1045');
+insert into sys_role_menu values ('2', '1050');
+insert into sys_role_menu values ('2', '1046');
+insert into sys_role_menu values ('2', '1047');
+insert into sys_role_menu values ('2', '1048');
+insert into sys_role_menu values ('2', '1055');
+insert into sys_role_menu values ('2', '1056');
+insert into sys_role_menu values ('2', '1057');
+insert into sys_role_menu values ('2', '1058');
+insert into sys_role_menu values ('2', '1059');
+insert into sys_role_menu values ('2', '1060');
+insert into sys_role_menu values ('2', '1061');
+insert into sys_role_menu values ('2', '1062');
+insert into sys_role_menu values ('2', '1063');
+insert into sys_role_menu values ('2', '1064');
+insert into sys_role_menu values ('2', '1065');
+
+-- ----------------------------
+-- 8、角色和部门关联表  角色1-N部门
+-- ----------------------------
+create table sys_role_dept (
+  role_id  number(20)  not null,
+  dept_id  number(20)  not null
+);
+
+alter table sys_role_dept add constraint pk_sys_role_dept primary key (role_id, dept_id);
+
+comment on table  sys_role_dept              is '角色和部门关联表';
+comment on column sys_role_dept.role_id      is '角色ID';
+comment on column sys_role_dept.dept_id      is '部门ID';
+
+-- ----------------------------
+-- 初始化-角色和部门关联表数据
+-- ----------------------------
+insert into sys_role_dept values ('2', '100');
+insert into sys_role_dept values ('2', '101');
+insert into sys_role_dept values ('2', '105');
+
+
+-- ----------------------------
+-- 9、用户与岗位关联表  用户1-N岗位
+-- ----------------------------
+create table sys_user_post (
+  user_id number(20)  not null,
+  post_id number(20)  not null
+);
+
+alter table sys_user_post add constraint pk_sys_user_post primary key (user_id, post_id);
+
+comment on table  sys_user_post              is '用户与岗位关联表';
+comment on column sys_user_post.user_id      is '用户ID';
+comment on column sys_user_post.post_id      is '岗位ID';
+
+-- ----------------------------
+-- 初始化-用户与岗位关联表数据
+-- ----------------------------
+insert into sys_user_post values ('1', '1');
+insert into sys_user_post values ('2', '2');
+
+
+-- ----------------------------
+-- 10、操作日志记录
+-- ----------------------------
+create table sys_oper_log (
+  oper_id           number(20)      not null,
+  tenant_id         varchar2(20)    default '000000',
+  title             varchar2(50)    default '',
+  business_type     number(2)       default 0,
+  method            varchar2(100)   default '',
+  request_method    varchar2(10)     default '',
+  operator_type     number(1)       default 0,
+  oper_name         varchar2(50)    default '',
+  dept_name         varchar2(50)    default '',
+  oper_url          varchar2(255)   default '',
+  oper_ip           varchar2(128)   default '',
+  oper_location     varchar2(255)   default '',
+  oper_param        varchar2(2100)  default '',
+  json_result       varchar2(2100)  default '',
+  status            number(1)       default 0,
+  error_msg         varchar2(2100)  default '',
+  oper_time         date,
+  cost_time         number(20)      default 0
+);
+
+alter table sys_oper_log add constraint pk_sys_oper_log primary key (oper_id);
+create index idx_sys_oper_log_bt on sys_oper_log (business_type);
+create index idx_sys_oper_log_s on sys_oper_log (status);
+create index idx_sys_oper_log_ot on sys_oper_log (oper_time);
+
+comment on table  sys_oper_log                is '操作日志记录';
+comment on column sys_oper_log.oper_id        is '日志主键';
+comment on column sys_oper_log.tenant_id      is '租户编号';
+comment on column sys_oper_log.title          is '模块标题';
+comment on column sys_oper_log.business_type  is '业务类型(0其它 1新增 2修改 3删除)';
+comment on column sys_oper_log.method         is '方法名称';
+comment on column sys_oper_log.request_method is '请求方式';
+comment on column sys_oper_log.operator_type  is '操作类别(0其它 1后台用户 2手机端用户)';
+comment on column sys_oper_log.oper_name      is '操作人员';
+comment on column sys_oper_log.dept_name      is '部门名称';
+comment on column sys_oper_log.oper_url       is '请求URL';
+comment on column sys_oper_log.oper_ip        is '主机地址';
+comment on column sys_oper_log.oper_location  is '操作地点';
+comment on column sys_oper_log.oper_param     is '请求参数';
+comment on column sys_oper_log.json_result    is '返回参数';
+comment on column sys_oper_log.status         is '操作状态(0正常 1异常)';
+comment on column sys_oper_log.error_msg      is '错误消息';
+comment on column sys_oper_log.oper_time      is '操作时间';
+comment on column sys_oper_log.cost_time      is '消耗时间';
+
+
+-- ----------------------------
+-- 11、字典类型表
+-- ----------------------------
+create table sys_dict_type (
+  dict_id           number(20)      not null,
+  tenant_id         varchar2(20)    default '000000',
+  dict_name         varchar2(100)   default '',
+  dict_type         varchar2(100)   default '',
+  create_dept       number(20)      default null,
+  create_by         number(20)      default null,
+  create_time       date,
+  update_by         number(20)      default null,
+  update_time       date,
+  remark            varchar2(500)   default null
+);
+
+alter table sys_dict_type add constraint pk_sys_dict_type primary key (dict_id);
+create unique index sys_dict_type_index1 on sys_dict_type (tenant_id, dict_type);
+
+comment on table  sys_dict_type               is '字典类型表';
+comment on column sys_dict_type.dict_id       is '字典主键';
+comment on column sys_dict_type.tenant_id     is '租户编号';
+comment on column sys_dict_type.dict_name     is '字典名称';
+comment on column sys_dict_type.dict_type     is '字典类型';
+comment on column sys_dict_type.create_dept   is '创建部门';
+comment on column sys_dict_type.create_by     is '创建者';
+comment on column sys_dict_type.create_time   is '创建时间';
+comment on column sys_dict_type.update_by     is '更新者';
+comment on column sys_dict_type.update_time   is '更新时间';
+comment on column sys_dict_type.remark        is '备注';
+
+insert into sys_dict_type values(1, '000000', '用户性别', 'sys_user_sex',        103, 1, sysdate, null, null, '用户性别列表');
+insert into sys_dict_type values(2, '000000', '菜单状态', 'sys_show_hide',       103, 1, sysdate, null, null, '菜单状态列表');
+insert into sys_dict_type values(3, '000000', '系统开关', 'sys_normal_disable',  103, 1, sysdate, null, null, '系统开关列表');
+insert into sys_dict_type values(6, '000000', '系统是否', 'sys_yes_no',          103, 1, sysdate, null, null, '系统是否列表');
+insert into sys_dict_type values(7, '000000', '通知类型', 'sys_notice_type',     103, 1, sysdate, null, null, '通知类型列表');
+insert into sys_dict_type values(8, '000000', '通知状态', 'sys_notice_status',   103, 1, sysdate, null, null, '通知状态列表');
+insert into sys_dict_type values(9, '000000', '操作类型', 'sys_oper_type',       103, 1, sysdate, null, null, '操作类型列表');
+insert into sys_dict_type values(10, '000000', '系统状态', 'sys_common_status',  103, 1, sysdate, null, null, '登录状态列表');
+insert into sys_dict_type values(11, '000000', '授权类型', 'sys_grant_type',     103, 1, sysdate, null, null, '认证授权类型');
+insert into sys_dict_type values(12, '000000', '设备类型', 'sys_device_type',    103, 1, sysdate, null, null, '客户端设备类型');
+
+
+-- ----------------------------
+-- 12、字典数据表
+-- ----------------------------
+create table sys_dict_data (
+  dict_code        number(20)      not null,
+  tenant_id        varchar2(20)    default '000000',
+  dict_sort        number(4)       default 0,
+  dict_label       varchar2(100)   default '',
+  dict_value       varchar2(100)   default '',
+  dict_type        varchar2(100)   default '',
+  css_class        varchar2(100)   default null,
+  list_class       varchar2(100)   default null,
+  is_default       char(1)         default 'N',
+  create_dept      number(20)      default null,
+  create_by        number(20)      default null,
+  create_time      date,
+  update_by        number(20)      default null,
+  update_time      date,
+  remark           varchar2(500)   default null
+);
+
+alter table sys_dict_data add constraint pk_sys_dict_data primary key (dict_code);
+
+comment on table  sys_dict_data               is '字典数据表';
+comment on column sys_dict_data.dict_code     is '字典主键';
+comment on column sys_dict_data.tenant_id     is '租户编号';
+comment on column sys_dict_data.dict_sort     is '字典排序';
+comment on column sys_dict_data.dict_label    is '字典标签';
+comment on column sys_dict_data.dict_value    is '字典键值';
+comment on column sys_dict_data.dict_type     is '字典类型';
+comment on column sys_dict_data.css_class     is '样式属性(其他样式扩展)';
+comment on column sys_dict_data.list_class    is '表格回显样式';
+comment on column sys_dict_data.is_default    is '是否默认(Y是 N否)';
+comment on column sys_dict_data.create_dept   is '创建部门';
+comment on column sys_dict_data.create_by     is '创建者';
+comment on column sys_dict_data.create_time   is '创建时间';
+comment on column sys_dict_data.update_by     is '更新者';
+comment on column sys_dict_data.update_time   is '更新时间';
+comment on column sys_dict_data.remark        is '备注';
+
+insert into sys_dict_data values(1, '000000', 1,  '男',       '0',       'sys_user_sex',        '',   '',        'Y', 103, 1, sysdate, null, null, '性别男');
+insert into sys_dict_data values(2, '000000', 2,  '女',       '1',       'sys_user_sex',        '',   '',        'N', 103, 1, sysdate, null, null, '性别女');
+insert into sys_dict_data values(3, '000000', 3,  '未知',     '2',       'sys_user_sex',        '',   '',        'N', 103, 1, sysdate, null, null, '性别未知');
+insert into sys_dict_data values(4, '000000', 1,  '显示',     '0',       'sys_show_hide',       '',   'primary', 'Y', 103, 1, sysdate, null, null, '显示菜单');
+insert into sys_dict_data values(5, '000000', 2,  '隐藏',     '1',       'sys_show_hide',       '',   'danger',  'N', 103, 1, sysdate, null, null, '隐藏菜单');
+insert into sys_dict_data values(6, '000000', 1,  '正常',     '0',       'sys_normal_disable',  '',   'primary', 'Y', 103, 1, sysdate, null, null, '正常状态');
+insert into sys_dict_data values(7, '000000', 2,  '停用',     '1',       'sys_normal_disable',  '',   'danger',  'N', 103, 1, sysdate, null, null, '停用状态');
+insert into sys_dict_data values(12, '000000', 1,  '是',       'Y',       'sys_yes_no',          '',   'primary', 'Y', 103, 1, sysdate, null, null, '系统默认是');
+insert into sys_dict_data values(13, '000000', 2,  '否',       'N',       'sys_yes_no',          '',   'danger',  'N', 103, 1, sysdate, null, null, '系统默认否');
+insert into sys_dict_data values(14, '000000', 1,  '通知',     '1',       'sys_notice_type',     '',   'warning', 'Y', 103, 1, sysdate, null, null, '通知');
+insert into sys_dict_data values(15, '000000', 2,  '公告',     '2',       'sys_notice_type',     '',   'success', 'N', 103, 1, sysdate, null, null, '公告');
+insert into sys_dict_data values(16, '000000', 1,  '正常',     '0',       'sys_notice_status',   '',   'primary', 'Y', 103, 1, sysdate, null, null, '正常状态');
+insert into sys_dict_data values(17, '000000', 2,  '关闭',     '1',       'sys_notice_status',   '',   'danger',  'N', 103, 1, sysdate, null, null, '关闭状态');
+insert into sys_dict_data values(29, '000000', 99, '其他',     '0',       'sys_oper_type',       '',   'info',    'N', 103, 1, sysdate, null, null, '其他操作');
+insert into sys_dict_data values(18, '000000', 1,  '新增',     '1',       'sys_oper_type',       '',   'info',    'N', 103, 1, sysdate, null, null, '新增操作');
+insert into sys_dict_data values(19, '000000', 2,  '修改',     '2',       'sys_oper_type',       '',   'info',    'N', 103, 1, sysdate, null, null, '修改操作');
+insert into sys_dict_data values(20, '000000', 3,  '删除',     '3',       'sys_oper_type',       '',   'danger',  'N', 103, 1, sysdate, null, null, '删除操作');
+insert into sys_dict_data values(21, '000000', 4,  '授权',     '4',       'sys_oper_type',       '',   'primary', 'N', 103, 1, sysdate, null, null, '授权操作');
+insert into sys_dict_data values(22, '000000', 5,  '导出',     '5',       'sys_oper_type',       '',   'warning', 'N', 103, 1, sysdate, null, null, '导出操作');
+insert into sys_dict_data values(23, '000000', 6,  '导入',     '6',       'sys_oper_type',       '',   'warning', 'N', 103, 1, sysdate, null, null, '导入操作');
+insert into sys_dict_data values(24, '000000', 7,  '强退',     '7',       'sys_oper_type',       '',   'danger',  'N', 103, 1, sysdate, null, null, '强退操作');
+insert into sys_dict_data values(25, '000000', 8,  '生成代码', '8',       'sys_oper_type',       '',   'warning', 'N', 103, 1, sysdate, null, null, '生成操作');
+insert into sys_dict_data values(26, '000000', 9,  '清空数据', '9',       'sys_oper_type',       '',   'danger',  'N', 103, 1, sysdate, null, null, '清空操作');
+insert into sys_dict_data values(27, '000000', 1,  '成功',     '0',       'sys_common_status',   '',   'primary', 'N', 103, 1, sysdate, null, null, '正常状态');
+insert into sys_dict_data values(28, '000000', 2,  '失败',     '1',       'sys_common_status',   '',   'danger',  'N', 103, 1, sysdate, null, null, '停用状态');
+insert into sys_dict_data values(30, '000000', 0,  '密码认证', 'password',   'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate, null, null, '密码认证');
+insert into sys_dict_data values(31, '000000', 0,  '短信认证', 'sms',        'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate, null, null, '短信认证');
+insert into sys_dict_data values(32, '000000', 0,  '邮件认证', 'email',      'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate, null, null, '邮件认证');
+insert into sys_dict_data values(33, '000000', 0,  '小程序认证', 'xcx',      'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate, null, null, '小程序认证');
+insert into sys_dict_data values(34, '000000', 0,  '三方登录认证', 'social', 'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate, null, null, '三方登录认证');
+insert into sys_dict_data values(35, '000000', 0,  'PC',      'pc',          'sys_device_type',  '',   'default', 'N', 103, 1, sysdate, null, null, 'PC');
+insert into sys_dict_data values(36, '000000', 0,  '安卓',     'android',    'sys_device_type',  '',   'default', 'N', 103, 1, sysdate, null, null, '安卓');
+insert into sys_dict_data values(37, '000000', 0,  'iOS',     'ios',         'sys_device_type',  '',   'default', 'N', 103, 1, sysdate, null, null, 'iOS');
+insert into sys_dict_data values(38, '000000', 0,  '小程序',     'xcx',      'sys_device_type',  '',   'default', 'N', 103, 1, sysdate, null, null, '小程序');
+
+
+-- ----------------------------
+-- 13、参数配置表
+-- ----------------------------
+create table sys_config (
+  config_id         number(20)     not null,
+  tenant_id         varchar2(20)   default '000000',
+  config_name       varchar2(100)  default '',
+  config_key        varchar2(100)  default '',
+  config_value      varchar2(100)  default '',
+  config_type       char(1)        default 'N',
+  create_dept       number(20)     default null,
+  create_by         number(20)     default null,
+  create_time       date,
+  update_by         number(20)     default null,
+  update_time       date,
+  remark            varchar2(500)  default null
+);
+alter table sys_config add constraint pk_sys_config primary key (config_id);
+
+comment on table  sys_config               is '参数配置表';
+comment on column sys_config.config_id     is '参数主键';
+comment on column sys_config.tenant_id     is '租户编号';
+comment on column sys_config.config_name   is '参数名称';
+comment on column sys_config.config_key    is '参数键名';
+comment on column sys_config.config_value  is '参数键值';
+comment on column sys_config.config_type   is '系统内置(Y是 N否)';
+comment on column sys_config.create_dept   is '创建部门';
+comment on column sys_config.create_by     is '创建者';
+comment on column sys_config.create_time   is '创建时间';
+comment on column sys_config.update_by     is '更新者';
+comment on column sys_config.update_time   is '更新时间';
+comment on column sys_config.remark        is '备注';
+
+insert into sys_config values(1, '000000', '主框架页-默认皮肤样式名称',      'sys.index.skinName',            'skin-blue',     'Y', 103, 1, sysdate, null, null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
+insert into sys_config values(2, '000000', '用户管理-账号初始密码',         'sys.user.initPassword',         '123456',        'Y', 103, 1, sysdate, null, null, '初始化密码 123456' );
+insert into sys_config values(3, '000000', '主框架页-侧边栏主题',           'sys.index.sideTheme',           'theme-dark',    'Y', 103, 1, sysdate, null, null, '深色主题theme-dark,浅色主题theme-light' );
+insert into sys_config values(5, '000000', '账号自助-是否开启用户注册功能',   'sys.account.registerUser',      'false',         'Y', 103, 1, sysdate, null, null, '是否开启注册用户功能(true开启,false关闭)');
+insert into sys_config values(11, '000000', 'OSS预览列表资源开关',          'sys.oss.previewListResource',   'true',          'Y', 103, 1, sysdate, null, null, 'true:开启, false:关闭');
+
+
+-- ----------------------------
+-- 14、系统访问记录
+-- ----------------------------
+create table sys_logininfor (
+  info_id         number(20)     not null,
+  tenant_id       varchar2(20)   default '000000',
+  user_name       varchar2(50)   default '',
+  ipaddr          varchar2(128)  default '',
+  login_location  varchar2(255)  default '',
+  browser         varchar2(50)   default '',
+  os              varchar2(50)   default '',
+  status          char(1)        default '0',
+  msg             varchar2(255)  default '',
+  login_time      date
+);
+
+alter table sys_logininfor add constraint pk_sys_logininfor primary key (info_id);
+create index idx_sys_logininfor_s on sys_logininfor (status);
+create index idx_sys_logininfor_lt on sys_logininfor (login_time);
+
+comment on table  sys_logininfor                is '系统访问记录';
+comment on column sys_logininfor.info_id        is '访问ID';
+comment on column sys_logininfor.tenant_id      is '租户编号';
+comment on column sys_logininfor.user_name      is '登录账号';
+comment on column sys_logininfor.ipaddr         is '登录IP地址';
+comment on column sys_logininfor.login_location is '登录地点';
+comment on column sys_logininfor.browser        is '浏览器类型';
+comment on column sys_logininfor.os             is '操作系统';
+comment on column sys_logininfor.status         is '登录状态(0成功 1失败)';
+comment on column sys_logininfor.msg            is '提示消息';
+comment on column sys_logininfor.login_time     is '访问时间';
+
+
+-- ----------------------------
+-- 17、通知公告表
+-- ----------------------------
+create table sys_notice (
+  notice_id         number(20)      not null,
+  tenant_id         varchar2(20)    default '000000',
+  notice_title      varchar2(50)    not null,
+  notice_type       char(1)         not null,
+  notice_content    clob            default null,
+  status            char(1)         default '0',
+  create_dept       number(20)      default null,
+  create_by         number(20)      default null,
+  create_time       date,
+  update_by         number(20)      default null,
+  update_time       date,
+  remark            varchar2(255)   default null
+);
+
+alter table sys_notice add constraint pk_sys_notice primary key (notice_id);
+
+comment on table  sys_notice                   is '通知公告表';
+comment on column sys_notice.notice_id         is '公告主键';
+comment on column sys_notice.tenant_id         is '租户编号';
+comment on column sys_notice.notice_title      is '公告标题';
+comment on column sys_notice.notice_type       is '公告类型(1通知 2公告)';
+comment on column sys_notice.notice_content    is '公告内容';
+comment on column sys_notice.status            is '公告状态(0正常 1关闭)';
+comment on column sys_notice.create_dept       is '创建部门';
+comment on column sys_notice.create_by         is '创建者';
+comment on column sys_notice.create_time       is '创建时间';
+comment on column sys_notice.update_by         is '更新者';
+comment on column sys_notice.update_time       is '更新时间';
+comment on column sys_notice.remark            is '备注';
+
+-- ----------------------------
+-- 初始化-公告信息表数据
+-- ----------------------------
+insert into sys_notice values('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, sysdate, null, null, '管理员');
+insert into sys_notice values('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容',   '0', 103, 1, sysdate, null, null, '管理员');
+
+
+-- ----------------------------
+-- 18、代码生成业务表
+-- ----------------------------
+create table gen_table (
+  table_id          number(20)       not null,
+  data_name         varchar2(200)    default '',
+  table_name        varchar2(200)    default '',
+  table_comment     varchar2(500)    default '',
+  sub_table_name    varchar2(64)     default null,
+  sub_table_fk_name varchar2(64)     default null,
+  class_name        varchar2(100)    default '',
+  tpl_category      varchar2(200)    default 'crud',
+  package_name      varchar2(100),
+  module_name       varchar2(30),
+  business_name     varchar2(30),
+  function_name     varchar2(50),
+  function_author   varchar2(50),
+  gen_type          char(1)          default '0',
+  gen_path          varchar2(200)    default '/',
+  options           varchar2(1000),
+  create_dept       number(20)       default null,
+  create_by         number(20)       default null,
+  create_time       date,
+  update_by         number(20)       default null,
+  update_time       date,
+  remark            varchar2(500)    default null
+);
+
+alter table gen_table add constraint pk_gen_table primary key (table_id);
+
+comment on table  gen_table                   is '代码生成业务表';
+comment on column gen_table.table_id          is '编号';
+comment on column gen_table.data_name         is '数据源名称';
+comment on column gen_table.table_name        is '表名称';
+comment on column gen_table.table_comment     is '表描述';
+comment on column gen_table.sub_table_name    is '关联子表的表名';
+comment on column gen_table.sub_table_fk_name is '子表关联的外键名';
+comment on column gen_table.class_name        is '实体类名称';
+comment on column gen_table.tpl_category      is '使用的模板(crud单表操作 tree树表操作)';
+comment on column gen_table.package_name      is '生成包路径';
+comment on column gen_table.module_name       is '生成模块名';
+comment on column gen_table.business_name     is '生成业务名';
+comment on column gen_table.function_name     is '生成功能名';
+comment on column gen_table.function_author   is '生成功能作者';
+comment on column gen_table.gen_type          is '生成代码方式(0zip压缩包 1自定义路径)';
+comment on column gen_table.gen_path          is '生成路径(不填默认项目路径)';
+comment on column gen_table.options           is '其它生成选项';
+comment on column gen_table.create_dept       is '创建部门';
+comment on column gen_table.create_by         is '创建者';
+comment on column gen_table.create_time       is '创建时间';
+comment on column gen_table.update_by         is '更新者';
+comment on column gen_table.update_time       is '更新时间';
+comment on column gen_table.remark            is '备注';
+
+
+-- ----------------------------
+-- 19、代码生成业务表字段
+-- ----------------------------
+create table gen_table_column (
+  column_id         number(20)      not null,
+  table_id          number(20),
+  column_name       varchar2(200),
+  column_comment    varchar2(500),
+  column_type       varchar2(100),
+  java_type         varchar2(500),
+  java_field        varchar2(200),
+  is_pk             char(1),
+  is_increment      char(1),
+  is_required       char(1),
+  is_insert         char(1),
+  is_edit           char(1),
+  is_list           char(1),
+  is_query          char(1),
+  query_type        varchar2(200)    default 'EQ',
+  html_type         varchar2(200),
+  dict_type         varchar2(200)    default '',
+  sort              number(4),
+  create_dept       number(20)       default null,
+  create_by         number(20)       default null,
+  create_time       date ,
+  update_by         number(20)       default null,
+  update_time       date
+);
+
+alter table gen_table_column add constraint pk_gen_table_column primary key (column_id);
+
+comment on table  gen_table_column                is '代码生成业务表字段';
+comment on column gen_table_column.column_id      is '编号';
+comment on column gen_table_column.table_id       is '归属表编号';
+comment on column gen_table_column.column_name    is '列名称';
+comment on column gen_table_column.column_comment is '列描述';
+comment on column gen_table_column.column_type    is '列类型';
+comment on column gen_table_column.java_type      is 'JAVA类型';
+comment on column gen_table_column.java_field     is 'JAVA字段名';
+comment on column gen_table_column.is_pk          is '是否主键(1是)';
+comment on column gen_table_column.is_increment   is '是否自增(1是)';
+comment on column gen_table_column.is_required    is '是否必填(1是)';
+comment on column gen_table_column.is_insert      is '是否为插入字段(1是)';
+comment on column gen_table_column.is_edit        is '是否编辑字段(1是)';
+comment on column gen_table_column.is_list        is '是否列表字段(1是)';
+comment on column gen_table_column.is_query       is '是否查询字段(1是)';
+comment on column gen_table_column.query_type     is '查询方式(等于、不等于、大于、小于、范围)';
+comment on column gen_table_column.html_type      is '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)';
+comment on column gen_table_column.dict_type      is '字典类型';
+comment on column gen_table_column.sort           is '排序';
+comment on column gen_table_column.create_dept    is '创建部门';
+comment on column gen_table_column.create_by      is '创建者';
+comment on column gen_table_column.create_time    is '创建时间';
+comment on column gen_table_column.update_by      is '更新者';
+comment on column gen_table_column.update_time    is '更新时间';
+
+
+-- ----------------------------
+-- OSS对象存储表
+-- ----------------------------
+create table sys_oss (
+  oss_id          number(20)     not null,
+  tenant_id       varchar2(20)   default '000000',
+  file_name       varchar2(255)  not null,
+  original_name   varchar2(255)  not null,
+  file_suffix     varchar2(10)   not null,
+  url             varchar2(500)  not null,
+  service         varchar2(20)   default 'minio' not null,
+  create_dept     number(20)     default null,
+  create_by       number(20)     default null,
+  create_time     date,
+  update_by       number(20)     default null,
+  update_time     date
+);
+
+alter table sys_oss add constraint pk_sys_oss primary key (oss_id);
+
+comment on table sys_oss                    is 'OSS对象存储表';
+comment on column sys_oss.oss_id            is '对象存储主键';
+comment on column sys_oss.tenant_id         is '租户编码';
+comment on column sys_oss.file_name         is '文件名';
+comment on column sys_oss.original_name     is '原名';
+comment on column sys_oss.file_suffix       is '文件后缀名';
+comment on column sys_oss.url               is 'URL地址';
+comment on column sys_oss.service           is '服务商';
+comment on column sys_oss.create_dept       is '创建部门';
+comment on column sys_oss.create_time       is '创建时间';
+comment on column sys_oss.create_by         is '上传者';
+comment on column sys_oss.update_time       is '更新时间';
+comment on column sys_oss.update_by         is '更新者';
+
+
+-- ----------------------------
+-- OSS对象存储动态配置表
+-- ----------------------------
+create table sys_oss_config (
+  oss_config_id   number(20)     not null,
+  tenant_id       varchar2(20)   default '000000',
+  config_key      varchar2(20)   not null,
+  access_key      varchar2(255)  default '',
+  secret_key      varchar2(255)  default '',
+  bucket_name     varchar2(255)  default '',
+  prefix          varchar2(255)  default '',
+  endpoint        varchar2(255)  default '',
+  domain          varchar2(255)  default '',
+  is_https        char(1)        default 'N',
+  region          varchar2(255)  default '',
+  access_policy   char(1)        default '1' not null,
+  status          char(1)        default '1',
+  ext1            varchar2(255)  default '',
+  remark          varchar2(500)  default null,
+  create_dept     number(20)     default null,
+  create_by       number(20)     default null,
+  create_time     date,
+  update_by       number(20)     default null,
+  update_time     date
+);
+
+alter table sys_oss_config add constraint pk_sys_oss_config primary key (oss_config_id);
+
+comment on table sys_oss_config                 is '对象存储配置表';
+comment on column sys_oss_config.oss_config_id  is '主建';
+comment on column sys_oss_config.tenant_id      is '租户编码';
+comment on column sys_oss_config.config_key     is '配置key';
+comment on column sys_oss_config.access_key     is 'accesskey';
+comment on column sys_oss_config.secret_key     is '秘钥';
+comment on column sys_oss_config.bucket_name    is '桶名称';
+comment on column sys_oss_config.prefix         is '前缀';
+comment on column sys_oss_config.endpoint       is '访问站点';
+comment on column sys_oss_config.domain         is '自定义域名';
+comment on column sys_oss_config.is_https       is '是否https(Y=是,N=否)';
+comment on column sys_oss_config.region         is '域';
+comment on column sys_oss_config.access_policy  is '桶权限类型(0=private 1=public 2=custom)';
+comment on column sys_oss_config.status         is '是否默认(0=是,1=否)';
+comment on column sys_oss_config.ext1           is '扩展字段';
+comment on column sys_oss_config.remark         is '备注';
+comment on column sys_oss_config.create_dept    is '创建部门';
+comment on column sys_oss_config.create_by      is '创建者';
+comment on column sys_oss_config.create_time    is '创建时间';
+comment on column sys_oss_config.update_by      is '更新者';
+comment on column sys_oss_config.update_time    is '更新时间';
+
+insert into sys_oss_config values (1, '000000', 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                '','N', '',            '1', '0', '', NULL, 103, 1, sysdate, 1, sysdate);
+insert into sys_oss_config values (2, '000000', 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',     '','N', '',            '1', '1', '', NULL, 103, 1, sysdate, 1, sysdate);
+insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',   '','N', '',            '1', '1', '', NULL, 103, 1, sysdate, 1, sysdate);
+insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',   '','N', 'ap-beijing',  '1', '1', '', NULL, 103, 1, sysdate, 1, sysdate);
+insert into sys_oss_config values (5, '000000', 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',           '','N', '',            '1', '1', '', NULL, 103, 1, sysdate, 1, sysdate);
+
+-- ----------------------------
+-- 系统授权表
+-- ----------------------------
+create table sys_client (
+    id                  number(20)     not null,
+    client_id           varchar2(64)   default null,
+    client_key          varchar2(32)   default null,
+    client_secret       varchar2(255)  default null,
+    grant_type          varchar2(255)  default null,
+    device_type         varchar2(32)   default null,
+    active_timeout      number(11)     default 1800,
+    timeout             number(11)     default 604800,
+    status              char(1)        default '0',
+    del_flag            char(1)        default '0',
+    create_dept         number(20)     default null,
+    create_by           number(20)     default null,
+    create_time         date,
+    update_by           number(20)     default null,
+    update_time         date
+);
+
+alter table sys_client add constraint pk_sys_client primary key (id);
+
+comment on table sys_client                         is '系统授权表';
+comment on column sys_client.id                     is '主建';
+comment on column sys_client.client_id              is '客户端id';
+comment on column sys_client.client_key             is '客户端key';
+comment on column sys_client.client_secret          is '客户端秘钥';
+comment on column sys_client.grant_type             is '授权类型';
+comment on column sys_client.device_type            is '设备类型';
+comment on column sys_client.active_timeout         is 'token活跃超时时间';
+comment on column sys_client.timeout                is 'token固定超时';
+comment on column sys_client.status                 is '状态(0正常 1停用)';
+comment on column sys_client.del_flag               is '删除标志(0代表存在 2代表删除)';
+comment on column sys_client.create_dept            is '创建部门';
+comment on column sys_client.create_by              is '创建者';
+comment on column sys_client.create_time            is '创建时间';
+comment on column sys_client.update_by              is '更新者';
+comment on column sys_client.update_time            is '更新时间';
+
+insert into sys_client values (1, 'e5cd7e4891bf95d1d19206ce24a7b32e', 'pc', 'pc123', 'password,social', 'pc', 1800, 604800, 0, 0, 103, 1, sysdate, 1, sysdate);
+insert into sys_client values (2, '428a8310cd442757ae699df5d894f051', 'app', 'app123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 103, 1, sysdate, 1, sysdate);
+
+
+-- ----------------------------
+-- 钩子 ,用于session连接之后 自动设置默认的date类型格式化 简化时间查询
+-- 如需设置其它配置 可在此钩子内任意增加处理语句
+-- 例如: SELECT * FROM sys_user WHERE create_time BETWEEN '2022-03-01 00:00:00' AND '2022-04-01 00:00:00'
+-- ----------------------------
+create or replace trigger login_trg
+after logon on database
+begin
+execute immediate 'alter session set nls_date_format=''YYYY-MM-DD HH24:MI:SS''';
+end;

+ 204 - 0
script/sql/oracle/oracle_test.sql

@@ -0,0 +1,204 @@
+create table test_demo (
+    id          number(20)      not null,
+    tenant_id   varchar2(20)    default '000000',
+    dept_id     number(20)      default null,
+    user_id     number(20)      default null,
+    order_num   number(10)      default 0,
+    test_key    varchar2(255)   default null,
+    value       varchar2(255)   default null,
+    version     number(10)      default 0,
+    create_dept number(20)      default null,
+    create_time date,
+    create_by   number(20)      default null,
+    update_time date,
+    update_by   number(20)      default null,
+    del_flag    number(2)       default 0
+);
+
+alter table test_demo add constraint pk_test_demo primary key (id);
+
+comment on table  test_demo              is '测试单表';
+comment on column test_demo.id           is '主键';
+comment on column test_demo.tenant_id    is '租户编号';
+comment on column test_demo.dept_id      is '部门id';
+comment on column test_demo.user_id      is '用户id';
+comment on column test_demo.order_num    is '排序号';
+comment on column test_demo.test_key     is 'key键';
+comment on column test_demo.value        is '值';
+comment on column test_demo.version      is '版本';
+comment on column test_demo.create_dept  is '创建部门';
+comment on column test_demo.create_time  is '创建时间';
+comment on column test_demo.create_by    is '创建人';
+comment on column test_demo.update_time  is '更新时间';
+comment on column test_demo.update_by    is '更新人';
+comment on column test_demo.del_flag     is '删除标志';
+
+create table test_tree (
+    id          number(20)      not null,
+    tenant_id   varchar2(20)    default '000000',
+    parent_id   number(20)      default 0,
+    dept_id     number(20)      default null,
+    user_id     number(20)      default null,
+    tree_name   varchar2(255)   default null,
+    version     number(10)      default 0,
+    create_dept number(20)      default null,
+    create_time date,
+    create_by   number(20)      default null,
+    update_time date,
+    update_by   number(20)      default null,
+    del_flag    number(2)       default 0
+);
+
+alter table test_tree add constraint pk_test_tree primary key (id);
+
+comment on table  test_tree              is '测试树表';
+comment on column test_tree.id           is '主键';
+comment on column test_tree.tenant_id    is '租户编号';
+comment on column test_tree.parent_id    is '父id';
+comment on column test_tree.dept_id      is '部门id';
+comment on column test_tree.user_id      is '用户id';
+comment on column test_tree.tree_name    is '值';
+comment on column test_tree.version      is '版本';
+comment on column test_tree.create_dept  is '创建部门';
+comment on column test_tree.create_time  is '创建时间';
+comment on column test_tree.create_by    is '创建人';
+comment on column test_tree.update_time  is '更新时间';
+comment on column test_tree.update_by    is '更新人';
+comment on column test_tree.del_flag     is '删除标志';
+
+insert into sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) values (3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate, 103, 1, sysdate, 3, sysdate, null);
+insert into sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) values (4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate, 103, 1, sysdate, 4, sysdate, null);
+
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (5, '测试菜单', 0, 5, 'demo', null, 1, 0, 'M', '0', '0', null, 'star', 103, 1, sysdate, 1, sysdate, '');
+
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1500, '测试单表', 5, 1, 'demo', 'demo/demo/index', 1, 0, 'C', '0', '0', 'demo:demo:list', '#', 103, 1, sysdate, null, null, '测试单表菜单');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1501, '测试单表查询', 1500, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:query', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1502, '测试单表新增', 1500, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:add', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1503, '测试单表修改', 1500, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:edit', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1504, '测试单表删除', 1500, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:remove', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1505, '测试单表导出', 1500, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:export', '#', 103, 1, sysdate, null, null, '');
+
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1506, '测试树表', 5, 1, 'tree', 'demo/tree/index', 1, 0, 'C', '0', '0', 'demo:tree:list', '#', 103, 1, sysdate, null, null, '测试树表菜单');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1507, '测试树表查询', 1506, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:query', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1508, '测试树表新增', 1506, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:add', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1509, '测试树表修改', 1506, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:edit', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1510, '测试树表删除', 1506, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (1511, '测试树表导出', 1506, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, sysdate, null, null, '');
+
+insert into sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) values (3, '000000', '本部门及以下', 'test1', 3, '4', 1, 1, '0', '0', 103, 1, sysdate, null, null, null);
+insert into sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) values (4, '000000', '仅本人',      'test2', 4, '5', 1, 1, '0', '0', 103, 1, sysdate, null, null, null);
+
+insert into sys_role_menu(role_id, menu_id) values (3, 1);
+insert into sys_role_menu(role_id, menu_id) values (3, 5);
+insert into sys_role_menu(role_id, menu_id) values (3, 100);
+insert into sys_role_menu(role_id, menu_id) values (3, 101);
+insert into sys_role_menu(role_id, menu_id) values (3, 102);
+insert into sys_role_menu(role_id, menu_id) values (3, 103);
+insert into sys_role_menu(role_id, menu_id) values (3, 104);
+insert into sys_role_menu(role_id, menu_id) values (3, 105);
+insert into sys_role_menu(role_id, menu_id) values (3, 106);
+insert into sys_role_menu(role_id, menu_id) values (3, 107);
+insert into sys_role_menu(role_id, menu_id) values (3, 108);
+insert into sys_role_menu(role_id, menu_id) values (3, 500);
+insert into sys_role_menu(role_id, menu_id) values (3, 501);
+insert into sys_role_menu(role_id, menu_id) values (3, 1001);
+insert into sys_role_menu(role_id, menu_id) values (3, 1002);
+insert into sys_role_menu(role_id, menu_id) values (3, 1003);
+insert into sys_role_menu(role_id, menu_id) values (3, 1004);
+insert into sys_role_menu(role_id, menu_id) values (3, 1005);
+insert into sys_role_menu(role_id, menu_id) values (3, 1006);
+insert into sys_role_menu(role_id, menu_id) values (3, 1007);
+insert into sys_role_menu(role_id, menu_id) values (3, 1008);
+insert into sys_role_menu(role_id, menu_id) values (3, 1009);
+insert into sys_role_menu(role_id, menu_id) values (3, 1010);
+insert into sys_role_menu(role_id, menu_id) values (3, 1011);
+insert into sys_role_menu(role_id, menu_id) values (3, 1012);
+insert into sys_role_menu(role_id, menu_id) values (3, 1013);
+insert into sys_role_menu(role_id, menu_id) values (3, 1014);
+insert into sys_role_menu(role_id, menu_id) values (3, 1015);
+insert into sys_role_menu(role_id, menu_id) values (3, 1016);
+insert into sys_role_menu(role_id, menu_id) values (3, 1017);
+insert into sys_role_menu(role_id, menu_id) values (3, 1018);
+insert into sys_role_menu(role_id, menu_id) values (3, 1019);
+insert into sys_role_menu(role_id, menu_id) values (3, 1020);
+insert into sys_role_menu(role_id, menu_id) values (3, 1021);
+insert into sys_role_menu(role_id, menu_id) values (3, 1022);
+insert into sys_role_menu(role_id, menu_id) values (3, 1023);
+insert into sys_role_menu(role_id, menu_id) values (3, 1024);
+insert into sys_role_menu(role_id, menu_id) values (3, 1025);
+insert into sys_role_menu(role_id, menu_id) values (3, 1026);
+insert into sys_role_menu(role_id, menu_id) values (3, 1027);
+insert into sys_role_menu(role_id, menu_id) values (3, 1028);
+insert into sys_role_menu(role_id, menu_id) values (3, 1029);
+insert into sys_role_menu(role_id, menu_id) values (3, 1030);
+insert into sys_role_menu(role_id, menu_id) values (3, 1031);
+insert into sys_role_menu(role_id, menu_id) values (3, 1032);
+insert into sys_role_menu(role_id, menu_id) values (3, 1033);
+insert into sys_role_menu(role_id, menu_id) values (3, 1034);
+insert into sys_role_menu(role_id, menu_id) values (3, 1035);
+insert into sys_role_menu(role_id, menu_id) values (3, 1036);
+insert into sys_role_menu(role_id, menu_id) values (3, 1037);
+insert into sys_role_menu(role_id, menu_id) values (3, 1038);
+insert into sys_role_menu(role_id, menu_id) values (3, 1039);
+insert into sys_role_menu(role_id, menu_id) values (3, 1040);
+insert into sys_role_menu(role_id, menu_id) values (3, 1041);
+insert into sys_role_menu(role_id, menu_id) values (3, 1042);
+insert into sys_role_menu(role_id, menu_id) values (3, 1043);
+insert into sys_role_menu(role_id, menu_id) values (3, 1044);
+insert into sys_role_menu(role_id, menu_id) values (3, 1045);
+insert into sys_role_menu(role_id, menu_id) values (3, 1500);
+insert into sys_role_menu(role_id, menu_id) values (3, 1501);
+insert into sys_role_menu(role_id, menu_id) values (3, 1502);
+insert into sys_role_menu(role_id, menu_id) values (3, 1503);
+insert into sys_role_menu(role_id, menu_id) values (3, 1504);
+insert into sys_role_menu(role_id, menu_id) values (3, 1505);
+insert into sys_role_menu(role_id, menu_id) values (3, 1506);
+insert into sys_role_menu(role_id, menu_id) values (3, 1507);
+insert into sys_role_menu(role_id, menu_id) values (3, 1508);
+insert into sys_role_menu(role_id, menu_id) values (3, 1509);
+insert into sys_role_menu(role_id, menu_id) values (3, 1510);
+insert into sys_role_menu(role_id, menu_id) values (3, 1511);
+insert into sys_role_menu(role_id, menu_id) values (4, 5);
+insert into sys_role_menu(role_id, menu_id) values (4, 1500);
+insert into sys_role_menu(role_id, menu_id) values (4, 1501);
+insert into sys_role_menu(role_id, menu_id) values (4, 1502);
+insert into sys_role_menu(role_id, menu_id) values (4, 1503);
+insert into sys_role_menu(role_id, menu_id) values (4, 1504);
+insert into sys_role_menu(role_id, menu_id) values (4, 1505);
+insert into sys_role_menu(role_id, menu_id) values (4, 1506);
+insert into sys_role_menu(role_id, menu_id) values (4, 1507);
+insert into sys_role_menu(role_id, menu_id) values (4, 1508);
+insert into sys_role_menu(role_id, menu_id) values (4, 1509);
+insert into sys_role_menu(role_id, menu_id) values (4, 1510);
+insert into sys_role_menu(role_id, menu_id) values (4, 1511);
+
+insert into sys_user_role(user_id, role_id) values (3, 3);
+insert into sys_user_role(user_id, role_id) values (4, 4);
+
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (1, '000000', 102, 4, 1, '测试数据权限', '测试', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (2, '000000', 102, 3, 2, '子节点1', '111', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (3, '000000', 102, 3, 3, '子节点2', '222', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (4, '000000', 108, 4, 4, '测试数据', 'demo', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (5, '000000', 108, 3, 13, '子节点11', '1111', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (6, '000000', 108, 3, 12, '子节点22', '2222', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (7, '000000', 108, 3, 11, '子节点33', '3333', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (8, '000000', 108, 3, 10, '子节点44', '4444', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (9, '000000', 108, 3, 9, '子节点55', '5555', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (10, '000000', 108, 3, 8, '子节点66', '6666', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (11, '000000', 108, 3, 7, '子节点77', '7777', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (12, '000000', 108, 3, 6, '子节点88', '8888', 0, 103, sysdate, 1, null, null, 0);
+insert into test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (13, '000000', 108, 3, 5, '子节点99', '9999', 0, 103, sysdate, 1, null, null, 0);
+
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (1, '000000', 0, 102, 4, '测试数据权限', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (2, '000000', 1, 102, 3, '子节点1', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (3, '000000', 2, 102, 3, '子节点2', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (4, '000000', 0, 108, 4, '测试树1', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (5, '000000', 4, 108, 3, '子节点11', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (6, '000000', 4, 108, 3, '子节点22', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (7, '000000', 4, 108, 3, '子节点33', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (8, '000000', 5, 108, 3, '子节点44', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (9, '000000', 6, 108, 3, '子节点55', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (10, '000000', 7, 108, 3, '子节点66', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (11, '000000', 7, 108, 3, '子节点77', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (12, '000000', 10, 108, 3, '子节点88', 0, 103, sysdate, 1, null, null, 0);
+insert into test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) values (13, '000000', 10, 108, 3, '子节点99', 0, 103, sysdate, 1, null, null, 0);

+ 694 - 0
script/sql/oracle/powerjob.sql

@@ -0,0 +1,694 @@
+-- ----------------------------
+-- Table structure for PJ_APP_INFO
+-- ----------------------------
+CREATE TABLE "PJ_APP_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "APP_NAME" VARCHAR2(255 CHAR) VISIBLE ,
+  "CURRENT_SERVER" VARCHAR2(255 CHAR) VISIBLE ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "PASSWORD" VARCHAR2(255 CHAR) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Records of "PJ_APP_INFO"
+-- ----------------------------
+INSERT INTO "PJ_APP_INFO" VALUES ('1', 'ruoyi-worker', '127.0.0.1:10010', NULL, NULL, '123456');
+
+-- ----------------------------
+-- Table structure for PJ_CONTAINER_INFO
+-- ----------------------------
+CREATE TABLE "PJ_CONTAINER_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "APP_ID" NUMBER(19) VISIBLE ,
+  "CONTAINER_NAME" VARCHAR2(255 CHAR) VISIBLE ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "LAST_DEPLOY_TIME" TIMESTAMP(6) VISIBLE ,
+  "SOURCE_INFO" VARCHAR2(255 CHAR) VISIBLE ,
+  "SOURCE_TYPE" NUMBER(10) VISIBLE ,
+  "STATUS" NUMBER(10) VISIBLE ,
+  "VERSION" VARCHAR2(255 CHAR) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Table structure for PJ_INSTANCE_INFO
+-- ----------------------------
+CREATE TABLE "PJ_INSTANCE_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "ACTUAL_TRIGGER_TIME" NUMBER(19) VISIBLE ,
+  "APP_ID" NUMBER(19) VISIBLE ,
+  "EXPECTED_TRIGGER_TIME" NUMBER(19) VISIBLE ,
+  "FINISHED_TIME" NUMBER(19) VISIBLE ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "INSTANCE_ID" NUMBER(19) VISIBLE ,
+  "INSTANCE_PARAMS" CLOB VISIBLE ,
+  "JOB_ID" NUMBER(19) VISIBLE ,
+  "JOB_PARAMS" CLOB VISIBLE ,
+  "LAST_REPORT_TIME" NUMBER(19) VISIBLE ,
+  "RESULT" CLOB VISIBLE ,
+  "RUNNING_TIMES" NUMBER(19) VISIBLE ,
+  "STATUS" NUMBER(10) VISIBLE ,
+  "TASK_TRACKER_ADDRESS" VARCHAR2(255 CHAR) VISIBLE ,
+  "TYPE" NUMBER(10) VISIBLE ,
+  "WF_INSTANCE_ID" NUMBER(19) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Table structure for PJ_JOB_INFO
+-- ----------------------------
+CREATE TABLE "PJ_JOB_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "ALARM_CONFIG" VARCHAR2(255 CHAR) VISIBLE ,
+  "APP_ID" NUMBER(19) VISIBLE ,
+  "CONCURRENCY" NUMBER(10) VISIBLE ,
+  "DESIGNATED_WORKERS" VARCHAR2(255 CHAR) VISIBLE ,
+  "DISPATCH_STRATEGY" NUMBER(10) VISIBLE ,
+  "EXECUTE_TYPE" NUMBER(10) VISIBLE ,
+  "EXTRA" VARCHAR2(255 CHAR) VISIBLE ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "INSTANCE_RETRY_NUM" NUMBER(10) VISIBLE ,
+  "INSTANCE_TIME_LIMIT" NUMBER(19) VISIBLE ,
+  "JOB_DESCRIPTION" VARCHAR2(255 CHAR) VISIBLE ,
+  "JOB_NAME" VARCHAR2(255 CHAR) VISIBLE ,
+  "JOB_PARAMS" CLOB VISIBLE ,
+  "LIFECYCLE" VARCHAR2(255 CHAR) VISIBLE ,
+  "LOG_CONFIG" VARCHAR2(255 CHAR) VISIBLE ,
+  "MAX_INSTANCE_NUM" NUMBER(10) VISIBLE ,
+  "MAX_WORKER_COUNT" NUMBER(10) VISIBLE ,
+  "MIN_CPU_CORES" FLOAT(126) VISIBLE NOT NULL ,
+  "MIN_DISK_SPACE" FLOAT(126) VISIBLE NOT NULL ,
+  "MIN_MEMORY_SPACE" FLOAT(126) VISIBLE NOT NULL ,
+  "NEXT_TRIGGER_TIME" NUMBER(19) VISIBLE ,
+  "NOTIFY_USER_IDS" VARCHAR2(255 CHAR) VISIBLE ,
+  "PROCESSOR_INFO" VARCHAR2(255 CHAR) VISIBLE ,
+  "PROCESSOR_TYPE" NUMBER(10) VISIBLE ,
+  "STATUS" NUMBER(10) VISIBLE ,
+  "TAG" VARCHAR2(255 CHAR) VISIBLE ,
+  "TASK_RETRY_NUM" NUMBER(10) VISIBLE ,
+  "TIME_EXPRESSION" VARCHAR2(255 CHAR) VISIBLE ,
+  "TIME_EXPRESSION_TYPE" NUMBER(10) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Records of "PJ_JOB_INFO"
+-- ----------------------------
+INSERT INTO "PJ_JOB_INFO" VALUES ('1', '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', '1', '5', NULL, '2', '1', NULL, NULL, NULL, '1', '0', NULL, '单机处理器执行测试', NULL, '{}', '{\"type\":1}', '0', '0', '0.0000000000000000', '0.0000000000000000', '0.0000000000000000', NULL, NULL, 'org.dromara.job.processors.StandaloneProcessorDemo', '1', '2', NULL, '1', '30000', '3');
+INSERT INTO "PJ_JOB_INFO" VALUES ('2', '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', '1', '5', NULL, '1', '2', NULL, NULL, NULL, '0', '0', NULL, '广播处理器测试', NULL, '{}', '{\"type\":1}', '0', '0', '0.0000000000000000', '0.0000000000000000', '0.0000000000000000', NULL, NULL, 'org.dromara.job.processors.BroadcastProcessorDemo', '1', '2', NULL, '1', '30000', '3');
+INSERT INTO "PJ_JOB_INFO" VALUES ('3', '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', '1', '5', NULL, '1', '4', NULL, NULL, NULL, '0', '0', NULL, 'Map处理器测试', NULL, '{}', '{\"type\":1}', '0', '0', '0.0000000000000000', '0.0000000000000000', '0.0000000000000000', NULL, NULL, 'org.dromara.job.processors.MapProcessorDemo', '1', '2', NULL, '1', '1000', '3');
+INSERT INTO "PJ_JOB_INFO" VALUES ('4', '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', '1', '5', NULL, '1', '3', NULL, NULL, NULL, '0', '0', NULL, 'MapReduce处理器测试', NULL, '{}', '{\"type\":1}', '0', '0', '0.0000000000000000', '0.0000000000000000', '0.0000000000000000', NULL, NULL, 'org.dromara.job.processors.MapReduceProcessorDemo', '1', '2', NULL, '1', '1000', '3');
+
+-- ----------------------------
+-- Table structure for PJ_OMS_LOCK
+-- ----------------------------
+CREATE TABLE "PJ_OMS_LOCK" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "LOCK_NAME" VARCHAR2(255 CHAR) VISIBLE ,
+  "MAX_LOCK_TIME" NUMBER(19) VISIBLE ,
+  "OWNERIP" VARCHAR2(255 CHAR) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Table structure for PJ_SERVER_INFO
+-- ----------------------------
+CREATE TABLE "PJ_SERVER_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "IP" VARCHAR2(255 CHAR) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Table structure for PJ_USER_INFO
+-- ----------------------------
+CREATE TABLE "PJ_USER_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "EMAIL" VARCHAR2(255 CHAR) VISIBLE ,
+  "EXTRA" VARCHAR2(255 CHAR) VISIBLE ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "PASSWORD" VARCHAR2(255 CHAR) VISIBLE ,
+  "PHONE" VARCHAR2(255 CHAR) VISIBLE ,
+  "USERNAME" VARCHAR2(255 CHAR) VISIBLE ,
+  "WEB_HOOK" VARCHAR2(255 CHAR) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Table structure for PJ_WORKFLOW_INFO
+-- ----------------------------
+CREATE TABLE "PJ_WORKFLOW_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "APP_ID" NUMBER(19) VISIBLE ,
+  "EXTRA" VARCHAR2(255 CHAR) VISIBLE ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "LIFECYCLE" VARCHAR2(255 CHAR) VISIBLE ,
+  "MAX_WF_INSTANCE_NUM" NUMBER(10) VISIBLE ,
+  "NEXT_TRIGGER_TIME" NUMBER(19) VISIBLE ,
+  "NOTIFY_USER_IDS" VARCHAR2(255 CHAR) VISIBLE ,
+  "PEDAG" CLOB VISIBLE ,
+  "STATUS" NUMBER(10) VISIBLE ,
+  "TIME_EXPRESSION" VARCHAR2(255 CHAR) VISIBLE ,
+  "TIME_EXPRESSION_TYPE" NUMBER(10) VISIBLE ,
+  "WF_DESCRIPTION" VARCHAR2(255 CHAR) VISIBLE ,
+  "WF_NAME" VARCHAR2(255 CHAR) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Table structure for PJ_WORKFLOW_INSTANCE_INFO
+-- ----------------------------
+CREATE TABLE "PJ_WORKFLOW_INSTANCE_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "ACTUAL_TRIGGER_TIME" NUMBER(19) VISIBLE ,
+  "APP_ID" NUMBER(19) VISIBLE ,
+  "DAG" CLOB VISIBLE ,
+  "EXPECTED_TRIGGER_TIME" NUMBER(19) VISIBLE ,
+  "FINISHED_TIME" NUMBER(19) VISIBLE ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE ,
+  "PARENT_WF_INSTANCE_ID" NUMBER(19) VISIBLE ,
+  "RESULT" CLOB VISIBLE ,
+  "STATUS" NUMBER(10) VISIBLE ,
+  "WF_CONTEXT" CLOB VISIBLE ,
+  "WF_INIT_PARAMS" CLOB VISIBLE ,
+  "WF_INSTANCE_ID" NUMBER(19) VISIBLE ,
+  "WORKFLOW_ID" NUMBER(19) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Table structure for PJ_WORKFLOW_NODE_INFO
+-- ----------------------------
+CREATE TABLE "PJ_WORKFLOW_NODE_INFO" (
+  "ID" NUMBER(19) VISIBLE NOT NULL ,
+  "APP_ID" NUMBER(19) VISIBLE NOT NULL ,
+  "ENABLE" NUMBER(1) VISIBLE NOT NULL ,
+  "EXTRA" CLOB VISIBLE ,
+  "GMT_CREATE" TIMESTAMP(6) VISIBLE NOT NULL ,
+  "GMT_MODIFIED" TIMESTAMP(6) VISIBLE NOT NULL ,
+  "JOB_ID" NUMBER(19) VISIBLE ,
+  "NODE_NAME" VARCHAR2(255 CHAR) VISIBLE ,
+  "NODE_PARAMS" CLOB VISIBLE ,
+  "SKIP_WHEN_FAILED" NUMBER(1) VISIBLE NOT NULL ,
+  "TYPE" NUMBER(10) VISIBLE ,
+  "WORKFLOW_ID" NUMBER(19) VISIBLE
+)
+TABLESPACE "ROOT"
+LOGGING
+NOCOMPRESS
+PCTFREE 10
+INITRANS 1
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+)
+PARALLEL 1
+NOCACHE
+DISABLE ROW MOVEMENT
+;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_APP_INFO
+-- ----------------------------
+ALTER TABLE "PJ_APP_INFO" ADD CONSTRAINT "SYS_C0012204" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Uniques structure for table PJ_APP_INFO
+-- ----------------------------
+ALTER TABLE "PJ_APP_INFO" ADD CONSTRAINT "UIDX01_APP_INFO" UNIQUE ("APP_NAME") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Checks structure for table PJ_APP_INFO
+-- ----------------------------
+ALTER TABLE "PJ_APP_INFO" ADD CONSTRAINT "SYS_C0012203" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_CONTAINER_INFO
+-- ----------------------------
+ALTER TABLE "PJ_CONTAINER_INFO" ADD CONSTRAINT "SYS_C0012206" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Checks structure for table PJ_CONTAINER_INFO
+-- ----------------------------
+ALTER TABLE "PJ_CONTAINER_INFO" ADD CONSTRAINT "SYS_C0012205" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Indexes structure for table PJ_CONTAINER_INFO
+-- ----------------------------
+CREATE INDEX "IDX01_CONTAINER_INFO"
+  ON "PJ_CONTAINER_INFO" ("APP_ID" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_INSTANCE_INFO
+-- ----------------------------
+ALTER TABLE "PJ_INSTANCE_INFO" ADD CONSTRAINT "SYS_C0012208" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Checks structure for table PJ_INSTANCE_INFO
+-- ----------------------------
+ALTER TABLE "PJ_INSTANCE_INFO" ADD CONSTRAINT "SYS_C0012207" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Indexes structure for table PJ_INSTANCE_INFO
+-- ----------------------------
+CREATE INDEX "IDX01_INSTANCE_INFO"
+  ON "PJ_INSTANCE_INFO" ("JOB_ID" ASC, "STATUS" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+CREATE INDEX "IDX02_INSTANCE_INFO"
+  ON "PJ_INSTANCE_INFO" ("APP_ID" ASC, "STATUS" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+CREATE INDEX "IDX03_INSTANCE_INFO"
+  ON "PJ_INSTANCE_INFO" ("INSTANCE_ID" ASC, "STATUS" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_JOB_INFO
+-- ----------------------------
+ALTER TABLE "PJ_JOB_INFO" ADD CONSTRAINT "SYS_C0012213" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Checks structure for table PJ_JOB_INFO
+-- ----------------------------
+ALTER TABLE "PJ_JOB_INFO" ADD CONSTRAINT "SYS_C0012209" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE "PJ_JOB_INFO" ADD CONSTRAINT "SYS_C0012210" CHECK ("MIN_CPU_CORES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE "PJ_JOB_INFO" ADD CONSTRAINT "SYS_C0012211" CHECK ("MIN_DISK_SPACE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE "PJ_JOB_INFO" ADD CONSTRAINT "SYS_C0012212" CHECK ("MIN_MEMORY_SPACE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Indexes structure for table PJ_JOB_INFO
+-- ----------------------------
+CREATE INDEX "IDX01_JOB_INFO"
+  ON "PJ_JOB_INFO" ("APP_ID" ASC, "NEXT_TRIGGER_TIME" ASC, "TIME_EXPRESSION_TYPE" ASC, "STATUS" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_OMS_LOCK
+-- ----------------------------
+ALTER TABLE "PJ_OMS_LOCK" ADD CONSTRAINT "SYS_C0012215" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Uniques structure for table PJ_OMS_LOCK
+-- ----------------------------
+ALTER TABLE "PJ_OMS_LOCK" ADD CONSTRAINT "UIDX01_OMS_LOCK" UNIQUE ("LOCK_NAME") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Checks structure for table PJ_OMS_LOCK
+-- ----------------------------
+ALTER TABLE "PJ_OMS_LOCK" ADD CONSTRAINT "SYS_C0012214" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_SERVER_INFO
+-- ----------------------------
+ALTER TABLE "PJ_SERVER_INFO" ADD CONSTRAINT "SYS_C0012217" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Uniques structure for table PJ_SERVER_INFO
+-- ----------------------------
+ALTER TABLE "PJ_SERVER_INFO" ADD CONSTRAINT "UIDX01_SERVER_INFO" UNIQUE ("IP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Checks structure for table PJ_SERVER_INFO
+-- ----------------------------
+ALTER TABLE "PJ_SERVER_INFO" ADD CONSTRAINT "SYS_C0012216" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Indexes structure for table PJ_SERVER_INFO
+-- ----------------------------
+CREATE INDEX "IDX01_SERVER_INFO"
+  ON "PJ_SERVER_INFO" ("GMT_MODIFIED" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_USER_INFO
+-- ----------------------------
+ALTER TABLE "PJ_USER_INFO" ADD CONSTRAINT "SYS_C0012219" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Checks structure for table PJ_USER_INFO
+-- ----------------------------
+ALTER TABLE "PJ_USER_INFO" ADD CONSTRAINT "SYS_C0012218" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Indexes structure for table PJ_USER_INFO
+-- ----------------------------
+CREATE INDEX "UIDX01_USER_INFO"
+  ON "PJ_USER_INFO" ("USERNAME" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+CREATE INDEX "UIDX02_USER_INFO"
+  ON "PJ_USER_INFO" ("EMAIL" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_WORKFLOW_INFO
+-- ----------------------------
+ALTER TABLE "PJ_WORKFLOW_INFO" ADD CONSTRAINT "SYS_C0012221" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Checks structure for table PJ_WORKFLOW_INFO
+-- ----------------------------
+ALTER TABLE "PJ_WORKFLOW_INFO" ADD CONSTRAINT "SYS_C0012220" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Indexes structure for table PJ_WORKFLOW_INFO
+-- ----------------------------
+CREATE INDEX "IDX01_WORKFLOW_INFO"
+  ON "PJ_WORKFLOW_INFO" ("APP_ID" ASC, "NEXT_TRIGGER_TIME" ASC, "TIME_EXPRESSION_TYPE" ASC, "STATUS" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_WORKFLOW_INSTANCE_INFO
+-- ----------------------------
+ALTER TABLE "PJ_WORKFLOW_INSTANCE_INFO" ADD CONSTRAINT "SYS_C0012223" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Uniques structure for table PJ_WORKFLOW_INSTANCE_INFO
+-- ----------------------------
+ALTER TABLE "PJ_WORKFLOW_INSTANCE_INFO" ADD CONSTRAINT "UIDX01_WF_INSTANCE" UNIQUE ("WF_INSTANCE_ID") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Checks structure for table PJ_WORKFLOW_INSTANCE_INFO
+-- ----------------------------
+ALTER TABLE "PJ_WORKFLOW_INSTANCE_INFO" ADD CONSTRAINT "SYS_C0012222" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Indexes structure for table PJ_WORKFLOW_INSTANCE_INFO
+-- ----------------------------
+CREATE INDEX "IDX01_WF_INSTANCE"
+  ON "PJ_WORKFLOW_INSTANCE_INFO" ("WORKFLOW_ID" ASC, "EXPECTED_TRIGGER_TIME" ASC, "APP_ID" ASC, "STATUS" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;
+
+-- ----------------------------
+-- Primary Key structure for table PJ_WORKFLOW_NODE_INFO
+-- ----------------------------
+ALTER TABLE "PJ_WORKFLOW_NODE_INFO" ADD CONSTRAINT "SYS_C0012230" PRIMARY KEY ("ID");
+
+-- ----------------------------
+-- Checks structure for table PJ_WORKFLOW_NODE_INFO
+-- ----------------------------
+ALTER TABLE "PJ_WORKFLOW_NODE_INFO" ADD CONSTRAINT "SYS_C0012224" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE "PJ_WORKFLOW_NODE_INFO" ADD CONSTRAINT "SYS_C0012225" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE "PJ_WORKFLOW_NODE_INFO" ADD CONSTRAINT "SYS_C0012226" CHECK ("ENABLE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE "PJ_WORKFLOW_NODE_INFO" ADD CONSTRAINT "SYS_C0012227" CHECK ("GMT_CREATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE "PJ_WORKFLOW_NODE_INFO" ADD CONSTRAINT "SYS_C0012228" CHECK ("GMT_MODIFIED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE "PJ_WORKFLOW_NODE_INFO" ADD CONSTRAINT "SYS_C0012229" CHECK ("SKIP_WHEN_FAILED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+
+-- ----------------------------
+-- Indexes structure for table PJ_WORKFLOW_NODE_INFO
+-- ----------------------------
+CREATE INDEX "IDX01_WORKFLOW_NODE_INFO"
+  ON "PJ_WORKFLOW_NODE_INFO" ("GMT_CREATE" ASC, "WORKFLOW_ID" ASC)
+  LOGGING
+  TABLESPACE "ROOT"
+  VISIBLE
+PCTFREE 10
+INITRANS 2
+STORAGE (
+  INITIAL 65536
+  NEXT 1048576
+  MINEXTENTS 1
+  MAXEXTENTS 2147483645
+  BUFFER_POOL DEFAULT
+  FLASH_CACHE DEFAULT
+)
+   USABLE;

+ 1268 - 0
script/sql/postgres/postgres_ry_vue_5.X.sql

@@ -0,0 +1,1268 @@
+-- ----------------------------
+-- 第三方平台授权表
+-- ----------------------------
+create table sys_social
+(
+    id                 int8             not null,
+    user_id            int8             not null,
+    tenant_id          varchar(20)      default null::varchar,
+    auth_id            varchar(255)     not null,
+    source             varchar(255)     not null,
+    open_id            varchar(255)     default null::varchar,
+    user_name          varchar(30)      not null,
+    nick_name          varchar(30)      default ''::varchar,
+    email              varchar(255)     default ''::varchar,
+    avatar             varchar(500)     default ''::varchar,
+    access_token       varchar(255)     not null,
+    expire_in          int8             default null,
+    refresh_token      varchar(255)     default null::varchar,
+    access_code        varchar(255)     default null::varchar,
+    union_id           varchar(255)     default null::varchar,
+    scope              varchar(255)     default null::varchar,
+    token_type         varchar(255)     default null::varchar,
+    id_token           varchar(255)     default null::varchar,
+    mac_algorithm      varchar(255)     default null::varchar,
+    mac_key            varchar(255)     default null::varchar,
+    code               varchar(255)     default null::varchar,
+    oauth_token        varchar(255)     default null::varchar,
+    oauth_token_secret varchar(255)     default null::varchar,
+    create_dept        int8,
+    create_by          int8,
+    create_time        timestamp,
+    update_by          int8,
+    update_time        timestamp,
+    del_flag           char             default '0'::bpchar,
+    constraint "pk_sys_social" primary key (id)
+);
+
+comment on table   sys_social                   is '社会化关系表';
+comment on column  sys_social.id                is '主键';
+comment on column  sys_social.user_id           is '用户ID';
+comment on column  sys_social.tenant_id         is '租户id';
+comment on column  sys_social.auth_id           is '平台+平台唯一id';
+comment on column  sys_social.source            is '用户来源';
+comment on column  sys_social.open_id           is '平台编号唯一id';
+comment on column  sys_social.user_name         is '登录账号';
+comment on column  sys_social.nick_name         is '用户昵称';
+comment on column  sys_social.email             is '用户邮箱';
+comment on column  sys_social.avatar            is '头像地址';
+comment on column  sys_social.access_token      is '用户的授权令牌';
+comment on column  sys_social.expire_in         is '用户的授权令牌的有效期,部分平台可能没有';
+comment on column  sys_social.refresh_token     is '刷新令牌,部分平台可能没有';
+comment on column  sys_social.access_code       is '平台的授权信息,部分平台可能没有';
+comment on column  sys_social.union_id          is '用户的 unionid';
+comment on column  sys_social.scope             is '授予的权限,部分平台可能没有';
+comment on column  sys_social.token_type        is '个别平台的授权信息,部分平台可能没有';
+comment on column  sys_social.id_token          is 'id token,部分平台可能没有';
+comment on column  sys_social.mac_algorithm     is '小米平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.mac_key           is '小米平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.code              is '用户的授权code,部分平台可能没有';
+comment on column  sys_social.oauth_token       is 'Twitter平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.oauth_token_secret is 'Twitter平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.create_dept       is '创建部门';
+comment on column  sys_social.create_by         is '创建者';
+comment on column  sys_social.create_time       is '创建时间';
+comment on column  sys_social.update_by         is '更新者';
+comment on column  sys_social.update_time       is '更新时间';
+comment on column  sys_social.del_flag          is '删除标志(0代表存在 2代表删除)';
+
+-- ----------------------------
+-- 租户表
+-- ----------------------------
+drop table if exists sys_tenant;
+create table if not exists sys_tenant
+(
+    id                int8,
+    tenant_id         varchar(20)   not null,
+    contact_user_name varchar(20)   default null::varchar,
+    contact_phone     varchar(20)   default null::varchar,
+    company_name      varchar(50)   default null::varchar,
+    license_number    varchar(30)   default null::varchar,
+    address           varchar(200)  default null::varchar,
+    intro             varchar(200)  default null::varchar,
+    domain            varchar(200)  default null::varchar,
+    remark            varchar(200)  default null::varchar,
+    package_id        int8,
+    expire_time       timestamp,
+    account_count     int4          default -1,
+    status            char          default '0'::bpchar,
+    del_flag          char          default '0'::bpchar,
+    create_dept       int8,
+    create_by         int8,
+    create_time       timestamp,
+    update_by         int8,
+    update_time       timestamp,
+    constraint "pk_sys_tenant" primary key (id)
+);
+
+
+comment on table   sys_tenant                    is '租户表';
+comment on column  sys_tenant.tenant_id          is '租户编号';
+comment on column  sys_tenant.contact_phone      is '联系电话';
+comment on column  sys_tenant.company_name       is '企业名称';
+comment on column  sys_tenant.company_name       is '联系人';
+comment on column  sys_tenant.license_number     is '统一社会信用代码';
+comment on column  sys_tenant.address            is '地址';
+comment on column  sys_tenant.intro              is '企业简介';
+comment on column  sys_tenant.domain             is '域名';
+comment on column  sys_tenant.remark             is '备注';
+comment on column  sys_tenant.package_id         is '租户套餐编号';
+comment on column  sys_tenant.expire_time        is '过期时间';
+comment on column  sys_tenant.account_count      is '用户数量(-1不限制)';
+comment on column  sys_tenant.status             is '租户状态(0正常 1停用)';
+comment on column  sys_tenant.del_flag           is '删除标志(0代表存在 2代表删除)';
+comment on column  sys_tenant.create_dept        is '创建部门';
+comment on column  sys_tenant.create_by          is '创建者';
+comment on column  sys_tenant.create_time        is '创建时间';
+comment on column  sys_tenant.update_by          is '更新者';
+comment on column  sys_tenant.update_time        is '更新时间';
+
+
+-- ----------------------------
+-- 初始化-租户表数据
+-- ----------------------------
+
+insert into sys_tenant values(1, '000000', '管理组', '15888888888', 'XXX有限公司', null, null, '多租户通用后台管理管理系统', null, null, null, null, -1, '0', '0', 103, 1, now(), null, null);
+
+
+-- ----------------------------
+-- 租户套餐表
+-- ----------------------------
+drop table if exists sys_tenant_package;
+create table if not exists sys_tenant_package
+(
+    package_id          int8,
+    package_name        varchar(20)     default ''::varchar,
+    menu_ids            varchar(3000)   default ''::varchar,
+    remark              varchar(200)    default ''::varchar,
+    menu_check_strictly bool            default true,
+    status              char            default '0'::bpchar,
+    del_flag            char            default '0'::bpchar,
+    create_dept         int8,
+    create_by           int8,
+    create_time         timestamp,
+    update_by           int8,
+    update_time         timestamp,
+    constraint "pk_sys_tenant_package" primary key (package_id)
+);
+
+
+comment on table   sys_tenant_package                    is '租户套餐表';
+comment on column  sys_tenant_package.package_id         is '租户套餐id';
+comment on column  sys_tenant_package.package_name       is '套餐名称';
+comment on column  sys_tenant_package.menu_ids           is '关联菜单id';
+comment on column  sys_tenant_package.remark             is '备注';
+comment on column  sys_tenant_package.status             is '状态(0正常 1停用)';
+comment on column  sys_tenant_package.del_flag           is '删除标志(0代表存在 2代表删除)';
+comment on column  sys_tenant_package.create_dept        is '创建部门';
+comment on column  sys_tenant_package.create_by          is '创建者';
+comment on column  sys_tenant_package.create_time        is '创建时间';
+comment on column  sys_tenant_package.update_by          is '更新者';
+comment on column  sys_tenant_package.update_time        is '更新时间';
+
+
+-- ----------------------------
+-- 1、部门表
+-- ----------------------------
+drop table if exists sys_dept;
+create table if not exists sys_dept
+(
+    dept_id     int8,
+    tenant_id   varchar(20) default '000000'::varchar,
+    parent_id   int8        default 0,
+    ancestors   varchar(500)default ''::varchar,
+    dept_name   varchar(30) default ''::varchar,
+    order_num   int4        default 0,
+    leader      int8        default null,
+    phone       varchar(11) default null::varchar,
+    email       varchar(50) default null::varchar,
+    status      char        default '0'::bpchar,
+    del_flag    char        default '0'::bpchar,
+    create_dept int8,
+    create_by   int8,
+    create_time timestamp,
+    update_by   int8,
+    update_time timestamp,
+    constraint "sys_dept_pk" primary key (dept_id)
+);
+
+comment on table sys_dept               is '部门表';
+comment on column sys_dept.dept_id      is '部门ID';
+comment on column sys_dept.tenant_id    is '租户编号';
+comment on column sys_dept.parent_id    is '父部门ID';
+comment on column sys_dept.ancestors    is '祖级列表';
+comment on column sys_dept.dept_name    is '部门名称';
+comment on column sys_dept.order_num    is '显示顺序';
+comment on column sys_dept.leader       is '负责人';
+comment on column sys_dept.phone        is '联系电话';
+comment on column sys_dept.email        is '邮箱';
+comment on column sys_dept.status       is '部门状态(0正常 1停用)';
+comment on column sys_dept.del_flag     is '删除标志(0代表存在 2代表删除)';
+comment on column sys_dept.create_dept  is '创建部门';
+comment on column sys_dept.create_by    is '创建者';
+comment on column sys_dept.create_time  is '创建时间';
+comment on column sys_dept.update_by    is '更新者';
+comment on column sys_dept.update_time  is '更新时间';
+
+-- ----------------------------
+-- 初始化-部门表数据
+-- ----------------------------
+insert into sys_dept values(100, '000000', 0,   '0',          'XXX科技',   0, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(101, '000000', 100, '0,100',      '深圳总公司', 1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(102, '000000', 100, '0,100',      '长沙分公司', 2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(103, '000000', 101, '0,100,101',  '研发部门',   1, 1, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(104, '000000', 101, '0,100,101',  '市场部门',   2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(105, '000000', 101, '0,100,101',  '测试部门',   3, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(106, '000000', 101, '0,100,101',  '财务部门',   4, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(107, '000000', 101, '0,100,101',  '运维部门',   5, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(108, '000000', 102, '0,100,102',  '市场部门',   1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+insert into sys_dept values(109, '000000', 102, '0,100,102',  '财务部门',   2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, now(), null, null);
+
+-- ----------------------------
+-- 2、用户信息表
+-- ----------------------------
+drop table if exists sys_user;
+create table if not exists sys_user
+(
+    user_id     int8,
+    tenant_id   varchar(20)  default '000000'::varchar,
+    dept_id     int8,
+    user_name   varchar(30)  not null,
+    nick_name   varchar(30)  not null,
+    user_type   varchar(10)  default 'sys_user'::varchar,
+    email       varchar(50)  default ''::varchar,
+    phonenumber varchar(11)  default ''::varchar,
+    sex         char         default '0'::bpchar,
+    avatar      int8,
+    password    varchar(100) default ''::varchar,
+    status      char         default '0'::bpchar,
+    del_flag    char         default '0'::bpchar,
+    login_ip    varchar(128) default ''::varchar,
+    login_date  timestamp,
+    create_dept int8,
+    create_by   int8,
+    create_time timestamp,
+    update_by   int8,
+    update_time timestamp,
+    remark      varchar(500) default null::varchar,
+    constraint "sys_user_pk" primary key (user_id)
+);
+
+comment on table sys_user               is '用户信息表';
+comment on column sys_user.user_id      is '用户ID';
+comment on column sys_user.tenant_id    is '租户编号';
+comment on column sys_user.dept_id      is '部门ID';
+comment on column sys_user.user_name    is '用户账号';
+comment on column sys_user.nick_name    is '用户昵称';
+comment on column sys_user.user_type    is '用户类型(sys_user系统用户)';
+comment on column sys_user.email        is '用户邮箱';
+comment on column sys_user.phonenumber  is '手机号码';
+comment on column sys_user.sex          is '用户性别(0男 1女 2未知)';
+comment on column sys_user.avatar       is '头像地址';
+comment on column sys_user.password     is '密码';
+comment on column sys_user.status       is '帐号状态(0正常 1停用)';
+comment on column sys_user.del_flag     is '删除标志(0代表存在 2代表删除)';
+comment on column sys_user.login_ip     is '最后登陆IP';
+comment on column sys_user.login_date   is '最后登陆时间';
+comment on column sys_user.create_dept  is '创建部门';
+comment on column sys_user.create_by    is '创建者';
+comment on column sys_user.create_time  is '创建时间';
+comment on column sys_user.update_by    is '更新者';
+comment on column sys_user.update_time  is '更新时间';
+comment on column sys_user.remark       is '备注';
+
+-- ----------------------------
+
+-- 初始化-用户信息表数据
+-- ----------------------------
+insert into sys_user values(1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', now(), 103, 1, now(), null, null, '管理员');
+insert into sys_user values(2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@qq.com',  '15666666666', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', now(), 103, 1, now(), null, null, '测试员');
+
+
+-- ----------------------------
+-- 3、岗位信息表
+-- ----------------------------
+drop table if exists sys_post;
+create table if not exists sys_post
+(
+    post_id     int8,
+    tenant_id   varchar(20) default '000000'::varchar,
+    post_code   varchar(64) not null,
+    post_name   varchar(50) not null,
+    post_sort   int4        not null,
+    status      char        not null,
+    create_dept int8,
+    create_by   int8,
+    create_time timestamp,
+    update_by   int8,
+    update_time timestamp,
+    remark      varchar(500) default null::varchar,
+    constraint "sys_post_pk" primary key (post_id)
+);
+
+comment on table sys_post               is '岗位信息表';
+comment on column sys_post.post_id      is '岗位ID';
+comment on column sys_post.tenant_id    is '租户编号';
+comment on column sys_post.post_code    is '岗位编码';
+comment on column sys_post.post_name    is '岗位名称';
+comment on column sys_post.post_sort    is '显示顺序';
+comment on column sys_post.status       is '状态(0正常 1停用)';
+comment on column sys_post.create_dept  is '创建部门';
+comment on column sys_post.create_by    is '创建者';
+comment on column sys_post.create_time  is '创建时间';
+comment on column sys_post.update_by    is '更新者';
+comment on column sys_post.update_time  is '更新时间';
+comment on column sys_post.remark       is '备注';
+
+-- ----------------------------
+-- 初始化-岗位信息表数据
+-- ----------------------------
+insert into sys_post values(1, '000000', 'ceo',  '董事长',    1, '0', 103, 1, now(), null, null, '');
+insert into sys_post values(2, '000000', 'se',   '项目经理',  2, '0', 103, 1, now(), null, null, '');
+insert into sys_post values(3, '000000', 'hr',   '人力资源',  3, '0', 103, 1, now(), null, null, '');
+insert into sys_post values(4, '000000', 'user', '普通员工',  4, '0', 103, 1, now(), null, null, '');
+
+-- ----------------------------
+-- 4、角色信息表
+-- ----------------------------
+drop table if exists sys_role;
+create table if not exists sys_role
+(
+    role_id             int8,
+    tenant_id           varchar(20)  default '000000'::varchar,
+    role_name           varchar(30)  not null,
+    role_key            varchar(100) not null,
+    role_sort           int4         not null,
+    data_scope          char         default '1'::bpchar,
+    menu_check_strictly bool         default true,
+    dept_check_strictly bool         default true,
+    status              char         not null,
+    del_flag            char         default '0'::bpchar,
+    create_dept         int8,
+    create_by           int8,
+    create_time         timestamp,
+    update_by           int8,
+    update_time         timestamp,
+    remark              varchar(500) default null::varchar,
+    constraint "sys_role_pk" primary key (role_id)
+);
+
+comment on table sys_role                       is '角色信息表';
+comment on column sys_role.role_id              is '角色ID';
+comment on column sys_role.tenant_id            is '租户编号';
+comment on column sys_role.role_name            is '角色名称';
+comment on column sys_role.role_key             is '角色权限字符串';
+comment on column sys_role.role_sort            is '显示顺序';
+comment on column sys_role.data_scope           is '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)';
+comment on column sys_role.menu_check_strictly  is '菜单树选择项是否关联显示';
+comment on column sys_role.dept_check_strictly  is '部门树选择项是否关联显示';
+comment on column sys_role.status               is '角色状态(0正常 1停用)';
+comment on column sys_role.del_flag             is '删除标志(0代表存在 2代表删除)';
+comment on column sys_role.create_dept          is '创建部门';
+comment on column sys_role.create_by            is '创建者';
+comment on column sys_role.create_time          is '创建时间';
+comment on column sys_role.update_by            is '更新者';
+comment on column sys_role.update_time          is '更新时间';
+comment on column sys_role.remark               is '备注';
+
+-- ----------------------------
+-- 初始化-角色信息表数据
+-- ----------------------------
+insert into sys_role values('1', '000000', '超级管理员',  'superadmin',  1, '1', 't', 't', '0', '0', 103, 1, now(), null, null, '超级管理员');
+insert into sys_role values('2', '000000', '普通角色',    'common', 2, '2', 't', 't', '0', '0', 103, 1, now(), null, null, '普通角色');
+
+
+-- ----------------------------
+-- 5、菜单权限表
+-- ----------------------------
+drop table if exists sys_menu;
+create table if not exists sys_menu
+(
+    menu_id     int8,
+    menu_name   varchar(50) not null,
+    parent_id   int8         default 0,
+    order_num   int4         default 0,
+    path        varchar(200) default ''::varchar,
+    component   varchar(255) default null::varchar,
+    query_param varchar(255) default null::varchar,
+    is_frame    char         default '1'::bpchar,
+    is_cache    char         default '0'::bpchar,
+    menu_type   char         default ''::bpchar,
+    visible     char         default '0'::bpchar,
+    status      char         default '0'::bpchar,
+    perms       varchar(100) default null::varchar,
+    icon        varchar(100) default '#'::varchar,
+    create_dept int8,
+    create_by   int8,
+    create_time timestamp,
+    update_by   int8,
+    update_time timestamp,
+    remark      varchar(500) default ''::varchar,
+    constraint "sys_menu_pk" primary key (menu_id)
+);
+
+comment on table sys_menu               is '菜单权限表';
+comment on column sys_menu.menu_id      is '菜单ID';
+comment on column sys_menu.menu_name    is '菜单名称';
+comment on column sys_menu.parent_id    is '父菜单ID';
+comment on column sys_menu.order_num    is '显示顺序';
+comment on column sys_menu.path         is '路由地址';
+comment on column sys_menu.component    is '组件路径';
+comment on column sys_menu.query_param  is '路由参数';
+comment on column sys_menu.is_frame     is '是否为外链(0是 1否)';
+comment on column sys_menu.is_cache     is '是否缓存(0缓存 1不缓存)';
+comment on column sys_menu.menu_type    is '菜单类型(M目录 C菜单 F按钮)';
+comment on column sys_menu.visible      is '显示状态(0显示 1隐藏)';
+comment on column sys_menu.status       is '菜单状态(0正常 1停用)';
+comment on column sys_menu.perms        is '权限标识';
+comment on column sys_menu.icon         is '菜单图标';
+comment on column sys_menu.create_dept  is '创建部门';
+comment on column sys_menu.create_by    is '创建者';
+comment on column sys_menu.create_time  is '创建时间';
+comment on column sys_menu.update_by    is '更新者';
+comment on column sys_menu.update_time  is '更新时间';
+comment on column sys_menu.remark       is '备注';
+
+-- ----------------------------
+-- 初始化-菜单信息表数据
+-- ----------------------------
+-- 一级菜单
+insert into sys_menu values('1', '系统管理', '0', '1', 'system',           null, '', '1', '0', 'M', '0', '0', '', 'system',   103, 1, now(), null, null, '系统管理目录');
+insert into sys_menu values('6', '系统管理', '0', '2', 'tenant',           null, '', '1', '0', 'M', '0', '0', '', 'chart',    103, 1, now(), null, null, '租户管理目录');
+insert into sys_menu values('2', '系统监控', '0', '3', 'monitor',          null, '', '1', '0', 'M', '0', '0', '', 'monitor',  103, 1, now(), null, null, '系统监控目录');
+insert into sys_menu values('3', '系统工具', '0', '4', 'tool',             null, '', '1', '0', 'M', '0', '0', '', 'tool',     103, 1, now(), null, null, '系统工具目录');
+insert into sys_menu values('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', '0', '0', 'M', '0', '0', '', 'guide',    103, 1, now(), null, null, 'RuoYi-Vue-Plus官网地址');
+-- 二级菜单
+insert into sys_menu values('100',  '用户管理',     '1',   '1', 'user',             'system/user/index',            '', '1', '0', 'C', '0', '0', 'system:user:list',            'user',          103, 1, now(), null, null, '用户管理菜单');
+insert into sys_menu values('101',  '角色管理',     '1',   '2', 'role',             'system/role/index',            '', '1', '0', 'C', '0', '0', 'system:role:list',            'peoples',       103, 1, now(), null, null, '角色管理菜单');
+insert into sys_menu values('102',  '菜单管理',     '1',   '3', 'menu',             'system/menu/index',            '', '1', '0', 'C', '0', '0', 'system:menu:list',            'tree-table',    103, 1, now(), null, null, '菜单管理菜单');
+insert into sys_menu values('103',  '部门管理',     '1',   '4', 'dept',             'system/dept/index',            '', '1', '0', 'C', '0', '0', 'system:dept:list',            'tree',          103, 1, now(), null, null, '部门管理菜单');
+insert into sys_menu values('104',  '岗位管理',     '1',   '5', 'post',             'system/post/index',            '', '1', '0', 'C', '0', '0', 'system:post:list',            'post',          103, 1, now(), null, null, '岗位管理菜单');
+insert into sys_menu values('105',  '字典管理',     '1',   '6', 'dict',             'system/dict/index',            '', '1', '0', 'C', '0', '0', 'system:dict:list',            'dict',          103, 1, now(), null, null, '字典管理菜单');
+insert into sys_menu values('106',  '参数设置',     '1',   '7', 'config',           'system/config/index',          '', '1', '0', 'C', '0', '0', 'system:config:list',          'edit',          103, 1, now(), null, null, '参数设置菜单');
+insert into sys_menu values('107',  '通知公告',     '1',   '8', 'notice',           'system/notice/index',          '', '1', '0', 'C', '0', '0', 'system:notice:list',          'message',       103, 1, now(), null, null, '通知公告菜单');
+insert into sys_menu values('108',  '日志管理',     '1',   '9', 'log',              '',                             '', '1', '0', 'M', '0', '0', '',                            'log',           103, 1, now(), null, null, '日志管理菜单');
+insert into sys_menu values('109',  '在线用户',     '2',   '1', 'online',           'monitor/online/index',         '', '1', '0', 'C', '0', '0', 'monitor:online:list',         'online',        103, 1, now(), null, null, '在线用户菜单');
+insert into sys_menu values('113',  '缓存监控',     '2',   '5', 'cache',            'monitor/cache/index',          '', '1', '0', 'C', '0', '0', 'monitor:cache:list',          'redis',         103, 1, now(), null, null, '缓存监控菜单');
+insert into sys_menu values('114',  '表单构建',     '3',   '1', 'build',            'tool/build/index',             '', '1', '0', 'C', '0', '0', 'tool:build:list',             'build',         103, 1, now(), null, null, '表单构建菜单');
+insert into sys_menu values('115',  '代码生成',     '3',   '2', 'gen',              'tool/gen/index',               '', '1', '0', 'C', '0', '0', 'tool:gen:list',               'code',          103, 1, now(), null, null, '代码生成菜单');
+insert into sys_menu values('121',  '租户管理',     '6',   '1', 'tenant',           'system/tenant/index',          '', '1', '0', 'C', '0', '0', 'system:tenant:list',          'list',          103, 1, now(), null, null, '租户管理菜单');
+insert into sys_menu values('122',  '租户套餐管理', '6',   '2', 'tenantPackage',    'system/tenantPackage/index',   '', '1', '0', 'C', '0', '0', 'system:tenantPackage:list',   'form',          103, 1, now(), null, null, '租户套餐管理菜单');
+insert into sys_menu values('123',  '客户端管理',   '1',   '11', 'client',           'system/client/index',          '', '1', '0', 'C', '0', '0', 'system:client:list',          'international', 103, 1, now(), null, null, '客户端管理菜单');
+
+-- springboot-admin监控
+insert into sys_menu values('117',  'Admin监控',   '2',   '5',  'Admin',            'monitor/admin/index',         '', '1', '0', 'C', '0', '0', 'monitor:admin:list',          'dashboard',     103, 1, now(), null, null, 'Admin监控菜单');
+-- oss菜单
+insert into sys_menu values('118',  '文件管理',     '1',   '10', 'oss',              'system/oss/index',            '', '1', '0', 'C', '0', '0', 'system:oss:list',             'upload',        103, 1, now(), null, null, '文件管理菜单');
+-- powerjob server控制台
+insert into sys_menu values('120',  '任务调度中心',  '2',   '5',  'powerjob',           'monitor/powerjob/index',        '', '1', '0', 'C', '0', '0', 'monitor:powerjob:list',         'job',           103, 1, now(), null, null, 'PowerJob控制台菜单');
+
+-- 三级菜单
+insert into sys_menu values('500',  '操作日志', '108', '1', 'operlog',    'monitor/operlog/index',    '', '1', '0', 'C', '0', '0', 'monitor:operlog:list',    'form',          103, 1, now(), null, null, '操作日志菜单');
+insert into sys_menu values('501',  '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', '1', '0', 'C', '0', '0', 'monitor:logininfor:list', 'logininfor',    103, 1, now(), null, null, '登录日志菜单');
+-- 用户管理按钮
+insert into sys_menu values('1001', '用户查询', '100', '1',  '', '', '', '1', '0', 'F', '0', '0', 'system:user:query',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1002', '用户新增', '100', '2',  '', '', '', '1', '0', 'F', '0', '0', 'system:user:add',            '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1003', '用户修改', '100', '3',  '', '', '', '1', '0', 'F', '0', '0', 'system:user:edit',           '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1004', '用户删除', '100', '4',  '', '', '', '1', '0', 'F', '0', '0', 'system:user:remove',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1005', '用户导出', '100', '5',  '', '', '', '1', '0', 'F', '0', '0', 'system:user:export',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1006', '用户导入', '100', '6',  '', '', '', '1', '0', 'F', '0', '0', 'system:user:import',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1007', '重置密码', '100', '7',  '', '', '', '1', '0', 'F', '0', '0', 'system:user:resetPwd',       '#', 103, 1, now(), null, null, '');
+-- 角色管理按钮
+insert into sys_menu values('1008', '角色查询', '101', '1',  '', '', '', '1', '0', 'F', '0', '0', 'system:role:query',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1009', '角色新增', '101', '2',  '', '', '', '1', '0', 'F', '0', '0', 'system:role:add',            '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1010', '角色修改', '101', '3',  '', '', '', '1', '0', 'F', '0', '0', 'system:role:edit',           '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1011', '角色删除', '101', '4',  '', '', '', '1', '0', 'F', '0', '0', 'system:role:remove',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1012', '角色导出', '101', '5',  '', '', '', '1', '0', 'F', '0', '0', 'system:role:export',         '#', 103, 1, now(), null, null, '');
+-- 菜单管理按钮
+insert into sys_menu values('1013', '菜单查询', '102', '1',  '', '', '', '1', '0', 'F', '0', '0', 'system:menu:query',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1014', '菜单新增', '102', '2',  '', '', '', '1', '0', 'F', '0', '0', 'system:menu:add',            '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1015', '菜单修改', '102', '3',  '', '', '', '1', '0', 'F', '0', '0', 'system:menu:edit',           '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1016', '菜单删除', '102', '4',  '', '', '', '1', '0', 'F', '0', '0', 'system:menu:remove',         '#', 103, 1, now(), null, null, '');
+-- 部门管理按钮
+insert into sys_menu values('1017', '部门查询', '103', '1',  '', '', '', '1', '0', 'F', '0', '0', 'system:dept:query',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1018', '部门新增', '103', '2',  '', '', '', '1', '0', 'F', '0', '0', 'system:dept:add',            '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1019', '部门修改', '103', '3',  '', '', '', '1', '0', 'F', '0', '0', 'system:dept:edit',           '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1020', '部门删除', '103', '4',  '', '', '', '1', '0', 'F', '0', '0', 'system:dept:remove',         '#', 103, 1, now(), null, null, '');
+-- 岗位管理按钮
+insert into sys_menu values('1021', '岗位查询', '104', '1',  '', '', '', '1', '0', 'F', '0', '0', 'system:post:query',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1022', '岗位新增', '104', '2',  '', '', '', '1', '0', 'F', '0', '0', 'system:post:add',            '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1023', '岗位修改', '104', '3',  '', '', '', '1', '0', 'F', '0', '0', 'system:post:edit',           '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1024', '岗位删除', '104', '4',  '', '', '', '1', '0', 'F', '0', '0', 'system:post:remove',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1025', '岗位导出', '104', '5',  '', '', '', '1', '0', 'F', '0', '0', 'system:post:export',         '#', 103, 1, now(), null, null, '');
+-- 字典管理按钮
+insert into sys_menu values('1026', '字典查询', '105', '1', '#', '', '', '1', '0', 'F', '0', '0', 'system:dict:query',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1027', '字典新增', '105', '2', '#', '', '', '1', '0', 'F', '0', '0', 'system:dict:add',            '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1028', '字典修改', '105', '3', '#', '', '', '1', '0', 'F', '0', '0', 'system:dict:edit',           '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1029', '字典删除', '105', '4', '#', '', '', '1', '0', 'F', '0', '0', 'system:dict:remove',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1030', '字典导出', '105', '5', '#', '', '', '1', '0', 'F', '0', '0', 'system:dict:export',         '#', 103, 1, now(), null, null, '');
+-- 参数设置按钮
+insert into sys_menu values('1031', '参数查询', '106', '1', '#', '', '', '1', '0', 'F', '0', '0', 'system:config:query',        '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1032', '参数新增', '106', '2', '#', '', '', '1', '0', 'F', '0', '0', 'system:config:add',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1033', '参数修改', '106', '3', '#', '', '', '1', '0', 'F', '0', '0', 'system:config:edit',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1034', '参数删除', '106', '4', '#', '', '', '1', '0', 'F', '0', '0', 'system:config:remove',       '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1035', '参数导出', '106', '5', '#', '', '', '1', '0', 'F', '0', '0', 'system:config:export',       '#', 103, 1, now(), null, null, '');
+-- 通知公告按钮
+insert into sys_menu values('1036', '公告查询', '107', '1', '#', '', '', '1', '0', 'F', '0', '0', 'system:notice:query',        '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1037', '公告新增', '107', '2', '#', '', '', '1', '0', 'F', '0', '0', 'system:notice:add',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1038', '公告修改', '107', '3', '#', '', '', '1', '0', 'F', '0', '0', 'system:notice:edit',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1039', '公告删除', '107', '4', '#', '', '', '1', '0', 'F', '0', '0', 'system:notice:remove',       '#', 103, 1, now(), null, null, '');
+-- 操作日志按钮
+insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:operlog:query',      '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:operlog:remove',     '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:operlog:export',     '#', 103, 1, now(), null, null, '');
+-- 登录日志按钮
+insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:query',   '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:remove',  '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:export',  '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:unlock',  '#', 103, 1, now(), null, null, '');
+-- 在线用户按钮
+insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:online:query',       '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1, now(), null, null, '');
+-- 代码生成按钮
+insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', '', '1', '0', 'F', '0', '0', 'tool:gen:query',             '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', '', '1', '0', 'F', '0', '0', 'tool:gen:edit',              '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', '', '1', '0', 'F', '0', '0', 'tool:gen:remove',            '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', '', '1', '0', 'F', '0', '0', 'tool:gen:import',            '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', '', '1', '0', 'F', '0', '0', 'tool:gen:preview',           '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', '', '1', '0', 'F', '0', '0', 'tool:gen:code',              '#', 103, 1, now(), null, null, '');
+-- oss相关按钮
+insert into sys_menu values('1600', '文件查询', '118', '1', '#', '', '', '1', '0', 'F', '0', '0', 'system:oss:query',        '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1601', '文件上传', '118', '2', '#', '', '', '1', '0', 'F', '0', '0', 'system:oss:upload',       '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1602', '文件下载', '118', '3', '#', '', '', '1', '0', 'F', '0', '0', 'system:oss:download',     '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1603', '文件删除', '118', '4', '#', '', '', '1', '0', 'F', '0', '0', 'system:oss:remove',       '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1604', '配置添加', '118', '5', '#', '', '', '1', '0', 'F', '0', '0', 'system:oss:add',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1605', '配置编辑', '118', '6', '#', '', '', '1', '0', 'F', '0', '0', 'system:oss:edit',         '#', 103, 1, now(), null, null, '');
+-- 租户管理相关按钮
+insert into sys_menu values('1606', '租户查询', '121', '1', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenant:query',   '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1607', '租户新增', '121', '2', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenant:add',     '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1608', '租户修改', '121', '3', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenant:edit',    '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1609', '租户删除', '121', '4', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenant:remove',  '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1610', '租户导出', '121', '5', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenant:export',  '#', 103, 1, now(), null, null, '');
+-- 租户套餐管理相关按钮
+insert into sys_menu values('1611', '租户套餐查询', '122', '1', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenantPackage:query',   '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1612', '租户套餐新增', '122', '2', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenantPackage:add',     '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1613', '租户套餐修改', '122', '3', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenantPackage:edit',    '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1614', '租户套餐删除', '122', '4', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenantPackage:remove',  '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1615', '租户套餐导出', '122', '5', '#', '', '', '1', '0', 'F', '0', '0', 'system:tenantPackage:export',  '#', 103, 1, now(), null, null, '');
+-- 客户端管理按钮
+insert into sys_menu values('1061', '客户端管理查询', '123', '1',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:query',        '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1062', '客户端管理新增', '123', '2',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:add',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1063', '客户端管理修改', '123', '3',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:edit',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1064', '客户端管理删除', '123', '4',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:remove',       '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1065', '客户端管理导出', '123', '5',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:export',       '#', 103, 1, now(), null, null, '');
+
+-- ----------------------------
+-- 6、用户和角色关联表  用户N-1角色
+-- ----------------------------
+drop table if exists sys_user_role;
+create table if not exists sys_user_role
+(
+    user_id int8 not null,
+    role_id int8 not null,
+    constraint sys_user_role_pk primary key (user_id, role_id)
+);
+
+comment on table sys_user_role              is '用户和角色关联表';
+comment on column sys_user_role.user_id     is '用户ID';
+comment on column sys_user_role.role_id     is '角色ID';
+
+-- ----------------------------
+-- 初始化-用户和角色关联表数据
+-- ----------------------------
+insert into sys_user_role values ('1', '1');
+insert into sys_user_role values ('2', '2');
+
+
+-- ----------------------------
+-- 7、角色和菜单关联表  角色1-N菜单
+-- ----------------------------
+drop table if exists sys_role_menu;
+create table if not exists sys_role_menu
+(
+    role_id int8 not null,
+    menu_id int8 not null,
+    constraint sys_role_menu_pk primary key (role_id, menu_id)
+);
+
+comment on table sys_role_menu              is '角色和菜单关联表';
+comment on column sys_role_menu.role_id     is '角色ID';
+comment on column sys_role_menu.menu_id     is '菜单ID';
+
+-- ----------------------------
+-- 初始化-角色和菜单关联表数据
+-- ----------------------------
+insert into sys_role_menu values ('2', '1');
+insert into sys_role_menu values ('2', '2');
+insert into sys_role_menu values ('2', '3');
+insert into sys_role_menu values ('2', '4');
+insert into sys_role_menu values ('2', '100');
+insert into sys_role_menu values ('2', '101');
+insert into sys_role_menu values ('2', '102');
+insert into sys_role_menu values ('2', '103');
+insert into sys_role_menu values ('2', '104');
+insert into sys_role_menu values ('2', '105');
+insert into sys_role_menu values ('2', '106');
+insert into sys_role_menu values ('2', '107');
+insert into sys_role_menu values ('2', '108');
+insert into sys_role_menu values ('2', '109');
+insert into sys_role_menu values ('2', '110');
+insert into sys_role_menu values ('2', '111');
+insert into sys_role_menu values ('2', '112');
+insert into sys_role_menu values ('2', '113');
+insert into sys_role_menu values ('2', '114');
+insert into sys_role_menu values ('2', '115');
+insert into sys_role_menu values ('2', '116');
+insert into sys_role_menu values ('2', '500');
+insert into sys_role_menu values ('2', '501');
+insert into sys_role_menu values ('2', '1000');
+insert into sys_role_menu values ('2', '1001');
+insert into sys_role_menu values ('2', '1002');
+insert into sys_role_menu values ('2', '1003');
+insert into sys_role_menu values ('2', '1004');
+insert into sys_role_menu values ('2', '1005');
+insert into sys_role_menu values ('2', '1006');
+insert into sys_role_menu values ('2', '1007');
+insert into sys_role_menu values ('2', '1008');
+insert into sys_role_menu values ('2', '1009');
+insert into sys_role_menu values ('2', '1010');
+insert into sys_role_menu values ('2', '1011');
+insert into sys_role_menu values ('2', '1012');
+insert into sys_role_menu values ('2', '1013');
+insert into sys_role_menu values ('2', '1014');
+insert into sys_role_menu values ('2', '1015');
+insert into sys_role_menu values ('2', '1016');
+insert into sys_role_menu values ('2', '1017');
+insert into sys_role_menu values ('2', '1018');
+insert into sys_role_menu values ('2', '1019');
+insert into sys_role_menu values ('2', '1020');
+insert into sys_role_menu values ('2', '1021');
+insert into sys_role_menu values ('2', '1022');
+insert into sys_role_menu values ('2', '1023');
+insert into sys_role_menu values ('2', '1024');
+insert into sys_role_menu values ('2', '1025');
+insert into sys_role_menu values ('2', '1026');
+insert into sys_role_menu values ('2', '1027');
+insert into sys_role_menu values ('2', '1028');
+insert into sys_role_menu values ('2', '1029');
+insert into sys_role_menu values ('2', '1030');
+insert into sys_role_menu values ('2', '1031');
+insert into sys_role_menu values ('2', '1032');
+insert into sys_role_menu values ('2', '1033');
+insert into sys_role_menu values ('2', '1034');
+insert into sys_role_menu values ('2', '1035');
+insert into sys_role_menu values ('2', '1036');
+insert into sys_role_menu values ('2', '1037');
+insert into sys_role_menu values ('2', '1038');
+insert into sys_role_menu values ('2', '1039');
+insert into sys_role_menu values ('2', '1040');
+insert into sys_role_menu values ('2', '1041');
+insert into sys_role_menu values ('2', '1042');
+insert into sys_role_menu values ('2', '1043');
+insert into sys_role_menu values ('2', '1044');
+insert into sys_role_menu values ('2', '1045');
+insert into sys_role_menu values ('2', '1050');
+insert into sys_role_menu values ('2', '1046');
+insert into sys_role_menu values ('2', '1047');
+insert into sys_role_menu values ('2', '1048');
+insert into sys_role_menu values ('2', '1055');
+insert into sys_role_menu values ('2', '1056');
+insert into sys_role_menu values ('2', '1057');
+insert into sys_role_menu values ('2', '1058');
+insert into sys_role_menu values ('2', '1059');
+insert into sys_role_menu values ('2', '1060');
+insert into sys_role_menu values ('2', '1061');
+insert into sys_role_menu values ('2', '1062');
+insert into sys_role_menu values ('2', '1063');
+insert into sys_role_menu values ('2', '1064');
+insert into sys_role_menu values ('2', '1065');
+
+-- ----------------------------
+-- 8、角色和部门关联表  角色1-N部门
+-- ----------------------------
+drop table if exists sys_role_dept;
+create table if not exists sys_role_dept
+(
+    role_id int8 not null,
+    dept_id int8 not null,
+    constraint sys_role_dept_pk primary key (role_id, dept_id)
+);
+
+comment on table sys_role_dept              is '角色和部门关联表';
+comment on column sys_role_dept.role_id     is '角色ID';
+comment on column sys_role_dept.dept_id     is '部门ID';
+
+-- ----------------------------
+-- 初始化-角色和部门关联表数据
+-- ----------------------------
+insert into sys_role_dept values ('2', '100');
+insert into sys_role_dept values ('2', '101');
+insert into sys_role_dept values ('2', '105');
+
+
+-- ----------------------------
+-- 9、用户与岗位关联表  用户1-N岗位
+-- ----------------------------
+drop table if exists sys_user_post;
+create table if not exists sys_user_post
+(
+    user_id int8 not null,
+    post_id int8 not null,
+    constraint sys_user_post_pk primary key (user_id, post_id)
+);
+
+comment on table sys_user_post              is '用户与岗位关联表';
+comment on column sys_user_post.user_id     is '用户ID';
+comment on column sys_user_post.post_id     is '岗位ID';
+
+-- ----------------------------
+-- 初始化-用户与岗位关联表数据
+-- ----------------------------
+insert into sys_user_post values ('1', '1');
+insert into sys_user_post values ('2', '2');
+
+
+-- ----------------------------
+-- 10、操作日志记录
+-- ----------------------------
+drop table if exists sys_oper_log;
+create table if not exists sys_oper_log
+(
+    oper_id        int8,
+    tenant_id      varchar(20)   default '000000'::varchar,
+    title          varchar(50)   default ''::varchar,
+    business_type  int4          default 0,
+    method         varchar(100)  default ''::varchar,
+    request_method varchar(10)   default ''::varchar,
+    operator_type  int4          default 0,
+    oper_name      varchar(50)   default ''::varchar,
+    dept_name      varchar(50)   default ''::varchar,
+    oper_url       varchar(255)  default ''::varchar,
+    oper_ip        varchar(128)  default ''::varchar,
+    oper_location  varchar(255)  default ''::varchar,
+    oper_param     varchar(2000) default ''::varchar,
+    json_result    varchar(2000) default ''::varchar,
+    status         int4          default 0,
+    error_msg      varchar(2000) default ''::varchar,
+    oper_time      timestamp,
+    cost_time      int8          default 0,
+    constraint sys_oper_log_pk primary key (oper_id)
+);
+
+create index idx_sys_oper_log_bt ON sys_oper_log (business_type);
+create index idx_sys_oper_log_s ON sys_oper_log (status);
+create index idx_sys_oper_log_ot ON sys_oper_log (oper_time);
+
+comment on table sys_oper_log                   is '操作日志记录';
+comment on column sys_oper_log.oper_id          is '日志主键';
+comment on column sys_oper_log.tenant_id        is '租户编号';
+comment on column sys_oper_log.title            is '模块标题';
+comment on column sys_oper_log.business_type    is '业务类型(0其它 1新增 2修改 3删除)';
+comment on column sys_oper_log.method           is '方法名称';
+comment on column sys_oper_log.request_method   is '请求方式';
+comment on column sys_oper_log.operator_type    is '操作类别(0其它 1后台用户 2手机端用户)';
+comment on column sys_oper_log.oper_name        is '操作人员';
+comment on column sys_oper_log.dept_name        is '部门名称';
+comment on column sys_oper_log.oper_url         is '请求URL';
+comment on column sys_oper_log.oper_ip          is '主机地址';
+comment on column sys_oper_log.oper_location    is '操作地点';
+comment on column sys_oper_log.oper_param       is '请求参数';
+comment on column sys_oper_log.json_result      is '返回参数';
+comment on column sys_oper_log.status           is '操作状态(0正常 1异常)';
+comment on column sys_oper_log.error_msg        is '错误消息';
+comment on column sys_oper_log.oper_time        is '操作时间';
+comment on column sys_oper_log.cost_time        is '消耗时间';
+
+-- ----------------------------
+-- 11、字典类型表
+-- ----------------------------
+drop table if exists sys_dict_type;
+create table if not exists sys_dict_type
+(
+    dict_id     int8,
+    tenant_id   varchar(20)  default '000000'::varchar,
+    dict_name   varchar(100) default ''::varchar,
+    dict_type   varchar(100) default ''::varchar,
+    create_dept int8,
+    create_by   int8,
+    create_time timestamp,
+    update_by   int8,
+    update_time timestamp,
+    remark      varchar(500) default null::varchar,
+    constraint sys_dict_type_pk primary key (dict_id)
+);
+
+create unique index sys_dict_type_index1 ON sys_dict_type (tenant_id, dict_type);
+
+comment on table sys_dict_type                  is '字典类型表';
+comment on column sys_dict_type.dict_id         is '字典主键';
+comment on column sys_dict_type.tenant_id       is '租户编号';
+comment on column sys_dict_type.dict_name       is '字典名称';
+comment on column sys_dict_type.dict_type       is '字典类型';
+comment on column sys_dict_type.create_dept     is '创建部门';
+comment on column sys_dict_type.create_by       is '创建者';
+comment on column sys_dict_type.create_time     is '创建时间';
+comment on column sys_dict_type.update_by       is '更新者';
+comment on column sys_dict_type.update_time     is '更新时间';
+comment on column sys_dict_type.remark          is '备注';
+
+insert into sys_dict_type values(1, '000000', '用户性别', 'sys_user_sex',        103, 1, now(), null, null, '用户性别列表');
+insert into sys_dict_type values(2, '000000', '菜单状态', 'sys_show_hide',       103, 1, now(), null, null, '菜单状态列表');
+insert into sys_dict_type values(3, '000000', '系统开关', 'sys_normal_disable',  103, 1, now(), null, null, '系统开关列表');
+insert into sys_dict_type values(6, '000000', '系统是否', 'sys_yes_no',          103, 1, now(), null, null, '系统是否列表');
+insert into sys_dict_type values(7, '000000', '通知类型', 'sys_notice_type',     103, 1, now(), null, null, '通知类型列表');
+insert into sys_dict_type values(8, '000000', '通知状态', 'sys_notice_status',   103, 1, now(), null, null, '通知状态列表');
+insert into sys_dict_type values(9, '000000', '操作类型', 'sys_oper_type',       103, 1, now(), null, null, '操作类型列表');
+insert into sys_dict_type values(10, '000000', '系统状态', 'sys_common_status',  103, 1, now(), null, null, '登录状态列表');
+insert into sys_dict_type values(11, '000000', '授权类型', 'sys_grant_type',     103, 1, now(), null, null, '认证授权类型');
+insert into sys_dict_type values(12, '000000', '设备类型', 'sys_device_type',    103, 1, now(), null, null, '客户端设备类型');
+
+-- ----------------------------
+-- 12、字典数据表
+-- ----------------------------
+drop table if exists sys_dict_data;
+create table if not exists sys_dict_data
+(
+    dict_code   int8,
+    tenant_id   varchar(20)  default '000000'::varchar,
+    dict_sort   int4         default 0,
+    dict_label  varchar(100) default ''::varchar,
+    dict_value  varchar(100) default ''::varchar,
+    dict_type   varchar(100) default ''::varchar,
+    css_class   varchar(100) default null::varchar,
+    list_class  varchar(100) default null::varchar,
+    is_default  char         default 'N'::bpchar,
+    create_dept int8,
+    create_by   int8,
+    create_time timestamp,
+    update_by   int8,
+    update_time timestamp,
+    remark      varchar(500) default null::varchar,
+    constraint sys_dict_data_pk primary key (dict_code)
+);
+
+comment on table sys_dict_data                  is '字典数据表';
+comment on column sys_dict_data.dict_code       is '字典编码';
+comment on column sys_dict_type.tenant_id       is '租户编号';
+comment on column sys_dict_data.dict_sort       is '字典排序';
+comment on column sys_dict_data.dict_label      is '字典标签';
+comment on column sys_dict_data.dict_value      is '字典键值';
+comment on column sys_dict_data.dict_type       is '字典类型';
+comment on column sys_dict_data.css_class       is '样式属性(其他样式扩展)';
+comment on column sys_dict_data.list_class      is '表格回显样式';
+comment on column sys_dict_data.is_default      is '是否默认(Y是 N否)';
+comment on column sys_dict_data.create_dept     is '创建部门';
+comment on column sys_dict_data.create_by       is '创建者';
+comment on column sys_dict_data.create_time     is '创建时间';
+comment on column sys_dict_data.update_by       is '更新者';
+comment on column sys_dict_data.update_time     is '更新时间';
+comment on column sys_dict_data.remark          is '备注';
+
+insert into sys_dict_data values(1, '000000', 1,  '男',       '0',       'sys_user_sex',        '',   '',        'Y', 103, 1, now(), null, null, '性别男');
+insert into sys_dict_data values(2, '000000', 2,  '女',       '1',       'sys_user_sex',        '',   '',        'N', 103, 1, now(), null, null, '性别女');
+insert into sys_dict_data values(3, '000000', 3,  '未知',     '2',       'sys_user_sex',        '',   '',        'N', 103, 1, now(), null, null, '性别未知');
+insert into sys_dict_data values(4, '000000', 1,  '显示',     '0',       'sys_show_hide',       '',   'primary', 'Y', 103, 1, now(), null, null, '显示菜单');
+insert into sys_dict_data values(5, '000000', 2,  '隐藏',     '1',       'sys_show_hide',       '',   'danger',  'N', 103, 1, now(), null, null, '隐藏菜单');
+insert into sys_dict_data values(6, '000000', 1,  '正常',     '0',       'sys_normal_disable',  '',   'primary', 'Y', 103, 1, now(), null, null, '正常状态');
+insert into sys_dict_data values(7, '000000', 2,  '停用',     '1',       'sys_normal_disable',  '',   'danger',  'N', 103, 1, now(), null, null, '停用状态');
+insert into sys_dict_data values(12, '000000', 1,  '是',       'Y',       'sys_yes_no',          '',   'primary', 'Y', 103, 1, now(), null, null, '系统默认是');
+insert into sys_dict_data values(13, '000000', 2,  '否',       'N',       'sys_yes_no',          '',   'danger',  'N', 103, 1, now(), null, null, '系统默认否');
+insert into sys_dict_data values(14, '000000', 1,  '通知',     '1',       'sys_notice_type',     '',   'warning', 'Y', 103, 1, now(), null, null, '通知');
+insert into sys_dict_data values(15, '000000', 2,  '公告',     '2',       'sys_notice_type',     '',   'success', 'N', 103, 1, now(), null, null, '公告');
+insert into sys_dict_data values(16, '000000', 1,  '正常',     '0',       'sys_notice_status',   '',   'primary', 'Y', 103, 1, now(), null, null, '正常状态');
+insert into sys_dict_data values(17, '000000', 2,  '关闭',     '1',       'sys_notice_status',   '',   'danger',  'N', 103, 1, now(), null, null, '关闭状态');
+insert into sys_dict_data values(29, '000000', 99, '其他',     '0',       'sys_oper_type',       '',   'info',    'N', 103, 1, now(), null, null, '其他操作');
+insert into sys_dict_data values(18, '000000', 1,  '新增',     '1',       'sys_oper_type',       '',   'info',    'N', 103, 1, now(), null, null, '新增操作');
+insert into sys_dict_data values(19, '000000', 2,  '修改',     '2',       'sys_oper_type',       '',   'info',    'N', 103, 1, now(), null, null, '修改操作');
+insert into sys_dict_data values(20, '000000', 3,  '删除',     '3',       'sys_oper_type',       '',   'danger',  'N', 103, 1, now(), null, null, '删除操作');
+insert into sys_dict_data values(21, '000000', 4,  '授权',     '4',       'sys_oper_type',       '',   'primary', 'N', 103, 1, now(), null, null, '授权操作');
+insert into sys_dict_data values(22, '000000', 5,  '导出',     '5',       'sys_oper_type',       '',   'warning', 'N', 103, 1, now(), null, null, '导出操作');
+insert into sys_dict_data values(23, '000000', 6,  '导入',     '6',       'sys_oper_type',       '',   'warning', 'N', 103, 1, now(), null, null, '导入操作');
+insert into sys_dict_data values(24, '000000', 7,  '强退',     '7',       'sys_oper_type',       '',   'danger',  'N', 103, 1, now(), null, null, '强退操作');
+insert into sys_dict_data values(25, '000000', 8,  '生成代码', '8',       'sys_oper_type',       '',   'warning', 'N', 103, 1, now(), null, null, '生成操作');
+insert into sys_dict_data values(26, '000000', 9,  '清空数据', '9',       'sys_oper_type',       '',   'danger',  'N', 103, 1, now(), null, null, '清空操作');
+insert into sys_dict_data values(27, '000000', 1,  '成功',     '0',       'sys_common_status',   '',   'primary', 'N', 103, 1, now(), null, null, '正常状态');
+insert into sys_dict_data values(28, '000000', 2,  '失败',     '1',       'sys_common_status',   '',   'danger',  'N', 103, 1, now(), null, null, '停用状态');
+insert into sys_dict_data values(30, '000000', 0,  '密码认证', 'password',   'sys_grant_type',   '',   'default', 'N', 103, 1, now(), null, null, '密码认证');
+insert into sys_dict_data values(31, '000000', 0,  '短信认证', 'sms',        'sys_grant_type',   '',   'default', 'N', 103, 1, now(), null, null, '短信认证');
+insert into sys_dict_data values(32, '000000', 0,  '邮件认证', 'email',      'sys_grant_type',   '',   'default', 'N', 103, 1, now(), null, null, '邮件认证');
+insert into sys_dict_data values(33, '000000', 0,  '小程序认证', 'xcx',      'sys_grant_type',   '',   'default', 'N', 103, 1, now(), null, null, '小程序认证');
+insert into sys_dict_data values(34, '000000', 0,  '三方登录认证', 'social', 'sys_grant_type',   '',   'default', 'N', 103, 1, now(), null, null, '三方登录认证');
+insert into sys_dict_data values(35, '000000', 0,  'PC', 'pc',              'sys_device_type',   '',   'default', 'N', 103, 1, now(), null, null, 'PC');
+insert into sys_dict_data values(36, '000000', 0,  '安卓', 'android',       'sys_device_type',   '',   'default', 'N', 103, 1, now(), null, null, '安卓');
+insert into sys_dict_data values(37, '000000', 0,  'iOS', 'ios',            'sys_device_type',   '',   'default', 'N', 103, 1, now(), null, null, 'iOS');
+insert into sys_dict_data values(38, '000000', 0,  '小程序', 'xcx',         'sys_device_type',   '',   'default', 'N', 103, 1, now(), null, null, '小程序');
+
+
+-- ----------------------------
+-- 13、参数配置表
+-- ----------------------------
+drop table if exists sys_config;
+create table if not exists sys_config
+(
+    config_id    int8,
+    tenant_id    varchar(20)  default '000000'::varchar,
+    config_name  varchar(100) default ''::varchar,
+    config_key   varchar(100) default ''::varchar,
+    config_value varchar(500) default ''::varchar,
+    config_type  char         default 'N'::bpchar,
+    create_dept  int8,
+    create_by    int8,
+    create_time  timestamp,
+    update_by    int8,
+    update_time  timestamp,
+    remark       varchar(500) default null::varchar,
+    constraint sys_config_pk primary key (config_id)
+);
+
+comment on table sys_config                 is '参数配置表';
+comment on column sys_config.config_id      is '参数主键';
+comment on column sys_config.tenant_id      is '租户编号';
+comment on column sys_config.config_name    is '参数名称';
+comment on column sys_config.config_key     is '参数键名';
+comment on column sys_config.config_value   is '参数键值';
+comment on column sys_config.config_type    is '系统内置(Y是 N否)';
+comment on column sys_config.create_dept    is '创建部门';
+comment on column sys_config.create_by      is '创建者';
+comment on column sys_config.create_time    is '创建时间';
+comment on column sys_config.update_by      is '更新者';
+comment on column sys_config.update_time    is '更新时间';
+comment on column sys_config.remark         is '备注';
+
+insert into sys_config values(1, '000000', '主框架页-默认皮肤样式名称',     'sys.index.skinName',            'skin-blue',     'Y', 103, 1, now(), null, null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
+insert into sys_config values(2, '000000', '用户管理-账号初始密码',         'sys.user.initPassword',         '123456',        'Y', 103, 1, now(), null, null, '初始化密码 123456' );
+insert into sys_config values(3, '000000', '主框架页-侧边栏主题',           'sys.index.sideTheme',           'theme-dark',    'Y', 103, 1, now(), null, null, '深色主题theme-dark,浅色主题theme-light' );
+insert into sys_config values(5, '000000', '账号自助-是否开启用户注册功能',   'sys.account.registerUser',      'false',         'Y', 103, 1, now(), null, null, '是否开启注册用户功能(true开启,false关闭)');
+insert into sys_config values(11, '000000', 'OSS预览列表资源开关',          'sys.oss.previewListResource',   'true',          'Y', 103, 1, now(), null, null, 'true:开启, false:关闭');
+
+
+-- ----------------------------
+-- 14、系统访问记录
+-- ----------------------------
+drop table if exists sys_logininfor;
+create table if not exists sys_logininfor
+(
+    info_id        int8,
+    tenant_id      varchar(20)  default '000000'::varchar,
+    user_name      varchar(50)  default ''::varchar,
+    ipaddr         varchar(128) default ''::varchar,
+    login_location varchar(255) default ''::varchar,
+    browser        varchar(50)  default ''::varchar,
+    os             varchar(50)  default ''::varchar,
+    status         char         default '0'::bpchar,
+    msg            varchar(255) default ''::varchar,
+    login_time     timestamp,
+    constraint sys_logininfor_pk primary key (info_id)
+);
+
+create index idx_sys_logininfor_s ON sys_logininfor (status);
+create index idx_sys_logininfor_lt ON sys_logininfor (login_time);
+
+comment on table sys_logininfor                 is '系统访问记录';
+comment on column sys_logininfor.info_id        is '访问ID';
+comment on column sys_logininfor.tenant_id      is '租户编号';
+comment on column sys_logininfor.user_name      is '用户账号';
+comment on column sys_logininfor.ipaddr         is '登录IP地址';
+comment on column sys_logininfor.login_location is '登录地点';
+comment on column sys_logininfor.browser        is '浏览器类型';
+comment on column sys_logininfor.os             is '操作系统';
+comment on column sys_logininfor.status         is '登录状态(0成功 1失败)';
+comment on column sys_logininfor.msg            is '提示消息';
+comment on column sys_logininfor.login_time     is '访问时间';
+
+-- ----------------------------
+-- 17、通知公告表
+-- ----------------------------
+drop table if exists sys_notice;
+create table if not exists sys_notice
+(
+    notice_id      int8,
+    tenant_id      varchar(20)  default '000000'::varchar,
+    notice_title   varchar(50)  not null,
+    notice_type    char         not null,
+    notice_content text,
+    status         char         default '0'::bpchar,
+    create_dept    int8,
+    create_by      int8,
+    create_time    timestamp,
+    update_by      int8,
+    update_time    timestamp,
+    remark         varchar(255) default null::varchar,
+    constraint sys_notice_pk primary key (notice_id)
+);
+
+comment on table sys_notice                 is '通知公告表';
+comment on column sys_notice.notice_id      is '公告ID';
+comment on column sys_notice.tenant_id      is '租户编号';
+comment on column sys_notice.notice_title   is '公告标题';
+comment on column sys_notice.notice_type    is '公告类型(1通知 2公告)';
+comment on column sys_notice.notice_content is '公告内容';
+comment on column sys_notice.status         is '公告状态(0正常 1关闭)';
+comment on column sys_notice.create_dept    is '创建部门';
+comment on column sys_notice.create_by      is '创建者';
+comment on column sys_notice.create_time    is '创建时间';
+comment on column sys_notice.update_by      is '更新者';
+comment on column sys_notice.update_time    is '更新时间';
+comment on column sys_notice.remark         is '备注';
+
+-- ----------------------------
+-- 初始化-公告信息表数据
+-- ----------------------------
+insert into sys_notice values('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, now(), null, null, '管理员');
+insert into sys_notice values('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容',   '0', 103, 1, now(), null, null, '管理员');
+
+
+-- ----------------------------
+-- 18、代码生成业务表
+-- ----------------------------
+drop table if exists gen_table;
+create table if not exists gen_table
+(
+    table_id          int8,
+    data_name         varchar(200)  default ''::varchar,
+    table_name        varchar(200)  default ''::varchar,
+    table_comment     varchar(500)  default ''::varchar,
+    sub_table_name    varchar(64)   default ''::varchar,
+    sub_table_fk_name varchar(64)   default ''::varchar,
+    class_name        varchar(100)  default ''::varchar,
+    tpl_category      varchar(200)  default 'crud'::varchar,
+    package_name      varchar(100)  default null::varchar,
+    module_name       varchar(30)   default null::varchar,
+    business_name     varchar(30)   default null::varchar,
+    function_name     varchar(50)   default null::varchar,
+    function_author   varchar(50)   default null::varchar,
+    gen_type          char          default '0'::bpchar not null,
+    gen_path          varchar(200)  default '/'::varchar,
+    options           varchar(1000) default null::varchar,
+    create_dept       int8,
+    create_by         int8,
+    create_time       timestamp,
+    update_by         int8,
+    update_time       timestamp,
+    remark            varchar(500)  default null::varchar,
+    constraint gen_table_pk primary key (table_id)
+);
+
+comment on table gen_table is '代码生成业务表';
+comment on column gen_table.table_id is '编号';
+comment on column gen_table.data_name is '数据源名称';
+comment on column gen_table.table_name is '表名称';
+comment on column gen_table.table_comment is '表描述';
+comment on column gen_table.sub_table_name is '关联子表的表名';
+comment on column gen_table.sub_table_fk_name is '子表关联的外键名';
+comment on column gen_table.class_name is '实体类名称';
+comment on column gen_table.tpl_category is '使用的模板(CRUD单表操作 TREE树表操作)';
+comment on column gen_table.package_name is '生成包路径';
+comment on column gen_table.module_name is '生成模块名';
+comment on column gen_table.business_name is '生成业务名';
+comment on column gen_table.function_name is '生成功能名';
+comment on column gen_table.function_author is '生成功能作者';
+comment on column gen_table.gen_type is '生成代码方式(0zip压缩包 1自定义路径)';
+comment on column gen_table.gen_path is '生成路径(不填默认项目路径)';
+comment on column gen_table.options is '其它生成选项';
+comment on column gen_table.create_dept is '创建部门';
+comment on column gen_table.create_by is '创建者';
+comment on column gen_table.create_time is '创建时间';
+comment on column gen_table.update_by is '更新者';
+comment on column gen_table.update_time is '更新时间';
+comment on column gen_table.remark is '备注';
+
+-- ----------------------------
+-- 19、代码生成业务表字段
+-- ----------------------------
+drop table if exists gen_table_column;
+create table if not exists gen_table_column
+(
+    column_id      int8,
+    table_id       int8,
+    column_name    varchar(200) default null::varchar,
+    column_comment varchar(500) default null::varchar,
+    column_type    varchar(100) default null::varchar,
+    java_type      varchar(500) default null::varchar,
+    java_field     varchar(200) default null::varchar,
+    is_pk          char         default null::bpchar,
+    is_increment   char         default null::bpchar,
+    is_required    char         default null::bpchar,
+    is_insert      char         default null::bpchar,
+    is_edit        char         default null::bpchar,
+    is_list        char         default null::bpchar,
+    is_query       char         default null::bpchar,
+    query_type     varchar(200) default 'EQ'::varchar,
+    html_type      varchar(200) default null::varchar,
+    dict_type      varchar(200) default ''::varchar,
+    sort           int4,
+    create_dept    int8,
+    create_by      int8,
+    create_time    timestamp,
+    update_by      int8,
+    update_time    timestamp,
+    constraint gen_table_column_pk primary key (column_id)
+);
+
+comment on table gen_table_column is '代码生成业务表字段';
+comment on column gen_table_column.column_id is '编号';
+comment on column gen_table_column.table_id is '归属表编号';
+comment on column gen_table_column.column_name is '列名称';
+comment on column gen_table_column.column_comment is '列描述';
+comment on column gen_table_column.column_type is '列类型';
+comment on column gen_table_column.java_type is 'JAVA类型';
+comment on column gen_table_column.java_field is 'JAVA字段名';
+comment on column gen_table_column.is_pk is '是否主键(1是)';
+comment on column gen_table_column.is_increment is '是否自增(1是)';
+comment on column gen_table_column.is_required is '是否必填(1是)';
+comment on column gen_table_column.is_insert is '是否为插入字段(1是)';
+comment on column gen_table_column.is_edit is '是否编辑字段(1是)';
+comment on column gen_table_column.is_list is '是否列表字段(1是)';
+comment on column gen_table_column.is_query is '是否查询字段(1是)';
+comment on column gen_table_column.query_type is '查询方式(等于、不等于、大于、小于、范围)';
+comment on column gen_table_column.html_type is '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)';
+comment on column gen_table_column.dict_type is '字典类型';
+comment on column gen_table_column.sort is '排序';
+comment on column gen_table_column.create_dept is '创建部门';
+comment on column gen_table_column.create_by is '创建者';
+comment on column gen_table_column.create_time is '创建时间';
+comment on column gen_table_column.update_by is '更新者';
+comment on column gen_table_column.update_time is '更新时间';
+
+-- ----------------------------
+-- OSS对象存储表
+-- ----------------------------
+drop table if exists sys_oss;
+create table if not exists sys_oss
+(
+    oss_id        int8,
+    tenant_id     varchar(20)  default '000000'::varchar,
+    file_name     varchar(255) default ''::varchar not null,
+    original_name varchar(255) default ''::varchar not null,
+    file_suffix   varchar(10)  default ''::varchar not null,
+    url           varchar(500) default ''::varchar not null,
+    create_dept   int8,
+    create_by     int8,
+    create_time   timestamp,
+    update_by     int8,
+    update_time   timestamp,
+    service       varchar(20)  default 'minio'::varchar,
+    constraint sys_oss_pk primary key (oss_id)
+);
+
+comment on table sys_oss                    is 'OSS对象存储表';
+comment on column sys_oss.oss_id            is '对象存储主键';
+comment on column sys_oss.tenant_id         is '租户编码';
+comment on column sys_oss.file_name         is '文件名';
+comment on column sys_oss.original_name     is '原名';
+comment on column sys_oss.file_suffix       is '文件后缀名';
+comment on column sys_oss.url               is 'URL地址';
+comment on column sys_oss.create_by         is '上传人';
+comment on column sys_oss.create_dept       is '创建部门';
+comment on column sys_oss.create_time       is '创建时间';
+comment on column sys_oss.update_by         is '更新者';
+comment on column sys_oss.update_time       is '更新时间';
+comment on column sys_oss.service           is '服务商';
+
+-- ----------------------------
+-- OSS对象存储动态配置表
+-- ----------------------------
+drop table if exists sys_oss_config;
+create table if not exists sys_oss_config
+(
+    oss_config_id int8,
+    tenant_id     varchar(20)  default '000000'::varchar,
+    config_key    varchar(20)  default ''::varchar not null,
+    access_key    varchar(255) default ''::varchar,
+    secret_key    varchar(255) default ''::varchar,
+    bucket_name   varchar(255) default ''::varchar,
+    prefix        varchar(255) default ''::varchar,
+    endpoint      varchar(255) default ''::varchar,
+    domain        varchar(255) default ''::varchar,
+    is_https      char         default 'N'::bpchar,
+    region        varchar(255) default ''::varchar,
+    access_policy char(1)      default '1'::bpchar not null,
+    status        char         default '1'::bpchar,
+    ext1          varchar(255) default ''::varchar,
+    create_dept   int8,
+    create_by     int8,
+    create_time   timestamp,
+    update_by     int8,
+    update_time   timestamp,
+    remark        varchar(500) default ''::varchar,
+    constraint sys_oss_config_pk primary key (oss_config_id)
+);
+
+comment on table sys_oss_config                 is '对象存储配置表';
+comment on column sys_oss_config.oss_config_id  is '主建';
+comment on column sys_oss_config.tenant_id      is '租户编码';
+comment on column sys_oss_config.config_key     is '配置key';
+comment on column sys_oss_config.access_key     is 'accessKey';
+comment on column sys_oss_config.secret_key     is '秘钥';
+comment on column sys_oss_config.bucket_name    is '桶名称';
+comment on column sys_oss_config.prefix         is '前缀';
+comment on column sys_oss_config.endpoint       is '访问站点';
+comment on column sys_oss_config.domain         is '自定义域名';
+comment on column sys_oss_config.is_https       is '是否https(Y=是,N=否)';
+comment on column sys_oss_config.region         is '域';
+comment on column sys_oss_config.access_policy  is '桶权限类型(0=private 1=public 2=custom)';
+comment on column sys_oss_config.status         is '是否默认(0=是,1=否)';
+comment on column sys_oss_config.ext1           is '扩展字段';
+comment on column sys_oss_config.create_dept    is '创建部门';
+comment on column sys_oss_config.create_by      is '创建者';
+comment on column sys_oss_config.create_time    is '创建时间';
+comment on column sys_oss_config.update_by      is '更新者';
+comment on column sys_oss_config.update_time    is '更新时间';
+comment on column sys_oss_config.remark         is '备注';
+
+insert into sys_oss_config values (1, '000000', 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                      '','N', '',            '1', '0', '', 103, 1, now(), 1, now(), null);
+insert into sys_oss_config values (2, '000000', 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',           '','N', '',            '1', '1', '', 103, 1, now(), 1, now(), null);
+insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',         '','N', '',            '1', '1', '', 103, 1, now(), 1, now(), null);
+insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',         '','N', 'ap-beijing',  '1', '1', '', 103, 1, now(), 1, now(), null);
+insert into sys_oss_config values (5, '000000', 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',                 '','N', '',            '1', '1', '', 103, 1, now(), 1, now(), NULL);
+
+-- ----------------------------
+-- 系统授权表
+-- ----------------------------
+drop table if exists sys_client;
+create table sys_client (
+    id                  int8,
+    client_id           varchar(64)   default ''::varchar,
+    client_key          varchar(32)   default ''::varchar,
+    client_secret       varchar(255)  default ''::varchar,
+    grant_type          varchar(255)  default ''::varchar,
+    device_type         varchar(32)   default ''::varchar,
+    active_timeout      int4          default 1800,
+    timeout             int4          default 604800,
+    status              char(1)       default '0'::bpchar,
+    del_flag            char(1)       default '0'::bpchar,
+    create_dept         int8,
+    create_by           int8,
+    create_time         timestamp,
+    update_by           int8,
+    update_time         timestamp,
+    constraint sys_client_pk primary key (id)
+);
+
+comment on table sys_client                         is '系统授权表';
+comment on column sys_client.id                     is '主建';
+comment on column sys_client.client_id              is '客户端id';
+comment on column sys_client.client_key             is '客户端key';
+comment on column sys_client.client_secret          is '客户端秘钥';
+comment on column sys_client.grant_type             is '授权类型';
+comment on column sys_client.device_type            is '设备类型';
+comment on column sys_client.active_timeout         is 'token活跃超时时间';
+comment on column sys_client.timeout                is 'token固定超时';
+comment on column sys_client.status                 is '状态(0正常 1停用)';
+comment on column sys_client.del_flag               is '删除标志(0代表存在 2代表删除)';
+comment on column sys_client.create_dept            is '创建部门';
+comment on column sys_client.create_by              is '创建者';
+comment on column sys_client.create_time            is '创建时间';
+comment on column sys_client.update_by              is '更新者';
+comment on column sys_client.update_time            is '更新时间';
+
+insert into sys_client values (1, 'e5cd7e4891bf95d1d19206ce24a7b32e', 'pc', 'pc123', 'password,social', 'pc', 1800, 604800, 0, 0, 103, 1, now(), 1, now());
+insert into sys_client values (2, '428a8310cd442757ae699df5d894f051', 'app', 'app123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 103, 1, now(), 1, now());
+
+-- 字符串自动转时间 避免框架时间查询报错问题
+create or replace function cast_varchar_to_timestamp(varchar) returns timestamptz as $$
+select to_timestamp($1, 'yyyy-mm-dd hh24:mi:ss');
+$$ language sql strict ;
+
+create cast (varchar as timestamptz) with function cast_varchar_to_timestamp as IMPLICIT;

+ 204 - 0
script/sql/postgres/postgres_test.sql

@@ -0,0 +1,204 @@
+DROP TABLE if EXISTS test_demo;
+create table if not exists test_demo
+(
+    id          int8,
+    tenant_id   varchar(20)     default '000000',
+    dept_id     int8,
+    user_id     int8,
+    order_num   int4            default 0,
+    test_key    varchar(255),
+    value       varchar(255),
+    version     int4            default 0,
+    create_time timestamp,
+    create_dept int8,
+    create_by   int8,
+    update_time timestamp,
+    update_by   int8,
+    del_flag    int4            default 0
+);
+
+comment on table test_demo is '测试单表';
+comment on column test_demo.id is '主键';
+comment on column test_demo.tenant_id is '租户编号';
+comment on column test_demo.dept_id is '部门id';
+comment on column test_demo.user_id is '用户id';
+comment on column test_demo.order_num is '排序号';
+comment on column test_demo.test_key is 'key键';
+comment on column test_demo.value is '值';
+comment on column test_demo.version is '版本';
+comment on column test_demo.create_dept  is '创建部门';
+comment on column test_demo.create_time is '创建时间';
+comment on column test_demo.create_by is '创建人';
+comment on column test_demo.update_time is '更新时间';
+comment on column test_demo.update_by is '更新人';
+comment on column test_demo.del_flag is '删除标志';
+
+DROP TABLE if EXISTS test_tree;
+create table if not exists test_tree
+(
+    id          int8,
+    tenant_id   varchar(20)     default '000000',
+    parent_id   int8            default 0,
+    dept_id     int8,
+    user_id     int8,
+    tree_name   varchar(255),
+    version     int4            default 0,
+    create_time timestamp,
+    create_dept int8,
+    create_by   int8,
+    update_time timestamp,
+    update_by   int8,
+    del_flag    integer         default 0
+);
+
+comment on table test_tree is '测试树表';
+comment on column test_tree.id is '主键';
+comment on column test_tree.tenant_id is '租户编号';
+comment on column test_tree.parent_id is '父id';
+comment on column test_tree.dept_id is '部门id';
+comment on column test_tree.user_id is '用户id';
+comment on column test_tree.tree_name is '值';
+comment on column test_tree.version is '版本';
+comment on column test_tree.create_dept  is '创建部门';
+comment on column test_tree.create_time is '创建时间';
+comment on column test_tree.create_by is '创建人';
+comment on column test_tree.update_time is '更新时间';
+comment on column test_tree.update_by is '更新人';
+comment on column test_tree.del_flag is '删除标志';
+
+INSERT INTO sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', now(), 103, 1, now(), 3, now(), NULL);
+INSERT INTO sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', now(), 103, 1, now(), 4, now(), NULL);
+
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (5, '测试菜单', 0, 5, 'demo', NULL, 1, 0, 'M', '0', '0', NULL, 'star', 103, 1, now(), NULL, NULL, '');
+
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1500, '测试单表', 5, 1, 'demo', 'demo/demo/index', 1, 0, 'C', '0', '0', 'demo:demo:list', '#', 103, 1, now(), NULL, NULL, '测试单表菜单');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1501, '测试单表查询', 1500, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:query', '#', 103, 1, now(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1502, '测试单表新增', 1500, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:add', '#', 103, 1, now(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1503, '测试单表修改', 1500, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:edit', '#', 103, 1, now(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1504, '测试单表删除', 1500, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:remove', '#', 103, 1, now(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1505, '测试单表导出', 1500, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:export', '#', 103, 1, now(), NULL, NULL, '');
+
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1506, '测试树表', 5, 1, 'tree', 'demo/tree/index', 1, 0, 'C', '0', '0', 'demo:tree:list', '#', 103, 1, now(), NULL, NULL, '测试树表菜单');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1507, '测试树表查询', 1506, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:query', '#', 103, 1, now(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1508, '测试树表新增', 1506, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:add', '#', 103, 1, now(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1509, '测试树表修改', 1506, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:edit', '#', 103, 1, now(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1510, '测试树表删除', 1506, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, now(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1511, '测试树表导出', 1506, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, now(), NULL, NULL, '');
+
+INSERT INTO sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (3, '000000', '本部门及以下', 'test1', 3, '4', 't', 't', '0', '0', 103, 1, now(), 1,  NULL, NULL);
+INSERT INTO sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (4, '000000', '仅本人', 'test2', 4, '5', 't', 't', '0', '0', 103, 1, now(), 1,  NULL, NULL);
+
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 5);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 100);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 101);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 102);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 103);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 104);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 105);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 106);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 107);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 108);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 500);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 501);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1001);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1002);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1003);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1004);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1005);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1006);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1007);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1008);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1009);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1010);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1011);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1012);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1013);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1014);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1015);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1016);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1017);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1018);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1019);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1020);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1021);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1022);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1023);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1024);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1025);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1026);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1027);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1028);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1029);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1030);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1031);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1032);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1033);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1034);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1035);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1036);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1037);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1038);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1039);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1040);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1041);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1042);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1043);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1044);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1045);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1500);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1501);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1502);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1503);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1504);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1505);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1506);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1507);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1508);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1509);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1510);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1511);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 5);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1500);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1501);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1502);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1503);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1504);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1505);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1506);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1507);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1508);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1509);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1510);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1511);
+
+INSERT INTO sys_user_role(user_id, role_id) VALUES (3, 3);
+INSERT INTO sys_user_role(user_id, role_id) VALUES (4, 4);
+
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (1, '000000', 102, 4, 1, '测试数据权限', '测试', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (2, '000000', 102, 3, 2, '子节点1', '111', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (3, '000000', 102, 3, 3, '子节点2', '222', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (4, '000000', 108, 4, 4, '测试数据', 'demo', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (5, '000000', 108, 3, 13, '子节点11', '1111', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (6, '000000', 108, 3, 12, '子节点22', '2222', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (7, '000000', 108, 3, 11, '子节点33', '3333', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (8, '000000', 108, 3, 10, '子节点44', '4444', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (9, '000000', 108, 3, 9, '子节点55', '5555', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (10, '000000', 108, 3, 8, '子节点66', '6666', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (11, '000000', 108, 3, 7, '子节点77', '7777', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (12, '000000', 108, 3, 6, '子节点88', '8888', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (13, '000000', 108, 3, 5, '子节点99', '9999', 0, 103, now(), 1, NULL, NULL, 0);
+
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (1, '000000', 0, 102, 4, '测试数据权限', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (2, '000000', 1, 102, 3, '子节点1', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (3, '000000', 2, 102, 3, '子节点2', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (4, '000000', 0, 108, 4, '测试树1', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (5, '000000', 4, 108, 3, '子节点11', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (6, '000000', 4, 108, 3, '子节点22', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (7, '000000', 4, 108, 3, '子节点33', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (8, '000000', 5, 108, 3, '子节点44', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (9, '000000', 6, 108, 3, '子节点55', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (10, '000000', 7, 108, 3, '子节点66', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (11, '000000', 7, 108, 3, '子节点77', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (12, '000000', 10, 108, 3, '子节点88', 0, 103, now(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (13, '000000', 10, 108, 3, '子节点99', 0, 103, now(), 1, NULL, NULL, 0);

+ 258 - 0
script/sql/postgres/powerjob.sql

@@ -0,0 +1,258 @@
+-- pj_app_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_app_info;
+
+CREATE TABLE pj_app_info (
+    id int8 NOT NULL,
+    app_name varchar(255) NULL,
+    current_server varchar(255) NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    "password" varchar(255) NULL,
+    CONSTRAINT pj_app_info_pkey PRIMARY KEY (id),
+    CONSTRAINT uidx01_app_info UNIQUE (app_name)
+);
+
+INSERT INTO pj_app_info VALUES(1, 'ruoyi-worker', '127.0.0.1:10010', '2023-06-13 16:32:59.263', '2023-07-04 17:25:49.798', '123456');
+
+
+
+-- pj_container_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_container_info;
+
+CREATE TABLE pj_container_info (
+    id int8 NOT NULL,
+    app_id int8 NULL,
+    container_name varchar(255) NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    last_deploy_time timestamp NULL,
+    source_info varchar(255) NULL,
+    source_type int4 NULL,
+    status int4 NULL,
+    "version" varchar(255) NULL,
+    CONSTRAINT pj_container_info_pkey PRIMARY KEY (id)
+);
+CREATE INDEX idx01_container_info ON pj_container_info USING btree (app_id);
+
+
+-- pj_instance_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_instance_info;
+
+CREATE TABLE pj_instance_info (
+    id int8 NOT NULL,
+    actual_trigger_time int8 NULL,
+    app_id int8 NULL,
+    expected_trigger_time int8 NULL,
+    finished_time int8 NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    instance_id int8 NULL,
+    instance_params oid NULL,
+    job_id int8 NULL,
+    job_params oid NULL,
+    last_report_time int8 NULL,
+    "result" oid NULL,
+    running_times int8 NULL,
+    status int4 NULL,
+    task_tracker_address varchar(255) NULL,
+    "type" int4 NULL,
+    wf_instance_id int8 NULL,
+    CONSTRAINT pj_instance_info_pkey PRIMARY KEY (id)
+);
+CREATE INDEX idx01_instance_info ON pj_instance_info USING btree (job_id, status);
+CREATE INDEX idx02_instance_info ON pj_instance_info USING btree (app_id, status);
+CREATE INDEX idx03_instance_info ON pj_instance_info USING btree (instance_id, status);
+
+
+-- pj_job_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_job_info;
+
+CREATE TABLE pj_job_info (
+    id int8 NOT NULL,
+    alarm_config varchar(255) NULL,
+    app_id int8 NULL,
+    concurrency int4 NULL,
+    designated_workers varchar(255) NULL,
+    dispatch_strategy int4 NULL,
+    execute_type int4 NULL,
+    extra varchar(255) NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    instance_retry_num int4 NULL,
+    instance_time_limit int8 NULL,
+    job_description varchar(255) NULL,
+    job_name varchar(255) NULL,
+    job_params oid NULL,
+    lifecycle varchar(255) NULL,
+    log_config varchar(255) NULL,
+    max_instance_num int4 NULL,
+    max_worker_count int4 NULL,
+    min_cpu_cores float8 NOT NULL,
+    min_disk_space float8 NOT NULL,
+    min_memory_space float8 NOT NULL,
+    next_trigger_time int8 NULL,
+    notify_user_ids varchar(255) NULL,
+    processor_info varchar(255) NULL,
+    processor_type int4 NULL,
+    status int4 NULL,
+    tag varchar(255) NULL,
+    task_retry_num int4 NULL,
+    time_expression varchar(255) NULL,
+    time_expression_type int4 NULL,
+    CONSTRAINT pj_job_info_pkey PRIMARY KEY (id)
+);
+CREATE INDEX idx01_job_info ON pj_job_info USING btree (app_id, status, time_expression_type, next_trigger_time);
+
+
+INSERT INTO pj_job_info VALUES(1, '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', 1, 5, '', 2, 1, NULL, '2023-06-02 15:01:27.717', '2023-07-04 17:22:12.374', 1, 0, '', '单机处理器执行测试', NULL, '{}', '{\"type\":1}', 0, 0, 0.0, 0.0, 0.0, NULL, NULL, 'org.dromara.job.processors.StandaloneProcessorDemo', 1, 2, NULL, 1, '30000', 3);
+INSERT INTO pj_job_info VALUES(2, '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', 1, 5, '', 1, 2, NULL, '2023-06-02 15:04:45.342', '2023-07-04 17:22:12.816', 0, 0, NULL, '广播处理器测试', NULL, '{}', '{\"type\":1}', 0, 0, 0.0, 0.0, 0.0, NULL, NULL, 'org.dromara.job.processors.BroadcastProcessorDemo', 1, 2, NULL, 1, '30000', 3);
+INSERT INTO pj_job_info VALUES(3, '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', 1, 5, '', 1, 4, NULL, '2023-06-02 15:13:23.519', '2023-06-02 16:03:22.421', 0, 0, NULL, 'Map处理器测试', NULL, '{}', '{\"type\":1}', 0, 0, 0.0, 0.0, 0.0, NULL, NULL, 'org.dromara.job.processors.MapProcessorDemo', 1, 2, NULL, 1, '1000', 3);
+INSERT INTO pj_job_info VALUES(4, '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', 1, 5, '', 1, 3, NULL, '2023-06-02 15:45:25.896', '2023-06-02 16:03:23.125', 0, 0, NULL, 'MapReduce处理器测试', NULL, '{}', '{\"type\":1}', 0, 0, 0.0, 0.0, 0.0, NULL, NULL, 'org.dromara.job.processors.MapReduceProcessorDemo', 1, 2, NULL, 1, '1000', 3);
+
+
+-- pj_oms_lock definition
+
+-- Drop table
+
+-- DROP TABLE pj_oms_lock;
+
+CREATE TABLE pj_oms_lock (
+    id int8 NOT NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    lock_name varchar(255) NULL,
+    max_lock_time int8 NULL,
+    ownerip varchar(255) NULL,
+    CONSTRAINT pj_oms_lock_pkey PRIMARY KEY (id),
+    CONSTRAINT uidx01_oms_lock UNIQUE (lock_name)
+);
+
+
+-- pj_server_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_server_info;
+
+CREATE TABLE pj_server_info (
+    id int8 NOT NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    ip varchar(255) NULL,
+    CONSTRAINT pj_server_info_pkey PRIMARY KEY (id),
+    CONSTRAINT uidx01_server_info UNIQUE (ip)
+);
+CREATE INDEX idx01_server_info ON pj_server_info USING btree (gmt_modified);
+
+
+-- pj_user_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_user_info;
+
+CREATE TABLE pj_user_info (
+    id int8 NOT NULL,
+    email varchar(255) NULL,
+    extra varchar(255) NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    "password" varchar(255) NULL,
+    phone varchar(255) NULL,
+    username varchar(255) NULL,
+    web_hook varchar(255) NULL,
+    CONSTRAINT pj_user_info_pkey PRIMARY KEY (id)
+);
+CREATE INDEX uidx01_user_info ON pj_user_info USING btree (username);
+CREATE INDEX uidx02_user_info ON pj_user_info USING btree (email);
+
+
+-- pj_workflow_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_workflow_info;
+
+CREATE TABLE pj_workflow_info (
+    id int8 NOT NULL,
+    app_id int8 NULL,
+    extra varchar(255) NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    lifecycle varchar(255) NULL,
+    max_wf_instance_num int4 NULL,
+    next_trigger_time int8 NULL,
+    notify_user_ids varchar(255) NULL,
+    pedag oid NULL,
+    status int4 NULL,
+    time_expression varchar(255) NULL,
+    time_expression_type int4 NULL,
+    wf_description varchar(255) NULL,
+    wf_name varchar(255) NULL,
+    CONSTRAINT pj_workflow_info_pkey PRIMARY KEY (id)
+);
+CREATE INDEX idx01_workflow_info ON pj_workflow_info USING btree (app_id, status, time_expression_type, next_trigger_time);
+
+
+-- pj_workflow_instance_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_workflow_instance_info;
+
+CREATE TABLE pj_workflow_instance_info (
+    id int8 NOT NULL,
+    actual_trigger_time int8 NULL,
+    app_id int8 NULL,
+    dag oid NULL,
+    expected_trigger_time int8 NULL,
+    finished_time int8 NULL,
+    gmt_create timestamp NULL,
+    gmt_modified timestamp NULL,
+    parent_wf_instance_id int8 NULL,
+    "result" oid NULL,
+    status int4 NULL,
+    wf_context oid NULL,
+    wf_init_params oid NULL,
+    wf_instance_id int8 NULL,
+    workflow_id int8 NULL,
+    CONSTRAINT pj_workflow_instance_info_pkey PRIMARY KEY (id),
+    CONSTRAINT uidx01_wf_instance UNIQUE (wf_instance_id)
+);
+CREATE INDEX idx01_wf_instance ON pj_workflow_instance_info USING btree (workflow_id, status, app_id, expected_trigger_time);
+
+
+-- pj_workflow_node_info definition
+
+-- Drop table
+
+-- DROP TABLE pj_workflow_node_info;
+
+CREATE TABLE pj_workflow_node_info (
+    id int8 NOT NULL,
+    app_id int8 NOT NULL,
+    "enable" bool NOT NULL,
+    extra oid NULL,
+    gmt_create timestamp NOT NULL,
+    gmt_modified timestamp NOT NULL,
+    job_id int8 NULL,
+    node_name varchar(255) NULL,
+    node_params oid NULL,
+    skip_when_failed bool NOT NULL,
+    "type" int4 NULL,
+    workflow_id int8 NULL,
+    CONSTRAINT pj_workflow_node_info_pkey PRIMARY KEY (id)
+);
+CREATE INDEX idx01_workflow_node_info ON pj_workflow_node_info USING btree (workflow_id, gmt_create);

+ 233 - 0
script/sql/powerjob.sql

@@ -0,0 +1,233 @@
+-- ----------------------------
+-- Table structure for pj_app_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_app_info`;
+CREATE TABLE `pj_app_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `app_name` varchar(255) NULL DEFAULT NULL,
+    `current_server` varchar(255) NULL DEFAULT NULL,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `password` varchar(255) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `uidx01_app_info`(`app_name`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of pj_app_info
+-- ----------------------------
+INSERT INTO `pj_app_info` VALUES (1, 'ruoyi-worker', '127.0.0.1:10010', '2023-06-13 16:32:59.263000', '2023-07-04 17:25:49.798000', '123456');
+
+-- ----------------------------
+-- Table structure for pj_container_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_container_info`;
+CREATE TABLE `pj_container_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `app_id` bigint(0) NULL DEFAULT NULL,
+    `container_name` varchar(255) NULL DEFAULT NULL,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `last_deploy_time` datetime(6) NULL DEFAULT NULL,
+    `source_info` varchar(255) NULL DEFAULT NULL,
+    `source_type` int(0) NULL DEFAULT NULL,
+    `status` int(0) NULL DEFAULT NULL,
+    `version` varchar(255) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx01_container_info`(`app_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for pj_instance_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_instance_info`;
+CREATE TABLE `pj_instance_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `actual_trigger_time` bigint(0) NULL DEFAULT NULL,
+    `app_id` bigint(0) NULL DEFAULT NULL,
+    `expected_trigger_time` bigint(0) NULL DEFAULT NULL,
+    `finished_time` bigint(0) NULL DEFAULT NULL,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `instance_id` bigint(0) NULL DEFAULT NULL,
+    `instance_params` longtext NULL,
+    `job_id` bigint(0) NULL DEFAULT NULL,
+    `job_params` longtext NULL,
+    `last_report_time` bigint(0) NULL DEFAULT NULL,
+    `result` longtext NULL,
+    `running_times` bigint(0) NULL DEFAULT NULL,
+    `status` int(0) NULL DEFAULT NULL,
+    `task_tracker_address` varchar(255) NULL DEFAULT NULL,
+    `type` int(0) NULL DEFAULT NULL,
+    `wf_instance_id` bigint(0) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx01_instance_info`(`job_id`, `status`) USING BTREE,
+    INDEX `idx02_instance_info`(`app_id`, `status`) USING BTREE,
+    INDEX `idx03_instance_info`(`instance_id`, `status`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 4 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for pj_job_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_job_info`;
+CREATE TABLE `pj_job_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `alarm_config` varchar(255) NULL DEFAULT NULL,
+    `app_id` bigint(0) NULL DEFAULT NULL,
+    `concurrency` int(0) NULL DEFAULT NULL,
+    `designated_workers` varchar(255) NULL DEFAULT NULL,
+    `dispatch_strategy` int(0) NULL DEFAULT NULL,
+    `execute_type` int(0) NULL DEFAULT NULL,
+    `extra` varchar(255) NULL DEFAULT NULL,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `instance_retry_num` int(0) NULL DEFAULT NULL,
+    `instance_time_limit` bigint(0) NULL DEFAULT NULL,
+    `job_description` varchar(255) NULL DEFAULT NULL,
+    `job_name` varchar(255) NULL DEFAULT NULL,
+    `job_params` longtext NULL,
+    `lifecycle` varchar(255) NULL DEFAULT NULL,
+    `log_config` varchar(255) NULL DEFAULT NULL,
+    `max_instance_num` int(0) NULL DEFAULT NULL,
+    `max_worker_count` int(0) NULL DEFAULT NULL,
+    `min_cpu_cores` double NOT NULL,
+    `min_disk_space` double NOT NULL,
+    `min_memory_space` double NOT NULL,
+    `next_trigger_time` bigint(0) NULL DEFAULT NULL,
+    `notify_user_ids` varchar(255) NULL DEFAULT NULL,
+    `processor_info` varchar(255) NULL DEFAULT NULL,
+    `processor_type` int(0) NULL DEFAULT NULL,
+    `status` int(0) NULL DEFAULT NULL,
+    `tag` varchar(255) NULL DEFAULT NULL,
+    `task_retry_num` int(0) NULL DEFAULT NULL,
+    `time_expression` varchar(255) NULL DEFAULT NULL,
+    `time_expression_type` int(0) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx01_job_info`(`app_id`, `status`, `time_expression_type`, `next_trigger_time`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 5 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of pj_job_info
+-- ----------------------------
+INSERT INTO `pj_job_info` VALUES (1, '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', 1, 5, '', 2, 1, NULL, '2023-06-02 15:01:27.717000', '2023-07-04 17:22:12.374000', 1, 0, '', '单机处理器执行测试', NULL, '{}', '{\"type\":1}', 0, 0, 0, 0, 0, NULL, NULL, 'org.dromara.job.processors.StandaloneProcessorDemo', 1, 2, NULL, 1, '30000', 3);
+INSERT INTO `pj_job_info` VALUES (2, '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', 1, 5, '', 1, 2, NULL, '2023-06-02 15:04:45.342000', '2023-07-04 17:22:12.816000', 0, 0, NULL, '广播处理器测试', NULL, '{}', '{\"type\":1}', 0, 0, 0, 0, 0, NULL, NULL, 'org.dromara.job.processors.BroadcastProcessorDemo', 1, 2, NULL, 1, '30000', 3);
+INSERT INTO `pj_job_info` VALUES (3, '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', 1, 5, '', 1, 4, NULL, '2023-06-02 15:13:23.519000', '2023-06-02 16:03:22.421000', 0, 0, NULL, 'Map处理器测试', NULL, '{}', '{\"type\":1}', 0, 0, 0, 0, 0, NULL, NULL, 'org.dromara.job.processors.MapProcessorDemo', 1, 2, NULL, 1, '1000', 3);
+INSERT INTO `pj_job_info` VALUES (4, '{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', 1, 5, '', 1, 3, NULL, '2023-06-02 15:45:25.896000', '2023-06-02 16:03:23.125000', 0, 0, NULL, 'MapReduce处理器测试', NULL, '{}', '{\"type\":1}', 0, 0, 0, 0, 0, NULL, NULL, 'org.dromara.job.processors.MapReduceProcessorDemo', 1, 2, NULL, 1, '1000', 3);
+
+-- ----------------------------
+-- Table structure for pj_oms_lock
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_oms_lock`;
+CREATE TABLE `pj_oms_lock`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `lock_name` varchar(255) NULL DEFAULT NULL,
+    `max_lock_time` bigint(0) NULL DEFAULT NULL,
+    `ownerip` varchar(255) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `uidx01_oms_lock`(`lock_name`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for pj_server_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_server_info`;
+CREATE TABLE `pj_server_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `ip` varchar(255) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `uidx01_server_info`(`ip`) USING BTREE,
+    INDEX `idx01_server_info`(`gmt_modified`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for pj_user_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_user_info`;
+CREATE TABLE `pj_user_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `email` varchar(255) NULL DEFAULT NULL,
+    `extra` varchar(255) NULL DEFAULT NULL,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `password` varchar(255) NULL DEFAULT NULL,
+    `phone` varchar(255) NULL DEFAULT NULL,
+    `username` varchar(255) NULL DEFAULT NULL,
+    `web_hook` varchar(255) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `uidx01_user_info`(`username`) USING BTREE,
+    INDEX `uidx02_user_info`(`email`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for pj_workflow_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_workflow_info`;
+CREATE TABLE `pj_workflow_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `app_id` bigint(0) NULL DEFAULT NULL,
+    `extra` varchar(255) NULL DEFAULT NULL,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `lifecycle` varchar(255) NULL DEFAULT NULL,
+    `max_wf_instance_num` int(0) NULL DEFAULT NULL,
+    `next_trigger_time` bigint(0) NULL DEFAULT NULL,
+    `notify_user_ids` varchar(255) NULL DEFAULT NULL,
+    `pedag` longtext NULL,
+    `status` int(0) NULL DEFAULT NULL,
+    `time_expression` varchar(255) NULL DEFAULT NULL,
+    `time_expression_type` int(0) NULL DEFAULT NULL,
+    `wf_description` varchar(255) NULL DEFAULT NULL,
+    `wf_name` varchar(255) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx01_workflow_info`(`app_id`, `status`, `time_expression_type`, `next_trigger_time`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for pj_workflow_instance_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_workflow_instance_info`;
+CREATE TABLE `pj_workflow_instance_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `actual_trigger_time` bigint(0) NULL DEFAULT NULL,
+    `app_id` bigint(0) NULL DEFAULT NULL,
+    `dag` longtext NULL,
+    `expected_trigger_time` bigint(0) NULL DEFAULT NULL,
+    `finished_time` bigint(0) NULL DEFAULT NULL,
+    `gmt_create` datetime(6) NULL DEFAULT NULL,
+    `gmt_modified` datetime(6) NULL DEFAULT NULL,
+    `parent_wf_instance_id` bigint(0) NULL DEFAULT NULL,
+    `result` longtext NULL,
+    `status` int(0) NULL DEFAULT NULL,
+    `wf_context` longtext NULL,
+    `wf_init_params` longtext NULL,
+    `wf_instance_id` bigint(0) NULL DEFAULT NULL,
+    `workflow_id` bigint(0) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `uidx01_wf_instance`(`wf_instance_id`) USING BTREE,
+    INDEX `idx01_wf_instance`(`workflow_id`, `status`, `app_id`, `expected_trigger_time`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for pj_workflow_node_info
+-- ----------------------------
+DROP TABLE IF EXISTS `pj_workflow_node_info`;
+CREATE TABLE `pj_workflow_node_info`  (
+    `id` bigint(0) NOT NULL AUTO_INCREMENT,
+    `app_id` bigint(0) NOT NULL,
+    `enable` bit(1) NOT NULL,
+    `extra` longtext NULL,
+    `gmt_create` datetime(6) NULL,
+    `gmt_modified` datetime(6) NULL,
+    `job_id` bigint(0) NULL DEFAULT NULL,
+    `node_name` varchar(255) NULL DEFAULT NULL,
+    `node_params` longtext NULL,
+    `skip_when_failed` bit(1) NOT NULL,
+    `type` int(0) NULL DEFAULT NULL,
+    `workflow_id` bigint(0) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx01_workflow_node_info`(`workflow_id`, `gmt_create`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 ROW_FORMAT = Dynamic;

+ 882 - 0
script/sql/ry_vue_5.X.sql

@@ -0,0 +1,882 @@
+-- ----------------------------
+-- 第三方平台授权表
+-- ----------------------------
+drop table if exists sys_social;
+create table sys_social
+(
+    id                 bigint           not null        comment '主键',
+    user_id            bigint           not null        comment '用户ID',
+    tenant_id          varchar(20)      default null    comment '租户id',
+    auth_id            varchar(255)     not null        comment '平台+平台唯一id',
+    source             varchar(255)     not null        comment '用户来源',
+    open_id            varchar(255)     default null    comment '平台编号唯一id',
+    user_name          varchar(30)      not null        comment '登录账号',
+    nick_name          varchar(30)      default ''      comment '用户昵称',
+    email              varchar(255)     default ''      comment '用户邮箱',
+    avatar             varchar(500)     default ''      comment '头像地址',
+    access_token       varchar(255)     not null        comment '用户的授权令牌',
+    expire_in          int              default null    comment '用户的授权令牌的有效期,部分平台可能没有',
+    refresh_token      varchar(255)     default null    comment '刷新令牌,部分平台可能没有',
+    access_code        varchar(255)     default null    comment '平台的授权信息,部分平台可能没有',
+    union_id           varchar(255)     default null    comment '用户的 unionid',
+    scope              varchar(255)     default null    comment '授予的权限,部分平台可能没有',
+    token_type         varchar(255)     default null    comment '个别平台的授权信息,部分平台可能没有',
+    id_token           varchar(255)     default null    comment 'id token,部分平台可能没有',
+    mac_algorithm      varchar(255)     default null    comment '小米平台用户的附带属性,部分平台可能没有',
+    mac_key            varchar(255)     default null    comment '小米平台用户的附带属性,部分平台可能没有',
+    code               varchar(255)     default null    comment '用户的授权code,部分平台可能没有',
+    oauth_token        varchar(255)     default null    comment 'Twitter平台用户的附带属性,部分平台可能没有',
+    oauth_token_secret varchar(255)     default null    comment 'Twitter平台用户的附带属性,部分平台可能没有',
+    create_dept        bigint(20)                       comment '创建部门',
+    create_by          bigint(20)                       comment '创建者',
+    create_time        datetime                         comment '创建时间',
+    update_by          bigint(20)                       comment '更新者',
+    update_time        datetime                         comment '更新时间',
+    del_flag           char(1)          default '0'     comment '删除标志(0代表存在 2代表删除)',
+    PRIMARY KEY (id)
+) engine=innodb comment = '社会化关系表';
+
+
+-- ----------------------------
+-- 租户表
+-- ----------------------------
+drop table if exists sys_tenant;
+create table sys_tenant
+(
+    id                bigint(20)    not null        comment 'id',
+    tenant_id         varchar(20)   not null        comment '租户编号',
+    contact_user_name varchar(20)                   comment '联系人',
+    contact_phone     varchar(20)                   comment '联系电话',
+    company_name      varchar(50)                   comment '企业名称',
+    license_number    varchar(30)                   comment '统一社会信用代码',
+    address           varchar(200)                  comment '地址',
+    intro             varchar(200)                  comment '企业简介',
+    domain            varchar(200)                  comment '域名',
+    remark            varchar(200)                  comment '备注',
+    package_id        bigint(20)                    comment '租户套餐编号',
+    expire_time       datetime                      comment '过期时间',
+    account_count     int           default -1      comment '用户数量(-1不限制)',
+    status            char(1)       default '0'     comment '租户状态(0正常 1停用)',
+    del_flag          char(1)       default '0'     comment '删除标志(0代表存在 2代表删除)',
+    create_dept       bigint(20)                    comment '创建部门',
+    create_by         bigint(20)                    comment '创建者',
+    create_time       datetime                      comment '创建时间',
+    update_by         bigint(20)                    comment '更新者',
+    update_time       datetime                      comment '更新时间',
+    primary key (id)
+) engine=innodb comment = '租户表';
+
+
+-- ----------------------------
+-- 初始化-租户表数据
+-- ----------------------------
+
+insert into sys_tenant values(1, '000000', '管理组', '15888888888', 'XXX有限公司', null, null, '多租户通用后台管理管理系统', null, null, null, null, -1, '0', '0', 103, 1, sysdate(), null, null);
+
+
+-- ----------------------------
+-- 租户套餐表
+-- ----------------------------
+drop table if exists sys_tenant_package;
+create table sys_tenant_package (
+    package_id              bigint(20)     not null    comment '租户套餐id',
+    package_name            varchar(20)                comment '套餐名称',
+    menu_ids                varchar(3000)              comment '关联菜单id',
+    remark                  varchar(200)               comment '备注',
+    menu_check_strictly     tinyint(1)     default 1   comment '菜单树选择项是否关联显示',
+    status                  char(1)        default '0' comment '状态(0正常 1停用)',
+    del_flag                char(1)        default '0' comment '删除标志(0代表存在 2代表删除)',
+    create_dept             bigint(20)                 comment '创建部门',
+    create_by               bigint(20)                 comment '创建者',
+    create_time             datetime                   comment '创建时间',
+    update_by               bigint(20)                 comment '更新者',
+    update_time             datetime                   comment '更新时间',
+    primary key (package_id)
+) engine=innodb comment = '租户套餐表';
+
+
+-- ----------------------------
+-- 1、部门表
+-- ----------------------------
+drop table if exists sys_dept;
+create table sys_dept (
+    dept_id           bigint(20)      not null                   comment '部门id',
+    tenant_id         varchar(20)     default '000000'           comment '租户编号',
+    parent_id         bigint(20)      default 0                  comment '父部门id',
+    ancestors         varchar(500)    default ''                 comment '祖级列表',
+    dept_name         varchar(30)     default ''                 comment '部门名称',
+    order_num         int(4)          default 0                  comment '显示顺序',
+    leader            bigint(20)      default null               comment '负责人',
+    phone             varchar(11)     default null               comment '联系电话',
+    email             varchar(50)     default null               comment '邮箱',
+    status            char(1)         default '0'                comment '部门状态(0正常 1停用)',
+    del_flag          char(1)         default '0'                comment '删除标志(0代表存在 2代表删除)',
+    create_dept       bigint(20)      default null               comment '创建部门',
+    create_by         bigint(20)      default null               comment '创建者',
+    create_time       datetime                                   comment '创建时间',
+    update_by         bigint(20)      default null               comment '更新者',
+    update_time       datetime                                   comment '更新时间',
+    primary key (dept_id)
+) engine=innodb comment = '部门表';
+
+-- ----------------------------
+-- 初始化-部门表数据
+-- ----------------------------
+
+
+insert into sys_dept values(100, '000000', 0,   '0',          'XXX科技',   0, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(101, '000000', 100, '0,100',      '深圳总公司', 1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(102, '000000', 100, '0,100',      '长沙分公司', 2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(103, '000000', 101, '0,100,101',  '研发部门',   1, 1, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(104, '000000', 101, '0,100,101',  '市场部门',   2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(105, '000000', 101, '0,100,101',  '测试部门',   3, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(106, '000000', 101, '0,100,101',  '财务部门',   4, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(107, '000000', 101, '0,100,101',  '运维部门',   5, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(108, '000000', 102, '0,100,102',  '市场部门',   1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept values(109, '000000', 102, '0,100,102',  '财务部门',   2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+
+
+-- ----------------------------
+-- 2、用户信息表
+-- ----------------------------
+drop table if exists sys_user;
+create table sys_user (
+    user_id           bigint(20)      not null                   comment '用户ID',
+    tenant_id         varchar(20)     default '000000'           comment '租户编号',
+    dept_id           bigint(20)      default null               comment '部门ID',
+    user_name         varchar(30)     not null                   comment '用户账号',
+    nick_name         varchar(30)     not null                   comment '用户昵称',
+    user_type         varchar(10)     default 'sys_user'         comment '用户类型(sys_user系统用户)',
+    email             varchar(50)     default ''                 comment '用户邮箱',
+    phonenumber       varchar(11)     default ''                 comment '手机号码',
+    sex               char(1)         default '0'                comment '用户性别(0男 1女 2未知)',
+    avatar            bigint(20)                                 comment '头像地址',
+    password          varchar(100)    default ''                 comment '密码',
+    status            char(1)         default '0'                comment '帐号状态(0正常 1停用)',
+    del_flag          char(1)         default '0'                comment '删除标志(0代表存在 2代表删除)',
+    login_ip          varchar(128)    default ''                 comment '最后登录IP',
+    login_date        datetime                                   comment '最后登录时间',
+    create_dept       bigint(20)      default null               comment '创建部门',
+    create_by         bigint(20)      default null               comment '创建者',
+    create_time       datetime                                   comment '创建时间',
+    update_by         bigint(20)      default null               comment '更新者',
+    update_time       datetime                                   comment '更新时间',
+    remark            varchar(500)    default null               comment '备注',
+    primary key (user_id)
+) engine=innodb comment = '用户信息表';
+
+-- ----------------------------
+-- 初始化-用户信息表数据
+-- ----------------------------
+insert into sys_user values(1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '管理员');
+insert into sys_user values(2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@qq.com',  '15666666666', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '测试员');
+
+
+-- ----------------------------
+-- 3、岗位信息表
+-- ----------------------------
+drop table if exists sys_post;
+create table sys_post
+(
+    post_id       bigint(20)      not null                   comment '岗位ID',
+    tenant_id     varchar(20)     default '000000'           comment '租户编号',
+    post_code     varchar(64)     not null                   comment '岗位编码',
+    post_name     varchar(50)     not null                   comment '岗位名称',
+    post_sort     int(4)          not null                   comment '显示顺序',
+    status        char(1)         not null                   comment '状态(0正常 1停用)',
+    create_dept   bigint(20)      default null               comment '创建部门',
+    create_by     bigint(20)      default null               comment '创建者',
+    create_time   datetime                                   comment '创建时间',
+    update_by     bigint(20)      default null               comment '更新者',
+    update_time   datetime                                   comment '更新时间',
+    remark        varchar(500)    default null               comment '备注',
+    primary key (post_id)
+) engine=innodb comment = '岗位信息表';
+
+-- ----------------------------
+-- 初始化-岗位信息表数据
+-- ----------------------------
+insert into sys_post values(1, '000000', 'ceo',  '董事长',    1, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post values(2, '000000', 'se',   '项目经理',  2, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post values(3, '000000', 'hr',   '人力资源',  3, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post values(4, '000000', 'user', '普通员工',  4, '0', 103, 1, sysdate(), null, null, '');
+
+
+-- ----------------------------
+-- 4、角色信息表
+-- ----------------------------
+drop table if exists sys_role;
+create table sys_role (
+    role_id              bigint(20)      not null                   comment '角色ID',
+    tenant_id            varchar(20)     default '000000'           comment '租户编号',
+    role_name            varchar(30)     not null                   comment '角色名称',
+    role_key             varchar(100)    not null                   comment '角色权限字符串',
+    role_sort            int(4)          not null                   comment '显示顺序',
+    data_scope           char(1)         default '1'                comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
+    menu_check_strictly  tinyint(1)      default 1                  comment '菜单树选择项是否关联显示',
+    dept_check_strictly  tinyint(1)      default 1                  comment '部门树选择项是否关联显示',
+    status               char(1)         not null                   comment '角色状态(0正常 1停用)',
+    del_flag             char(1)         default '0'                comment '删除标志(0代表存在 2代表删除)',
+    create_dept          bigint(20)      default null               comment '创建部门',
+    create_by            bigint(20)      default null               comment '创建者',
+    create_time          datetime                                   comment '创建时间',
+    update_by            bigint(20)      default null               comment '更新者',
+    update_time          datetime                                   comment '更新时间',
+    remark               varchar(500)    default null               comment '备注',
+    primary key (role_id)
+) engine=innodb comment = '角色信息表';
+
+-- ----------------------------
+-- 初始化-角色信息表数据
+-- ----------------------------
+insert into sys_role values(1, '000000', '超级管理员',  'superadmin',  1, 1, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '超级管理员');
+insert into sys_role values(2, '000000', '普通角色',    'common', 2, 2, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '普通角色');
+
+
+-- ----------------------------
+-- 5、菜单权限表
+-- ----------------------------
+drop table if exists sys_menu;
+create table sys_menu (
+    menu_id           bigint(20)      not null                   comment '菜单ID',
+    menu_name         varchar(50)     not null                   comment '菜单名称',
+    parent_id         bigint(20)      default 0                  comment '父菜单ID',
+    order_num         int(4)          default 0                  comment '显示顺序',
+    path              varchar(200)    default ''                 comment '路由地址',
+    component         varchar(255)    default null               comment '组件路径',
+    query_param       varchar(255)    default null               comment '路由参数',
+    is_frame          int(1)          default 1                  comment '是否为外链(0是 1否)',
+    is_cache          int(1)          default 0                  comment '是否缓存(0缓存 1不缓存)',
+    menu_type         char(1)         default ''                 comment '菜单类型(M目录 C菜单 F按钮)',
+    visible           char(1)         default 0                  comment '显示状态(0显示 1隐藏)',
+    status            char(1)         default 0                  comment '菜单状态(0正常 1停用)',
+    perms             varchar(100)    default null               comment '权限标识',
+    icon              varchar(100)    default '#'                comment '菜单图标',
+    create_dept       bigint(20)      default null               comment '创建部门',
+    create_by         bigint(20)      default null               comment '创建者',
+    create_time       datetime                                   comment '创建时间',
+    update_by         bigint(20)      default null               comment '更新者',
+    update_time       datetime                                   comment '更新时间',
+    remark            varchar(500)    default ''                 comment '备注',
+    primary key (menu_id)
+) engine=innodb comment = '菜单权限表';
+
+-- ----------------------------
+-- 初始化-菜单信息表数据
+-- ----------------------------
+-- 一级菜单
+insert into sys_menu values('1', '系统管理', '0', '1', 'system',           null, '', 1, 0, 'M', '0', '0', '', 'system',   103, 1, sysdate(), null, null, '系统管理目录');
+insert into sys_menu values('6', '租户管理', '0', '2', 'tenant',           null, '', 1, 0, 'M', '0', '0', '', 'chart',    103, 1, sysdate(), null, null, '租户管理目录');
+insert into sys_menu values('2', '系统监控', '0', '3', 'monitor',          null, '', 1, 0, 'M', '0', '0', '', 'monitor',  103, 1, sysdate(), null, null, '系统监控目录');
+insert into sys_menu values('3', '系统工具', '0', '4', 'tool',             null, '', 1, 0, 'M', '0', '0', '', 'tool',     103, 1, sysdate(), null, null, '系统工具目录');
+insert into sys_menu values('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide',    103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址');
+-- 二级菜单
+insert into sys_menu values('100',  '用户管理',     '1',   '1', 'user',             'system/user/index',            '', 1, 0, 'C', '0', '0', 'system:user:list',            'user',          103, 1, sysdate(), null, null, '用户管理菜单');
+insert into sys_menu values('101',  '角色管理',     '1',   '2', 'role',             'system/role/index',            '', 1, 0, 'C', '0', '0', 'system:role:list',            'peoples',       103, 1, sysdate(), null, null, '角色管理菜单');
+insert into sys_menu values('102',  '菜单管理',     '1',   '3', 'menu',             'system/menu/index',            '', 1, 0, 'C', '0', '0', 'system:menu:list',            'tree-table',    103, 1, sysdate(), null, null, '菜单管理菜单');
+insert into sys_menu values('103',  '部门管理',     '1',   '4', 'dept',             'system/dept/index',            '', 1, 0, 'C', '0', '0', 'system:dept:list',            'tree',          103, 1, sysdate(), null, null, '部门管理菜单');
+insert into sys_menu values('104',  '岗位管理',     '1',   '5', 'post',             'system/post/index',            '', 1, 0, 'C', '0', '0', 'system:post:list',            'post',          103, 1, sysdate(), null, null, '岗位管理菜单');
+insert into sys_menu values('105',  '字典管理',     '1',   '6', 'dict',             'system/dict/index',            '', 1, 0, 'C', '0', '0', 'system:dict:list',            'dict',          103, 1, sysdate(), null, null, '字典管理菜单');
+insert into sys_menu values('106',  '参数设置',     '1',   '7', 'config',           'system/config/index',          '', 1, 0, 'C', '0', '0', 'system:config:list',          'edit',          103, 1, sysdate(), null, null, '参数设置菜单');
+insert into sys_menu values('107',  '通知公告',     '1',   '8', 'notice',           'system/notice/index',          '', 1, 0, 'C', '0', '0', 'system:notice:list',          'message',       103, 1, sysdate(), null, null, '通知公告菜单');
+insert into sys_menu values('108',  '日志管理',     '1',   '9', 'log',              '',                             '', 1, 0, 'M', '0', '0', '',                            'log',           103, 1, sysdate(), null, null, '日志管理菜单');
+insert into sys_menu values('109',  '在线用户',     '2',   '1', 'online',           'monitor/online/index',         '', 1, 0, 'C', '0', '0', 'monitor:online:list',         'online',        103, 1, sysdate(), null, null, '在线用户菜单');
+insert into sys_menu values('113',  '缓存监控',     '2',   '5', 'cache',            'monitor/cache/index',          '', 1, 0, 'C', '0', '0', 'monitor:cache:list',          'redis',         103, 1, sysdate(), null, null, '缓存监控菜单');
+insert into sys_menu values('114',  '表单构建',     '3',   '1', 'build',            'tool/build/index',             '', 1, 0, 'C', '0', '0', 'tool:build:list',             'build',         103, 1, sysdate(), null, null, '表单构建菜单');
+insert into sys_menu values('115',  '代码生成',     '3',   '2', 'gen',              'tool/gen/index',               '', 1, 0, 'C', '0', '0', 'tool:gen:list',               'code',          103, 1, sysdate(), null, null, '代码生成菜单');
+insert into sys_menu values('121',  '租户管理',     '6',   '1', 'tenant',           'system/tenant/index',          '', 1, 0, 'C', '0', '0', 'system:tenant:list',          'list',          103, 1, sysdate(), null, null, '租户管理菜单');
+insert into sys_menu values('122',  '租户套餐管理', '6',   '2', 'tenantPackage',    'system/tenantPackage/index',   '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list',   'form',          103, 1, sysdate(), null, null, '租户套餐管理菜单');
+insert into sys_menu values('123',  '客户端管理',   '1',   '11', 'client',           'system/client/index',          '', 1, 0, 'C', '0', '0', 'system:client:list',          'international', 103, 1, sysdate(), null, null, '客户端管理菜单');
+
+-- springboot-admin监控
+insert into sys_menu values('117',  'Admin监控',   '2',   '5',  'Admin',            'monitor/admin/index',         '', 1, 0, 'C', '0', '0', 'monitor:admin:list',           'dashboard',     103, 1, sysdate(), null, null, 'Admin监控菜单');
+-- oss菜单
+insert into sys_menu values('118',  '文件管理',     '1',   '10', 'oss',              'system/oss/index',            '', 1, 0, 'C', '0', '0', 'system:oss:list',              'upload',        103, 1, sysdate(), null, null, '文件管理菜单');
+-- powerjob server控制台
+insert into sys_menu values('120',  '任务调度中心',  '2',   '5',  'powerjob',           'monitor/powerjob/index',        '', 1, 0, 'C', '0', '0', 'monitor:powerjob:list',          'job',           103, 1, sysdate(), null, null, 'PowerJob控制台菜单');
+
+-- 三级菜单
+insert into sys_menu values('500',  '操作日志', '108', '1', 'operlog',    'monitor/operlog/index',    '', 1, 0, 'C', '0', '0', 'monitor:operlog:list',    'form',          103, 1, sysdate(), null, null, '操作日志菜单');
+insert into sys_menu values('501',  '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor',    103, 1, sysdate(), null, null, '登录日志菜单');
+-- 用户管理按钮
+insert into sys_menu values('1001', '用户查询', '100', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:query',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1002', '用户新增', '100', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:add',            '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1003', '用户修改', '100', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit',           '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1004', '用户删除', '100', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1005', '用户导出', '100', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:export',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1006', '用户导入', '100', '6',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:import',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1007', '重置密码', '100', '7',  '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd',       '#', 103, 1, sysdate(), null, null, '');
+-- 角色管理按钮
+insert into sys_menu values('1008', '角色查询', '101', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:query',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1009', '角色新增', '101', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:add',            '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1010', '角色修改', '101', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit',           '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1011', '角色删除', '101', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1012', '角色导出', '101', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:role:export',         '#', 103, 1, sysdate(), null, null, '');
+-- 菜单管理按钮
+insert into sys_menu values('1013', '菜单查询', '102', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1014', '菜单新增', '102', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add',            '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1015', '菜单修改', '102', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit',           '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1016', '菜单删除', '102', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove',         '#', 103, 1, sysdate(), null, null, '');
+-- 部门管理按钮
+insert into sys_menu values('1017', '部门查询', '103', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1018', '部门新增', '103', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add',            '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1019', '部门修改', '103', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit',           '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1020', '部门删除', '103', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove',         '#', 103, 1, sysdate(), null, null, '');
+-- 岗位管理按钮
+insert into sys_menu values('1021', '岗位查询', '104', '1',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:query',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1022', '岗位新增', '104', '2',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:add',            '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1023', '岗位修改', '104', '3',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit',           '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1024', '岗位删除', '104', '4',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1025', '岗位导出', '104', '5',  '', '', '', 1, 0, 'F', '0', '0', 'system:post:export',         '#', 103, 1, sysdate(), null, null, '');
+-- 字典管理按钮
+insert into sys_menu values('1026', '字典查询', '105', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1027', '字典新增', '105', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add',            '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1028', '字典修改', '105', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit',           '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1029', '字典删除', '105', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1030', '字典导出', '105', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export',         '#', 103, 1, sysdate(), null, null, '');
+-- 参数设置按钮
+insert into sys_menu values('1031', '参数查询', '106', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query',        '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1032', '参数新增', '106', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1033', '参数修改', '106', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1034', '参数删除', '106', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove',       '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1035', '参数导出', '106', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export',       '#', 103, 1, sysdate(), null, null, '');
+-- 通知公告按钮
+insert into sys_menu values('1036', '公告查询', '107', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query',        '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1037', '公告新增', '107', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1038', '公告修改', '107', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1039', '公告删除', '107', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove',       '#', 103, 1, sysdate(), null, null, '');
+-- 操作日志按钮
+insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query',      '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove',     '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export',     '#', 103, 1, sysdate(), null, null, '');
+-- 登录日志按钮
+insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query',   '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove',  '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export',  '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock',  '#', 103, 1, sysdate(), null, null, '');
+-- 在线用户按钮
+insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query',       '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1, sysdate(), null, null, '');
+-- 代码生成按钮
+insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query',             '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit',              '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove',            '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import',            '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview',           '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code',              '#', 103, 1, sysdate(), null, null, '');
+-- oss相关按钮
+insert into sys_menu values('1600', '文件查询', '118', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query',        '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1601', '文件上传', '118', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload',       '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1602', '文件下载', '118', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download',     '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1603', '文件删除', '118', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove',       '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1604', '配置添加', '118', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:add',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1605', '配置编辑', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:edit',         '#', 103, 1, sysdate(), null, null, '');
+-- 租户管理相关按钮
+insert into sys_menu values ('1606', '租户查询', '121', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query',   '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values ('1607', '租户新增', '121', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add',     '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values ('1608', '租户修改', '121', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit',    '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values ('1609', '租户删除', '121', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove',  '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values ('1610', '租户导出', '121', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export',  '#', 103, 1, sysdate(), null, null, '');
+-- 租户套餐管理相关按钮
+insert into sys_menu values ('1611', '租户套餐查询', '122', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query',   '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values ('1612', '租户套餐新增', '122', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add',     '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values ('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit',    '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values ('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove',  '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values ('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export',  '#', 103, 1, sysdate(), null, null, '');
+-- 客户端管理按钮
+insert into sys_menu values('1061', '客户端管理查询', '123', '1',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query',        '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1062', '客户端管理新增', '123', '2',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1063', '客户端管理修改', '123', '3',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1064', '客户端管理删除', '123', '4',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove',       '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1065', '客户端管理导出', '123', '5',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export',       '#', 103, 1, sysdate(), null, null, '');
+
+-- ----------------------------
+-- 6、用户和角色关联表  用户N-1角色
+-- ----------------------------
+drop table if exists sys_user_role;
+create table sys_user_role (
+    user_id   bigint(20) not null comment '用户ID',
+    role_id   bigint(20) not null comment '角色ID',
+    primary key(user_id, role_id)
+) engine=innodb comment = '用户和角色关联表';
+
+-- ----------------------------
+-- 初始化-用户和角色关联表数据
+-- ----------------------------
+insert into sys_user_role values ('1', '1');
+insert into sys_user_role values ('2', '2');
+
+
+-- ----------------------------
+-- 7、角色和菜单关联表  角色1-N菜单
+-- ----------------------------
+drop table if exists sys_role_menu;
+create table sys_role_menu (
+    role_id   bigint(20) not null comment '角色ID',
+    menu_id   bigint(20) not null comment '菜单ID',
+    primary key(role_id, menu_id)
+) engine=innodb comment = '角色和菜单关联表';
+
+-- ----------------------------
+-- 初始化-角色和菜单关联表数据
+-- ----------------------------
+insert into sys_role_menu values ('2', '1');
+insert into sys_role_menu values ('2', '2');
+insert into sys_role_menu values ('2', '3');
+insert into sys_role_menu values ('2', '4');
+insert into sys_role_menu values ('2', '100');
+insert into sys_role_menu values ('2', '101');
+insert into sys_role_menu values ('2', '102');
+insert into sys_role_menu values ('2', '103');
+insert into sys_role_menu values ('2', '104');
+insert into sys_role_menu values ('2', '105');
+insert into sys_role_menu values ('2', '106');
+insert into sys_role_menu values ('2', '107');
+insert into sys_role_menu values ('2', '108');
+insert into sys_role_menu values ('2', '109');
+insert into sys_role_menu values ('2', '110');
+insert into sys_role_menu values ('2', '111');
+insert into sys_role_menu values ('2', '112');
+insert into sys_role_menu values ('2', '113');
+insert into sys_role_menu values ('2', '114');
+insert into sys_role_menu values ('2', '115');
+insert into sys_role_menu values ('2', '116');
+insert into sys_role_menu values ('2', '500');
+insert into sys_role_menu values ('2', '501');
+insert into sys_role_menu values ('2', '1000');
+insert into sys_role_menu values ('2', '1001');
+insert into sys_role_menu values ('2', '1002');
+insert into sys_role_menu values ('2', '1003');
+insert into sys_role_menu values ('2', '1004');
+insert into sys_role_menu values ('2', '1005');
+insert into sys_role_menu values ('2', '1006');
+insert into sys_role_menu values ('2', '1007');
+insert into sys_role_menu values ('2', '1008');
+insert into sys_role_menu values ('2', '1009');
+insert into sys_role_menu values ('2', '1010');
+insert into sys_role_menu values ('2', '1011');
+insert into sys_role_menu values ('2', '1012');
+insert into sys_role_menu values ('2', '1013');
+insert into sys_role_menu values ('2', '1014');
+insert into sys_role_menu values ('2', '1015');
+insert into sys_role_menu values ('2', '1016');
+insert into sys_role_menu values ('2', '1017');
+insert into sys_role_menu values ('2', '1018');
+insert into sys_role_menu values ('2', '1019');
+insert into sys_role_menu values ('2', '1020');
+insert into sys_role_menu values ('2', '1021');
+insert into sys_role_menu values ('2', '1022');
+insert into sys_role_menu values ('2', '1023');
+insert into sys_role_menu values ('2', '1024');
+insert into sys_role_menu values ('2', '1025');
+insert into sys_role_menu values ('2', '1026');
+insert into sys_role_menu values ('2', '1027');
+insert into sys_role_menu values ('2', '1028');
+insert into sys_role_menu values ('2', '1029');
+insert into sys_role_menu values ('2', '1030');
+insert into sys_role_menu values ('2', '1031');
+insert into sys_role_menu values ('2', '1032');
+insert into sys_role_menu values ('2', '1033');
+insert into sys_role_menu values ('2', '1034');
+insert into sys_role_menu values ('2', '1035');
+insert into sys_role_menu values ('2', '1036');
+insert into sys_role_menu values ('2', '1037');
+insert into sys_role_menu values ('2', '1038');
+insert into sys_role_menu values ('2', '1039');
+insert into sys_role_menu values ('2', '1040');
+insert into sys_role_menu values ('2', '1041');
+insert into sys_role_menu values ('2', '1042');
+insert into sys_role_menu values ('2', '1043');
+insert into sys_role_menu values ('2', '1044');
+insert into sys_role_menu values ('2', '1045');
+insert into sys_role_menu values ('2', '1050');
+insert into sys_role_menu values ('2', '1046');
+insert into sys_role_menu values ('2', '1047');
+insert into sys_role_menu values ('2', '1048');
+insert into sys_role_menu values ('2', '1055');
+insert into sys_role_menu values ('2', '1056');
+insert into sys_role_menu values ('2', '1057');
+insert into sys_role_menu values ('2', '1058');
+insert into sys_role_menu values ('2', '1059');
+insert into sys_role_menu values ('2', '1060');
+insert into sys_role_menu values ('2', '1061');
+insert into sys_role_menu values ('2', '1062');
+insert into sys_role_menu values ('2', '1063');
+insert into sys_role_menu values ('2', '1064');
+insert into sys_role_menu values ('2', '1065');
+
+-- ----------------------------
+-- 8、角色和部门关联表  角色1-N部门
+-- ----------------------------
+drop table if exists sys_role_dept;
+create table sys_role_dept (
+    role_id   bigint(20) not null comment '角色ID',
+    dept_id   bigint(20) not null comment '部门ID',
+    primary key(role_id, dept_id)
+) engine=innodb comment = '角色和部门关联表';
+
+-- ----------------------------
+-- 初始化-角色和部门关联表数据
+-- ----------------------------
+insert into sys_role_dept values ('2', '100');
+insert into sys_role_dept values ('2', '101');
+insert into sys_role_dept values ('2', '105');
+
+
+-- ----------------------------
+-- 9、用户与岗位关联表  用户1-N岗位
+-- ----------------------------
+drop table if exists sys_user_post;
+create table sys_user_post
+(
+    user_id   bigint(20) not null comment '用户ID',
+    post_id   bigint(20) not null comment '岗位ID',
+    primary key (user_id, post_id)
+) engine=innodb comment = '用户与岗位关联表';
+
+-- ----------------------------
+-- 初始化-用户与岗位关联表数据
+-- ----------------------------
+insert into sys_user_post values ('1', '1');
+insert into sys_user_post values ('2', '2');
+
+
+-- ----------------------------
+-- 10、操作日志记录
+-- ----------------------------
+drop table if exists sys_oper_log;
+create table sys_oper_log (
+    oper_id           bigint(20)      not null                   comment '日志主键',
+    tenant_id         varchar(20)     default '000000'           comment '租户编号',
+    title             varchar(50)     default ''                 comment '模块标题',
+    business_type     int(2)          default 0                  comment '业务类型(0其它 1新增 2修改 3删除)',
+    method            varchar(100)    default ''                 comment '方法名称',
+    request_method    varchar(10)     default ''                 comment '请求方式',
+    operator_type     int(1)          default 0                  comment '操作类别(0其它 1后台用户 2手机端用户)',
+    oper_name         varchar(50)     default ''                 comment '操作人员',
+    dept_name         varchar(50)     default ''                 comment '部门名称',
+    oper_url          varchar(255)    default ''                 comment '请求URL',
+    oper_ip           varchar(128)    default ''                 comment '主机地址',
+    oper_location     varchar(255)    default ''                 comment '操作地点',
+    oper_param        varchar(2000)   default ''                 comment '请求参数',
+    json_result       varchar(2000)   default ''                 comment '返回参数',
+    status            int(1)          default 0                  comment '操作状态(0正常 1异常)',
+    error_msg         varchar(2000)   default ''                 comment '错误消息',
+    oper_time         datetime                                   comment '操作时间',
+    cost_time         bigint(20)      default 0                  comment '消耗时间',
+    primary key (oper_id),
+    key idx_sys_oper_log_bt (business_type),
+    key idx_sys_oper_log_s  (status),
+    key idx_sys_oper_log_ot (oper_time)
+) engine=innodb comment = '操作日志记录';
+
+
+-- ----------------------------
+-- 11、字典类型表
+-- ----------------------------
+drop table if exists sys_dict_type;
+create table sys_dict_type
+(
+    dict_id          bigint(20)      not null                   comment '字典主键',
+    tenant_id        varchar(20)     default '000000'           comment '租户编号',
+    dict_name        varchar(100)    default ''                 comment '字典名称',
+    dict_type        varchar(100)    default ''                 comment '字典类型',
+    create_dept      bigint(20)      default null               comment '创建部门',
+    create_by        bigint(20)      default null               comment '创建者',
+    create_time      datetime                                   comment '创建时间',
+    update_by        bigint(20)      default null               comment '更新者',
+    update_time      datetime                                   comment '更新时间',
+    remark           varchar(500)    default null               comment '备注',
+    primary key (dict_id),
+    unique (tenant_id, dict_type)
+) engine=innodb comment = '字典类型表';
+
+insert into sys_dict_type values(1, '000000', '用户性别', 'sys_user_sex',        103, 1, sysdate(), null, null, '用户性别列表');
+insert into sys_dict_type values(2, '000000', '菜单状态', 'sys_show_hide',       103, 1, sysdate(), null, null, '菜单状态列表');
+insert into sys_dict_type values(3, '000000', '系统开关', 'sys_normal_disable',  103, 1, sysdate(), null, null, '系统开关列表');
+insert into sys_dict_type values(6, '000000', '系统是否', 'sys_yes_no',          103, 1, sysdate(), null, null, '系统是否列表');
+insert into sys_dict_type values(7, '000000', '通知类型', 'sys_notice_type',     103, 1, sysdate(), null, null, '通知类型列表');
+insert into sys_dict_type values(8, '000000', '通知状态', 'sys_notice_status',   103, 1, sysdate(), null, null, '通知状态列表');
+insert into sys_dict_type values(9, '000000', '操作类型', 'sys_oper_type',       103, 1, sysdate(), null, null, '操作类型列表');
+insert into sys_dict_type values(10, '000000', '系统状态', 'sys_common_status',  103, 1, sysdate(), null, null, '登录状态列表');
+insert into sys_dict_type values(11, '000000', '授权类型', 'sys_grant_type',     103, 1, sysdate(), null, null, '认证授权类型');
+insert into sys_dict_type values(12, '000000', '设备类型', 'sys_device_type',    103, 1, sysdate(), null, null, '客户端设备类型');
+
+
+-- ----------------------------
+-- 12、字典数据表
+-- ----------------------------
+drop table if exists sys_dict_data;
+create table sys_dict_data
+(
+    dict_code        bigint(20)      not null                   comment '字典编码',
+    tenant_id        varchar(20)     default '000000'           comment '租户编号',
+    dict_sort        int(4)          default 0                  comment '字典排序',
+    dict_label       varchar(100)    default ''                 comment '字典标签',
+    dict_value       varchar(100)    default ''                 comment '字典键值',
+    dict_type        varchar(100)    default ''                 comment '字典类型',
+    css_class        varchar(100)    default null               comment '样式属性(其他样式扩展)',
+    list_class       varchar(100)    default null               comment '表格回显样式',
+    is_default       char(1)         default 'N'                comment '是否默认(Y是 N否)',
+    create_dept      bigint(20)      default null               comment '创建部门',
+    create_by        bigint(20)      default null               comment '创建者',
+    create_time      datetime                                   comment '创建时间',
+    update_by        bigint(20)      default null               comment '更新者',
+    update_time      datetime                                   comment '更新时间',
+    remark           varchar(500)    default null               comment '备注',
+    primary key (dict_code)
+) engine=innodb comment = '字典数据表';
+
+insert into sys_dict_data values(1, '000000', 1,  '男',       '0',       'sys_user_sex',        '',   '',        'Y', 103, 1, sysdate(), null, null, '性别男');
+insert into sys_dict_data values(2, '000000', 2,  '女',       '1',       'sys_user_sex',        '',   '',        'N', 103, 1, sysdate(), null, null, '性别女');
+insert into sys_dict_data values(3, '000000', 3,  '未知',     '2',       'sys_user_sex',        '',   '',        'N', 103, 1, sysdate(), null, null, '性别未知');
+insert into sys_dict_data values(4, '000000', 1,  '显示',     '0',       'sys_show_hide',       '',   'primary', 'Y', 103, 1, sysdate(), null, null, '显示菜单');
+insert into sys_dict_data values(5, '000000', 2,  '隐藏',     '1',       'sys_show_hide',       '',   'danger',  'N', 103, 1, sysdate(), null, null, '隐藏菜单');
+insert into sys_dict_data values(6, '000000', 1,  '正常',     '0',       'sys_normal_disable',  '',   'primary', 'Y', 103, 1, sysdate(), null, null, '正常状态');
+insert into sys_dict_data values(7, '000000', 2,  '停用',     '1',       'sys_normal_disable',  '',   'danger',  'N', 103, 1, sysdate(), null, null, '停用状态');
+insert into sys_dict_data values(12, '000000', 1,  '是',       'Y',       'sys_yes_no',          '',   'primary', 'Y', 103, 1, sysdate(), null, null, '系统默认是');
+insert into sys_dict_data values(13, '000000', 2,  '否',       'N',       'sys_yes_no',          '',   'danger',  'N', 103, 1, sysdate(), null, null, '系统默认否');
+insert into sys_dict_data values(14, '000000', 1,  '通知',     '1',       'sys_notice_type',     '',   'warning', 'Y', 103, 1, sysdate(), null, null, '通知');
+insert into sys_dict_data values(15, '000000', 2,  '公告',     '2',       'sys_notice_type',     '',   'success', 'N', 103, 1, sysdate(), null, null, '公告');
+insert into sys_dict_data values(16, '000000', 1,  '正常',     '0',       'sys_notice_status',   '',   'primary', 'Y', 103, 1, sysdate(), null, null, '正常状态');
+insert into sys_dict_data values(17, '000000', 2,  '关闭',     '1',       'sys_notice_status',   '',   'danger',  'N', 103, 1, sysdate(), null, null, '关闭状态');
+insert into sys_dict_data values(29, '000000', 99, '其他',     '0',       'sys_oper_type',       '',   'info',    'N', 103, 1, sysdate(), null, null, '其他操作');
+insert into sys_dict_data values(18, '000000', 1,  '新增',     '1',       'sys_oper_type',       '',   'info',    'N', 103, 1, sysdate(), null, null, '新增操作');
+insert into sys_dict_data values(19, '000000', 2,  '修改',     '2',       'sys_oper_type',       '',   'info',    'N', 103, 1, sysdate(), null, null, '修改操作');
+insert into sys_dict_data values(20, '000000', 3,  '删除',     '3',       'sys_oper_type',       '',   'danger',  'N', 103, 1, sysdate(), null, null, '删除操作');
+insert into sys_dict_data values(21, '000000', 4,  '授权',     '4',       'sys_oper_type',       '',   'primary', 'N', 103, 1, sysdate(), null, null, '授权操作');
+insert into sys_dict_data values(22, '000000', 5,  '导出',     '5',       'sys_oper_type',       '',   'warning', 'N', 103, 1, sysdate(), null, null, '导出操作');
+insert into sys_dict_data values(23, '000000', 6,  '导入',     '6',       'sys_oper_type',       '',   'warning', 'N', 103, 1, sysdate(), null, null, '导入操作');
+insert into sys_dict_data values(24, '000000', 7,  '强退',     '7',       'sys_oper_type',       '',   'danger',  'N', 103, 1, sysdate(), null, null, '强退操作');
+insert into sys_dict_data values(25, '000000', 8,  '生成代码', '8',       'sys_oper_type',       '',   'warning', 'N', 103, 1, sysdate(), null, null, '生成操作');
+insert into sys_dict_data values(26, '000000', 9,  '清空数据', '9',       'sys_oper_type',       '',   'danger',  'N', 103, 1, sysdate(), null, null, '清空操作');
+insert into sys_dict_data values(27, '000000', 1,  '成功',     '0',       'sys_common_status',   '',   'primary', 'N', 103, 1, sysdate(), null, null, '正常状态');
+insert into sys_dict_data values(28, '000000', 2,  '失败',     '1',       'sys_common_status',   '',   'danger',  'N', 103, 1, sysdate(), null, null, '停用状态');
+insert into sys_dict_data values(30, '000000', 0,  '密码认证', 'password',   'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate(), null, null, '密码认证');
+insert into sys_dict_data values(31, '000000', 0,  '短信认证', 'sms',        'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate(), null, null, '短信认证');
+insert into sys_dict_data values(32, '000000', 0,  '邮件认证', 'email',      'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate(), null, null, '邮件认证');
+insert into sys_dict_data values(33, '000000', 0,  '小程序认证', 'xcx',      'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate(), null, null, '小程序认证');
+insert into sys_dict_data values(34, '000000', 0,  '三方登录认证', 'social', 'sys_grant_type',   '',   'default', 'N', 103, 1, sysdate(), null, null, '三方登录认证');
+insert into sys_dict_data values(35, '000000', 0,  'PC',    'pc',         'sys_device_type',     '',   'default', 'N', 103, 1, sysdate(), null, null, 'PC');
+insert into sys_dict_data values(36, '000000', 0,  '安卓', 'android',     'sys_device_type',     '',   'default', 'N', 103, 1, sysdate(), null, null, '安卓');
+insert into sys_dict_data values(37, '000000', 0,  'iOS', 'ios',          'sys_device_type',     '',   'default', 'N', 103, 1, sysdate(), null, null, 'iOS');
+insert into sys_dict_data values(38, '000000', 0,  '小程序', 'xcx',       'sys_device_type',     '',   'default', 'N', 103, 1, sysdate(), null, null, '小程序');
+
+
+-- ----------------------------
+-- 13、参数配置表
+-- ----------------------------
+drop table if exists sys_config;
+create table sys_config (
+    config_id         bigint(20)      not null                   comment '参数主键',
+    tenant_id         varchar(20)     default '000000'           comment '租户编号',
+    config_name       varchar(100)    default ''                 comment '参数名称',
+    config_key        varchar(100)    default ''                 comment '参数键名',
+    config_value      varchar(500)    default ''                 comment '参数键值',
+    config_type       char(1)         default 'N'                comment '系统内置(Y是 N否)',
+    create_dept       bigint(20)      default null               comment '创建部门',
+    create_by         bigint(20)      default null               comment '创建者',
+    create_time       datetime                                   comment '创建时间',
+    update_by         bigint(20)      default null               comment '更新者',
+    update_time       datetime                                   comment '更新时间',
+    remark            varchar(500)    default null               comment '备注',
+    primary key (config_id)
+) engine=innodb comment = '参数配置表';
+
+insert into sys_config values(1, '000000', '主框架页-默认皮肤样式名称',     'sys.index.skinName',            'skin-blue',     'Y', 103, 1, sysdate(), null, null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
+insert into sys_config values(2, '000000', '用户管理-账号初始密码',        'sys.user.initPassword',         '123456',        'Y', 103, 1, sysdate(), null, null, '初始化密码 123456' );
+insert into sys_config values(3, '000000', '主框架页-侧边栏主题',          'sys.index.sideTheme',           'theme-dark',    'Y', 103, 1, sysdate(), null, null, '深色主题theme-dark,浅色主题theme-light' );
+insert into sys_config values(5, '000000', '账号自助-是否开启用户注册功能',  'sys.account.registerUser',      'false',         'Y', 103, 1, sysdate(), null, null, '是否开启注册用户功能(true开启,false关闭)');
+insert into sys_config values(11, '000000', 'OSS预览列表资源开关',         'sys.oss.previewListResource',   'true',          'Y', 103, 1, sysdate(), null, null, 'true:开启, false:关闭');
+
+
+-- ----------------------------
+-- 14、系统访问记录
+-- ----------------------------
+drop table if exists sys_logininfor;
+create table sys_logininfor (
+    info_id        bigint(20)     not null                  comment '访问ID',
+    tenant_id      varchar(20)    default '000000'          comment '租户编号',
+    user_name      varchar(50)    default ''                comment '用户账号',
+    ipaddr         varchar(128)   default ''                comment '登录IP地址',
+    login_location varchar(255)   default ''                comment '登录地点',
+    browser        varchar(50)    default ''                comment '浏览器类型',
+    os             varchar(50)    default ''                comment '操作系统',
+    status         char(1)        default '0'               comment '登录状态(0成功 1失败)',
+    msg            varchar(255)   default ''                comment '提示消息',
+    login_time     datetime                                 comment '访问时间',
+    primary key (info_id),
+    key idx_sys_logininfor_s  (status),
+    key idx_sys_logininfor_lt (login_time)
+) engine=innodb comment = '系统访问记录';
+
+
+-- ----------------------------
+-- 17、通知公告表
+-- ----------------------------
+drop table if exists sys_notice;
+create table sys_notice (
+    notice_id         bigint(20)      not null                   comment '公告ID',
+    tenant_id         varchar(20)     default '000000'           comment '租户编号',
+    notice_title      varchar(50)     not null                   comment '公告标题',
+    notice_type       char(1)         not null                   comment '公告类型(1通知 2公告)',
+    notice_content    longblob        default null               comment '公告内容',
+    status            char(1)         default '0'                comment '公告状态(0正常 1关闭)',
+    create_dept       bigint(20)      default null               comment '创建部门',
+    create_by         bigint(20)      default null               comment '创建者',
+    create_time       datetime                                   comment '创建时间',
+    update_by         bigint(20)      default null               comment '更新者',
+    update_time       datetime                                   comment '更新时间',
+    remark            varchar(255)    default null               comment '备注',
+    primary key (notice_id)
+) engine=innodb comment = '通知公告表';
+
+-- ----------------------------
+-- 初始化-公告信息表数据
+-- ----------------------------
+insert into sys_notice values('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, sysdate(), null, null, '管理员');
+insert into sys_notice values('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容',   '0', 103, 1, sysdate(), null, null, '管理员');
+
+
+-- ----------------------------
+-- 18、代码生成业务表
+-- ----------------------------
+drop table if exists gen_table;
+create table gen_table (
+    table_id          bigint(20)      not null                   comment '编号',
+    data_name         varchar(200)    default ''                 comment '数据源名称',
+    table_name        varchar(200)    default ''                 comment '表名称',
+    table_comment     varchar(500)    default ''                 comment '表描述',
+    sub_table_name    varchar(64)     default null               comment '关联子表的表名',
+    sub_table_fk_name varchar(64)     default null               comment '子表关联的外键名',
+    class_name        varchar(100)    default ''                 comment '实体类名称',
+    tpl_category      varchar(200)    default 'crud'             comment '使用的模板(crud单表操作 tree树表操作)',
+    package_name      varchar(100)                               comment '生成包路径',
+    module_name       varchar(30)                                comment '生成模块名',
+    business_name     varchar(30)                                comment '生成业务名',
+    function_name     varchar(50)                                comment '生成功能名',
+    function_author   varchar(50)                                comment '生成功能作者',
+    gen_type          char(1)         default '0'                comment '生成代码方式(0zip压缩包 1自定义路径)',
+    gen_path          varchar(200)    default '/'                comment '生成路径(不填默认项目路径)',
+    options           varchar(1000)                              comment '其它生成选项',
+    create_dept       bigint(20)      default null               comment '创建部门',
+    create_by         bigint(20)      default null               comment '创建者',
+    create_time       datetime                                   comment '创建时间',
+    update_by         bigint(20)      default null               comment '更新者',
+    update_time       datetime                                   comment '更新时间',
+    remark            varchar(500)    default null               comment '备注',
+    primary key (table_id)
+) engine=innodb comment = '代码生成业务表';
+
+
+-- ----------------------------
+-- 19、代码生成业务表字段
+-- ----------------------------
+drop table if exists gen_table_column;
+create table gen_table_column (
+    column_id         bigint(20)      not null                   comment '编号',
+    table_id          bigint(20)                                 comment '归属表编号',
+    column_name       varchar(200)                               comment '列名称',
+    column_comment    varchar(500)                               comment '列描述',
+    column_type       varchar(100)                               comment '列类型',
+    java_type         varchar(500)                               comment 'JAVA类型',
+    java_field        varchar(200)                               comment 'JAVA字段名',
+    is_pk             char(1)                                    comment '是否主键(1是)',
+    is_increment      char(1)                                    comment '是否自增(1是)',
+    is_required       char(1)                                    comment '是否必填(1是)',
+    is_insert         char(1)                                    comment '是否为插入字段(1是)',
+    is_edit           char(1)                                    comment '是否编辑字段(1是)',
+    is_list           char(1)                                    comment '是否列表字段(1是)',
+    is_query          char(1)                                    comment '是否查询字段(1是)',
+    query_type        varchar(200)    default 'EQ'               comment '查询方式(等于、不等于、大于、小于、范围)',
+    html_type         varchar(200)                               comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+    dict_type         varchar(200)    default ''                 comment '字典类型',
+    sort              int                                        comment '排序',
+    create_dept       bigint(20)      default null               comment '创建部门',
+    create_by         bigint(20)      default null               comment '创建者',
+    create_time       datetime                                   comment '创建时间',
+    update_by         bigint(20)      default null               comment '更新者',
+    update_time       datetime                                   comment '更新时间',
+    primary key (column_id)
+) engine=innodb comment = '代码生成业务表字段';
+
+-- ----------------------------
+-- OSS对象存储表
+-- ----------------------------
+drop table if exists sys_oss;
+create table sys_oss (
+    oss_id          bigint(20)   not null                   comment '对象存储主键',
+    tenant_id       varchar(20)           default '000000'  comment '租户编号',
+    file_name       varchar(255) not null default ''        comment '文件名',
+    original_name   varchar(255) not null default ''        comment '原名',
+    file_suffix     varchar(10)  not null default ''        comment '文件后缀名',
+    url             varchar(500) not null                   comment 'URL地址',
+    create_dept     bigint(20)            default null      comment '创建部门',
+    create_time     datetime              default null      comment '创建时间',
+    create_by       bigint(20)            default null      comment '上传人',
+    update_time     datetime              default null      comment '更新时间',
+    update_by       bigint(20)            default null      comment '更新人',
+    service         varchar(20)  not null default 'minio'   comment '服务商',
+    primary key (oss_id)
+) engine=innodb comment ='OSS对象存储表';
+
+-- ----------------------------
+-- OSS对象存储动态配置表
+-- ----------------------------
+drop table if exists sys_oss_config;
+create table sys_oss_config (
+    oss_config_id   bigint(20)    not null                  comment '主建',
+    tenant_id       varchar(20)             default '000000'comment '租户编号',
+    config_key      varchar(20)   not null  default ''      comment '配置key',
+    access_key      varchar(255)            default ''      comment 'accessKey',
+    secret_key      varchar(255)            default ''      comment '秘钥',
+    bucket_name     varchar(255)            default ''      comment '桶名称',
+    prefix          varchar(255)            default ''      comment '前缀',
+    endpoint        varchar(255)            default ''      comment '访问站点',
+    domain          varchar(255)            default ''      comment '自定义域名',
+    is_https        char(1)                 default 'N'     comment '是否https(Y=是,N=否)',
+    region          varchar(255)            default ''      comment '域',
+    access_policy   char(1)       not null  default '1'     comment '桶权限类型(0=private 1=public 2=custom)',
+    status          char(1)                 default '1'     comment '是否默认(0=是,1=否)',
+    ext1            varchar(255)            default ''      comment '扩展字段',
+    create_dept     bigint(20)              default null    comment '创建部门',
+    create_by       bigint(20)              default null    comment '创建者',
+    create_time     datetime                default null    comment '创建时间',
+    update_by       bigint(20)              default null    comment '更新者',
+    update_time     datetime                default null    comment '更新时间',
+    remark          varchar(500)            default null    comment '备注',
+    primary key (oss_config_id)
+) engine=innodb comment='对象存储配置表';
+
+insert into sys_oss_config values (1, '000000', 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                '','N', '',             '1' ,'0', '', 103, 1, sysdate(), 1, sysdate(), null);
+insert into sys_oss_config values (2, '000000', 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',     '','N', '',             '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null);
+insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',   '','N', '',             '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null);
+insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',   '','N', 'ap-beijing',   '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null);
+insert into sys_oss_config values (5, '000000', 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',           '','N', '',             '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null);
+
+-- ----------------------------
+-- 系统授权表
+-- ----------------------------
+drop table if exists sys_client;
+create table sys_client (
+    id                  bigint(20)    not null            comment 'id',
+    client_id           varchar(64)   default null        comment '客户端id',
+    client_key          varchar(32)   default null        comment '客户端key',
+    client_secret       varchar(255)  default null        comment '客户端秘钥',
+    grant_type          varchar(255)  default null        comment '授权类型',
+    device_type         varchar(32)   default null        comment '设备类型',
+    active_timeout      int(11)       default 1800        comment 'token活跃超时时间',
+    timeout             int(11)       default 604800      comment 'token固定超时',
+    status              char(1)       default '0'         comment '状态(0正常 1停用)',
+    del_flag            char(1)       default '0'         comment '删除标志(0代表存在 2代表删除)',
+    create_dept         bigint(20)    default null        comment '创建部门',
+    create_by           bigint(20)    default null        comment '创建者',
+    create_time         datetime      default null        comment '创建时间',
+    update_by           bigint(20)    default null        comment '更新者',
+    update_time         datetime      default null        comment '更新时间',
+    primary key (id)
+) engine=innodb comment='系统授权表';
+
+insert into sys_client values (1, 'e5cd7e4891bf95d1d19206ce24a7b32e', 'pc', 'pc123', 'password,social', 'pc', 1800, 604800, 0, 0, 103, 1, sysdate(), 1, sysdate());
+insert into sys_client values (2, '428a8310cd442757ae699df5d894f051', 'app', 'app123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 103, 1, sysdate(), 1, sysdate());

+ 517 - 0
script/sql/sqlserver/powerjob.sql

@@ -0,0 +1,517 @@
+-- ----------------------------
+-- Table structure for pj_app_info
+-- ----------------------------
+
+CREATE TABLE [pj_app_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [app_name] varchar(255)   NULL,
+  [current_server] varchar(255)   NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [password] varchar(255)   NULL
+)
+GO
+
+ALTER TABLE [pj_app_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Records of [pj_app_info]
+-- ----------------------------
+SET IDENTITY_INSERT [pj_app_info] ON
+GO
+
+INSERT INTO [pj_app_info] ([id], [app_name], [current_server], [gmt_create], [gmt_modified], [password]) VALUES (N'1', N'ruoyi-worker', N'192.168.31.100:10010', N'2023-06-13 16:32:59.2630000', N'2023-07-04 17:25:49.7980000', N'123456')
+GO
+
+SET IDENTITY_INSERT [pj_app_info] OFF
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_container_info
+-- ----------------------------
+
+CREATE TABLE [pj_container_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [app_id] bigint  NULL,
+  [container_name] varchar(255)   NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [last_deploy_time] datetime2(7)  NULL,
+  [source_info] varchar(255)   NULL,
+  [source_type] int  NULL,
+  [status] int  NULL,
+  [version] varchar(255)   NULL
+)
+GO
+
+ALTER TABLE [pj_container_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_instance_info
+-- ----------------------------
+
+CREATE TABLE [pj_instance_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [actual_trigger_time] bigint  NULL,
+  [app_id] bigint  NULL,
+  [expected_trigger_time] bigint  NULL,
+  [finished_time] bigint  NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [instance_id] bigint  NULL,
+  [instance_params] varchar(max)   NULL,
+  [job_id] bigint  NULL,
+  [job_params] varchar(max)   NULL,
+  [last_report_time] bigint  NULL,
+  [result] varchar(max)   NULL,
+  [running_times] bigint  NULL,
+  [status] int  NULL,
+  [task_tracker_address] varchar(255)   NULL,
+  [type] int  NULL,
+  [wf_instance_id] bigint  NULL
+)
+GO
+
+ALTER TABLE [pj_instance_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_job_info
+-- ----------------------------
+
+CREATE TABLE [pj_job_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [alarm_config] varchar(255)   NULL,
+  [app_id] bigint  NULL,
+  [concurrency] int  NULL,
+  [designated_workers] varchar(255)   NULL,
+  [dispatch_strategy] int  NULL,
+  [execute_type] int  NULL,
+  [extra] varchar(255)   NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [instance_retry_num] int  NULL,
+  [instance_time_limit] bigint  NULL,
+  [job_description] varchar(255)   NULL,
+  [job_name] varchar(255)   NULL,
+  [job_params] varchar(max)   NULL,
+  [lifecycle] varchar(255)   NULL,
+  [log_config] varchar(255)   NULL,
+  [max_instance_num] int  NULL,
+  [max_worker_count] int  NULL,
+  [min_cpu_cores] float(53)  NOT NULL,
+  [min_disk_space] float(53)  NOT NULL,
+  [min_memory_space] float(53)  NOT NULL,
+  [next_trigger_time] bigint  NULL,
+  [notify_user_ids] varchar(255)   NULL,
+  [processor_info] varchar(255)   NULL,
+  [processor_type] int  NULL,
+  [status] int  NULL,
+  [tag] varchar(255)   NULL,
+  [task_retry_num] int  NULL,
+  [time_expression] varchar(255)   NULL,
+  [time_expression_type] int  NULL
+)
+GO
+
+ALTER TABLE [pj_job_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Records of [pj_job_info]
+-- ----------------------------
+SET IDENTITY_INSERT [pj_job_info] ON
+GO
+
+INSERT INTO [pj_job_info] ([id], [alarm_config], [app_id], [concurrency], [designated_workers], [dispatch_strategy], [execute_type], [extra], [gmt_create], [gmt_modified], [instance_retry_num], [instance_time_limit], [job_description], [job_name], [job_params], [lifecycle], [log_config], [max_instance_num], [max_worker_count], [min_cpu_cores], [min_disk_space], [min_memory_space], [next_trigger_time], [notify_user_ids], [processor_info], [processor_type], [status], [tag], [task_retry_num], [time_expression], [time_expression_type]) VALUES (N'1', N'{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', N'1', N'5', N'', N'2', N'1', NULL, N'2023-06-02 15:01:27.7170000', N'2023-07-04 17:22:12.3740000', N'1', N'0', N'', N'?????????', NULL, N'{}', N'{\"type\":1}', N'0', N'0', N'0.000000000000000', N'0.000000000000000', N'0.000000000000000', NULL, NULL, N'org.dromara.job.processors.StandaloneProcessorDemo', N'1', N'2', NULL, N'1', N'30000', N'3')
+GO
+
+INSERT INTO [pj_job_info] ([id], [alarm_config], [app_id], [concurrency], [designated_workers], [dispatch_strategy], [execute_type], [extra], [gmt_create], [gmt_modified], [instance_retry_num], [instance_time_limit], [job_description], [job_name], [job_params], [lifecycle], [log_config], [max_instance_num], [max_worker_count], [min_cpu_cores], [min_disk_space], [min_memory_space], [next_trigger_time], [notify_user_ids], [processor_info], [processor_type], [status], [tag], [task_retry_num], [time_expression], [time_expression_type]) VALUES (N'2', N'{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', N'1', N'5', N'', N'1', N'2', NULL, N'2023-06-02 15:04:45.3420000', N'2023-07-04 17:22:12.8160000', N'0', N'0', NULL, N'???????', NULL, N'{}', N'{\"type\":1}', N'0', N'0', N'0.000000000000000', N'0.000000000000000', N'0.000000000000000', NULL, NULL, N'org.dromara.job.processors.BroadcastProcessorDemo', N'1', N'2', NULL, N'1', N'30000', N'3')
+GO
+
+INSERT INTO [pj_job_info] ([id], [alarm_config], [app_id], [concurrency], [designated_workers], [dispatch_strategy], [execute_type], [extra], [gmt_create], [gmt_modified], [instance_retry_num], [instance_time_limit], [job_description], [job_name], [job_params], [lifecycle], [log_config], [max_instance_num], [max_worker_count], [min_cpu_cores], [min_disk_space], [min_memory_space], [next_trigger_time], [notify_user_ids], [processor_info], [processor_type], [status], [tag], [task_retry_num], [time_expression], [time_expression_type]) VALUES (N'3', N'{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', N'1', N'5', N'', N'1', N'4', NULL, N'2023-06-02 15:13:23.5190000', N'2023-06-02 16:03:22.4210000', N'0', N'0', NULL, N'Map?????', NULL, N'{}', N'{\"type\":1}', N'0', N'0', N'0.000000000000000', N'0.000000000000000', N'0.000000000000000', NULL, NULL, N'org.dromara.job.processors.MapProcessorDemo', N'1', N'2', NULL, N'1', N'1000', N'3')
+GO
+
+INSERT INTO [pj_job_info] ([id], [alarm_config], [app_id], [concurrency], [designated_workers], [dispatch_strategy], [execute_type], [extra], [gmt_create], [gmt_modified], [instance_retry_num], [instance_time_limit], [job_description], [job_name], [job_params], [lifecycle], [log_config], [max_instance_num], [max_worker_count], [min_cpu_cores], [min_disk_space], [min_memory_space], [next_trigger_time], [notify_user_ids], [processor_info], [processor_type], [status], [tag], [task_retry_num], [time_expression], [time_expression_type]) VALUES (N'4', N'{\"alertThreshold\":0,\"silenceWindowLen\":0,\"statisticWindowLen\":0}', N'1', N'5', N'', N'1', N'3', NULL, N'2023-06-02 15:45:25.8960000', N'2023-06-02 16:03:23.1250000', N'0', N'0', NULL, N'MapReduce?????', NULL, N'{}', N'{\"type\":1}', N'0', N'0', N'0.000000000000000', N'0.000000000000000', N'0.000000000000000', NULL, NULL, N'org.dromara.job.processors.MapReduceProcessorDemo', N'1', N'2', NULL, N'1', N'1000', N'3')
+GO
+
+SET IDENTITY_INSERT [pj_job_info] OFF
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_oms_lock
+-- ----------------------------
+
+CREATE TABLE [pj_oms_lock] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [lock_name] varchar(255)   NULL,
+  [max_lock_time] bigint  NULL,
+  [ownerip] varchar(255)   NULL
+)
+GO
+
+ALTER TABLE [pj_oms_lock] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_server_info
+-- ----------------------------
+
+CREATE TABLE [pj_server_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [ip] varchar(255)   NULL
+)
+GO
+
+ALTER TABLE [pj_server_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_user_info
+-- ----------------------------
+
+CREATE TABLE [pj_user_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [email] varchar(255)   NULL,
+  [extra] varchar(255)   NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [password] varchar(255)   NULL,
+  [phone] varchar(255)   NULL,
+  [username] varchar(255)   NULL,
+  [web_hook] varchar(255)   NULL
+)
+GO
+
+ALTER TABLE [pj_user_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_workflow_info
+-- ----------------------------
+
+CREATE TABLE [pj_workflow_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [app_id] bigint  NULL,
+  [extra] varchar(255)   NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [lifecycle] varchar(255)   NULL,
+  [max_wf_instance_num] int  NULL,
+  [next_trigger_time] bigint  NULL,
+  [notify_user_ids] varchar(255)   NULL,
+  [pedag] varchar(max)   NULL,
+  [status] int  NULL,
+  [time_expression] varchar(255)   NULL,
+  [time_expression_type] int  NULL,
+  [wf_description] varchar(255)   NULL,
+  [wf_name] varchar(255)   NULL
+)
+GO
+
+ALTER TABLE [pj_workflow_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_workflow_instance_info
+-- ----------------------------
+
+CREATE TABLE [pj_workflow_instance_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [actual_trigger_time] bigint  NULL,
+  [app_id] bigint  NULL,
+  [dag] varchar(max)   NULL,
+  [expected_trigger_time] bigint  NULL,
+  [finished_time] bigint  NULL,
+  [gmt_create] datetime2(7)  NULL,
+  [gmt_modified] datetime2(7)  NULL,
+  [parent_wf_instance_id] bigint  NULL,
+  [result] varchar(max)   NULL,
+  [status] int  NULL,
+  [wf_context] varchar(max)   NULL,
+  [wf_init_params] varchar(max)   NULL,
+  [wf_instance_id] bigint  NULL,
+  [workflow_id] bigint  NULL
+)
+GO
+
+ALTER TABLE [pj_workflow_instance_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Table structure for pj_workflow_node_info
+-- ----------------------------
+
+CREATE TABLE [pj_workflow_node_info] (
+  [id] bigint  IDENTITY(1,1) NOT NULL,
+  [app_id] bigint  NOT NULL,
+  [enable] bit  NOT NULL,
+  [extra] varchar(max)   NULL,
+  [gmt_create] datetime2(7)  NOT NULL,
+  [gmt_modified] datetime2(7)  NOT NULL,
+  [job_id] bigint  NULL,
+  [node_name] varchar(255)   NULL,
+  [node_params] varchar(max)   NULL,
+  [skip_when_failed] bit  NOT NULL,
+  [type] int  NULL,
+  [workflow_id] bigint  NULL
+)
+GO
+
+ALTER TABLE [pj_workflow_node_info] SET (LOCK_ESCALATION = TABLE)
+GO
+
+
+-- ----------------------------
+-- Uniques structure for table pj_app_info
+-- ----------------------------
+ALTER TABLE [pj_app_info] ADD CONSTRAINT [uidx01_app_info] UNIQUE NONCLUSTERED ([app_name] ASC)
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_app_info
+-- ----------------------------
+ALTER TABLE [pj_app_info] ADD CONSTRAINT [PK__pj_app_i__3213E83FDD7E2005] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Indexes structure for table pj_container_info
+-- ----------------------------
+CREATE NONCLUSTERED INDEX [idx01_container_info]
+ON [pj_container_info] (
+  [app_id] ASC
+)
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_container_info
+-- ----------------------------
+ALTER TABLE [pj_container_info] ADD CONSTRAINT [PK__pj_conta__3213E83FE1AAA8BE] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Indexes structure for table pj_instance_info
+-- ----------------------------
+CREATE NONCLUSTERED INDEX [idx01_instance_info]
+ON [pj_instance_info] (
+  [job_id] ASC,
+  [status] ASC
+)
+GO
+
+CREATE NONCLUSTERED INDEX [idx02_instance_info]
+ON [pj_instance_info] (
+  [app_id] ASC,
+  [status] ASC
+)
+GO
+
+CREATE NONCLUSTERED INDEX [idx03_instance_info]
+ON [pj_instance_info] (
+  [instance_id] ASC,
+  [status] ASC
+)
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_instance_info
+-- ----------------------------
+ALTER TABLE [pj_instance_info] ADD CONSTRAINT [PK__pj_insta__3213E83F6F188642] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Indexes structure for table pj_job_info
+-- ----------------------------
+CREATE NONCLUSTERED INDEX [idx01_job_info]
+ON [pj_job_info] (
+  [app_id] ASC,
+  [status] ASC,
+  [time_expression_type] ASC,
+  [next_trigger_time] ASC
+)
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_job_info
+-- ----------------------------
+ALTER TABLE [pj_job_info] ADD CONSTRAINT [PK__pj_job_i__3213E83FBFBCD483] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Uniques structure for table pj_oms_lock
+-- ----------------------------
+ALTER TABLE [pj_oms_lock] ADD CONSTRAINT [uidx01_oms_lock] UNIQUE NONCLUSTERED ([lock_name] ASC)
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_oms_lock
+-- ----------------------------
+ALTER TABLE [pj_oms_lock] ADD CONSTRAINT [PK__pj_oms_l__3213E83F31F31A08] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Indexes structure for table pj_server_info
+-- ----------------------------
+CREATE NONCLUSTERED INDEX [idx01_server_info]
+ON [pj_server_info] (
+  [gmt_modified] ASC
+)
+GO
+
+
+-- ----------------------------
+-- Uniques structure for table pj_server_info
+-- ----------------------------
+ALTER TABLE [pj_server_info] ADD CONSTRAINT [uidx01_server_info] UNIQUE NONCLUSTERED ([ip] ASC)
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_server_info
+-- ----------------------------
+ALTER TABLE [pj_server_info] ADD CONSTRAINT [PK__pj_serve__3213E83F75246E89] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Indexes structure for table pj_user_info
+-- ----------------------------
+CREATE NONCLUSTERED INDEX [uidx01_user_info]
+ON [pj_user_info] (
+  [username] ASC
+)
+GO
+
+CREATE NONCLUSTERED INDEX [uidx02_user_info]
+ON [pj_user_info] (
+  [email] ASC
+)
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_user_info
+-- ----------------------------
+ALTER TABLE [pj_user_info] ADD CONSTRAINT [PK__pj_user___3213E83FB78DE8FD] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Indexes structure for table pj_workflow_info
+-- ----------------------------
+CREATE NONCLUSTERED INDEX [idx01_workflow_info]
+ON [pj_workflow_info] (
+  [app_id] ASC,
+  [status] ASC,
+  [time_expression_type] ASC,
+  [next_trigger_time] ASC
+)
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_workflow_info
+-- ----------------------------
+ALTER TABLE [pj_workflow_info] ADD CONSTRAINT [PK__pj_workf__3213E83F790DC98A] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Indexes structure for table pj_workflow_instance_info
+-- ----------------------------
+CREATE NONCLUSTERED INDEX [idx01_wf_instance]
+ON [pj_workflow_instance_info] (
+  [workflow_id] ASC,
+  [status] ASC,
+  [app_id] ASC,
+  [expected_trigger_time] ASC
+)
+GO
+
+
+-- ----------------------------
+-- Uniques structure for table pj_workflow_instance_info
+-- ----------------------------
+ALTER TABLE [pj_workflow_instance_info] ADD CONSTRAINT [uidx01_wf_instance] UNIQUE NONCLUSTERED ([wf_instance_id] ASC)
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_workflow_instance_info
+-- ----------------------------
+ALTER TABLE [pj_workflow_instance_info] ADD CONSTRAINT [PK__pj_workf__3213E83F5AF8A72D] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+
+
+-- ----------------------------
+-- Indexes structure for table pj_workflow_node_info
+-- ----------------------------
+CREATE NONCLUSTERED INDEX [idx01_workflow_node_info]
+ON [pj_workflow_node_info] (
+  [workflow_id] ASC,
+  [gmt_create] ASC
+)
+GO
+
+
+-- ----------------------------
+-- Primary Key structure for table pj_workflow_node_info
+-- ----------------------------
+ALTER TABLE [pj_workflow_node_info] ADD CONSTRAINT [PK__pj_workf__3213E83FD000EE6D] PRIMARY KEY CLUSTERED ([id])
+WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ON [PRIMARY]
+GO
+

+ 3192 - 0
script/sql/sqlserver/sqlserver_ry_vue_5.X.sql

@@ -0,0 +1,3192 @@
+create table sys_social
+(
+    id                 bigint            NOT NULL,
+    user_id            bigint            NOT NULL,
+    tenant_id          nvarchar(20)      NULL,
+    auth_id            nvarchar(255)     NOT NULL,
+    source             nvarchar(255)     NOT NULL,
+    open_id            nvarchar(255)     NULL,
+    user_name          nvarchar(30)      NOT NULL,
+    nick_name          nvarchar(30)      DEFAULT ('')   NULL,
+    email              nvarchar(255)     DEFAULT ('')   NULL,
+    avatar             nvarchar(500)     DEFAULT ('')   NULL,
+    access_token       nvarchar(255)     NOT NULL,
+    expire_in          bigint            NULL,
+    refresh_token      nvarchar(255)     NULL,
+    access_code        nvarchar(255)     NULL,
+    union_id           nvarchar(255)     NULL,
+    scope              nvarchar(255)     NULL,
+    token_type         nvarchar(255)     NULL,
+    id_token           nvarchar(255)     NULL,
+    mac_algorithm      nvarchar(255)     NULL,
+    mac_key            nvarchar(255)     NULL,
+    code               nvarchar(255)     NULL,
+    oauth_token        nvarchar(255)     NULL,
+    oauth_token_secret nvarchar(255)     NULL,
+    create_dept        bigint,
+    create_by          bigint,
+    create_time        datetime2(7),
+    update_by          bigint,
+    update_time        datetime2(7),
+    del_flag           nchar             DEFAULT ('0')   NULL,
+    CONSTRAINT PK__sys_social__B21E8F2427725F8A PRIMARY KEY CLUSTERED (id)
+    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+    ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'user_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'平台+平台唯一id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'auth_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户来源' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'source'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'平台编号唯一id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'open_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'登录账号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'user_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户昵称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'nick_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户邮箱' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'email'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'头像地址' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'avatar'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户的授权令牌' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'access_token'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户的授权令牌的有效期,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'expire_in'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'刷新令牌,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'refresh_token'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'平台的授权信息,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'access_code'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户的 unionid' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'union_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'授予的权限,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'scope'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'个别平台的授权信息,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'token_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'id token,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'id_token'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'小米平台用户的附带属性,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'mac_algorithm'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'小米平台用户的附带属性,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'mac_key'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户的授权code,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'code'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'Twitter平台用户的附带属性,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'oauth_token'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'Twitter平台用户的附带属性,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'oauth_token_secret'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'删除标志(0代表存在 2代表删除)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'update_time'
+GO
+
+
+CREATE TABLE sys_tenant
+(
+    id                    bigint                          NOT NULL,
+    tenant_id             nvarchar(20)                    NOT NULL,
+    contact_user_name     nvarchar(20)                    NULL,
+    contact_phone         nvarchar(20)                    NULL,
+    company_name          nvarchar(50)                    NULL,
+    license_number        nvarchar(30)                    NULL,
+    address               nvarchar(200)                   NULL,
+    intro                 nvarchar(200)                   NULL,
+    domain                nvarchar(200)                   NULL,
+    remark                nvarchar(200)                   NULL,
+    package_id            bigint                          NULL,
+    expire_time           datetime2(7)                    NULL,
+    account_count         int             DEFAULT ((-1))  NULL,
+    status                nchar(1)        DEFAULT ('0')   NULL,
+    del_flag              nchar(1)        DEFAULT ('0')   NULL,
+    create_dept           bigint                          NULL,
+    create_by             bigint                          NULL,
+    create_time           datetime2(7)                    NULL,
+    update_by             bigint                          NULL,
+    update_time           datetime2(7)                    NULL,
+    CONSTRAINT PK__sys_tenant__B21E8F2427725F8A PRIMARY KEY CLUSTERED (id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'联系人' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'contact_user_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'联系电话' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'contact_phone'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'企业名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'company_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'统一社会信用代码' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'license_number'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'地址' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'address'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'企业简介' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'intro'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'域名' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'domain'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户套餐编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'package_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'过期时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'expire_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户数量(-1不限制)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'account_count'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户状态(0正常 1停用)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'删除标志(0代表存在 2代表删除)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant'
+GO
+
+INSERT sys_tenant VALUES (1, N'000000', N'管理组', N'15888888888', N'XXX有限公司', NULL, NULL, N'多租户通用后台管理管理系统', NULL, NULL, NULL, NULL, -1, N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+
+
+CREATE TABLE sys_tenant_package
+(
+    package_id            bigint                          NOT NULL,
+    package_name          nvarchar(20)                    NOT NULL,
+    menu_ids              nvarchar(20)                    NULL,
+    remark                nvarchar(200)                   NULL,
+    menu_check_strictly   tinyint         DEFAULT ((1))   NULL,
+    status                nchar(1)        DEFAULT ('0')   NULL,
+    del_flag              nchar(1)        DEFAULT ('0')   NULL,
+    create_dept           bigint                          NULL,
+    create_by             bigint                          NULL,
+    create_time           datetime2(7)                    NULL,
+    update_by             bigint                          NULL,
+    update_time           datetime2(7)                    NULL,
+    CONSTRAINT PK__sys_tenant_package__B21E8F2427725F8A PRIMARY KEY CLUSTERED (package_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户套餐id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'package_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'套餐名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'package_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'关联菜单id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'menu_ids'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户状态(0正常 1停用)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'删除标志(0代表存在 2代表删除)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户套餐表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_tenant_package'
+GO
+
+
+CREATE TABLE gen_table
+(
+    table_id          bigint                         NOT NULL,
+    data_name         nvarchar(200) DEFAULT ''       NULL,
+    table_name        nvarchar(200) DEFAULT ''       NULL,
+    table_comment     nvarchar(500) DEFAULT ''       NULL,
+    sub_table_name    nvarchar(64)                   NULL,
+    sub_table_fk_name nvarchar(64)                   NULL,
+    class_name        nvarchar(100) DEFAULT ''       NULL,
+    tpl_category      nvarchar(200) DEFAULT ('crud') NULL,
+    package_name      nvarchar(100)                  NULL,
+    module_name       nvarchar(30)                   NULL,
+    business_name     nvarchar(30)                   NULL,
+    function_name     nvarchar(50)                   NULL,
+    function_author   nvarchar(50)                   NULL,
+    gen_type          nchar(1)      DEFAULT ('0')    NULL,
+    gen_path          nvarchar(200) DEFAULT ('/')    NULL,
+    options           nvarchar(1000)                 NULL,
+    create_dept       bigint                         NULL,
+    create_by         bigint                         NULL,
+    create_time       datetime2(7)                   NULL,
+    update_by         bigint                         NULL,
+    update_time       datetime2(7)                   NULL,
+    remark            nvarchar(500)                  NULL,
+    CONSTRAINT PK__gen_tabl__B21E8F2427725F8A PRIMARY KEY CLUSTERED (table_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'table_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'数据源名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'data_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'表名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'table_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'表描述' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'table_comment'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'关联子表的表名' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'sub_table_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'子表关联的外键名' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'sub_table_fk_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'实体类名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'class_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'使用的模板(crud单表操作 tree树表操作)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'tpl_category'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'生成包路径' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'package_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'生成模块名' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'module_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'生成业务名' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'business_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'生成功能名' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'function_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'生成功能作者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'function_author'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'生成代码方式(0zip压缩包 1自定义路径)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'gen_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'生成路径(不填默认项目路径)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'gen_path'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'其它生成选项' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'options'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'代码生成业务表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table'
+GO
+
+CREATE TABLE gen_table_column
+(
+    column_id      bigint                       NOT NULL,
+    table_id       bigint                       NULL,
+    column_name    nvarchar(200)                NULL,
+    column_comment nvarchar(500)                NULL,
+    column_type    nvarchar(100)                NULL,
+    java_type      nvarchar(500)                NULL,
+    java_field     nvarchar(200)                NULL,
+    is_pk          nchar(1)                     NULL,
+    is_increment   nchar(1)                     NULL,
+    is_required    nchar(1)                     NULL,
+    is_insert      nchar(1)                     NULL,
+    is_edit        nchar(1)                     NULL,
+    is_list        nchar(1)                     NULL,
+    is_query       nchar(1)                     NULL,
+    query_type     nvarchar(200) DEFAULT ('EQ') NULL,
+    html_type      nvarchar(200)                NULL,
+    dict_type      nvarchar(200) DEFAULT ''     NULL,
+    sort           int                          NULL,
+    create_dept    bigint                       NULL,
+    create_by      bigint                       NULL,
+    create_time    datetime2(7)                 NULL,
+    update_by      bigint                       NULL,
+    update_time    datetime2(7)                 NULL,
+    CONSTRAINT PK__gen_tabl__E301851F2E68B4E8 PRIMARY KEY CLUSTERED (column_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'column_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'归属表编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'table_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'列名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'column_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'列描述' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'column_comment'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'列类型' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'column_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'JAVA类型' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'java_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'JAVA字段名' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'java_field'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否主键(1是)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'is_pk'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否自增(1是)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'is_increment'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否必填(1是)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'is_required'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否为插入字段(1是)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'is_insert'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否编辑字段(1是)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'is_edit'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否列表字段(1是)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'is_list'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否查询字段(1是)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'is_query'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'查询方式(等于、不等于、大于、小于、范围)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'query_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'html_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典类型' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'dict_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'排序' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'sort'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'代码生成业务表字段' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table_column'
+GO
+
+CREATE TABLE sys_config
+(
+    config_id    bigint                      NOT NULL,
+    tenant_id    nvarchar(20)  DEFAULT '000000'  NULL,
+    config_name  nvarchar(100) DEFAULT ''    NULL,
+    config_key   nvarchar(100) DEFAULT ''    NULL,
+    config_value nvarchar(500) DEFAULT ''    NULL,
+    config_type  nchar(1)      DEFAULT ('N') NULL,
+    create_dept  bigint                      NULL,
+    create_by    bigint                      NULL,
+    create_time  datetime2(7)                NULL,
+    update_by    bigint                      NULL,
+    update_time  datetime2(7)                NULL,
+    remark       nvarchar(500)               NULL,
+    CONSTRAINT PK__sys_conf__4AD1BFF182643682 PRIMARY KEY CLUSTERED (config_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'参数主键' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'config_id'
+GO
+EXEC sys.sp_addextendedproperty
+     'MS_Description', N'租户编号' ,
+     'SCHEMA', N'dbo',
+     'TABLE', N'sys_config',
+     'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'参数名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'config_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'参数键名' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'config_key'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'参数键值' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'config_value'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'系统内置(Y是 N否)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'config_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'参数配置表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_config'
+GO
+
+INSERT sys_config VALUES (1, N'000000', N'主框架页-默认皮肤样式名称', N'sys.index.skinName', N'skin-blue', N'Y', 103, 1, getdate(), NULL, NULL, N'蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow')
+GO
+INSERT sys_config VALUES (2, N'000000', N'用户管理-账号初始密码', N'sys.user.initPassword', N'123456', N'Y', 103, 1, getdate(), NULL, NULL, N'初始化密码 123456')
+GO
+INSERT sys_config VALUES (3, N'000000', N'主框架页-侧边栏主题', N'sys.index.sideTheme', N'theme-dark', N'Y', 103, 1, getdate(), NULL, NULL, N'深色主题theme-dark,浅色主题theme-light')
+GO
+INSERT sys_config VALUES (5, N'000000', N'账号自助-是否开启用户注册功能', N'sys.account.registerUser', N'false', N'Y', 103, 1, getdate(), NULL, NULL, N'是否开启注册用户功能(true开启,false关闭)')
+GO
+INSERT sys_config VALUES (11, N'000000', N'OSS预览列表资源开关', N'sys.oss.previewListResource', N'true', N'Y', 103, 1, getdate(), NULL, NULL, N'true:开启, false:关闭');
+GO
+
+CREATE TABLE sys_dept
+(
+    dept_id     bigint                     NOT NULL,
+    tenant_id   nvarchar(20) DEFAULT ('000000') NULL,
+    parent_id   bigint       DEFAULT ((0)) NULL,
+    ancestors   nvarchar(500)DEFAULT ''    NULL,
+    dept_name   nvarchar(30) DEFAULT ''    NULL,
+    order_num   int          DEFAULT ((0)) NULL,
+    leader      bigint                     NULL,
+    phone       nvarchar(11)               NULL,
+    email       nvarchar(50)               NULL,
+    status      nchar(1)     DEFAULT ('0') NULL,
+    del_flag    nchar(1)     DEFAULT ('0') NULL,
+    create_dept bigint                     NULL,
+    create_by   bigint                     NULL,
+    create_time datetime2(7)               NULL,
+    update_by   bigint                     NULL,
+    update_time datetime2(7)               NULL,
+    CONSTRAINT PK__sys_dept__DCA659747DE13804 PRIMARY KEY CLUSTERED (dept_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'部门id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'dept_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'父部门id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'parent_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'祖级列表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'ancestors'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'部门名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'dept_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'显示顺序' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'order_num'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'负责人' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'leader'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'联系电话' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'phone'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'邮箱' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'email'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'部门状态(0正常 1停用)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'删除标志(0代表存在 2代表删除)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'部门表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dept'
+GO
+
+INSERT sys_dept VALUES (100, N'000000', 0, N'0', N'XXX科技', 0, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (101, N'000000', 100, N'0,100', N'深圳总公司', 1, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (102, N'000000', 100, N'0,100', N'长沙分公司', 2, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (103, N'000000', 101, N'0,100,101', N'研发部门', 1, 1, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (104, N'000000', 101, N'0,100,101', N'市场部门', 2, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (105, N'000000', 101, N'0,100,101', N'测试部门', 3, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (106, N'000000', 101, N'0,100,101', N'财务部门', 4, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (107, N'000000', 101, N'0,100,101', N'运维部门', 5, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (108, N'000000', 102, N'0,100,102', N'市场部门', 1, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+INSERT sys_dept VALUES (109, N'000000', 102, N'0,100,102', N'财务部门', 2, NULL, N'15888888888', N'xxx@qq.com', N'0', N'0', 103, 1, getdate(), NULL, NULL)
+GO
+
+CREATE TABLE sys_dict_data
+(
+    dict_code   bigint                      NOT NULL,
+    tenant_id   nvarchar(20)  DEFAULT ('000000') NULL,
+    dict_sort   int           DEFAULT ((0)) NULL,
+    dict_label  nvarchar(100) DEFAULT ''    NULL,
+    dict_value  nvarchar(100) DEFAULT ''    NULL,
+    dict_type   nvarchar(100) DEFAULT ''    NULL,
+    css_class   nvarchar(100)               NULL,
+    list_class  nvarchar(100)               NULL,
+    is_default  nchar(1)      DEFAULT ('N') NULL,
+    create_dept bigint                      NULL,
+    create_by   bigint                      NULL,
+    create_time datetime2(7)                NULL,
+    update_by   bigint                      NULL,
+    update_time datetime2(7)                NULL,
+    remark      nvarchar(500)               NULL,
+    CONSTRAINT PK__sys_dict__19CBC34B661AF3B3 PRIMARY KEY CLUSTERED (dict_code)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典编码' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'dict_code'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典编码' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典排序' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'dict_sort'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典标签' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'dict_label'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典键值' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'dict_value'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典类型' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'dict_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'样式属性(其他样式扩展)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'css_class'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'表格回显样式' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'list_class'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否默认(Y是 N否)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'is_default'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典数据表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_data'
+GO
+
+INSERT sys_dict_data VALUES (1, N'000000', 1, N'男', N'0', N'sys_user_sex', N'', N'', N'Y', 103, 1, getdate(), NULL, NULL, N'性别男')
+GO
+INSERT sys_dict_data VALUES (2, N'000000', 2, N'女', N'1', N'sys_user_sex', N'', N'', N'N', 103, 1, getdate(), NULL, NULL, N'性别女')
+GO
+INSERT sys_dict_data VALUES (3, N'000000', 3, N'未知', N'2', N'sys_user_sex', N'', N'', N'N', 103, 1, getdate(), NULL, NULL, N'性别未知')
+GO
+INSERT sys_dict_data VALUES (4, N'000000', 1, N'显示', N'0', N'sys_show_hide', N'', N'primary', N'Y', 103, 1, getdate(), NULL, NULL, N'显示菜单')
+GO
+INSERT sys_dict_data VALUES (5, N'000000', 2, N'隐藏', N'1', N'sys_show_hide', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'隐藏菜单')
+GO
+INSERT sys_dict_data VALUES (6, N'000000', 1, N'正常', N'0', N'sys_normal_disable', N'', N'primary', N'Y', 103, 1, getdate(), NULL, NULL, N'正常状态')
+GO
+INSERT sys_dict_data VALUES (7, N'000000', 2, N'停用', N'1', N'sys_normal_disable', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'停用状态')
+GO
+INSERT sys_dict_data VALUES (8, N'000000', 1, N'正常', N'0', N'sys_job_status', N'', N'primary', N'Y', 103, 1, getdate(), NULL, NULL, N'正常状态')
+GO
+INSERT sys_dict_data VALUES (9, N'000000', 2, N'暂停', N'1', N'sys_job_status', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'停用状态')
+GO
+INSERT sys_dict_data VALUES (10, N'000000', 1, N'默认', N'DEFAULT', N'sys_job_group', N'', N'', N'Y', 103, 1, getdate(), NULL, NULL, N'默认分组')
+GO
+INSERT sys_dict_data VALUES (11, N'000000', 2, N'系统', N'SYSTEM', N'sys_job_group', N'', N'', N'N', 103, 1, getdate(), NULL, NULL, N'系统分组')
+GO
+INSERT sys_dict_data VALUES (12, N'000000', 1, N'是', N'Y', N'sys_yes_no', N'', N'primary', N'Y', 103, 1, getdate(), NULL, NULL, N'系统默认是')
+GO
+INSERT sys_dict_data VALUES (13, N'000000', 2, N'否', N'N', N'sys_yes_no', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'系统默认否')
+GO
+INSERT sys_dict_data VALUES (14, N'000000', 1, N'通知', N'1', N'sys_notice_type', N'', N'warning', N'Y', 103, 1, getdate(), NULL, NULL, N'通知')
+GO
+INSERT sys_dict_data VALUES (15, N'000000', 2, N'公告', N'2', N'sys_notice_type', N'', N'success', N'N', 103, 1, getdate(), NULL, NULL, N'公告')
+GO
+INSERT sys_dict_data VALUES (16, N'000000', 1, N'正常', N'0', N'sys_notice_status', N'', N'primary', N'Y', 103, 1, getdate(), NULL, NULL, N'正常状态')
+GO
+INSERT sys_dict_data VALUES (17, N'000000', 2, N'关闭', N'1', N'sys_notice_status', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'关闭状态')
+GO
+INSERT sys_dict_data VALUES (29, N'000000', 99, N'其他', N'0', N'sys_oper_type', N'', N'info', N'N', 103, 1, getdate(), NULL, NULL, N'其他操作');
+GO
+INSERT sys_dict_data VALUES (18, N'000000', 1, N'新增', N'1', N'sys_oper_type', N'', N'info', N'N', 103, 1, getdate(), NULL, NULL, N'新增操作')
+GO
+INSERT sys_dict_data VALUES (19, N'000000', 2, N'修改', N'2', N'sys_oper_type', N'', N'info', N'N', 103, 1, getdate(), NULL, NULL, N'修改操作')
+GO
+INSERT sys_dict_data VALUES (20, N'000000', 3, N'删除', N'3', N'sys_oper_type', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'删除操作')
+GO
+INSERT sys_dict_data VALUES (21, N'000000', 4, N'授权', N'4', N'sys_oper_type', N'', N'primary', N'N', 103, 1, getdate(), NULL, NULL, N'授权操作')
+GO
+INSERT sys_dict_data VALUES (22, N'000000', 5, N'导出', N'5', N'sys_oper_type', N'', N'warning', N'N', 103, 1, getdate(), NULL, NULL, N'导出操作')
+GO
+INSERT sys_dict_data VALUES (23, N'000000', 6, N'导入', N'6', N'sys_oper_type', N'', N'warning', N'N', 103, 1, getdate(), NULL, NULL, N'导入操作')
+GO
+INSERT sys_dict_data VALUES (24, N'000000', 7, N'强退', N'7', N'sys_oper_type', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'强退操作')
+GO
+INSERT sys_dict_data VALUES (25, N'000000', 8, N'生成代码', N'8', N'sys_oper_type', N'', N'warning', N'N', 103, 1, getdate(), NULL, NULL, N'生成操作')
+GO
+INSERT sys_dict_data VALUES (26, N'000000', 9, N'清空数据', N'9', N'sys_oper_type', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'清空操作')
+GO
+INSERT sys_dict_data VALUES (27, N'000000', 1, N'成功', N'0', N'sys_common_status', N'', N'primary', N'N', 103, 1, getdate(), NULL, NULL, N'正常状态')
+GO
+INSERT sys_dict_data VALUES (28, N'000000', 2, N'失败', N'1', N'sys_common_status', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'停用状态')
+GO
+INSERT sys_dict_data VALUES (30, N'000000', 0, N'密码认证', N'password', N'sys_grant_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'密码认证')
+GO
+INSERT sys_dict_data VALUES (31, N'000000', 0, N'短信认证', N'sms', N'sys_grant_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'短信认证')
+GO
+INSERT sys_dict_data VALUES (32, N'000000', 0, N'邮件认证', N'email', N'sys_grant_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'邮件认证')
+GO
+INSERT sys_dict_data VALUES (33, N'000000', 0, N'小程序认证', N'xcx', N'sys_grant_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'小程序认证')
+GO
+INSERT sys_dict_data VALUES (34, N'000000', 0, N'三方登录认证', N'`social`', N'sys_grant_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'三方登录认证')
+GO
+INSERT sys_dict_data VALUES (35, N'000000', 0, N'PC', N'`pc`', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'PC')
+GO
+INSERT sys_dict_data VALUES (36, N'000000', 0, N'安卓', N'`android`', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'安卓')
+GO
+INSERT sys_dict_data VALUES (37, N'000000', 0, N'iOS', N'`ios`', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'iOS')
+GO
+INSERT sys_dict_data VALUES (38, N'000000', 0, N'小程序', N'`xcx`', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'小程序')
+GO
+
+CREATE TABLE sys_dict_type
+(
+    dict_id     bigint                      NOT NULL,
+    tenant_id   nvarchar(20)  DEFAULT ('000000') NULL,
+    dict_name   nvarchar(100) DEFAULT ''    NULL,
+    dict_type   nvarchar(100) DEFAULT ''    NULL,
+    create_dept bigint                      NULL,
+    create_by   bigint                      NULL,
+    create_time datetime2(7)                NULL,
+    update_by   bigint                      NULL,
+    update_time datetime2(7)                NULL,
+    remark      nvarchar(500)               NULL,
+    CONSTRAINT PK__sys_dict__3BD4186C409C5391 PRIMARY KEY CLUSTERED (dict_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+CREATE NONCLUSTERED INDEX sys_dict_type_index1 ON sys_dict_type (tenant_id, dict_type)
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典主键' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'dict_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典主键' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'dict_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典类型' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'dict_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'字典类型表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_dict_type'
+GO
+
+INSERT sys_dict_type VALUES (1, N'000000', N'用户性别', N'sys_user_sex', 103, 1, getdate(), NULL, NULL, N'用户性别列表')
+GO
+INSERT sys_dict_type VALUES (2, N'000000', N'菜单状态', N'sys_show_hide', 103, 1, getdate(), NULL, NULL, N'菜单状态列表')
+GO
+INSERT sys_dict_type VALUES (3, N'000000', N'系统开关', N'sys_normal_disable', 103, 1, getdate(), NULL, NULL, N'系统开关列表')
+GO
+INSERT sys_dict_type VALUES (4, N'000000', N'任务状态', N'sys_job_status', 103, 1, getdate(), NULL, NULL, N'任务状态列表')
+GO
+INSERT sys_dict_type VALUES (5, N'000000', N'任务分组', N'sys_job_group', 103, 1, getdate(), NULL, NULL, N'任务分组列表')
+GO
+INSERT sys_dict_type VALUES (6, N'000000', N'系统是否', N'sys_yes_no', 103, 1, getdate(), NULL, NULL, N'系统是否列表')
+GO
+INSERT sys_dict_type VALUES (7, N'000000', N'通知类型', N'sys_notice_type', 103, 1, getdate(), NULL, NULL, N'通知类型列表')
+GO
+INSERT sys_dict_type VALUES (8, N'000000', N'通知状态', N'sys_notice_status', 103, 1, getdate(), NULL, NULL, N'通知状态列表')
+GO
+INSERT sys_dict_type VALUES (9, N'000000', N'操作类型', N'sys_oper_type', 103, 1, getdate(), NULL, NULL, N'操作类型列表')
+GO
+INSERT sys_dict_type VALUES (10, N'000000', N'系统状态', N'sys_common_status', 103, 1, getdate(), NULL, NULL, N'登录状态列表')
+GO
+INSERT sys_dict_type VALUES (11, N'000000', N'授权类型', N'sys_grant_type', 103, 1, getdate(), NULL, NULL, N'认证授权类型')
+GO
+INSERT sys_dict_type VALUES (12, N'000000', N'设备类型', N'sys_device_type', 103, 1, getdate(), NULL, NULL, N'客户端设备类型')
+GO
+
+CREATE TABLE sys_logininfor
+(
+    info_id        bigint                      NOT NULL,
+    tenant_id      nvarchar(20)  DEFAULT ('000000') NULL,
+    user_name      nvarchar(50)  DEFAULT ''    NULL,
+    ipaddr         nvarchar(128) DEFAULT ''    NULL,
+    login_location nvarchar(255) DEFAULT ''    NULL,
+    browser        nvarchar(50)  DEFAULT ''    NULL,
+    os             nvarchar(50)  DEFAULT ''    NULL,
+    status         nchar(1)      DEFAULT ('0') NULL,
+    msg            nvarchar(255) DEFAULT ''    NULL,
+    login_time     datetime2(7)                NULL,
+    CONSTRAINT PK__sys_logi__3D8A9C1A1854AE10 PRIMARY KEY CLUSTERED (info_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+CREATE NONCLUSTERED INDEX idx_sys_logininfor_s ON sys_logininfor (status)
+GO
+CREATE NONCLUSTERED INDEX idx_sys_logininfor_lt ON sys_logininfor (login_time)
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'访问ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'info_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户账号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'user_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'登录IP地址' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'ipaddr'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'登录地点' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'login_location'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'浏览器类型' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'browser'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'操作系统' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'os'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'登录状态(0成功 1失败)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'提示消息' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'msg'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'访问时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'login_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'系统访问记录' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor'
+GO
+
+CREATE TABLE sys_menu
+(
+    menu_id     bigint                      NOT NULL,
+    menu_name   nvarchar(50)                NOT NULL,
+    parent_id   bigint        DEFAULT ((0)) NULL,
+    order_num   int           DEFAULT ((0)) NULL,
+    path        nvarchar(200) DEFAULT ''    NULL,
+    component   nvarchar(255)               NULL,
+    query_param nvarchar(255)               NULL,
+    is_frame    int           DEFAULT ((1)) NULL,
+    is_cache    int           DEFAULT ((0)) NULL,
+    menu_type   nchar(1)      DEFAULT ''    NULL,
+    visible     nchar(1)      DEFAULT ((0)) NULL,
+    status      nchar(1)      DEFAULT ((0)) NULL,
+    perms       nvarchar(100)               NULL,
+    icon        nvarchar(100) DEFAULT ('#') NULL,
+    create_dept bigint                      NULL,
+    create_by   bigint                      NULL,
+    create_time datetime2(7)                NULL,
+    update_by   bigint                      NULL,
+    update_time datetime2(7)                NULL,
+    remark      nvarchar(500) DEFAULT ''    NULL,
+    CONSTRAINT PK__sys_menu__4CA0FADCF8545C58 PRIMARY KEY CLUSTERED (menu_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'菜单ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'menu_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'菜单名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'menu_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'父菜单ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'parent_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'显示顺序' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'order_num'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'路由地址' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'path'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'组件路径' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'component'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'路由参数' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'query_param'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否为外链(0是 1否)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'is_frame'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'是否缓存(0缓存 1不缓存)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'is_cache'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'菜单类型(M目录 C菜单 F按钮)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'menu_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'显示状态(0显示 1隐藏)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'visible'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'菜单状态(0正常 1停用)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'权限标识' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'perms'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'菜单图标' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'icon'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'菜单权限表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_menu'
+GO
+
+INSERT sys_menu VALUES (1, N'系统管理', 0, 1, N'system', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'system', 103, 1, getdate(), NULL, NULL, N'系统管理目录')
+GO
+INSERT sys_menu VALUES (6, N'租户管理', 0, 2, N'tenant', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'chart', 103, 1, getdate(), NULL, NULL, N'租户管理目录')
+GO
+INSERT sys_menu VALUES (2, N'系统监控', 0, 3, N'monitor', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'monitor', 103, 1, getdate(), NULL, NULL, N'系统监控目录')
+GO
+INSERT sys_menu VALUES (3, N'系统工具', 0, 4, N'tool', NULL, N'', 1, 0, N'M', N'0', N'0', N'', N'tool', 103, 1, getdate(), NULL, NULL, N'系统工具目录')
+GO
+INSERT sys_menu VALUES (4, N'PLUS官网', 0, 5, N'https://gitee.com/dromara/RuoYi-Vue-Plus', null, N'', 0, 0, N'M', N'0', N'0', N'', N'guide', 103, 1, getdate(), null, null, N'RuoYi-Vue-Plus官网地址');
+GO
+INSERT sys_menu VALUES (100, N'用户管理', 1, 1, N'user', N'system/user/index', N'', 1, 0, N'C', N'0', N'0', N'system:user:list', N'user', 103, 1, getdate(), NULL, NULL, N'用户管理菜单')
+GO
+INSERT sys_menu VALUES (101, N'角色管理', 1, 2, N'role', N'system/role/index', N'', 1, 0, N'C', N'0', N'0', N'system:role:list', N'peoples', 103, 1, getdate(), NULL, NULL, N'角色管理菜单')
+GO
+INSERT sys_menu VALUES (102, N'菜单管理', 1, 3, N'menu', N'system/menu/index', N'', 1, 0, N'C', N'0', N'0', N'system:menu:list', N'tree-table', 103, 1, getdate(), NULL, NULL, N'菜单管理菜单')
+GO
+INSERT sys_menu VALUES (103, N'部门管理', 1, 4, N'dept', N'system/dept/index', N'', 1, 0, N'C', N'0', N'0', N'system:dept:list', N'tree', 103, 1, getdate(), NULL, NULL, N'部门管理菜单')
+GO
+INSERT sys_menu VALUES (104, N'岗位管理', 1, 5, N'post', N'system/post/index', N'', 1, 0, N'C', N'0', N'0', N'system:post:list', N'post', 103, 1, getdate(), NULL, NULL, N'岗位管理菜单')
+GO
+INSERT sys_menu VALUES (105, N'字典管理', 1, 6, N'dict', N'system/dict/index', N'', 1, 0, N'C', N'0', N'0', N'system:dict:list', N'dict', 103, 1, getdate(), NULL, NULL, N'字典管理菜单')
+GO
+INSERT sys_menu VALUES (106, N'参数设置', 1, 7, N'config', N'system/config/index', N'', 1, 0, N'C', N'0', N'0', N'system:config:list', N'edit', 103, 1, getdate(), NULL, NULL, N'参数设置菜单')
+GO
+INSERT sys_menu VALUES (107, N'通知公告', 1, 8, N'notice', N'system/notice/index', N'', 1, 0, N'C', N'0', N'0', N'system:notice:list', N'message', 103, 1, getdate(), NULL, NULL, N'通知公告菜单')
+GO
+INSERT sys_menu VALUES (108, N'日志管理', 1, 9, N'log', N'', N'', 1, 0, N'M', N'0', N'0', N'', N'log', 103, 1, getdate(), NULL, NULL, N'日志管理菜单')
+GO
+INSERT sys_menu VALUES (109, N'在线用户', 2, 1, N'online', N'monitor/online/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:online:list', N'online', 103, 1, getdate(), NULL, NULL, N'在线用户菜单')
+GO
+INSERT sys_menu VALUES (113, N'缓存监控', 2, 5, N'cache', N'monitor/cache/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:cache:list', N'redis', 103, 1, getdate(), NULL, NULL, N'缓存监控菜单')
+GO
+INSERT sys_menu VALUES (114, N'表单构建', 3, 1, N'build', N'tool/build/index', N'', 1, 0, N'C', N'0', N'0', N'tool:build:list', N'build', 103, 1, getdate(), NULL, NULL, N'表单构建菜单')
+GO
+INSERT sys_menu VALUES (115, N'代码生成', 3, 2, N'gen', N'tool/gen/index', N'', 1, 0, N'C', N'0', N'0', N'tool:gen:list', N'code', 103, 1, getdate(), NULL, NULL, N'代码生成菜单')
+GO
+INSERT sys_menu VALUES (121, N'租户管理', 6, 1, N'tenant', N'system/tenant/index', N'', 1, 0, N'C', N'0', N'0', N'system:tenant:list', N'code', 103, 1, getdate(), NULL, NULL, N'租户管理菜单')
+GO
+INSERT sys_menu VALUES (122, N'租户套餐管理', 6, 2, N'tenantPackage', N'system/tenantPackage/index', N'', 1, 0, N'C', N'0', N'0', N'system:tenantPackage:list', N'code', 103, 1, getdate(), NULL, NULL, N'租户套餐管理菜单')
+GO
+INSERT sys_menu VALUES (123, N'客户端管理', 1, 11, N'client', N'system/client/index', N'', 1, 0, N'C', N'0', N'0', N'system:client:list', N'international', 103, 1, getdate(), NULL, NULL, N'客户端管理菜单')
+GO
+INSERT sys_menu VALUES (117, N'Admin监控', 2, 5, N'Admin', N'monitor/admin/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:admin:list', N'dashboard', 103, 1, getdate(), NULL, NULL, N'Admin监控菜单');
+GO
+INSERT sys_menu VALUES (118, N'文件管理', 1, 10, N'oss', N'system/oss/index', N'', 1, 0, N'C', '0', N'0', N'system:oss:list', N'upload', 103, 1, getdate(), NULL, NULL, N'文件管理菜单');
+GO
+INSERT sys_menu VALUES (120, N'任务调度中心', 2, 5, N'powerjob', N'monitor/powerjob/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:powerjob:list', N'job', 103, 1, getdate(), NULL, NULL, N'PowerJob控制台菜单');
+GO
+INSERT sys_menu VALUES (500, N'操作日志', 108, 1, N'operlog', N'monitor/operlog/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:operlog:list', N'form', 103, 1, getdate(), NULL, NULL, N'操作日志菜单')
+GO
+INSERT sys_menu VALUES (501, N'登录日志', 108, 2, N'logininfor', N'monitor/logininfor/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:logininfor:list', N'logininfor', 103, 1, getdate(), NULL, NULL, N'登录日志菜单')
+GO
+INSERT sys_menu VALUES (1001, N'用户查询', 100, 1, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:user:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1002, N'用户新增', 100, 2, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:user:add', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1003, N'用户修改', 100, 3, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:user:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1004, N'用户删除', 100, 4, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:user:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1005, N'用户导出', 100, 5, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:user:export', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1006, N'用户导入', 100, 6, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:user:import', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1007, N'重置密码', 100, 7, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:user:resetPwd', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1008, N'角色查询', 101, 1, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:role:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1009, N'角色新增', 101, 2, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:role:add', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1010, N'角色修改', 101, 3, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:role:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1011, N'角色删除', 101, 4, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:role:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1012, N'角色导出', 101, 5, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:role:export', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1013, N'菜单查询', 102, 1, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:menu:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1014, N'菜单新增', 102, 2, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:menu:add', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1015, N'菜单修改', 102, 3, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:menu:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1016, N'菜单删除', 102, 4, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:menu:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1017, N'部门查询', 103, 1, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dept:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1018, N'部门新增', 103, 2, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dept:add', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1019, N'部门修改', 103, 3, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dept:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1020, N'部门删除', 103, 4, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dept:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1021, N'岗位查询', 104, 1, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:post:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1022, N'岗位新增', 104, 2, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:post:add', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1023, N'岗位修改', 104, 3, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:post:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1024, N'岗位删除', 104, 4, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:post:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1025, N'岗位导出', 104, 5, N'', N'', N'', 1, 0, N'F', N'0', N'0', N'system:post:export', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1026, N'字典查询', 105, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dict:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1027, N'字典新增', 105, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dict:add', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1028, N'字典修改', 105, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dict:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1029, N'字典删除', 105, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dict:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1030, N'字典导出', 105, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:dict:export', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1031, N'参数查询', 106, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:config:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1032, N'参数新增', 106, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:config:add', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1033, N'参数修改', 106, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:config:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1034, N'参数删除', 106, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:config:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1035, N'参数导出', 106, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:config:export', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1036, N'公告查询', 107, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:notice:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1037, N'公告新增', 107, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:notice:add', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1038, N'公告修改', 107, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:notice:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1039, N'公告删除', 107, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:notice:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1040, N'操作查询', 500, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:operlog:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1041, N'操作删除', 500, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:operlog:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1042, N'日志导出', 500, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:operlog:export', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1043, N'登录查询', 501, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:logininfor:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1044, N'登录删除', 501, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:logininfor:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1045, N'日志导出', 501, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:logininfor:export', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1050, N'账户解锁', 501, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:logininfor:unlock',  N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1046, N'在线查询', 109, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:online:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1047, N'批量强退', 109, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:online:batchLogout', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1048, N'单条强退', 109, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'monitor:online:forceLogout', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1055, N'生成查询', 115, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'tool:gen:query', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1056, N'生成修改', 115, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1057, N'生成删除', 115, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'tool:gen:remove', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1058, N'导入代码', 115, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'tool:gen:import', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1059, N'预览代码', 115, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'tool:gen:preview', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_menu VALUES (1060, N'生成代码', 115, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'tool:gen:code', N'#', 103, 1, getdate(), NULL, NULL, N'')
+GO
+-- oss相关按钮
+INSERT sys_menu VALUES (1600, N'文件查询', 118, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:oss:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1601, N'文件上传', 118, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:oss:upload', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1602, N'文件下载', 118, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:oss:download', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1603, N'文件删除', 118, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:oss:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1604, N'配置添加', 118, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:oss:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1605, N'配置编辑', 118, 6, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:oss:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+-- 租户管理相关按钮
+INSERT sys_menu VALUES (1606, N'租户查询', 121, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenant:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1607, N'租户新增', 121, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenant:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1608, N'租户修改', 121, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenant:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1609, N'租户删除', 121, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenant:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1610, N'租户导出', 121, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenant:export', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+-- 租户套餐管理相关按钮
+INSERT sys_menu VALUES (1611, N'租户套餐查询', 122, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenantPackage:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1612, N'租户套餐新增', 122, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenantPackage:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1613, N'租户套餐修改', 122, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenantPackage:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1614, N'租户套餐删除', 122, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenantPackage:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1615, N'租户套餐导出', 122, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:tenantPackage:export', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+-- 客户端管理按钮
+INSERT sys_menu VALUES (1061, N'客户端管理查询', 123, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1062, N'客户端管理新增', 123, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1063, N'客户端管理修改', 123, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1064, N'客户端管理删除', 123, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1065, N'客户端管理导出', 123, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:export', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+
+CREATE TABLE sys_notice
+(
+    notice_id      bigint                     NOT NULL,
+    tenant_id      nvarchar(20) DEFAULT ('000000') NULL,
+    notice_title   nvarchar(50)               NOT NULL,
+    notice_type    nchar(1)                   NOT NULL,
+    notice_content nvarchar(max)              NULL,
+    status         nchar(1)     DEFAULT ('0') NULL,
+    create_dept    bigint                     NULL,
+    create_by      bigint                     NULL,
+    create_time    datetime2(7)               NULL,
+    update_by      bigint                     NULL,
+    update_time    datetime2(7)               NULL,
+    remark         nvarchar(255)              NULL,
+    CONSTRAINT PK__sys_noti__3E82A5DB0EC94801 PRIMARY KEY CLUSTERED (notice_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+TEXTIMAGE_ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'公告ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'notice_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'公告标题' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'notice_title'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'公告类型(1通知 2公告)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'notice_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'公告内容' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'notice_content'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'公告状态(0正常 1关闭)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'通知公告表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_notice'
+GO
+
+INSERT sys_notice VALUES (1, N'000000', N'温馨提醒:2018-07-01 若依新版本发布啦', N'2', N'新版本内容', N'0', 103, 1, getdate(), NULL, NULL, N'管理员')
+GO
+INSERT sys_notice VALUES (2, N'000000', N'维护通知:2018-07-01 若依系统凌晨维护', N'1', N'维护内容', N'0', 103, 1, getdate(), NULL, NULL, N'管理员')
+GO
+
+CREATE TABLE sys_oper_log
+(
+    oper_id        bigint                       NOT NULL,
+    tenant_id      nvarchar(20)   DEFAULT ('000000') NULL,
+    title          nvarchar(50)   DEFAULT ''    NULL,
+    business_type  int            DEFAULT ((0)) NULL,
+    method         nvarchar(100)  DEFAULT ''    NULL,
+    request_method nvarchar(10)   DEFAULT ''    NULL,
+    operator_type  int            DEFAULT ((0)) NULL,
+    oper_name      nvarchar(50)   DEFAULT ''    NULL,
+    dept_name      nvarchar(50)   DEFAULT ''    NULL,
+    oper_url       nvarchar(255)  DEFAULT ''    NULL,
+    oper_ip        nvarchar(128)  DEFAULT ''    NULL,
+    oper_location  nvarchar(255)  DEFAULT ''    NULL,
+    oper_param     nvarchar(2000) DEFAULT ''    NULL,
+    json_result    nvarchar(2000) DEFAULT ''    NULL,
+    status         int            DEFAULT ((0)) NULL,
+    error_msg      nvarchar(2000) DEFAULT ''    NULL,
+    oper_time      datetime2(7)                 NULL,
+    cost_time      bigint         DEFAULT ((0)) NULL,
+    CONSTRAINT PK__sys_oper__34723BF9BD954573 PRIMARY KEY CLUSTERED (oper_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+CREATE NONCLUSTERED INDEX idx_sys_oper_log_bt ON sys_oper_log (business_type)
+GO
+CREATE NONCLUSTERED INDEX idx_sys_oper_log_s ON sys_oper_log (status)
+GO
+CREATE NONCLUSTERED INDEX idx_sys_oper_log_ot ON sys_oper_log (oper_time)
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'日志主键' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'oper_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'模块标题' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'title'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'业务类型(0其它 1新增 2修改 3删除)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'business_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'方法名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'method'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'请求方式' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'request_method'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'操作类别(0其它 1后台用户 2手机端用户)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'operator_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'操作人员' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'oper_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'部门名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'dept_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'请求URL' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'oper_url'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'主机地址' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'oper_ip'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'操作地点' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'oper_location'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'请求参数' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'oper_param'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'返回参数' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'json_result'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'操作状态(0正常 1异常)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'错误消息' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'error_msg'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'操作时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'oper_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'消耗时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log',
+    'COLUMN', N'cost_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'操作日志记录' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oper_log'
+GO
+
+CREATE TABLE sys_post
+(
+    post_id     bigint                          NOT NULL,
+    tenant_id   nvarchar(20) DEFAULT ('000000') NULL,
+    post_code   nvarchar(64)                    NOT NULL,
+    post_name   nvarchar(50)                    NOT NULL,
+    post_sort   int                             NOT NULL,
+    status      nchar(1)                        NOT NULL,
+    create_dept bigint                          NULL,
+    create_by   bigint                          NULL,
+    create_time datetime2(7)                    NULL,
+    update_by   bigint                          NULL,
+    update_time datetime2(7)                    NULL,
+    remark      nvarchar(500)                   NULL,
+    CONSTRAINT PK__sys_post__3ED7876668E2D081 PRIMARY KEY CLUSTERED (post_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'岗位ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'post_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'岗位编码' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'post_code'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'岗位名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'post_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'显示顺序' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'post_sort'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'状态(0正常 1停用)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'岗位信息表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_post'
+GO
+
+INSERT sys_post VALUES (1, N'000000', N'ceo', N'董事长', 1, N'0', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_post VALUES (2, N'000000', N'se', N'项目经理', 2, N'0', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_post VALUES (3, N'000000', N'hr', N'人力资源', 3, N'0', 103, 1, getdate(), NULL, NULL, N'')
+GO
+INSERT sys_post VALUES (4, N'000000', N'user', N'普通员工', 4, N'0', 103, 1, getdate(), NULL, NULL, N'')
+GO
+
+CREATE TABLE sys_role
+(
+    role_id             bigint                     NOT NULL,
+    tenant_id           nvarchar(20) DEFAULT ('000000') NULL,
+    role_name           nvarchar(30)               NOT NULL,
+    role_key            nvarchar(100)              NOT NULL,
+    role_sort           int                        NOT NULL,
+    data_scope          nchar(1)     DEFAULT ('1') NULL,
+    menu_check_strictly tinyint      DEFAULT ((1)) NULL,
+    dept_check_strictly tinyint      DEFAULT ((1)) NULL,
+    status              nchar(1)                   NOT NULL,
+    del_flag            nchar(1)     DEFAULT ('0') NULL,
+    create_dept         bigint                     NULL,
+    create_by           bigint                     NULL,
+    create_time         datetime2(7)               NULL,
+    update_by           bigint                     NULL,
+    update_time         datetime2(7)               NULL,
+    remark              nvarchar(500)              NULL,
+    CONSTRAINT PK__sys_role__760965CCF9383145 PRIMARY KEY CLUSTERED (role_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'role_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色名称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'role_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色权限字符串' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'role_key'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'显示顺序' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'role_sort'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'data_scope'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'菜单树选择项是否关联显示' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'menu_check_strictly'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'部门树选择项是否关联显示' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'dept_check_strictly'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色状态(0正常 1停用)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'删除标志(0代表存在 2代表删除)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色信息表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role'
+GO
+
+INSERT sys_role VALUES (1, N'000000', N'超级管理员', N'superadmin', 1, N'1', 1, 1, N'0', N'0', 103, 1, getdate(), NULL, NULL, N'超级管理员')
+GO
+INSERT sys_role VALUES (2, N'000000', N'普通角色', N'common', 2, N'2', 1, 1, N'0', N'0', 103, 1, getdate(), NULL, NULL, N'普通角色')
+GO
+
+CREATE TABLE sys_role_dept
+(
+    role_id bigint NOT NULL,
+    dept_id bigint NOT NULL,
+    CONSTRAINT PK__sys_role__2BC3005BABBCA08A PRIMARY KEY CLUSTERED (role_id, dept_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role_dept',
+    'COLUMN', N'role_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'部门ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role_dept',
+    'COLUMN', N'dept_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色和部门关联表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role_dept'
+GO
+
+INSERT sys_role_dept VALUES (2, 100)
+GO
+INSERT sys_role_dept VALUES (2, 101)
+GO
+INSERT sys_role_dept VALUES (2, 105)
+GO
+
+CREATE TABLE sys_role_menu
+(
+    role_id bigint NOT NULL,
+    menu_id bigint NOT NULL,
+    CONSTRAINT PK__sys_role__A2C36A6187BA4B17 PRIMARY KEY CLUSTERED (role_id, menu_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role_menu',
+    'COLUMN', N'role_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'菜单ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role_menu',
+    'COLUMN', N'menu_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色和菜单关联表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_role_menu'
+GO
+
+INSERT sys_role_menu VALUES (2, 1)
+GO
+INSERT sys_role_menu VALUES (2, 2)
+GO
+INSERT sys_role_menu VALUES (2, 3)
+GO
+INSERT sys_role_menu VALUES (2, 100)
+GO
+INSERT sys_role_menu VALUES (2, 101)
+GO
+INSERT sys_role_menu VALUES (2, 102)
+GO
+INSERT sys_role_menu VALUES (2, 103)
+GO
+INSERT sys_role_menu VALUES (2, 104)
+GO
+INSERT sys_role_menu VALUES (2, 105)
+GO
+INSERT sys_role_menu VALUES (2, 106)
+GO
+INSERT sys_role_menu VALUES (2, 107)
+GO
+INSERT sys_role_menu VALUES (2, 108)
+GO
+INSERT sys_role_menu VALUES (2, 109)
+GO
+INSERT sys_role_menu VALUES (2, 110)
+GO
+INSERT sys_role_menu VALUES (2, 111)
+GO
+INSERT sys_role_menu VALUES (2, 112)
+GO
+INSERT sys_role_menu VALUES (2, 113)
+GO
+INSERT sys_role_menu VALUES (2, 114)
+GO
+INSERT sys_role_menu VALUES (2, 115)
+GO
+INSERT sys_role_menu VALUES (2, 116)
+GO
+INSERT sys_role_menu VALUES (2, 500)
+GO
+INSERT sys_role_menu VALUES (2, 501)
+GO
+INSERT sys_role_menu VALUES (2, 1001)
+GO
+INSERT sys_role_menu VALUES (2, 1002)
+GO
+INSERT sys_role_menu VALUES (2, 1003)
+GO
+INSERT sys_role_menu VALUES (2, 1004)
+GO
+INSERT sys_role_menu VALUES (2, 1005)
+GO
+INSERT sys_role_menu VALUES (2, 1006)
+GO
+INSERT sys_role_menu VALUES (2, 1007)
+GO
+INSERT sys_role_menu VALUES (2, 1008)
+GO
+INSERT sys_role_menu VALUES (2, 1009)
+GO
+INSERT sys_role_menu VALUES (2, 1010)
+GO
+INSERT sys_role_menu VALUES (2, 1011)
+GO
+INSERT sys_role_menu VALUES (2, 1012)
+GO
+INSERT sys_role_menu VALUES (2, 1013)
+GO
+INSERT sys_role_menu VALUES (2, 1014)
+GO
+INSERT sys_role_menu VALUES (2, 1015)
+GO
+INSERT sys_role_menu VALUES (2, 1016)
+GO
+INSERT sys_role_menu VALUES (2, 1017)
+GO
+INSERT sys_role_menu VALUES (2, 1018)
+GO
+INSERT sys_role_menu VALUES (2, 1019)
+GO
+INSERT sys_role_menu VALUES (2, 1020)
+GO
+INSERT sys_role_menu VALUES (2, 1021)
+GO
+INSERT sys_role_menu VALUES (2, 1022)
+GO
+INSERT sys_role_menu VALUES (2, 1023)
+GO
+INSERT sys_role_menu VALUES (2, 1024)
+GO
+INSERT sys_role_menu VALUES (2, 1025)
+GO
+INSERT sys_role_menu VALUES (2, 1026)
+GO
+INSERT sys_role_menu VALUES (2, 1027)
+GO
+INSERT sys_role_menu VALUES (2, 1028)
+GO
+INSERT sys_role_menu VALUES (2, 1029)
+GO
+INSERT sys_role_menu VALUES (2, 1030)
+GO
+INSERT sys_role_menu VALUES (2, 1031)
+GO
+INSERT sys_role_menu VALUES (2, 1032)
+GO
+INSERT sys_role_menu VALUES (2, 1033)
+GO
+INSERT sys_role_menu VALUES (2, 1034)
+GO
+INSERT sys_role_menu VALUES (2, 1035)
+GO
+INSERT sys_role_menu VALUES (2, 1036)
+GO
+INSERT sys_role_menu VALUES (2, 1037)
+GO
+INSERT sys_role_menu VALUES (2, 1038)
+GO
+INSERT sys_role_menu VALUES (2, 1039)
+GO
+INSERT sys_role_menu VALUES (2, 1040)
+GO
+INSERT sys_role_menu VALUES (2, 1041)
+GO
+INSERT sys_role_menu VALUES (2, 1042)
+GO
+INSERT sys_role_menu VALUES (2, 1043)
+GO
+INSERT sys_role_menu VALUES (2, 1044)
+GO
+INSERT sys_role_menu VALUES (2, 1045)
+GO
+INSERT sys_role_menu VALUES (2, 1046)
+GO
+INSERT sys_role_menu VALUES (2, 1047)
+GO
+INSERT sys_role_menu VALUES (2, 1048)
+GO
+INSERT sys_role_menu VALUES (2, 1049)
+GO
+INSERT sys_role_menu VALUES (2, 1050)
+GO
+INSERT sys_role_menu VALUES (2, 1051)
+GO
+INSERT sys_role_menu VALUES (2, 1052)
+GO
+INSERT sys_role_menu VALUES (2, 1053)
+GO
+INSERT sys_role_menu VALUES (2, 1054)
+GO
+INSERT sys_role_menu VALUES (2, 1055)
+GO
+INSERT sys_role_menu VALUES (2, 1056)
+GO
+INSERT sys_role_menu VALUES (2, 1057)
+GO
+INSERT sys_role_menu VALUES (2, 1058)
+GO
+INSERT sys_role_menu VALUES (2, 1059)
+GO
+INSERT sys_role_menu VALUES (2, 1060)
+GO
+INSERT sys_role_menu VALUES (2, 1061)
+GO
+INSERT sys_role_menu VALUES (2, 1062)
+GO
+INSERT sys_role_menu VALUES (2, 1063)
+GO
+INSERT sys_role_menu VALUES (2, 1064)
+GO
+INSERT sys_role_menu VALUES (2, 1065)
+GO
+
+CREATE TABLE sys_user
+(
+    user_id     bigint                             NOT NULL,
+    tenant_id   nvarchar(20)  DEFAULT ('000000')   NULL,
+    dept_id     bigint                             NULL,
+    user_name   nvarchar(30)                       NOT NULL,
+    nick_name   nvarchar(30)                       NOT NULL,
+    user_type   nvarchar(10)  DEFAULT ('sys_user') NULL,
+    email       nvarchar(50)  DEFAULT ''           NULL,
+    phonenumber nvarchar(11)  DEFAULT ''           NULL,
+    sex         nchar(1)      DEFAULT ('0')        NULL,
+    avatar      bigint                             NULL,
+    password    nvarchar(100) DEFAULT ''           NULL,
+    status      nchar(1)      DEFAULT ('0')        NULL,
+    del_flag    nchar(1)      DEFAULT ('0')        NULL,
+    login_ip    nvarchar(128) DEFAULT ''           NULL,
+    login_date  datetime2(7)                       NULL,
+    create_dept bigint                             NULL,
+    create_by   bigint                             NULL,
+    create_time datetime2(7)                       NULL,
+    update_by   bigint                             NULL,
+    update_time datetime2(7)                       NULL,
+    remark      nvarchar(500)                      NULL,
+    CONSTRAINT PK__sys_user__B9BE370F79170B6A PRIMARY KEY CLUSTERED (user_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'user_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'部门ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'dept_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户账号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'user_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户昵称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'nick_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户类型(sys_user系统用户)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'user_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户邮箱' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'email'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'手机号码' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'phonenumber'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户性别(0男 1女 2未知)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'sex'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'头像地址' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'avatar'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'密码' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'password'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'帐号状态(0正常 1停用)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'status'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'删除标志(0代表存在 2代表删除)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'最后登录IP' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'login_ip'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'最后登录时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'login_date'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'备注' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user',
+    'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户信息表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user'
+GO
+
+INSERT sys_user VALUES (1, N'000000', 103,  N'admin', N'疯狂的狮子Li', N'sys_user', N'crazyLionLi@163.com', N'15888888888', N'1', NULL, N'$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', N'0', N'0', N'127.0.0.1', getdate(), 103, 1, getdate(), NULL, NULL, N'管理员')
+GO
+INSERT sys_user VALUES (2, N'000000', 105,  N'lionli', N'疯狂的狮子Li', N'sys_user', N'crazyLionLi@qq.com', N'15666666666', N'1', NULL, N'$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', N'0', N'0', N'127.0.0.1', getdate(), 103, 1, getdate(), NULL, NULL, N'测试员')
+GO
+
+CREATE TABLE sys_user_post
+(
+    user_id bigint NOT NULL,
+    post_id bigint NOT NULL,
+    CONSTRAINT PK__sys_user__CA534F799C04589B PRIMARY KEY CLUSTERED (user_id, post_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user_post',
+    'COLUMN', N'user_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'岗位ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user_post',
+    'COLUMN', N'post_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户与岗位关联表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user_post'
+GO
+
+INSERT sys_user_post VALUES (1, 1)
+GO
+INSERT sys_user_post VALUES (2, 2)
+GO
+
+CREATE TABLE sys_user_role
+(
+    user_id bigint NOT NULL,
+    role_id bigint NOT NULL,
+    CONSTRAINT PK__sys_user__6EDEA153FB34D8F0 PRIMARY KEY CLUSTERED (user_id, role_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user_role',
+    'COLUMN', N'user_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'角色ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user_role',
+    'COLUMN', N'role_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户和角色关联表' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_user_role'
+GO
+
+INSERT sys_user_role VALUES (1, 1)
+GO
+INSERT sys_user_role VALUES (2, 2)
+GO
+
+CREATE TABLE sys_oss
+(
+    oss_id        bigint                          NOT NULL,
+    tenant_id     nvarchar(20)  DEFAULT ('000000') NULL,
+    file_name     nvarchar(255) DEFAULT ''        NOT NULL,
+    original_name nvarchar(255) DEFAULT ''        NOT NULL,
+    file_suffix   nvarchar(10)  DEFAULT ''        NOT NULL,
+    url           nvarchar(500)                   NOT NULL,
+    create_dept   bigint                          NULL,
+    create_time   datetime2(7)                    NULL,
+    create_by     bigint                          NULL,
+    update_time   datetime2(7)                    NULL,
+    update_by     bigint                          NULL,
+    service       nvarchar(20)  DEFAULT ('minio') NOT NULL,
+    CONSTRAINT PK__sys_oss__91241EA442389F0D PRIMARY KEY CLUSTERED (oss_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sp_addextendedproperty
+    'MS_Description', N'对象存储主键',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'oss_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'文件名',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'file_name'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'原名',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'original_name'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'文件后缀名',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'file_suffix'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'URL地址',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'url'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'create_dept'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'创建时间',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'create_time'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'上传人',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'create_by'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'更新时间',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'update_time'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'更新人',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'update_by'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'服务商',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss',
+    'COLUMN', N'service'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'OSS对象存储表',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss'
+GO
+
+CREATE TABLE sys_oss_config
+(
+    oss_config_id bigint                      NOT NULL,
+    tenant_id     nvarchar(20)  DEFAULT ('000000') NULL,
+    config_key    nvarchar(20)  DEFAULT ''    NOT NULL,
+    access_key    nvarchar(255) DEFAULT ''    NULL,
+    secret_key    nvarchar(255) DEFAULT ''    NULL,
+    bucket_name   nvarchar(255) DEFAULT ''    NULL,
+    prefix        nvarchar(255) DEFAULT ''    NULL,
+    endpoint      nvarchar(255) DEFAULT ''    NULL,
+    domain        nvarchar(255) DEFAULT ''    NULL,
+    is_https      nchar(1)      DEFAULT ('N') NULL,
+    region        nvarchar(255) DEFAULT ''    NULL,
+    access_policy nchar(1)      DEFAULT ('1') NOT NULL,
+    status        nchar(1)      DEFAULT ('1') NULL,
+    ext1          nvarchar(255) DEFAULT ''    NULL,
+    create_dept   bigint                      NULL,
+    create_by     bigint                      NULL,
+    create_time   datetime2(7)                NULL,
+    update_by     bigint                      NULL,
+    update_time   datetime2(7)                NULL,
+    remark        nvarchar(500)               NULL,
+    CONSTRAINT PK__sys_oss___BFBDE87009ED2882 PRIMARY KEY CLUSTERED (oss_config_id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sp_addextendedproperty
+    'MS_Description', N'主建',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'oss_config_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户编号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'配置key',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'config_key'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'accessKey',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'access_key'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'秘钥',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'secret_key'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'桶名称',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'bucket_name'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'前缀',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'prefix'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'访问站点',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'endpoint'
+GO
+EXEC sp_addextendedproperty
+     'MS_Description', N'自定义域名',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sys_oss_config',
+     'COLUMN', N'domain'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'是否https(Y=是,N=否)',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'is_https'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'域',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'region'
+GO
+EXEC sp_addextendedproperty
+     'MS_Description', N'桶权限类型(0=private 1=public 2=custom)',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sys_oss_config',
+     'COLUMN', N'access_policy'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'是否默认(0=是,1=否)',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'status'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'扩展字段',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'ext1'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'create_dept'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'创建者',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'create_by'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'创建时间',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'create_time'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'更新者',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'update_by'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'更新时间',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'update_time'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'备注',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config',
+    'COLUMN', N'remark'
+GO
+EXEC sp_addextendedproperty
+    'MS_Description', N'对象存储配置表',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_oss_config'
+GO
+
+INSERT INTO sys_oss_config VALUES (N'1', N'000000', N'minio', N'ruoyi',            N'ruoyi123',        N'ruoyi',            N'', N'127.0.0.1:9000',                    N'',N'N', N'',           N'1', N'0', N'', 103, 1, getdate(), 1, getdate(), NULL)
+GO
+INSERT INTO sys_oss_config VALUES (N'2', N'000000', N'qiniu', N'XXXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi',            N'', N's3-cn-north-1.qiniucs.com',         N'',N'N', N'',           N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL)
+GO
+INSERT INTO sys_oss_config VALUES (N'3', N'000000', N'aliyun', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi',            N'', N'oss-cn-beijing.aliyuncs.com',       N'',N'N', N'',           N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL)
+GO
+INSERT INTO sys_oss_config VALUES (N'4', N'000000', N'qcloud', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi-1250000000', N'', N'cos.ap-beijing.myqcloud.com',       N'',N'N', N'ap-beijing', N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL)
+GO
+INSERT INTO sys_oss_config VALUES (N'5', N'000000', N'image',  N'ruoyi',           N'ruoyi123',        N'ruoyi',            N'image', N'127.0.0.1:9000',               N'',N'N', N'',           N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL)
+GO
+
+
+CREATE TABLE sys_client
+(
+    id                  bigint                              NOT NULL,
+    client_id           nvarchar(64)  DEFAULT ''            NULL,
+    client_key          nvarchar(32) DEFAULT ''            NULL,
+    client_secret       nvarchar(255) DEFAULT ''            NULL,
+    grant_type          nvarchar(255) DEFAULT ''            NULL,
+    device_type         nvarchar(32) DEFAULT ''            NULL,
+    active_timeout      int           DEFAULT ((1800))      NULL,
+    timeout             int           DEFAULT ((604800))    NULL,
+    status              nchar(1)      DEFAULT ('0')         NULL,
+    del_flag            nchar(1)      DEFAULT ('0')         NULL,
+    create_dept         bigint                              NULL,
+    create_by           bigint                              NULL,
+    create_time         datetime2(7)                        NULL,
+    update_by           bigint                              NULL,
+    update_time         datetime2(7)                        NULL
+    CONSTRAINT PK__sys_client___BFBDE87009ED2882 PRIMARY KEY CLUSTERED (id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'主建',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'id'
+GO
+EXEC sys.sp_addextendedproperty
+'MS_Description', N'客户端id' ,
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'client_id'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'客户端key',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'client_key'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'客户端秘钥',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'client_secret'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'授权类型',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'grant_type'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'设备类型',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'device_type'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'token活跃超时时间',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'active_timeout'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'token固定超时',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'timeout'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'状态(0正常 1停用)',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'status'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'删除标志(0代表存在 2代表删除)',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+'MS_Description', N'创建部门' ,
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'create_dept'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'创建者',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'create_by'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'创建时间',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'create_time'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'更新者',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'update_by'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'更新时间',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'update_time'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'系统授权表',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client'
+GO
+
+INSERT INTO sys_client VALUES (N'1', N'e5cd7e4891bf95d1d19206ce24a7b32e', N'pc', N'pc123', N'password,social', N'pc', 1800, 604800, N'0', N'0', 103, 1, getdate(), 1, getdate())
+GO
+INSERT INTO sys_client VALUES (N'2', N'428a8310cd442757ae699df5d894f051', N'app', N'app123', N'password,sms,social', N'android', 1800, 604800, N'0', N'0', 103, 1, getdate(), 1, getdate())
+GO

+ 510 - 0
script/sql/sqlserver/sqlserver_test.sql

@@ -0,0 +1,510 @@
+CREATE TABLE test_demo
+(
+    id          bigint            NOT NULL,
+    tenant_id   nvarchar(20)      DEFAULT ('000000') NULL,
+    dept_id     bigint            NULL,
+    user_id     bigint            NULL,
+    order_num   int DEFAULT ((0)) NULL,
+    test_key    nvarchar(255)     NULL,
+    value       nvarchar(255)     NULL,
+    version     int DEFAULT ((0)) NULL,
+    create_dept bigint            NULL,
+    create_time datetime2(0)      NULL,
+    create_by   bigint            NULL,
+    update_time datetime2(0)      NULL,
+    update_by   bigint            NULL,
+    del_flag    int DEFAULT ((0)) NULL,
+    CONSTRAINT PK__test_dem__3213E83F176051C8 PRIMARY KEY CLUSTERED (id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'主键',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'id'
+GO
+
+EXEC sp_addextendedproperty
+    'MS_Description', N'租户id',
+    'SCHEMA', N'dbo',
+    'TABLE', N'test_demo',
+    'COLUMN', N'tenant_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'部门id',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'dept_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'用户id',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'user_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'排序号',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'order_num'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'key键',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'test_key'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'值',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'value'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'版本',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'version'
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'test_demo',
+    'COLUMN', N'create_dept'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'创建时间',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'create_time'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'创建人',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'create_by'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'更新时间',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'update_time'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'更新人',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'update_by'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'删除标志',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo',
+     'COLUMN', N'del_flag'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'测试单表',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_demo'
+GO
+
+CREATE TABLE test_tree
+(
+    id          bigint               NOT NULL,
+    tenant_id   nvarchar(20)         DEFAULT ('000000') NULL,
+    parent_id   bigint DEFAULT ((0)) NULL,
+    dept_id     bigint               NULL,
+    user_id     bigint               NULL,
+    tree_name   nvarchar(255)        NULL,
+    version     int    DEFAULT ((0)) NULL,
+    create_dept bigint               NULL,
+    create_time datetime2(0)         NULL,
+    create_by   bigint               NULL,
+    update_time datetime2(0)         NULL,
+    update_by   bigint               NULL,
+    del_flag    int    DEFAULT ((0)) NULL,
+    CONSTRAINT PK__test_tre__3213E83FC75A1B63 PRIMARY KEY CLUSTERED (id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'主键',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'id'
+GO
+
+EXEC sp_addextendedproperty
+    'MS_Description', N'租户id',
+    'SCHEMA', N'dbo',
+    'TABLE', N'test_tree',
+    'COLUMN', N'tenant_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'父id',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'parent_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'部门id',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'dept_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'用户id',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'user_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'值',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'tree_name'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'版本',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'version'
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'test_tree',
+    'COLUMN', N'create_dept'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'创建时间',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'create_time'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'创建人',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'create_by'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'更新时间',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'update_time'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'更新人',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'update_by'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'删除标志',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree',
+     'COLUMN', N'del_flag'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'测试树表',
+     'SCHEMA', N'dbo',
+     'TABLE', N'test_tree'
+GO
+
+INSERT sys_user VALUES (3, N'000000', 108, N'test', N'本部门及以下 密码666666', N'sys_user', N'', N'', N'0', NULL, N'$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', N'0', N'0', N'127.0.0.1', getdate(), 103, 1, getdate(), 3, getdate(), NULL);
+GO
+INSERT sys_user VALUES (4, N'000000', 102, N'test1', N'仅本人 密码666666', N'sys_user', N'', N'', N'0', NULL, N'$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', N'0', N'0', N'127.0.0.1', getdate(), 103, 1, getdate(), 4, getdate(), NULL);
+GO
+
+INSERT sys_menu VALUES (5, N'测试菜单', 0, 5, N'demo', NULL, 1, 0, N'M', N'0', N'0', NULL, N'star', 103, 1, getdate(), NULL, NULL, N'');
+GO
+
+INSERT sys_menu VALUES (1500, N'测试单表', 5, 1, N'demo', N'demo/demo/index', 1, 0, N'C', N'0', N'0', N'demo:demo:list', N'#', 103, 1, getdate(), NULL, NULL, N'测试单表菜单');
+GO
+INSERT sys_menu VALUES (1501, N'测试单表查询', 1500, 1, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1502, N'测试单表新增', 1500, 2, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1503, N'测试单表修改', 1500, 3, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1504, N'测试单表删除', 1500, 4, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1505, N'测试单表导出', 1500, 5, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:export', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+
+INSERT sys_menu VALUES (1506, N'测试树表', 5, 1, N'tree', N'demo/tree/index', 1, 0, N'C', N'0', N'0', N'demo:tree:list', N'#', 103, 1, getdate(), NULL, NULL, N'测试树表菜单');
+GO
+INSERT sys_menu VALUES (1507, N'测试树表查询', 1506, 1, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1508, N'测试树表新增', 1506, 2, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1509, N'测试树表修改', 1506, 3, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1510, N'测试树表删除', 1506, 4, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1511, N'测试树表导出', 1506, 5, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:export', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+
+INSERT sys_role VALUES (3, N'000000', N'本部门及以下', N'test1', 3, N'4', 1, 1, N'0', N'0', 103, 1, getdate(), 1, NULL, NULL);
+GO
+INSERT sys_role VALUES (4, N'000000', N'仅本人', N'test2', 4, N'5', 1, 1, N'0', N'0', 103, 1, getdate(), 1, NULL, NULL);
+GO
+
+INSERT sys_role_menu VALUES (3, 1);
+GO
+INSERT sys_role_menu VALUES (3, 5);
+GO
+INSERT sys_role_menu VALUES (3, 100);
+GO
+INSERT sys_role_menu VALUES (3, 101);
+GO
+INSERT sys_role_menu VALUES (3, 102);
+GO
+INSERT sys_role_menu VALUES (3, 103);
+GO
+INSERT sys_role_menu VALUES (3, 104);
+GO
+INSERT sys_role_menu VALUES (3, 105);
+GO
+INSERT sys_role_menu VALUES (3, 106);
+GO
+INSERT sys_role_menu VALUES (3, 107);
+GO
+INSERT sys_role_menu VALUES (3, 108);
+GO
+INSERT sys_role_menu VALUES (3, 500);
+GO
+INSERT sys_role_menu VALUES (3, 501);
+GO
+INSERT sys_role_menu VALUES (3, 1001);
+GO
+INSERT sys_role_menu VALUES (3, 1002);
+GO
+INSERT sys_role_menu VALUES (3, 1003);
+GO
+INSERT sys_role_menu VALUES (3, 1004);
+GO
+INSERT sys_role_menu VALUES (3, 1005);
+GO
+INSERT sys_role_menu VALUES (3, 1006);
+GO
+INSERT sys_role_menu VALUES (3, 1007);
+GO
+INSERT sys_role_menu VALUES (3, 1008);
+GO
+INSERT sys_role_menu VALUES (3, 1009);
+GO
+INSERT sys_role_menu VALUES (3, 1010);
+GO
+INSERT sys_role_menu VALUES (3, 1011);
+GO
+INSERT sys_role_menu VALUES (3, 1012);
+GO
+INSERT sys_role_menu VALUES (3, 1013);
+GO
+INSERT sys_role_menu VALUES (3, 1014);
+GO
+INSERT sys_role_menu VALUES (3, 1015);
+GO
+INSERT sys_role_menu VALUES (3, 1016);
+GO
+INSERT sys_role_menu VALUES (3, 1017);
+GO
+INSERT sys_role_menu VALUES (3, 1018);
+GO
+INSERT sys_role_menu VALUES (3, 1019);
+GO
+INSERT sys_role_menu VALUES (3, 1020);
+GO
+INSERT sys_role_menu VALUES (3, 1021);
+GO
+INSERT sys_role_menu VALUES (3, 1022);
+GO
+INSERT sys_role_menu VALUES (3, 1023);
+GO
+INSERT sys_role_menu VALUES (3, 1024);
+GO
+INSERT sys_role_menu VALUES (3, 1025);
+GO
+INSERT sys_role_menu VALUES (3, 1026);
+GO
+INSERT sys_role_menu VALUES (3, 1027);
+GO
+INSERT sys_role_menu VALUES (3, 1028);
+GO
+INSERT sys_role_menu VALUES (3, 1029);
+GO
+INSERT sys_role_menu VALUES (3, 1030);
+GO
+INSERT sys_role_menu VALUES (3, 1031);
+GO
+INSERT sys_role_menu VALUES (3, 1032);
+GO
+INSERT sys_role_menu VALUES (3, 1033);
+GO
+INSERT sys_role_menu VALUES (3, 1034);
+GO
+INSERT sys_role_menu VALUES (3, 1035);
+GO
+INSERT sys_role_menu VALUES (3, 1036);
+GO
+INSERT sys_role_menu VALUES (3, 1037);
+GO
+INSERT sys_role_menu VALUES (3, 1038);
+GO
+INSERT sys_role_menu VALUES (3, 1039);
+GO
+INSERT sys_role_menu VALUES (3, 1040);
+GO
+INSERT sys_role_menu VALUES (3, 1041);
+GO
+INSERT sys_role_menu VALUES (3, 1042);
+GO
+INSERT sys_role_menu VALUES (3, 1043);
+GO
+INSERT sys_role_menu VALUES (3, 1044);
+GO
+INSERT sys_role_menu VALUES (3, 1045);
+GO
+INSERT sys_role_menu VALUES (3, 1500);
+GO
+INSERT sys_role_menu VALUES (3, 1501);
+GO
+INSERT sys_role_menu VALUES (3, 1502);
+GO
+INSERT sys_role_menu VALUES (3, 1503);
+GO
+INSERT sys_role_menu VALUES (3, 1504);
+GO
+INSERT sys_role_menu VALUES (3, 1505);
+GO
+INSERT sys_role_menu VALUES (3, 1506);
+GO
+INSERT sys_role_menu VALUES (3, 1507);
+GO
+INSERT sys_role_menu VALUES (3, 1508);
+GO
+INSERT sys_role_menu VALUES (3, 1509);
+GO
+INSERT sys_role_menu VALUES (3, 1510);
+GO
+INSERT sys_role_menu VALUES (3, 1511);
+GO
+INSERT sys_role_menu VALUES (4, 5);
+GO
+INSERT sys_role_menu VALUES (4, 1500);
+GO
+INSERT sys_role_menu VALUES (4, 1501);
+GO
+INSERT sys_role_menu VALUES (4, 1502);
+GO
+INSERT sys_role_menu VALUES (4, 1503);
+GO
+INSERT sys_role_menu VALUES (4, 1504);
+GO
+INSERT sys_role_menu VALUES (4, 1505);
+GO
+INSERT sys_role_menu VALUES (4, 1506);
+GO
+INSERT sys_role_menu VALUES (4, 1507);
+GO
+INSERT sys_role_menu VALUES (4, 1508);
+GO
+INSERT sys_role_menu VALUES (4, 1509);
+GO
+INSERT sys_role_menu VALUES (4, 1510);
+GO
+INSERT sys_role_menu VALUES (4, 1511);
+GO
+
+INSERT sys_user_role VALUES (3, 3);
+GO
+INSERT sys_user_role VALUES (4, 4);
+GO
+
+INSERT test_demo VALUES (1, N'000000', 102, 4, 1, N'测试数据权限', N'测试', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (2, N'000000', 102, 3, 2, N'子节点1', N'111', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (3, N'000000', 102, 3, 3, N'子节点2', N'222', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (4, N'000000', 108, 4, 4, N'测试数据', N'demo', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (5, N'000000', 108, 3, 13, N'子节点11', N'1111', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (6, N'000000', 108, 3, 12, N'子节点22', N'2222', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (7, N'000000', 108, 3, 11, N'子节点33', N'3333', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (8, N'000000', 108, 3, 10, N'子节点44', N'4444', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (9, N'000000', 108, 3, 9, N'子节点55', N'5555', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (10, N'000000', 108, 3, 8, N'子节点66', N'6666', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (11, N'000000', 108, 3, 7, N'子节点77', N'7777', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (12, N'000000', 108, 3, 6, N'子节点88', N'8888', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_demo VALUES (13, N'000000', 108, 3, 5, N'子节点99', N'9999', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+
+INSERT test_tree VALUES (1, N'000000', 0, 102, 4, N'测试数据权限', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (2, N'000000', 1, 102, 3, N'子节点1', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (3, N'000000', 2, 102, 3, N'子节点2', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (4, N'000000', 0, 108, 4, N'测试树1', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (5, N'000000', 4, 108, 3, N'子节点11', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (6, N'000000', 4, 108, 3, N'子节点22', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (7, N'000000', 4, 108, 3, N'子节点33', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (8, N'000000', 5, 108, 3, N'子节点44', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (9, N'000000', 6, 108, 3, N'子节点55', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (10, N'000000', 7, 108, 3, N'子节点66', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (11, N'000000', 7, 108, 3, N'子节点77', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (12, N'000000', 10, 108, 3, N'子节点88', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO
+INSERT test_tree VALUES (13, N'000000', 10, 108, 3, N'子节点99', 0, 103, getdate(), 1, NULL, NULL, 0);
+GO

+ 175 - 0
script/sql/test.sql

@@ -0,0 +1,175 @@
+DROP TABLE if EXISTS test_demo;
+CREATE TABLE test_demo
+(
+    id          bigint(0)    NOT NULL COMMENT '主键',
+    tenant_id   varchar(20)  NULL DEFAULT '000000' COMMENT '租户编号',
+    dept_id     bigint(0)    NULL DEFAULT NULL COMMENT '部门id',
+    user_id     bigint(0)    NULL DEFAULT NULL COMMENT '用户id',
+    order_num   int(0)       NULL DEFAULT 0 COMMENT '排序号',
+    test_key    varchar(255) NULL DEFAULT NULL COMMENT 'key键',
+    value       varchar(255) NULL DEFAULT NULL COMMENT '值',
+    version     int(0)       NULL DEFAULT 0 COMMENT '版本',
+    create_dept bigint(0)    NULL DEFAULT NULL COMMENT '创建部门',
+    create_time datetime(0)  NULL DEFAULT NULL COMMENT '创建时间',
+    create_by   bigint(0)    NULL DEFAULT NULL COMMENT '创建人',
+    update_time datetime(0)  NULL DEFAULT NULL COMMENT '更新时间',
+    update_by   bigint(0)    NULL DEFAULT NULL COMMENT '更新人',
+    del_flag    int(0)       NULL DEFAULT 0 COMMENT '删除标志',
+    PRIMARY KEY (id) USING BTREE
+) ENGINE = InnoDB COMMENT = '测试单表';
+
+DROP TABLE if EXISTS test_tree;
+CREATE TABLE test_tree
+(
+    id          bigint(0)    NOT NULL COMMENT '主键',
+    tenant_id   varchar(20)  NULL DEFAULT '000000' COMMENT '租户编号',
+    parent_id   bigint(0)    NULL DEFAULT 0 COMMENT '父id',
+    dept_id     bigint(0)    NULL DEFAULT NULL COMMENT '部门id',
+    user_id     bigint(0)    NULL DEFAULT NULL COMMENT '用户id',
+    tree_name   varchar(255) NULL DEFAULT NULL COMMENT '值',
+    version     int(0)       NULL DEFAULT 0 COMMENT '版本',
+    create_dept bigint(0)    NULL DEFAULT NULL COMMENT '创建部门',
+    create_time datetime(0)  NULL DEFAULT NULL COMMENT '创建时间',
+    create_by   bigint(0)    NULL DEFAULT NULL COMMENT '创建人',
+    update_time datetime(0)  NULL DEFAULT NULL COMMENT '更新时间',
+    update_by   bigint(0)    NULL DEFAULT NULL COMMENT '更新人',
+    del_flag    int(0)       NULL DEFAULT 0 COMMENT '删除标志',
+    PRIMARY KEY (id) USING BTREE
+) ENGINE = InnoDB COMMENT = '测试树表';
+
+INSERT INTO sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 3, sysdate(), NULL);
+INSERT INTO sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 4, sysdate(), NULL);
+
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (5, '测试菜单', 0, 5, 'demo', NULL, 1, 0, 'M', '0', '0', NULL, 'star', 103, 1, sysdate(), NULL, NULL, '');
+
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1500, '测试单表', 5, 1, 'demo', 'demo/demo/index', 1, 0, 'C', '0', '0', 'demo:demo:list', '#', 103, 1, sysdate(), NULL, NULL, '测试单表菜单');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1501, '测试单表查询', 1500, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:query', '#', 103, 1, sysdate(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1502, '测试单表新增', 1500, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:add', '#', 103, 1, sysdate(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1503, '测试单表修改', 1500, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:edit', '#', 103, 1, sysdate(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1504, '测试单表删除', 1500, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:remove', '#', 103, 1, sysdate(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1505, '测试单表导出', 1500, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:demo:export', '#', 103, 1, sysdate(), NULL, NULL, '');
+
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1506, '测试树表', 5, 1, 'tree', 'demo/tree/index', 1, 0, 'C', '0', '0', 'demo:tree:list', '#', 103, 1, sysdate(), NULL, NULL, '测试树表菜单');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1507, '测试树表查询', 1506, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:query', '#', 103, 1, sysdate(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1508, '测试树表新增', 1506, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:add', '#', 103, 1, sysdate(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1509, '测试树表修改', 1506, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:edit', '#', 103, 1, sysdate(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1510, '测试树表删除', 1506, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, sysdate(), NULL, NULL, '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1511, '测试树表导出', 1506, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, sysdate(), NULL, NULL, '');
+
+INSERT INTO sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (3, '000000', '本部门及以下', 'test1', 3, '4', 1, 1, '0', '0', 103, 1, sysdate(), 1, NULL, NULL);
+INSERT INTO sys_role(role_id, tenant_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, del_flag, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (4, '000000', '仅本人', 'test2', 4, '5', 1, 1, '0', '0', 103, 1, sysdate(), 1, NULL, NULL);
+
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 5);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 100);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 101);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 102);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 103);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 104);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 105);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 106);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 107);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 108);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 500);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 501);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1001);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1002);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1003);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1004);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1005);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1006);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1007);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1008);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1009);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1010);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1011);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1012);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1013);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1014);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1015);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1016);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1017);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1018);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1019);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1020);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1021);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1022);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1023);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1024);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1025);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1026);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1027);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1028);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1029);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1030);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1031);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1032);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1033);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1034);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1035);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1036);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1037);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1038);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1039);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1040);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1041);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1042);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1043);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1044);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1045);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1500);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1501);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1502);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1503);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1504);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1505);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1506);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1507);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1508);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1509);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1510);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (3, 1511);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 5);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1500);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1501);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1502);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1503);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1504);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1505);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1506);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1507);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1508);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1509);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1510);
+INSERT INTO sys_role_menu(role_id, menu_id) VALUES (4, 1511);
+
+INSERT INTO sys_user_role(user_id, role_id) VALUES (3, 3);
+INSERT INTO sys_user_role(user_id, role_id) VALUES (4, 4);
+
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (1, '000000', 102, 4, 1, '测试数据权限', '测试', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (2, '000000', 102, 3, 2, '子节点1', '111', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (3, '000000', 102, 3, 3, '子节点2', '222', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (4, '000000', 108, 4, 4, '测试数据', 'demo', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (5, '000000', 108, 3, 13, '子节点11', '1111', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (6, '000000', 108, 3, 12, '子节点22', '2222', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (7, '000000', 108, 3, 11, '子节点33', '3333', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (8, '000000', 108, 3, 10, '子节点44', '4444', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (9, '000000', 108, 3, 9, '子节点55', '5555', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (10, '000000', 108, 3, 8, '子节点66', '6666', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (11, '000000', 108, 3, 7, '子节点77', '7777', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (12, '000000', 108, 3, 6, '子节点88', '8888', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_demo(id, tenant_id, dept_id, user_id, order_num, test_key, value, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (13, '000000', 108, 3, 5, '子节点99', '9999', 0, 103, sysdate(), 1, NULL, NULL, 0);
+
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (1, '000000', 0, 102, 4, '测试数据权限', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (2, '000000', 1, 102, 3, '子节点1', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (3, '000000', 2, 102, 3, '子节点2', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (4, '000000', 0, 108, 4, '测试树1', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (5, '000000', 4, 108, 3, '子节点11', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (6, '000000', 4, 108, 3, '子节点22', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (7, '000000', 4, 108, 3, '子节点33', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (8, '000000', 5, 108, 3, '子节点44', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (9, '000000', 6, 108, 3, '子节点55', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (10, '000000', 7, 108, 3, '子节点66', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (11, '000000', 7, 108, 3, '子节点77', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (12, '000000', 10, 108, 3, '子节点88', 0, 103, sysdate(), 1, NULL, NULL, 0);
+INSERT INTO test_tree(id, tenant_id, parent_id, dept_id, user_id, tree_name, version, create_dept, create_time, create_by, update_time, update_by, del_flag) VALUES (13, '000000', 10, 108, 3, '子节点99', 0, 103, sysdate(), 1, NULL, NULL, 0);

+ 151 - 0
script/sql/update/oracle/update_5.0-5.1.sql

@@ -0,0 +1,151 @@
+ALTER TABLE gen_table ADD (data_name VARCHAR2(200) DEFAULT '');
+
+COMMENT ON COLUMN gen_table.data_name IS '数据源名称';
+
+UPDATE sys_menu SET path = 'powerjob', component = 'monitor/powerjob/index', perms = 'monitor:powerjob:list', remark = 'powerjob控制台菜单' WHERE menu_id = 120;
+
+-- ----------------------------
+-- 第三方平台授权表
+-- ----------------------------
+create table sys_social
+(
+    id                 number(20)       not null,
+    user_id            number(20)       not null,
+    tenant_id          varchar2(20)      default null,
+    auth_id            varchar2(255)     not null,
+    source             varchar2(255)     not null,
+    open_id            varchar2(255)     default null,
+    user_name          varchar2(30)      not null,
+    nick_name          varchar2(30)      default '',
+    email              varchar2(255)     default '',
+    avatar             varchar2(500)     default '',
+    access_token       varchar2(255)     not null,
+    expire_in          number(20)        default null,
+    refresh_token      varchar2(255)     default null,
+    access_code        varchar2(255)     default null,
+    union_id           varchar2(255)     default null,
+    scope              varchar2(255)     default null,
+    token_type         varchar2(255)     default null,
+    id_token           varchar2(255)     default null,
+    mac_algorithm      varchar2(255)     default null,
+    mac_key            varchar2(255)     default null,
+    code               varchar2(255)     default null,
+    oauth_token        varchar2(255)     default null,
+    oauth_token_secret varchar2(255)     default null,
+    create_dept        number(20),
+    create_by          number(20),
+    create_time        date,
+    update_by          number(20),
+    update_time        date,
+    del_flag           char(1)          default '0'
+);
+
+alter table sys_social add constraint pk_sys_social primary key (id);
+
+comment on table   sys_social                   is '社会化关系表';
+comment on column  sys_social.id                is '主键';
+comment on column  sys_social.user_id           is '用户ID';
+comment on column  sys_social.tenant_id         is '租户id';
+comment on column  sys_social.auth_id           is '平台+平台唯一id';
+comment on column  sys_social.source            is '用户来源';
+comment on column  sys_social.open_id           is '平台编号唯一id';
+comment on column  sys_social.user_name         is '登录账号';
+comment on column  sys_social.nick_name         is '用户昵称';
+comment on column  sys_social.email             is '用户邮箱';
+comment on column  sys_social.avatar            is '头像地址';
+comment on column  sys_social.access_token      is '用户的授权令牌';
+comment on column  sys_social.expire_in         is '用户的授权令牌的有效期,部分平台可能没有';
+comment on column  sys_social.refresh_token     is '刷新令牌,部分平台可能没有';
+comment on column  sys_social.access_code       is '平台的授权信息,部分平台可能没有';
+comment on column  sys_social.union_id          is '用户的 unionid';
+comment on column  sys_social.scope             is '授予的权限,部分平台可能没有';
+comment on column  sys_social.token_type        is '个别平台的授权信息,部分平台可能没有';
+comment on column  sys_social.id_token          is 'id token,部分平台可能没有';
+comment on column  sys_social.mac_algorithm     is '小米平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.mac_key           is '小米平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.code              is '用户的授权code,部分平台可能没有';
+comment on column  sys_social.oauth_token       is 'Twitter平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.oauth_token_secret is 'Twitter平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.create_dept       is '创建部门';
+comment on column  sys_social.create_by         is '创建者';
+comment on column  sys_social.create_time       is '创建时间';
+comment on column  sys_social.update_by         is '更新者';
+comment on column  sys_social.update_time       is '更新时间';
+comment on column  sys_social.del_flag          is '删除标志(0代表存在 2代表删除)';
+
+
+-- ----------------------------
+-- 系统授权表
+-- ----------------------------
+create table sys_client (
+    id                  number(20)    not null,
+    client_id           varchar2(64)   default null,
+    client_key          varchar2(32)   default null,
+    client_secret       varchar2(255)  default null,
+    grant_type          varchar2(255)  default null,
+    device_type         varchar2(32)   default null,
+    active_timeout      number(11)    default 1800,
+    timeout             number(11)    default 604800,
+    status              char(1)       default '0',
+    del_flag            char(1)       default '0',
+    create_dept         number(20)    default null,
+    create_by           number(20)    default null,
+    create_time         date,
+    update_by           number(20)    default null,
+    update_time         date
+);
+
+alter table sys_client add constraint pk_sys_client primary key (id);
+
+comment on table sys_client                         is '系统授权表';
+comment on column sys_client.id                     is '主建';
+comment on column sys_client.client_id              is '客户端id';
+comment on column sys_client.client_key             is '客户端key';
+comment on column sys_client.client_secret          is '客户端秘钥';
+comment on column sys_client.grant_type             is '授权类型';
+comment on column sys_client.device_type            is '设备类型';
+comment on column sys_client.active_timeout         is 'token活跃超时时间';
+comment on column sys_client.timeout                is 'token固定超时';
+comment on column sys_client.status                 is '状态(0正常 1停用)';
+comment on column sys_client.del_flag               is '删除标志(0代表存在 2代表删除)';
+comment on column sys_client.create_dept            is '创建部门';
+comment on column sys_client.create_by              is '创建者';
+comment on column sys_client.create_time            is '创建时间';
+comment on column sys_client.update_by              is '更新者';
+comment on column sys_client.update_time            is '更新时间';
+
+insert into sys_client values (1, 'e5cd7e4891bf95d1d19206ce24a7b32e', 'pc', 'pc123', 'password,social', 'pc', 1800, 604800, 0, 0, 103, 1, sysdate, 1, sysdate);
+insert into sys_client values (2, '428a8310cd442757ae699df5d894f051', 'app', 'app123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 103, 1, sysdate, 1, sysdate);
+
+insert into sys_dict_type values(11, '000000', '授权类型', 'sys_grant_type',     '0', 103, 1, sysdate, null, null, '认证授权类型');
+insert into sys_dict_type values(12, '000000', '设备类型', 'sys_device_type',    '0', 103, 1, sysdate, null, null, '客户端设备类型');
+
+insert into sys_dict_data values(30, '000000', 0,  '密码认证', 'password',   'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate, null, null, '密码认证');
+insert into sys_dict_data values(31, '000000', 0,  '短信认证', 'sms',        'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate, null, null, '短信认证');
+insert into sys_dict_data values(32, '000000', 0,  '邮件认证', 'email',      'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate, null, null, '邮件认证');
+insert into sys_dict_data values(33, '000000', 0,  '小程序认证', 'xcx',      'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate, null, null, '小程序认证');
+insert into sys_dict_data values(34, '000000', 0,  '三方登录认证', 'social', 'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate, null, null, '三方登录认证');
+insert into sys_dict_data values(35, '000000', 0,  'PC',      'pc',          'sys_device_type',  '',   'default', 'N', '0', 103, 1, sysdate, null, null, 'PC');
+insert into sys_dict_data values(36, '000000', 0,  '安卓',     'android',    'sys_device_type',  '',   'default', 'N', '0', 103, 1, sysdate, null, null, '安卓');
+insert into sys_dict_data values(37, '000000', 0,  'iOS',     'ios',         'sys_device_type',  '',   'default', 'N', '0', 103, 1, sysdate, null, null, 'iOS');
+insert into sys_dict_data values(38, '000000', 0,  '小程序',     'xcx',      'sys_device_type',  '',   'default', 'N', '0', 103, 1, sysdate, null, null, '小程序');
+
+-- 二级菜单
+insert into sys_menu values('123',  '客户端管理',   '1',   '11', 'client',           'system/client/index',          '', 1, 0, 'C', '0', '0', 'system:client:list',          'international', 103, 1, sysdate, null, null, '客户端管理菜单');
+-- 客户端管理按钮
+insert into sys_menu values('1061', '客户端管理查询', '123', '1',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query',        '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1062', '客户端管理新增', '123', '2',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add',          '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1063', '客户端管理修改', '123', '3',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit',         '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1064', '客户端管理删除', '123', '4',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove',       '#', 103, 1, sysdate, null, null, '');
+insert into sys_menu values('1065', '客户端管理导出', '123', '5',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export',       '#', 103, 1, sysdate, null, null, '');
+
+-- 角色菜单权限
+insert into sys_role_menu values ('2', '1061');
+insert into sys_role_menu values ('2', '1062');
+insert into sys_role_menu values ('2', '1063');
+insert into sys_role_menu values ('2', '1064');
+insert into sys_role_menu values ('2', '1065');
+
+
+update sys_dept set leader = null;
+ALTER TABLE sys_dept MODIFY (leader NUMBER(20))

+ 150 - 0
script/sql/update/postgres/update_5.0-5.1.sql

@@ -0,0 +1,150 @@
+ALTER TABLE gen_table ADD data_name varchar(200) default ''::varchar;
+
+COMMENT ON COLUMN gen_table.data_name IS '数据源名称';
+
+UPDATE sys_menu SET path = 'powerjob', component = 'monitor/powerjob/index', perms = 'monitor:powerjob:list', remark = 'powerjob控制台菜单' WHERE menu_id = 120;
+
+-- ----------------------------
+-- 第三方平台授权表
+-- ----------------------------
+create table sys_social
+(
+    id                 int8             not null,
+    user_id            int8             not null,
+    tenant_id          varchar(20)      default null::varchar,
+    auth_id            varchar(255)     not null,
+    source             varchar(255)     not null,
+    open_id            varchar(255)     default null::varchar,
+    user_name          varchar(30)      not null,
+    nick_name          varchar(30)      default ''::varchar,
+    email              varchar(255)     default ''::varchar,
+    avatar             varchar(500)     default ''::varchar,
+    access_token       varchar(255)     not null,
+    expire_in          int8             default null,
+    refresh_token      varchar(255)     default null::varchar,
+    access_code        varchar(255)     default null::varchar,
+    union_id           varchar(255)     default null::varchar,
+    scope              varchar(255)     default null::varchar,
+    token_type         varchar(255)     default null::varchar,
+    id_token           varchar(255)     default null::varchar,
+    mac_algorithm      varchar(255)     default null::varchar,
+    mac_key            varchar(255)     default null::varchar,
+    code               varchar(255)     default null::varchar,
+    oauth_token        varchar(255)     default null::varchar,
+    oauth_token_secret varchar(255)     default null::varchar,
+    create_dept        int8,
+    create_by          int8,
+    create_time        timestamp,
+    update_by          int8,
+    update_time        timestamp,
+    del_flag           char             default '0'::bpchar,
+    constraint "pk_sys_social" primary key (id)
+);
+
+comment on table   sys_social                   is '社会化关系表';
+comment on column  sys_social.id                is '主键';
+comment on column  sys_social.user_id           is '用户ID';
+comment on column  sys_social.tenant_id         is '租户id';
+comment on column  sys_social.auth_id           is '平台+平台唯一id';
+comment on column  sys_social.source            is '用户来源';
+comment on column  sys_social.open_id           is '平台编号唯一id';
+comment on column  sys_social.user_name         is '登录账号';
+comment on column  sys_social.nick_name         is '用户昵称';
+comment on column  sys_social.email             is '用户邮箱';
+comment on column  sys_social.avatar            is '头像地址';
+comment on column  sys_social.access_token      is '用户的授权令牌';
+comment on column  sys_social.expire_in         is '用户的授权令牌的有效期,部分平台可能没有';
+comment on column  sys_social.refresh_token     is '刷新令牌,部分平台可能没有';
+comment on column  sys_social.access_code       is '平台的授权信息,部分平台可能没有';
+comment on column  sys_social.union_id          is '用户的 unionid';
+comment on column  sys_social.scope             is '授予的权限,部分平台可能没有';
+comment on column  sys_social.token_type        is '个别平台的授权信息,部分平台可能没有';
+comment on column  sys_social.id_token          is 'id token,部分平台可能没有';
+comment on column  sys_social.mac_algorithm     is '小米平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.mac_key           is '小米平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.code              is '用户的授权code,部分平台可能没有';
+comment on column  sys_social.oauth_token       is 'Twitter平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.oauth_token_secret is 'Twitter平台用户的附带属性,部分平台可能没有';
+comment on column  sys_social.create_dept       is '创建部门';
+comment on column  sys_social.create_by         is '创建者';
+comment on column  sys_social.create_time       is '创建时间';
+comment on column  sys_social.update_by         is '更新者';
+comment on column  sys_social.update_time       is '更新时间';
+comment on column  sys_social.del_flag          is '删除标志(0代表存在 2代表删除)';
+
+
+-- ----------------------------
+-- 系统授权表
+-- ----------------------------
+drop table if exists sys_client;
+create table sys_client (
+    id                  int8,
+    client_id           varchar(64)   default ''::varchar,
+    client_key          varchar(32)   default ''::varchar,
+    client_secret       varchar(255)  default ''::varchar,
+    grant_type          varchar(255)  default ''::varchar,
+    device_type         varchar(32)   default ''::varchar,
+    active_timeout      int4          default 1800,
+    timeout             int4          default 604800,
+    status              char(1)       default '0'::bpchar,
+    del_flag            char(1)       default '0'::bpchar,
+    create_dept         int8,
+    create_by           int8,
+    create_time         timestamp,
+    update_by           int8,
+    update_time         timestamp,
+    constraint sys_client_pk primary key (id)
+);
+
+comment on table sys_client                         is '系统授权表';
+comment on column sys_client.id                     is '主建';
+comment on column sys_client.client_id              is '客户端id';
+comment on column sys_client.client_key             is '客户端key';
+comment on column sys_client.client_secret          is '客户端秘钥';
+comment on column sys_client.grant_type             is '授权类型';
+comment on column sys_client.device_type            is '设备类型';
+comment on column sys_client.active_timeout         is 'token活跃超时时间';
+comment on column sys_client.timeout                is 'token固定超时';
+comment on column sys_client.status                 is '状态(0正常 1停用)';
+comment on column sys_client.del_flag               is '删除标志(0代表存在 2代表删除)';
+comment on column sys_client.create_dept            is '创建部门';
+comment on column sys_client.create_by              is '创建者';
+comment on column sys_client.create_time            is '创建时间';
+comment on column sys_client.update_by              is '更新者';
+comment on column sys_client.update_time            is '更新时间';
+
+insert into sys_client values (1, 'e5cd7e4891bf95d1d19206ce24a7b32e', 'pc', 'pc123', 'password,social', 'pc', 1800, 604800, 0, 0, 103, 1, now(), 1, now());
+insert into sys_client values (2, '428a8310cd442757ae699df5d894f051', 'app', 'app123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 103, 1, now(), 1, now());
+
+insert into sys_dict_type values(11, '000000', '授权类型', 'sys_grant_type',     '0', 103, 1, now(), null, null, '认证授权类型');
+insert into sys_dict_type values(12, '000000', '设备类型', 'sys_device_type',    '0', 103, 1, now(), null, null, '客户端设备类型');
+
+insert into sys_dict_data values(30, '000000', 0,  '密码认证', 'password',   'sys_grant_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, '密码认证');
+insert into sys_dict_data values(31, '000000', 0,  '短信认证', 'sms',        'sys_grant_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, '短信认证');
+insert into sys_dict_data values(32, '000000', 0,  '邮件认证', 'email',      'sys_grant_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, '邮件认证');
+insert into sys_dict_data values(33, '000000', 0,  '小程序认证', 'xcx',      'sys_grant_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, '小程序认证');
+insert into sys_dict_data values(34, '000000', 0,  '三方登录认证', 'social', 'sys_grant_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, '三方登录认证');
+insert into sys_dict_data values(35, '000000', 0,  'PC', 'pc',              'sys_device_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, 'PC');
+insert into sys_dict_data values(36, '000000', 0,  '安卓', 'android',       'sys_device_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, '安卓');
+insert into sys_dict_data values(37, '000000', 0,  'iOS', 'ios',            'sys_device_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, 'iOS');
+insert into sys_dict_data values(38, '000000', 0,  '小程序', 'xcx',         'sys_device_type',   '',   'default', 'N', '0', 103, 1, now(), null, null, '小程序');
+
+-- 二级菜单
+insert into sys_menu values('123',  '客户端管理',   '1',   '11', 'client',           'system/client/index',          '', '1', '0', 'C', '0', '0', 'system:client:list',          'international', 103, 1, now(), null, null, '客户端管理菜单');
+-- 客户端管理按钮
+insert into sys_menu values('1061', '客户端管理查询', '123', '1',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:query',        '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1062', '客户端管理新增', '123', '2',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:add',          '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1063', '客户端管理修改', '123', '3',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:edit',         '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1064', '客户端管理删除', '123', '4',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:remove',       '#', 103, 1, now(), null, null, '');
+insert into sys_menu values('1065', '客户端管理导出', '123', '5',  '#', '', '', '1', '0', 'F', '0', '0', 'system:client:export',       '#', 103, 1, now(), null, null, '');
+
+-- 角色菜单权限
+insert into sys_role_menu values ('2', '1061');
+insert into sys_role_menu values ('2', '1062');
+insert into sys_role_menu values ('2', '1063');
+insert into sys_role_menu values ('2', '1064');
+insert into sys_role_menu values ('2', '1065');
+
+
+update sys_dept set leader = null;
+ALTER TABLE sys_dept ALTER COLUMN leader TYPE int8;

+ 409 - 0
script/sql/update/sqlserver/update_5.0-5.1.sql

@@ -0,0 +1,409 @@
+ALTER TABLE gen_table ADD data_name nvarchar(200) DEFAULT '' NULL
+GO
+
+EXEC sp_addextendedproperty
+    'MS_Description', N'数据源名称',
+    'SCHEMA', N'dbo',
+    'TABLE', N'gen_table',
+    'COLUMN', N'data_name'
+GO
+
+UPDATE sys_menu SET path = 'powerjob', component = 'monitor/powerjob/index', perms = 'monitor:powerjob:list', remark = 'powerjob控制台菜单' WHERE menu_id = 120
+GO
+
+create table sys_social
+(
+    id                 bigint            NOT NULL,
+    user_id            bigint            NOT NULL,
+    tenant_id          nvarchar(20)      NULL,
+    auth_id            nvarchar(255)     NOT NULL,
+    source             nvarchar(255)     NOT NULL,
+    open_id            nvarchar(255)     NULL,
+    user_name          nvarchar(30)      NOT NULL,
+    nick_name          nvarchar(30)      DEFAULT ('')   NULL,
+    email              nvarchar(255)     DEFAULT ('')   NULL,
+    avatar             nvarchar(500)     DEFAULT ('')   NULL,
+    access_token       nvarchar(255)     NOT NULL,
+    expire_in          bigint            NULL,
+    refresh_token      nvarchar(255)     NULL,
+    access_code        nvarchar(255)     NULL,
+    union_id           nvarchar(255)     NULL,
+    scope              nvarchar(255)     NULL,
+    token_type         nvarchar(255)     NULL,
+    id_token           nvarchar(255)     NULL,
+    mac_algorithm      nvarchar(255)     NULL,
+    mac_key            nvarchar(255)     NULL,
+    code               nvarchar(255)     NULL,
+    oauth_token        nvarchar(255)     NULL,
+    oauth_token_secret nvarchar(255)     NULL,
+    create_dept        bigint,
+    create_by          bigint,
+    create_time        datetime2(7),
+    update_by          bigint,
+    update_time        datetime2(7),
+    del_flag           nchar             DEFAULT ('0')   NULL,
+    CONSTRAINT PK__sys_social__B21E8F2427725F8A PRIMARY KEY CLUSTERED (id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户ID' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'user_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'租户id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'tenant_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'平台+平台唯一id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'auth_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户来源' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'source'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'平台编号唯一id' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'open_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'登录账号' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'user_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户昵称' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'nick_name'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户邮箱' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'email'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'头像地址' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'avatar'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户的授权令牌' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'access_token'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户的授权令牌的有效期,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'expire_in'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'刷新令牌,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'refresh_token'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'平台的授权信息,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'access_code'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户的 unionid' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'union_id'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'授予的权限,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'scope'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'个别平台的授权信息,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'token_type'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'id token,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'id_token'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'小米平台用户的附带属性,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'mac_algorithm'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'小米平台用户的附带属性,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'mac_key'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'用户的授权code,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'code'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'Twitter平台用户的附带属性,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'oauth_token'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'Twitter平台用户的附带属性,部分平台可能没有' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'oauth_token_secret'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'删除标志(0代表存在 2代表删除)' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建部门' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'创建时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新者' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'更新时间' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_social',
+    'COLUMN', N'update_time'
+GO
+
+
+CREATE TABLE sys_client
+(
+    id                  bigint                              NOT NULL,
+    client_id           nvarchar(64)  DEFAULT ''            NULL,
+    client_key          nvarchar(32) DEFAULT ''            NULL,
+    client_secret       nvarchar(255) DEFAULT ''            NULL,
+    grant_type          nvarchar(255) DEFAULT ''            NULL,
+    device_type         nvarchar(32) DEFAULT ''            NULL,
+    active_timeout      int           DEFAULT ((1800))      NULL,
+    timeout             int           DEFAULT ((604800))    NULL,
+    status              nchar(1)      DEFAULT ('0')         NULL,
+    del_flag            nchar(1)      DEFAULT ('0')         NULL,
+    create_dept         bigint                              NULL,
+    create_by           bigint                              NULL,
+    create_time         datetime2(7)                        NULL,
+    update_by           bigint                              NULL,
+    update_time         datetime2(7)                        NULL
+    CONSTRAINT PK__sys_client___BFBDE87009ED2882 PRIMARY KEY CLUSTERED (id)
+        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+        ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'主建',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'id'
+GO
+EXEC sys.sp_addextendedproperty
+'MS_Description', N'客户端id' ,
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'client_id'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'客户端key',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'client_key'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'客户端秘钥',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'client_secret'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'授权类型',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'grant_type'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'设备类型',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'device_type'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'token活跃超时时间',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'active_timeout'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'token固定超时',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'timeout'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'状态(0正常 1停用)',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'status'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'删除标志(0代表存在 2代表删除)',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'del_flag'
+GO
+EXEC sys.sp_addextendedproperty
+'MS_Description', N'创建部门' ,
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'create_dept'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'创建者',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'create_by'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'创建时间',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'create_time'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'更新者',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'update_by'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'更新时间',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client',
+'COLUMN', N'update_time'
+GO
+EXEC sp_addextendedproperty
+'MS_Description', N'系统授权表',
+'SCHEMA', N'dbo',
+'TABLE', N'sys_client'
+GO
+
+INSERT INTO sys_client VALUES (N'1', N'e5cd7e4891bf95d1d19206ce24a7b32e', N'pc', N'pc123', N'password,social', N'pc', 1800, 604800, N'0', N'0', 103, 1, getdate(), 1, getdate())
+GO
+INSERT INTO sys_client VALUES (N'2', N'428a8310cd442757ae699df5d894f051', N'app', N'app123', N'password,sms,social', N'android', 1800, 604800, N'0', N'0', 103, 1, getdate(), 1, getdate())
+GO
+
+INSERT sys_dict_type VALUES (11, N'000000', N'授权类型', N'sys_grant_type', N'0', 103, 1, getdate(), NULL, NULL, N'认证授权类型')
+GO
+INSERT sys_dict_type VALUES (12, N'000000', N'设备类型', N'sys_device_type', N'0', 103, 1, getdate(), NULL, NULL, N'客户端设备类型')
+GO
+
+INSERT sys_dict_data VALUES (30, N'000000', 0, N'密码认证', N'password', N'sys_grant_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'密码认证');
+GO
+INSERT sys_dict_data VALUES (31, N'000000', 0, N'短信认证', N'sms', N'sys_grant_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'短信认证')
+GO
+INSERT sys_dict_data VALUES (32, N'000000', 0, N'邮件认证', N'email', N'sys_grant_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'邮件认证')
+GO
+INSERT sys_dict_data VALUES (33, N'000000', 0, N'小程序认证', N'xcx', N'sys_grant_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'小程序认证')
+GO
+INSERT sys_dict_data VALUES (34, N'000000', 0, N'三方登录认证', N'`social`', N'sys_grant_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'三方登录认证')
+GO
+INSERT sys_dict_data VALUES (35, N'000000', 0, N'PC', N'`pc`', N'sys_device_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'PC')
+GO
+INSERT sys_dict_data VALUES (36, N'000000', 0, N'安卓', N'`android`', N'sys_device_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'安卓')
+GO
+INSERT sys_dict_data VALUES (37, N'000000', 0, N'iOS', N'`ios`', N'sys_device_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'iOS')
+GO
+INSERT sys_dict_data VALUES (38, N'000000', 0, N'小程序', N'`xcx`', N'sys_device_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'小程序')
+GO
+
+-- 二级菜单
+INSERT sys_menu VALUES (123, N'客户端管理', 1, 11, N'client', N'system/client/index', N'', 1, 0, N'C', N'0', N'0', N'system:client:list', N'international', 103, 1, getdate(), NULL, NULL, N'客户端管理菜单')
+GO
+-- 客户端管理按钮
+INSERT sys_menu VALUES (1061, N'客户端管理查询', 123, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1062, N'客户端管理新增', 123, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1063, N'客户端管理修改', 123, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1064, N'客户端管理删除', 123, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+INSERT sys_menu VALUES (1065, N'客户端管理导出', 123, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'system:client:export', N'#', 103, 1, getdate(), NULL, NULL, N'');
+GO
+
+
+-- 角色菜单权限
+INSERT sys_role_menu VALUES (2, 1061)
+GO
+INSERT sys_role_menu VALUES (2, 1062)
+GO
+INSERT sys_role_menu VALUES (2, 1063)
+GO
+INSERT sys_role_menu VALUES (2, 1064)
+GO
+INSERT sys_role_menu VALUES (2, 1065)
+GO
+
+
+UPDATE sys_dept SET leader = null
+GO
+ALTER TABLE sys_dept ALTER COLUMN leader bigint NULL
+GO

+ 101 - 0
script/sql/update/update_5.0-5.1.sql

@@ -0,0 +1,101 @@
+ALTER TABLE gen_table ADD COLUMN data_name varchar(200) NULL DEFAULT '' COMMENT '数据源名称' AFTER table_id;
+
+UPDATE sys_menu SET path = 'powerjob', component = 'monitor/powerjob/index', perms = 'monitor:powerjob:list', remark = 'powerjob控制台菜单' WHERE menu_id = 120;
+
+-- ----------------------------
+-- 第三方平台授权表
+-- ----------------------------
+drop table if exists sys_social;
+create table sys_social
+(
+    id                 bigint           not null        comment '主键',
+    user_id            bigint           not null        comment '用户ID',
+    tenant_id          varchar(20)      default null    comment '租户id',
+    auth_id            varchar(255)     not null        comment '平台+平台唯一id',
+    source             varchar(255)     not null        comment '用户来源',
+    open_id            varchar(255)     default null    comment '平台编号唯一id',
+    user_name          varchar(30)      not null        comment '登录账号',
+    nick_name          varchar(30)      default ''      comment '用户昵称',
+    email              varchar(255)     default ''      comment '用户邮箱',
+    avatar             varchar(500)     default ''      comment '头像地址',
+    access_token       varchar(255)     not null        comment '用户的授权令牌',
+    expire_in          int              default null    comment '用户的授权令牌的有效期,部分平台可能没有',
+    refresh_token      varchar(255)     default null    comment '刷新令牌,部分平台可能没有',
+    access_code        varchar(255)     default null    comment '平台的授权信息,部分平台可能没有',
+    union_id           varchar(255)     default null    comment '用户的 unionid',
+    scope              varchar(255)     default null    comment '授予的权限,部分平台可能没有',
+    token_type         varchar(255)     default null    comment '个别平台的授权信息,部分平台可能没有',
+    id_token           varchar(255)     default null    comment 'id token,部分平台可能没有',
+    mac_algorithm      varchar(255)     default null    comment '小米平台用户的附带属性,部分平台可能没有',
+    mac_key            varchar(255)     default null    comment '小米平台用户的附带属性,部分平台可能没有',
+    code               varchar(255)     default null    comment '用户的授权code,部分平台可能没有',
+    oauth_token        varchar(255)     default null    comment 'Twitter平台用户的附带属性,部分平台可能没有',
+    oauth_token_secret varchar(255)     default null    comment 'Twitter平台用户的附带属性,部分平台可能没有',
+    create_dept        bigint(20)                       comment '创建部门',
+    create_by          bigint(20)                       comment '创建者',
+    create_time        datetime                         comment '创建时间',
+    update_by          bigint(20)                       comment '更新者',
+    update_time        datetime                         comment '更新时间',
+    del_flag           char(1)          default '0'     comment '删除标志(0代表存在 2代表删除)',
+    PRIMARY KEY (id)
+) engine=innodb comment = '社会化关系表';
+
+
+-- ----------------------------
+-- 系统授权表
+-- ----------------------------
+drop table if exists sys_client;
+create table sys_client (
+    id                  bigint(20)    not null            comment 'id',
+    client_id           varchar(64)   default null        comment '客户端id',
+    client_key          varchar(32)   default null        comment '客户端key',
+    client_secret       varchar(255)  default null        comment '客户端秘钥',
+    grant_type          varchar(255)  default null        comment '授权类型',
+    device_type         varchar(32)   default null        comment '设备类型',
+    active_timeout      int(11)       default 1800        comment 'token活跃超时时间',
+    timeout             int(11)       default 604800      comment 'token固定超时',
+    status              char(1)       default '0'         comment '状态(0正常 1停用)',
+    del_flag            char(1)       default '0'         comment '删除标志(0代表存在 2代表删除)',
+    create_dept         bigint(20)    default null        comment '创建部门',
+    create_by           bigint(20)    default null        comment '创建者',
+    create_time         datetime      default null        comment '创建时间',
+    update_by           bigint(20)    default null        comment '更新者',
+    update_time         datetime      default null        comment '更新时间',
+    primary key (id)
+) engine=innodb comment='系统授权表';
+
+insert into sys_client values (1, 'e5cd7e4891bf95d1d19206ce24a7b32e', 'pc', 'pc123', 'password,social', 'pc', 1800, 604800, 0, 0, 103, 1, sysdate(), 1, sysdate());
+insert into sys_client values (2, '428a8310cd442757ae699df5d894f051', 'app', 'app123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 103, 1, sysdate(), 1, sysdate());
+
+insert into sys_dict_type values(11, '000000', '授权类型', 'sys_grant_type',     '0', 103, 1, sysdate(), null, null, '认证授权类型');
+insert into sys_dict_type values(12, '000000', '设备类型', 'sys_device_type',    '0', 103, 1, sysdate(), null, null, '客户端设备类型');
+
+insert into sys_dict_data values(30, '000000', 0,  '密码认证', 'password',   'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate(), null, null, '密码认证');
+insert into sys_dict_data values(31, '000000', 0,  '短信认证', 'sms',        'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate(), null, null, '短信认证');
+insert into sys_dict_data values(32, '000000', 0,  '邮件认证', 'email',      'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate(), null, null, '邮件认证');
+insert into sys_dict_data values(33, '000000', 0,  '小程序认证', 'xcx',      'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate(), null, null, '小程序认证');
+insert into sys_dict_data values(34, '000000', 0,  '三方登录认证', 'social', 'sys_grant_type',   '',   'default', 'N', '0', 103, 1, sysdate(), null, null, '三方登录认证');
+insert into sys_dict_data values(35, '000000', 0,  'PC',    'pc',         'sys_device_type',     '',   'default', 'N', '0', 103, 1, sysdate(), null, null, 'PC');
+insert into sys_dict_data values(36, '000000', 0,  '安卓', 'android',     'sys_device_type',     '',   'default', 'N', '0', 103, 1, sysdate(), null, null, '安卓');
+insert into sys_dict_data values(37, '000000', 0,  'iOS', 'ios',          'sys_device_type',     '',   'default', 'N', '0', 103, 1, sysdate(), null, null, 'iOS');
+insert into sys_dict_data values(38, '000000', 0,  '小程序', 'xcx',       'sys_device_type',     '',   'default', 'N', '0', 103, 1, sysdate(), null, null, '小程序');
+
+-- 二级菜单
+insert into sys_menu values('123',  '客户端管理',   '1',   '11', 'client',           'system/client/index',          '', 1, 0, 'C', '0', '0', 'system:client:list',          'international', 103, 1, sysdate(), null, null, '客户端管理菜单');
+-- 客户端管理按钮
+insert into sys_menu values('1061', '客户端管理查询', '123', '1',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query',        '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1062', '客户端管理新增', '123', '2',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add',          '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1063', '客户端管理修改', '123', '3',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit',         '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1064', '客户端管理删除', '123', '4',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove',       '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu values('1065', '客户端管理导出', '123', '5',  '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export',       '#', 103, 1, sysdate(), null, null, '');
+
+-- 角色菜单权限
+insert into sys_role_menu values ('2', '1061');
+insert into sys_role_menu values ('2', '1062');
+insert into sys_role_menu values ('2', '1063');
+insert into sys_role_menu values ('2', '1064');
+insert into sys_role_menu values ('2', '1065');
+
+
+update sys_dept set leader = null;
+alter table sys_dept modify column leader bigint null default null comment '负责人' after order_num;

+ 23 - 0
takai-admin/Dockerfile

@@ -0,0 +1,23 @@
+FROM findepi/graalvm:java17-native
+
+MAINTAINER Lion Li
+
+RUN mkdir -p /ruoyi/server/logs \
+    /ruoyi/server/temp \
+    /ruoyi/skywalking/agent
+
+WORKDIR /ruoyi/server
+
+ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8
+
+EXPOSE ${SERVER_PORT}
+
+ADD ./target/ruoyi-admin.jar ./app.jar
+
+ENTRYPOINT ["java", \
+            "-Djava.security.egd=file:/dev/./urandom", \
+            "-Dserver.port=${SERVER_PORT}", \
+            # 应用名称 如果想区分集群节点监控 改成不同的名称即可
+#            "-Dskywalking.agent.service_name=ruoyi-server", \
+#            "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
+            "-jar", "app.jar"]

+ 136 - 0
takai-admin/pom.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>takai-plus</artifactId>
+        <groupId>org.dromara</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
+    <artifactId>takai-admin</artifactId>
+
+    <description>
+        web服务入口
+    </description>
+
+    <dependencies>
+
+        <!-- Mysql驱动包 -->
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+        <!-- Oracle -->
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+        </dependency>
+        <!-- PostgreSql -->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <!-- SqlServer -->
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>takai-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>takai-common-social</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>takai-system</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>takai-job</artifactId>
+        </dependency>
+
+        <!-- 代码生成-->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>takai-generator</artifactId>
+        </dependency>
+
+        <!--  demo模块  -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>takai-demo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>de.codecentric</groupId>
+            <artifactId>spring-boot-admin-starter-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>me.zhyd.oauth</groupId>
+            <artifactId>JustAuth</artifactId>
+        </dependency>
+
+        <!-- skywalking 整合 logback -->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.skywalking</groupId>-->
+<!--            <artifactId>apm-toolkit-logback-1.x</artifactId>-->
+<!--            <version>${与你的agent探针版本保持一致}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.skywalking</groupId>-->
+<!--            <artifactId>apm-toolkit-trace</artifactId>-->
+<!--            <version>${与你的agent探针版本保持一致}</version>-->
+<!--        </dependency>-->
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>${maven-jar-plugin.version}</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>${maven-war-plugin.version}</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 23 - 0
takai-admin/src/main/java/org/dromara/DromaraApplication.java

@@ -0,0 +1,23 @@
+package org.dromara;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+/**
+ * 启动程序
+ *
+ * @author Lion Li
+ */
+
+@SpringBootApplication
+public class DromaraApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(DromaraApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        System.out.println("(♥◠‿◠)ノ゙  Takai-Plus启动成功   ლ(´ڡ`ლ)゙");
+    }
+
+}

+ 18 - 0
takai-admin/src/main/java/org/dromara/DromaraServletInitializer.java

@@ -0,0 +1,18 @@
+package org.dromara;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ *
+ * @author Lion Li
+ */
+public class DromaraServletInitializer extends SpringBootServletInitializer {
+
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+        return application.sources(DromaraApplication.class);
+    }
+
+}

+ 186 - 0
takai-admin/src/main/java/org/dromara/web/controller/AuthController.java

@@ -0,0 +1,186 @@
+package org.dromara.web.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.request.AuthRequest;
+import me.zhyd.oauth.utils.AuthStateUtils;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.common.core.domain.model.RegisterBody;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.core.utils.StreamUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.social.config.properties.SocialLoginConfigProperties;
+import org.dromara.common.social.config.properties.SocialProperties;
+import org.dromara.common.social.utils.SocialUtils;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.bo.SysTenantBo;
+import org.dromara.system.domain.vo.SysTenantVo;
+import org.dromara.system.service.ISysClientService;
+import org.dromara.system.service.ISysConfigService;
+import org.dromara.system.service.ISysSocialService;
+import org.dromara.system.service.ISysTenantService;
+import org.dromara.web.domain.vo.LoginTenantVo;
+import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.web.domain.vo.TenantListVo;
+import org.dromara.web.service.IAuthStrategy;
+import org.dromara.web.service.SysLoginService;
+import org.dromara.web.service.SysRegisterService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URL;
+import java.util.List;
+
+/**
+ * 认证
+ *
+ * @author Lion Li
+ */
+@Slf4j
+@SaIgnore
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/auth")
+public class AuthController {
+
+    private final SocialProperties socialProperties;
+    private final SysLoginService loginService;
+    private final SysRegisterService registerService;
+    private final ISysConfigService configService;
+    private final ISysTenantService tenantService;
+    private final ISysSocialService socialUserService;
+    private final ISysClientService clientService;
+
+
+    /**
+     * 登录方法
+     *
+     * @param loginBody 登录信息
+     * @return 结果
+     */
+    @PostMapping("/login")
+    public R<LoginVo> login(@Validated @RequestBody LoginBody loginBody) {
+        // 授权类型和客户端id
+        String clientId = loginBody.getClientId();
+        String grantType = loginBody.getGrantType();
+        SysClient client = clientService.queryByClientId(clientId);
+        // 查询不到 client 或 client 内不包含 grantType
+        if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) {
+            log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType);
+            return R.fail(MessageUtils.message("auth.grant.type.error"));
+        }
+        // 校验租户
+        loginService.checkTenant(loginBody.getTenantId());
+        // 登录
+        return R.ok(IAuthStrategy.login(loginBody, client));
+    }
+
+    /**
+     * 第三方登录请求
+     *
+     * @param source 登录来源
+     * @return 结果
+     */
+    @GetMapping("/binding/{source}")
+    public R<String> authBinding(@PathVariable("source") String source) {
+        SocialLoginConfigProperties obj = socialProperties.getType().get(source);
+        if (ObjectUtil.isNull(obj)) {
+            return R.fail(source + "平台账号暂不支持");
+        }
+        AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties);
+        String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
+        return R.ok("操作成功", authorizeUrl);
+    }
+
+    /**
+     * 第三方登录回调业务处理 绑定授权
+     *
+     * @param loginBody 请求体
+     * @return 结果
+     */
+    @PostMapping("/social/callback")
+    public R<Void> socialCallback(@RequestBody LoginBody loginBody) {
+        // 获取第三方登录信息
+        AuthResponse<AuthUser> response = SocialUtils.loginAuth(loginBody, socialProperties);
+        AuthUser authUserData = response.getData();
+        // 判断授权响应是否成功
+        if (!response.ok()) {
+            return R.fail(response.getMsg());
+        }
+        loginService.socialRegister(authUserData);
+        return R.ok();
+    }
+
+
+    /**
+     * 取消授权
+     *
+     * @param socialId socialId
+     */
+    @DeleteMapping(value = "/unlock/{socialId}")
+    public R<Void> unlockSocial(@PathVariable Long socialId) {
+        Boolean rows = socialUserService.deleteWithValidById(socialId);
+        return rows ? R.ok() : R.fail("取消授权失败");
+    }
+
+
+    /**
+     * 退出登录
+     */
+    @PostMapping("/logout")
+    public R<Void> logout() {
+        loginService.logout();
+        return R.ok("退出成功");
+    }
+
+    /**
+     * 用户注册
+     */
+    @PostMapping("/register")
+    public R<Void> register(@Validated @RequestBody RegisterBody user) {
+        if (!configService.selectRegisterEnabled(user.getTenantId())) {
+            return R.fail("当前系统没有开启注册功能!");
+        }
+        registerService.register(user);
+        return R.ok();
+    }
+
+    /**
+     * 登录页面租户下拉框
+     *
+     * @return 租户列表
+     */
+    @GetMapping("/tenant/list")
+    public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
+        List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo());
+        List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
+        // 获取域名
+        String host;
+        String referer = request.getHeader("referer");
+        if (StringUtils.isNotBlank(referer)) {
+            // 这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试
+            host = referer.split("//")[1].split("/")[0];
+        } else {
+            host = new URL(request.getRequestURL().toString()).getHost();
+        }
+        // 根据域名进行筛选
+        List<TenantListVo> list = StreamUtils.filter(voList, vo ->
+            StringUtils.equals(vo.getDomain(), host));
+        // 返回对象
+        LoginTenantVo vo = new LoginTenantVo();
+        vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
+        vo.setTenantEnabled(TenantHelper.isEnable());
+        return R.ok(vo);
+    }
+
+}

+ 131 - 0
takai-admin/src/main/java/org/dromara/web/controller/CaptchaController.java

@@ -0,0 +1,131 @@
+package org.dromara.web.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.captcha.AbstractCaptcha;
+import cn.hutool.captcha.generator.CodeGenerator;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.RandomUtil;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.core.utils.reflect.ReflectUtils;
+import org.dromara.common.mail.config.properties.MailProperties;
+import org.dromara.common.mail.utils.MailUtils;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.web.config.properties.CaptchaProperties;
+import org.dromara.common.web.enums.CaptchaType;
+import org.dromara.sms4j.api.SmsBlend;
+import org.dromara.sms4j.api.entity.SmsResponse;
+import org.dromara.sms4j.core.factory.SmsFactory;
+import org.dromara.sms4j.provider.enumerate.SupplierType;
+import org.dromara.web.domain.vo.CaptchaVo;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Duration;
+import java.util.LinkedHashMap;
+
+/**
+ * 验证码操作处理
+ *
+ * @author Lion Li
+ */
+@SaIgnore
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+public class CaptchaController {
+
+    private final CaptchaProperties captchaProperties;
+    private final MailProperties mailProperties;
+
+    /**
+     * 短信验证码
+     *
+     * @param phonenumber 用户手机号
+     */
+    @GetMapping("/resource/sms/code")
+    public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
+        String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
+        String code = RandomUtil.randomNumbers(4);
+        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        // 验证码模板id 自行处理 (查数据库或写死均可)
+        String templateId = "";
+        LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
+        map.put("code", code);
+        SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
+        SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map);
+        if (!"OK".equals(smsResponse.getCode())) {
+            log.error("验证码短信发送异常 => {}", smsResponse);
+            return R.fail(smsResponse.getMessage());
+        }
+        return R.ok();
+    }
+
+    /**
+     * 邮箱验证码
+     *
+     * @param email 邮箱
+     */
+    @GetMapping("/resource/email/code")
+    public R<Void> emailCode(@NotBlank(message = "{user.email.not.blank}") String email) {
+        if (!mailProperties.getEnabled()) {
+            return R.fail("当前系统没有开启邮箱功能!");
+        }
+        String key = GlobalConstants.CAPTCHA_CODE_KEY + email;
+        String code = RandomUtil.randomNumbers(4);
+        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        try {
+            MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。");
+        } catch (Exception e) {
+            log.error("验证码短信发送异常 => {}", e.getMessage());
+            return R.fail(e.getMessage());
+        }
+        return R.ok();
+    }
+
+    /**
+     * 生成验证码
+     */
+    @GetMapping("/auth/code")
+    public R<CaptchaVo> getCode() {
+        CaptchaVo captchaVo = new CaptchaVo();
+        boolean captchaEnabled = captchaProperties.getEnable();
+        if (!captchaEnabled) {
+            captchaVo.setCaptchaEnabled(false);
+            return R.ok(captchaVo);
+        }
+        // 保存验证码信息
+        String uuid = IdUtil.simpleUUID();
+        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
+        // 生成验证码
+        CaptchaType captchaType = captchaProperties.getType();
+        boolean isMath = CaptchaType.MATH == captchaType;
+        Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
+        CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
+        AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
+        captcha.setGenerator(codeGenerator);
+        captcha.createCode();
+        String code = captcha.getCode();
+        if (isMath) {
+            ExpressionParser parser = new SpelExpressionParser();
+            Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
+            code = exp.getValue(String.class);
+        }
+        RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        captchaVo.setUuid(uuid);
+        captchaVo.setImg(captcha.getImageBase64());
+        return R.ok(captchaVo);
+    }
+
+}

+ 32 - 0
takai-admin/src/main/java/org/dromara/web/controller/IndexController.java

@@ -0,0 +1,32 @@
+package org.dromara.web.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import org.dromara.common.core.config.RuoYiConfig;
+import org.dromara.common.core.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 首页
+ *
+ * @author Lion Li
+ */
+@SaIgnore
+@RequiredArgsConstructor
+@RestController
+public class IndexController {
+
+    /**
+     * 系统基础配置
+     */
+    private final RuoYiConfig ruoyiConfig;
+
+    /**
+     * 访问首页,提示语
+     */
+    @GetMapping("/")
+    public String index() {
+        return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
+    }
+}

+ 25 - 0
takai-admin/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java

@@ -0,0 +1,25 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+/**
+ * 验证码信息
+ *
+ * @author Michelle.Chung
+ */
+@Data
+public class CaptchaVo {
+
+    /**
+     * 是否开启验证码
+     */
+    private Boolean captchaEnabled = true;
+
+    private String uuid;
+
+    /**
+     * 验证码图片
+     */
+    private String img;
+
+}

+ 25 - 0
takai-admin/src/main/java/org/dromara/web/domain/vo/LoginTenantVo.java

@@ -0,0 +1,25 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 登录租户对象
+ *
+ * @author Michelle.Chung
+ */
+@Data
+public class LoginTenantVo {
+
+    /**
+     * 租户开关
+     */
+    private Boolean tenantEnabled;
+
+    /**
+     * 租户对象列表
+     */
+    private List<TenantListVo> voList;
+
+}

+ 54 - 0
takai-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java

@@ -0,0 +1,54 @@
+package org.dromara.web.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * 登录验证信息
+ *
+ * @author Michelle.Chung
+ */
+@Data
+public class LoginVo {
+
+    /**
+     * 授权令牌
+     */
+    @JsonProperty("access_token")
+    private String accessToken;
+
+    /**
+     * 刷新令牌
+     */
+    @JsonProperty("refresh_token")
+    private String refreshToken;
+
+    /**
+     * 授权令牌 access_token 的有效期
+     */
+    @JsonProperty("expire_in")
+    private Long expireIn;
+
+    /**
+     * 刷新令牌 refresh_token 的有效期
+     */
+    @JsonProperty("refresh_expire_in")
+    private Long refreshExpireIn;
+
+    /**
+     * 应用id
+     */
+    @JsonProperty("client_id")
+    private String clientId;
+
+    /**
+     * 令牌权限
+     */
+    private String scope;
+
+    /**
+     * 用户 openid
+     */
+    private String openid;
+
+}

+ 22 - 0
takai-admin/src/main/java/org/dromara/web/domain/vo/TenantListVo.java

@@ -0,0 +1,22 @@
+package org.dromara.web.domain.vo;
+
+import org.dromara.system.domain.vo.SysTenantVo;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+/**
+ * 租户列表
+ *
+ * @author Lion Li
+ */
+@Data
+@AutoMapper(target = SysTenantVo.class)
+public class TenantListVo {
+
+    private String tenantId;
+
+    private String companyName;
+
+    private String domain;
+
+}

+ 45 - 0
takai-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java

@@ -0,0 +1,45 @@
+package org.dromara.web.service;
+
+
+import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.system.domain.SysClient;
+import org.dromara.web.domain.vo.LoginVo;
+
+/**
+ * 授权策略
+ *
+ * @author Michelle.Chung
+ */
+public interface IAuthStrategy {
+
+    String BASE_NAME = "AuthStrategy";
+
+    /**
+     * 登录
+     */
+    static LoginVo login(LoginBody loginBody, SysClient client) {
+        // 授权类型和客户端id
+        String clientId = loginBody.getClientId();
+        String grantType = loginBody.getGrantType();
+        String beanName = grantType + BASE_NAME;
+        if (!SpringUtils.containsBean(beanName)) {
+            throw new ServiceException("授权类型不正确!");
+        }
+        IAuthStrategy instance = SpringUtils.getBean(beanName);
+        instance.validate(loginBody);
+        return instance.login(clientId, loginBody, client);
+    }
+
+    /**
+     * 参数校验
+     */
+    void validate(LoginBody loginBody);
+
+    /**
+     * 登录
+     */
+    LoginVo login(String clientId, LoginBody loginBody, SysClient client);
+
+}

+ 227 - 0
takai-admin/src/main/java/org/dromara/web/service/SysLoginService.java

@@ -0,0 +1,227 @@
+package org.dromara.web.service;
+
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthUser;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.constant.TenantConstants;
+import org.dromara.common.core.domain.dto.RoleDTO;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.enums.LoginType;
+import org.dromara.common.core.enums.TenantStatus;
+import org.dromara.common.core.exception.user.UserException;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.core.utils.ServletUtils;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.log.event.LogininforEvent;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.exception.TenantException;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.bo.SysSocialBo;
+import org.dromara.system.domain.vo.SysSocialVo;
+import org.dromara.system.domain.vo.SysTenantVo;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.system.service.ISysPermissionService;
+import org.dromara.system.service.ISysSocialService;
+import org.dromara.system.service.ISysTenantService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.time.Duration;
+import java.util.Date;
+import java.util.List;
+import java.util.function.Supplier;
+
+/**
+ * 登录校验方法
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@Slf4j
+@Service
+public class SysLoginService {
+
+    @Value("${user.password.maxRetryCount}")
+    private Integer maxRetryCount;
+
+    @Value("${user.password.lockTime}")
+    private Integer lockTime;
+
+    private final ISysTenantService tenantService;
+    private final ISysPermissionService permissionService;
+    private final ISysSocialService sysSocialService;
+    private final SysUserMapper userMapper;
+
+
+    /**
+     * 绑定第三方用户
+     *
+     * @param authUserData 授权响应实体
+     * @return 统一响应实体
+     */
+    public void socialRegister(AuthUser authUserData) {
+        String authId = authUserData.getSource() + authUserData.getUuid();
+        // 第三方用户信息
+        SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class);
+        BeanUtil.copyProperties(authUserData.getToken(), bo);
+        bo.setUserId(LoginHelper.getUserId());
+        bo.setAuthId(authId);
+        bo.setOpenId(authUserData.getUuid());
+        bo.setUserName(authUserData.getUsername());
+        bo.setNickName(authUserData.getNickname());
+        // 查询是否已经绑定用户
+        SysSocialVo vo = sysSocialService.selectByAuthId(authId);
+        if (ObjectUtil.isEmpty(vo)) {
+            // 没有绑定用户, 新增用户信息
+            sysSocialService.insertByBo(bo);
+        } else {
+            // 更新用户信息
+            bo.setId(vo.getId());
+            sysSocialService.updateByBo(bo);
+        }
+    }
+
+
+    /**
+     * 退出登录
+     */
+    public void logout() {
+        try {
+            LoginUser loginUser = LoginHelper.getLoginUser();
+            if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) {
+                // 超级管理员 登出清除动态租户
+                TenantHelper.clearDynamic();
+            }
+            recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"));
+        } catch (NotLoginException ignored) {
+        } finally {
+            try {
+                StpUtil.logout();
+            } catch (NotLoginException ignored) {
+            }
+        }
+    }
+
+    /**
+     * 记录登录信息
+     *
+     * @param tenantId 租户ID
+     * @param username 用户名
+     * @param status   状态
+     * @param message  消息内容
+     */
+    public void recordLogininfor(String tenantId, String username, String status, String message) {
+        LogininforEvent logininforEvent = new LogininforEvent();
+        logininforEvent.setTenantId(tenantId);
+        logininforEvent.setUsername(username);
+        logininforEvent.setStatus(status);
+        logininforEvent.setMessage(message);
+        logininforEvent.setRequest(ServletUtils.getRequest());
+        SpringUtils.context().publishEvent(logininforEvent);
+    }
+
+
+    /**
+     * 构建登录用户
+     */
+    public LoginUser buildLoginUser(SysUserVo user) {
+        LoginUser loginUser = new LoginUser();
+        loginUser.setTenantId(user.getTenantId());
+        loginUser.setUserId(user.getUserId());
+        loginUser.setDeptId(user.getDeptId());
+        loginUser.setUsername(user.getUserName());
+        loginUser.setNickname(user.getNickName());
+        loginUser.setUserType(user.getUserType());
+        loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId()));
+        loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId()));
+        loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName());
+        List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class);
+        loginUser.setRoles(roles);
+        return loginUser;
+    }
+
+    /**
+     * 记录登录信息
+     *
+     * @param userId 用户ID
+     */
+    public void recordLoginInfo(Long userId) {
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(userId);
+        sysUser.setLoginIp(ServletUtils.getClientIP());
+        sysUser.setLoginDate(DateUtils.getNowDate());
+        sysUser.setUpdateBy(userId);
+        userMapper.updateById(sysUser);
+    }
+
+    /**
+     * 登录校验
+     */
+    public void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) {
+        String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username;
+        String loginFail = Constants.LOGIN_FAIL;
+
+        // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip)
+        int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
+        // 锁定时间内登录 则踢出
+        if (errorNumber >= maxRetryCount) {
+            recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
+            throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
+        }
+
+        if (supplier.get()) {
+            // 错误次数递增
+            errorNumber++;
+            RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
+            // 达到规定错误次数 则锁定登录
+            if (errorNumber >= maxRetryCount) {
+                recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
+                throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
+            } else {
+                // 未达到规定错误次数
+                recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
+                throw new UserException(loginType.getRetryLimitCount(), errorNumber);
+            }
+        }
+
+        // 登录成功 清空错误次数
+        RedisUtils.deleteObject(errorKey);
+    }
+
+    /**
+     * 校验租户
+     *
+     * @param tenantId 租户ID
+     */
+    public void checkTenant(String tenantId) {
+        if (!TenantHelper.isEnable()) {
+            return;
+        }
+        if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
+            return;
+        }
+        SysTenantVo tenant = tenantService.queryByTenantId(tenantId);
+        if (ObjectUtil.isNull(tenant)) {
+            log.info("登录租户:{} 不存在.", tenantId);
+            throw new TenantException("tenant.not.exists");
+        } else if (TenantStatus.DISABLE.getCode().equals(tenant.getStatus())) {
+            log.info("登录租户:{} 已被停用.", tenantId);
+            throw new TenantException("tenant.blocked");
+        } else if (ObjectUtil.isNotNull(tenant.getExpireTime())
+            && new Date().after(tenant.getExpireTime())) {
+            log.info("登录租户:{} 已超过有效期.", tenantId);
+            throw new TenantException("tenant.expired");
+        }
+    }
+
+}

+ 106 - 0
takai-admin/src/main/java/org/dromara/web/service/SysRegisterService.java

@@ -0,0 +1,106 @@
+package org.dromara.web.service;
+
+import cn.dev33.satoken.secure.BCrypt;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.domain.model.RegisterBody;
+import org.dromara.common.core.enums.UserType;
+import org.dromara.common.core.exception.user.CaptchaException;
+import org.dromara.common.core.exception.user.CaptchaExpireException;
+import org.dromara.common.core.exception.user.UserException;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.core.utils.ServletUtils;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.log.event.LogininforEvent;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.web.config.properties.CaptchaProperties;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.service.ISysUserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 注册校验方法
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@Service
+public class SysRegisterService {
+
+    private final ISysUserService userService;
+    private final CaptchaProperties captchaProperties;
+
+    /**
+     * 注册
+     */
+    public void register(RegisterBody registerBody) {
+        String tenantId = registerBody.getTenantId();
+        String username = registerBody.getUsername();
+        String password = registerBody.getPassword();
+        // 校验用户类型是否存在
+        String userType = UserType.getUserType(registerBody.getUserType()).getUserType();
+
+        boolean captchaEnabled = captchaProperties.getEnable();
+        // 验证码开关
+        if (captchaEnabled) {
+            validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid());
+        }
+        SysUserBo sysUser = new SysUserBo();
+        sysUser.setUserName(username);
+        sysUser.setNickName(username);
+        sysUser.setPassword(BCrypt.hashpw(password));
+        sysUser.setUserType(userType);
+
+        if (!userService.checkUserNameUnique(sysUser)) {
+            throw new UserException("user.register.save.error", username);
+        }
+        boolean regFlag = userService.registerUser(sysUser, tenantId);
+        if (!regFlag) {
+            throw new UserException("user.register.error");
+        }
+        recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
+    }
+
+    /**
+     * 校验验证码
+     *
+     * @param username 用户名
+     * @param code     验证码
+     * @param uuid     唯一标识
+     */
+    public void validateCaptcha(String tenantId, String username, String code, String uuid) {
+        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
+        String captcha = RedisUtils.getCacheObject(verifyKey);
+        RedisUtils.deleteObject(verifyKey);
+        if (captcha == null) {
+            recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire"));
+            throw new CaptchaExpireException();
+        }
+        if (!code.equalsIgnoreCase(captcha)) {
+            recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error"));
+            throw new CaptchaException();
+        }
+    }
+
+    /**
+     * 记录登录信息
+     *
+     * @param tenantId 租户ID
+     * @param username 用户名
+     * @param status   状态
+     * @param message  消息内容
+     * @return
+     */
+    private void recordLogininfor(String tenantId, String username, String status, String message) {
+        LogininforEvent logininforEvent = new LogininforEvent();
+        logininforEvent.setTenantId(tenantId);
+        logininforEvent.setUsername(username);
+        logininforEvent.setStatus(status);
+        logininforEvent.setMessage(message);
+        logininforEvent.setRequest(ServletUtils.getRequest());
+        SpringUtils.context().publishEvent(logininforEvent);
+    }
+
+}

+ 113 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java

@@ -0,0 +1,113 @@
+package org.dromara.web.service.impl;
+
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.enums.LoginType;
+import org.dromara.common.core.enums.UserStatus;
+import org.dromara.common.core.exception.user.CaptchaExpireException;
+import org.dromara.common.core.exception.user.UserException;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.core.utils.ValidatorUtils;
+import org.dromara.common.core.validate.auth.EmailGroup;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.web.service.IAuthStrategy;
+import org.dromara.web.service.SysLoginService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 邮件认证策略
+ *
+ * @author Michelle.Chung
+ */
+@Slf4j
+@Service("email" + IAuthStrategy.BASE_NAME)
+@RequiredArgsConstructor
+public class EmailAuthStrategy implements IAuthStrategy {
+
+    private final SysLoginService loginService;
+    private final SysUserMapper userMapper;
+
+    @Override
+    public void validate(LoginBody loginBody) {
+        ValidatorUtils.validate(loginBody, EmailGroup.class);
+    }
+
+    @Override
+    public LoginVo login(String clientId, LoginBody loginBody, SysClient client) {
+        String tenantId = loginBody.getTenantId();
+        String email = loginBody.getEmail();
+        String emailCode = loginBody.getEmailCode();
+
+        // 通过邮箱查找用户
+        SysUserVo user = loadUserByEmail(tenantId, email);
+
+        loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
+        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
+        LoginUser loginUser = loginService.buildLoginUser(user);
+        SaLoginModel model = new SaLoginModel();
+        model.setDevice(client.getDeviceType());
+        // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
+        // 例如: 后台用户30分钟过期 app用户1天过期
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, clientId);
+        // 生成token
+        LoginHelper.login(loginUser, model);
+
+        loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        loginService.recordLoginInfo(user.getUserId());
+
+        LoginVo loginVo = new LoginVo();
+        loginVo.setAccessToken(StpUtil.getTokenValue());
+        loginVo.setExpireIn(StpUtil.getTokenTimeout());
+        loginVo.setClientId(clientId);
+        return loginVo;
+    }
+
+    /**
+     * 校验邮箱验证码
+     */
+    private boolean validateEmailCode(String tenantId, String email, String emailCode) {
+        String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
+        if (StringUtils.isBlank(code)) {
+            loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
+            throw new CaptchaExpireException();
+        }
+        return code.equals(emailCode);
+    }
+
+    private SysUserVo loadUserByEmail(String tenantId, String email) {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+            .select(SysUser::getEmail, SysUser::getStatus)
+            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+            .eq(SysUser::getEmail, email));
+        if (ObjectUtil.isNull(user)) {
+            log.info("登录用户:{} 不存在.", email);
+            throw new UserException("user.not.exists", email);
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("登录用户:{} 已被停用.", email);
+            throw new UserException("user.blocked", email);
+        }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByEmail(email, tenantId);
+        }
+        return userMapper.selectUserByEmail(email);
+    }
+
+}

+ 132 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java

@@ -0,0 +1,132 @@
+package org.dromara.web.service.impl;
+
+import cn.dev33.satoken.secure.BCrypt;
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.enums.LoginType;
+import org.dromara.common.core.enums.UserStatus;
+import org.dromara.common.core.exception.user.CaptchaException;
+import org.dromara.common.core.exception.user.CaptchaExpireException;
+import org.dromara.common.core.exception.user.UserException;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.core.utils.ValidatorUtils;
+import org.dromara.common.core.validate.auth.PasswordGroup;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.common.web.config.properties.CaptchaProperties;
+import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.web.service.IAuthStrategy;
+import org.dromara.web.service.SysLoginService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 密码认证策略
+ *
+ * @author Michelle.Chung
+ */
+@Slf4j
+@Service("password" + IAuthStrategy.BASE_NAME)
+@RequiredArgsConstructor
+public class PasswordAuthStrategy implements IAuthStrategy {
+
+    private final CaptchaProperties captchaProperties;
+    private final SysLoginService loginService;
+    private final SysUserMapper userMapper;
+
+    @Override
+    public void validate(LoginBody loginBody) {
+        ValidatorUtils.validate(loginBody, PasswordGroup.class);
+    }
+
+    @Override
+    public LoginVo login(String clientId, LoginBody loginBody, SysClient client) {
+        String tenantId = loginBody.getTenantId();
+        String username = loginBody.getUsername();
+        String password = loginBody.getPassword();
+        String code = loginBody.getCode();
+        String uuid = loginBody.getUuid();
+
+        boolean captchaEnabled = captchaProperties.getEnable();
+        // 验证码开关
+        if (captchaEnabled) {
+            validateCaptcha(tenantId, username, code, uuid);
+        }
+
+        SysUserVo user = loadUserByUsername(tenantId, username);
+        loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
+        // 此处可根据登录用户的数据不同 自行创建 loginUser
+        LoginUser loginUser = loginService.buildLoginUser(user);
+        SaLoginModel model = new SaLoginModel();
+        model.setDevice(client.getDeviceType());
+        // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
+        // 例如: 后台用户30分钟过期 app用户1天过期
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, clientId);
+        // 生成token
+        LoginHelper.login(loginUser, model);
+
+        loginService.recordLogininfor(loginUser.getTenantId(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        loginService.recordLoginInfo(user.getUserId());
+
+        LoginVo loginVo = new LoginVo();
+        loginVo.setAccessToken(StpUtil.getTokenValue());
+        loginVo.setExpireIn(StpUtil.getTokenTimeout());
+        loginVo.setClientId(clientId);
+        return loginVo;
+    }
+
+    /**
+     * 校验验证码
+     *
+     * @param username 用户名
+     * @param code     验证码
+     * @param uuid     唯一标识
+     */
+    private void validateCaptcha(String tenantId, String username, String code, String uuid) {
+        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
+        String captcha = RedisUtils.getCacheObject(verifyKey);
+        RedisUtils.deleteObject(verifyKey);
+        if (captcha == null) {
+            loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
+            throw new CaptchaExpireException();
+        }
+        if (!code.equalsIgnoreCase(captcha)) {
+            loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
+            throw new CaptchaException();
+        }
+    }
+
+    private SysUserVo loadUserByUsername(String tenantId, String username) {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+            .select(SysUser::getUserName, SysUser::getStatus)
+            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+            .eq(SysUser::getUserName, username));
+        if (ObjectUtil.isNull(user)) {
+            log.info("登录用户:{} 不存在.", username);
+            throw new UserException("user.not.exists", username);
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("登录用户:{} 已被停用.", username);
+            throw new UserException("user.blocked", username);
+        }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByUserName(username, tenantId);
+        }
+        return userMapper.selectUserByUserName(username);
+    }
+
+}

+ 113 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java

@@ -0,0 +1,113 @@
+package org.dromara.web.service.impl;
+
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.enums.LoginType;
+import org.dromara.common.core.enums.UserStatus;
+import org.dromara.common.core.exception.user.CaptchaExpireException;
+import org.dromara.common.core.exception.user.UserException;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.core.utils.ValidatorUtils;
+import org.dromara.common.core.validate.auth.SmsGroup;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.web.service.IAuthStrategy;
+import org.dromara.web.service.SysLoginService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 短信认证策略
+ *
+ * @author Michelle.Chung
+ */
+@Slf4j
+@Service("sms" + IAuthStrategy.BASE_NAME)
+@RequiredArgsConstructor
+public class SmsAuthStrategy implements IAuthStrategy {
+
+    private final SysLoginService loginService;
+    private final SysUserMapper userMapper;
+
+    @Override
+    public void validate(LoginBody loginBody) {
+        ValidatorUtils.validate(loginBody, SmsGroup.class);
+    }
+
+    @Override
+    public LoginVo login(String clientId, LoginBody loginBody, SysClient client) {
+        String tenantId = loginBody.getTenantId();
+        String phonenumber = loginBody.getPhonenumber();
+        String smsCode = loginBody.getSmsCode();
+
+        // 通过手机号查找用户
+        SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber);
+
+        loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
+        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
+        LoginUser loginUser = loginService.buildLoginUser(user);
+        SaLoginModel model = new SaLoginModel();
+        model.setDevice(client.getDeviceType());
+        // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
+        // 例如: 后台用户30分钟过期 app用户1天过期
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, clientId);
+        // 生成token
+        LoginHelper.login(loginUser, model);
+
+        loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        loginService.recordLoginInfo(user.getUserId());
+
+        LoginVo loginVo = new LoginVo();
+        loginVo.setAccessToken(StpUtil.getTokenValue());
+        loginVo.setExpireIn(StpUtil.getTokenTimeout());
+        loginVo.setClientId(clientId);
+        return loginVo;
+    }
+
+    /**
+     * 校验短信验证码
+     */
+    private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) {
+        String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber);
+        if (StringUtils.isBlank(code)) {
+            loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
+            throw new CaptchaExpireException();
+        }
+        return code.equals(smsCode);
+    }
+
+    private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+            .select(SysUser::getPhonenumber, SysUser::getStatus)
+            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+            .eq(SysUser::getPhonenumber, phonenumber));
+        if (ObjectUtil.isNull(user)) {
+            log.info("登录用户:{} 不存在.", phonenumber);
+            throw new UserException("user.not.exists", phonenumber);
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("登录用户:{} 已被停用.", phonenumber);
+            throw new UserException("user.blocked", phonenumber);
+        }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByPhonenumber(phonenumber, tenantId);
+        }
+        return userMapper.selectUserByPhonenumber(phonenumber);
+    }
+
+}

+ 138 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java

@@ -0,0 +1,138 @@
+package org.dromara.web.service.impl;
+
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.http.Method;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.enums.UserStatus;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.exception.user.UserException;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.core.utils.ValidatorUtils;
+import org.dromara.common.core.validate.auth.SocialGroup;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.social.config.properties.SocialProperties;
+import org.dromara.common.social.utils.SocialUtils;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.vo.SysSocialVo;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.system.service.ISysSocialService;
+import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.web.service.IAuthStrategy;
+import org.dromara.web.service.SysLoginService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 第三方授权策略
+ *
+ * @author thiszhc is 三三
+ */
+@Slf4j
+@Service("social" + IAuthStrategy.BASE_NAME)
+@RequiredArgsConstructor
+public class SocialAuthStrategy implements IAuthStrategy {
+
+    private final SocialProperties socialProperties;
+    private final ISysSocialService sysSocialService;
+    private final SysUserMapper userMapper;
+    private final SysLoginService loginService;
+
+
+    @Override
+    public void validate(LoginBody loginBody) {
+        ValidatorUtils.validate(loginBody, SocialGroup.class);
+    }
+
+    /**
+     * 登录-第三方授权登录
+     *
+     * @param clientId  客户端id
+     * @param loginBody 登录信息
+     * @param client    客户端信息
+     */
+    @Override
+    public LoginVo login(String clientId, LoginBody loginBody, SysClient client) {
+        AuthResponse<AuthUser> response = SocialUtils.loginAuth(loginBody, socialProperties);
+        if (!response.ok()) {
+            throw new ServiceException(response.getMsg());
+        }
+        AuthUser authUserData = response.getData();
+        if ("GITEE".equals(authUserData.getSource())) {
+            // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖
+            HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus")
+                .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken()))
+                .executeAsync();
+            HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus")
+                .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken()))
+                .executeAsync();
+        }
+
+        SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
+        if (!ObjectUtil.isNotNull(social)) {
+            throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
+        }
+        // 验证授权表里面的租户id是否包含当前租户id
+        String tenantId = social.getTenantId();
+        if (ObjectUtil.isNotNull(social) && StrUtil.isNotBlank(tenantId)
+            && !tenantId.contains(loginBody.getTenantId())) {
+            throw new ServiceException("对不起,你没有权限登录当前租户!");
+        }
+
+        // 查找用户
+        SysUserVo user = loadUser(tenantId, social.getUserId());
+
+        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
+        LoginUser loginUser = loginService.buildLoginUser(user);
+        SaLoginModel model = new SaLoginModel();
+        model.setDevice(client.getDeviceType());
+        // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
+        // 例如: 后台用户30分钟过期 app用户1天过期
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, clientId);
+        // 生成token
+        LoginHelper.login(loginUser, model);
+
+        loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        loginService.recordLoginInfo(user.getUserId());
+
+        LoginVo loginVo = new LoginVo();
+        loginVo.setAccessToken(StpUtil.getTokenValue());
+        loginVo.setExpireIn(StpUtil.getTokenTimeout());
+        loginVo.setClientId(clientId);
+        return loginVo;
+    }
+
+    private SysUserVo loadUser(String tenantId, Long userId) {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+            .select(SysUser::getUserName, SysUser::getStatus)
+            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+            .eq(SysUser::getUserId, userId));
+        if (ObjectUtil.isNull(user)) {
+            log.info("登录用户:{} 不存在.", "");
+            throw new UserException("user.not.exists", "");
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("登录用户:{} 已被停用.", "");
+            throw new UserException("user.blocked", "");
+        }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByUserName(user.getUserName(), tenantId);
+        }
+        return userMapper.selectUserByUserName(user.getUserName());
+    }
+
+}

+ 94 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java

@@ -0,0 +1,94 @@
+package org.dromara.web.service.impl;
+
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.common.core.domain.model.XcxLoginUser;
+import org.dromara.common.core.enums.UserStatus;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.core.utils.ValidatorUtils;
+import org.dromara.common.core.validate.auth.WechatGroup;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.web.service.IAuthStrategy;
+import org.dromara.web.service.SysLoginService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 邮件认证策略
+ *
+ * @author Michelle.Chung
+ */
+@Slf4j
+@Service("xcx" + IAuthStrategy.BASE_NAME)
+@RequiredArgsConstructor
+public class XcxAuthStrategy implements IAuthStrategy {
+
+    private final SysLoginService loginService;
+
+    @Override
+    public void validate(LoginBody loginBody) {
+        ValidatorUtils.validate(loginBody, WechatGroup.class);
+    }
+
+    @Override
+    public LoginVo login(String clientId, LoginBody loginBody, SysClient client) {
+        // xcxCode 为 小程序调用 wx.login 授权后获取
+        String xcxCode = loginBody.getXcxCode();
+        // todo 以下自行实现
+        // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid
+        String openid = "";
+        // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
+        SysUserVo user = loadUserByOpenid(openid);
+
+        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
+        XcxLoginUser loginUser = new XcxLoginUser();
+        loginUser.setTenantId(user.getTenantId());
+        loginUser.setUserId(user.getUserId());
+        loginUser.setUsername(user.getUserName());
+        loginUser.setNickname(user.getNickName());
+        loginUser.setUserType(user.getUserType());
+        loginUser.setOpenid(openid);
+
+        SaLoginModel model = new SaLoginModel();
+        model.setDevice(client.getDeviceType());
+        // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
+        // 例如: 后台用户30分钟过期 app用户1天过期
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, clientId);
+        // 生成token
+        LoginHelper.login(loginUser, model);
+
+        loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        loginService.recordLoginInfo(user.getUserId());
+
+        LoginVo loginVo = new LoginVo();
+        loginVo.setAccessToken(StpUtil.getTokenValue());
+        loginVo.setExpireIn(StpUtil.getTokenTimeout());
+        loginVo.setClientId(clientId);
+        loginVo.setOpenid(openid);
+        return loginVo;
+    }
+
+    private SysUserVo loadUserByOpenid(String openid) {
+        // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户
+        // todo 自行实现 userService.selectUserByOpenid(openid);
+        SysUserVo user = new SysUserVo();
+        if (ObjectUtil.isNull(user)) {
+            log.info("登录用户:{} 不存在.", openid);
+            // todo 用户不存在 业务逻辑自行实现
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("登录用户:{} 已被停用.", openid);
+            // todo 用户已被停用 业务逻辑自行实现
+        }
+        return user;
+    }
+
+}

+ 252 - 0
takai-admin/src/main/resources/application-dev.yml

@@ -0,0 +1,252 @@
+--- # 监控中心配置
+spring.boot.admin.client:
+  # 增加客户端开关
+  enabled: true
+  url: http://localhost:9090/admin
+  instance:
+    service-host-type: IP
+  username: ruoyi
+  password: 123456
+
+--- # powerjob 配置
+powerjob:
+  worker:
+    # 如何开启调度中心请查看文档教程
+    enabled: false
+    # 需要先在 powerjob 登录页执行应用注册后才能使用
+    app-name: ruoyi-worker
+    enable-test-mode: false
+    max-appended-wf-context-length: 4096
+    max-result-length: 4096
+    # 28080 端口 随着主应用端口飘逸 避免集群冲突
+    port: 2${server.port}
+    protocol: http
+    server-address: 127.0.0.1:7700
+    store-strategy: disk
+
+--- # 数据源配置
+spring:
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
+    dynamic:
+      # 性能分析插件(有性能损耗 不建议生产环境使用)
+      p6spy: true
+      # 设置默认的数据源或者数据源组,默认值即为 master
+      primary: master
+      # 严格模式 匹配不到数据源则报错
+      strict: true
+      datasource:
+        # 主库数据源
+        master:
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
+          # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
+          # url: jdbc:mysql://xia0miduo.gicp.net:3336/room_view?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+          url: jdbc:mysql://localhost:3306/room_view?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+          username: root
+          password: password
+        # 从库数据源
+        slave:
+          lazy: true
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+          username:
+          password:
+#        oracle:
+#          type: ${spring.datasource.type}
+#          driverClassName: oracle.jdbc.OracleDriver
+#          url: jdbc:oracle:thin:@//localhost:1521/XE
+#          username: ROOT
+#          password: root
+#          hikari:
+#            connectionTestQuery: SELECT 1 FROM DUAL
+#        postgres:
+#          type: ${spring.datasource.type}
+#          driverClassName: org.postgresql.Driver
+#          url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
+#          username: root
+#          password: root
+#        sqlserver:
+#          type: ${spring.datasource.type}
+#          driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
+#          url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
+#          username: SA
+#          password: root
+      hikari:
+        # 最大连接池数量
+        maxPoolSize: 20
+        # 最小空闲线程数量
+        minIdle: 10
+        # 配置获取连接等待超时的时间
+        connectionTimeout: 30000
+        # 校验超时时间
+        validationTimeout: 5000
+        # 空闲连接存活最大时间,默认10分钟
+        idleTimeout: 600000
+        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
+        maxLifetime: 1800000
+        # 连接测试query(配置检测连接是否有效)
+        connectionTestQuery: SELECT 1
+        # 多久检查一次连接的活性
+        keepaliveTime: 30000
+
+--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
+spring.data:
+  redis:
+    # 地址
+    host: localhost
+    # 端口,默认为6379
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码(如没有密码请注释掉)
+    # password:
+    # 连接超时时间
+    timeout: 10s
+    # 是否开启ssl
+    ssl.enabled: false
+
+redisson:
+  # redis key前缀
+  keyPrefix:
+  # 线程池数量
+  threads: 4
+  # Netty线程池数量
+  nettyThreads: 8
+  # 单节点配置
+  singleServerConfig:
+    # 客户端名称
+    clientName: ${ruoyi.name}
+    # 最小空闲连接数
+    connectionMinimumIdleSize: 8
+    # 连接池大小
+    connectionPoolSize: 32
+    # 连接空闲超时,单位:毫秒
+    idleConnectionTimeout: 10000
+    # 命令等待超时,单位:毫秒
+    timeout: 3000
+    # 发布和订阅连接池大小
+    subscriptionConnectionPoolSize: 50
+
+--- # mail 邮件发送
+mail:
+  enabled: false
+  host: smtp.163.com
+  port: 465
+  # 是否需要用户名密码验证
+  auth: true
+  # 发送方,遵循RFC-822标准
+  from: xxx@163.com
+  # 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
+  user: xxx@163.com
+  # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
+  pass: xxxxxxxxxx
+  # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
+  starttlsEnable: true
+  # 使用SSL安全连接
+  sslEnable: true
+  # SMTP超时时长,单位毫秒,缺省值不超时
+  timeout: 0
+  # Socket连接超时值,单位毫秒,缺省值不超时
+  connectionTimeout: 0
+
+--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
+# https://wind.kim/doc/start 文档地址 各个厂商可同时使用
+sms:
+  # 阿里云 dysmsapi.aliyuncs.com
+  alibaba:
+    #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
+    requestUrl: dysmsapi.aliyuncs.com
+    #阿里云的accessKey
+    accessKeyId: xxxxxxx
+    #阿里云的accessKeySecret
+    accessKeySecret: xxxxxxx
+    #短信签名
+    signature: 测试
+  tencent:
+    #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
+    requestUrl: sms.tencentcloudapi.com
+    #腾讯云的accessKey
+    accessKeyId: xxxxxxx
+    #腾讯云的accessKeySecret
+    accessKeySecret: xxxxxxx
+    #短信签名
+    signature: 测试
+    #短信sdkAppId
+    sdkAppId: appid
+    #地域信息默认为 ap-guangzhou 如无特殊改变可不用设置
+    territory: ap-guangzhou
+
+
+--- # 三方授权
+justauth:
+  enabled: true
+  # 前端外网访问地址
+  address: http://localhost:80
+  type:
+    maxkey:
+      # maxkey 服务器地址
+      # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据
+      server-url: http://sso.maxkey.top
+      client-id: 876892492581044224
+      client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8
+      redirect-uri: ${justauth.address}/social-callback?source=maxkey
+    qq:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=qq
+      union-id: false
+    weibo:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=weibo
+    gitee:
+      client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98
+      client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac
+      redirect-uri: ${justauth.address}/social-callback?source=gitee
+    dingtalk:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=dingtalk
+    baidu:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=baidu
+    csdn:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=csdn
+    coding:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=coding
+      coding-group-name: xx
+    oschina:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=oschina
+    alipay:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=alipay
+      alipay-public-key: MIIB**************DAQAB
+    wechat_open:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=wechat_open
+    wechat_mp:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=wechat_mp
+    wechat_enterprise:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise
+      agent-id: 1000002
+    gitlab:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=gitlab

+ 253 - 0
takai-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,253 @@
+--- # 临时文件存储位置 避免临时文件被系统清理报错
+spring.servlet.multipart.location: /ruoyi/server/temp
+
+--- # 监控中心配置
+spring.boot.admin.client:
+  # 增加客户端开关
+  enabled: true
+  url: http://localhost:9090/admin
+  instance:
+    service-host-type: IP
+  username: ruoyi
+  password: 123456
+
+--- # powerjob 配置
+powerjob:
+  worker:
+    # 如何开启调度中心请查看文档教程
+    enabled: false
+    # 需要先在 powerjob 登录页执行应用注册后才能使用
+    app-name: ruoyi-worker
+    enable-test-mode: false
+    max-appended-wf-context-length: 4096
+    max-result-length: 4096
+    # 28080 端口 随着主应用端口飘逸 避免集群冲突
+    port: 2${server.port}
+    protocol: http
+    server-address: 127.0.0.1:7700
+    store-strategy: disk
+
+--- # 数据源配置
+spring:
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
+    dynamic:
+      # 性能分析插件(有性能损耗 不建议生产环境使用)
+      p6spy: false
+      # 设置默认的数据源或者数据源组,默认值即为 master
+      primary: master
+      # 严格模式 匹配不到数据源则报错
+      strict: true
+      datasource:
+        # 主库数据源
+        master:
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
+          # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
+          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+          username: root
+          password: root
+        # 从库数据源
+        slave:
+          lazy: true
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+          username:
+          password:
+#        oracle:
+#          type: ${spring.datasource.type}
+#          driverClassName: oracle.jdbc.OracleDriver
+#          url: jdbc:oracle:thin:@//localhost:1521/XE
+#          username: ROOT
+#          password: root
+#          hikari:
+#            connectionTestQuery: SELECT 1 FROM DUAL
+#        postgres:
+#          type: ${spring.datasource.type}
+#          driverClassName: org.postgresql.Driver
+#          url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
+#          username: root
+#          password: root
+#        sqlserver:
+#          type: ${spring.datasource.type}
+#          driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
+#          url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
+#          username: SA
+#          password: root
+      hikari:
+        # 最大连接池数量
+        maxPoolSize: 20
+        # 最小空闲线程数量
+        minIdle: 10
+        # 配置获取连接等待超时的时间
+        connectionTimeout: 30000
+        # 校验超时时间
+        validationTimeout: 5000
+        # 空闲连接存活最大时间,默认10分钟
+        idleTimeout: 600000
+        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
+        maxLifetime: 1800000
+        # 连接测试query(配置检测连接是否有效)
+        connectionTestQuery: SELECT 1
+        # 多久检查一次连接的活性
+        keepaliveTime: 30000
+
+--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
+spring.data:
+  redis:
+    # 地址
+    host: localhost
+    # 端口,默认为6379
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码(如没有密码请注释掉)
+    # password:
+    # 连接超时时间
+    timeout: 10s
+    # 是否开启ssl
+    ssl.enabled: false
+
+redisson:
+  # redis key前缀
+  keyPrefix:
+  # 线程池数量
+  threads: 16
+  # Netty线程池数量
+  nettyThreads: 32
+  # 单节点配置
+  singleServerConfig:
+    # 客户端名称
+    clientName: ${ruoyi.name}
+    # 最小空闲连接数
+    connectionMinimumIdleSize: 32
+    # 连接池大小
+    connectionPoolSize: 64
+    # 连接空闲超时,单位:毫秒
+    idleConnectionTimeout: 10000
+    # 命令等待超时,单位:毫秒
+    timeout: 3000
+    # 发布和订阅连接池大小
+    subscriptionConnectionPoolSize: 50
+
+--- # mail 邮件发送
+mail:
+  enabled: false
+  host: smtp.163.com
+  port: 465
+  # 是否需要用户名密码验证
+  auth: true
+  # 发送方,遵循RFC-822标准
+  from: xxx@163.com
+  # 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
+  user: xxx@163.com
+  # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
+  pass: xxxxxxxxxx
+  # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
+  starttlsEnable: true
+  # 使用SSL安全连接
+  sslEnable: true
+  # SMTP超时时长,单位毫秒,缺省值不超时
+  timeout: 0
+  # Socket连接超时值,单位毫秒,缺省值不超时
+  connectionTimeout: 0
+
+--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
+# https://wind.kim/doc/start 文档地址 各个厂商可同时使用
+sms:
+  # 阿里云 dysmsapi.aliyuncs.com
+  alibaba:
+    #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
+    requestUrl: dysmsapi.aliyuncs.com
+    #阿里云的accessKey
+    accessKeyId: xxxxxxx
+    #阿里云的accessKeySecret
+    accessKeySecret: xxxxxxx
+    #短信签名
+    signature: 测试
+  tencent:
+    #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
+    requestUrl: sms.tencentcloudapi.com
+    #腾讯云的accessKey
+    accessKeyId: xxxxxxx
+    #腾讯云的accessKeySecret
+    accessKeySecret: xxxxxxx
+    #短信签名
+    signature: 测试
+    #短信sdkAppId
+    sdkAppId: appid
+    #地域信息默认为 ap-guangzhou 如无特殊改变可不用设置
+    territory: ap-guangzhou
+
+--- # 三方授权
+justauth:
+  enabled: true
+  # 前端外网访问地址
+  address: http://localhost:80
+  type:
+    maxkey:
+      # maxkey 服务器地址
+      # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据
+      server-url: http://sso.maxkey.top
+      client-id: 876892492581044224
+      client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8
+      redirect-uri: ${justauth.address}/social-callback?source=maxkey
+    qq:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=qq
+      union-id: false
+    weibo:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=weibo
+    gitee:
+      client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98
+      client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac
+      redirect-uri: ${justauth.address}/social-callback?source=gitee
+    dingtalk:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=dingtalk
+    baidu:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=baidu
+    csdn:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=csdn
+    coding:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=coding
+      coding-group-name: xx
+    oschina:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=oschina
+    alipay:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=alipay
+      alipay-public-key: MIIB**************DAQAB
+    wechat_open:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=wechat_open
+    wechat_mp:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=wechat_mp
+    wechat_enterprise:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise
+      agent-id: 1000002
+    gitlab:
+      client-id: 10**********6
+      client-secret: 1f7d08**********5b7**********29e
+      redirect-uri: ${justauth.address}/social-callback?source=gitlab

+ 272 - 0
takai-admin/src/main/resources/application.yml

@@ -0,0 +1,272 @@
+# 项目相关配置
+ruoyi:
+  # 名称
+  name: Takai-Vue-Plus
+  # 版本
+  version: ${revision}
+  # 版权年份
+  copyrightYear: 2023
+
+captcha:
+  enable: true
+  # 页面 <参数设置> 可开启关闭 验证码校验
+  # 验证码类型 math 数组计算 char 字符验证
+  type: MATH
+  # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
+  category: CIRCLE
+  # 数字验证码位数
+  numberLength: 1
+  # 字符验证码长度
+  charLength: 4
+
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为8080
+  port: 8080
+  servlet:
+    # 应用的访问路径
+    context-path: /
+  # undertow 配置
+  undertow:
+    # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
+    max-http-post-size: -1
+    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
+    # 每块buffer的空间大小,越小的空间被利用越充分
+    buffer-size: 512
+    # 是否分配的直接内存
+    direct-buffers: true
+    threads:
+      # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
+      io: 8
+      # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
+      worker: 256
+
+# 日志配置
+logging:
+  level:
+    org.dromara: @logging.level@
+    org.springframework: warn
+    tech.powerjob.worker.background: warn
+  config: classpath:logback-plus.xml
+
+# 用户配置
+user:
+  password:
+    # 密码最大错误次数
+    maxRetryCount: 5
+    # 密码锁定时间(默认10分钟)
+    lockTime: 10
+
+# Spring配置
+spring:
+  application:
+    name: ${ruoyi.name}
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: i18n/messages
+  profiles:
+    active: @profiles.active@
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size: 10MB
+      # 设置总上传的文件大小
+      max-request-size: 20MB
+  mvc:
+    format:
+      date-time: yyyy-MM-dd HH:mm:ss
+  jackson:
+    # 日期格式化
+    date-format: yyyy-MM-dd HH:mm:ss
+    serialization:
+      # 格式化输出
+      indent_output: false
+      # 忽略无法转换的对象
+      fail_on_empty_beans: false
+    deserialization:
+      # 允许对象忽略json中不存在的属性
+      fail_on_unknown_properties: false
+
+# Sa-Token配置
+sa-token:
+  # token名称 (同时也是cookie名称)
+  token-name: Authorization
+  # token固定超时 设为七天 (必定过期) 单位: 秒
+  timeout: 604800
+  # 多端不同 token 有效期 可查看 LoginHelper.loginByDevice 方法自定义
+  # token最低活跃时间 (指定时间无操作就过期) 单位: 秒
+  active-timeout: 1800
+  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
+  is-share: false
+  # jwt秘钥
+  jwt-secret-key: abcdefghijklmnopqrstuvwxyz
+
+# security配置
+security:
+  # 排除路径
+  excludes:
+    # 静态资源
+    - /*.html
+    - /**/*.html
+    - /**/*.css
+    - /**/*.js
+    # 公共路径
+    - /favicon.ico
+    - /error
+    # swagger 文档配置
+    - /*/api-docs
+    - /*/api-docs/**
+    # actuator 监控配置
+    - /actuator
+    - /actuator/**
+    - /system/**
+
+# 多租户配置
+tenant:
+  # 是否开启
+  enable: true
+  # 排除表
+  excludes:
+    - sys_menu
+    - sys_tenant
+    - sys_tenant_package
+    - sys_role_dept
+    - sys_role_menu
+    - sys_user_post
+    - sys_user_role
+    - sys_client
+    - region_facilities
+    - region
+    - room
+    - room_region
+    - sys_img
+    - img_type
+    - hot
+    - type_hot
+
+# MyBatisPlus配置
+# https://baomidou.com/config/
+mybatis-plus:
+  # 不支持多包, 如有需要可在注解配置 或 提升扫包等级
+  # 例如 com.**.**.mapper
+  mapperPackage: org.dromara.**.mapper
+  # 对应的 XML 文件位置
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 实体扫描,多个package用逗号或者分号分隔
+  typeAliasesPackage: org.dromara.**.domain
+  global-config:
+    dbConfig:
+      # 主键类型
+      # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
+      # 如需改为自增 需要将数据库表全部设置为自增
+      idType: ASSIGN_ID
+
+# 数据加密
+mybatis-encryptor:
+  # 是否开启加密
+  enable: false
+  # 默认加密算法
+  algorithm: BASE64
+  # 编码方式 BASE64/HEX。默认BASE64
+  encode: BASE64
+  # 安全秘钥 对称算法的秘钥 如:AES,SM4
+  password:
+  # 公私钥 非对称算法的公私钥 如:SM2,RSA
+  publicKey:
+  privateKey:
+
+# api接口加密
+api-decrypt:
+  # 是否开启全局接口加密
+  enabled: true
+  # AES 加密头标识
+  headerFlag: encrypt-key
+  # 公私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换
+  publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
+  privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y=
+
+springdoc:
+  api-docs:
+    # 是否开启接口文档
+    enabled: true
+#  swagger-ui:
+#    # 持久化认证数据
+#    persistAuthorization: true
+  info:
+    # 标题
+    title: '标题:${ruoyi.name}多租户管理系统_接口文档'
+    # 描述
+    description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
+    # 版本
+    version: '版本号: ${ruoyi.version}'
+    # 作者信息
+    contact:
+      name: Lion Li
+      email: crazylionli@163.com
+      url: https://gitee.com/dromara/RuoYi-Vue-Plus
+  components:
+    # 鉴权方式配置
+    security-schemes:
+      apiKey:
+        type: APIKEY
+        in: HEADER
+        name: ${sa-token.token-name}
+  #这里定义了两个分组,可定义多个,也可以不定义
+  group-configs:
+    - group: 1.演示模块
+      packages-to-scan: org.dromara.demo
+    - group: 2.通用模块
+      packages-to-scan: org.dromara.web
+    - group: 3.系统模块
+      packages-to-scan: org.dromara.system
+    - group: 4.代码生成模块
+      packages-to-scan: org.dromara.generator
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+# 全局线程池相关配置
+thread-pool:
+  # 是否开启线程池
+  enabled: false
+  # 队列最大长度
+  queueCapacity: 128
+  # 线程池维护线程所允许的空闲时间
+  keepAliveSeconds: 300
+
+--- # 分布式锁 lock4j 全局配置
+lock4j:
+  # 获取分布式锁超时时间,默认为 3000 毫秒
+  acquire-timeout: 3000
+  # 分布式锁的超时时间,默认为 30 秒
+  expire: 30000
+
+--- # Actuator 监控端点的配置项
+management:
+  endpoints:
+    web:
+      exposure:
+        include: '*'
+  endpoint:
+    health:
+      show-details: ALWAYS
+    logfile:
+      external-file: ./logs/sys-console.log
+
+--- # websocket
+websocket:
+  enabled: true
+  # 路径
+  path: /resource/websocket
+  # 设置访问源地址
+  allowedOrigins: '*'

+ 8 - 0
takai-admin/src/main/resources/banner.txt

@@ -0,0 +1,8 @@
+Application Version: ${revision}
+Spring Boot Version: ${spring-boot.version}
+__________            _____.___.__         ____   ____                     __________.__
+\______   \__ __  ____\__  |   |__|        \   \ /   /_ __   ____          \______   \  |  __ __  ______
+ |       _/  |  \/  _ \/   |   |  |  ______ \   Y   /  |  \_/ __ \   ______ |     ___/  | |  |  \/  ___/
+ |    |   \  |  (  <_> )____   |  | /_____/  \     /|  |  /\  ___/  /_____/ |    |   |  |_|  |  /\___ \
+ |____|_  /____/ \____// ______|__|           \___/ |____/  \___  >         |____|   |____/____//____  >
+        \/             \/                                       \/                                   \/

+ 57 - 0
takai-admin/src/main/resources/i18n/messages.properties

@@ -0,0 +1,57 @@
+#错误消息
+not.null=* 必须填写
+user.jcaptcha.error=验证码错误
+user.jcaptcha.expire=验证码已失效
+user.not.exists=对不起, 您的账号:{0} 不存在.
+user.password.not.match=用户不存在/密码错误
+user.password.retry.limit.count=密码输入错误{0}次
+user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
+user.password.delete=对不起,您的账号:{0} 已被删除
+user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员
+role.blocked=角色已封禁,请联系管理员
+user.logout.success=退出成功
+length.not.valid=长度必须在{min}到{max}个字符之间
+user.username.not.blank=用户名不能为空
+user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
+user.username.length.valid=账户长度必须在{min}到{max}个字符之间
+user.password.not.blank=用户密码不能为空
+user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间
+user.password.not.valid=* 5-50个字符
+user.email.not.valid=邮箱格式错误
+user.email.not.blank=邮箱不能为空
+user.phonenumber.not.blank=用户手机号不能为空
+user.mobile.phone.number.not.valid=手机号格式错误
+user.login.success=登录成功
+user.register.success=注册成功
+user.register.save.error=保存用户 {0} 失败,注册账号已存在
+user.register.error=注册失败,请联系系统管理人员
+user.notfound=请重新登录
+user.forcelogout=管理员强制退出,请重新登录
+user.unknown.error=未知错误,请重新登录
+auth.grant.type.error=认证权限类型错误
+auth.grant.type.not.blank=认证权限类型不能为空
+auth.clientid.not.blank=认证客户端id不能为空
+##文件上传消息
+upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
+upload.filename.exceed.length=上传的文件名最长{0}个字符
+##权限
+no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
+no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
+no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
+no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
+no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
+no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
+repeat.submit.message=不允许重复提交,请稍候再试
+rate.limiter.message=访问过于频繁,请稍候再试
+sms.code.not.blank=短信验证码不能为空
+sms.code.retry.limit.count=短信验证码输入错误{0}次
+sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟
+email.code.not.blank=邮箱验证码不能为空
+email.code.retry.limit.count=邮箱验证码输入错误{0}次
+email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟
+xcx.code.not.blank=小程序code不能为空
+##租户
+tenant.number.not.blank=租户编号不能为空
+tenant.not.exists=对不起, 您的租户不存在,请联系管理员
+tenant.blocked=对不起,您的租户已禁用,请联系管理员
+tenant.expired=对不起,您的租户已过期,请联系管理员

+ 57 - 0
takai-admin/src/main/resources/i18n/messages_en_US.properties

@@ -0,0 +1,57 @@
+#错误消息
+not.null=* Required fill in
+user.jcaptcha.error=Captcha error
+user.jcaptcha.expire=Captcha invalid
+user.not.exists=Sorry, your account: {0} does not exist
+user.password.not.match=User does not exist/Password error
+user.password.retry.limit.count=Password input error {0} times
+user.password.retry.limit.exceed=Password input error {0} times, account locked for {1} minutes
+user.password.delete=Sorry, your account:{0} has been deleted
+user.blocked=Sorry, your account: {0} has been disabled. Please contact the administrator
+role.blocked=Role disabled,please contact administrators
+user.logout.success=Exit successful
+length.not.valid=The length must be between {min} and {max} characters
+user.username.not.blank=Username cannot be blank
+user.username.not.valid=* 2 to 20 chinese characters, letters, numbers or underscores, and must start with a non number
+user.username.length.valid=Account length must be between {min} and {max} characters
+user.password.not.blank=Password cannot be empty
+user.password.length.valid=Password length must be between {min} and {max} characters
+user.password.not.valid=* 5-50 characters
+user.email.not.valid=Mailbox format error
+user.email.not.blank=Mailbox cannot be blank
+user.phonenumber.not.blank=Phone number cannot be blank
+user.mobile.phone.number.not.valid=Phone number format error
+user.login.success=Login successful
+user.register.success=Register successful
+user.register.save.error=Failed to save user {0}, The registered account already exists
+user.register.error=Register failed, please contact system administrator
+user.notfound=Please login again
+user.forcelogout=The administrator is forced to exit,please login again
+user.unknown.error=Unknown error, please login again
+auth.grant.type.error=Auth grant type error
+auth.grant.type.not.blank=Auth grant type cannot be blank
+auth.clientid.not.blank=Auth clientid cannot be blank
+##文件上传消息
+upload.exceed.maxSize=The uploaded file size exceeds the limit file size!<br/>the maximum allowed file size is:{0}MB!
+upload.filename.exceed.length=The maximum length of uploaded file name is {0} characters
+##权限
+no.permission=You do not have permission to the data,please contact your administrator to add permissions [{0}]
+no.create.permission=You do not have permission to create data,please contact your administrator to add permissions [{0}]
+no.update.permission=You do not have permission to modify data,please contact your administrator to add permissions [{0}]
+no.delete.permission=You do not have permission to delete data,please contact your administrator to add permissions [{0}]
+no.export.permission=You do not have permission to export data,please contact your administrator to add permissions [{0}]
+no.view.permission=You do not have permission to view data,please contact your administrator to add permissions [{0}]
+repeat.submit.message=Repeat submit is not allowed, please try again later
+rate.limiter.message=Visit too frequently, please try again later
+sms.code.not.blank=Sms code cannot be blank
+sms.code.retry.limit.count=Sms code input error {0} times
+sms.code.retry.limit.exceed=Sms code input error {0} times, account locked for {1} minutes
+email.code.not.blank=Email code cannot be blank
+email.code.retry.limit.count=Email code input error {0} times
+email.code.retry.limit.exceed=Email code input error {0} times, account locked for {1} minutes
+xcx.code.not.blank=Mini program code cannot be blank
+##租户
+tenant.number.not.blank=Tenant number cannot be blank
+tenant.not.exists=Sorry, your tenant does not exist. Please contact the administrator
+tenant.blocked=Sorry, your tenant is disabled. Please contact the administrator
+tenant.expired=Sorry, your tenant has expired. Please contact the administrator.

+ 57 - 0
takai-admin/src/main/resources/i18n/messages_zh_CN.properties

@@ -0,0 +1,57 @@
+#错误消息
+not.null=* 必须填写
+user.jcaptcha.error=验证码错误
+user.jcaptcha.expire=验证码已失效
+user.not.exists=对不起, 您的账号:{0} 不存在.
+user.password.not.match=用户不存在/密码错误
+user.password.retry.limit.count=密码输入错误{0}次
+user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
+user.password.delete=对不起,您的账号:{0} 已被删除
+user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员
+role.blocked=角色已封禁,请联系管理员
+user.logout.success=退出成功
+length.not.valid=长度必须在{min}到{max}个字符之间
+user.username.not.blank=用户名不能为空
+user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
+user.username.length.valid=账户长度必须在{min}到{max}个字符之间
+user.password.not.blank=用户密码不能为空
+user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间
+user.password.not.valid=* 5-50个字符
+user.email.not.valid=邮箱格式错误
+user.email.not.blank=邮箱不能为空
+user.phonenumber.not.blank=用户手机号不能为空
+user.mobile.phone.number.not.valid=手机号格式错误
+user.login.success=登录成功
+user.register.success=注册成功
+user.register.save.error=保存用户 {0} 失败,注册账号已存在
+user.register.error=注册失败,请联系系统管理人员
+user.notfound=请重新登录
+user.forcelogout=管理员强制退出,请重新登录
+user.unknown.error=未知错误,请重新登录
+auth.grant.type.error=认证权限类型错误
+auth.grant.type.not.blank=认证权限类型不能为空
+auth.clientid.not.blank=认证客户端id不能为空
+##文件上传消息
+upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
+upload.filename.exceed.length=上传的文件名最长{0}个字符
+##权限
+no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
+no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
+no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
+no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
+no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
+no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
+repeat.submit.message=不允许重复提交,请稍候再试
+rate.limiter.message=访问过于频繁,请稍候再试
+sms.code.not.blank=短信验证码不能为空
+sms.code.retry.limit.count=短信验证码输入错误{0}次
+sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟
+email.code.not.blank=邮箱验证码不能为空
+email.code.retry.limit.count=邮箱验证码输入错误{0}次
+email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟
+xcx.code.not.blank=小程序code不能为空
+##租户
+tenant.number.not.blank=租户编号不能为空
+tenant.not.exists=对不起, 您的租户不存在,请联系管理员
+tenant.blocked=对不起,您的租户已禁用,请联系管理员
+tenant.expired=对不起,您的租户已过期,请联系管理员

BIN
takai-admin/src/main/resources/ip2region.xdb


+ 129 - 0
takai-admin/src/main/resources/logback-plus.xml

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <property name="log.path" value="./logs"/>
+    <property name="console.log.pattern"
+              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 控制台输出 -->
+    <appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/sys-console.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-console.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大 1天 -->
+            <maxHistory>1</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+        </filter>
+    </appender>
+
+    <!-- 系统日志输出 -->
+    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/sys-info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/sys-error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- info异步输出 -->
+    <appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
+        <queueSize>512</queueSize>
+        <!-- 添加附加的appender,最多只能添加一个 -->
+        <appender-ref ref="file_info"/>
+    </appender>
+
+    <!-- error异步输出 -->
+    <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
+        <queueSize>512</queueSize>
+        <!-- 添加附加的appender,最多只能添加一个 -->
+        <appender-ref ref="file_error"/>
+    </appender>
+
+    <!-- 整合 skywalking 控制台输出 tid -->
+<!--    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">-->
+<!--        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">-->
+<!--            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">-->
+<!--                <pattern>[%tid] ${console.log.pattern}</pattern>-->
+<!--            </layout>-->
+<!--            <charset>utf-8</charset>-->
+<!--        </encoder>-->
+<!--    </appender>-->
+
+    <!-- 整合 skywalking 推送采集日志 -->
+<!--    <appender name="sky_log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">-->
+<!--        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">-->
+<!--            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">-->
+<!--                <pattern>[%tid] ${console.log.pattern}</pattern>-->
+<!--            </layout>-->
+<!--            <charset>utf-8</charset>-->
+<!--        </encoder>-->
+<!--    </appender>-->
+
+    <!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="console" />
+        <appender-ref ref="async_info" />
+        <appender-ref ref="async_error" />
+        <appender-ref ref="file_console" />
+<!--        <appender-ref ref="sky_log"/>-->
+    </root>
+
+</configuration>

+ 28 - 0
takai-admin/src/main/resources/spy.properties

@@ -0,0 +1,28 @@
+# p6spy 性能分析插件配置文件
+modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
+# 自定义日志打印
+logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
+#日志输出到控制台
+appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
+# 使用日志系统记录 sql
+#appender=com.p6spy.engine.spy.appender.Slf4JLogger
+# 设置 p6spy driver 代理
+#deregisterdrivers=true
+# 取消JDBC URL前缀
+useprefix=true
+# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
+excludecategories=info,debug,result,commit,resultset
+# 日期格式
+dateformat=yyyy-MM-dd HH:mm:ss
+# SQL语句打印时间格式
+databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss
+# 实际驱动可多个
+#driverlist=org.h2.Driver
+# 是否开启慢SQL记录
+outagedetection=true
+# 慢SQL记录标准 2 秒
+outagedetectioninterval=2
+# 是否过滤 Log
+filter=true
+# 过滤 Log 时所排除的 sql 关键字,以逗号分隔
+exclude=SELECT 1

+ 45 - 0
takai-admin/src/test/java/org/dromara/test/AssertUnitTest.java

@@ -0,0 +1,45 @@
+package org.dromara.test;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+/**
+ * 断言单元测试案例
+ *
+ * @author Lion Li
+ */
+@DisplayName("断言单元测试案例")
+public class AssertUnitTest {
+
+    @DisplayName("测试 assertEquals 方法")
+    @Test
+    public void testAssertEquals() {
+        Assertions.assertEquals("666", new String("666"));
+        Assertions.assertNotEquals("666", new String("666"));
+    }
+
+    @DisplayName("测试 assertSame 方法")
+    @Test
+    public void testAssertSame() {
+        Object obj = new Object();
+        Object obj1 = obj;
+        Assertions.assertSame(obj, obj1);
+        Assertions.assertNotSame(obj, obj1);
+    }
+
+    @DisplayName("测试 assertTrue 方法")
+    @Test
+    public void testAssertTrue() {
+        Assertions.assertTrue(true);
+        Assertions.assertFalse(true);
+    }
+
+    @DisplayName("测试 assertNull 方法")
+    @Test
+    public void testAssertNull() {
+        Assertions.assertNull(null);
+        Assertions.assertNotNull(null);
+    }
+
+}

+ 70 - 0
takai-admin/src/test/java/org/dromara/test/DemoUnitTest.java

@@ -0,0 +1,70 @@
+package org.dromara.test;
+
+import org.dromara.common.core.config.RuoYiConfig;
+import org.junit.jupiter.api.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 单元测试案例
+ *
+ * @author Lion Li
+ */
+@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件
+@DisplayName("单元测试案例")
+public class DemoUnitTest {
+
+    @Autowired
+    private RuoYiConfig ruoYiConfig;
+
+    @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解")
+    @Test
+    public void testTest() {
+        System.out.println(ruoYiConfig);
+    }
+
+    @Disabled
+    @DisplayName("测试 @Disabled 注解")
+    @Test
+    public void testDisabled() {
+        System.out.println(ruoYiConfig);
+    }
+
+    @Timeout(value = 2L, unit = TimeUnit.SECONDS)
+    @DisplayName("测试 @Timeout 注解")
+    @Test
+    public void testTimeout() throws InterruptedException {
+        Thread.sleep(3000);
+        System.out.println(ruoYiConfig);
+    }
+
+
+    @DisplayName("测试 @RepeatedTest 注解")
+    @RepeatedTest(3)
+    public void testRepeatedTest() {
+        System.out.println(666);
+    }
+
+    @BeforeAll
+    public static void testBeforeAll() {
+        System.out.println("@BeforeAll ==================");
+    }
+
+    @BeforeEach
+    public void testBeforeEach() {
+        System.out.println("@BeforeEach ==================");
+    }
+
+    @AfterEach
+    public void testAfterEach() {
+        System.out.println("@AfterEach ==================");
+    }
+
+    @AfterAll
+    public static void testAfterAll() {
+        System.out.println("@AfterAll ==================");
+    }
+
+}

+ 72 - 0
takai-admin/src/test/java/org/dromara/test/ParamUnitTest.java

@@ -0,0 +1,72 @@
+package org.dromara.test;
+
+import org.dromara.common.core.enums.UserType;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.NullSource;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+/**
+ * 带参数单元测试案例
+ *
+ * @author Lion Li
+ */
+@DisplayName("带参数单元测试案例")
+public class ParamUnitTest {
+
+    @DisplayName("测试 @ValueSource 注解")
+    @ParameterizedTest
+    @ValueSource(strings = {"t1", "t2", "t3"})
+    public void testValueSource(String str) {
+        System.out.println(str);
+    }
+
+    @DisplayName("测试 @NullSource 注解")
+    @ParameterizedTest
+    @NullSource
+    public void testNullSource(String str) {
+        System.out.println(str);
+    }
+
+    @DisplayName("测试 @EnumSource 注解")
+    @ParameterizedTest
+    @EnumSource(UserType.class)
+    public void testEnumSource(UserType type) {
+        System.out.println(type.getUserType());
+    }
+
+    @DisplayName("测试 @MethodSource 注解")
+    @ParameterizedTest
+    @MethodSource("getParam")
+    public void testMethodSource(String str) {
+        System.out.println(str);
+    }
+
+    public static Stream<String> getParam() {
+        List<String> list = new ArrayList<>();
+        list.add("t1");
+        list.add("t2");
+        list.add("t3");
+        return list.stream();
+    }
+
+    @BeforeEach
+    public void testBeforeEach() {
+        System.out.println("@BeforeEach ==================");
+    }
+
+    @AfterEach
+    public void testAfterEach() {
+        System.out.println("@AfterEach ==================");
+    }
+
+
+}

+ 54 - 0
takai-admin/src/test/java/org/dromara/test/TagUnitTest.java

@@ -0,0 +1,54 @@
+package org.dromara.test;
+
+import org.junit.jupiter.api.*;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * 标签单元测试案例
+ *
+ * @author Lion Li
+ */
+@SpringBootTest
+@DisplayName("标签单元测试案例")
+public class TagUnitTest {
+
+    @Tag("dev")
+    @DisplayName("测试 @Tag dev")
+    @Test
+    public void testTagDev() {
+        System.out.println("dev");
+    }
+
+    @Tag("prod")
+    @DisplayName("测试 @Tag prod")
+    @Test
+    public void testTagProd() {
+        System.out.println("prod");
+    }
+
+    @Tag("local")
+    @DisplayName("测试 @Tag local")
+    @Test
+    public void testTagLocal() {
+        System.out.println("local");
+    }
+
+    @Tag("exclude")
+    @DisplayName("测试 @Tag exclude")
+    @Test
+    public void testTagExclude() {
+        System.out.println("exclude");
+    }
+
+    @BeforeEach
+    public void testBeforeEach() {
+        System.out.println("@BeforeEach ==================");
+    }
+
+    @AfterEach
+    public void testAfterEach() {
+        System.out.println("@AfterEach ==================");
+    }
+
+
+}

+ 45 - 0
takai-common/pom.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>takai-plus</artifactId>
+        <groupId>org.dromara</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <modules>
+        <module>takai-common-bom</module>
+        <module>takai-common-social</module>
+        <module>takai-common-core</module>
+        <module>takai-common-doc</module>
+        <module>takai-common-excel</module>
+        <module>takai-common-idempotent</module>
+        <module>takai-common-job</module>
+        <module>takai-common-log</module>
+        <module>takai-common-mail</module>
+        <module>takai-common-mybatis</module>
+        <module>takai-common-oss</module>
+        <module>takai-common-ratelimiter</module>
+        <module>takai-common-redis</module>
+        <module>takai-common-satoken</module>
+        <module>takai-common-security</module>
+        <module>takai-common-sms</module>
+        <module>takai-common-web</module>
+        <module>takai-common-translation</module>
+        <module>takai-common-sensitive</module>
+        <module>takai-common-json</module>
+        <module>takai-common-encrypt</module>
+        <module>takai-common-tenant</module>
+        <module>takai-common-websocket</module>
+    </modules>
+
+    <artifactId>takai-common</artifactId>
+    <packaging>pom</packaging>
+
+    <description>
+        common 通用模块
+    </description>
+
+</project>

+ 178 - 0
takai-common/takai-common-bom/pom.xml

@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.dromara</groupId>
+    <artifactId>takai-common-bom</artifactId>
+    <version>${revision}</version>
+    <packaging>pom</packaging>
+
+    <description>
+        takai-common-bom common依赖项
+    </description>
+
+    <properties>
+        <revision>5.1.0-BETA</revision>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- 核心模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-core</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 接口模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-doc</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- excel -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-excel</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 幂等 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-idempotent</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 调度模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-job</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 日志记录 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-log</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 邮件服务 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-mail</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 数据库服务 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-mybatis</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- OSS -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-oss</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 限流 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-ratelimiter</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 缓存服务 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-redis</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- satoken -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-satoken</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 安全模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-security</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 短信模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-sms</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-social</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- web服务 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-web</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 翻译模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-translation</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 脱敏模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-sensitive</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 序列化模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-json</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 数据库加解密模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-encrypt</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- 租户模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-tenant</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!-- WebSocket模块 -->
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>takai-common-websocket</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+</project>

+ 105 - 0
takai-common/takai-common-core/pom.xml

@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>takai-common</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>takai-common-core</artifactId>
+
+    <description>
+        takai-common-core 核心模块
+    </description>
+
+    <dependencies>
+        <!-- Spring框架基本的核心工具 -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+        </dependency>
+
+        <!-- SpringWeb模块 -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+
+        <!-- 自定义验证注解 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <!--常用工具类 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+        <!-- servlet包 -->
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-http</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-extra</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-json</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <!--  自动生成YML配置关联JSON文件  -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-properties-migrator</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>io.github.linpeilie</groupId>
+            <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- 离线IP地址定位库 -->
+        <dependency>
+            <groupId>org.lionsoul</groupId>
+            <artifactId>ip2region</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 16 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java

@@ -0,0 +1,16 @@
+package org.dromara.common.core.config;
+
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+
+/**
+ * 程序注解配置
+ *
+ * @author Lion Li
+ */
+@AutoConfiguration
+// 表示通过aop框架暴露该代理对象,AopContext能够访问
+@EnableAspectJAutoProxy(exposeProxy = true)
+public class ApplicationConfig {
+
+}

+ 48 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/AsyncConfig.java

@@ -0,0 +1,48 @@
+package org.dromara.common.core.config;
+
+import cn.hutool.core.util.ArrayUtil;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.SpringUtils;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+import java.util.Arrays;
+import java.util.concurrent.Executor;
+
+/**
+ * 异步配置
+ *
+ * @author Lion Li
+ */
+@EnableAsync(proxyTargetClass = true)
+@AutoConfiguration
+public class AsyncConfig implements AsyncConfigurer {
+
+    /**
+     * 自定义 @Async 注解使用系统线程池
+     */
+    @Override
+    public Executor getAsyncExecutor() {
+        return SpringUtils.getBean("scheduledExecutorService");
+    }
+
+    /**
+     * 异步执行异常处理
+     */
+    @Override
+    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+        return (throwable, method, objects) -> {
+            throwable.printStackTrace();
+            StringBuilder sb = new StringBuilder();
+            sb.append("Exception message - ").append(throwable.getMessage())
+                .append(", Method name - ").append(method.getName());
+            if (ArrayUtil.isNotEmpty(objects)) {
+                sb.append(", Parameter value - ").append(Arrays.toString(objects));
+            }
+            throw new ServiceException(sb.toString());
+        };
+    }
+
+}

+ 33 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java

@@ -0,0 +1,33 @@
+package org.dromara.common.core.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ *
+ * @author Lion Li
+ */
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "ruoyi")
+public class RuoYiConfig {
+
+    /**
+     * 项目名称
+     */
+    private String name;
+
+    /**
+     * 版本
+     */
+    private String version;
+
+    /**
+     * 版权年份
+     */
+    private String copyrightYear;
+
+}

+ 78 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java

@@ -0,0 +1,78 @@
+package org.dromara.common.core.config;
+
+import jakarta.annotation.PreDestroy;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
+import org.dromara.common.core.config.properties.ThreadPoolProperties;
+import org.dromara.common.core.utils.Threads;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 线程池配置
+ *
+ * @author Lion Li
+ **/
+@Slf4j
+@AutoConfiguration
+@EnableConfigurationProperties(ThreadPoolProperties.class)
+public class ThreadPoolConfig {
+
+    /**
+     * 核心线程数 = cpu 核心数 + 1
+     */
+    private final int core = Runtime.getRuntime().availableProcessors() + 1;
+
+    private ScheduledExecutorService scheduledExecutorService;
+
+    @Bean(name = "threadPoolTaskExecutor")
+    @ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true")
+    public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolProperties threadPoolProperties) {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(core);
+        executor.setMaxPoolSize(core * 2);
+        executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());
+        executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds());
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        return executor;
+    }
+
+    /**
+     * 执行周期性或定时任务
+     */
+    @Bean(name = "scheduledExecutorService")
+    protected ScheduledExecutorService scheduledExecutorService() {
+        ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(core,
+            new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
+            new ThreadPoolExecutor.CallerRunsPolicy()) {
+            @Override
+            protected void afterExecute(Runnable r, Throwable t) {
+                super.afterExecute(r, t);
+                Threads.printException(r, t);
+            }
+        };
+        this.scheduledExecutorService = scheduledThreadPoolExecutor;
+        return scheduledThreadPoolExecutor;
+    }
+
+    /**
+     * 销毁事件
+     */
+    @PreDestroy
+    public void destroy() {
+        try {
+            log.info("====关闭后台任务任务线程池====");
+            Threads.shutdownAndAwaitTermination(scheduledExecutorService);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+}

+ 40 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java

@@ -0,0 +1,40 @@
+package org.dromara.common.core.config;
+
+import jakarta.validation.Validator;
+import org.hibernate.validator.HibernateValidator;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.MessageSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
+
+import java.util.Properties;
+
+/**
+ * 校验框架配置类
+ *
+ * @author Lion Li
+ */
+@AutoConfiguration
+public class ValidatorConfig {
+
+    /**
+     * 配置校验框架 快速返回模式
+     */
+    @Bean
+    public Validator validator(MessageSource messageSource) {
+        try (LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean()) {
+            // 国际化
+            factoryBean.setValidationMessageSource(messageSource);
+            // 设置使用 HibernateValidator 校验器
+            factoryBean.setProviderClass(HibernateValidator.class);
+            Properties properties = new Properties();
+            // 设置 快速异常返回
+            properties.setProperty("hibernate.validator.fail_fast", "true");
+            factoryBean.setValidationProperties(properties);
+            // 加载配置
+            factoryBean.afterPropertiesSet();
+            return factoryBean.getValidator();
+        }
+    }
+
+}

+ 30 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/config/properties/ThreadPoolProperties.java

@@ -0,0 +1,30 @@
+package org.dromara.common.core.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 线程池 配置属性
+ *
+ * @author Lion Li
+ */
+@Data
+@ConfigurationProperties(prefix = "thread-pool")
+public class ThreadPoolProperties {
+
+    /**
+     * 是否开启线程池
+     */
+    private boolean enabled;
+
+    /**
+     * 队列最大长度
+     */
+    private int queueCapacity;
+
+    /**
+     * 线程池维护线程所允许的空闲时间
+     */
+    private int keepAliveSeconds;
+
+}

+ 25 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java

@@ -0,0 +1,25 @@
+package org.dromara.common.core.constant;
+
+/**
+ * 缓存的key 常量
+ *
+ * @author Lion Li
+ */
+public interface CacheConstants {
+
+    /**
+     * 在线用户 redis key
+     */
+    String ONLINE_TOKEN_KEY = "online_tokens:";
+
+    /**
+     * 参数管理 cache key
+     */
+    String SYS_CONFIG_KEY = "sys_config:";
+
+    /**
+     * 字典管理 cache key
+     */
+    String SYS_DICT_KEY = "sys_dict:";
+
+}

+ 63 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -0,0 +1,63 @@
+package org.dromara.common.core.constant;
+
+/**
+ * 缓存组名称常量
+ * <p>
+ * key 格式为 cacheNames#ttl#maxIdleTime#maxSize
+ * <p>
+ * ttl 过期时间 如果设置为0则不过期 默认为0
+ * maxIdleTime 最大空闲时间 根据LRU算法清理空闲数据 如果设置为0则不检测 默认为0
+ * maxSize 组最大长度 根据LRU算法清理溢出数据 如果设置为0则无限长 默认为0
+ * <p>
+ * 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500
+ *
+ * @author Lion Li
+ */
+public interface CacheNames {
+
+    /**
+     * 演示案例
+     */
+    String DEMO_CACHE = "demo:cache#60s#10m#20";
+
+    /**
+     * 系统配置
+     */
+    String SYS_CONFIG = "sys_config";
+
+    /**
+     * 数据字典
+     */
+    String SYS_DICT = "sys_dict";
+
+    /**
+     * 租户
+     */
+    String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d";
+
+    /**
+     * 用户账户
+     */
+    String SYS_USER_NAME = "sys_user_name#30d";
+
+    /**
+     * 部门
+     */
+    String SYS_DEPT = "sys_dept#30d";
+
+    /**
+     * OSS内容
+     */
+    String SYS_OSS = "sys_oss#30d";
+
+    /**
+     * OSS配置
+     */
+    String SYS_OSS_CONFIG = "sys_oss_config";
+
+    /**
+     * 在线用户
+     */
+    String ONLINE_TOKEN = "online_tokens";
+
+}

+ 81 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/Constants.java

@@ -0,0 +1,81 @@
+package org.dromara.common.core.constant;
+
+/**
+ * 通用常量信息
+ *
+ * @author ruoyi
+ */
+public interface Constants {
+
+    /**
+     * UTF-8 字符集
+     */
+    String UTF8 = "UTF-8";
+
+    /**
+     * GBK 字符集
+     */
+    String GBK = "GBK";
+
+    /**
+     * www主域
+     */
+    String WWW = "www.";
+
+    /**
+     * http请求
+     */
+    String HTTP = "http://";
+
+    /**
+     * https请求
+     */
+    String HTTPS = "https://";
+
+    /**
+     * 通用成功标识
+     */
+    String SUCCESS = "0";
+
+    /**
+     * 通用失败标识
+     */
+    String FAIL = "1";
+
+    /**
+     * 登录成功
+     */
+    String LOGIN_SUCCESS = "Success";
+
+    /**
+     * 注销
+     */
+    String LOGOUT = "Logout";
+
+    /**
+     * 注册
+     */
+    String REGISTER = "Register";
+
+    /**
+     * 登录失败
+     */
+    String LOGIN_FAIL = "Error";
+
+    /**
+     * 验证码有效期(分钟)
+     */
+    Integer CAPTCHA_EXPIRATION = 2;
+
+    /**
+     * 令牌
+     */
+    String TOKEN = "token";
+
+    /**
+     * 顶级部门id
+     */
+    Long TOP_PARENT_ID = 0L;
+
+}
+

+ 39 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java

@@ -0,0 +1,39 @@
+package org.dromara.common.core.constant;
+
+/**
+ * 全局的key常量 (业务无关的key)
+ *
+ * @author Lion Li
+ */
+public interface GlobalConstants {
+
+    /**
+     * 全局 redis key (业务无关的key)
+     */
+    String GLOBAL_REDIS_KEY = "global:";
+
+    /**
+     * 验证码 redis key
+     */
+    String CAPTCHA_CODE_KEY = GLOBAL_REDIS_KEY + "captcha_codes:";
+
+    /**
+     * 防重提交 redis key
+     */
+    String REPEAT_SUBMIT_KEY = GLOBAL_REDIS_KEY + "repeat_submit:";
+
+    /**
+     * 限流 redis key
+     */
+    String RATE_LIMIT_KEY = GLOBAL_REDIS_KEY + "rate_limit:";
+
+    /**
+     * 登录账户密码错误次数 redis key
+     */
+    String PWD_ERR_CNT_KEY = GLOBAL_REDIS_KEY + "pwd_err_cnt:";
+
+    /**
+     * 三方认证 redis key
+     */
+    String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:";
+}

+ 93 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/HttpStatus.java

@@ -0,0 +1,93 @@
+package org.dromara.common.core.constant;
+
+/**
+ * 返回状态码
+ *
+ * @author Lion Li
+ */
+public interface HttpStatus {
+    /**
+     * 操作成功
+     */
+    int SUCCESS = 200;
+
+    /**
+     * 对象创建成功
+     */
+    int CREATED = 201;
+
+    /**
+     * 请求已经被接受
+     */
+    int ACCEPTED = 202;
+
+    /**
+     * 操作已经执行成功,但是没有返回数据
+     */
+    int NO_CONTENT = 204;
+
+    /**
+     * 资源已被移除
+     */
+    int MOVED_PERM = 301;
+
+    /**
+     * 重定向
+     */
+    int SEE_OTHER = 303;
+
+    /**
+     * 资源没有被修改
+     */
+    int NOT_MODIFIED = 304;
+
+    /**
+     * 参数列表错误(缺少,格式不匹配)
+     */
+    int BAD_REQUEST = 400;
+
+    /**
+     * 未授权
+     */
+    int UNAUTHORIZED = 401;
+
+    /**
+     * 访问受限,授权过期
+     */
+    int FORBIDDEN = 403;
+
+    /**
+     * 资源,服务未找到
+     */
+    int NOT_FOUND = 404;
+
+    /**
+     * 不允许的http方法
+     */
+    int BAD_METHOD = 405;
+
+    /**
+     * 资源冲突,或者资源被锁
+     */
+    int CONFLICT = 409;
+
+    /**
+     * 不支持的数据,媒体类型
+     */
+    int UNSUPPORTED_TYPE = 415;
+
+    /**
+     * 系统内部错误
+     */
+    int ERROR = 500;
+
+    /**
+     * 接口未实现
+     */
+    int NOT_IMPLEMENTED = 501;
+
+    /**
+     * 系统警告消息
+     */
+    int WARN = 601;
+}

+ 45 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java

@@ -0,0 +1,45 @@
+package org.dromara.common.core.constant;
+
+/**
+ * 租户常量信息
+ *
+ * @author Lion Li
+ */
+public interface TenantConstants {
+
+    /**
+     * 租户正常状态
+     */
+    String NORMAL = "0";
+
+    /**
+     * 租户封禁状态
+     */
+    String DISABLE = "1";
+
+    /**
+     * 超级管理员ID
+     */
+    Long SUPER_ADMIN_ID = 1L;
+
+    /**
+     * 超级管理员角色 roleKey
+     */
+    String SUPER_ADMIN_ROLE_KEY = "superadmin";
+
+    /**
+     * 租户管理员角色 roleKey
+     */
+    String TENANT_ADMIN_ROLE_KEY = "admin";
+
+    /**
+     * 租户管理员角色名称
+     */
+    String TENANT_ADMIN_ROLE_NAME = "管理员";
+
+    /**
+     * 默认租户ID
+     */
+    String DEFAULT_TENANT_ID = "000000";
+
+}

+ 142 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java

@@ -0,0 +1,142 @@
+package org.dromara.common.core.constant;
+
+/**
+ * 用户常量信息
+ *
+ * @author ruoyi
+ */
+public interface UserConstants {
+
+    /**
+     * 平台内系统用户的唯一标志
+     */
+    String SYS_USER = "SYS_USER";
+
+    /**
+     * 正常状态
+     */
+    String NORMAL = "0";
+
+    /**
+     * 异常状态
+     */
+    String EXCEPTION = "1";
+
+    /**
+     * 用户正常状态
+     */
+    String USER_NORMAL = "0";
+
+    /**
+     * 用户封禁状态
+     */
+    String USER_DISABLE = "1";
+
+    /**
+     * 角色正常状态
+     */
+    String ROLE_NORMAL = "0";
+
+    /**
+     * 角色封禁状态
+     */
+    String ROLE_DISABLE = "1";
+
+    /**
+     * 部门正常状态
+     */
+    String DEPT_NORMAL = "0";
+
+    /**
+     * 部门停用状态
+     */
+    String DEPT_DISABLE = "1";
+
+    /**
+     * 岗位正常状态
+     */
+    String POST_NORMAL = "0";
+
+    /**
+     * 岗位停用状态
+     */
+    String POST_DISABLE = "1";
+
+    /**
+     * 字典正常状态
+     */
+    String DICT_NORMAL = "0";
+
+    /**
+     * 是否为系统默认(是)
+     */
+    String YES = "Y";
+
+    /**
+     * 是否菜单外链(是)
+     */
+    String YES_FRAME = "0";
+
+    /**
+     * 是否菜单外链(否)
+     */
+    String NO_FRAME = "1";
+
+    /**
+     * 菜单正常状态
+     */
+    String MENU_NORMAL = "0";
+
+    /**
+     * 菜单停用状态
+     */
+    String MENU_DISABLE = "1";
+
+    /**
+     * 菜单类型(目录)
+     */
+    String TYPE_DIR = "M";
+
+    /**
+     * 菜单类型(菜单)
+     */
+    String TYPE_MENU = "C";
+
+    /**
+     * 菜单类型(按钮)
+     */
+    String TYPE_BUTTON = "F";
+
+    /**
+     * Layout组件标识
+     */
+    String LAYOUT = "Layout";
+
+    /**
+     * ParentView组件标识
+     */
+    String PARENT_VIEW = "ParentView";
+
+    /**
+     * InnerLink组件标识
+     */
+    String INNER_LINK = "InnerLink";
+
+    /**
+     * 用户名长度限制
+     */
+    int USERNAME_MIN_LENGTH = 2;
+    int USERNAME_MAX_LENGTH = 20;
+
+    /**
+     * 密码长度限制
+     */
+    int PASSWORD_MIN_LENGTH = 5;
+    int PASSWORD_MAX_LENGTH = 20;
+
+    /**
+     * 超级管理员ID
+     */
+    Long SUPER_ADMIN_ID = 1L;
+
+}

+ 110 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/R.java

@@ -0,0 +1,110 @@
+package org.dromara.common.core.domain;
+
+import org.dromara.common.core.constant.HttpStatus;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 响应信息主体
+ *
+ * @author Lion Li
+ */
+@Data
+@NoArgsConstructor
+public class R<T> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 成功
+     */
+    public static final int SUCCESS = 200;
+
+    /**
+     * 失败
+     */
+    public static final int FAIL = 500;
+
+    private int code;
+
+    private String msg;
+
+    private T data;
+
+    public static <T> R<T> ok() {
+        return restResult(null, SUCCESS, "操作成功");
+    }
+
+    public static <T> R<T> ok(T data) {
+        return restResult(data, SUCCESS, "操作成功");
+    }
+
+    public static <T> R<T> ok(String msg) {
+        return restResult(null, SUCCESS, msg);
+    }
+
+    public static <T> R<T> ok(String msg, T data) {
+        return restResult(data, SUCCESS, msg);
+    }
+
+    public static <T> R<T> fail() {
+        return restResult(null, FAIL, "操作失败");
+    }
+
+    public static <T> R<T> fail(String msg) {
+        return restResult(null, FAIL, msg);
+    }
+
+    public static <T> R<T> fail(T data) {
+        return restResult(data, FAIL, "操作失败");
+    }
+
+    public static <T> R<T> fail(String msg, T data) {
+        return restResult(data, FAIL, msg);
+    }
+
+    public static <T> R<T> fail(int code, String msg) {
+        return restResult(null, code, msg);
+    }
+
+    /**
+     * 返回警告消息
+     *
+     * @param msg 返回内容
+     * @return 警告消息
+     */
+    public static <T> R<T> warn(String msg) {
+        return restResult(null, HttpStatus.WARN, msg);
+    }
+
+    /**
+     * 返回警告消息
+     *
+     * @param msg 返回内容
+     * @param data 数据对象
+     * @return 警告消息
+     */
+    public static <T> R<T> warn(String msg, T data) {
+        return restResult(data, HttpStatus.WARN, msg);
+    }
+
+    private static <T> R<T> restResult(T data, int code, String msg) {
+        R<T> r = new R<>();
+        r.setCode(code);
+        r.setData(data);
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static <T> Boolean isError(R<T> ret) {
+        return !isSuccess(ret);
+    }
+
+    public static <T> Boolean isSuccess(R<T> ret) {
+        return R.SUCCESS == ret.getCode();
+    }
+}

+ 38 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java

@@ -0,0 +1,38 @@
+package org.dromara.common.core.domain.dto;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 角色
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+public class RoleDTO implements Serializable {
+
+    /**
+     * 角色ID
+     */
+    private Long roleId;
+
+    /**
+     * 角色名称
+     */
+    private String roleName;
+
+    /**
+     * 角色权限
+     */
+    private String roleKey;
+
+    /**
+     * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)
+     */
+    private String dataScope;
+
+}

+ 62 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java

@@ -0,0 +1,62 @@
+package org.dromara.common.core.domain.dto;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 当前在线会话
+ *
+ * @author ruoyi
+ */
+
+@Data
+@NoArgsConstructor
+public class UserOnlineDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 会话编号
+     */
+    private String tokenId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+    /**
+     * 登录IP地址
+     */
+    private String ipaddr;
+
+    /**
+     * 登录地址
+     */
+    private String loginLocation;
+
+    /**
+     * 浏览器类型
+     */
+    private String browser;
+
+    /**
+     * 操作系统
+     */
+    private String os;
+
+    /**
+     * 登录时间
+     */
+    private Long loginTime;
+
+}

+ 35 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/EmailLoginBody.java

@@ -0,0 +1,35 @@
+package org.dromara.common.core.domain.model;
+
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * 邮件登录对象
+ *
+ * @author Lion Li
+ */
+
+@Data
+public class EmailLoginBody {
+
+    /**
+     * 租户ID
+     */
+    @NotBlank(message = "{tenant.number.not.blank}")
+    private String tenantId;
+
+    /**
+     * 邮箱
+     */
+    @NotBlank(message = "{user.email.not.blank}")
+    @Email(message = "{user.email.not.valid}")
+    private String email;
+
+    /**
+     * 邮箱code
+     */
+    @NotBlank(message = "{email.code.not.blank}")
+    private String emailCode;
+
+}

+ 120 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java

@@ -0,0 +1,120 @@
+package org.dromara.common.core.domain.model;
+
+import jakarta.validation.constraints.Email;
+import org.dromara.common.core.constant.UserConstants;
+import lombok.Data;
+import org.dromara.common.core.validate.auth.*;
+import org.hibernate.validator.constraints.Length;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 用户登录对象
+ *
+ * @author Lion Li
+ */
+
+@Data
+public class LoginBody {
+
+    /**
+     * 客户端id
+     */
+    @NotBlank(message = "{auth.clientid.not.blank}")
+    private String clientId;
+
+    /**
+     * 客户端key
+     */
+    private String clientKey;
+
+    /**
+     * 客户端秘钥
+     */
+    private String clientSecret;
+
+    /**
+     * 授权类型
+     */
+    @NotBlank(message = "{auth.grant.type.not.blank}")
+    private String grantType;
+
+    /**
+     * 租户ID
+     */
+    @NotBlank(message = "{tenant.number.not.blank}")
+    private String tenantId;
+
+    /**
+     * 用户名
+     */
+    @NotBlank(message = "{user.username.not.blank}", groups = {PasswordGroup.class})
+    @Length(min = UserConstants.USERNAME_MIN_LENGTH, max = UserConstants.USERNAME_MAX_LENGTH, message = "{user.username.length.valid}", groups = {PasswordGroup.class})
+    private String username;
+
+    /**
+     * 用户密码
+     */
+    @NotBlank(message = "{user.password.not.blank}", groups = {PasswordGroup.class})
+    @Length(min = UserConstants.PASSWORD_MIN_LENGTH, max = UserConstants.PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}", groups = {PasswordGroup.class})
+    private String password;
+
+    /**
+     * 验证码
+     */
+    private String code;
+
+    /**
+     * 唯一标识
+     */
+    private String uuid;
+
+    /**
+     * 手机号
+     */
+    @NotBlank(message = "{user.phonenumber.not.blank}", groups = {SmsGroup.class})
+    private String phonenumber;
+
+    /**
+     * 短信code
+     */
+    @NotBlank(message = "{sms.code.not.blank}", groups = {SmsGroup.class})
+    private String smsCode;
+
+    /**
+     * 邮箱
+     */
+    @NotBlank(message = "{user.email.not.blank}", groups = {EmailGroup.class})
+    @Email(message = "{user.email.not.valid}")
+    private String email;
+
+    /**
+     * 邮箱code
+     */
+    @NotBlank(message = "{email.code.not.blank}", groups = {EmailGroup.class})
+    private String emailCode;
+
+    /**
+     * 小程序code
+     */
+    @NotBlank(message = "{xcx.code.not.blank}", groups = {WechatGroup.class})
+    private String xcxCode;
+
+    /**
+     * 第三方登录平台
+     */
+    @NotBlank(message = "{social.source.not.blank}" , groups = {SocialGroup.class})
+    private String source;
+
+    /**
+     * 第三方登录code
+     */
+    @NotBlank(message = "{social.code.not.blank}" , groups = {SocialGroup.class})
+    private String socialCode;
+
+    /**
+     * 第三方登录socialState
+     */
+    @NotBlank(message = "{social.state.not.blank}" , groups = {SocialGroup.class})
+    private String socialState;
+}

+ 128 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java

@@ -0,0 +1,128 @@
+package org.dromara.common.core.domain.model;
+
+import org.dromara.common.core.domain.dto.RoleDTO;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 登录用户身份权限
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+public class LoginUser implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 部门名
+     */
+    private String deptName;
+
+    /**
+     * 用户唯一标识
+     */
+    private String token;
+
+    /**
+     * 用户类型
+     */
+    private String userType;
+
+    /**
+     * 登录时间
+     */
+    private Long loginTime;
+
+    /**
+     * 过期时间
+     */
+    private Long expireTime;
+
+    /**
+     * 登录IP地址
+     */
+    private String ipaddr;
+
+    /**
+     * 登录地点
+     */
+    private String loginLocation;
+
+    /**
+     * 浏览器类型
+     */
+    private String browser;
+
+    /**
+     * 操作系统
+     */
+    private String os;
+
+    /**
+     * 菜单权限
+     */
+    private Set<String> menuPermission;
+
+    /**
+     * 角色权限
+     */
+    private Set<String> rolePermission;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 用户昵称
+     */
+    private String nickname;
+
+    /**
+     * 角色对象
+     */
+    private List<RoleDTO> roles;
+
+    /**
+     * 数据权限 当前角色ID
+     */
+    private Long roleId;
+
+    /**
+     * 获取登录id
+     */
+    public String getLoginId() {
+        if (userType == null) {
+            throw new IllegalArgumentException("用户类型不能为空");
+        }
+        if (userId == null) {
+            throw new IllegalArgumentException("用户ID不能为空");
+        }
+        return userType + ":" + userId;
+    }
+
+}

+ 17 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java

@@ -0,0 +1,17 @@
+package org.dromara.common.core.domain.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户注册对象
+ *
+ * @author Lion Li
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class RegisterBody extends LoginBody {
+
+    private String userType;
+
+}

+ 34 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/SmsLoginBody.java

@@ -0,0 +1,34 @@
+package org.dromara.common.core.domain.model;
+
+import lombok.Data;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 短信登录对象
+ *
+ * @author Lion Li
+ */
+
+@Data
+public class SmsLoginBody {
+
+    /**
+     * 租户ID
+     */
+    @NotBlank(message = "{tenant.number.not.blank}")
+    private String tenantId;
+
+    /**
+     * 手机号
+     */
+    @NotBlank(message = "{user.phonenumber.not.blank}")
+    private String phonenumber;
+
+    /**
+     * 短信code
+     */
+    @NotBlank(message = "{sms.code.not.blank}")
+    private String smsCode;
+
+}

+ 21 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java

@@ -0,0 +1,21 @@
+package org.dromara.common.core.domain.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * 第三方登录用户身份权限
+ *
+ * @author thiszhc is 三三
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+public class SocialLogin extends LoginUser{
+
+    /**
+     * openid
+     */
+    private String openid;
+}

+ 27 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/domain/model/XcxLoginUser.java

@@ -0,0 +1,27 @@
+package org.dromara.common.core.domain.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * 小程序登录用户身份权限
+ *
+ * @author Lion Li
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+public class XcxLoginUser extends LoginUser {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * openid
+     */
+    private String openid;
+
+}

+ 37 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java

@@ -0,0 +1,37 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 设备类型
+ * 针对一套 用户体系
+ *
+ * @author Lion Li
+ */
+@Getter
+@AllArgsConstructor
+public enum DeviceType {
+
+    /**
+     * pc端
+     */
+    PC("pc"),
+
+    /**
+     * app端
+     */
+    APP("app"),
+
+    /**
+     * 小程序端
+     */
+    XCX("xcx"),
+
+    /**
+     * social第三方端
+     */
+    SOCIAL("social");
+
+    private final String device;
+}

+ 44 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java

@@ -0,0 +1,44 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 登录类型
+ *
+ * @author Lion Li
+ */
+@Getter
+@AllArgsConstructor
+public enum LoginType {
+
+    /**
+     * 密码登录
+     */
+    PASSWORD("user.password.retry.limit.exceed", "user.password.retry.limit.count"),
+
+    /**
+     * 短信登录
+     */
+    SMS("sms.code.retry.limit.exceed", "sms.code.retry.limit.count"),
+
+    /**
+     * 邮箱登录
+     */
+    EMAIL("email.code.retry.limit.exceed", "email.code.retry.limit.count"),
+
+    /**
+     * 小程序登录
+     */
+    XCX("", "");
+
+    /**
+     * 登录重试超出限制提示
+     */
+    final String retryLimitExceed;
+
+    /**
+     * 登录重试限制计数提示
+     */
+    final String retryLimitCount;
+}

+ 30 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/enums/TenantStatus.java

@@ -0,0 +1,30 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 用户状态
+ *
+ * @author LionLi
+ */
+@Getter
+@AllArgsConstructor
+public enum TenantStatus {
+    /**
+     * 正常
+     */
+    OK("0", "正常"),
+    /**
+     * 停用
+     */
+    DISABLE("1", "停用"),
+    /**
+     * 删除
+     */
+    DELETED("2", "删除");
+
+    private final String code;
+    private final String info;
+
+}

+ 30 - 0
takai-common/takai-common-core/src/main/java/org/dromara/common/core/enums/UserStatus.java

@@ -0,0 +1,30 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 用户状态
+ *
+ * @author ruoyi
+ */
+@Getter
+@AllArgsConstructor
+public enum UserStatus {
+    /**
+     * 正常
+     */
+    OK("0", "正常"),
+    /**
+     * 停用
+     */
+    DISABLE("1", "停用"),
+    /**
+     * 删除
+     */
+    DELETED("2", "删除");
+
+    private final String code;
+    private final String info;
+
+}

Some files were not shown because too many files changed in this diff