Browse Source

项目初始化

xudm 3 months ago
commit
89f5a6ae3a
100 changed files with 6196 additions and 0 deletions
  1. 61 0
      .github/ISSUE_TEMPLATE/bug_report.yml
  2. 46 0
      .github/ISSUE_TEMPLATE/feature_request.yml
  3. 53 0
      .github/PULL_REQUEST_TEMPLATE.md
  4. 28 0
      .github/workflows/build.yml
  5. 52 0
      .github/workflows/deploy.yml
  6. 23 0
      .github/workflows/release-tag.yml
  7. 48 0
      .github/workflows/scan.yml
  8. 46 0
      .gitignore
  9. BIN
      .image/qrcode.jpg
  10. BIN
      .image/screenshot/000登录页面-H5.png
  11. BIN
      .image/screenshot/000登录页面.png
  12. BIN
      .image/screenshot/001仪表盘.png
  13. BIN
      .image/screenshot/002分析页.png
  14. BIN
      .image/screenshot/010个人中心.png
  15. BIN
      .image/screenshot/011安全设置-修改邮箱.png
  16. BIN
      .image/screenshot/012安全设置-修改邮箱-邮箱验证码.png
  17. BIN
      .image/screenshot/013消息中心.png
  18. BIN
      .image/screenshot/020系统管理-用户管理-列表.png
  19. BIN
      .image/screenshot/021系统管理-用户管理-新增.png
  20. BIN
      .image/screenshot/025系统管理-角色管理-列表.png
  21. BIN
      .image/screenshot/026系统管理-角色管理-新增.png
  22. BIN
      .image/screenshot/027系统管理-角色管理-分配.png
  23. BIN
      .image/screenshot/030系统管理-菜单管理-列表.png
  24. BIN
      .image/screenshot/031系统管理-菜单管理-新增.png
  25. BIN
      .image/screenshot/035系统管理-部门管理-列表.png
  26. BIN
      .image/screenshot/036系统管理-部门管理-新增.png
  27. BIN
      .image/screenshot/040系统管理-字典管理-列表.png
  28. BIN
      .image/screenshot/041系统管理-字典项管理.png
  29. BIN
      .image/screenshot/045系统管理-公告管理-列表.png
  30. BIN
      .image/screenshot/046系统管理-公告管理-修改.png
  31. BIN
      .image/screenshot/050系统管理-文件管理-列表-1.png
  32. BIN
      .image/screenshot/051系统管理-文件管理-列表-2.png
  33. BIN
      .image/screenshot/052系统管理-文件管理-查看文档.png
  34. BIN
      .image/screenshot/055系统管理-存储管理-列表.png
  35. BIN
      .image/screenshot/056系统管理-存储管理-新增.png
  36. BIN
      .image/screenshot/060系统管理-系统配置.png
  37. BIN
      .image/screenshot/061系统管理-安全配置.png
  38. BIN
      .image/screenshot/100系统监控-在线用户.png
  39. BIN
      .image/screenshot/101系统监控-系统日志-登录日志.png
  40. BIN
      .image/screenshot/102系统监控-系统日志-操作日志.png
  41. BIN
      .image/screenshot/103系统监控-系统日志-操作日志-详情.png
  42. BIN
      .image/screenshot/150任务调度-任务管理-列表.png
  43. BIN
      .image/screenshot/151任务调度-任务管理-新增.png
  44. BIN
      .image/screenshot/155任务调度-任务日志-列表.png
  45. BIN
      .image/screenshot/156任务调度-任务日志-详情.png
  46. BIN
      .image/screenshot/200能力开放-应用管理-列表.png
  47. BIN
      .image/screenshot/201能力开放-应用管理-新增.png
  48. BIN
      .image/screenshot/300系统工具-代码生成-列表.png
  49. BIN
      .image/screenshot/301系统工具-代码生成-配置.png
  50. BIN
      .image/screenshot/302系统工具-代码生成-预览.png
  51. BIN
      .style/Java开发手册(黄山版).pdf
  52. 16 0
      .style/license-header
  53. 380 0
      .style/p3c-codestyle.xml
  54. 713 0
      CHANGELOG.md
  55. 202 0
      LICENSE
  56. 512 0
      README.md
  57. 151 0
      continew-common/pom.xml
  58. 68 0
      continew-common/src/main/java/top/continew/admin/common/base/BaseController.java
  59. 98 0
      continew-common/src/main/java/top/continew/admin/common/config/exception/GlobalExceptionHandler.java
  60. 72 0
      continew-common/src/main/java/top/continew/admin/common/config/exception/GlobalSaTokenExceptionHandler.java
  61. 45 0
      continew-common/src/main/java/top/continew/admin/common/config/mybatis/BCryptEncryptor.java
  62. 57 0
      continew-common/src/main/java/top/continew/admin/common/config/mybatis/DataPermissionMapper.java
  63. 53 0
      continew-common/src/main/java/top/continew/admin/common/config/mybatis/DefaultDataPermissionUserContextProvider.java
  64. 112 0
      continew-common/src/main/java/top/continew/admin/common/config/mybatis/MyBatisPlusMetaObjectHandler.java
  65. 57 0
      continew-common/src/main/java/top/continew/admin/common/config/mybatis/MybatisPlusConfiguration.java
  66. 92 0
      continew-common/src/main/java/top/continew/admin/common/config/properties/CaptchaProperties.java
  67. 43 0
      continew-common/src/main/java/top/continew/admin/common/config/properties/RsaProperties.java
  68. 44 0
      continew-common/src/main/java/top/continew/admin/common/config/websocket/WebSocketClientServiceImpl.java
  69. 76 0
      continew-common/src/main/java/top/continew/admin/common/constant/CacheConstants.java
  70. 46 0
      continew-common/src/main/java/top/continew/admin/common/constant/ContainerConstants.java
  71. 64 0
      continew-common/src/main/java/top/continew/admin/common/constant/RegexConstants.java
  72. 84 0
      continew-common/src/main/java/top/continew/admin/common/constant/SysConstants.java
  73. 54 0
      continew-common/src/main/java/top/continew/admin/common/constant/UiConstants.java
  74. 51 0
      continew-common/src/main/java/top/continew/admin/common/context/RoleContext.java
  75. 122 0
      continew-common/src/main/java/top/continew/admin/common/context/UserContext.java
  76. 183 0
      continew-common/src/main/java/top/continew/admin/common/context/UserContextHolder.java
  77. 77 0
      continew-common/src/main/java/top/continew/admin/common/context/UserExtraContext.java
  78. 60 0
      continew-common/src/main/java/top/continew/admin/common/enums/DataScopeEnum.java
  79. 47 0
      continew-common/src/main/java/top/continew/admin/common/enums/DisEnableStatusEnum.java
  80. 50 0
      continew-common/src/main/java/top/continew/admin/common/enums/GenderEnum.java
  81. 47 0
      continew-common/src/main/java/top/continew/admin/common/enums/SuccessFailureStatusEnum.java
  82. 107 0
      continew-common/src/main/java/top/continew/admin/common/util/SecureUtils.java
  83. 52 0
      continew-extension/continew-extension-schedule-server/pom.xml
  84. 58 0
      continew-extension/continew-extension-schedule-server/src/main/java/top/continew/admin/extension/scheduling/ScheduleServerApplication.java
  85. 58 0
      continew-extension/continew-extension-schedule-server/src/main/resources/config/application-dev.yml
  86. 58 0
      continew-extension/continew-extension-schedule-server/src/main/resources/config/application-prod.yml
  87. 12 0
      continew-extension/continew-extension-schedule-server/src/main/resources/config/application.yml
  88. 5 0
      continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/db.changelog-master.yaml
  89. 14 0
      continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/mysql/snail-job_data.sql
  90. 518 0
      continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/mysql/snail-job_table.sql
  91. 14 0
      continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/postgresql/snail-job_data.sql
  92. 821 0
      continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/postgresql/snail-job_table.sql
  93. 88 0
      continew-extension/continew-extension-schedule-server/src/main/resources/logback-spring.xml
  94. 17 0
      continew-extension/pom.xml
  95. 22 0
      continew-module-system/pom.xml
  96. 66 0
      continew-module-system/src/main/java/top/continew/admin/auth/model/query/OnlineUserQuery.java
  97. 64 0
      continew-module-system/src/main/java/top/continew/admin/auth/model/req/AccountLoginReq.java
  98. 57 0
      continew-module-system/src/main/java/top/continew/admin/auth/model/req/EmailLoginReq.java
  99. 57 0
      continew-module-system/src/main/java/top/continew/admin/auth/model/req/PhoneLoginReq.java
  100. 75 0
      continew-module-system/src/main/java/top/continew/admin/auth/model/resp/CaptchaResp.java

+ 61 - 0
.github/ISSUE_TEMPLATE/bug_report.yml

@@ -0,0 +1,61 @@
+name: "\U0001F41E Bug 报告"
+description: Create a report to help us improve
+title: "[Bug] "
+labels: ["bug"]
+body:
+  - type: markdown
+    attributes:
+      value: |
+        感谢您使用 ContiNew Admin!请您花些时间填写这份 Bug 报告。
+  - type: textarea
+    id: bug-description
+    attributes:
+      label: Bug 描述
+      description: 清楚而简洁地描述您遇到的 Bug。另外,非常欢迎您对此 Bug 提交 PR。
+      placeholder: 例如:在使用 xxx 功能时出现异常
+    validations:
+      required: true
+  - type: textarea
+    id: reproduction
+    attributes:
+      label: 复现步骤
+      description: 条理清晰的步骤或演示视频可以帮助快速定位问题。
+      placeholder: 例如:1、xxx; 2、xxx;
+    validations:
+      required: true
+  - type: textarea
+    id: expected
+    attributes:
+      label: 预期结果
+      description: 清楚而简洁地描述您期望的结果。
+      placeholder: 预期结果
+    validations:
+      required: true
+  - type: textarea
+    id: environment-info
+    attributes:
+      label: 环境信息
+      description: |
+        examples:
+          - **ContiNew Admin version(s)**: v3.0.1
+      value: "ContiNew Admin version(s):"
+      render: markdown
+    validations:
+      required: true
+  - type: textarea
+    id: additional-context
+    attributes:
+      label: 额外补充
+      description: 添加您的完整报错信息或屏幕截图,以及一切能帮助定位问题的信息。
+  - type: checkboxes
+    id: checkboxes
+    attributes:
+      label: 确认
+      description: 在提交 issue 之前,请确保执行过以下操作。
+      options:
+        - label: 阅读[文档](https://continew.top/admin/other/faq.html)
+          required: true
+        - label: 根据报错信息百度或 Google 一下
+          required: true
+        - label: 搜索是否有其他人提交过类似的 issue,如果对应 issue 尚未解决,您可以先订阅关注该 issue(为了方便后来者查找问题解决方法,请尽量避免创建重复的 issue)
+          required: true

+ 46 - 0
.github/ISSUE_TEMPLATE/feature_request.yml

@@ -0,0 +1,46 @@
+name: "\U0001F680 新 Feature 建议"
+description: Suggest an idea for this project
+title: "[Feature] "
+labels: ["feature"]
+body:
+  - type: markdown
+    attributes:
+      value: |
+        感谢您使用 ContiNew Admin!请您花些时间填写这份 Feature 调查。
+  - type: textarea
+    id: feature-description
+    attributes:
+      label: Feature 描述
+      description: 清楚而简洁地描述您的 Feature。另外,非常欢迎您对此 Feature 提交 PR。
+      placeholder: 例如:我希望增加 xxx 功能;现有的 xxx 功能不好用...
+    validations:
+      required: true
+  - type: textarea
+    id: suggested-solution
+    attributes:
+      label: 描述一下您想要的解决方案
+      description: 清楚而简洁地描述您想要的解决方案。
+    validations:
+      required: true
+  - type: textarea
+    id: alternative
+    attributes:
+      label: 描述一下您考虑过的替代方案
+      description: 清楚而简洁地描述您考虑过的任何替代解决方案或功能。
+  - type: textarea
+    id: additional-context
+    attributes:
+      label: 额外补充
+      description: 添加您在其他框架或场景遇见的效果截图或链接,以及一切能帮助理解 Feature 的信息。
+  - type: checkboxes
+    id: checkboxes
+    attributes:
+      label: 确认
+      description: 在提交 issue 之前,请确保执行过以下操作。
+      options:
+        - label: 阅读[文档](https://continew.top/admin/intro/require.html)
+          required: true
+        - label: 搜索是否有其他人提交过类似的 issue,如果对应 issue 尚未解决,您可以先订阅关注该 issue(为了方便后来者查找问题解决方法,请尽量避免创建重复的 issue)
+          required: true
+        - label: 您是否愿意为您提出的 Feature 提交 PR?
+          required: false

+ 53 - 0
.github/PULL_REQUEST_TEMPLATE.md

@@ -0,0 +1,53 @@
+<!--
+  非常感谢您的 PR!在提交之前,请务必确保您 PR 的代码经过了完整测试,并且通过了代码规范检查。
+-->
+
+<!-- 在 [] 中输入 x 来勾选) -->
+
+## PR 类型
+
+<!-- 您的 PR 引入了哪种类型的变更? -->
+<!-- 只支持选择一种类型,如果有多种类型,可以在更新日志中增加 “类型” 列。 -->
+
+- [ ] 新 feature
+- [ ] Bug 修复
+- [ ] 功能增强
+- [ ] 文档变更
+- [ ] 代码样式变更
+- [ ] 重构
+- [ ] 性能改进
+- [ ] 单元测试
+- [ ] CI/CD
+- [ ] 其他
+
+## PR 目的
+
+<!-- 描述一下您的 PR 解决了什么问题。如果可以,请链接到相关 issues。 -->
+
+## 解决方案
+
+<!-- 详细描述您是如何解决的问题 -->
+
+## PR 测试
+
+<!-- 如果可以,请为您的 PR 添加或更新单元测试。 -->
+<!-- 请描述一下您是如何测试 PR 的。例如:创建/更新单元测试或添加相关的截图。 -->
+
+## Changelog
+
+| 模块  | Changelog | Related issues |
+|-----|-----------| -------------- |
+|     |           |                |
+
+<!-- 如果有多种类型的变更,可以在变更日志表中增加 “类型” 列,该列的值与上方 “PR 类型” 相同。 -->
+<!-- Related issues 格式为 Closes #<issue号>,或者 Fixes #<issue号>,或者 Resolves #<issue号>。 -->
+
+## 其他信息
+
+<!-- 请描述一下还有哪些注意事项。例如:如果引入了一个不向下兼容的变更,请描述其影响。 -->
+
+## 提交前确认
+
+- [ ] PR 代码经过了完整测试,并且通过了代码规范检查
+- [ ] 已经完整填写 Changelog,并链接到了相关 issues
+- [ ] PR 代码将要提交到 dev 分支

+ 28 - 0
.github/workflows/build.yml

@@ -0,0 +1,28 @@
+name: Build
+
+on:
+  pull_request:
+    branches:
+      - dev
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        jdk-version:
+          - 17
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: Setup Java
+        uses: actions/setup-java@v4
+        with:
+          distribution: "adopt"
+          java-version: ${{ matrix.jdk-version }}
+          cache: "maven"
+      - name: Compile
+        run: |
+          sed -i.bak '/<repositories>/,/<\/repositories>/d' pom.xml
+          sed -i.bak '/<pluginRepositories>/,/<\/pluginRepositories>/d' pom.xml
+          mvn -B compile --file pom.xml

+ 52 - 0
.github/workflows/deploy.yml

@@ -0,0 +1,52 @@
+name: Deploy
+
+on:
+  # 推送时执行
+  push:
+    branches: [dev]
+  # 可手动执行
+  workflow_dispatch:
+
+jobs:
+  deploy-server:
+    runs-on: ubuntu-latest
+    steps:
+      # 1、检出源码
+      - name: Checkout
+        uses: actions/checkout@v4
+      # 2、安装 Java 环境
+      - name: Setup Java
+        uses: actions/setup-java@v4
+        with:
+          distribution: "adopt"
+          java-version: 17
+          cache: "maven"
+      # 3、打包
+      - name: Build
+        run: |
+          sed -i.bak '/<repositories>/,/<\/repositories>/d' pom.xml
+          sed -i.bak '/<pluginRepositories>/,/<\/pluginRepositories>/d' pom.xml
+          mvn -B package --file pom.xml
+      # 4、拷贝到服务器
+      - name: Copy
+        uses: appleboy/scp-action@v0.1.7
+        with:
+          host: ${{ secrets.SERVER_HOST }}
+          port: ${{ secrets.SERVER_PORT }}
+          username: ${{ secrets.SERVER_USERNAME }}
+          password: ${{ secrets.SERVER_PASSWORD }}
+          source: ./continew-webapi/target/app/*
+          target: /docker/continew-admin
+          strip_components: 3
+      # 5、启动
+      - name: Start
+        uses: appleboy/ssh-action@master
+        with:
+          host: ${{ secrets.SERVER_HOST }}
+          port: ${{ secrets.SERVER_PORT }}
+          username: ${{ secrets.SERVER_USERNAME }}
+          password: ${{ secrets.SERVER_PASSWORD }}
+          script: |
+            cd /docker
+            docker-compose up --force-recreate --build -d continew-admin-server
+            docker images | grep none | awk '{print $3}' | xargs docker rmi

+ 23 - 0
.github/workflows/release-tag.yml

@@ -0,0 +1,23 @@
+name: Release
+
+on:
+  push:
+    tags:
+      - "v*" # Push events to matching v*, i.e. v1.0.0
+
+jobs:
+  release:
+    if: github.repository == 'continew-org/continew-admin'
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@master
+      - name: Create Release for Tag
+        id: release_tag
+        uses: yyx990803/release-tag@master
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          tag_name: ${{ github.ref }}
+          body: |
+            详情请参阅 [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/dev/CHANGELOG.md) 。

+ 48 - 0
.github/workflows/scan.yml

@@ -0,0 +1,48 @@
+name: Scan
+
+on:
+  push:
+    branches:
+      - dev
+  pull_request:
+    branches:
+      - dev
+
+jobs:
+  sonar-scan:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        jdk-version:
+          - 17
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: Setup Java
+        uses: actions/setup-java@v4
+        with:
+          distribution: "adopt"
+          java-version: ${{ matrix.jdk-version }}
+          cache: "maven"
+      - name: Cache SonarCloud packages
+        uses: actions/cache@v3
+        with:
+          path: ~/.sonar/cache
+          key: ${{ runner.os }}-sonar
+          restore-keys: ${{ runner.os }}-sonar
+      - name: Cache Maven packages
+        uses: actions/cache@v3
+        with:
+          path: ~/.m2
+          key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
+          restore-keys: ${{ runner.os }}-m2
+      - name: Analyze
+        run: |
+          sed -i.bak '/<repositories>/,/<\/repositories>/d' pom.xml
+          sed -i.bak '/<pluginRepositories>/,/<\/pluginRepositories>/d' pom.xml
+          mvn -B verify -Psonar
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
+          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

+ 46 - 0
.gitignore

@@ -0,0 +1,46 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+!.idea/icon.png
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+# Maven ignore
+.flattened-pom.xml
+
+### Temp ###
+*.log
+*.log.gz
+*.logs
+*.cache
+*.diff
+*.patch
+*.tmp

BIN
.image/qrcode.jpg


BIN
.image/screenshot/000登录页面-H5.png


BIN
.image/screenshot/000登录页面.png


BIN
.image/screenshot/001仪表盘.png


BIN
.image/screenshot/002分析页.png


BIN
.image/screenshot/010个人中心.png


BIN
.image/screenshot/011安全设置-修改邮箱.png


BIN
.image/screenshot/012安全设置-修改邮箱-邮箱验证码.png


BIN
.image/screenshot/013消息中心.png


BIN
.image/screenshot/020系统管理-用户管理-列表.png


BIN
.image/screenshot/021系统管理-用户管理-新增.png


BIN
.image/screenshot/025系统管理-角色管理-列表.png


BIN
.image/screenshot/026系统管理-角色管理-新增.png


BIN
.image/screenshot/027系统管理-角色管理-分配.png


BIN
.image/screenshot/030系统管理-菜单管理-列表.png


BIN
.image/screenshot/031系统管理-菜单管理-新增.png


BIN
.image/screenshot/035系统管理-部门管理-列表.png


BIN
.image/screenshot/036系统管理-部门管理-新增.png


BIN
.image/screenshot/040系统管理-字典管理-列表.png


BIN
.image/screenshot/041系统管理-字典项管理.png


BIN
.image/screenshot/045系统管理-公告管理-列表.png


BIN
.image/screenshot/046系统管理-公告管理-修改.png


BIN
.image/screenshot/050系统管理-文件管理-列表-1.png


BIN
.image/screenshot/051系统管理-文件管理-列表-2.png


BIN
.image/screenshot/052系统管理-文件管理-查看文档.png


BIN
.image/screenshot/055系统管理-存储管理-列表.png


BIN
.image/screenshot/056系统管理-存储管理-新增.png


BIN
.image/screenshot/060系统管理-系统配置.png


BIN
.image/screenshot/061系统管理-安全配置.png


BIN
.image/screenshot/100系统监控-在线用户.png


BIN
.image/screenshot/101系统监控-系统日志-登录日志.png


BIN
.image/screenshot/102系统监控-系统日志-操作日志.png


BIN
.image/screenshot/103系统监控-系统日志-操作日志-详情.png


BIN
.image/screenshot/150任务调度-任务管理-列表.png


BIN
.image/screenshot/151任务调度-任务管理-新增.png


BIN
.image/screenshot/155任务调度-任务日志-列表.png


BIN
.image/screenshot/156任务调度-任务日志-详情.png


BIN
.image/screenshot/200能力开放-应用管理-列表.png


BIN
.image/screenshot/201能力开放-应用管理-新增.png


BIN
.image/screenshot/300系统工具-代码生成-列表.png


BIN
.image/screenshot/301系统工具-代码生成-配置.png


BIN
.image/screenshot/302系统工具-代码生成-预览.png


BIN
.style/Java开发手册(黄山版).pdf


+ 16 - 0
.style/license-header

@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+

+ 380 - 0
.style/p3c-codestyle.xml

@@ -0,0 +1,380 @@
+<?xml version="1.0" encoding="utf-8"?>
+<profiles version="21">
+    <profile kind="CodeFormatterProfile" name="P3C-CodeStyle" version="21">
+        <setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+        <setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+        <setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+        <setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_preserve"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_preserve"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_preserve"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_preserve"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_preserve"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_preserve"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_never"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_preserve"/>
+        <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+        <setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="82"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="82"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="18"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="80"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="48"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="49"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="49"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="2"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="0"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
+        <setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
+    </profile>
+</profiles>

+ 713 - 0
CHANGELOG.md

@@ -0,0 +1,713 @@
+## [v3.4.0](https://github.com/continew-org/continew-admin/compare/v3.3.0...v3.4.0) (2024-11-18)
+
+### ✨ 新特性
+
+* 新增仪表盘分析接口,查询访问时段分析、查询模块分析、查询终端分析、查询浏览器分析 ([dea8dbe](https://github.com/continew-org/continew-admin/commit/dea8dbe131867a564f7e151a6484db5be6effaa3))
+* 新增查询仪表盘数据总览相关接口, 重构仪表盘相关代码 ([e01df09](https://github.com/continew-org/continew-admin/commit/e01df09127e6efc33971d64e2fe49a2a42282425))
+* 公告支持设置通知范围 ([29202ae](https://github.com/continew-org/continew-admin/commit/29202aea307a7257c9d1e9649dee00140164c59c)) (GitCode#1)
+* 角色管理增加分配角色功能 ([73f880e](https://github.com/continew-org/continew-admin/commit/73f880ec57cfdccfc297aac228410f5bb7fed448)) ([ad3f832](https://github.com/continew-org/continew-admin/commit/ad3f8329dd07858b0982020db3605200112f09b5)) (GitHub#93)
+* 新增能力开放模块应用管理功能 ([f774183](https://github.com/continew-org/continew-admin/commit/f7741832bdd315039cc5f1aa062d8ffac32ddf0f)) ([d1b3824](https://github.com/continew-org/continew-admin/commit/d1b38242b9f291c897a8eb82bd330bd775e656cf)) ([4454daa](https://github.com/continew-org/continew-admin/commit/4454daa9e07af7c7202c386e533ea055bb79f0df)) (Gitee#31)
+* 新增查询用户字典接口 ([d4b02ba](https://github.com/continew-org/continew-admin/commit/d4b02ba9180f82084e5ca844eaa9b4a0966a0164))
+* 代码生成新增菜单SQL模板 ([fb947c9](https://github.com/continew-org/continew-admin/commit/fb947c98fdd075a19c55e1e9e5c137a8482db618)) (GitHub#95)
+
+### 💎 功能优化
+
+- 优化部分 Mapper 方法使用 (替换为 MP 新增方法) ([ad69d44](https://github.com/continew-org/continew-admin/commit/ad69d44ebda72dbdb639ba4ff48cde9aa7f6e400))
+- 优化查询代码生成表性能 ([781d291](https://github.com/continew-org/continew-admin/commit/781d29142fbcc1f981d3760565f2f96b49570438))
+- 移除上传文件时的多余校验 ([8466105](https://github.com/continew-org/continew-admin/commit/8466105a9b8b2fd807ac9d3029e4da7bc609d551))
+- 重构获取登录用户信息方式(线程级存储) ([79ea39d](https://github.com/continew-org/continew-admin/commit/79ea39dd078639b4e137d576f3d7820bb6c24d0a))
+- 完善及优化代码生成模板 ([ffdc971](https://github.com/continew-org/continew-admin/commit/ffdc9712d4cd1fd3093cec0780f630d672339cdf)) ([2b47ed7](https://github.com/continew-org/continew-admin/commit/2b47ed711074ad64d98fa0d9d68ccd2777b70bf2)) ([90e3bc0](https://github.com/continew-org/continew-admin/commit/90e3bc0595fdb692644ed7fd9b1a3735962cb68b)) ([985bc25](https://github.com/continew-org/continew-admin/commit/985bc25716daae6fb018a856af889919436f26e6))
+- 字典项管理日志模块调整为字典管理 ([60cb2e3](https://github.com/continew-org/continew-admin/commit/60cb2e3b5cae56d9a3117aeea6c57ec02cb9abe4))
+- 解决查询日志数据时索引失效的问题 ([4525cb3](https://github.com/continew-org/continew-admin/commit/4525cb3531c06354e3dc57147c93dd5f7f8a4e8a))
+- 重构拆分 liquibase 脚本结构 ([aadaa5b](https://github.com/continew-org/continew-admin/commit/aadaa5b4a70caaa775a38fd542890aa8d7f951c6))
+- 调整系统配置菜单图标 ([872bc1c](https://github.com/continew-org/continew-admin/commit/872bc1ca8143632ea0ca00eb320e57f61729937c))
+- 优化系统管理、代码生成相关代码及初始数据脚本 ([9ecdeb5](https://github.com/continew-org/continew-admin/commit/9ecdeb52f601b93116f6e89d8db32d8db95cb0c5)) ([5717d03](https://github.com/continew-org/continew-admin/commit/5717d03d01f8f052688bef873def83a3b8defc21)) ([7870de2](https://github.com/continew-org/continew-admin/commit/7870de28926cde86a8732ad5d6950616e1078d57))
+- 优化项目模块命名(简化、分类、统一) ([c276e53](https://github.com/continew-org/continew-admin/commit/c276e53a8e02e64f9e5d8270171e20424804382d))
+- 优化任务调度配置及 docker 部署脚本 ([b927470](https://github.com/continew-org/continew-admin/commit/b927470e33bb75594f1546a4f06d48bc2281f5ab)) ([c5cd4e2](https://github.com/continew-org/continew-admin/commit/c5cd4e2c284fa195411f704e41ca50a70271c6b7))
+- 重构仪表盘查询地域分析接口 ([e0e157f](https://github.com/continew-org/continew-admin/commit/e0e157f0e5b23ff6e27ec7ae0ee028af6f2facd1))
+- 完善 PostgreSQL 代码生成类型映射配置 ([4c36f23](https://github.com/continew-org/continew-admin/commit/4c36f2339830272aa047e46d02f34485b9051ec3))
+- 优化通知公告部分代码 ([e1941ec](https://github.com/continew-org/continew-admin/commit/e1941eca455a066dae631b1533d63f8d9a193161))
+- 优化初始数据脚本 ([6abb444](https://github.com/continew-org/continew-admin/commit/6abb444f9dce7ed1ea4aa90502c21d2ab6c8e247))
+- 忽略获取在线用户信息异常 ([4856366](https://github.com/continew-org/continew-admin/commit/48563663e1fed93154f63f6c9a6c07ea79d741da))
+- 优化部分注释 ([3116836](https://github.com/continew-org/continew-admin/commit/3116836b0139232769797da271a400fa4d9d52fa))
+
+### 🐛 问题修复
+
+- 参数配置支持设值为空 ([d7e8fc9](https://github.com/continew-org/continew-admin/commit/d7e8fc9bc31409b3652b5ad03a79248726547088))
+- 修复修改存储时同时设置默认存储及启用判断顺序错误 ([d9602e8](https://github.com/continew-org/continew-admin/commit/d9602e8639bcd125b15faea5ca7f618429bcc50e))
+- 修复任务日志缺失异常堆栈的问题 ([5cbeddb](https://github.com/continew-org/continew-admin/commit/5cbeddb97bd38274641ac5d63226a937975d69ba)) (Gitee#29)
+- 修复更新在线用户权限信息报错的问题 ([8278032](https://github.com/continew-org/continew-admin/commit/82780324b7c2faeba22f2dbde440d1cf0e42c3c9))
+- 修复查询日志排序错误 ([8b403f4](https://github.com/continew-org/continew-admin/commit/8b403f4357caeac0c0a4cc9ac67c73043a1f4465))
+- 修复部分错误规范代码 ([a83b45f](https://github.com/continew-org/continew-admin/commit/a83b45f776234274a844337a2f2b541705ba5aff))
+- 调整部分实体包 ([3f4331e](https://github.com/continew-org/continew-admin/commit/3f4331e92b86e73303c4d675f0f1d4bc91a2a71b))
+- 修复获取邮箱验证码未进行行为验证码校验错误 ([731bfa0](https://github.com/continew-org/continew-admin/commit/731bfa065ab3a10ab933aaffd2e9ceebf0a4d16d))
+- 完善用户角色变更校验及在线用户权限处理 ([c28d3cf](https://github.com/continew-org/continew-admin/commit/c28d3cf1c45212e670b90fc0077b5e176a894bd2))
+- 修复查询系统配置参数漏洞 :boom: ([8c3fe35](https://github.com/continew-org/continew-admin/commit/8c3fe353be5d68f1ed252eef12f5fcdc0a1e3c83))
+
+### 📦 依赖升级
+
+- ContiNew Starter 2.6.0 => 2.7.4 (更多特性及依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+
+## [v3.3.0](https://github.com/continew-org/continew-admin/compare/v3.2.0...v3.3.0) (2024-09-09)
+
+### ✨ 新特性
+
+* 重构全局响应处理及异常拦截,自定义异常拦截从 Starter 调整到 Admin 项目 ([d7621c6](https://github.com/continew-org/continew-admin/commit/d7621c6b26bfd253d9295444ea144f5dabf67f44))
+* 重构 Controller 接口方法返回值写法,接口文档也已适配处理 ([d7621c6](https://github.com/continew-org/continew-admin/commit/d7621c6b26bfd253d9295444ea144f5dabf67f44)) ([0f1479f](https://github.com/continew-org/continew-admin/commit/0f1479f40deef83a5f5d64cbc24a7691b274b112))
+* 代码生成字段配置时支持指定排序 ([d56b9aa](https://github.com/continew-org/continew-admin/commit/d56b9aa35ee2502804f487487d7bac02f4edc9b0))
+* 代码生成字段配置时支持选择关联字典 ([fdd21a0](https://github.com/continew-org/continew-admin/commit/fdd21a01c106e12321d0d1886ff643c72a09943b)) ([ecc98b1](https://github.com/continew-org/continew-admin/commit/ecc98b1999d90c1a7a29af94dc8705283f34dada))
+* 修改角色功能权限、数据权限支持衔接新增角色时的父子联动选项 ([387fb19](https://github.com/continew-org/continew-admin/commit/387fb194640d4a288f053c3eba1bf5b314d64da7))
+
+### 💎 功能优化
+
+- 移除 WebMvcConfiguration 配置(已迁移到 Starter 项目)([d7621c6](https://github.com/continew-org/continew-admin/commit/d7621c6b26bfd253d9295444ea144f5dabf67f44))
+- 重构日志持久层接口本地实现类 ([2c1eb56](https://github.com/continew-org/continew-admin/commit/2c1eb5660f69a9ab702d503944a11e47edac1142))
+- 优化打包配置,模板等配置文件提取到 jar 包外部 ([75cef77](https://github.com/continew-org/continew-admin/commit/75cef773187e5b5060a10a12e7c9912002376d7a))
+- 优化健康监测接口响应信息 ([bb5a92e](https://github.com/continew-org/continew-admin/commit/bb5a92e5ca238ed677d9ac3589fdf8009d2ac232))
+- 优化代码生成列配置代码,取消后端部分默认值 ([f5ee2b5](https://github.com/continew-org/continew-admin/commit/f5ee2b5beb9572d3fcd5b7c2f6db0627dedb31aa)) ([ca9f34d](https://github.com/continew-org/continew-admin/commit/ca9f34d3d5a3f96c6df537036a5fd876cae2e89a))
+- 重构权限变更逻辑,修改角色、变更用户角色不再下线用户 ([ad9a600](https://github.com/continew-org/continew-admin/commit/ad9a6000fcb5d64b04cf230caa3cbacc8c3ac8d7))
+
+### 🐛 问题修复
+
+- 修复打包部署后,下载用户导入模板异常问题 (Gitee#25) ([c7ffc67](https://github.com/continew-org/continew-admin/commit/c7ffc67cdc9139a4398c7dc819ca453880bd100a))
+- 修复日志记录仅支持获取 JSON 结构响应体的问题 ([d7621c6](https://github.com/continew-org/continew-admin/commit/d7621c6b26bfd253d9295444ea144f5dabf67f44))
+- 修复并增强 SQL 注入防御 ([0f1479f](https://github.com/continew-org/continew-admin/commit/0f1479f40deef83a5f5d64cbc24a7691b274b112))
+- 修复目录、菜单的组件名称重复的错误问题 ([9e91f56](https://github.com/continew-org/continew-admin/commit/9e91f563e2a263ce302dc3bf17c89e37c2b56285))
+- 修复 DataPermission 注解表别名配置无效的问题 ([6c4e252](https://github.com/continew-org/continew-admin/commit/6c4e2522df3f44ba0f5a21228e805b8ac98f8e6b))
+- 临时移除 MyBatis Plus saveBatch 不兼容的 rewriteBatchedStatements 配置 ([25240fa](https://github.com/continew-org/continew-admin/commit/25240fa81957a1677deda294ce8f2b0af5413315))
+- 修复更新会导致原加密失效的问题 ([8903195](https://github.com/continew-org/continew-admin/commit/89031954c0b7daee1c08e1a10fd50139301cd6ab)) ([c87317d](https://github.com/continew-org/continew-admin/commit/c87317d19946989e86dfbc5f24b155b2ea5abdc9))
+- 修复角色查询参数与前端不一致的问题 ([098571f](https://github.com/continew-org/continew-admin/commit/098571ffb2febc6163d2b9e5b18c4796ea80cbfa))
+- 修复特殊校验异常不打印堆栈 ([c87317d](https://github.com/continew-org/continew-admin/commit/c87317d19946989e86dfbc5f24b155b2ea5abdc9))
+- 修复日志全局 includes 配置会被局部修改的问题 ([c87317d](https://github.com/continew-org/continew-admin/commit/c87317d19946989e86dfbc5f24b155b2ea5abdc9))
+- 修复初始数据错误 ([403c72a](https://github.com/continew-org/continew-admin/commit/403c72aa52a0f0852208f15fa1c7117ee26414f0))
+
+### 📦 依赖升级
+
+- ContiNew Starter 2.4.0 => 2.6.0 (更多特性及依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+
+## [v3.2.0](https://github.com/continew-org/continew-admin/compare/v3.1.0...v3.2.0) (2024-08-05)
+
+### ✨ 新特性
+
+* 新增用户批量导入功能 (GitHub#78) ([c2ad055](https://github.com/continew-org/continew-admin/commit/c2ad055cf82187e132e4cde9e15251e554deadff))
+* 新增任务调度模块 SnailJob(灵活,可靠和快速的分布式任务重试和分布式任务调度平台) (Gitee#22) ([ce1acea](https://github.com/continew-org/continew-admin/commit/ce1acea1535083345c33bcc427054831faf5d2e3)) ([ed5594b](https://github.com/continew-org/continew-admin/commit/ed5594b31e1d31b2a9210b65838d545067ca812f)) ([797221b](https://github.com/continew-org/continew-admin/commit/797221b4dc66c582b95b872b3cb60429247b14e9)) ([7b381b3](https://github.com/continew-org/continew-admin/commit/7b381b36de4ed4ef657249028188abc2f274b036)) ([ffe75e1](https://github.com/continew-org/continew-admin/commit/ffe75e111eb333236e923a1ed14dae5257b09357)) ([cef5cb4](https://github.com/continew-org/continew-admin/commit/cef5cb4fa5e6ee2325fd3738e1c8601a75277dd8)) ([513d8d9](https://github.com/continew-org/continew-admin/commit/513d8d9324b952438ec5513e9e3c7dfb092d5b83))
+* 修改 sys_option sql 脚本以适配 base64 图片 (Gitee#25) ([6848559](https://github.com/continew-org/continew-admin/commit/68485596c47a884b453e4632b59b525527293e17))
+
+### 💎 功能优化
+
+- 优化更新手机号、邮箱语句 ([9995bf0](https://github.com/continew-org/continew-admin/commit/9995bf0200e6256ccc4a26d8847e37fb85b4a226))
+- 重构适配 ContiNew Starter 最新线程池配置 ([5604fe9](https://github.com/continew-org/continew-admin/commit/5604fe95784b2627f1c8144144546de05434577e))
+- 获取短信、邮箱验证码接口适配 ContiNew Starter 限流器 ([44811fc](https://github.com/continew-org/continew-admin/commit/44811fc93283f508953f5fc9193c0b03305da5b2))
+- 移动 SaToken 配置到 webapi 模块 ([d733b7f](https://github.com/continew-org/continew-admin/commit/d733b7f1661a5f0df2b6f12b33ba69da8810e0aa))
+- 新增 continew-admin-plugins 插件模块,代码生成迁移到插件模块,为后续插件化改造铺垫 ([52f3be8](https://github.com/continew-org/continew-admin/commit/52f3be8ee3a07334c76cdfc06d15698b7ccd65ea))
+- 使用分组校验优化存储管理 ([3a23db1](https://github.com/continew-org/continew-admin/commit/3a23db1a4bdfefc26de67ed9e0317097699d5db6))
+- 移动日志配置和依赖至 webapi 模块 ([48aae87](https://github.com/continew-org/continew-admin/commit/48aae877646e93f20a43fe4002d7f19fa98897c3))
+- 调整部分 Query 查询参数类型为对应枚举(目前已支持非 JSON 格式枚举参数转换) ([f80316e](https://github.com/continew-org/continew-admin/commit/f80316e34d9757225a1a7b6002061e8626018e47))
+- 调整部分枚举类的包位置 ([6b69dd4](https://github.com/continew-org/continew-admin/commit/6b69dd43e1544bd955901d6110fa7d7f65aaa80c))
+- 更新通知公告新增、查看菜单数据 ([4554526](https://github.com/continew-org/continew-admin/commit/45545260a36b57b594eb8329e95b7552cf6893f5))
+
+### 🐛 问题修复
+
+- 修复代码生成前端模板部分错误 (Gitee#20) ([b512ea9](https://github.com/continew-org/continew-admin/commit/b512ea99f39aaac04bd4db4a9d73e29ddb340d9e))
+- 修复文件管理删除图片时未删除缩略图的问题 ([bc523eb](https://github.com/continew-org/continew-admin/commit/bc523eba30a500a4af62adbd590446c48a5cb0be))
+- 修复存储管理私有密钥校验错误 ([eb65cff](https://github.com/continew-org/continew-admin/commit/eb65cff4c776a8d3e259f8c96d2918acfe038b6a))
+- 删除用户未删除用户历史密码 ([f53d6b6](https://github.com/continew-org/continew-admin/commit/f53d6b6504d5d504581e2697589dcb9b8fbe82ef))
+- 修复菜单缓存更新错误 ([10ff4ce](https://github.com/continew-org/continew-admin/commit/10ff4ce838b950df42994de4dbd2af20ff254949))
+- 修复偶发性报错 zip file closed ([b587cb8](https://github.com/continew-org/continew-admin/commit/b587cb82aa5d48548b5ce75dd4863af037ae8274))
+- 修复代码生成器前端新增数据模板错误 ([81de8d0](https://github.com/continew-org/continew-admin/commit/81de8d060ba081d14873d14d6e4083302a718bef))
+
+### 📦 依赖升级
+
+- ContiNew Starter 2.1.0 => 2.4.0 (更多依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+
+## [v3.1.0](https://github.com/continew-org/continew-admin/compare/v3.0.1...v3.1.0) (2024-06-16)
+
+### ✨ 新特性
+
+* 系统配置新增安全设置功能,支持多种密码策略配置,例如:有效期、密码重复使用次数、密码错误锁定等 (GitHub#61) ([1de2a8f](https://github.com/continew-org/continew-admin/commit/1de2a8f2dcf01ef8eeb7e2d662c09af00b38ffb1)) ([90ecaab](https://github.com/continew-org/continew-admin/commit/90ecaab63241b8d351ebaffa4faece8c609882b1)) ([3994142](https://github.com/continew-org/continew-admin/commit/3994142ace6cd6ce9d094b8a4ceed080a2b2ec33)) ([1427c13](https://github.com/continew-org/continew-admin/commit/1427c13b7a0b4e0f569ccc20a3172ad748c98e14)) ([5f5fee6](https://github.com/continew-org/continew-admin/commit/5f5fee63f8e584ffd9542bf132ee724762187d83)) ([c1e9d31](https://github.com/continew-org/continew-admin/commit/c1e9d318e0643c0854a848425955948d05b158d3)) ([48d0f47](https://github.com/continew-org/continew-admin/commit/48d0f476149ff7bc30fe05fe3dec84e5a947cf19))
+* 图片文件支持缩略图 (GitHub#63) ([d320c95](https://github.com/continew-org/continew-admin/commit/d320c9596a321dce1028ac36d23bcd04535e87a6)) ([d44fb3a](https://github.com/continew-org/continew-admin/commit/d44fb3a681370b5763f028cc761fbb5fc94a104c))
+* 在线用户增加最后活跃时间显示 ([926497a](https://github.com/continew-org/continew-admin/commit/926497a18acbb6ef170de9f68bd97e025e212f3e))
+* 新增 WebSocket 消息通知,站内信重新上线 (GitHub#67) ([9970c46](https://github.com/continew-org/continew-admin/commit/9970c461cce5c710f1f8479d4bdd258e65558256)) ([94168e2](https://github.com/continew-org/continew-admin/commit/94168e246f75364605b6fbdb82c9438e2b959c61)) ([5abdb8d](https://github.com/continew-org/continew-admin/commit/5abdb8d86161e7bd03ace14b3c899f6ad13020e2))
+* 文件上传按日期拆分目录 (GitHub#68) ([08aa085](https://github.com/continew-org/continew-admin/commit/08aa08550589876a821a37d56a5fae8867292978))
+* 代码生成增加了 TREE_SELECT/CHECK_GROUP/INPUT_NUMBER/INPUT_PASSWORD控件 (Gitee#17) ([8632b22](https://github.com/continew-org/continew-admin/commit/8632b22bd5b6d43e31b6aeac930836464849441b)) ([cf18c10](https://github.com/continew-org/continew-admin/commit/cf18c1046b77c9f38d28b0e6608d345df3bbd5a9))
+* 系统参数新增根据类别查询方法 ([694cbb2](https://github.com/continew-org/continew-admin/commit/694cbb2850c05f7eb35fb982530a6c204f1f64b0))
+* 支持动态邮件 ([1dbb339](https://github.com/continew-org/continew-admin/commit/1dbb33935a05e9fde749191e34682e632c8e1e63))
+
+### 💎 功能优化
+
+- 优化部分命名 ([a3cf39f](https://github.com/continew-org/continew-admin/commit/a3cf39f9f8611f7f34dd9f55166d0fe75b72145b))
+- 优化代码生成预览 (Gitee#14) ([ad7412f](https://github.com/continew-org/continew-admin/commit/ad7412f9cbee5d851d060d8e9d717b2553d3d4cb))
+- 优化个人中心部分参数命名 ([61dd3a4](https://github.com/continew-org/continew-admin/commit/61dd3a4c3aef2d4a873a1d4de13bc1962179eeb1))
+- 根据前端最新 ESLint 配置优化代码生成模板 ([044b4b6](https://github.com/continew-org/continew-admin/commit/044b4b669aa2b77b3f5ac27095202e57045fd10d))
+- 优化代码生成模板 ([3ddcdf0](https://github.com/continew-org/continew-admin/commit/3ddcdf0f67d12250da4b7f6f6ff3d63a880e6d4c)) ([6396e9a](https://github.com/continew-org/continew-admin/commit/6396e9a7364bf899023c2399083b43c67efb30cf)) ([2fb4001](https://github.com/continew-org/continew-admin/commit/2fb40015c1ca2bc58b66891e2cfbfac70b029016))
+- 使用 Crane4j 优化在线用户数据填充 ([cb81135](https://github.com/continew-org/continew-admin/commit/cb811350f36364fcc85355c081b8b60c7d5bfb2a))
+- 用户角色名称调整为角色名称列表返回,并全局优化 Crane4j 组件的使用方式 ([857a1c9](https://github.com/continew-org/continew-admin/commit/857a1c90838c8305f916af9dccfd4ca847ca8c66)) ([0b76d5c](https://github.com/continew-org/continew-admin/commit/0b76d5ca33f5900862d48321e8384ee8ded6ae4e))
+- 优化部分方法排序 ([651cc8a](https://github.com/continew-org/continew-admin/commit/651cc8ae71bd3f544bd41adac0ef7044011300a7))
+- 字典管理分页查询接口 => 查询列表接口 ([b13d0e9](https://github.com/continew-org/continew-admin/commit/b13d0e9ee530fc1a8b382e08ead065989f2b0e7f))
+- 移除部门响应信息中的 getDisabled 方法 ([659144a](https://github.com/continew-org/continew-admin/commit/659144afdaf5d1b4667437053a770cf39681cdd7))
+- 文件管理存储路径改为相对路径 (GitHub#69) ([8854f20](https://github.com/continew-org/continew-admin/commit/8854f20ce90f6a1c379ac81a27bb40784a838095))
+- 查询文件列表增加存储名称信息返回 ([69bc1e5](https://github.com/continew-org/continew-admin/commit/69bc1e52e122c14a695d2e37589d36cbb64de8a4))
+- 系统参数表结构新增ID、类别字段 ([45396f2](https://github.com/continew-org/continew-admin/commit/45396f2dc23b4de47912c1d77b05711c839672ce))
+- 优化公告状态判断 ([a07aedb](https://github.com/continew-org/continew-admin/commit/a07aedbf35e32f3d09d2e9ed8857b9a9d2e2e13a))
+- 重构系统参数相关接口 ([6d0060b](https://github.com/continew-org/continew-admin/commit/6d0060b21c374afd9880e57490345a140187a7cd))
+- 优化用户及部门查询 ([448f9a0](https://github.com/continew-org/continew-admin/commit/448f9a0a819d6816a5ae3ada2e07690a5f70f7df))
+- 用户头像改为Base64存储 ([969216d](https://github.com/continew-org/continew-admin/commit/969216d7c67332eae826c11233c8745d9d3ad81c)) ([513ea83](https://github.com/continew-org/continew-admin/commit/513ea83152708194348afeb93d31aed1a9914e57)) ([7a6cafc](https://github.com/continew-org/continew-admin/commit/7a6cafc6e4ff6914fa62a870538b51759af866a8))
+- 优化配置文件 ([5b3d4f5](https://github.com/continew-org/continew-admin/commit/5b3d4f57788e30b62a1e1af9c2620a4cc8659bfe))
+- 优化登录 Helper ([afbd619](https://github.com/continew-org/continew-admin/commit/afbd619d098ff3d70fc786db9594cebf03c07e10))
+- 重构查询参数及字典接口 ([1d60213](https://github.com/continew-org/continew-admin/commit/1d602134377fc13b062981476b8c17947b36006d))
+- 重构查询角色字典接口 ([1e73d06](https://github.com/continew-org/continew-admin/commit/1e73d06a972d380bbed253eaffd806d8e0698525))
+- 使用 CompletableFuture 实现异步加载用户权限、角色代码和角色信息,以提高登录时的性能和响应速度 ([d5f3c74](https://github.com/charles7c/continew-admin/commit/d5f3c7417ad7b1178b5a53da3fd6f3cb7cd3b19a))
+
+
+### 🐛 问题修复
+
+- 补充查询文件资源统计权限校验注解 ([60cbf04](https://github.com/continew-org/continew-admin/commit/60cbf0402a350d05a09abec57ba94c7758b46499))
+- Postgresql startup script fixes (GitHub#60) ([8caad16](https://github.com/continew-org/continew-admin/commit/8caad16ef226e473a81f79b82485c3d03ded7a42))
+- 修复初始菜单数据错误 ([f062797](https://github.com/continew-org/continew-admin/commit/f062797629bd7fc220ceae1e44859146ef4a14ff))
+- 字典编码、存储编码及类型、菜单类型不允许修改 ([79d0101](https://github.com/continew-org/continew-admin/commit/79d0101e5eb1baa86979b6a6d3c584a2a483320f))
+- 修复行为验证码接口请求次数限制 ([573e634](https://github.com/continew-org/continew-admin/commit/573e634b433c473551244418e695a34bbd3fa675))
+- 修复导出用户报错 ([655a695](https://github.com/continew-org/continew-admin/commit/655a695753d12db624fbf2afaf10d38f67241e31))
+- 移除部门名称错误正则 ([0285874](https://github.com/continew-org/continew-admin/commit/0285874540c0cadc8aae74077f6368b6e7977c35))
+- 修复插入第三方登录用户时报错 ([0cfc7a5](https://github.com/continew-org/continew-admin/commit/0cfc7a5c80c3558028c7225fc459ecb07149ab0d))
+- 修复更新手机号、邮箱未加密的问题 ([485d708](https://github.com/continew-org/continew-admin/commit/485d708cd45df922ec8e601b7bd7344e9ebd9299)) ([e6d7205](https://github.com/continew-org/continew-admin/commit/e6d720571d3273f27351e81a19fdd97b9b4336f6))
+
+### 📦 依赖升级
+
+- ContiNew Starter 2.0.0 => 2.1.0 (更多依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+
+## [v3.0.1](https://github.com/continew-org/continew-admin/compare/v3.0.0...v3.0.1) (2024-05-03)
+
+### ✨ 新特性
+
+* 新增验证码超时显示效果,超时后显示已过期请刷新 (GitHub#56) ([4c6a7fb](https://github.com/continew-org/continew-admin/commit/4c6a7fb91ad195b86d776f8aef6aef81d07b2eb1))
+* 文件管理增加资源统计,统计总存储量、各类型文件存储占用 (GitHub#58) ([15c966f](https://github.com/continew-org/continew-admin/commit/15c966f7bb255db3edea249f8d3354324cbdbf5b))
+
+### 💎 功能优化
+
+- 获取图片验证码 URL /img => /image ([9a1a472](https://github.com/continew-org/continew-admin/commit/9a1a472ec996362cb918e79b9ce37bfa2639a10b))
+- 移除对部分 API 重复的权限校验 ([53eaef9](https://github.com/continew-org/continew-admin/commit/53eaef9fbdfd6d0866a3d5e424d783e2e7bc0e17))
+- 优化代码生成模板 ([dc92731](https://github.com/continew-org/continew-admin/commit/dc9273132dc8e266f2d44c834b9c2733256afdfe)) ([def831f](https://github.com/continew-org/continew-admin/commit/def831f2dca0703f5ef8b84b0e695a32b171461d))
+
+
+### 🐛 问题修复
+
+- 修复查询用户邮箱、手机号时未自动加密导致的错误 ([faa56d1](https://github.com/continew-org/continew-admin/commit/faa56d16b92cbdb8f7e16c8b43c2916ae692d881))
+- 修复根据部门查询用户列表数据错误 ([42ac82e](https://github.com/continew-org/continew-admin/commit/42ac82e7ceef9336741c2514470c0db36ab7075e))
+- 修复文件类型处理错误 ([9b60e24](https://github.com/continew-org/continew-admin/commit/9b60e24364bfb4cc7cd9996a43579a062197cdf3))
+
+## [v3.0.0](https://github.com/continew-org/continew-admin/compare/v2.5.0...v3.0.0) (2024-04-27)
+
+### ✨ 新特性
+
+* 系统日志新增导出 API ([bd0f40c](https://github.com/continew-org/continew-admin/commit/bd0f40c6ad397174baf80b04923ef1e94ff28e3c))
+* 适配 3.0 前端菜单,并梳理菜单数据
+* 适配 3.0 前端代码生成模板,代码预览及生成 ([3dbe72f](https://github.com/continew-org/continew-admin/commit/3dbe72fd570c44b32599d869abd30331137a6c7d))
+
+### 💎 功能优化
+
+- 重构日志管理相关接口 ([7793f82](https://github.com/continew-org/continew-admin/commit/7793f82009bcdb5fcdfe5e91daab211ab1705bf7))
+- 优化部门管理相关 API,合并 DeptResp 及 DeptDetailResp ([a2cf072](https://github.com/continew-org/continew-admin/commit/a2cf072609ac33543605ecbb5f8e498237bc3d91))
+- 优化存储管理相关 API,合并 StorageResp 及 StorageDetailResp ([f7b5a4f](https://github.com/continew-org/continew-admin/commit/f7b5a4ff8dd93f444c00d103b0609ae81e0dd70c))
+- 优化字典管理相关 API ([9ec5945](https://github.com/continew-org/continew-admin/commit/9ec594509f2d4b31f46e3aca66d65d139dc8b94f))
+- 移除部门、角色、菜单、用户、存储的状态默认值 ([bd5ede2](https://github.com/continew-org/continew-admin/commit/bd5ede2e2956057376b930ecfed88ca44437cbc1))
+- 代码生成新增 MySQL json 数据类型映射 ([fe57350](https://github.com/continew-org/continew-admin/commit/fe5735090d94f5d900d79142e5e42ba2db9c0249))
+- 优化角色管理相关 API,角色编码不允许修改 ([df59cee](https://github.com/continew-org/continew-admin/commit/df59cee98565f9f45b04d16533888be39c3d7a6f))
+- 优化用户管理相关 API ([5269608](https://github.com/continew-org/continew-admin/commit/5269608c61b1f5a6a9f61cd45b349f28db714232))
+- 文件管理查询 API 调整为分页查询 ([f8bea90](https://github.com/continew-org/continew-admin/commit/f8bea901938aec0f0ac21c63179c5bde2a0965a7))
+- 移除 Qodana 扫描 ([d88581f](https://github.com/continew-org/continew-admin/commit/d88581f939afb0caa3589c8ee76c9b296bb9997e))
+- 移除菜单导出接口 ([4363c91](https://github.com/continew-org/continew-admin/commit/4363c91872e6d83e139b22c95a0d7e83183d8f69))
+- 优化系统日志、在线用户、存储管理、部门管理相关代码 ([a2e4f9a](https://github.com/continew-org/continew-admin/commit/a2e4f9a28b744e269c46dc66c60311bb939021a7))
+- 优化查询参数字典 API 地址 ([79a3de8](https://github.com/continew-org/continew-admin/commit/79a3de8971c613277bdcea79463b6f06959e7b85))
+- 移除角色状态字段 ([e89ba7d](https://github.com/continew-org/continew-admin/commit/e89ba7d5cd793e20c3562c7bd1e4655ed1e5a2a3))
+
+
+### 🐛 问题修复
+
+- 使用字典时,仅查询启用状态字典 ([17c795f](https://github.com/continew-org/continew-admin/commit/17c795fedef5b6801f2053d97b9d78d067775ca1))
+- 获取 Authorization 请求头内容兼容小写请求头场景 ([e68c445](https://github.com/continew-org/continew-admin/commit/e68c4455a8af1b4d7a25cd63f9fc9e5aabb441ab))
+- 修复查询用户权限存在空值的问题 ([fce4a56](https://github.com/continew-org/continew-admin/commit/fce4a566d7204791650153f0a5507a5d05d2d6c3))
+- 存储管理 S3 存储功能修复 (GitHub#51) ([f71c4c2](https://github.com/continew-org/continew-admin/commit/f71c4c226ffd7c27f6726873be6af125affaf148))
+- 修复 sys_role_menu 表初始数据错误 ([70ed667](https://github.com/continew-org/continew-admin/commit/70ed667c16388093204eecd97e4914076c62d1ff))
+- 修复用户管理/角色管理编辑及状态变更问题 (GitHub#53) ([abf1e65](https://github.com/continew-org/continew-admin/commit/abf1e651e9782a6f7bf2a896018de17130038c57))
+- 修复Failed to submit a listener notification task. Event loop shut down? 问题,开发时表现为需要点击两次才能关闭程序 ([f5ab22e](https://github.com/continew-org/continew-admin/commit/f5ab22eedf594cee43592a2f29409ee9c33a88d3))
+
+### 💥 破坏性变更
+
+- 适配 continew-starter 2.0.0,top.charles7c.continew.starter => top.continew.starter ([f5ab22e](https://github.com/continew-org/continew-admin/commit/f5ab22eedf594cee43592a2f29409ee9c33a88d3))
+- 移除 monitor 模块 ([b6206a3](https://github.com/continew-org/continew-admin/commit/b6206a334671894306043f86ec07d7c045cd757d))
+- top.charles7c.continew.admin => top.continew.admin ([08eeabc](https://github.com/continew-org/continew-admin/commit/08eeabc47d58db3cfc861a3a527e52bf89f6183b))
+- 公告管理 Announcement => Notice ([dbe93df](https://github.com/continew-org/continew-admin/commit/dbe93df8bcec0b7dfb24fbd92f35928a3156f4e5))
+
+### 📦 依赖升级
+
+- ContiNew Starter 1.5.1 => 2.0.0 (更多依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+
+## [v2.5.0](https://github.com/continew-org/continew-admin/compare/v2.4.0...v2.5.0) (2024-03-23)
+
+### ✨ 新特性
+
+* 新增 PostgreSQL 数据源配置示例 ([ee48c80](https://github.com/continew-org/continew-admin/commit/ee48c80cd10a4c4546d1cb24f1f4716bb2ac08ea))
+* 新增 PostgreSQL 部署脚本 ([3129e0a](https://github.com/continew-org/continew-admin/commit/3129e0a6dcbd809f0013fbf6c53ad029ae9f7a0e))
+* 新增 PostgreSQL 初始 SQL 脚本 ([33b8102](https://github.com/continew-org/continew-admin/commit/33b81029df0b51058b3525b4317b51a2351319dc))
+* 新增代码生成器插件模块(后续会改造为独立插件) ([87829d3](https://github.com/continew-org/continew-admin/commit/87829d3ce8ab5a35091800900f7d7708f15ed9c2))
+* 代码生成同步最新数据表结构支持同步排序 ([89546de](https://github.com/continew-org/continew-admin/commit/89546deced78f83daca7ac0ba2e7d3d8cd101d0c))
+* 新增代码批量生成功能  ([Gitee PR#12](https://gitee.com/continew/continew-admin/pulls/12)) ([040f137](https://github.com/continew-org/continew-admin/commit/040f137934130451700bc28aeabbced30970c5f6))
+
+### 💎 功能优化
+
+- 移除 ` 符号的使用,保持数据库无关性 ([d6b07bd](https://github.com/continew-org/continew-admin/commit/d6b07bd6d1b1f9077a7571702b58c5e9c782b446))
+- 优化字符串模板方法 API 使用 ([0f39384](https://github.com/continew-org/continew-admin/commit/0f393845a19432e7c965e811c96774694f4d2372))
+- 调整部分 SQL 语句,以兼容 PostgreSQL 数据库 ([9f5049b](https://github.com/continew-org/continew-admin/commit/9f5049bf26c557738867dfe833261d60d071d4a8)) ([bf60d48](https://github.com/continew-org/continew-admin/commit/bf60d48d3a53dd5d73a78e73b6b230e3271ec3de))
+- 新增插件仓库配置 ([0439252](https://github.com/continew-org/continew-admin/commit/04392524ac13c2096b549f99d0391fa1d375ca31))
+- 优化部分接口响应格式为 kv 格式 ([b40d872](https://github.com/continew-org/continew-admin/commit/b40d872bc4b8dd30ad952d639158619b43cef999))
+- 适配 Crane4j 条件注解 ([bf00747](https://github.com/continew-org/continew-admin/commit/bf007470b2362159309ff8231a2f0ad180cfc947))
+- 重构代码生成配置 ([7031a51](https://github.com/continew-org/continew-admin/commit/7031a51cd4d7072d4da841736678bb81b2123e9d))
+- 重构代码生成功能,由指定路径生成模式调整为下载模式,更方便复杂场景 ([df0c0dd](https://github.com/continew-org/continew-admin/commit/df0c0dd7dcf39620abaf21bd450620ec3fffcf37))
+
+
+### 🐛 问题修复
+
+- 修复 MySQL 初始 SQL 脚本数据错误 ([49d6bd6](https://github.com/continew-org/continew-admin/commit/49d6bd6874b3df66fd2e2051ea273cb43cb7b4f6))
+- 修复参数缓存未及时过期的问题 ([976e9c4](https://github.com/continew-org/continew-admin/commit/976e9c43df5926c533723a75222c59fde05e122e))
+- 修复代码生成 text 类型数据的长度校验时,数值显示为 65,535 的问题 ([8026f66](https://github.com/continew-org/continew-admin/commit/8026f660c7af7bba6d4caaf31535a890e5b40a96))
+
+### 💥 破坏性变更
+
+- 调整 liquibase 目录结构,更适合开源类项目适配多种数据库脚本场景 ([1ca48a6](https://github.com/continew-org/continew-admin/commit/1ca48a6620cff62f3648cc28042843163589e150))
+- 适配 ContiNew Starter 日志及数据库工具的包结构优化 ([3405868](https://github.com/continew-org/continew-admin/commit/3405868c7f042beafb77a7407a388a40b9a75466))
+- 适配 ContiNew Starter Query 组件的包结构优化 ([6be1b6c](https://github.com/continew-org/continew-admin/commit/6be1b6cfb1e7fef4422b8c38e6073a435ebae5c2))
+
+### 📦 依赖升级
+
+- ContiNew Starter 1.4.0 => 1.5.1 (更多依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+
+## [v2.4.0](https://github.com/continew-org/continew-admin/compare/v2.3.0...v2.4.0) (2024-02-16)
+
+### ✨ 新特性
+
+* 集成 TLog(轻量级的分布式日志标记追踪神器) ([Gitee PR#10](https://gitee.com/continew/continew-admin/pulls/10))
+* 系统日志新增 traceId 链路号记录,方便查看完整日志链路 ([860ca40](https://github.com/continew-org/continew-admin/commit/860ca403c2c32cc6395c1608217bc9b6e7c18bd8))
+* 取消用户默认密码,改为表单填写密码 ([3d77aa9](https://github.com/continew-org/continew-admin/commit/3d77aa91ee32065b53d9c47a57c33d6d7e4efb0e))
+* 适配 ContiNew Starter 加密模块(安全模块) ([6435175](https://github.com/continew-org/continew-admin/commit/6435175dc3d853cb170270e39e8f1505adffeae5)) ([43da462](https://github.com/continew-org/continew-admin/commit/43da462560e224ed92f239cb5af4db64dea51d18))
+* 适配 ContiNew Starter 脱敏模块(安全模块) ([2109789](https://github.com/continew-org/continew-admin/commit/2109789116d9ff18773d8afeb854d1dfc70b935a))
+
+### 💎 功能优化
+
+- 优化 API 文档分组配置 ([2df4cce](https://github.com/continew-org/continew-admin/commit/2df4cceedd35b1c2c07bcbf38b5a157604a752c2))
+- 优化 QueryTypeEnum 枚举值命名 ([9648cf6](https://github.com/continew-org/continew-admin/commit/9648cf64a4679657f0e609f980805d274563aa53))
+- 优化 Query 相关注解使用方式 ([15b1520](https://github.com/continew-org/continew-admin/commit/15b152008c6ae8ab89704d83a969dcfbbb8b5b88))
+- 新增 Qodana 扫描 ([f6a9581](https://github.com/continew-org/continew-admin/commit/f6a9581adef87a8915639e6cb2d7c4d02315ebd0))
+- 新增 SonarCloud 扫描 ([a154abd](https://github.com/continew-org/continew-admin/commit/a154abde8a39cfecc421c79e01998274b944d2c1)) ([c03c082](https://github.com/continew-org/continew-admin/commit/c03c082d2e2884962547633f5e98663088bd2c3b))
+- 移除 Lombok 私有构造注解使用 ([a2420d3](https://github.com/continew-org/continew-admin/commit/a2420d3f4b4652a1d9711f513b8fb22a56105141))
+- 获取不到当前登录用户信息则抛出未登录异常 ([d972a44](https://github.com/continew-org/continew-admin/commit/d972a4466a9e8a1a6e6375e4171a4790c2ba156e))
+- 优化代码,解决 [Sonar](https://sonarcloud.io/organizations/charles7c/projects)、[Codacy](https://app.codacy.com/gh/continew-org/continew-admin/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)、[Qodana](https://qodana.cloud/organizations/pQDPD/teams/p5jqd/) 扫描问题,点击各链接查看对应实时质量分析报告(Codacy 已达到 A)
+- 优化部署配置 ([b5d668e](https://github.com/continew-org/continew-admin/commit/b5d668e014690d3f1a8a2bab0d0ad0039083e7bb))
+- 使用密码编码器重构密码加密、密码判断等相关处理 ([594f7fd](https://github.com/continew-org/continew-admin/commit/594f7fd042f1ff96a298f2e59ffdda112113cb51))
+- 优化 SaToken 及图形验证码配置 ([70973db](https://github.com/continew-org/continew-admin/commit/70973db71f2eed49c5878d69d8b93ff04b13a8b9))
+- 优化图形验证码使用及部分配置 ([a50d857](https://github.com/continew-org/continew-admin/commit/a50d857c41d164355d36ae5dfd14c6badbe06202))
+
+
+### 🐛 问题修复
+
+- 修复 API 响应内容类型错误 ([439f7c7](https://github.com/continew-org/continew-admin/commit/439f7c7c58ee27ff56b5093df71bc902c46f48fa))
+
+### 💥 破坏性变更
+
+- 调整自增 ID 为分布式 ID ([4779887](https://github.com/continew-org/continew-admin/commit/4779887751bd3a696e4d31294057e8c03d66eaf3))
+
+### 📦 依赖升级
+
+- ContiNew Starter 1.2.0 => 1.4.0 (更多依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+
+## [v2.3.0](https://github.com/continew-org/continew-admin/compare/v2.2.0...v2.3.0) (2024-01-21)
+
+### ✨ 新特性
+
+* 代码生成 Request 实体时,针对字符串类型增加数据长度校验注解 ([ee82558](https://github.com/continew-org/continew-admin/commit/ee8255876f618137f811e14ee305509e4e6466d0))
+* 适配 Crane4j 数据填充组件,优化部分数据填充处理 ([d598408](https://github.com/continew-org/continew-admin/commit/d5984087a306de31690e9a81d951bd831434a0c9)) ([a2411f7](https://github.com/continew-org/continew-admin/commit/a2411f728a811910a0918668c0811e7df0345640)) ([7a3ccc2](https://github.com/continew-org/continew-admin/commit/7a3ccc2dee8f7b938a91df52fd4903ce09e662e5))
+* 移除 Spring Cache,适配 JetCache ([d4bb39d](https://github.com/continew-org/continew-admin/commit/d4bb39d9b4483b7d7fed76b5f2b997538d86d719)) ([1b7aa9d](https://github.com/continew-org/continew-admin/commit/1b7aa9db0c56af733f63f602988dba9e225fe445)) ([8596e47](https://github.com/continew-org/continew-admin/commit/8596e47ed62e19083d6007448c5369d72fa4f2b6))
+
+### 💎 功能优化
+
+- 优化本地存储库注册 ([918e897](https://github.com/continew-org/continew-admin/commit/918e897838628b24a160c3a8f3b3dea1eefd1883))
+- 增加华为云镜像源仓库配置 ([16ee2b4](https://github.com/continew-org/continew-admin/commit/16ee2b4b6fe2a663830972ed99d4e80ddf5a3593))
+- 优化部分字段名称 ([e3e958b](https://github.com/continew-org/continew-admin/commit/e3e958b419e1ea23fe146b255fce749050302f63))
+- 调整代码生成前端 Vue 页面模板 ([7c34574](https://github.com/continew-org/continew-admin/commit/7c345745aadc6272e5f1db674c757ff0f9cea604))
+- 更新格式配置,优化全局代码格式 ([35e3123](https://github.com/continew-org/continew-admin/commit/35e31233c531b68b761c73fc0daf7444843b4059))
+- 优化配置文件格式 ([a8a4cad](https://github.com/continew-org/continew-admin/commit/a8a4cad840b6d32fbb8d3df24b193f9e7c826d22))
+- 使用钩子方法优化部分增、删、改处理 ([61c5724](https://github.com/continew-org/continew-admin/commit/61c57242fa481d2668b1d1ac4ff4802c47fd07bc))
+- 完善 flatten Maven 插件配置,以覆盖更多使用情况 ([657accd](https://github.com/continew-org/continew-admin/commit/657accd8a595ab0c2e9ff4d00e49c569eae03123))
+- 移除部分无用 Maven 配置 ([5db1f66](https://github.com/continew-org/continew-admin/commit/5db1f669e0bc5022bcd2164757a0f82dfe8d6c30))
+- 优化日志配置,滚动策略调整为基于日志文件大小和时间滚动 ([2fa8c25](https://github.com/continew-org/continew-admin/commit/2fa8c254fc53cda3d33c56931569822e645dd902))
+
+### 🐛 问题修复
+
+- 完善代码生成前端路径配置校验 ([bee04d5](https://github.com/continew-org/continew-admin/commit/bee04d5f363b6de88df5249b0fba85607978b303))
+
+### 💥 破坏性变更
+
+- 根据发展需要,拆分前端项目 continew-admin-ui 到独立仓库 ([4067eb9](https://github.com/continew-org/continew-admin/commit/4067eb97bf344dec6ae718433b57bdb7d0b8d6cd))
+- PageDataResp => PageResp ([d8c946e](https://github.com/continew-org/continew-admin/commit/d8c946e8014d205c4fd3f38d1f04b3225faede7a))
+- 适配 ContiNew Starter IService 接口,CRUD 查询详情方法不再检查是否存在 ([47a133a](https://github.com/continew-org/continew-admin/commit/47a133a065b5c858b588bf77ad51bb9fc38d1222))
+- 适配 ContiNew Starter CRUD 模块注解 ([7fa70e7](https://github.com/continew-org/continew-admin/commit/7fa70e74070c7c0f487baa5098f85d7dfb808106))
+- 调整部分类的所在包 ([8dc42c7](https://github.com/continew-org/continew-admin/commit/8dc42c7a21e7422399b49690b28899df299e20c7)) ([6efe1ad](https://github.com/continew-org/continew-admin/commit/6efe1ad6f416c52130b2380a699129e7dae29499))
+
+### 📦 依赖升级
+
+- ContiNew Starter 1.1.0 => 1.2.0 (更多依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+
+## [v2.2.0](https://github.com/continew-org/continew-admin/compare/v2.1.0...v2.2.0) (2023-12-31)
+
+### ✨ 新特性
+
+* 发送短信验证码新增限流处理 ([e719d20](https://github.com/continew-org/continew-admin/commit/e719d207fb76c82b584f2e1ac7210061dc71a89a))
+* 代码生成新增生成预览功能 ([4017029](https://github.com/continew-org/continew-admin/commit/401702972f30c4e556a2cf8d048f78fa9ee1c5ba)) ([505ba49](https://github.com/continew-org/continew-admin/commit/505ba49a5304fb3e2ba655dea901cd5e3ea74673))
+* 适配 ContiNew Starter 行为验证码,系统内所有短信发送新增前置行为验证码验证 ([Gitee PR#9](https://gitee.com/continew/continew-admin/pulls/9))
+* 文件管理:提供文件上传、下载、预览(目前支持图片、音视频)、重命名、切换视图(列表、网格)等功能
+* 存储库管理:提供文件存储库新增、编辑、删除、导出等功能
+
+### 💎 功能优化
+
+- 优化 API 文档配置 ([108f1c4](https://github.com/continew-org/continew-admin/commit/108f1c4ae7b855ac0bab2d3fe028270472a8be71))
+- 调整枚举配置值为大写 ([3ece42b](https://github.com/continew-org/continew-admin/commit/3ece42b94e071ece87e6b4616f7817bf851ba28f))
+- 优化由于 Mock 引起的导出报错提示 ([349899b](https://github.com/continew-org/continew-admin/commit/349899b4fc9572450ca31d9a5e19268ce0b868a8))
+- 优化查询访客地域分布信息接口 SQL ([4df887d](https://github.com/continew-org/continew-admin/commit/4df887d82678ced0d30aa0c7a6f92edcac902052))
+- 调整后端部分方法名 save => add ([45bd3e1](https://github.com/continew-org/continew-admin/commit/45bd3e10b6ac6aecde41ff9484668e557a485b27))
+- 优化系统日志详情 ([55effa3](https://github.com/continew-org/continew-admin/commit/55effa36580a57ddedb688e2ce30bec45c761224)) ([99997c1](https://github.com/continew-org/continew-admin/commit/99997c160eefc152a6f4e74bcd9c5ef6fc77a9c5))
+- 移除部分方法中仅有单个非读操作的事务处理 ([b85d692](https://github.com/continew-org/continew-admin/commit/b85d69298de1a6c48d15300bb9ff1b3ea569fdbd))
+- 优化编译配置 ([ed8bb57](https://github.com/continew-org/continew-admin/commit/ed8bb57fe24dfbe8f45b8f53370ebb79f1511268))
+- 优化配置文件格式 ([3399bc8](https://github.com/continew-org/continew-admin/commit/3399bc8dde0c8c8ac6d3e583ffbe299f7e6dd80b))
+
+### 🐛 问题修复
+
+- 修复代码生成相关错误 ([3fdc50d](https://github.com/continew-org/continew-admin/commit/3fdc50d78ec50a878cec2b35c7d5028e741c42d7))
+- 更新仪表盘帮助文档部分过期链接 ([ac42836](https://github.com/continew-org/continew-admin/commit/ac4283679a847ed372db28aae1ea05fd791651b8))
+
+### 💥 破坏性变更
+
+- 适配 ContiNew Starter QueryTypeEnum 命名变更 ([97c273f](https://github.com/continew-org/continew-admin/commit/97c273f99ecb038e041e3d39dbfacf326d49cc1b))
+- 适配 ContiNew Starter Log HttpTracePro(日志模块) ([9bf0150](https://github.com/continew-org/continew-admin/commit/9bf015059b96f41c29f05ecbf7612d611b3a98c3))
+- 适配 ContiNew Starter 全局异常处理器 ([4ed4ddd](https://github.com/continew-org/continew-admin/commit/4ed4ddd4f055cefe1f85482bd6b9ef760978691b))
+- 适配 ContiNew Starter 数据权限解决方案(数据访问模块-MyBatis Plus) ([0849426](https://github.com/continew-org/continew-admin/commit/084942630ab0e1846c1836b8dc4bf5b2c9a5b16e))
+- 调整 IBaseEnum 所属包 ([e6c6e1c](https://github.com/continew-org/continew-admin/commit/e6c6e1cb0e326c5f531ca5cb2e17a1e26efac7d9))
+- 重构原有文件上传接口并优化配置文件配置格式 ([5e37025](https://github.com/continew-org/continew-admin/commit/5e370254dd00deaab62438c5feb4de14192ad7e6))
+
+### 📦 依赖升级
+
+- ContiNew Starter 1.0.0 => 1.1.0 ([fc80921](https://github.com/continew-org/continew-admin/commit/fc80921c047862b424ca625317f4657667bc2c6b)) (更多依赖升级详情,请查看 ContiNew Starter [更新日志](https://github.com/continew-org/continew-starter/blob/dev/CHANGELOG.md))
+- Arco Design Vue 2.53.0 => 2.53.3 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- Vite 4.5.0 => 4.5.1 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- TypeScript 5.2.2 => 5.3.3 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- unplugin-vue-components 0.25.2 => 0.26.0 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- @kangc/v-md-editor 2.3.17 => 2.3.18 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- eslint 8.53.0 => 8.56.0 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- @vueuse/core 10.5.0 => 10.7.0 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- vue-i18n 9.6.5 => 9.8.0 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- vue-json-pretty 2.2.4 => 2.3.0 ([2720275](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb))
+- 由于篇幅限制,仅列出部分前端依赖升级情况,更多请查看 [提交记录](https://github.com/continew-org/continew-admin/commit/2720275b97334545dde71d548173bfcda7e660cb)
+
+## [v2.1.0](https://github.com/continew-org/continew-admin/compare/v2.0.0...v2.1.0) (2023-12-03)
+
+### 💎 功能优化
+
+- 优化数据权限注解 ([bb59a78](https://github.com/continew-org/continew-admin/commit/bb59a78573bec521e8852f1c88ce6078fb14b14e))
+- 回退全局响应结果处理器 ([c7a4e32](https://github.com/continew-org/continew-admin/commit/c7a4e329945d8368a9b93a2488c059cf3333feba))
+- 优化字典 Controller CRUD 注解使用 ([8c1c4b0](https://github.com/continew-org/continew-admin/commit/8c1c4b014463d073e848e2f2abc33e089efa2abb))
+- 优化常量命名风格,XxxConsts => XxxConstants ([ec28705](https://github.com/continew-org/continew-admin/commit/ec28705b6ff6dd26ec3ef673fb3827259f1b9c41))
+- 移除 XML 文件头部的协议信息 ([b476956](https://github.com/continew-org/continew-admin/commit/b47695603afb0c19679c4100c1e3c23bc8007238))
+- 优化菜单标题校验 ([3dd81a1](https://github.com/continew-org/continew-admin/commit/3dd81a1192c4e340dad0b1bae5e29d1d7218fb25))
+
+### 🐛 问题修复
+
+- 修复 mock 被错误关闭的问题 ([a34070f](https://github.com/continew-org/continew-admin/commit/a34070ffed3044ad2bea604701b074665e7b4e42))
+- 修复保存生成配置校验失效的问题,并优化部分提示效果 ([c34e934](https://github.com/continew-org/continew-admin/commit/c34e934bb553d7f814d0fb5aa87eac0f565289b4))
+
+### 💥 破坏性变更
+
+- 项目包结构 top.charles7c.cnadmin => top.charles7c.continew.admin ([b86fe32](https://github.com/continew-org/continew-admin/commit/b86fe329d07317fed6a7d0b7015856de4b9e75d1))
+- 适配 ContiNew Starter 全局错误处理配置 ([b62095d](https://github.com/continew-org/continew-admin/commit/b62095d66e2318d35e4af07b128203b5a5e016f7))
+- 适配 ContiNew Starter CRUD(扩展模块) ([ce5a2ec](https://github.com/continew-org/continew-admin/commit/ce5a2ec9319b86e69a6bda67a886e1c96079ffc2))
+- 适配 ContiNew Starter Mail(消息模块) ([ce785dd](https://github.com/continew-org/continew-admin/commit/ce785ddce28733eeefbf970ed08b01e36e0abd4b))
+- 适配 ContiNew Starter Excel(文件处理模块) ([1311ae3](https://github.com/continew-org/continew-admin/commit/1311ae3603a26dc44dfffc5be86ea1ab81ff7958))
+- 适配 ContiNew Starter 认证模块-JustAuth ([7ad8d17](https://github.com/continew-org/continew-admin/commit/7ad8d1773a8e50e37a326b8f73f9ba38a3a7ff3a)) ([f28fbd1](https://github.com/continew-org/continew-admin/commit/f28fbd14fa83a82df49b07f16070e0ff3385b0ec))
+- 适配 ContiNew Starter 认证模块-SaToken ([86ca8f0](https://github.com/continew-org/continew-admin/commit/86ca8f094ff6d1c00b52c1406985bc00105b297f))
+- 适配 ContiNew Starter 图形验证码 ([8a11a02](https://github.com/continew-org/continew-admin/commit/8a11a020e04e271da7b700b5d73cf8475b50ee5c))
+- 适配 ContiNew Starter MyBatis Plus 自动配置 ([7306cd9](https://github.com/continew-org/continew-admin/commit/7306cd9d2f9492aa39e11b8f0dc8c7c11b534a3f))
+- 适配 ContiNew Starter Redisson 自动配置 ([a40e609](https://github.com/continew-org/continew-admin/commit/a40e609ea14acda840d2771f05ca9690d41236a1))
+- 适配 ContiNew Starter Jackson、API 文档(Knife4j:Spring Doc)自动配置 ([a86f3a5](https://github.com/continew-org/continew-admin/commit/a86f3a5047eda2f67cc9ad7721006d2db1fd710f))
+- 适配 ContiNew Starter 线程池自动配置 ([ec1daaf](https://github.com/continew-org/continew-admin/commit/ec1daaf0456296dbc3704ae700b9577001bdd5bb))
+- 引入 ContiNew Starter,适配跨域自动配置 ([2c4f511](https://github.com/continew-org/continew-admin/commit/2c4f5116c999b9316ab0bee4fa661338fea63c11))
+- 项目 group id top.charles7c => top.charles7c.continew ([3e23acb](https://github.com/continew-org/continew-admin/commit/3e23acb3e257d5813b858356aa926a96c906acf1))
+
+## [v2.0.0](https://github.com/continew-org/continew-admin/compare/v1.3.1...v2.0.0) (2023-11-15)
+
+### 💎 功能优化
+
+- 优化部分代码格式 ([2f87310](https://github.com/continew-org/continew-admin/commit/2f87310bc886af604a2667285a973ec6ae983430))
+- 优化 401 状态处理逻辑 ([c70e28a](https://github.com/continew-org/continew-admin/commit/c70e28a535c78214fe8d68a09824c786c457ef06))
+- 优化超时登录处理逻辑 ([d5da184](https://github.com/continew-org/continew-admin/commit/d5da1847e33e6cd7a0e5c3434335044167c1241c))
+
+### 🐛 问题修复
+
+- sms4j 3.0.3 => 3.0.4 ([23558d4](https://github.com/continew-org/continew-admin/commit/23558d45620a48ed82b32a5bdd2f948a4a37263d))
+- 发送消息增加事务处理 ([Gitee#7](https://gitee.com/continew/continew-admin/pulls/7)) ([1ca6f6c](https://github.com/continew-org/continew-admin/commit/1ca6f6c7e5f8a7c78f74df547f14517293241ac4))
+- 修复前端控制台 eslint 告警 ([Gitee#6](https://gitee.com/continew/continew-admin/pulls/6)) ([f4523d2](https://github.com/continew-org/continew-admin/commit/f4523d24817b4fee5c015eaba6b98fe99f350bba)) ([2304f28](https://github.com/continew-org/continew-admin/commit/2304f28a942fa8ea3e6d36fbebbe9346b0d3b741))
+- 修复仪表盘访问趋势区块 y 轴数值过大时无法展示的问题 ([fea6024](https://github.com/continew-org/continew-admin/commit/fea602439a3c9589bee078bfa9ff1e7efb378d71))
+- 修复控制台报错 Please use theme before using plugins ([98fbe05](https://github.com/continew-org/continew-admin/commit/98fbe0506c1cbe2f3c16347d9610ebfa5688b506))
+- 调整 Logback 配置,取消启动时打印 Logback 状态日志 ([1f7fef5](https://github.com/continew-org/continew-admin/commit/1f7fef5b31212e94652777be37bea4d4e02eb8c7))
+
+### 💥 破坏性变更
+
+- 优化部署相关脚本,mariadb => mysql ([5f4f0f1](https://github.com/continew-org/continew-admin/commit/5f4f0f1b21fe882dc51801d7c508c10b87d7af36))
+- 适配 Java 16 新特性 ([cf30443](https://github.com/continew-org/continew-admin/commit/cf3044312c8631a8c2b306e466e3d4d663d8eb6d))
+- 适配 Java 14 新特性 ([38f52aa](https://github.com/continew-org/continew-admin/commit/38f52aaafa22ebc958a22b7c38b084c655064fbc))
+- 适配 Java 11 新特性 ([5a5bd16](https://github.com/continew-org/continew-admin/commit/5a5bd1681e076ac6814d552da5415a8f154b93af))
+- 升级前端依赖 ([79fa2c8](https://github.com/continew-org/continew-admin/commit/79fa2c8abcf5f70f96ae7c6de35c47dbae76ee2d)) ([c44162d](https://github.com/continew-org/continew-admin/commit/c44162d431cb87cae251067fff9a5ae707aed9b3))
+  - Arco Design Vue 2.52.0 => 2.53.0
+  - Vue 3.3.4 => 3.3.7
+  - Vite 3.2.7 => 4.5.0
+  - vue-router 4.2.4 => 4.2.5
+  - vue-i18n 9.5.0 => 9.6.5
+  - vue-tsc 1.2.0 => 1.8.22
+  - @vueuse/core 9.13.0 => 10.5.0
+  - pinia 2.1.6 => 2.1.7
+  - rollup 3.20.2 => 4.3.0
+  - vue-cropper 1.0.9 => 1.1.1
+  - crypto-js 4.1.1 => 4.2.0
+  - vite-svg-loader 3.6.0 => 4.0.0
+  - highlight.js 11.8.0 => 11.9.0
+  - mitt 3.0.0 => 3.0.1
+  - consola 2.15.3 => 3.2.3
+  - prettier 2.8.7 => 3.0.3
+  - less 4.1.3 => 4.2.0
+  - eslint 8.48.0 => 8.53.0
+  - stylelint 15.10.3 => 15.11.0
+  - lint-staged 13.2.0 => 3.0.3
+- 升级后端依赖  ([dea160a](https://github.com/continew-org/continew-admin/commit/dea160a7b2d69e1b46edc936c9a697048bbb507a)) ([95c27ea](https://github.com/continew-org/continew-admin/commit/95c27ea323e015c915d352618158df830b4d1c05)) ([fa23287](https://github.com/continew-org/continew-admin/commit/fa232874aa88ab14fdc669e54a907e5ef05d2a7e)) ([8dbec9d](https://github.com/continew-org/continew-admin/commit/8dbec9d1a3bcb0f6d7ef4bbfb9715effd61b2025)) ([3bd56d8](https://github.com/continew-org/continew-admin/commit/3bd56d8a1ee274aac6d4ea57d61f6d470de0dc9c)) ([7b741d5](https://github.com/continew-org/continew-admin/commit/7b741d5f8c42d154c5b325326d0cc954fb566502))
+  - Spring Boot 2.7.16 => 3.0.5 => 3.1.5
+    - javax.* => jakarta.*
+    - ServletUtil => JakartaServletUtil(Hutool)
+    - 其他配置变更
+  - JDK 8 => JDK 17
+  - Sa-Token 1.36.0 => 1.37.0(适配 Spring Boot 3.x)
+  - MyBatis Plus 3.5.3.2 => 3.5.4(适配 Spring Boot 3.x)
+  - Dynamic Datasource 3.6.1 => 4.2.0(适配 Spring Boot 3.x)
+  - Redisson 3.20.1 => 3.24.3(适配 Spring Boot 3.x)
+  - Knife4j 适配 Spring Boot 3.x
+  - ip2region 2.7.15 => 3.1.5.1(适配 Spring Boot 3.x)
+  - spotless 2.30.0 => 2.40.0
+
+## [v1.3.1](https://github.com/continew-org/continew-admin/compare/v1.3.0...v1.3.1) (2023-11-15)
+
+### 💎 功能优化
+
+- 完善 Redis 部署配置 ([39969eb](https://github.com/continew-org/continew-admin/commit/39969ebf6173fc379dc3501e9204a344d1cf62cf))
+- 优化 401 状态处理逻辑 ([8820c1d](https://github.com/continew-org/continew-admin/commit/8820c1dfc858b9ef9df470e90dfe9ba4b1166e29))
+- 优化超时登录处理逻辑 ([712eedb](https://github.com/continew-org/continew-admin/commit/712eedba1be0ec371119745d4596cd35c2ce25d6))
+- 优化部分变量命名 ([f15494d](https://github.com/continew-org/continew-admin/commit/f15494d34823ded87efc396d98e2eb0108f74a3d))
+
+### 🐛 问题修复
+
+- sms4j 3.0.3 => 3.0.4 ([3fcdb54](https://github.com/continew-org/continew-admin/commit/3fcdb54442b380e76838478fa46e8dfb70a2759b))
+- 发送消息增加事务处理 ([5d159c6](https://github.com/continew-org/continew-admin/commit/5d159c6ab337a9432419d84cf246cff506500567))
+- 修复仪表盘访问趋势区块 y 轴数值过大时无法展示的问题 ([47a5746](https://github.com/continew-org/continew-admin/commit/47a5746794e552faf9c41fbcc21af091a878eb95))
+- 修复控制台报错 Please use theme before using plugins ([47a8160](https://github.com/continew-org/continew-admin/commit/47a8160d70862a5ee7284c165004cece2714a10f))
+- 修复 Swagger 分组接口缺失 ([b63d7d7](https://github.com/continew-org/continew-admin/commit/b63d7d725da5e9e9b2db9fd59bd140d64b50040c))
+
+## [v1.3.0](https://github.com/continew-org/continew-admin/compare/v1.2.0...v1.3.0) (2023-11-04)
+
+### ✨ 新特性
+
+* 消息管理:提供消息查看、标记已读、全部已读、删除等功能(适配对接导航栏站内信功能)
+* 新增头像上传前裁剪功能 ([Gitee#5](https://gitee.com/continew/continew-admin/pulls/5)) ([cbc652d](https://gitee.com/continew/continew-admin/commit/cbc652de77200d29bcd42bb399c86c2e7df29c4d)) ([28f4791](https://gitee.com/continew/continew-admin/commit/28f4791833060469d132c4383665e81458f9c852))
+* 支持手机号登录(演示环境不开放) ([4d70bc8](https://github.com/continew-org/continew-admin/commit/4d70bc84db47c36c13d8e41e3a33e5a589483de8))
+* 支持邮箱登录 ([17b169e](https://github.com/continew-org/continew-admin/commit/17b169eb0ea2ded759b6bccb213c78bfb3425941))
+* 个人中心-安全设置,支持绑定、解绑三方账号 ([efe4557](https://github.com/continew-org/continew-admin/commit/efe455736c158e73bf0c6514c31bec5d83fe843b))
+* 支持第三方账号登录 ([05cb609](https://github.com/continew-org/continew-admin/commit/05cb60978017edbd14f1c7af83053f8a91800b5c))
+
+### 💎 功能优化
+
+- 新增接口文档菜单,演示环境开放接口文档 ([4a42336](https://github.com/continew-org/continew-admin/commit/4a4233647f2ea212b007f591aafc50380b15c099))
+- 项目配置增加是否为生产环境配置项 ([38deb95](https://github.com/continew-org/continew-admin/commit/38deb950ac7b2ed81f0e10816e943156aa076795))
+- 优化校验相关方法命名 ([f25de2d](https://github.com/continew-org/continew-admin/commit/f25de2d7f835a3fa75d59d3de0a014c37b3b32e1))
+- 新增全局响应结果处理器 ([Gitee#3](https://gitee.com/continew/continew-admin/pulls/3)) ([992a8fc](https://gitee.com/continew/continew-admin/commit/992a8fca173ea76722b388aca462cff8a1128803)) ([Gitee#4](https://gitee.com/continew/continew-admin/pulls/4)) ([a0b1afc](https://gitee.com/continew/continew-admin/commit/a0b1afc546657766cb6031794b98ccc2b6e4cb2d))
+- 优化部分代码格式及注释 ([3a176ac](https://github.com/continew-org/continew-admin/commit/3a176ac5efbda4aea1e883b29e68861bd352d642))
+- 重构登录页面 UI 以适配多维度认证、第三方登录等场景 ([d40d5b4](https://github.com/continew-org/continew-admin/commit/d40d5b4ae61d858fbee3ffa0606ebebb4282d9a2)) ([a5a4cd4](https://github.com/continew-org/continew-admin/commit/a5a4cd49646db3fa1108a8b917ef70c7757e81ad))
+- 升级前端依赖 ([698a725](https://github.com/continew-org/continew-admin/commit/698a7251b742e6b679694f21bfc174904dca8990))
+  - Arco Design Vue 2.51.0 => 2.52.0
+  - vue-i18n 9.2.2 => 9.5.0
+  - dayjs 1.11.9 => 1.11.10
+
+- 升级后端依赖 ([698a725](https://github.com/continew-org/continew-admin/commit/698a7251b742e6b679694f21bfc174904dca8990))
+  - Spring Boot 2.7.15 => 2.7.16
+  - Sa-Token 1.35.0.RC => 1.36.0
+  - Hutool 5.8.20 => 5.8.22
+
+
+### 🐛 问题修复
+
+- 开放前端项目IP访问 ([22a291d](https://github.com/continew-org/continew-admin/commit/22a291d4cf48e33dc2415e44b5d991b46451e7eb))
+- 修复获取验证码倒计时显示 ([2f2905e](https://github.com/continew-org/continew-admin/commit/2f2905efdc0baec2f2c38f686f72306394801ebf))
+- 用户邮箱信息增加脱敏处理 ([5bb35a1](https://github.com/continew-org/continew-admin/commit/5bb35a13d6b5801317a295eacc67d88b2c3e1682))
+- 修复重载校验方法定义及使用错误 ([a1ccc42](https://github.com/continew-org/continew-admin/commit/a1ccc421c440e5fef54e5d22b9bed26d2b16dda5))
+- 修复个人中心密码设置状态显示错误的问题 ([b04a228](https://github.com/continew-org/continew-admin/commit/b04a228a1a5bc0a575dd9e29e515285708b8ca85))
+- 修复登录后访问首页却跳转到登录页面的问题 ([Fixes #23](https://github.com/continew-org/continew-admin/issues/23)) ([7cf5e00](https://github.com/continew-org/continew-admin/commit/7cf5e0018c87720303f731317b5eb3cb7d127327))
+- 修复字典名称表单校验 ([#22](https://github.com/continew-org/continew-admin/pull/22)) ([c0ee2ea](https://github.com/continew-org/continew-admin/commit/c0ee2eac026d2d5a950a41b6f0a475b95b71d47a))
+
+### 💥 破坏性变更
+
+- 调整后端请求、响应参数模型命名风格 ([87f9056](https://github.com/continew-org/continew-admin/commit/87f90567dbd99f873aea1b85510c7b9939a2abb8))
+- 枚举接口 BaseEnum => IBaseEnum ([f5e8b09](https://github.com/continew-org/continew-admin/commit/f5e8b0943c6076c476b7d78bb623707740fb452f))
+- 优化前端登录模块 API 路径 ([43590bf](https://github.com/continew-org/continew-admin/commit/43590bf66e7e4873a85bdd416bd38b269f3af80e))
+- 优化后端部分参数模型命名 ([51f5528](https://github.com/continew-org/continew-admin/commit/51f552892ccb11ed594bf908069a1fd426324b69))
+- 优化个人中心路由地址 ([36d52d3](https://github.com/continew-org/continew-admin/commit/36d52d3e1522cd221cf3f03d76efd3e0eaf1b18f))
+- 还原前端 loginStore 命名,重命名为 userStore ([8d39493](https://github.com/continew-org/continew-admin/commit/8d394937cfc8418799215bd3659d26bed1f834c5))
+
+## [v1.2.0](https://github.com/continew-org/continew-admin/compare/v1.1.2...v1.2.0) (2023-09-24)
+
+### ✨ 新特性
+
+* 字典管理:提供对系统公用数据字典的维护,例如:公告类型,支持字典标签背景色和排序等配置
+* 系统配置:提供修改系统标题、Logo、favicon 等基础配置功能,以方便用户系统与其自身品牌形象保持一致
+* 完善仪表盘最近访问区块内容 ([36fda57](https://github.com/continew-org/continew-admin/commit/36fda57d499b0c3fb092a13f269bc9ffb7a26a9e))
+* 完善仪表盘访问趋势区块内容 ([a1c20af](https://github.com/continew-org/continew-admin/commit/a1c20afb1b9eb447f62bfd2e4f2996dfdf37c8ca)) ([1722133](https://github.com/continew-org/continew-admin/commit/1722133ac4872b40d6d47f65f359dea8a354b91a))
+* 完善仪表盘访客地域分布区块内容 ([dc1691f](https://github.com/continew-org/continew-admin/commit/dc1691f0195ef6c96aee36f50fc7e86cfcf651b9))
+* 完善仪表盘热门模块区块内容 ([83b2e2a](https://github.com/continew-org/continew-admin/commit/83b2e2a7c02d38c7041497e0ac5b3b0e78abac29))
+* 完善仪表盘总计区块内容 ([3440aa4](https://github.com/continew-org/continew-admin/commit/3440aa4faa23e267735f564476d8bccaf8c0208f))
+* 完善仪表盘快捷操作区块内容 ([0178fbb](https://github.com/continew-org/continew-admin/commit/0178fbb89a0e75729aa60443a812496bd5b19cb8))
+
+### 💎 功能优化
+
+- 前端表单重置优化 ([e947312](https://github.com/continew-org/continew-admin/commit/e947312f244d6af01f18b542ff7395440c68b089))
+- 优化登录和菜单加载相关提示 ([d080120](https://github.com/continew-org/continew-admin/commit/d080120d4228e77200d8f152397b0ebee413b089))
+- 完善前后端校验 ([90d825a](https://github.com/continew-org/continew-admin/commit/90d825a02fdc54e8685508a6fe4fb2d5f20e77f4)) ([8e506dc](https://github.com/continew-org/continew-admin/commit/8e506dc6e69529627a0aace6118f7310cc2f030a))
+- 优化枚举字典处理,增加颜色类型 ([1f73aa7](https://github.com/continew-org/continew-admin/commit/1f73aa732d101c7f7a58bc678e85d597d54d9770))
+- 公告类型适配字典数据 ([3a3a5d6](https://github.com/continew-org/continew-admin/commit/3a3a5d6b712f435d77ea04301afa0bdd8703567f))
+- 优化通用查询注解多字段模糊查询 ([3758107](https://github.com/continew-org/continew-admin/commit/375810772aa8cb928fb1f6820e781cb43f869e03))
+- 合并菜单管理图标和标题列 ([36d38ae](https://github.com/continew-org/continew-admin/commit/36d38aec1602f5ac6d2afbb5c5adf4d6e455ab97))
+- 封装 Spring Boot 默认错误处理 ([b874ca0](https://github.com/continew-org/continew-admin/commit/b874ca0782eb116bdedfc08023959a977f170a94))
+- 优化分页查询登录日志列表接口实现 ([566c9a1](https://github.com/continew-org/continew-admin/commit/566c9a122453980b585bd68442bb545073504a3d))
+- 更换登录页面 banner ([6f19660](https://github.com/continew-org/continew-admin/commit/6f19660cfbc3be6e0d702e3f488e266c50622f0a))
+- 优化登录用户信息角色相关信息命名 ([be394f3](https://github.com/continew-org/continew-admin/commit/be394f3de4ea7ea692042db3556f706a3d141b51)) ([31f0abb](https://github.com/continew-org/continew-admin/commit/31f0abbae2e38d1cfa3f6221c9be0b54cf5337ad))
+- 升级前端依赖 ([c665902](https://github.com/continew-org/continew-admin/commit/c6659020f8bac7319c5c407389cd745527a8cd97))
+- 升级后端依赖 ([5049e1e](https://github.com/continew-org/continew-admin/commit/5049e1e312ab500e284abccbbee4186db2710d01)) ([d20aadf](https://github.com/continew-org/continew-admin/commit/d20aadfc93b54339d19d173fce364310e90b016d)) ([32904b5](https://github.com/continew-org/continew-admin/commit/32904b54ef63536ef5c5106adc00a7376b907632))
+
+### 🐛 问题修复
+
+- 修复删除列表数据后 Select 选择框重置问题 ([#21](https://github.com/continew-org/continew-admin/pull/21)) ([3288f2d](https://github.com/continew-org/continew-admin/commit/3288f2d38dfebc1381842d67cdfb17675c786859))
+- 修复前端部分拼写错误 ([62021f8](https://github.com/continew-org/continew-admin/commit/62021f8fdc171ad04d07c25c5a9357a64cc4a087))
+
+### 💥 破坏性变更
+
+- 优化系统内置类型数据标识 ([8a02401](https://github.com/continew-org/continew-admin/commit/8a02401a24b546f2a6aab04cf05371ecb4236ca0))
+- 分离 HTTP 状态码和业务状态码 ([b3b6446](https://github.com/continew-org/continew-admin/commit/b3b6446433972422cf62dfc47c031134b91cd7ec))
+- 调整生产环境本地存储、日志位置 ([2254e55](https://github.com/continew-org/continew-admin/commit/2254e555af9cade4897d5335b252a0312d6805eb))
+- 调整项目打包结构,分离依赖、配置文件 ([e679abf](https://github.com/continew-org/continew-admin/commit/e679abfccc6c80198512958b6d07b363074d9d76))
+
+## [v1.1.2](https://github.com/continew-org/continew-admin/compare/v1.1.1...v1.1.2) (2023-09-24)
+
+### 💎 功能优化
+
+- 优化后端程序启动成功输出内容 ([6322859](https://github.com/continew-org/continew-admin/commit/63228598d9fcd6e5d00172c12418a371d4c96766))
+- 配置子级菜单图标 ([5544836](https://github.com/continew-org/continew-admin/commit/55448364a39085debb776463f5e95a15b186c447))
+
+### 🐛 问题修复
+
+- 修复生产环境和开发环境样式不一致的问题 ([be8732d](https://github.com/continew-org/continew-admin/commit/be8732d812e021631864b0ff6225b4da24cafcee))
+- 排除路径配置放开 /error ([0428fe7](https://github.com/continew-org/continew-admin/commit/0428fe776224afb64601901cef4d3100e5d30bd6))
+- 修复初始数据缺失字段列表的问题 ([d5138e1](https://github.com/continew-org/continew-admin/commit/d5138e1e43bdc8b347e061890131ac2646b2dd3c))
+- 修复系统日志表索引缺失导致查询耗时较长的问题 ([ac43833](https://github.com/continew-org/continew-admin/commit/ac438337219f5a160d49b255805774da36ab865c))
+- 修复部分菜单数据 component 信息配置错误 ([11ea072](https://github.com/continew-org/continew-admin/commit/11ea072d600f24fe97fe8145208e821712b84839))
+- 修复图标 SVG 内容格式错误 ([20f1e8a](https://github.com/continew-org/continew-admin/commit/20f1e8aecc737b28ab869d363957513d868b4ab7))
+
+## [v1.1.1](https://github.com/continew-org/continew-admin/compare/v1.1.0...v1.1.1) (2023-09-06)
+
+### 💎 功能优化
+
+- 调整 Mock 响应时长,以解决前端偶发需重复登录问题 ([df19c5d](https://github.com/continew-org/continew-admin/commit/df19c5d2197fabb61cbdd4dccf1c427fb23d77d4))
+
+### 🐛 问题修复
+
+- 还原登录 Helper 优化(导致重大登录问题及查询在线用户错误) ([#15](https://github.com/continew-org/continew-admin/pull/15)) ([7a6db2d](https://github.com/continew-org/continew-admin/commit/7a6db2d14e60a5fcc1a2786e6eaa3d46a0714e6c)) ([#9](https://github.com/continew-org/continew-admin/pull/9)) ([9e2a5ef](https://github.com/continew-org/continew-admin/commit/9e2a5ef1249fd93dd10f2c255bf77c3eaa64a241))
+- 修复刷新页面后,选中菜单无法保持展开状态的问题 ([3fc7adb](https://github.com/continew-org/continew-admin/commit/3fc7adb1e2bd4b648753bd2999df725417e01680))
+- 修复侧边栏菜单无法显示自定义图标的问题 ([10ca5d8](https://github.com/continew-org/continew-admin/commit/10ca5d8c76aa39a207ea7db4442bf63ff4578273))
+- 更正 README 文档项目结构部分内容 ([486da2f](https://github.com/continew-org/continew-admin/commit/486da2f79bfc5379213bf666b8f325fb8096ebc6))
+- 修复公告缺失待发布状态的问题 ([#14](https://github.com/continew-org/continew-admin/pull/14)) ([46cc4c9](https://github.com/continew-org/continew-admin/commit/46cc4c9307e3cc7060ae436f59f007831104884a))
+
+## [v1.1.0](https://github.com/continew-org/continew-admin/compare/v1.0.1...v1.1.0) (2023-09-01)
+
+### ✨ 新特性
+
+* 公告管理:提供公告的发布、查看和删除等功能。管理员可以在后台发布公告,并可以设置公告的生效时间、终止时间,以 markdown-it 为内核渲染 Markdown 格式内容显示
+* 代码生成:提供根据数据库表自动生成相应的前后端 CRUD 代码的功能
+* 允许表格调整列宽,不允许新增/修改类表单对话框按 Esc 关闭 ([1b06a96](https://github.com/continew-org/continew-admin/commit/1b06a96cfbe5774931d8c4c0d7827703caa096df))
+
+### 💎 功能优化
+
+- 最终适配及启用 Arco Design Pro Vue 动态路由 ([9baf341](https://github.com/continew-org/continew-admin/commit/9baf3410138cb8a152ec51f70340d500fa009510))
+- 优化分页总记录数数据类型 ([bfea689](https://github.com/continew-org/continew-admin/commit/bfea689b0eaf44c8d54b4fd59c042d72ac71e395))
+- 修复在线用户列表等自定义分页查询 NPE 的问题 ([015ff55](https://github.com/continew-org/continew-admin/commit/015ff5512b3662efce88d02ab1dda6d55501a501))
+- 对获取路由信息接口增加缓存处理 ([4639d13](https://github.com/continew-org/continew-admin/commit/4639d13ba61abfaed3c9d3da0e057892577b5c40))⚡
+- 完善前端 axios 请求响应拦截器 ([bb398d8](https://github.com/continew-org/continew-admin/commit/bb398d8101e3780f450c6508852fc727fb936cee)) ([e18692f](https://github.com/continew-org/continew-admin/commit/e18692fa74e0a0d9558db6643b945c6c6a00db36))
+- 优化仪表盘公告区块、帮助文档区块内容 ([b59a819](https://github.com/continew-org/continew-admin/commit/b59a819ad5f2bdbd357951f070d155e91f2d7903)) ([315c059](https://github.com/continew-org/continew-admin/commit/315c059713833be10b0cf05d302259a3146f3707)) ([6d024a9](https://github.com/continew-org/continew-admin/commit/6d024a90d7a231439c8e260b9bd625e8b5027515))
+- 将 Swagger 文档中的额外请求参数隐藏 ([#11](https://github.com/continew-org/continew-admin/pull/11)) ([a9ed02b](https://github.com/continew-org/continew-admin/commit/a9ed02bf4ff6a8a4d9f68db2d62d29000c543943))
+- 优化前端 CRUD 相关命名 ([6d81928](https://github.com/continew-org/continew-admin/commit/6d81928541f4da568e9c7138f91d4dc1c5c6dd4e))
+- 优化部分超链接标签属性 ([46a75d0](https://github.com/continew-org/continew-admin/commit/46a75d029798e8d5a162b53b8a61c8e3c3f4dd9e))
+- 使用属性变量消除配置文件中分散的 ContiNew Admin 品牌元素 ([54ea410](https://github.com/continew-org/continew-admin/commit/54ea41048abd096cf1e2c32ee871c1eb85d4ece1))
+- 拆分 Swagger 接口文档分组 ([#10](https://github.com/continew-org/continew-admin/pull/10)) ([72df45e](https://github.com/continew-org/continew-admin/commit/72df45e9b3373d28f1845af16a81cb8bd8408647))
+- 优化登录 Helper ([#9](https://github.com/continew-org/continew-admin/pull/9)) ([9e2a5ef](https://github.com/continew-org/continew-admin/commit/9e2a5ef1249fd93dd10f2c255bf77c3eaa64a241))
+- 将全局异常处理器未知异常的异常类型从 Exception 调整为 Throwable ([90e1c64](https://github.com/continew-org/continew-admin/commit/90e1c64db684df97454e4753932b7f4017d8e23d))
+- 优化 == 及 != 表达式格式 ([487fa82](https://github.com/continew-org/continew-admin/commit/487fa82306fbd84033f6c39ad20b72755b03e875))
+- 集成 Spring Cache,优化查询用户昵称性能 ([b23b00d](https://github.com/continew-org/continew-admin/commit/b23b00d02a4738a61b4a13676fab6d2c9ec927de)) ([76622c2](https://github.com/continew-org/continew-admin/commit/76622c238f1d6028826407490e50a14bdba25ade))⚡
+- 将验证码唯一标识格式从无符号 UUID 调整为带符号 UUID ([a61196c](https://github.com/continew-org/continew-admin/commit/a61196cd62cea4f684154bb42a949656650f626b))
+- 完善接口文档示例信息 ([#7](https://github.com/continew-org/continew-admin/pull/7)) ([ad7d699](https://github.com/continew-org/continew-admin/commit/ad7d6995ba40a0cb70a194693fa450bdbb3cc7a0)) ([#8](https://github.com/continew-org/continew-admin/pull/8)) ([0ac0213](https://github.com/continew-org/continew-admin/commit/0ac0213628023c04b5be531522d76f09712f7317)) ([190385e](https://github.com/continew-org/continew-admin/commit/190385ed3636206224bc90780fcede2e49f9c118)) ([332bd6c](https://github.com/continew-org/continew-admin/commit/332bd6cd2a9b4e25678a3eec565965c5b2702aa2))
+- 使用 DatePattern 中的日期格式常量替代字符串常量中的日期格式 ([241a9cf](https://github.com/continew-org/continew-admin/commit/241a9cf85b3c19eb093d4d661c35d71c490adf1f))
+- 优化分组校验 ([78a5d5e](https://github.com/continew-org/continew-admin/commit/78a5d5ec7a14ee37d92a9520211adca23f12b287))
+- 优化 springdoc-openapi 对象型参数处理 ([ae8d294](https://github.com/continew-org/continew-admin/commit/ae8d294705536e99d6c30a9ff5257fdb3ee5b35f))
+- 升级前端依赖,并更换包管理器 yarn => pnpm ([6164110](https://github.com/continew-org/continew-admin/commit/6164110462cc3aff66d79539f54e84d47c6d5894))
+- 升级后端依赖 ([51a82d8](https://github.com/continew-org/continew-admin/commit/51a82d8f4eabd6aa27e1a991f05f516171b6ae03))
+
+### 🐛 问题修复
+
+- 完善部分数据库表的唯一索引 ([88d6118](https://github.com/continew-org/continew-admin/commit/88d6118693586fbd8da573df3b2f942d049e4b3c))
+- 修复访问 doc.html 接口文档,控制台报 No mapping for GET /favicon.ico 警告的问题 ([94f88ba](https://github.com/continew-org/continew-admin/commit/94f88bad2278d64a4b8a3bc930a9f754fb00cba6))
+- 登录页面输入错误时,自动清空验证码输入框 ([a76f47f](https://github.com/continew-org/continew-admin/commit/a76f47fbd86bfa7fbf85440c653ae6259fce7969))
+
+### 💥 破坏性变更
+
+- 更新信息调整为仅在更新数据时自动填充 ([df77e57](https://github.com/continew-org/continew-admin/commit/df77e574cca605afd89f1b3781f1cde699bcb7e6))
+- 将时间戳单位从毫秒调整为秒 ([fa916b9](https://github.com/continew-org/continew-admin/commit/fa916b93247e10462eb44185ad45cdca4dedda7d))
+- 移除所有的 @Accessors(chain = true),并全局配置禁止使用 ([76c6546](https://github.com/continew-org/continew-admin/commit/76c65463c2e5ddf0c90fa1622fd86706a4373c80))
+
+## [v1.0.1](https://github.com/continew-org/continew-admin/compare/v1.0.0...v1.0.1) (2023-08-17)
+
+### 💎 功能优化
+
+- 优化根据 ID 查询用户昵称方法 ([4a8af1f](https://github.com/continew-org/continew-admin/commit/4a8af1f72d9249afa1c013e08674f492f453b020))
+- 优化 BaseController 中部分权限码的使用 ([b0b1127](https://github.com/continew-org/continew-admin/commit/b0b1127b5bd39e9bc431e9fa9c86201bbc18e891))
+- 优化分页总记录数数据类型 ([76f04dd](https://github.com/continew-org/continew-admin/commit/76f04dd38f90aad6abf82d2dccba031d4d9108cf))
+- 优化通用查询注解解析器 ([a623acd](https://github.com/continew-org/continew-admin/commit/a623acd4a5529ae42898ec359f595716acc5bab8)) ([b632c18](https://github.com/continew-org/continew-admin/commit/b632c183994ac71382180a38bf7bdb7a6315c1e6))
+- 优化数据库表结构中部分类型长度 ([f3fabea](https://github.com/continew-org/continew-admin/commit/f3fabea7dd736d94badecbc08091eec6274f5fb7))
+- 使用常量优化部分魔法值 ([e6f7429](https://github.com/continew-org/continew-admin/commit/e6f7429fa30cbc87c03a073a53b6f7df24d33d8d))
+- 优化部分 Properties 用法 ([48de2e8](https://github.com/continew-org/continew-admin/commit/48de2e85e0fbf60f10769cd3529f79ac3c531e92))
+
+### 🐛 问题修复
+
+- 修复获取字典参数为空时的判断条件 ([#6](https://github.com/continew-org/continew-admin/pull/6)) ([104f69e](https://github.com/continew-org/continew-admin/commit/104f69e8a09ce36163f6f9680b2d8d61bb45f11a))
+- 完善查询用户数据权限 ([026247f](https://github.com/continew-org/continew-admin/commit/026247f677110ae199124a67c68503729cbaec92))
+- 解决 IDE 报 Delete ␍ eslint(prettier/prettier) 警告的问题 ([8743ed1](https://github.com/continew-org/continew-admin/commit/8743ed14d927ab52814ed5f5f166afaa7a6b78b2))
+- 修复分页查询条件默认值未生效的问题 ([2d2a7e7](https://github.com/continew-org/continew-admin/commit/2d2a7e7c8e31763ac3ea514d8a92c3938376dd3a))
+- 完善各模块事务注解 ([18c54a7](https://github.com/continew-org/continew-admin/commit/18c54a74fc6ff0650ff53eeadc094d7e1df0b0a5))
+- 修复邮箱健康检查报错问题并优化部分配置写法 ([5968f40](https://github.com/continew-org/continew-admin/commit/5968f402ed478244d36f5825373190ed00d8c1f1))
+- 完善各模块参数校验 ([8b955a0](https://github.com/continew-org/continew-admin/commit/8b955a0b1bde4e8959fc0dfbc11a326d9eec0b45))
+
+## v1.0.0 (2023-03-26)
+
+### ✨ 新特性
+
+* 用户管理:提供用户的相关配置,新增用户后,默认密码为 123456
+* 角色管理:对权限与菜单进行分配,可根据部门设置角色的数据权限
+* 部门管理:可配置系统组织架构,树形表格展示
+* 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单
+* 在线用户:管理当前登录用户,可一键踢下线
+* 日志管理:提供在线用户监控、登录日志监控、操作日志监控和系统日志监控等监控功能

+ 202 - 0
LICENSE

@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 512 - 0
README.md

@@ -0,0 +1,512 @@
+# ContiNew Admin 中后台管理框架
+
+<a href="https://github.com/continew-org/continew-admin/blob/dev/LICENSE" target="_blank">
+<img src="https://img.shields.io/badge/License-Apache--2.0-blue.svg" alt="License" />
+</a>
+<a href="https://github.com/continew-org/continew-admin" target="_blank">
+<img src="https://img.shields.io/badge/RELEASE-v3.4.0-%23ff3f59.svg" alt="Release" />
+</a>
+<a href="https://app.codacy.com/gh/continew-org/continew-admin/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade" target="_blank">
+<img src="https://app.codacy.com/project/badge/Grade/19e3e2395d554efe902c3822e65db30e" alt="Codacy Badge" />
+</a>
+<a href="https://sonarcloud.io/summary/new_code?id=Charles7c_continew-admin" target="_blank">
+<img src="https://sonarcloud.io/api/project_badges/measure?project=Charles7c_continew-admin&metric=alert_status" alt="Sonar Status" />
+</a>
+<a href="https://github.com/continew-org/continew-starter" target="_blank">
+<img src="https://img.shields.io/badge/ContiNew Starter-2.7.5-%236CB52D.svg" alt="ContiNew Starter" />
+</a>
+<a href="https://spring.io/projects/spring-boot" target="_blank">
+<img src="https://img.shields.io/badge/Spring Boot-3.2.10-%236CB52D.svg?logo=Spring-Boot" alt="Spring Boot" />
+</a>
+<a href="https://github.com/continew-org/continew-starter" target="_blank">
+<img src="https://img.shields.io/badge/Open JDK-17-%236CB52D.svg?logo=OpenJDK&logoColor=FFF" alt="Open JDK" />
+</a>
+<a href="https://github.com/continew-org/continew-admin" target="_blank">
+<img src="https://img.shields.io/github/stars/continew-org/continew-admin?style=social" alt="GitHub stars" />
+</a>
+<a href="https://github.com/continew-org/continew-admin" target="_blank">
+<img src="https://img.shields.io/github/forks/continew-org/continew-admin?style=social" alt="GitHub forks" />
+</a>
+<a href="https://gitee.com/continew/continew-admin" target="_blank">
+<img src="https://gitee.com/continew/continew-admin/badge/star.svg?theme=white" alt="Gitee stars" />
+</a>
+<a href="https://gitee.com/continew/continew-admin" target="_blank">
+<img src="https://gitee.com/continew/continew-admin/badge/fork.svg?theme=white" alt="Gitee forks" />
+</a>
+
+📚 [在线文档](https://continew.top) | 🚀 [演示地址](https://admin.continew.top)(账号/密码:admin/admin123)
+
+## 简介
+
+ContiNew Admin(Continue New Admin)持续迭代优化的前后端分离中后台管理系统框架。开箱即用,重视每一处代码规范,重视每一种解决方案细节,持续提供舒适的前、后端开发体验。
+
+当前采用的技术栈:Spring Boot3(Java17)、Vue3 & Arco Design & TS & Vite、Sa-Token、MyBatis Plus、Redisson、JetCache、JustAuth、Crane4j、EasyExcel、Liquibase、Hutool 等。
+
+## 项目源码
+
+|         | 后端                                                         | 前端                                                         |
+| :------ | :----------------------------------------------------------- | :----------------------------------------------------------- |
+| Gitee   | [continew/continew-admin](https://gitee.com/continew/continew-admin) | [continew/continew-admin-ui](https://gitee.com/continew/continew-admin-ui) |
+| GitCode | [continew/continew-admin](https://gitcode.com/continew/continew-admin) | [continew/continew-admin-ui](https://gitcode.com/continew/continew-admin-ui) |
+| GitHub  | [continew-org/continew-admin](https://github.com/continew-org/continew-admin) | [continew-org/continew-admin-ui](https://github.com/continew-org/continew-admin-ui) |
+
+## 项目起源
+
+我热衷于做数据归档,归档后的数据可以提高学习/工作效率,为记忆“减负”,在持续的数据归档中,优质的“沉淀”会带来非匀速、跨越式的学习/工作体验。**数据归档是一件需要持续去做的事情**。
+
+从接触程序代码的第一天,我的程序数据归档也随之开始了,刷过的算法题、笔记、对接各种组件的配置文件,甚至于一些亮眼的样式设计、“如诗”的代码片段。这些数据的沉淀丰富了我的解决方案,提高了我的编程效率,逐渐为各种场景落实成了一个个雏形程序。再后来,我意识到,我归档的这些雏形程序,有一个更为妥贴的名称:**程序框架/脚手架**。
+
+技术的发展,导致这些雏形程序的生命周期很是短暂,它们有别于我归档的其他数据,有时由于工作的原因,没有时间很好的去沉淀它们,在使用时变得越来越不顺手。所以,某段时间,我放弃了维护,而是去采用一些更为成熟的框架。
+
+不过,在陆续几年使用了一些成熟框架后,我前后遇到了一些困难:
+
+1. 代码洁癖想要找到一个**扩展性佳,代码规范良好,开发体验舒适**的框架很不容易,总是差些什么
+2. 项目上手困难或是基础版功能不全,需要的全在专业版,亦或者代码阅读性差,文档收费
+3. 部分解决方案缺失,已有解决方案也过于偏向样板化,无法形成良好的逻辑闭环
+4. 好不容易找到一些相较合适的,没过多久,部分作者可能暂时没法对外发“电”了,随着了解深入,很多 Bug 或新技术趋势还是需要自己研究解决
+
+在工作中,很多想法/设计受限于客户需求、开发工期,必须优先以交付为导向,但一些优秀的实践需要花时间持续进行沉淀,只要我没跳出这个圈子,我还是需要一直去做好程序归档。“种一棵树最好的时间是十年前,其次是现在”,最终,我选择在业余时间更加正视这件事,从头归档沉淀,从添加每一个依赖开始,我希望它能持续的迭代优化、演进,所以我把它命名为 **ContiNew(Continue New)**。并且这次我选择了开源,我希望它不仅仅能吸收我的需求和沉淀,而是依托开源协作模式,及时发现更多的问题,接受更多的可能性,沉淀更优秀的思考,设计。
+
+## 为什么选我们?
+
+> [!TIP]
+> 更为完整的图文描述请查阅[《在线文档》](https://continew.top/admin/intro/why.html)。
+
+1.**甄选技术栈:** ContiNew(Continue New) 项目致力于持续迭代优化,让技术不掉队。在技术选型时,进行深度广泛地调研,从流行度、成熟度和发展潜力等多方面甄选技术栈。
+
+2.**Starter 组件:** 从 v2.1.0 版本开始,抽取并封装后端基础组件及各框架集成配置到 ContiNew Starter 项目,且 **[已发布至 Maven 中央仓库](https://central.sonatype.com/search?q=continew-starter&namespace=top.continew)**,可在你的任意项目中直接引入所需依赖使用。即使你不用脚手架项目,难道能让你搭项目框架更快、更爽、更省力的 Starter 也要 Say No 吗?
+
+3.**CRUD 套件:** 封装通用增删改查套件,适配后端各分层,几分钟即可提供一套 CRUD API,包括新增、修改、批量删除、查询详情、分页列表查询、全部列表查询、树型列表查询、导出到 Excel,且 API 支持按实际所需开放或扩展。
+
+```java
+@Tag(name = "部门管理 API")
+@RestController
+@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
+public class DeptController extends BaseController<DeptService, DeptResp, DeptDetailResp, DeptQuery, DeptReq> {}
+```
+
+4.**代码生成器:** 提供代码生成器,已配套前、后端代码生成模板,数据表设计完之后,简单配置一下即可生成前、后端 80% 的代码,包含 CRUD API、权限控制、参数校验、接口文档等内容。如果业务不复杂,也可能就是 95% 的代码。
+
+5.**改善开发体验:** 持续优化及适配能改善开发体验的组件。
+
+- 适配 ContiNew Starter 各组件,针对 Spring 基础配置、通用解决方案以及流行框架进行了深度封装的 starter 集合,改善你在开发每个 Spring Boot Web 项目的体验。(枚举参数处理、默认线程池、跨域、加密、脱敏、限流、日志、异常及响应通用解决方案等等,更多细节可查看 Starter 源码)
+- 适配 Crane4j 数据填充组件,减少因为一个用户名而产生的联表回填;
+- 适配 P6Spy SQL 性能分析组件,开发期间方便监控 SQL 执行;
+- 适配 TLog 链路追踪组件,方便在杂乱的日志文件中追踪你某次请求的日志记录;
+- 适配 JetCache 缓存框架(比 Spring Cache 更强大易用),通过注解声明即可快速实现方法级缓存,极大改善编码式缓存体验,且支持灵活的二级缓存配置、分布式自动刷新等能力;
+- 前端适配 Vue Devtools(Vue 官方提供的调试浏览器插件),极大提高 Vue 开发及调试效率
+
+6.**Almost最佳后端规范:** 后端严格遵循阿里巴巴 Java 编码规范,注释覆盖率 > 45%,接口参数示例 100%,代码分层使用体验佳,变量、方法命名清晰统一,前端代码也使用严格的 ESLint、StyleLint 等检查。良好的设计,代码复用率极高!写代码时,让你有一种无需多写,理应如此的感觉。我是代码洁癖,我实际写的时候很清楚这到底是不是乱吹。
+
+7.**卓越工程:** 后端采用模块化工程结构,并适配了统一项目版本号、编译项目自动代码格式化、代码混淆等插件,提供了自定义打包部署结构配置(配置文件、三方依赖和主程序分离),提供全套环境及应用的 Docker Compose 部署脚本。为了减少您开发新项目时的改造耗时,项目品牌配置持续进行深度聚合,简单的配置和结构修改即可快速开始独属于你的新项目。
+
+8.**业务脚手架:** 有颜有料,不止是说说而已,持续打磨 UI 设计与色彩主题。提供基于 RBAC 的权限控制、通用数据权限,包含丰富的通用业务功能:第三方登录,邮箱、短信(生产级炸弹漏洞处理方案),个人中心、用户管理、角色管理、部门管理、系统配置(基础站点配置、邮件配置、安全配置)、系统日志、消息中心、通知公告等,设计用心,逻辑合理闭环。
+
+> 一个好的脚手架项目,不仅仅是提供一系列组件集成与配置,也不仅仅是封装一堆好用的工具,还更应该提供一系列通用基础业务解决方案及设计,为初创团队项目减负。
+
+9.**质量与安全:** CI 已集成 Sonar、Codacy,Push 即扫描代码质量,定期扫描 CVE 漏洞,及时解决潜在问题。封装数据库字段加密、JSON 脱敏、XSS 过滤等工具,提供诸多安全解决方案。
+
+由于篇幅有限,且项目正处于高速发展期,更多功能正在陆续上线(敬请关注仓库或群内动态)。另外像最基本的统一异常、错误处理,基础线程池等配置就不在此赘述,细节优化详情请 clone 代码查看。
+> Talk is cheap, show the code.
+
+##  系统功能
+
+> [!TIP]
+> 更多功能和优化正在赶来💦,最新项目计划、进展请进群或关注 [任务清单](https://continew.top/require.html) 和 [更新日志](https://continew.top/admin/other/changelog.html)。
+
+- 仪表盘:提供工作台、分析页,工作台提供功能快捷导航入口、最新公告、动态;分析页提供全面数据可视化能力
+- 个人中心:支持基础信息修改、密码修改、邮箱绑定、手机号绑定(并提供行为验证码、短信限流等安全处理)、第三方账号绑定/解绑、头像裁剪上传
+- 消息中心:提供站内信消息统一查看、标记已读、全部已读、删除等功能(目前仅支持系统通知消息)
+- 用户管理:管理系统用户,包含新增、修改、删除、导入、导出、重置密码、分配角色等功能
+  
+- 角色管理:管理系统用户的功能权限及数据权限,包含新增、修改、删除、分配角色等功能
+  
+- 菜单管理:管理系统菜单及按钮权限,支持多级菜单,动态路由,包含新增、修改、删除等功能
+  
+- 部门管理:管理系统组织架构,包含新增、修改、删除、导出等功能,以树形列表进行展示
+  
+- 字典管理:管理系统公用数据字典,例如:消息类型。支持字典标签背景色和排序等配置
+  
+- 通知公告:管理系统公告,支持设置公告的生效时间、终止时间、通知范围(所有人、指定用户)
+  
+- 文件管理:管理系统文件,支持上传、下载、预览(目前支持图片、音视频、PDF、Word、Excel、PPT)、重命名、切换视图(列表、网格)等功能
+  
+- 存储管理:管理文件存储配置,支持本地存储、兼容 S3 协议存储
+  
+- 系统配置:
+  - 基础配置:提供修改系统标题、Logo、favicon、版权信息等基础配置功能,以方便用户系统与其自身品牌形象保持一致
+  - 邮件配置:提供系统发件箱配置,也支持通过配置文件指定
+  - 安全配置:提供密码策略修改,支持丰富的密码策略设定,包括但不限于 `密码有效期`、`密码重复次数`、`密码错误锁定账号次数、时间` 等
+  
+- 在线用户:管理当前登录用户,可一键踢除下线
+  
+- 日志管理:管理系统登录日志、操作日志,支持查看日志详情,包含请求头、响应头等报文信息
+  
+- 任务管理:管理系统定时任务,包含新增、修改、删除、执行功能,支持 Cron(可配置式生成 Cron 表达式) 和固定频率
+  
+- 任务日志:管理定时任务执行日志,包含停止、重试指定批次,查询集群各节点的详细输出日志等功能
+  
+- 应用管理:管理第三方系统应用 AK、SK,包含新增、修改、删除、查看密钥、重置密钥等功能,支持设置密钥有效期
+  
+- 代码生成:提供根据数据库表自动生成相应的前后端 CRUD 代码的功能,支持同步最新表结构及代码生成预览
+
+## 系统截图
+
+> [!TIP]
+> 受篇幅长度及功能更新频率影响,下方仅为系统 **部分** 功能于 **2024年11月18日** 进行的截图,更多新增功能及细节请登录演示环境或 clone 代码到本地启动查看。
+
+<table border="1" cellpadding="1" cellspacing="1" style="width: 500px">
+    <tbody>
+        <tr>
+            <td><img src=".image/screenshot/000登录页面.png" alt="登录页面" width="1920" /></td>
+            <td><img src=".image/screenshot/000登录页面-H5.png" alt="登录页面-H5" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/001仪表盘.png" alt="仪表盘" width="1920" /></td>
+            <td><img src=".image/screenshot/002分析页.png" alt="分析页" width="1920" /></td>
+        </tr>
+       <tr>
+            <td><img src=".image/screenshot/010个人中心.png" alt="个人中心" width="1920" /></td>
+            <td><img src=".image/screenshot/013消息中心.png" alt="消息中心" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/011安全设置-修改邮箱.png" alt="安全设置-修改邮箱" width="1920" /></td>
+            <td><img src=".image/screenshot/012安全设置-修改邮箱-邮箱验证码.png" alt="安全设置-修改邮箱-邮箱验证码" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/060系统管理-系统配置.png" alt="系统管理-系统配置" width="1920" /></td>
+            <td><img src=".image/screenshot/061系统管理-安全配置.png" alt="系统管理-安全配置" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/020系统管理-用户管理-列表.png" alt="系统管理-用户管理-列表" width="1920" /></td>
+            <td><img src=".image/screenshot/021系统管理-用户管理-新增.png" alt="系统管理-用户管理-新增" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/025系统管理-角色管理-列表.png" alt="系统管理-角色管理-列表" width="1920" /></td>
+            <td><img src=".image/screenshot/026系统管理-角色管理-新增.png" alt="系统管理-角色管理-新增" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/030系统管理-菜单管理-列表.png" alt="系统管理-菜单管理-列表" width="1920" /></td>
+            <td><img src=".image/screenshot/031系统管理-菜单管理-新增.png" alt="系统管理-菜单管理-新增" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/045系统管理-公告管理-列表.png" alt="系统管理-公告管理-列表" width="1920" /></td>
+            <td><img src=".image/screenshot/046系统管理-公告管理-修改.png" alt="系统管理-公告管理-修改" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/040系统管理-字典管理-列表.png" alt="系统管理-字典管理-列表" width="1920" /></td>
+            <td><img src=".image/screenshot/041系统管理-字典项管理.png" alt="系统管理-字典项管理" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/051系统管理-文件管理-列表-2.png" alt="系统管理-文件管理-列表-2" width="1920" /></td>
+            <td><img src=".image/screenshot/052系统管理-文件管理-查看文档.png" alt="系统管理-文件管理-查看文档" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/301系统工具-代码生成-配置.png" alt="系统工具-代码生成-配置" width="1920" /></td>
+            <td><img src=".image/screenshot/302系统工具-代码生成-预览.png" alt="系统工具-代码生成-预览" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/100系统监控-在线用户.png" alt="系统监控-在线用户" width="1920" /></td>
+            <td><img src=".image/screenshot/101系统监控-系统日志-登录日志.png" alt="系统监控-系统日志-登录日志" width="1920" /></td>
+        </tr>
+        <tr>
+            <td><img src=".image/screenshot/102系统监控-系统日志-操作日志.png" alt="系统监控-系统日志-操作日志" width="1920" /></td>
+            <td><img src=".image/screenshot/103系统监控-系统日志-操作日志-详情.png" alt="系统监控-系统日志-操作日志-详情" width="1920" /></td>
+        </tr>
+    </tbody>
+</table>
+
+
+## 核心技术栈
+
+| 名称                                                         | 版本           | 简介                                                         |
+| :----------------------------------------------------------- |:-------------| :----------------------------------------------------------- |
+| <a href="https://cn.vuejs.org/" target="_blank">Vue</a>      | 3.4.21       | 渐进式 JavaScript 框架,易学易用,性能出色,适用场景丰富的 Web 前端框架。 |
+| <a href="https://arco.design/vue/docs/start" target="_blank">Arco Design</a> | 2.56.0       | 字节跳动推出的前端 UI 框架,年轻化的色彩和组件设计。         |
+| <a href="https://www.typescriptlang.org/zh/" target="_blank">TypeScript</a> | 5.0.4        | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 |
+| <a href="https://cn.vitejs.dev/" target="_blank">Vite</a>    | 5.1.5        | 下一代的前端工具链,为开发提供极速响应。                     |
+| [ContiNew Starter](https://github.com/continew-org/continew-starter) | 2.7.5        | ContiNew Starter 包含了一系列经过企业实践优化的依赖包(如 MyBatis-Plus、SaToken),可轻松集成到应用中,为开发人员减少手动引入依赖及配置的麻烦,为 Spring Boot Web 项目的灵活快速构建提供支持。 |
+| <a href="https://spring.io/projects/spring-boot" target="_blank">Spring Boot</a> | 3.2.10       | 简化 Spring 应用的初始搭建和开发过程,基于“约定优于配置”的理念,使开发人员不再需要定义样板化的配置。(Spring Boot 3.0 开始,要求 Java 17 作为最低版本) |
+| <a href="https://undertow.io/" target="_blank">Undertow</a>  | 2.3.13.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 |
+| <a href="https://sa-token.dev33.cn/" target="_blank">Sa-Token + JWT</a> | 1.39.0       | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。             |
+| <a href="https://baomidou.com/" target="_blank">MyBatis Plus</a> | 3.5.8        | MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。 |
+| <a href="https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611" target="_blank">dynamic-datasource-spring-boot-starter</a> | 4.3.1        | 基于 Spring Boot 的快速集成多数据源的启动器。                |
+| Hikari                                                       | 5.0.1        | JDBC 连接池,号称 “史上最快连接池”,SpringBoot 在 2.0 之后,采用的默认数据库连接池就是 Hikari。 |
+| <a href="https://dev.mysql.com/downloads/mysql/" target="_blank">MySQL</a> | 8.0.33       | 体积小、速度快、总体拥有成本低,是最流行的关系型数据库管理系统之一。 |
+| <a href="https://dev.mysql.com/doc/connector-j/8.0/en/" target="_blank">mysql-connector-j</a> | 8.3.0        | MySQL Java 驱动。                                            |
+| <a href="https://github.com/p6spy/p6spy" target="_blank">P6Spy</a> | 3.9.1        | SQL 性能分析组件。                                           |
+| <a href="https://github.com/liquibase/liquibase" target="_blank">Liquibase</a> | 4.24.0       | 用于管理数据库版本,跟踪、管理和应用数据库变化。             |
+| [JetCache](https://github.com/alibaba/jetcache/blob/master/docs/CN/Readme.md) | 2.7.6        | 一个基于 Java 的缓存系统封装,提供统一的 API 和注解来简化缓存的使用。提供了比 SpringCache 更加强大的注解,可以原生的支持 TTL、两级缓存、分布式自动刷新,还提供了 Cache 接口用于手工缓存操作。 |
+| <a href="https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D" target="_blank">Redisson</a> | 3.36.0       | 不仅仅是一个 Redis Java 客户端,Redisson 充分的利用了 Redis 键值数据库提供的一系列优势,为使用者提供了一系列具有分布式特性的常用工具:分布式锁、限流器等。 |
+| <a href="https://redis.io/" target="_blank">Redis</a>        | 7.2.3        | 高性能的 key-value 数据库。                                  |
+| [Snail Job](https://snailjob.opensnail.com/)                 | 1.1.2        | 灵活,可靠和快速的分布式任务重试和分布式任务调度平台。       |
+| [X File Storage](https://x-file-storage.xuyanwu.cn/#/)       | 2.2.1        | 一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS...等其它兼容 S3 协议的存储平台。 |
+| <a href="https://sms4j.com/" target="_blank">SMS4J</a>       | 3.3.3        | 短信聚合框架,轻松集成多家短信服务,解决接入多个短信 SDK 的繁琐流程。 |
+| <a href="https://justauth.cn/" target="_blank">Just Auth</a> | 1.16.6       | 开箱即用的整合第三方登录的开源组件,脱离繁琐的第三方登录 SDK,让登录变得 So easy! |
+| <a href="https://easyexcel.opensource.alibaba.com/" target="_blank">Easy Excel</a> | 4.0.1        | 一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。 |
+| [AJ-Captcha](https://ajcaptcha.beliefteam.cn/captcha-doc/)   | 1.3.0        | Java 行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式。 |
+| Easy Captcha                                                 | 1.6.2        | Java 图形验证码,支持 gif、中文、算术等类型,可用于 Java Web、JavaSE 等项目。 |
+| [Crane4j](https://createsequence.gitee.io/crane4j-doc/#/)    | 2.9.0        | 一个基于注解的,用于完成一切 “根据 A 的 key 值拿到 B,再把 B 的属性映射到 A” 这类需求的字段填充框架。 |
+| [CosID](https://cosid.ahoo.me/guide/getting-started.html)    | 2.9.8        | 旨在提供通用、灵活、高性能的分布式 ID 生成器。               |
+| [Graceful Response](https://doc.feiniaojin.com/graceful-response/home.html) | 5.0.0-boot3  | 一个Spring Boot技术栈下的优雅响应处理组件,可以帮助开发者完成响应数据封装、异常处理、错误码填充等过程,提高开发效率,提高代码质量。 |
+| <a href="https://doc.xiaominfo.com/" target="_blank">Knife4j</a> | 4.5.0        | 前身是 swagger-bootstrap-ui,集 Swagger2 和 OpenAPI3 为一体的增强解决方案。 |
+| <a href="https://www.hutool.cn/" target="_blank">Hutool</a>  | 5.8.32       | 小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。 |
+| <a href="https://projectlombok.org/" target="_blank">Lombok</a> | 1.18.32      | 在 Java 开发过程中用注解的方式,简化了 JavaBean 的编写,避免了冗余和样板式代码,让编写的类更加简洁。 |
+
+## 快速开始
+
+> [!TIP]
+> 更详细的流程,请查看在线文档[《快速开始》](https://continew.top/admin/intro/quick-start.html)。
+
+```bash
+# 1.克隆本项目
+git clone https://github.com/continew-org/continew-admin.git
+
+# 2.在 IDE(IntelliJ IDEA/Eclipse)中打开本项目
+
+# 3.修改配置文件中的数据源配置信息、Redis 配置信息、邮件配置信息等
+# [3.也可以在 IntelliJ IDEA 中直接配置程序启动环境变量(DB_HOST、DB_PORT、DB_USER、DB_PWD、DB_NAME;REDIS_HOST、REDIS_PORT、REDIS_PWD、REDIS_DB)]
+
+# 4.启动程序
+# 4.1 启动成功:访问 http://localhost:8000/,页面输出:Xxx started successfully.
+# 4.2 接口文档:http://localhost:8000/doc.html
+
+# 5.部署
+# 5.1 Docker 部署
+#   5.1.1 服务器安装好 docker 及 docker-compose(参考:https://blog.charles7c.top/categories/fragments/2022/10/31/CentOS%E5%AE%89%E8%A3%85Docker)
+#   5.1.2 执行 mvn package 进行项目打包,将 target/app 目录下的所有内容放到 /docker/continew-admin 目录下
+#   5.1.3 将 docker 目录上传到服务器 / 目录下,并授权(chmod -R 777 /docker)
+#   5.1.4 修改 docker-compose.yml 中的 MySQL 配置、Redis 配置、continew-admin-server 配置、Nginx 配置
+#   5.1.5 执行 docker-compose up -d 创建并后台运行所有容器
+# 5.2 其他方式部署
+```
+
+## 项目结构
+
+> [!TIP]
+> 后端采用按功能拆分模块的开发方式,下方项目目录结构是按照模块的层次顺序进行介绍的,实际 IDE 中 `continew-admin-common` 模块会因为字母排序原因排在上方。
+
+```
+continew-admin
+├─ continew-webapi(API 及打包部署模块)
+│  ├─ src
+│  │  ├─ main
+│  │  │  ├─ java/top/continew/admin
+│  │  │  │  ├─ config (配置)
+│  │  │  │  ├─ controller
+│  │  │  │  │  ├─ auth(系统认证相关 API)
+│  │  │  │  │  ├─ common(通用相关 API)
+│  │  │  │  │  ├─ monitor(系统监控相关 API)
+│  │  │  │  │  ├─ system(系统管理相关 API)
+│  │  │  │  │  └─ tool(系统工具相关 API)
+│  │  │  │  └─ ContiNewAdminApplication.java(ContiNew Admin 启动程序)
+│  │  │  └─ resources
+│  │  │     ├─ config(核心配置目录)
+│  │  │     │  ├─ application-dev.yml(开发环境配置文件)
+│  │  │     │  ├─ application-prod.yml(生产环境配置文件)
+│  │  │     │  └─ application.yml(通用配置文件)
+│  │  │     ├─ db/changelog(Liquibase 数据脚本配置目录)
+│  │  │     │  ├─ mysql(MySQL 数据库初始 SQL 脚本目录)
+│  │  │     │  ├─ postgresql(PostgreSQL 数据库初始 SQL 脚本目录)
+│  │  │     │  └─ db.changelog-master.yaml(Liquibase 变更记录文件)
+│  │  │     ├─ templates(模板配置目录,例如:邮件模板)
+│  │  │     ├─ banner.txt(Banner 配置文件)
+│  │  │     └─ logback-spring.xml(日志配置文件)
+│  │  └─ test(测试相关代码目录)
+│  └─ pom.xml(包含打包相关配置)
+├─ continew-module-system(系统管理模块,存放系统管理相关业务功能,例如:部门管理、角色管理、用户管理等)
+│  ├─ src
+│  │  ├─ main
+│  │  │  ├─ java/top/continew/admin
+│  │  │  │  ├─ auth(系统认证相关业务)
+│  │  │  │  │  ├─ model(系统认证相关模型)
+│  │  │  │  │  │  ├─ query(系统认证相关查询条件)
+│  │  │  │  │  │  ├─ req(系统认证相关请求对象(Request))
+│  │  │  │  │  │  └─ resp(系统认证相关响应对象(Response))
+│  │  │  │  │  └─ service(系统认证相关业务接口及实现类)
+│  │  │  │  └─ system(系统管理相关业务)
+│  │  │  │     ├─ config(系统管理相关配置)
+│  │  │  │     ├─ enums(系统管理相关枚举)
+│  │  │  │     ├─ mapper(系统管理相关 Mapper)
+│  │  │  │     ├─ model(系统管理相关模型)
+│  │  │  │     │  ├─ entity(系统管理相关实体对象)
+│  │  │  │     │  ├─ query(系统管理相关查询条件)
+│  │  │  │     │  ├─ req(系统管理相关请求对象(Request))
+│  │  │  │     │  └─ resp(系统管理相关响应对象(Response))
+│  │  │  │     ├─ service(系统管理相关业务接口及实现类)
+│  │  │  │     └─ util(系统管理相关工具类)
+│  │  │  └─ resources
+│  │  │     └─ mapper(系统管理相关 Mapper XML 文件目录)
+│  │  └─ test(测试相关代码目录)
+│  └─ pom.xml
+├─ continew-plugin(插件模块,存放代码生成、任务调度等扩展模块,后续会进行插件化改造)
+│  ├─ continew-plugin-schedule(任务调度插件模块)
+│  │  ├─ src
+│  │  │  ├─ main/java/top/continew/admin/schedule
+│  │  │  │  ├─ api(任务调度中心相关 API)
+│  │  │  │  ├─ config(任务调度相关配置)
+│  │  │  │  ├─ constant(任务调度相关常量)
+│  │  │  │  ├─ enums(任务调度相关枚举)
+│  │  │  │  ├─ model(任务调度相关模型)
+│  │  │  │  │  ├─ query(任务调度相关查询条件)
+│  │  │  │  │  ├─ req(任务调度相关请求对象(Request))
+│  │  │  │  │  └─ resp(任务调度相关响应对象(Response))
+│  │  │  │  └─ service(代码生成器相关业务接口及实现类)
+│  │  │  └─ test(测试相关代码目录)
+│  │  └─ pom.xml
+│  ├─ continew-plugin-open(能力开放插件模块)
+│  │  ├─ src
+│  │  │  ├─ main/java/top/continew/admin/open
+│  │  │  │  ├─ mapper(代码生成器相关 Mapper)
+│  │  │  │  ├─ model(能力开放相关模型)
+│  │  │  │  │  ├─ entity(能力开放相关实体对象)
+│  │  │  │  │  ├─ query(能力开放相关查询条件)
+│  │  │  │  │  ├─ req(能力开放相关请求对象(Request))
+│  │  │  │  │  └─ resp(能力开放相关响应对象(Response))
+│  │  │  │  └─ service(能力开放相关业务接口及实现类)
+│  │  │  └─ test(测试相关代码目录)
+│  │  └─ pom.xml
+│  ├─ continew-plugin-generator(代码生成器插件模块)
+│  │  ├─ src
+│  │  │  ├─ main
+│  │  │  │  ├─ java/top/continew/admin/generator
+│  │  │  │  │  ├─ config(代码生成器相关配置)
+│  │  │  │  │  ├─ enums(代码生成器相关枚举)
+│  │  │  │  │  ├─ mapper(代码生成器相关 Mapper)
+│  │  │  │  │  ├─ model(代码生成器相关模型)
+│  │  │  │  │  │  ├─ entity(代码生成器相关实体对象)
+│  │  │  │  │  │  ├─ query(代码生成器相关查询条件)
+│  │  │  │  │  │  ├─ req(代码生成器相关请求对象(Request))
+│  │  │  │  │  │  └─ resp(代码生成器相关响应对象(Response))
+│  │  │  │  │  └─ service(代码生成器相关业务接口及实现类)
+│  │  │  │  └─ resources
+│  │  │  │     ├─ templates/generator(代码生成相关模板目录)
+│  │  │  │     ├─ application.yml(代码生成配置文件)
+│  │  │  │     └─ generator.properties(代码生成类型映射配置文件)
+│  │  │  └─ test(测试相关代码目录)
+│  │  └─ pom.xml
+│  └─ pom.xml
+├─ continew-common(公共模块,存放公共工具类,公共配置等)
+│  ├─ src
+│  │  ├─ main/java/top/continew/admin/common
+│  │  │  ├─ config(公共配置)
+│  │  │  ├─ constant(公共常量)
+│  │  │  ├─ enums(公共枚举)
+│  │  │  ├─ model(公共模型)
+│  │  │  │  ├─ dto(公共 DTO(Data Transfer Object))
+│  │  │  │  ├─ req(公共请求对象(Request))
+│  │  │  │  └─ resp(公共响应对象(Response))
+│  │  │  └─ util(公共工具类)
+│  │  └─ test(测试相关代码目录)
+│  └─ pom.xml
+├─ continew-extension(扩展模块)
+│  ├─ continew-extension-schedule-server(任务调度服务端模块,实际开发时如果是公司统一提供环境,可直接删除本模块)
+│  │  ├─ src
+│  │  │  ├─ main
+│  │  │  │  ├─ java/top/continew/admin/extension/schedule
+│  │  │  │  │  └─ ScheduleServerApplication.java(任务调度服务端启动程序)
+│  │  │  │  └─ resources
+│  │  │  │     ├─ config(核心配置目录)
+│  │  │  │     │  ├─ application-dev.yml(开发环境配置文件)
+│  │  │  │     │  ├─ application-prod.yml(生产环境配置文件)
+│  │  │  │     │  └─ application.yml(通用配置文件)
+│  │  │  │     ├─ db/changelog(Liquibase 数据脚本配置目录)
+│  │  │  │     │  ├─ mysql(MySQL 数据库初始 SQL 脚本目录)
+│  │  │  │     │  ├─ postgresql(PostgreSQL 数据库初始 SQL 脚本目录)
+│  │  │  │     │  └─ db.changelog-master.yaml(Liquibase 变更记录文件)
+│  │  │  │     └─ logback-spring.xml(日志配置文件)
+│  │  │  └─ test(测试相关代码目录)
+│  │  └─ pom.xml
+│  └─ pom.xml
+├─ .github(GitHub 相关配置目录,实际开发时直接删除)
+├─ .idea
+│  └─ icon.png(IDEA 项目图标,实际开发时直接删除)
+├─ .image(截图目录,实际开发时直接删除)
+├─ .style(代码格式、License文件头相关配置目录,实际开发时根据需要取舍,删除时注意删除 spotless 插件配置)
+├─ .gitignore(Git 忽略文件相关配置文件)
+├─ docker(项目部署相关配置目录,实际开发时可备份后直接删除)
+├─ LICENSE(开源协议文件)
+├─ CHANGELOG.md(更新日志文件,实际开发时直接删除)
+├─ README.md(项目 README 文件,实际开发时替换为真实内容)
+├─ lombok.config(Lombok 全局配置文件)
+└─ pom.xml(包含版本锁定及全局插件相关配置)
+```
+
+## 贡献指南
+
+ContiNew Admin 致力于提供开箱即用,持续舒适的开发体验。作为一个开源项目,Creator 的初心是希望 ContiNew Admin 依托开源协作模式,提升技术透明度、放大集体智慧、共创优秀实践,源源不断地为企业级项目开发提供助力。
+
+我们非常欢迎广大社区用户为 ContiNew Admin **贡献(开发,测试、文档、答疑等)** 或优化代码,欢迎各位感兴趣的小伙伴儿,[添加微信](https://continew.top/support.html) 讨论或认领任务。
+
+### 分支说明
+
+ContiNew Admin 的分支目前分为下个大版本的开发分支和上个大版本的维护分支,PR 前请注意对应分支是否处于维护状态,版本支持情况请查看 [更新日志/版本支持](https://continew.top/admin/other/changelog.html#%E7%89%88%E6%9C%AC%E6%94%AF%E6%8C%81)。
+
+| 分支  | 说明                                                         |
+| ----- | ------------------------------------------------------------ |
+| dev   | 开发分支,默认为下个大版本的 SNAPSHOT 版本,接受新功能或新功能优化 PR |
+| x.x.x | 维护分支,在 vx.x.x 版本维护期终止前(一般为下个大版本发布前),用于修复上个版本的 Bug,只接受已有功能修复,不接受新功能 PR |
+
+### 贡献代码
+
+如果您想提交新功能或优化现有代码,可以按照以下步骤操作:
+
+1. 首先,在 Gitee 或 Github 上将项目 fork 到您自己的仓库
+2. 然后,将 fork 过来的项目(即您的项目)克隆到本地
+3. 切换到当前仍在维护的分支(请务必充分了解分支使用说明,可进群联系维护者确认)
+4. 开始修改代码,修改完成后,将代码 commit 并 push 到您的远程仓库
+5. 在 Gitee 或 Github 上新建 pull request(pr),选择好源和目标,按模板要求填写说明信息后提交即可(多多参考 [已批准合并的 pr 记录](https://github.com/continew-org/continew-admin/pulls?q=is%3Apr+is%3Amerged),会大大增加批准合并率)
+6. 最后,耐心等待维护者合并您的请求即可
+
+请记住,如果您有任何疑问或需要帮助,我们将随时提供支持。
+
+> [!IMPORTANT]
+> 欢迎大家为 ContiNew Admin 贡献代码,我们非常感谢您的支持!为了更好地管理项目,维护者有一些要求:
+>
+> 1. 请确保代码、配置文件的结构和命名规范良好,完善的代码注释甚至包括接口文档参数示例,并遵循阿里巴巴的 <a href="https://github.com/continew-org/continew-admin/blob/dev/.style/Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C(%E9%BB%84%E5%B1%B1%E7%89%88).pdf" target="_blank">《Java开发手册(黄山版)》</a> 中的代码规范,保证代码质量和可维护性
+> 2. 在提交代码前,请按照 [Angular 提交规范](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular) 编写 commit 的 message(建议在 IntelliJ IDEA 中下载并安装 Git Commit Template 插件,以便按照规范进行 commit)
+> 3. 提交代码之前,请关闭所有代码窗口,执行 `mvn compile` 命令(代码格式化插件会在项目编译时对全局代码进行格式修正),编译通过后,不要再打开查看任何代码窗口,直接提交即可,以免不同的 IDE 配置会自动进行代码格式化
+
+## 反馈交流
+
+欢迎各位小伙伴儿扫描下方二维码加好友,备注 `cnadmin`,拉你进群,探讨技术、提提需求~   
+
+加入交流群后,你将会:
+
+- 第一时间收到框架动态
+- 第一时间收到框架更新通知
+- 第一时间收到框架 Bug 通知
+- 和众多大佬互相 (huá shuǐ) 交流 (mō yú)
+
+<div align="left">
+  <img src=".image/qrcode.jpg" alt="二维码" width="230px" />
+</div>
+<details>
+<summary>无加群意愿</summary>
+如无加群意愿,欢迎在 <a href="https://github.com/continew-org/continew-admin/issues" target="_blank">Issues</a> 中反馈交流~ 🍻
+</details>
+
+## 鸣谢
+
+### 鸣谢
+
+感谢参与贡献的每一位小伙伴🥰
+
+<a href="https://github.com/continew-org/continew-admin/graphs/contributors">
+  <img src="https://opencollective.com/continew-admin/contributors.svg?width=890&button=false" alt="contributors" />
+</a>
+
+### 特别鸣谢
+
+- 感谢 <a href="https://www.jetbrains.com/" target="_blank">JetBrains</a> 提供的 <a href="https://jb.gg/OpenSourceSupport" target="_blank">非商业开源软件开发授权</a> 
+- 感谢 <a href="https://github.com/baomidou/mybatis-plus" target="_blank">MyBatis Plus</a>、<a href="https://github.com/dromara/sa-token" target="_blank">Sa-Token</a> 、<a href="https://github.com/alibaba/jetcache" target="_blank">JetCache</a>、<a href="https://github.com/opengoofy/crane4j" target="_blank">Crane4j</a>、<a href="https://github.com/xiaoymin/knife4j" target="_blank">Knife4j</a>、<a href="https://github.com/dromara/hutool" target="_blank">Hutool</a> 等开源组件作者为国内开源世界作出的贡献
+- 感谢项目使用或未使用到的每一款开源组件,致敬各位开源先驱 :fire:
+
+## License
+
+- 遵循 <a href="https://github.com/continew-org/continew-admin/blob/dev/LICENSE" target="_blank">Apache-2.0</a> 开源许可协议
+- Copyright © 2022-present <a href="https://blog.charles7c.top" target="_blank">Charles7c</a>
+
+## GitHub Star 趋势
+
+![GitHub Star 趋势](https://starchart.cc/charles7c/continew-admin.svg)

+ 151 - 0
continew-common/pom.xml

@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         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>
+    <parent>
+        <groupId>top.continew</groupId>
+        <artifactId>continew-admin</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>continew-common</artifactId>
+    <description>公共模块(存放公共工具类,公共配置等)</description>
+
+    <dependencies>
+        <!-- CosId(通用、灵活、高性能的分布式 ID 生成器) -->
+        <dependency>
+            <groupId>me.ahoo.cosid</groupId>
+            <artifactId>cosid-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>me.ahoo.cosid</groupId>
+            <artifactId>cosid-spring-redis</artifactId>
+        </dependency>
+
+        <!-- SMS4J(短信聚合框架,轻松集成多家短信服务,解决接入多个短信 SDK 的繁琐流程) -->
+        <dependency>
+            <groupId>org.dromara.sms4j</groupId>
+            <artifactId>sms4j-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- X File Storage(一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS...等其它兼容 S3 协议的存储平台) -->
+        <dependency>
+            <groupId>org.dromara.x-file-storage</groupId>
+            <artifactId>x-file-storage-spring</artifactId>
+        </dependency>
+        <!-- Amazon S3(Amazon Simple Storage Service,亚马逊简单存储服务,通用存储协议 S3,兼容主流云厂商对象存储) -->
+        <dependency>
+            <groupId>com.amazonaws</groupId>
+            <artifactId>aws-java-sdk-s3</artifactId>
+        </dependency>
+
+        <!-- FreeMarker(模板引擎) -->
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+        </dependency>
+
+        <!-- MySQL Java 驱动 -->
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 扩展模块 - CURD(增删改查) -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-extension-crud-mp</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 认证模块 - SaToken -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-auth-satoken</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-web</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- ContiNew Starter 认证模块 - JustAuth -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-auth-justauth</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 缓存模块 - JetCache -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-cache-jetcache</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 数据权限模块 - MyBatis Plus -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-extension-datapermission-mp</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 消息模块 - WebSocket -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-messaging-websocket</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-web</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- ContiNew Starter 消息模块 - 邮件 -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-messaging-mail</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 验证码模块 - 图形验证码 -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-captcha-graphic</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 验证码模块 - 行为验证码 -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-captcha-behavior</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 安全模块 - 限流器 -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-security-limiter</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 安全模块 - 加密 -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-security-crypto</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 安全模块 - 脱敏 -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-security-mask</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter 安全模块 - 密码编码器 -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-security-password</artifactId>
+        </dependency>
+
+        <!-- ContiNew Starter JSON 模块 - Jackson -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-starter-json-jackson</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 68 - 0
continew-common/src/main/java/top/continew/admin/common/base/BaseController.java

@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.base;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.context.model.SaRequest;
+import cn.dev33.satoken.sign.SaSignTemplate;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.annotation.AnnotationUtil;
+import cn.hutool.core.text.CharSequenceUtil;
+import top.continew.starter.core.constant.StringConstants;
+import top.continew.starter.extension.crud.annotation.CrudApi;
+import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
+import top.continew.starter.extension.crud.controller.AbstractBaseController;
+import top.continew.starter.extension.crud.enums.Api;
+import top.continew.starter.extension.crud.model.req.BaseReq;
+import top.continew.starter.extension.crud.service.BaseService;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+/**
+ * 控制器基类
+ *
+ * @param <S> 业务接口
+ * @param <L> 列表类型
+ * @param <D> 详情类型
+ * @param <Q> 查询条件
+ * @param <C> 创建或修改参数类型
+ * @author Charles7c
+ * @since 2024/12/6 20:30
+ */
+public class BaseController<S extends BaseService<L, D, Q, C>, L, D, Q, C extends BaseReq> extends AbstractBaseController<S, L, D, Q, C> {
+
+    @Override
+    public void preHandle(CrudApi crudApi, Object[] args, Method targetMethod, Class<?> targetClass) throws Exception {
+        SaRequest saRequest = SaHolder.getRequest();
+        List<String> paramNames = saRequest.getParamNames();
+        if (paramNames.stream().anyMatch(SaSignTemplate.sign::equals)) {
+            return;
+        }
+        if (AnnotationUtil.hasAnnotation(targetMethod, SaIgnore.class) || AnnotationUtil
+            .hasAnnotation(targetClass, SaIgnore.class)) {
+            return;
+        }
+        CrudRequestMapping crudRequestMapping = targetClass.getDeclaredAnnotation(CrudRequestMapping.class);
+        String path = crudRequestMapping.value();
+        String prefix = String.join(StringConstants.COLON, CharSequenceUtil.splitTrim(path, StringConstants.SLASH));
+        Api api = crudApi.value();
+        String apiName = Api.PAGE.equals(api) || Api.TREE.equals(api) ? Api.LIST.name() : api.name();
+        StpUtil.checkPermission("%s:%s".formatted(prefix, apiName.toLowerCase()));
+    }
+}

+ 98 - 0
continew-common/src/main/java/top/continew/admin/common/config/exception/GlobalExceptionHandler.java

@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.exception;
+
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.NumberUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
+import org.springframework.web.multipart.MultipartException;
+import top.continew.starter.core.exception.BadRequestException;
+import top.continew.starter.core.exception.BusinessException;
+import top.continew.starter.web.model.R;
+
+/**
+ * 全局异常处理器
+ *
+ * @author Charles7c
+ * @since 2024/8/7 20:21
+ */
+@Slf4j
+@Order(99)
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+    /**
+     * 拦截业务异常
+     */
+    @ExceptionHandler(BusinessException.class)
+    public R handleBusinessException(BusinessException e, HttpServletRequest request) {
+        log.error("[{}] {}", request.getMethod(), request.getRequestURI(), e);
+        return R.fail(String.valueOf(HttpStatus.INTERNAL_SERVER_ERROR.value()), e.getMessage());
+    }
+
+    /**
+     * 拦截自定义验证异常-错误请求
+     */
+    @ExceptionHandler(BadRequestException.class)
+    public R handleBadRequestException(BadRequestException e, HttpServletRequest request) {
+        log.error("[{}] {}", request.getMethod(), request.getRequestURI(), e);
+        return R.fail(String.valueOf(HttpStatus.BAD_REQUEST.value()), e.getMessage());
+    }
+
+    /**
+     * 拦截校验异常-方法参数类型不匹配异常
+     */
+    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
+    public R handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e,
+                                                       HttpServletRequest request) {
+        log.error("[{}] {}", request.getMethod(), request.getRequestURI(), e);
+        return R.fail(String.valueOf(HttpStatus.BAD_REQUEST.value()), "参数 '%s' 类型不匹配".formatted(e.getName()));
+    }
+
+    /**
+     * 拦截文件上传异常-超过上传大小限制
+     */
+    @ExceptionHandler(MultipartException.class)
+    public R handleRequestTooBigException(MultipartException e, HttpServletRequest request) {
+        log.error("[{}] {}", request.getMethod(), request.getRequestURI(), e);
+        String msg = e.getMessage();
+        R defaultFail = R.fail(String.valueOf(HttpStatus.BAD_REQUEST.value()), msg);
+        if (CharSequenceUtil.isBlank(msg)) {
+            return defaultFail;
+        }
+        String sizeLimit;
+        Throwable cause = e.getCause();
+        if (null != cause) {
+            msg = msg.concat(cause.getMessage().toLowerCase());
+        }
+        if (msg.contains("size") && msg.contains("exceed")) {
+            sizeLimit = CharSequenceUtil.subBetween(msg, "the maximum size ", " for");
+        } else if (msg.contains("larger than")) {
+            sizeLimit = CharSequenceUtil.subAfter(msg, "larger than ", true);
+        } else {
+            return defaultFail;
+        }
+        String errorMsg = "请上传小于 %sKB 的文件".formatted(NumberUtil.parseLong(sizeLimit) / 1024);
+        return R.fail(String.valueOf(HttpStatus.BAD_REQUEST.value()), errorMsg);
+    }
+}

+ 72 - 0
continew-common/src/main/java/top/continew/admin/common/config/exception/GlobalSaTokenExceptionHandler.java

@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.exception;
+
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.exception.NotPermissionException;
+import cn.dev33.satoken.exception.NotRoleException;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import top.continew.starter.web.model.R;
+
+/**
+ * 全局 SaToken 异常处理器
+ *
+ * @author Charles7c
+ * @since 2024/8/7 20:21
+ */
+@Slf4j
+@Order(99)
+@RestControllerAdvice
+public class GlobalSaTokenExceptionHandler {
+
+    /**
+     * 认证异常-登录认证
+     */
+    @ExceptionHandler(NotLoginException.class)
+    public R handleNotLoginException(NotLoginException e, HttpServletRequest request) {
+        log.error("[{}] {}", request.getMethod(), request.getRequestURI(), e);
+        String errorMsg = switch (e.getType()) {
+            case NotLoginException.KICK_OUT -> "您已被踢下线";
+            case NotLoginException.BE_REPLACED_MESSAGE -> "您已被顶下线";
+            default -> "您的登录状态已过期,请重新登录";
+        };
+        return R.fail(String.valueOf(HttpStatus.UNAUTHORIZED.value()), errorMsg);
+    }
+
+    /**
+     * 认证异常-权限认证
+     */
+    @ExceptionHandler(NotPermissionException.class)
+    public R handleNotPermissionException(NotPermissionException e, HttpServletRequest request) {
+        log.error("[{}] {}", request.getMethod(), request.getRequestURI(), e);
+        return R.fail(String.valueOf(HttpStatus.FORBIDDEN.value()), "没有访问权限,请联系管理员授权");
+    }
+
+    /**
+     * 认证异常-角色认证
+     */
+    @ExceptionHandler(NotRoleException.class)
+    public R handleNotRoleException(NotRoleException e, HttpServletRequest request) {
+        log.error("[{}] {}", request.getMethod(), request.getRequestURI(), e);
+        return R.fail(String.valueOf(HttpStatus.FORBIDDEN.value()), "没有访问权限,请联系管理员授权");
+    }
+}

+ 45 - 0
continew-common/src/main/java/top/continew/admin/common/config/mybatis/BCryptEncryptor.java

@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.mybatis;
+
+import org.springframework.security.crypto.password.PasswordEncoder;
+import top.continew.starter.security.crypto.encryptor.IEncryptor;
+
+/**
+ * BCrypt 加/解密处理器(不可逆)
+ *
+ * @author Charles7c
+ * @since 2024/2/8 22:29
+ */
+public class BCryptEncryptor implements IEncryptor {
+
+    private final PasswordEncoder passwordEncoder;
+
+    public BCryptEncryptor(PasswordEncoder passwordEncoder) {
+        this.passwordEncoder = passwordEncoder;
+    }
+
+    @Override
+    public String encrypt(String plaintext, String password, String publicKey) throws Exception {
+        return passwordEncoder.encode(plaintext);
+    }
+
+    @Override
+    public String decrypt(String ciphertext, String password, String privateKey) throws Exception {
+        return ciphertext;
+    }
+}

+ 57 - 0
continew-common/src/main/java/top/continew/admin/common/config/mybatis/DataPermissionMapper.java

@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.mybatis;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Param;
+import top.continew.starter.data.mp.base.BaseMapper;
+import top.continew.starter.extension.datapermission.annotation.DataPermission;
+
+import java.util.List;
+
+/**
+ * 数据权限 Mapper 基类
+ *
+ * @param <T> 实体类
+ * @author Charles7c
+ * @since 2023/9/3 21:50
+ */
+public interface DataPermissionMapper<T> extends BaseMapper<T> {
+
+    /**
+     * 根据 entity 条件,查询全部记录
+     *
+     * @param queryWrapper 实体对象封装操作类(可以为 null)
+     * @return 全部记录
+     */
+    @Override
+    @DataPermission
+    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
+
+    /**
+     * 根据 entity 条件,查询全部记录(并翻页)
+     *
+     * @param page         分页查询条件
+     * @param queryWrapper 实体对象封装操作类(可以为 null)
+     * @return 全部记录(并翻页)
+     */
+    @Override
+    @DataPermission
+    List<T> selectList(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
+}

+ 53 - 0
continew-common/src/main/java/top/continew/admin/common/config/mybatis/DefaultDataPermissionUserContextProvider.java

@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.mybatis;
+
+import cn.hutool.core.convert.Convert;
+import top.continew.admin.common.context.UserContextHolder;
+import top.continew.starter.extension.datapermission.enums.DataScope;
+import top.continew.starter.extension.datapermission.filter.DataPermissionUserContextProvider;
+import top.continew.starter.extension.datapermission.model.RoleContext;
+import top.continew.starter.extension.datapermission.model.UserContext;
+
+import java.util.stream.Collectors;
+
+/**
+ * 数据权限用户上下文提供者
+ *
+ * @author Charles7c
+ * @since 2023/12/21 21:19
+ */
+public class DefaultDataPermissionUserContextProvider implements DataPermissionUserContextProvider {
+
+    @Override
+    public boolean isFilter() {
+        return !UserContextHolder.isAdmin();
+    }
+
+    @Override
+    public UserContext getUserContext() {
+        top.continew.admin.common.context.UserContext context = UserContextHolder.getContext();
+        UserContext userContext = new UserContext();
+        userContext.setUserId(Convert.toStr(context.getId()));
+        userContext.setDeptId(Convert.toStr(context.getDeptId()));
+        userContext.setRoles(context.getRoles()
+            .stream()
+            .map(r -> new RoleContext(Convert.toStr(r.getId()), DataScope.valueOf(r.getDataScope().name())))
+            .collect(Collectors.toSet()));
+        return userContext;
+    }
+}

+ 112 - 0
continew-common/src/main/java/top/continew/admin/common/config/mybatis/MyBatisPlusMetaObjectHandler.java

@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.mybatis;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import top.continew.admin.common.context.UserContextHolder;
+import top.continew.starter.extension.crud.model.entity.BaseDO;
+
+import java.time.LocalDateTime;
+
+/**
+ * MyBatis Plus 元对象处理器配置(插入或修改时自动填充)
+ *
+ * @author Charles7c
+ * @since 2022/12/22 19:52
+ */
+public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {
+
+    /**
+     * 创建人
+     */
+    private static final String CREATE_USER = "createUser";
+    /**
+     * 创建时间
+     */
+    private static final String CREATE_TIME = "createTime";
+    /**
+     * 修改人
+     */
+    private static final String UPDATE_USER = "updateUser";
+    /**
+     * 修改时间
+     */
+    private static final String UPDATE_TIME = "updateTime";
+
+    /**
+     * 插入数据时填充
+     *
+     * @param metaObject 元对象
+     */
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        if (null == metaObject) {
+            return;
+        }
+        Long createUser = UserContextHolder.getUserId();
+        LocalDateTime createTime = LocalDateTime.now();
+        if (metaObject.getOriginalObject() instanceof BaseDO baseDO) {
+            // 继承了 BaseDO 的类,填充创建信息字段
+            baseDO.setCreateUser(ObjectUtil.defaultIfNull(baseDO.getCreateUser(), createUser));
+            baseDO.setCreateTime(ObjectUtil.defaultIfNull(baseDO.getCreateTime(), createTime));
+        } else {
+            // 未继承 BaseDO 的类,如存在创建信息字段则进行填充
+            this.fillFieldValue(metaObject, CREATE_USER, createUser, false);
+            this.fillFieldValue(metaObject, CREATE_TIME, createTime, false);
+        }
+    }
+
+    /**
+     * 修改数据时填充
+     *
+     * @param metaObject 元对象
+     */
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        if (null == metaObject) {
+            return;
+        }
+        Long updateUser = UserContextHolder.getUserId();
+        LocalDateTime updateTime = LocalDateTime.now();
+        if (metaObject.getOriginalObject() instanceof BaseDO baseDO) {
+            // 继承了 BaseDO 的类,填充修改信息
+            baseDO.setUpdateUser(updateUser);
+            baseDO.setUpdateTime(updateTime);
+        } else {
+            // 未继承 BaseDO 的类,根据类中拥有的修改信息字段进行填充,不存在修改信息字段不进行填充
+            this.fillFieldValue(metaObject, UPDATE_USER, updateUser, true);
+            this.fillFieldValue(metaObject, UPDATE_TIME, updateTime, true);
+        }
+    }
+
+    /**
+     * 填充字段值
+     *
+     * @param metaObject     元数据对象
+     * @param fieldName      要填充的字段名
+     * @param fillFieldValue 要填充的字段值
+     * @param isOverride     如果字段值不为空,是否覆盖(true:覆盖;false:不覆盖)
+     */
+    private void fillFieldValue(MetaObject metaObject, String fieldName, Object fillFieldValue, boolean isOverride) {
+        if (metaObject.hasSetter(fieldName)) {
+            Object fieldValue = metaObject.getValue(fieldName);
+            setFieldValByName(fieldName, null != fieldValue && !isOverride ? fieldValue : fillFieldValue, metaObject);
+        }
+    }
+}

+ 57 - 0
continew-common/src/main/java/top/continew/admin/common/config/mybatis/MybatisPlusConfiguration.java

@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.mybatis;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import top.continew.starter.extension.datapermission.filter.DataPermissionUserContextProvider;
+
+/**
+ * MyBatis Plus 配置
+ *
+ * @author Charles7c
+ * @since 2022/12/22 19:51
+ */
+@Configuration
+public class MybatisPlusConfiguration {
+
+    /**
+     * 元对象处理器配置(插入或修改时自动填充)
+     */
+    @Bean
+    public MetaObjectHandler metaObjectHandler() {
+        return new MyBatisPlusMetaObjectHandler();
+    }
+
+    /**
+     * 数据权限用户上下文提供者
+     */
+    @Bean
+    public DataPermissionUserContextProvider dataPermissionUserContextProvider() {
+        return new DefaultDataPermissionUserContextProvider();
+    }
+
+    /**
+     * BCrypt 加/解密处理器
+     */
+    @Bean
+    public BCryptEncryptor bCryptEncryptor(PasswordEncoder passwordEncoder) {
+        return new BCryptEncryptor(passwordEncoder);
+    }
+}

+ 92 - 0
continew-common/src/main/java/top/continew/admin/common/config/properties/CaptchaProperties.java

@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.properties;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 验证码配置属性
+ *
+ * @author Charles7c
+ * @since 2022/12/11 13:35
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "captcha")
+public class CaptchaProperties {
+
+    /**
+     * 图形验证码过期时间
+     */
+    @Value("${continew-starter.captcha.graphic.expirationInMinutes}")
+    private long expirationInMinutes;
+
+    /**
+     * 邮箱验证码配置
+     */
+    private CaptchaMail mail;
+
+    /**
+     * 短信验证码配置
+     */
+    private CaptchaSms sms;
+
+    /**
+     * 邮箱验证码配置
+     */
+    @Data
+    public static class CaptchaMail {
+        /**
+         * 内容长度
+         */
+        private int length;
+
+        /**
+         * 过期时间
+         */
+        private long expirationInMinutes;
+
+        /**
+         * 模板路径
+         */
+        private String templatePath;
+    }
+
+    /**
+     * 短信验证码配置
+     */
+    @Data
+    public static class CaptchaSms {
+        /**
+         * 内容长度
+         */
+        private int length;
+
+        /**
+         * 过期时间
+         */
+        private long expirationInMinutes;
+
+        /**
+         * 模板 ID
+         */
+        private String templateId;
+    }
+}

+ 43 - 0
continew-common/src/main/java/top/continew/admin/common/config/properties/RsaProperties.java

@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.properties;
+
+import cn.hutool.extra.spring.SpringUtil;
+
+/**
+ * RSA 配置属性
+ *
+ * @author Zheng Jie(ELADMIN)
+ * @author Charles7c
+ * @since 2022/12/21 20:21
+ */
+public class RsaProperties {
+
+    /**
+     * 私钥
+     */
+    public static final String PRIVATE_KEY;
+    public static final String PUBLIC_KEY;
+
+    static {
+        PRIVATE_KEY = SpringUtil.getProperty("continew-starter.security.crypto.private-key");
+        PUBLIC_KEY = SpringUtil.getProperty("continew-starter.security.crypto.public-key");
+    }
+
+    private RsaProperties() {
+    }
+}

+ 44 - 0
continew-common/src/main/java/top/continew/admin/common/config/websocket/WebSocketClientServiceImpl.java

@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.config.websocket;
+
+import cn.dev33.satoken.stp.StpUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.http.server.ServletServerHttpRequest;
+import org.springframework.stereotype.Component;
+import top.continew.starter.core.exception.BusinessException;
+import top.continew.starter.messaging.websocket.core.WebSocketClientService;
+
+/**
+ * 当前登录用户 Provider
+ *
+ * @author Charles7c
+ * @since 2024/6/4 22:13
+ */
+@Component
+public class WebSocketClientServiceImpl implements WebSocketClientService {
+
+    @Override
+    public String getClientId(ServletServerHttpRequest request) {
+        HttpServletRequest servletRequest = request.getServletRequest();
+        String token = servletRequest.getParameter("token");
+        if (null == StpUtil.getLoginIdByToken(token)) {
+            throw new BusinessException("登录已过期,请重新登录");
+        }
+        return token;
+    }
+}

+ 76 - 0
continew-common/src/main/java/top/continew/admin/common/constant/CacheConstants.java

@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.constant;
+
+import top.continew.starter.core.constant.StringConstants;
+
+/**
+ * 缓存相关常量
+ *
+ * @author Charles7c
+ * @since 2022/12/22 19:30
+ */
+public class CacheConstants {
+
+    /**
+     * 分隔符
+     */
+    public static final String DELIMITER = StringConstants.COLON;
+
+    /**
+     * 验证码键前缀
+     */
+    public static final String CAPTCHA_KEY_PREFIX = "CAPTCHA" + DELIMITER;
+
+    /**
+     * 用户缓存键前缀
+     */
+    public static final String USER_KEY_PREFIX = "USER" + DELIMITER;
+
+    /**
+     * 菜单缓存键前缀
+     */
+    public static final String MENU_KEY_PREFIX = "MENU" + DELIMITER;
+
+    /**
+     * 字典缓存键前缀
+     */
+    public static final String DICT_KEY_PREFIX = "DICT" + DELIMITER;
+
+    /**
+     * 参数缓存键前缀
+     */
+    public static final String OPTION_KEY_PREFIX = "OPTION" + DELIMITER;
+
+    /**
+     * 仪表盘缓存键前缀
+     */
+    public static final String DASHBOARD_KEY_PREFIX = "DASHBOARD" + DELIMITER;
+
+    /**
+     * 用户密码错误次数缓存键前缀
+     */
+    public static final String USER_PASSWORD_ERROR_KEY_PREFIX = USER_KEY_PREFIX + "PASSWORD_ERROR" + DELIMITER;
+
+    /**
+     * 数据导入临时会话key
+     */
+    public static final String DATA_IMPORT_KEY = "SYSTEM" + DELIMITER + "DATA_IMPORT" + DELIMITER;
+
+    private CacheConstants() {
+    }
+}

+ 46 - 0
continew-common/src/main/java/top/continew/admin/common/constant/ContainerConstants.java

@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.constant;
+
+import top.continew.starter.extension.crud.constant.ContainerPool;
+
+/**
+ * 数据源容器相关常量(Crane4j 数据填充组件使用)
+ *
+ * @author Charles7c
+ * @since 2024/1/20 12:33
+ */
+public class ContainerConstants extends ContainerPool {
+
+    /**
+     * 用户昵称
+     */
+    public static final String USER_NICKNAME = ContainerPool.USER_NICKNAME;
+
+    /**
+     * 用户角色 ID 列表
+     */
+    public static final String USER_ROLE_ID_LIST = "UserRoleIdList";
+
+    /**
+     * 用户角色名称列表
+     */
+    public static final String USER_ROLE_NAME_LIST = "UserRoleNameList";
+
+    private ContainerConstants() {
+    }
+}

+ 64 - 0
continew-common/src/main/java/top/continew/admin/common/constant/RegexConstants.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.constant;
+
+/**
+ * 正则相关常量
+ *
+ * @author Charles7c
+ * @since 2023/1/10 20:06
+ */
+public class RegexConstants {
+
+    /**
+     * 用户名正则(用户名长度为 4-64 个字符,支持大小写字母、数字、下划线,以字母开头)
+     */
+    public static final String USERNAME = "^[a-zA-Z][a-zA-Z0-9_]{3,64}$";
+
+    /**
+     * 密码正则模板(密码长度为 min-max 个字符,支持大小写字母、数字、特殊字符,至少包含字母和数字)
+     */
+    public static final String PASSWORD_TEMPLATE = "^(?=.*\\d)(?=.*[a-z]).{%s,%s}$";
+
+    /**
+     * 密码正则(密码长度为 8-32 个字符,支持大小写字母、数字、特殊字符,至少包含字母和数字)
+     */
+    public static final String PASSWORD = "^(?=.*\\d)(?=.*[a-z]).{8,32}$";
+
+    /**
+     * 特殊字符正则
+     */
+    public static final String SPECIAL_CHARACTER = "[-_`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\\n|\\r|\\t";
+
+    /**
+     * 通用编码正则(长度为 2-30 个字符,支持大小写字母、数字、下划线,以字母开头)
+     */
+    public static final String GENERAL_CODE = "^[a-zA-Z][a-zA-Z0-9_]{1,29}$";
+
+    /**
+     * 通用名称正则(长度为 2-30 个字符,支持中文、字母、数字、下划线,短横线)
+     */
+    public static final String GENERAL_NAME = "^[\\u4e00-\\u9fa5a-zA-Z0-9_-]{2,30}$";
+
+    /**
+     * 包名正则(可以包含大小写字母、数字、下划线,每一级包名不能以数字开头)
+     */
+    public static final String PACKAGE_NAME = "^(?:[a-zA-Z_][a-zA-Z0-9_]*\\.)*[a-zA-Z_][a-zA-Z0-9_]*$";
+
+    private RegexConstants() {
+    }
+}

+ 84 - 0
continew-common/src/main/java/top/continew/admin/common/constant/SysConstants.java

@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.constant;
+
+/**
+ * 系统相关常量
+ *
+ * @author Charles7c
+ * @since 2023/2/9 22:11
+ */
+public class SysConstants {
+
+    /**
+     * 否
+     */
+    public static final Integer NO = 0;
+
+    /**
+     * 是
+     */
+    public static final Integer YES = 1;
+
+    /**
+     * 超管用户 ID
+     */
+    public static final Long SUPER_USER_ID = 1L;
+
+    /**
+     * 顶级部门 ID
+     */
+    public static final Long SUPER_DEPT_ID = 1L;
+
+    /**
+     * 顶级父 ID
+     */
+    public static final Long SUPER_PARENT_ID = 0L;
+
+    /**
+     * 超管角色编码
+     */
+    public static final String SUPER_ROLE_CODE = "admin";
+
+    /**
+     * 超管角色 ID
+     */
+    public static final Long SUPER_ROLE_ID = 1L;
+
+    /**
+     * 全部权限标识
+     */
+    public static final String ALL_PERMISSION = "*:*:*";
+
+    /**
+     * 账号登录 URI
+     */
+    public static final String LOGIN_URI = "/auth/account";
+
+    /**
+     * 退出 URI
+     */
+    public static final String LOGOUT_URI = "/auth/logout";
+
+    /**
+     * 描述类字段后缀
+     */
+    public static final String DESCRIPTION_FIELD_SUFFIX = "String";
+
+    private SysConstants() {
+    }
+}

+ 54 - 0
continew-common/src/main/java/top/continew/admin/common/constant/UiConstants.java

@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.constant;
+
+/**
+ * UI 相关常量
+ *
+ * @author Charles7c
+ * @since 2023/9/17 14:12
+ */
+public class UiConstants {
+
+    /**
+     * 主色(极致蓝)
+     */
+    public static final String COLOR_PRIMARY = "arcoblue";
+
+    /**
+     * 成功色(仙野绿)
+     */
+    public static final String COLOR_SUCCESS = "green";
+
+    /**
+     * 警告色(活力橙)
+     */
+    public static final String COLOR_WARNING = "orangered";
+
+    /**
+     * 错误色(浪漫红)
+     */
+    public static final String COLOR_ERROR = "red";
+
+    /**
+     * 默认色(中性灰)
+     */
+    public static final String COLOR_DEFAULT = "gray";
+
+    private UiConstants() {
+    }
+}

+ 51 - 0
continew-common/src/main/java/top/continew/admin/common/context/RoleContext.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.context;
+
+import lombok.Data;
+import top.continew.admin.common.enums.DataScopeEnum;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 角色上下文
+ *
+ * @author Charles7c
+ * @since 2023/3/7 22:08
+ */
+@Data
+public class RoleContext implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 角色编码
+     */
+    private String code;
+
+    /**
+     * 数据权限
+     */
+    private DataScopeEnum dataScope;
+}

+ 122 - 0
continew-common/src/main/java/top/continew/admin/common/context/UserContext.java

@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.context;
+
+import cn.hutool.core.collection.CollUtil;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import top.continew.admin.common.constant.SysConstants;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 用户上下文
+ *
+ * @author Charles7c
+ * @since 2024/10/9 20:29
+ */
+@Data
+@NoArgsConstructor
+public class UserContext implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 部门 ID
+     */
+    private Long deptId;
+
+    /**
+     * 最后一次修改密码时间
+     */
+    private LocalDateTime pwdResetTime;
+
+    /**
+     * 登录时系统设置的密码过期天数
+     */
+    private Integer passwordExpirationDays;
+
+    /**
+     * 权限码集合
+     */
+    private Set<String> permissions;
+
+    /**
+     * 角色编码集合
+     */
+    private Set<String> roleCodes;
+
+    /**
+     * 角色集合
+     */
+    private Set<RoleContext> roles;
+
+    public UserContext(Set<String> permissions, Set<RoleContext> roles, Integer passwordExpirationDays) {
+        this.permissions = permissions;
+        this.setRoles(roles);
+        this.passwordExpirationDays = passwordExpirationDays;
+    }
+
+    public void setRoles(Set<RoleContext> roles) {
+        this.roles = roles;
+        this.roleCodes = roles.stream().map(RoleContext::getCode).collect(Collectors.toSet());
+    }
+
+    /**
+     * 是否为管理员
+     *
+     * @return true:是;false:否
+     */
+    public boolean isAdmin() {
+        if (CollUtil.isEmpty(roleCodes)) {
+            return false;
+        }
+        return roleCodes.contains(SysConstants.SUPER_ROLE_CODE);
+    }
+
+    /**
+     * 密码是否已过期
+     *
+     * @return 是否过期
+     */
+    public boolean isPasswordExpired() {
+        // 永久有效
+        if (this.passwordExpirationDays == null || this.passwordExpirationDays <= SysConstants.NO) {
+            return false;
+        }
+        // 初始密码(第三方登录用户)暂不提示修改
+        if (this.pwdResetTime == null) {
+            return false;
+        }
+        return this.pwdResetTime.plusDays(this.passwordExpirationDays).isBefore(LocalDateTime.now());
+    }
+}

+ 183 - 0
continew-common/src/main/java/top/continew/admin/common/context/UserContextHolder.java

@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.context;
+
+import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.extra.spring.SpringUtil;
+import top.continew.starter.core.util.ExceptionUtils;
+import top.continew.starter.extension.crud.service.CommonUserService;
+
+/**
+ * 用户上下文 Holder
+ *
+ * @author Charles7c
+ * @since 2022/12/24 12:58
+ */
+public class UserContextHolder {
+
+    private static final ThreadLocal<UserContext> CONTEXT_HOLDER = new ThreadLocal<>();
+    private static final ThreadLocal<UserExtraContext> EXTRA_CONTEXT_HOLDER = new ThreadLocal<>();
+
+    private UserContextHolder() {
+    }
+
+    /**
+     * 设置上下文
+     *
+     * @param context 上下文
+     */
+    public static void setContext(UserContext context) {
+        setContext(context, true);
+    }
+
+    /**
+     * 设置上下文
+     *
+     * @param context  上下文
+     * @param isUpdate 是否更新
+     */
+    public static void setContext(UserContext context, boolean isUpdate) {
+        CONTEXT_HOLDER.set(context);
+        if (isUpdate) {
+            StpUtil.getSessionByLoginId(context.getId()).set(SaSession.USER, context);
+        }
+    }
+
+    /**
+     * 获取上下文
+     *
+     * @return 上下文
+     */
+    public static UserContext getContext() {
+        UserContext context = CONTEXT_HOLDER.get();
+        if (null == context) {
+            context = StpUtil.getSession().getModel(SaSession.USER, UserContext.class);
+            CONTEXT_HOLDER.set(context);
+        }
+        return context;
+    }
+
+    /**
+     * 获取指定用户的上下文
+     *
+     * @param userId 用户 ID
+     * @return 上下文
+     */
+    public static UserContext getContext(Long userId) {
+        SaSession session = StpUtil.getSessionByLoginId(userId, false);
+        if (null == session) {
+            return null;
+        }
+        return session.getModel(SaSession.USER, UserContext.class);
+    }
+
+    /**
+     * 设置额外上下文
+     *
+     * @param context 额外上下文
+     */
+    public static void setExtraContext(UserExtraContext context) {
+        EXTRA_CONTEXT_HOLDER.set(context);
+    }
+
+    /**
+     * 获取额外上下文
+     *
+     * @return 额外上下文
+     */
+    public static UserExtraContext getExtraContext() {
+        UserExtraContext context = EXTRA_CONTEXT_HOLDER.get();
+        if (null == context) {
+            context = getExtraContext(StpUtil.getTokenValue());
+            EXTRA_CONTEXT_HOLDER.set(context);
+        }
+        return context;
+    }
+
+    /**
+     * 获取额外上下文
+     *
+     * @param token 令牌
+     * @return 额外上下文
+     */
+    public static UserExtraContext getExtraContext(String token) {
+        UserExtraContext context = new UserExtraContext();
+        context.setIp(Convert.toStr(StpUtil.getExtra(token, "ip")));
+        context.setAddress(Convert.toStr(StpUtil.getExtra(token, "address")));
+        context.setBrowser(Convert.toStr(StpUtil.getExtra(token, "browser")));
+        context.setOs(Convert.toStr(StpUtil.getExtra(token, "os")));
+        context.setLoginTime(Convert.toLocalDateTime(StpUtil.getExtra(token, "loginTime")));
+        return context;
+    }
+
+    /**
+     * 清除上下文
+     */
+    public static void clearContext() {
+        CONTEXT_HOLDER.remove();
+        EXTRA_CONTEXT_HOLDER.remove();
+    }
+
+    /**
+     * 获取用户 ID
+     *
+     * @return 用户 ID
+     */
+    public static Long getUserId() {
+        return ExceptionUtils.exToNull(() -> getContext().getId());
+    }
+
+    /**
+     * 获取用户名
+     *
+     * @return 用户名
+     */
+    public static String getUsername() {
+        return ExceptionUtils.exToNull(() -> getContext().getUsername());
+    }
+
+    /**
+     * 获取用户昵称
+     *
+     * @return 用户昵称
+     */
+    public static String getNickname() {
+        return getNickname(getUserId());
+    }
+
+    /**
+     * 获取用户昵称
+     *
+     * @param userId 登录用户 ID
+     * @return 用户昵称
+     */
+    public static String getNickname(Long userId) {
+        return ExceptionUtils.exToNull(() -> SpringUtil.getBean(CommonUserService.class).getNicknameById(userId));
+    }
+
+    /**
+     * 是否为管理员
+     *
+     * @return 是否为管理员
+     */
+    public static boolean isAdmin() {
+        StpUtil.checkLogin();
+        return getContext().isAdmin();
+    }
+}

+ 77 - 0
continew-common/src/main/java/top/continew/admin/common/context/UserExtraContext.java

@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.context;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.JakartaServletUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import top.continew.starter.core.util.ExceptionUtils;
+import top.continew.starter.core.util.IpUtils;
+import top.continew.starter.web.util.ServletUtils;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 用户额外上下文
+ *
+ * @author Charles7c
+ * @since 2024/10/9 20:29
+ */
+@Data
+@NoArgsConstructor
+public class UserExtraContext implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * IP
+     */
+    private String ip;
+
+    /**
+     * IP 归属地
+     */
+    private String address;
+
+    /**
+     * 浏览器
+     */
+    private String browser;
+
+    /**
+     * 操作系统
+     */
+    private String os;
+
+    /**
+     * 登录时间
+     */
+    private LocalDateTime loginTime;
+
+    public UserExtraContext(HttpServletRequest request) {
+        this.ip = JakartaServletUtil.getClientIP(request);
+        this.address = ExceptionUtils.exToNull(() -> IpUtils.getIpv4Address(this.ip));
+        this.setBrowser(ServletUtils.getBrowser(request));
+        this.setLoginTime(LocalDateTime.now());
+        this.setOs(StrUtil.subBefore(ServletUtils.getOs(request), " or", false));
+    }
+}

+ 60 - 0
continew-common/src/main/java/top/continew/admin/common/enums/DataScopeEnum.java

@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import top.continew.starter.core.enums.BaseEnum;
+
+/**
+ * 数据权限枚举
+ *
+ * @author Charles7c
+ * @since 2023/2/8 22:58
+ */
+@Getter
+@RequiredArgsConstructor
+public enum DataScopeEnum implements BaseEnum<Integer> {
+
+    /**
+     * 全部数据权限
+     */
+    ALL(1, "全部数据权限"),
+
+    /**
+     * 本部门及以下数据权限
+     */
+    DEPT_AND_CHILD(2, "本部门及以下数据权限"),
+
+    /**
+     * 本部门数据权限
+     */
+    DEPT(3, "本部门数据权限"),
+
+    /**
+     * 仅本人数据权限
+     */
+    SELF(4, "仅本人数据权限"),
+
+    /**
+     * 自定义数据权限
+     */
+    CUSTOM(5, "自定义数据权限"),;
+
+    private final Integer value;
+    private final String description;
+}

+ 47 - 0
continew-common/src/main/java/top/continew/admin/common/enums/DisEnableStatusEnum.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import top.continew.admin.common.constant.UiConstants;
+import top.continew.starter.core.enums.BaseEnum;
+
+/**
+ * 启用/禁用状态枚举
+ *
+ * @author Charles7c
+ * @since 2022/12/29 22:38
+ */
+@Getter
+@RequiredArgsConstructor
+public enum DisEnableStatusEnum implements BaseEnum<Integer> {
+
+    /**
+     * 启用
+     */
+    ENABLE(1, "启用", UiConstants.COLOR_SUCCESS),
+
+    /**
+     * 禁用
+     */
+    DISABLE(2, "禁用", UiConstants.COLOR_ERROR),;
+
+    private final Integer value;
+    private final String description;
+    private final String color;
+}

+ 50 - 0
continew-common/src/main/java/top/continew/admin/common/enums/GenderEnum.java

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import top.continew.starter.core.enums.BaseEnum;
+
+/**
+ * 性别枚举
+ *
+ * @author Charles7c
+ * @since 2022/12/29 21:59
+ */
+@Getter
+@RequiredArgsConstructor
+public enum GenderEnum implements BaseEnum<Integer> {
+
+    /**
+     * 未知
+     */
+    UNKNOWN(0, "未知"),
+
+    /**
+     * 男
+     */
+    MALE(1, "男"),
+
+    /**
+     * 女
+     */
+    FEMALE(2, "女"),;
+
+    private final Integer value;
+    private final String description;
+}

+ 47 - 0
continew-common/src/main/java/top/continew/admin/common/enums/SuccessFailureStatusEnum.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import top.continew.admin.common.constant.UiConstants;
+import top.continew.starter.core.enums.BaseEnum;
+
+/**
+ * 成功/失败状态枚举
+ *
+ * @author Charles7c
+ * @since 2023/2/26 21:35
+ */
+@Getter
+@RequiredArgsConstructor
+public enum SuccessFailureStatusEnum implements BaseEnum<Integer> {
+
+    /**
+     * 成功
+     */
+    SUCCESS(1, "成功", UiConstants.COLOR_SUCCESS),
+
+    /**
+     * 失败
+     */
+    FAILURE(2, "失败", UiConstants.COLOR_ERROR),;
+
+    private final Integer value;
+    private final String description;
+    private final String color;
+}

+ 107 - 0
continew-common/src/main/java/top/continew/admin/common/util/SecureUtils.java

@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.common.util;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.asymmetric.KeyType;
+import cn.hutool.extra.spring.SpringUtil;
+import top.continew.admin.common.config.properties.RsaProperties;
+import top.continew.starter.core.exception.BusinessException;
+import top.continew.starter.core.validation.ValidationUtils;
+import top.continew.starter.security.crypto.autoconfigure.CryptoProperties;
+import top.continew.starter.security.crypto.encryptor.AesEncryptor;
+import top.continew.starter.security.crypto.encryptor.IEncryptor;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 加密/解密工具类
+ *
+ * @author Charles7c
+ * @since 2022/12/21 21:41
+ */
+public class SecureUtils {
+
+    private SecureUtils() {
+    }
+
+    /**
+     * 公钥加密
+     *
+     * @param data 要加密的内容
+     * @return 加密后的内容
+     */
+    public static String encryptByRsaPublicKey(String data) {
+        String publicKey = RsaProperties.PUBLIC_KEY;
+        ValidationUtils.throwIfBlank(publicKey, "请配置 RSA 公钥");
+        return encryptByRsaPublicKey(data, publicKey);
+    }
+
+    /**
+     * 私钥解密
+     *
+     * @param data 要解密的内容(Base64 加密过)
+     * @return 解密后的内容
+     */
+    public static String decryptByRsaPrivateKey(String data) {
+        String privateKey = RsaProperties.PRIVATE_KEY;
+        ValidationUtils.throwIfBlank(privateKey, "请配置 RSA 私钥");
+        return decryptByRsaPrivateKey(data, privateKey);
+    }
+
+    /**
+     * 公钥加密
+     *
+     * @param data      要加密的内容
+     * @param publicKey 公钥
+     * @return 加密后的内容
+     */
+    public static String encryptByRsaPublicKey(String data, String publicKey) {
+        return new String(SecureUtil.rsa(null, publicKey).encrypt(data, KeyType.PublicKey));
+    }
+
+    /**
+     * 私钥解密
+     *
+     * @param data       要解密的内容(Base64 加密过)
+     * @param privateKey 私钥
+     * @return 解密后的内容
+     */
+    public static String decryptByRsaPrivateKey(String data, String privateKey) {
+        return new String(SecureUtil.rsa(privateKey, null).decrypt(Base64.decode(data), KeyType.PrivateKey));
+    }
+
+    /**
+     * 对普通加密字段列表进行AES加密,优化starter加密模块后优化这个方法
+     *
+     * @param values 待加密内容
+     * @return 加密后内容
+     */
+    public static List<String> encryptFieldByAes(List<String> values) {
+        IEncryptor encryptor = new AesEncryptor();
+        CryptoProperties properties = SpringUtil.getBean(CryptoProperties.class);
+        return values.stream().map(value -> {
+            try {
+                return encryptor.encrypt(value, properties.getPassword(), properties.getPublicKey());
+            } catch (Exception e) {
+                throw new BusinessException("字段加密异常");
+            }
+        }).collect(Collectors.toList());
+    }
+}

+ 52 - 0
continew-extension/continew-extension-schedule-server/pom.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         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>
+    <parent>
+        <groupId>top.continew</groupId>
+        <artifactId>continew-extension</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>continew-extension-schedule-server</artifactId>
+    <description>任务调度服务端</description>
+
+    <properties>
+        <!-- SnailJob 服务端 -->
+        <snail-job.version>1.1.2</snail-job.version>
+    </properties>
+
+    <dependencies>
+        <!-- SnailJob(灵活,可靠和快速的分布式任务重试和分布式任务调度平台) -->
+        <dependency>
+            <groupId>com.aizuda</groupId>
+            <artifactId>snail-job-server-starter</artifactId>
+            <version>${snail-job.version}</version>
+        </dependency>
+
+        <!-- Liquibase(用于管理数据库版本,跟踪、管理和应用数据库变化) -->
+        <dependency>
+            <groupId>org.liquibase</groupId>
+            <artifactId>liquibase-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <!-- 设置构建的 jar 包名 -->
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 58 - 0
continew-extension/continew-extension-schedule-server/src/main/java/top/continew/admin/extension/scheduling/ScheduleServerApplication.java

@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.extension.scheduling;
+
+import cn.hutool.core.net.NetUtil;
+import cn.hutool.core.util.URLUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
+
+/**
+ * 任务调度服务端启动程序
+ *
+ * @author KAI
+ * @since 2024/6/25 22:24
+ */
+@Slf4j
+@SpringBootApplication
+@RequiredArgsConstructor
+public class ScheduleServerApplication extends com.aizuda.snailjob.server.SnailJobServerApplication implements ApplicationRunner {
+
+    private final ServerProperties serverProperties;
+
+    public static void main(String[] args) {
+        SpringApplication.run(ScheduleServerApplication.class, args);
+    }
+
+    @Override
+    public void run(ApplicationArguments args) {
+        String hostAddress = NetUtil.getLocalhostStr();
+        Integer port = serverProperties.getPort();
+        String contextPath = serverProperties.getServlet().getContextPath();
+        String baseUrl = URLUtil.normalize("%s:%s%s".formatted(hostAddress, port, contextPath));
+        log.info("----------------------------------------------");
+        log.info("{} service started successfully.", SpringUtil.getApplicationName());
+        log.info("访问地址:{}", baseUrl);
+        log.info("----------------------------------------------");
+    }
+}

+ 58 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/config/application-dev.yml

@@ -0,0 +1,58 @@
+server:
+  port: 8001
+
+--- ### 数据源配置
+spring.datasource:
+  url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:continew_admin_job}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=10&failOverReadOnly=false
+  username: ${DB_USER:root}
+  password: ${DB_PWD:123456}
+  driver-class-name: com.mysql.cj.jdbc.Driver
+#  # PostgreSQL 配置
+#  url: jdbc:postgresql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:continew_admin_job}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=10&failOverReadOnly=false
+#  username: ${DB_USER:root}
+#  password: ${DB_PWD:123456}
+#  driver-class-name: org.postgresql.Driver
+## Liquibase 配置
+spring.liquibase:
+  # 是否启用
+  enabled: true
+  # 配置文件路径
+  change-log: classpath:/db/changelog/db.changelog-master.yaml
+
+--- ### Snail Job 服务端配置
+snail-job:
+  # Netty 端口
+  netty-port: 1788
+  # 合并日志默认保存天数
+  merge-Log-days: 1
+  # 合并日志默认的条数
+  merge-Log-num: 500
+  # 配置日志保存时间(单位:天)
+  log-storage: 90
+  # 配置每批次拉取重试数据的大小
+  retry-pull-page-size: 100
+  # 配置一个客户端每秒最多接收的重试数量指令
+  limiter: 10
+  # 配置号段模式下的步长
+  step: 100
+  # bucket 的总数量
+  bucket-total: 128
+  # Dashboard 任务容错天数
+  summary-day: 7
+  # 配置负载均衡周期时间
+  load-balance-cycle-time: 10
+  ## 回调配置
+  callback:
+    # 回调 uniqueId 前缀
+    prefix: CB
+    # 配置回调的最大执行次数
+    max-count: 288
+    # 配置回调触发的间隔时间
+    trigger-interval: 900
+
+--- ### 日志配置
+logging:
+  level:
+    com.aizuda.snailjob: DEBUG
+  file:
+    path: ./logs

+ 58 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/config/application-prod.yml

@@ -0,0 +1,58 @@
+server:
+  port: 18001
+
+--- ### 数据源配置
+spring.datasource:
+  url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:continew_admin_job}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=10&failOverReadOnly=false
+  username: ${DB_USER:root}
+  password: ${DB_PWD:123456}
+  driver-class-name: com.mysql.cj.jdbc.Driver
+#  # PostgreSQL 配置
+#  url: jdbc:postgresql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:continew_admin_job}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=10&failOverReadOnly=false
+#  username: ${DB_USER:root}
+#  password: ${DB_PWD:123456}
+#  driver-class-name: org.postgresql.Driver
+## Liquibase 配置
+spring.liquibase:
+  # 是否启用
+  enabled: true
+  # 配置文件路径
+  change-log: classpath:/db/changelog/db.changelog-master.yaml
+
+--- ### Snail Job 服务端配置
+snail-job:
+  # Netty 端口
+  netty-port: 1788
+  # 合并日志默认保存天数
+  merge-Log-days: 1
+  # 合并日志默认的条数
+  merge-Log-num: 500
+  # 配置日志保存时间(单位:天)
+  log-storage: 90
+  # 配置每批次拉取重试数据的大小
+  retry-pull-page-size: 100
+  # 配置一个客户端每秒最多接收的重试数量指令
+  limiter: 10
+  # 配置号段模式下的步长
+  step: 100
+  # bucket 的总数量
+  bucket-total: 128
+  # Dashboard 任务容错天数
+  summary-day: 7
+  # 配置负载均衡周期时间
+  load-balance-cycle-time: 10
+  ## 回调配置
+  callback:
+    # 回调 uniqueId 前缀
+    prefix: CB
+    # 配置回调的最大执行次数
+    max-count: 288
+    # 配置回调触发的间隔时间
+    trigger-interval: 900
+
+--- ### 日志配置
+logging:
+  level:
+    com.aizuda.snailjob: INFO
+  file:
+    path: ../logs

+ 12 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/config/application.yml

@@ -0,0 +1,12 @@
+--- ### Spring 配置
+spring:
+  application:
+    name: continew-admin-job-server
+  ## 环境配置
+  profiles:
+    # 启用的环境
+    active: dev
+
+--- ### 日志配置
+logging:
+  config: classpath:logback-spring.xml

+ 5 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/db.changelog-master.yaml

@@ -0,0 +1,5 @@
+databaseChangeLog:
+  - include:
+      file: db/changelog/mysql/snail-job_table.sql
+  - include:
+      file: db/changelog/mysql/snail-job_data.sql

+ 14 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/mysql/snail-job_data.sql

@@ -0,0 +1,14 @@
+-- liquibase formatted sql
+
+-- changeset snail-job-server:1.1.0
+-- 默认命名空间:Default
+INSERT INTO `sj_namespace` (`id`, `name`, `unique_id`, `create_dt`, `update_dt`, `deleted`)
+VALUES (1, 'Default', '764d604ec6fc45f68cd92514c40e9e1a', NOW(), NOW(), 0);
+
+-- 默认分组:continew-admin
+INSERT INTO `sj_group_config` (`id`, `namespace_id`, `group_name`, `description`, `token`, `group_status`, `version`, `group_partition`, `id_generator_mode`, `init_scene`, `bucket_index`, `create_dt`, `update_dt`)
+VALUES (1, '764d604ec6fc45f68cd92514c40e9e1a', 'continew-admin', '默认分组', 'SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj', 1, 1, 0, 2, 1, 119, NOW(), NOW());
+
+-- 默认用户:admin/admin
+INSERT INTO `sj_system_user` (username, password, role)
+VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2);

+ 518 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/mysql/snail-job_table.sql

@@ -0,0 +1,518 @@
+-- liquibase formatted sql
+
+-- changeset snail-job-server:1.1.0
+SET NAMES utf8mb4;
+
+CREATE TABLE `sj_namespace`
+(
+    `id`          bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `name`        varchar(64)         NOT NULL COMMENT '名称',
+    `unique_id`   varchar(64)         NOT NULL COMMENT '唯一id',
+    `description` varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',
+    `deleted`     tinyint(4)          NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除',
+    `create_dt`   datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`   datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_name` (`name`),
+    UNIQUE KEY `uk_unique_id` (`unique_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='命名空间';
+
+CREATE TABLE `sj_group_config`
+(
+    `id`                bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`      varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`        varchar(64)         NOT NULL DEFAULT '' COMMENT '组名称',
+    `description`       varchar(256)        NOT NULL DEFAULT '' COMMENT '组描述',
+    `token`             varchar(64)         NOT NULL DEFAULT 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT' COMMENT 'token',
+    `group_status`      tinyint(4)          NOT NULL DEFAULT 0 COMMENT '组状态 0、未启用 1、启用',
+    `version`           int(11)             NOT NULL COMMENT '版本号',
+    `group_partition`   int(11)             NOT NULL COMMENT '分区',
+    `id_generator_mode` tinyint(4)          NOT NULL DEFAULT 1 COMMENT '唯一id生成模式 默认号段模式',
+    `init_scene`        tinyint(4)          NOT NULL DEFAULT 0 COMMENT '是否初始化场景 0:否 1:是',
+    `bucket_index`      int(11)             NOT NULL DEFAULT 0 COMMENT 'bucket',
+    `create_dt`         datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`         datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `uk_namespace_id_group_name` (`namespace_id`, `group_name`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='组配置'
+;
+
+CREATE TABLE `sj_notify_config`
+(
+    `id`                     bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`           varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`             varchar(64)         NOT NULL COMMENT '组名称',
+    `business_id`            varchar(64)         NOT NULL COMMENT '业务id (job_id或workflow_id或scene_name)',
+    `system_task_type`       tinyint(4)          NOT NULL DEFAULT 3 COMMENT '任务类型 1. 重试任务 2. 重试回调 3、JOB任务 4、WORKFLOW任务',
+    `notify_status`          tinyint(4)          NOT NULL DEFAULT 0 COMMENT '通知状态 0、未启用 1、启用',
+    `recipient_ids`          varchar(128)        NOT NULL COMMENT '接收人id列表',
+    `notify_threshold`       int(11)             NOT NULL DEFAULT 0 COMMENT '通知阈值',
+    `notify_scene`           tinyint(4)          NOT NULL DEFAULT 0 COMMENT '通知场景',
+    `rate_limiter_status`    tinyint(4)          NOT NULL DEFAULT 0 COMMENT '限流状态 0、未启用 1、启用',
+    `rate_limiter_threshold` int(11)             NOT NULL DEFAULT 0 COMMENT '每秒限流阈值',
+    `description`            varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',
+    `create_dt`              datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`              datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `business_id`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='通知配置'
+;
+
+CREATE TABLE `sj_notify_recipient`
+(
+    `id`               bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`     varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `recipient_name`   varchar(64)         NOT NULL COMMENT '接收人名称',
+    `notify_type`      tinyint(4)          NOT NULL DEFAULT 0 COMMENT '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书 5 webhook',
+    `notify_attribute` varchar(512)        NOT NULL COMMENT '配置属性',
+    `description`      varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',
+    `create_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_namespace_id` (`namespace_id`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='告警通知接收人'
+;
+
+
+CREATE TABLE `sj_retry_dead_letter_0`
+(
+    `id`            bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`  varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `unique_id`     varchar(64)         NOT NULL COMMENT '同组下id唯一',
+    `group_name`    varchar(64)         NOT NULL COMMENT '组名称',
+    `scene_name`    varchar(64)         NOT NULL COMMENT '场景名称',
+    `idempotent_id` varchar(64)         NOT NULL COMMENT '幂等id',
+    `biz_no`        varchar(64)         NOT NULL DEFAULT '' COMMENT '业务编号',
+    `executor_name` varchar(512)        NOT NULL DEFAULT '' COMMENT '执行器名称',
+    `args_str`      text                NOT NULL COMMENT '执行方法参数',
+    `ext_attrs`     text                NOT NULL COMMENT '扩展字段',
+    `task_type`     tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
+    `create_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
+    KEY `idx_idempotent_id` (`idempotent_id`),
+    KEY `idx_biz_no` (`biz_no`),
+    KEY `idx_create_dt` (`create_dt`),
+    UNIQUE KEY `uk_namespace_id_group_name_unique_id` (`namespace_id`, `group_name`, `unique_id`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='死信队列表'
+;
+
+CREATE TABLE `sj_retry_task_0`
+(
+    `id`              bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`    varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `unique_id`       varchar(64)         NOT NULL COMMENT '同组下id唯一',
+    `group_name`      varchar(64)         NOT NULL COMMENT '组名称',
+    `scene_name`      varchar(64)         NOT NULL COMMENT '场景名称',
+    `idempotent_id`   varchar(64)         NOT NULL COMMENT '幂等id',
+    `biz_no`          varchar(64)         NOT NULL DEFAULT '' COMMENT '业务编号',
+    `executor_name`   varchar(512)        NOT NULL DEFAULT '' COMMENT '执行器名称',
+    `args_str`        text                NOT NULL COMMENT '执行方法参数',
+    `ext_attrs`       text                NOT NULL COMMENT '扩展字段',
+    `next_trigger_at` datetime            NOT NULL COMMENT '下次触发时间',
+    `retry_count`     int(11)             NOT NULL DEFAULT 0 COMMENT '重试次数',
+    `retry_status`    tinyint(4)          NOT NULL DEFAULT 0 COMMENT '重试状态 0、重试中 1、成功 2、最大重试次数',
+    `task_type`       tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
+    `create_dt`       datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`       datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
+    KEY `idx_namespace_id_group_name_task_type` (`namespace_id`, `group_name`, `task_type`),
+    KEY `idx_namespace_id_group_name_retry_status` (`namespace_id`, `group_name`, `retry_status`),
+    KEY `idx_idempotent_id` (`idempotent_id`),
+    KEY `idx_biz_no` (`biz_no`),
+    KEY `idx_create_dt` (`create_dt`),
+    UNIQUE KEY `uk_name_unique_id` (`namespace_id`, `group_name`, `unique_id`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='任务表'
+;
+
+CREATE TABLE `sj_retry_task_log`
+(
+    `id`            bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`  varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `unique_id`     varchar(64)         NOT NULL COMMENT '同组下id唯一',
+    `group_name`    varchar(64)         NOT NULL COMMENT '组名称',
+    `scene_name`    varchar(64)         NOT NULL COMMENT '场景名称',
+    `idempotent_id` varchar(64)         NOT NULL COMMENT '幂等id',
+    `biz_no`        varchar(64)         NOT NULL DEFAULT '' COMMENT '业务编号',
+    `executor_name` varchar(512)        NOT NULL DEFAULT '' COMMENT '执行器名称',
+    `args_str`      text                NOT NULL COMMENT '执行方法参数',
+    `ext_attrs`     text                NOT NULL COMMENT '扩展字段',
+    `retry_status`  tinyint(4)          NOT NULL DEFAULT 0 COMMENT '重试状态 0、重试中 1、成功 2、最大次数',
+    `task_type`     tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
+    `create_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
+    KEY `idx_retry_status` (`retry_status`),
+    KEY `idx_idempotent_id` (`idempotent_id`),
+    KEY `idx_unique_id` (`unique_id`),
+    KEY `idx_biz_no` (`biz_no`),
+    KEY `idx_create_dt` (`create_dt`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='任务日志基础信息表'
+;
+
+CREATE TABLE `sj_retry_task_log_message`
+(
+    `id`           bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id` varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`   varchar(64)         NOT NULL COMMENT '组名称',
+    `unique_id`    varchar(64)         NOT NULL COMMENT '同组下id唯一',
+    `message`      longtext            NOT NULL COMMENT '异常信息',
+    `log_num`      int(11)             NOT NULL DEFAULT 1 COMMENT '日志数量',
+    `real_time`    bigint(13)          NOT NULL DEFAULT 0 COMMENT '上报时间',
+    `create_dt`    datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `unique_id`),
+    KEY `idx_create_dt` (`create_dt`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='任务调度日志信息记录表'
+;
+
+CREATE TABLE `sj_retry_scene_config`
+(
+    `id`               bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`     varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `scene_name`       varchar(64)         NOT NULL COMMENT '场景名称',
+    `group_name`       varchar(64)         NOT NULL COMMENT '组名称',
+    `scene_status`     tinyint(4)          NOT NULL DEFAULT 0 COMMENT '组状态 0、未启用 1、启用',
+    `max_retry_count`  int(11)             NOT NULL DEFAULT 5 COMMENT '最大重试次数',
+    `back_off`         tinyint(4)          NOT NULL DEFAULT 1 COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式',
+    `trigger_interval` varchar(16)         NOT NULL DEFAULT '' COMMENT '间隔时长',
+    `deadline_request` bigint(20) unsigned NOT NULL DEFAULT 60000 COMMENT 'Deadline Request 调用链超时 单位毫秒',
+    `executor_timeout` int(11) unsigned    NOT NULL DEFAULT 5 COMMENT '任务执行超时时间,单位秒',
+    `route_key`        tinyint(4)          NOT NULL DEFAULT 4 COMMENT '路由策略',
+    `description`      varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',
+    `create_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `uk_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='场景配置'
+;
+
+CREATE TABLE `sj_server_node`
+(
+    `id`           bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id` varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`   varchar(64)         NOT NULL COMMENT '组名称',
+    `host_id`      varchar(64)         NOT NULL COMMENT '主机id',
+    `host_ip`      varchar(64)         NOT NULL COMMENT '机器ip',
+    `host_port`    int(16)             NOT NULL COMMENT '机器端口',
+    `expire_at`    datetime            NOT NULL COMMENT '过期时间',
+    `node_type`    tinyint(4)          NOT NULL COMMENT '节点类型 1、客户端 2、是服务端',
+    `ext_attrs`    varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段',
+    `create_dt`    datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`    datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`),
+    KEY `idx_expire_at_node_type` (`expire_at`, `node_type`),
+    UNIQUE KEY `uk_host_id_host_ip` (`host_id`, `host_ip`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='服务器节点'
+;
+
+CREATE TABLE `sj_distributed_lock`
+(
+    `name`       varchar(64)         NOT NULL COMMENT '锁名称',
+    `lock_until` timestamp(3)        NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '锁定时长',
+    `locked_at`  timestamp(3)        NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '锁定时间',
+    `locked_by`  varchar(255)        NOT NULL COMMENT '锁定者',
+    `create_dt`  datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`  datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`name`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='锁定表'
+;
+
+CREATE TABLE `sj_system_user`
+(
+    `id`        bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `username`  varchar(64)         NOT NULL COMMENT '账号',
+    `password`  varchar(128)        NOT NULL COMMENT '密码',
+    `role`      tinyint(4)          NOT NULL DEFAULT 0 COMMENT '角色:1-普通用户、2-管理员',
+    `create_dt` datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt` datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `uk_username` (`username`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='系统用户表';
+
+CREATE TABLE `sj_system_user_permission`
+(
+    `id`             bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `group_name`     varchar(64)         NOT NULL COMMENT '组名称',
+    `namespace_id`   varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `system_user_id` bigint(20)          NOT NULL COMMENT '系统用户id',
+    `create_dt`      datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`      datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `uk_namespace_id_group_name_system_user_id` (`namespace_id`, `group_name`, `system_user_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='系统用户权限表';
+
+CREATE TABLE `sj_sequence_alloc`
+(
+    `id`           bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id` varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`   varchar(64)         NOT NULL DEFAULT '' COMMENT '组名称',
+    `max_id`       bigint(20)          NOT NULL DEFAULT 1 COMMENT '最大id',
+    `step`         int(11)             NOT NULL DEFAULT 100 COMMENT '步长',
+    `update_dt`    datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `uk_namespace_id_group_name` (`namespace_id`, `group_name`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='号段模式序号ID分配表';
+
+-- 分布式调度DDL
+CREATE TABLE `sj_job`
+(
+    `id`               bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`     varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`       varchar(64)         NOT NULL COMMENT '组名称',
+    `job_name`         varchar(64)         NOT NULL COMMENT '名称',
+    `args_str`         text                         DEFAULT NULL COMMENT '执行方法参数',
+    `args_type`        tinyint(4)          NOT NULL DEFAULT 1 COMMENT '参数类型 ',
+    `next_trigger_at`  bigint(13)          NOT NULL COMMENT '下次触发时间',
+    `job_status`       tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务状态 0、关闭、1、开启',
+    `task_type`        tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务类型 1、集群 2、广播 3、切片',
+    `route_key`        tinyint(4)          NOT NULL DEFAULT 4 COMMENT '路由策略',
+    `executor_type`    tinyint(4)          NOT NULL DEFAULT 1 COMMENT '执行器类型',
+    `executor_info`    varchar(255)                 DEFAULT NULL COMMENT '执行器名称',
+    `trigger_type`     tinyint(4)          NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
+    `trigger_interval` varchar(255)        NOT NULL COMMENT '间隔时长',
+    `block_strategy`   tinyint(4)          NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
+    `executor_timeout` int(11)             NOT NULL DEFAULT 0 COMMENT '任务执行超时时间,单位秒',
+    `max_retry_times`  int(11)             NOT NULL DEFAULT 0 COMMENT '最大重试次数',
+    `parallel_num`     int(11)             NOT NULL DEFAULT 1 COMMENT '并行数',
+    `retry_interval`   int(11)             NOT NULL DEFAULT 0 COMMENT '重试间隔(s)',
+    `bucket_index`     int(11)             NOT NULL DEFAULT 0 COMMENT 'bucket',
+    `resident`         tinyint(4)          NOT NULL DEFAULT 0 COMMENT '是否是常驻任务',
+    `description`      varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',
+    `ext_attrs`        varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段',
+    `deleted`          tinyint(4)          NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除',
+    `create_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`),
+    KEY `idx_job_status_bucket_index` (`job_status`, `bucket_index`),
+    KEY `idx_create_dt` (`create_dt`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='任务信息';
+
+CREATE TABLE `sj_job_log_message`
+(
+    `id`            bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`  varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`    varchar(64)         NOT NULL COMMENT '组名称',
+    `job_id`        bigint(20)          NOT NULL COMMENT '任务信息id',
+    `task_batch_id` bigint(20)          NOT NULL COMMENT '任务批次id',
+    `task_id`       bigint(20)          NOT NULL COMMENT '调度任务id',
+    `message`       longtext            NOT NULL COMMENT '调度信息',
+    `log_num`       int(11)             NOT NULL DEFAULT 1 COMMENT '日志数量',
+    `real_time`     bigint(13)          NOT NULL DEFAULT 0 COMMENT '上报时间',
+    `ext_attrs`     varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段',
+    `create_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_task_batch_id_task_id` (`task_batch_id`, `task_id`),
+    KEY `idx_create_dt` (`create_dt`),
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='调度日志';
+
+CREATE TABLE `sj_job_task`
+(
+    `id`             bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`   varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`     varchar(64)         NOT NULL COMMENT '组名称',
+    `job_id`         bigint(20)          NOT NULL COMMENT '任务信息id',
+    `task_batch_id`  bigint(20)          NOT NULL COMMENT '调度任务id',
+    `parent_id`      bigint(20)          NOT NULL DEFAULT 0 COMMENT '父执行器id',
+    `task_status`    tinyint             NOT NULL DEFAULT 0 COMMENT '执行的状态 0、失败 1、成功',
+    `retry_count`    int(11)             NOT NULL DEFAULT 0 COMMENT '重试次数',
+    `mr_stage`       tinyint                      DEFAULT NULL COMMENT '动态分片所处阶段 1:map 2:reduce 3:mergeReduce',
+    `leaf`           tinyint             NOT NULL DEFAULT '1' COMMENT '叶子节点',
+    `task_name`      varchar(255)        NOT NULL DEFAULT '' COMMENT '任务名称',
+    `client_info`    varchar(128)                 DEFAULT NULL COMMENT '客户端地址 clientId#ip:port',
+    `wf_context`     text                         DEFAULT NULL COMMENT '工作流全局上下文',
+    `result_message` text                NOT NULL COMMENT '执行结果',
+    `args_str`       text                         DEFAULT NULL COMMENT '执行方法参数',
+    `args_type`      tinyint             NOT NULL DEFAULT 1 COMMENT '参数类型 ',
+    `ext_attrs`      varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段',
+    `create_dt`      datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`      datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_task_batch_id_task_status` (`task_batch_id`, `task_status`),
+    KEY `idx_create_dt` (`create_dt`),
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='任务实例';
+
+CREATE TABLE `sj_job_task_batch`
+(
+    `id`                      bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`            varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`              varchar(64)         NOT NULL COMMENT '组名称',
+    `job_id`                  bigint(20)          NOT NULL COMMENT '任务id',
+    `workflow_node_id`        bigint(20)          NOT NULL DEFAULT 0 COMMENT '工作流节点id',
+    `parent_workflow_node_id` bigint(20)          NOT NULL DEFAULT 0 COMMENT '工作流任务父批次id',
+    `workflow_task_batch_id`  bigint(20)          NOT NULL DEFAULT 0 COMMENT '工作流任务批次id',
+    `task_batch_status`       tinyint(4)          NOT NULL DEFAULT 0 COMMENT '任务批次状态 0、失败 1、成功',
+    `operation_reason`        tinyint(4)          NOT NULL DEFAULT 0 COMMENT '操作原因',
+    `execution_at`            bigint(13)          NOT NULL DEFAULT 0 COMMENT '任务执行时间',
+    `system_task_type`        tinyint(4)          NOT NULL DEFAULT 3 COMMENT '任务类型 3、JOB任务 4、WORKFLOW任务',
+    `parent_id`               varchar(64)         NOT NULL DEFAULT '' COMMENT '父节点',
+    `ext_attrs`               varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段',
+    `deleted`                 tinyint(4)          NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除',
+    `create_dt`               datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`               datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_job_id_task_batch_status` (`job_id`, `task_batch_status`),
+    KEY `idx_create_dt` (`create_dt`),
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`),
+    KEY `idx_workflow_task_batch_id_workflow_node_id` (`workflow_task_batch_id`, `workflow_node_id`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='任务批次';
+
+CREATE TABLE `sj_job_summary`
+(
+    `id`               bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`     VARCHAR(64)     NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`       VARCHAR(64)     NOT NULL DEFAULT '' COMMENT '组名称',
+    `business_id`      bigint          NOT NULL COMMENT '业务id (job_id或workflow_id)',
+    `system_task_type` tinyint(4)      NOT NULL DEFAULT 3 COMMENT '任务类型 3、JOB任务 4、WORKFLOW任务',
+    `trigger_at`       datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '统计时间',
+    `success_num`      int             NOT NULL DEFAULT 0 COMMENT '执行成功-日志数量',
+    `fail_num`         int             NOT NULL DEFAULT 0 COMMENT '执行失败-日志数量',
+    `fail_reason`      varchar(512)    NOT NULL DEFAULT '' COMMENT '失败原因',
+    `stop_num`         int             NOT NULL DEFAULT 0 COMMENT '执行失败-日志数量',
+    `stop_reason`      varchar(512)    NOT NULL DEFAULT '' COMMENT '失败原因',
+    `cancel_num`       int             NOT NULL DEFAULT 0 COMMENT '执行失败-日志数量',
+    `cancel_reason`    varchar(512)    NOT NULL DEFAULT '' COMMENT '失败原因',
+    `create_dt`        datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`        datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_namespace_id_group_name_business_id` (`namespace_id`, `group_name`, business_id),
+    UNIQUE KEY `uk_trigger_at_system_task_type_business_id` (`trigger_at`, `system_task_type`, `business_id`) USING BTREE
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 1
+  DEFAULT CHARSET = utf8mb4 COMMENT ='DashBoard_Job';
+
+CREATE TABLE `sj_retry_summary`
+(
+    `id`            bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`  VARCHAR(64)     NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`    VARCHAR(64)     NOT NULL DEFAULT '' COMMENT '组名称',
+    `scene_name`    VARCHAR(50)     NOT NULL DEFAULT '' COMMENT '场景名称',
+    `trigger_at`    datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '统计时间',
+    `running_num`   int             NOT NULL DEFAULT 0 COMMENT '重试中-日志数量',
+    `finish_num`    int             NOT NULL DEFAULT 0 COMMENT '重试完成-日志数量',
+    `max_count_num` int             NOT NULL DEFAULT 0 COMMENT '重试到达最大次数-日志数量',
+    `suspend_num`   int             NOT NULL DEFAULT 0 COMMENT '暂停重试-日志数量',
+    `create_dt`     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_trigger_at` (`trigger_at`),
+    UNIQUE KEY `uk_scene_name_trigger_at` (`namespace_id`, `group_name`, `scene_name`, `trigger_at`) USING BTREE
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 1
+  DEFAULT CHARSET = utf8mb4 COMMENT ='DashBoard_Retry';
+
+CREATE TABLE `sj_workflow`
+(
+    `id`               bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `workflow_name`    varchar(64)         NOT NULL COMMENT '工作流名称',
+    `namespace_id`     varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`       varchar(64)         NOT NULL COMMENT '组名称',
+    `workflow_status`  tinyint(4)          NOT NULL DEFAULT 1 COMMENT '工作流状态 0、关闭、1、开启',
+    `trigger_type`     tinyint(4)          NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
+    `trigger_interval` varchar(255)        NOT NULL COMMENT '间隔时长',
+    `next_trigger_at`  bigint(13)          NOT NULL COMMENT '下次触发时间',
+    `block_strategy`   tinyint(4)          NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
+    `executor_timeout` int(11)             NOT NULL DEFAULT 0 COMMENT '任务执行超时时间,单位秒',
+    `description`      varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',
+    `flow_info`        text                         DEFAULT NULL COMMENT '流程信息',
+    `wf_context`       text                         DEFAULT NULL COMMENT '上下文',
+    `bucket_index`     int(11)             NOT NULL DEFAULT 0 COMMENT 'bucket',
+    `version`          int(11)             NOT NULL COMMENT '版本号',
+    `ext_attrs`        varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段',
+    `deleted`          tinyint(4)          NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除',
+    `create_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_create_dt` (`create_dt`),
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='工作流';
+
+CREATE TABLE `sj_workflow_node`
+(
+    `id`                   bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`         varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `node_name`            varchar(64)         NOT NULL COMMENT '节点名称',
+    `group_name`           varchar(64)         NOT NULL COMMENT '组名称',
+    `job_id`               bigint(20)          NOT NULL COMMENT '任务信息id',
+    `workflow_id`          bigint(20)          NOT NULL COMMENT '工作流ID',
+    `node_type`            tinyint(4)          NOT NULL DEFAULT 1 COMMENT '1、任务节点 2、条件节点',
+    `expression_type`      tinyint(4)          NOT NULL DEFAULT 0 COMMENT '1、SpEl、2、Aviator 3、QL',
+    `fail_strategy`        tinyint(4)          NOT NULL DEFAULT 1 COMMENT '失败策略 1、跳过 2、阻塞',
+    `workflow_node_status` tinyint(4)          NOT NULL DEFAULT 1 COMMENT '工作流节点状态 0、关闭、1、开启',
+    `priority_level`       int(11)             NOT NULL DEFAULT 1 COMMENT '优先级',
+    `node_info`            text                         DEFAULT NULL COMMENT '节点信息 ',
+    `version`              int(11)             NOT NULL COMMENT '版本号',
+    `ext_attrs`            varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段',
+    `deleted`              tinyint(4)          NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除',
+    `create_dt`            datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`            datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_create_dt` (`create_dt`),
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='工作流节点';
+
+CREATE TABLE `sj_workflow_task_batch`
+(
+    `id`                bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`      varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`        varchar(64)         NOT NULL COMMENT '组名称',
+    `workflow_id`       bigint(20)          NOT NULL COMMENT '工作流任务id',
+    `task_batch_status` tinyint(4)          NOT NULL DEFAULT 0 COMMENT '任务批次状态 0、失败 1、成功',
+    `operation_reason`  tinyint(4)          NOT NULL DEFAULT 0 COMMENT '操作原因',
+    `flow_info`         text                         DEFAULT NULL COMMENT '流程信息',
+    `wf_context`        text                         DEFAULT NULL COMMENT '全局上下文',
+    `execution_at`      bigint(13)          NOT NULL DEFAULT 0 COMMENT '任务执行时间',
+    `ext_attrs`         varchar(256)        NULL     DEFAULT '' COMMENT '扩展字段',
+    `version`           int(11)              NOT NULL DEFAULT 1 COMMENT '版本号',
+    `deleted`           tinyint(4)          NOT NULL DEFAULT 0 COMMENT '逻辑删除 1、删除',
+    `create_dt`         datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`         datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_job_id_task_batch_status` (`workflow_id`, `task_batch_status`),
+    KEY `idx_create_dt` (`create_dt`),
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`)
+) ENGINE = InnoDB
+  AUTO_INCREMENT = 0
+  DEFAULT CHARSET = utf8mb4 COMMENT ='工作流批次';

+ 14 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/postgresql/snail-job_data.sql

@@ -0,0 +1,14 @@
+-- liquibase formatted sql
+
+-- changeset snail-job-server:1.1.0
+-- 默认命名空间:Default
+INSERT INTO sj_namespace (id, name, unique_id, create_dt, update_dt, deleted)
+VALUES (1, 'Default', '764d604ec6fc45f68cd92514c40e9e1a', NOW(), NOW(), 0);
+
+-- 默认分组:continew-admin
+INSERT INTO sj_group_config (id, namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt)
+VALUES (1, '764d604ec6fc45f68cd92514c40e9e1a', 'continew-admin', '默认分组', 'SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj', 1, 1, 0, 2, 1, 119, NOW(), NOW());
+
+-- 默认用户:admin/admin
+INSERT INTO sj_system_user (username, password, role)
+VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2);

+ 821 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/db/changelog/postgresql/snail-job_table.sql

@@ -0,0 +1,821 @@
+-- liquibase formatted sql
+
+-- changeset snail-job-server:1.1.0
+-- sj_namespace
+CREATE TABLE sj_namespace
+(
+    id          bigserial PRIMARY KEY,
+    name        varchar(64)  NOT NULL,
+    unique_id   varchar(64)  NOT NULL,
+    description varchar(256) NOT NULL DEFAULT '',
+    deleted     smallint     NOT NULL DEFAULT 0,
+    create_dt   timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt   timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_namespace_01 ON sj_namespace (name);
+
+COMMENT ON COLUMN sj_namespace.id IS '主键';
+COMMENT ON COLUMN sj_namespace.name IS '名称';
+COMMENT ON COLUMN sj_namespace.unique_id IS '唯一id';
+COMMENT ON COLUMN sj_namespace.description IS '描述';
+COMMENT ON COLUMN sj_namespace.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_namespace.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_namespace.update_dt IS '修改时间';
+COMMENT ON TABLE sj_namespace IS '命名空间';
+
+-- sj_group_config
+CREATE TABLE sj_group_config
+(
+    id                bigserial PRIMARY KEY,
+    namespace_id      varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name        varchar(64)  NOT NULL DEFAULT '',
+    description       varchar(256) NOT NULL DEFAULT '',
+    token             varchar(64)  NOT NULL DEFAULT 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT',
+    group_status      smallint     NOT NULL DEFAULT 0,
+    version           int          NOT NULL,
+    group_partition   int          NOT NULL,
+    id_generator_mode smallint     NOT NULL DEFAULT 1,
+    init_scene        smallint     NOT NULL DEFAULT 0,
+    bucket_index      int          NOT NULL DEFAULT 0,
+    create_dt         timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt         timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_group_config_01 ON sj_group_config (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_group_config.id IS '主键';
+COMMENT ON COLUMN sj_group_config.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_group_config.group_name IS '组名称';
+COMMENT ON COLUMN sj_group_config.description IS '组描述';
+COMMENT ON COLUMN sj_group_config.token IS 'token';
+COMMENT ON COLUMN sj_group_config.group_status IS '组状态 0、未启用 1、启用';
+COMMENT ON COLUMN sj_group_config.version IS '版本号';
+COMMENT ON COLUMN sj_group_config.group_partition IS '分区';
+COMMENT ON COLUMN sj_group_config.id_generator_mode IS '唯一id生成模式 默认号段模式';
+COMMENT ON COLUMN sj_group_config.init_scene IS '是否初始化场景 0:否 1:是';
+COMMENT ON COLUMN sj_group_config.bucket_index IS 'bucket';
+COMMENT ON COLUMN sj_group_config.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_group_config.update_dt IS '修改时间';
+COMMENT ON TABLE sj_group_config IS '组配置';
+
+-- sj_notify_config
+CREATE TABLE sj_notify_config
+(
+    id                     bigserial PRIMARY KEY,
+    namespace_id           varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name             varchar(64)  NOT NULL,
+    business_id            varchar(64)  NOT NULL,
+    system_task_type       smallint     NOT NULL DEFAULT 3,
+    notify_status          smallint     NOT NULL DEFAULT 0,
+    recipient_ids          varchar(128) NOT NULL,
+    notify_threshold       int          NOT NULL DEFAULT 0,
+    notify_scene           smallint     NOT NULL DEFAULT 0,
+    rate_limiter_status    smallint     NOT NULL DEFAULT 0,
+    rate_limiter_threshold int          NOT NULL DEFAULT 0,
+    description            varchar(256) NOT NULL DEFAULT '',
+    create_dt              timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt              timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_notify_config_01 ON sj_notify_config (namespace_id, group_name, business_id);
+
+COMMENT ON COLUMN sj_notify_config.id IS '主键';
+COMMENT ON COLUMN sj_notify_config.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_notify_config.group_name IS '组名称';
+COMMENT ON COLUMN sj_notify_config.business_id IS '业务id  ( job_id或workflow_id或scene_name ) ';
+COMMENT ON COLUMN sj_notify_config.system_task_type IS '任务类型 1. 重试任务 2. 重试回调 3、JOB任务 4、WORKFLOW任务';
+COMMENT ON COLUMN sj_notify_config.notify_status IS '通知状态 0、未启用 1、启用';
+COMMENT ON COLUMN sj_notify_config.recipient_ids IS '接收人id列表';
+COMMENT ON COLUMN sj_notify_config.notify_threshold IS '通知阈值';
+COMMENT ON COLUMN sj_notify_config.notify_scene IS '通知场景';
+COMMENT ON COLUMN sj_notify_config.rate_limiter_status IS '限流状态 0、未启用 1、启用';
+COMMENT ON COLUMN sj_notify_config.rate_limiter_threshold IS '每秒限流阈值';
+COMMENT ON COLUMN sj_notify_config.description IS '描述';
+COMMENT ON COLUMN sj_notify_config.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_notify_config.update_dt IS '修改时间';
+COMMENT ON TABLE sj_notify_config IS '通知配置';
+
+-- sj_notify_recipient
+CREATE TABLE sj_notify_recipient
+(
+    id               bigserial PRIMARY KEY,
+    namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    recipient_name   varchar(64)  NOT NULL,
+    notify_type      smallint     NOT NULL DEFAULT 0,
+    notify_attribute varchar(512) NOT NULL,
+    description      varchar(256) NOT NULL DEFAULT '',
+    create_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_notify_recipient_01 ON sj_notify_recipient (namespace_id);
+
+COMMENT ON COLUMN sj_notify_recipient.id IS '主键';
+COMMENT ON COLUMN sj_notify_recipient.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_notify_recipient.recipient_name IS '接收人名称';
+COMMENT ON COLUMN sj_notify_recipient.notify_type IS '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书 5 webhook';
+COMMENT ON COLUMN sj_notify_recipient.notify_attribute IS '配置属性';
+COMMENT ON COLUMN sj_notify_recipient.description IS '描述';
+COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_notify_recipient.update_dt IS '修改时间';
+COMMENT ON TABLE sj_notify_recipient IS '告警通知接收人';
+
+-- sj_retry_dead_letter_0
+CREATE TABLE sj_retry_dead_letter_0
+(
+    id            bigserial PRIMARY KEY,
+    namespace_id  varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    unique_id     varchar(64)  NOT NULL,
+    group_name    varchar(64)  NOT NULL,
+    scene_name    varchar(64)  NOT NULL,
+    idempotent_id varchar(64)  NOT NULL,
+    biz_no        varchar(64)  NOT NULL DEFAULT '',
+    executor_name varchar(512) NOT NULL DEFAULT '',
+    args_str      text         NOT NULL,
+    ext_attrs     text         NOT NULL,
+    task_type     smallint     NOT NULL DEFAULT 1,
+    create_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id);
+
+CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id);
+CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no);
+CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt);
+
+COMMENT ON COLUMN sj_retry_dead_letter_0.id IS '主键';
+COMMENT ON COLUMN sj_retry_dead_letter_0.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_dead_letter_0.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_dead_letter_0.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_dead_letter_0.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_dead_letter_0.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry_dead_letter_0.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry_dead_letter_0.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry_dead_letter_0.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry_dead_letter_0.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_dead_letter_0.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry_dead_letter_0.create_dt IS '创建时间';
+COMMENT ON TABLE sj_retry_dead_letter_0 IS '死信队列表';
+
+-- sj_retry_task_0
+CREATE TABLE sj_retry_task_0
+(
+    id              bigserial PRIMARY KEY,
+    namespace_id    varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    unique_id       varchar(64)  NOT NULL,
+    group_name      varchar(64)  NOT NULL,
+    scene_name      varchar(64)  NOT NULL,
+    idempotent_id   varchar(64)  NOT NULL,
+    biz_no          varchar(64)  NOT NULL DEFAULT '',
+    executor_name   varchar(512) NOT NULL DEFAULT '',
+    args_str        text         NOT NULL,
+    ext_attrs       text         NOT NULL,
+    next_trigger_at timestamp    NOT NULL,
+    retry_count     int          NOT NULL DEFAULT 0,
+    retry_status    smallint     NOT NULL DEFAULT 0,
+    task_type       smallint     NOT NULL DEFAULT 1,
+    create_dt       timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt       timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id);
+
+CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type);
+CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status);
+CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id);
+CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no);
+CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt);
+
+COMMENT ON COLUMN sj_retry_task_0.id IS '主键';
+COMMENT ON COLUMN sj_retry_task_0.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_task_0.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_task_0.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_task_0.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_task_0.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry_task_0.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry_task_0.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry_task_0.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry_task_0.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_task_0.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN sj_retry_task_0.retry_count IS '重试次数';
+COMMENT ON COLUMN sj_retry_task_0.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
+COMMENT ON COLUMN sj_retry_task_0.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry_task_0.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_task_0.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_task_0 IS '任务表';
+
+-- sj_retry_task_log
+CREATE TABLE sj_retry_task_log
+(
+    id            bigserial PRIMARY KEY,
+    namespace_id  varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    unique_id     varchar(64)  NOT NULL,
+    group_name    varchar(64)  NOT NULL,
+    scene_name    varchar(64)  NOT NULL,
+    idempotent_id varchar(64)  NOT NULL,
+    biz_no        varchar(64)  NOT NULL DEFAULT '',
+    executor_name varchar(512) NOT NULL DEFAULT '',
+    args_str      text         NOT NULL,
+    ext_attrs     text         NOT NULL,
+    retry_status  smallint     NOT NULL DEFAULT 0,
+    task_type     smallint     NOT NULL DEFAULT 1,
+    create_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status);
+CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id);
+CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id);
+CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no);
+CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt);
+
+COMMENT ON COLUMN sj_retry_task_log.id IS '主键';
+COMMENT ON COLUMN sj_retry_task_log.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_task_log.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_task_log.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_task_log.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_task_log.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry_task_log.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry_task_log.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry_task_log.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry_task_log.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_task_log.retry_status IS '重试状态 0、重试中 1、成功 2、最大次数';
+COMMENT ON COLUMN sj_retry_task_log.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry_task_log.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_task_log.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_task_log IS '任务日志基础信息表';
+
+-- sj_retry_task_log_message
+CREATE TABLE sj_retry_task_log_message
+(
+    id           bigserial PRIMARY KEY,
+    namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name   varchar(64) NOT NULL,
+    unique_id    varchar(64) NOT NULL,
+    message      text        NOT NULL,
+    log_num      int         NOT NULL DEFAULT 1,
+    real_time    bigint      NOT NULL DEFAULT 0,
+    create_dt    timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id);
+CREATE INDEX idx_sj_retry_task_log_message_02 ON sj_retry_task_log_message (create_dt);
+
+COMMENT ON COLUMN sj_retry_task_log_message.id IS '主键';
+COMMENT ON COLUMN sj_retry_task_log_message.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_task_log_message.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_task_log_message.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_task_log_message.message IS '异常信息';
+COMMENT ON COLUMN sj_retry_task_log_message.log_num IS '日志数量';
+COMMENT ON COLUMN sj_retry_task_log_message.real_time IS '上报时间';
+COMMENT ON COLUMN sj_retry_task_log_message.create_dt IS '创建时间';
+COMMENT ON TABLE sj_retry_task_log_message IS '任务调度日志信息记录表';
+
+-- sj_retry_scene_config
+CREATE TABLE sj_retry_scene_config
+(
+    id               bigserial PRIMARY KEY,
+    namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    scene_name       varchar(64)  NOT NULL,
+    group_name       varchar(64)  NOT NULL,
+    scene_status     smallint     NOT NULL DEFAULT 0,
+    max_retry_count  int          NOT NULL DEFAULT 5,
+    back_off         smallint     NOT NULL DEFAULT 1,
+    trigger_interval varchar(16)  NOT NULL DEFAULT '',
+    deadline_request bigint       NOT NULL DEFAULT 60000,
+    executor_timeout int          NOT NULL DEFAULT 5,
+    route_key        smallint     NOT NULL DEFAULT 4,
+    description      varchar(256) NOT NULL DEFAULT '',
+    create_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_retry_scene_config_01 ON sj_retry_scene_config (namespace_id, group_name, scene_name);
+
+COMMENT ON COLUMN sj_retry_scene_config.id IS '主键';
+COMMENT ON COLUMN sj_retry_scene_config.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_scene_config.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_scene_config.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_scene_config.scene_status IS '组状态 0、未启用 1、启用';
+COMMENT ON COLUMN sj_retry_scene_config.max_retry_count IS '最大重试次数';
+COMMENT ON COLUMN sj_retry_scene_config.back_off IS '1、默认等级 2、固定间隔时间 3、CRON 表达式';
+COMMENT ON COLUMN sj_retry_scene_config.trigger_interval IS '间隔时长';
+COMMENT ON COLUMN sj_retry_scene_config.deadline_request IS 'Deadline Request 调用链超时 单位毫秒';
+COMMENT ON COLUMN sj_retry_scene_config.executor_timeout IS '任务执行超时时间,单位秒';
+COMMENT ON COLUMN sj_retry_scene_config.route_key IS '路由策略';
+COMMENT ON COLUMN sj_retry_scene_config.description IS '描述';
+COMMENT ON COLUMN sj_retry_scene_config.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_scene_config.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_scene_config IS '场景配置';
+
+-- sj_server_node
+CREATE TABLE sj_server_node
+(
+    id           bigserial PRIMARY KEY,
+    namespace_id varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name   varchar(64)  NOT NULL,
+    host_id      varchar(64)  NOT NULL,
+    host_ip      varchar(64)  NOT NULL,
+    host_port    int          NOT NULL,
+    expire_at    timestamp    NOT NULL,
+    node_type    smallint     NOT NULL,
+    ext_attrs    varchar(256) NULL     DEFAULT '',
+    create_dt    timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt    timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_server_node_01 ON sj_server_node (host_id, host_ip);
+
+CREATE INDEX idx_sj_server_node_01 ON sj_server_node (namespace_id, group_name);
+CREATE INDEX idx_sj_server_node_02 ON sj_server_node (expire_at, node_type);
+
+COMMENT ON COLUMN sj_server_node.id IS '主键';
+COMMENT ON COLUMN sj_server_node.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_server_node.group_name IS '组名称';
+COMMENT ON COLUMN sj_server_node.host_id IS '主机id';
+COMMENT ON COLUMN sj_server_node.host_ip IS '机器ip';
+COMMENT ON COLUMN sj_server_node.host_port IS '机器端口';
+COMMENT ON COLUMN sj_server_node.expire_at IS '过期时间';
+COMMENT ON COLUMN sj_server_node.node_type IS '节点类型 1、客户端 2、是服务端';
+COMMENT ON COLUMN sj_server_node.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_server_node.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_server_node.update_dt IS '修改时间';
+COMMENT ON TABLE sj_server_node IS '服务器节点';
+
+-- sj_distributed_lock
+CREATE TABLE sj_distributed_lock
+(
+    name       varchar(64)  PRIMARY KEY,
+    lock_until timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    locked_at  timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+    locked_by  varchar(255) NOT NULL,
+    create_dt  timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt  timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+COMMENT ON COLUMN sj_distributed_lock.name IS '锁名称';
+COMMENT ON COLUMN sj_distributed_lock.lock_until IS '锁定时长';
+COMMENT ON COLUMN sj_distributed_lock.locked_at IS '锁定时间';
+COMMENT ON COLUMN sj_distributed_lock.locked_by IS '锁定者';
+COMMENT ON COLUMN sj_distributed_lock.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_distributed_lock.update_dt IS '修改时间';
+COMMENT ON TABLE sj_distributed_lock IS '锁定表';
+
+-- sj_system_user
+CREATE TABLE sj_system_user
+(
+    id        bigserial PRIMARY KEY,
+    username  varchar(64)  NOT NULL,
+    password  varchar(128) NOT NULL,
+    role      smallint     NOT NULL DEFAULT 0,
+    create_dt timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+COMMENT ON COLUMN sj_system_user.id IS '主键';
+COMMENT ON COLUMN sj_system_user.username IS '账号';
+COMMENT ON COLUMN sj_system_user.password IS '密码';
+COMMENT ON COLUMN sj_system_user.role IS '角色:1-普通用户、2-管理员';
+COMMENT ON COLUMN sj_system_user.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_system_user.update_dt IS '修改时间';
+COMMENT ON TABLE sj_system_user IS '系统用户表';
+
+-- sj_system_user_permission
+CREATE TABLE sj_system_user_permission
+(
+    id             bigserial PRIMARY KEY,
+    group_name     varchar(64) NOT NULL,
+    namespace_id   varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    system_user_id bigint      NOT NULL,
+    create_dt      timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt      timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_system_user_permission_01 ON sj_system_user_permission (namespace_id, group_name, system_user_id);
+
+COMMENT ON COLUMN sj_system_user_permission.id IS '主键';
+COMMENT ON COLUMN sj_system_user_permission.group_name IS '组名称';
+COMMENT ON COLUMN sj_system_user_permission.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_system_user_permission.system_user_id IS '系统用户id';
+COMMENT ON COLUMN sj_system_user_permission.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_system_user_permission.update_dt IS '修改时间';
+COMMENT ON TABLE sj_system_user_permission IS '系统用户权限表';
+
+-- sj_sequence_alloc
+CREATE TABLE sj_sequence_alloc
+(
+    id           bigserial PRIMARY KEY,
+    namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name   varchar(64) NOT NULL DEFAULT '',
+    max_id       bigint      NOT NULL DEFAULT 1,
+    step         int         NOT NULL DEFAULT 100,
+    update_dt    timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_sequence_alloc_01 ON sj_sequence_alloc (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_sequence_alloc.id IS '主键';
+COMMENT ON COLUMN sj_sequence_alloc.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_sequence_alloc.group_name IS '组名称';
+COMMENT ON COLUMN sj_sequence_alloc.max_id IS '最大id';
+COMMENT ON COLUMN sj_sequence_alloc.step IS '步长';
+COMMENT ON COLUMN sj_sequence_alloc.update_dt IS '更新时间';
+COMMENT ON TABLE sj_sequence_alloc IS '号段模式序号ID分配表';
+
+-- sj_job
+CREATE TABLE sj_job
+(
+    id               bigserial PRIMARY KEY,
+    namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name       varchar(64)  NOT NULL,
+    job_name         varchar(64)  NOT NULL,
+    args_str         text         NULL     DEFAULT NULL,
+    args_type        smallint     NOT NULL DEFAULT 1,
+    next_trigger_at  bigint       NOT NULL,
+    job_status       smallint     NOT NULL DEFAULT 1,
+    task_type        smallint     NOT NULL DEFAULT 1,
+    route_key        smallint     NOT NULL DEFAULT 4,
+    executor_type    smallint     NOT NULL DEFAULT 1,
+    executor_info    varchar(255) NULL     DEFAULT NULL,
+    trigger_type     smallint     NOT NULL,
+    trigger_interval varchar(255) NOT NULL,
+    block_strategy   smallint     NOT NULL DEFAULT 1,
+    executor_timeout int          NOT NULL DEFAULT 0,
+    max_retry_times  int          NOT NULL DEFAULT 0,
+    parallel_num     int          NOT NULL DEFAULT 1,
+    retry_interval   int          NOT NULL DEFAULT 0,
+    bucket_index     int          NOT NULL DEFAULT 0,
+    resident         smallint     NOT NULL DEFAULT 0,
+    description      varchar(256) NOT NULL DEFAULT '',
+    ext_attrs        varchar(256) NULL     DEFAULT '',
+    deleted          smallint     NOT NULL DEFAULT 0,
+    create_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name);
+CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index);
+CREATE INDEX idx_sj_job_03 ON sj_job (create_dt);
+
+COMMENT ON COLUMN sj_job.id IS '主键';
+COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job.group_name IS '组名称';
+COMMENT ON COLUMN sj_job.job_name IS '名称';
+COMMENT ON COLUMN sj_job.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_job.args_type IS '参数类型 ';
+COMMENT ON COLUMN sj_job.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN sj_job.job_status IS '任务状态 0、关闭、1、开启';
+COMMENT ON COLUMN sj_job.task_type IS '任务类型 1、集群 2、广播 3、切片';
+COMMENT ON COLUMN sj_job.route_key IS '路由策略';
+COMMENT ON COLUMN sj_job.executor_type IS '执行器类型';
+COMMENT ON COLUMN sj_job.executor_info IS '执行器名称';
+COMMENT ON COLUMN sj_job.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
+COMMENT ON COLUMN sj_job.trigger_interval IS '间隔时长';
+COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
+COMMENT ON COLUMN sj_job.executor_timeout IS '任务执行超时时间,单位秒';
+COMMENT ON COLUMN sj_job.max_retry_times IS '最大重试次数';
+COMMENT ON COLUMN sj_job.parallel_num IS '并行数';
+COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s ) ';
+COMMENT ON COLUMN sj_job.bucket_index IS 'bucket';
+COMMENT ON COLUMN sj_job.resident IS '是否是常驻任务';
+COMMENT ON COLUMN sj_job.description IS '描述';
+COMMENT ON COLUMN sj_job.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_job.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_job.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_job.update_dt IS '修改时间';
+COMMENT ON TABLE sj_job IS '任务信息';
+
+-- sj_job_log_message
+CREATE TABLE sj_job_log_message
+(
+    id            bigserial PRIMARY KEY,
+    namespace_id  varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name    varchar(64)  NOT NULL,
+    job_id        bigint       NOT NULL,
+    task_batch_id bigint       NOT NULL,
+    task_id       bigint       NOT NULL,
+    message       text         NOT NULL,
+    log_num       int          NOT NULL DEFAULT 1,
+    real_time     bigint       NOT NULL DEFAULT 0,
+    ext_attrs     varchar(256) NULL     DEFAULT '',
+    create_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_job_log_message_01 ON sj_job_log_message (task_batch_id, task_id);
+CREATE INDEX idx_sj_job_log_message_02 ON sj_job_log_message (create_dt);
+CREATE INDEX idx_sj_job_log_message_03 ON sj_job_log_message (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_job_log_message.id IS '主键';
+COMMENT ON COLUMN sj_job_log_message.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job_log_message.group_name IS '组名称';
+COMMENT ON COLUMN sj_job_log_message.job_id IS '任务信息id';
+COMMENT ON COLUMN sj_job_log_message.task_batch_id IS '任务批次id';
+COMMENT ON COLUMN sj_job_log_message.task_id IS '调度任务id';
+COMMENT ON COLUMN sj_job_log_message.message IS '调度信息';
+COMMENT ON COLUMN sj_job_log_message.log_num IS '日志数量';
+COMMENT ON COLUMN sj_job_log_message.real_time IS '上报时间';
+COMMENT ON COLUMN sj_job_log_message.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_job_log_message.create_dt IS '创建时间';
+COMMENT ON TABLE sj_job_log_message IS '调度日志';
+
+-- sj_job_task
+CREATE TABLE sj_job_task
+(
+    id             bigserial PRIMARY KEY,
+    namespace_id   varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name     varchar(64)  NOT NULL,
+    job_id         bigint       NOT NULL,
+    task_batch_id  bigint       NOT NULL,
+    parent_id      bigint       NOT NULL DEFAULT 0,
+    task_status    smallint     NOT NULL DEFAULT 0,
+    retry_count    int          NOT NULL DEFAULT 0,
+    mr_stage       smallint     NULL     DEFAULT NULL,
+    leaf           smallint     NOT NULL DEFAULT '1',
+    task_name      varchar(255) NOT NULL DEFAULT '',
+    client_info    varchar(128) NULL     DEFAULT NULL,
+    wf_context     text         NULL     DEFAULT NULL,
+    result_message text         NOT NULL,
+    args_str       text         NULL     DEFAULT NULL,
+    args_type      smallint     NOT NULL DEFAULT 1,
+    ext_attrs      varchar(256) NULL     DEFAULT '',
+    create_dt      timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt      timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_job_task_01 ON sj_job_task (task_batch_id, task_status);
+CREATE INDEX idx_sj_job_task_02 ON sj_job_task (create_dt);
+CREATE INDEX idx_sj_job_task_03 ON sj_job_task (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_job_task.id IS '主键';
+COMMENT ON COLUMN sj_job_task.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job_task.group_name IS '组名称';
+COMMENT ON COLUMN sj_job_task.job_id IS '任务信息id';
+COMMENT ON COLUMN sj_job_task.task_batch_id IS '调度任务id';
+COMMENT ON COLUMN sj_job_task.parent_id IS '父执行器id';
+COMMENT ON COLUMN sj_job_task.task_status IS '执行的状态 0、失败 1、成功';
+COMMENT ON COLUMN sj_job_task.retry_count IS '重试次数';
+COMMENT ON COLUMN sj_job_task.mr_stage IS '动态分片所处阶段 1:map 2:reduce 3:mergeReduce';
+COMMENT ON COLUMN sj_job_task.leaf IS '叶子节点';
+COMMENT ON COLUMN sj_job_task.task_name IS '任务名称';
+COMMENT ON COLUMN sj_job_task.client_info IS '客户端地址 clientId#ip:port';
+COMMENT ON COLUMN sj_job_task.wf_context IS '工作流全局上下文';
+COMMENT ON COLUMN sj_job_task.result_message IS '执行结果';
+COMMENT ON COLUMN sj_job_task.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_job_task.args_type IS '参数类型 ';
+COMMENT ON COLUMN sj_job_task.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_job_task.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_job_task.update_dt IS '修改时间';
+COMMENT ON TABLE sj_job_task IS '任务实例';
+
+-- sj_job_task_batch
+CREATE TABLE sj_job_task_batch
+(
+    id                      bigserial PRIMARY KEY,
+    namespace_id            varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name              varchar(64)  NOT NULL,
+    job_id                  bigint       NOT NULL,
+    workflow_node_id        bigint       NOT NULL DEFAULT 0,
+    parent_workflow_node_id bigint       NOT NULL DEFAULT 0,
+    workflow_task_batch_id  bigint       NOT NULL DEFAULT 0,
+    task_batch_status       smallint     NOT NULL DEFAULT 0,
+    operation_reason        smallint     NOT NULL DEFAULT 0,
+    execution_at            bigint       NOT NULL DEFAULT 0,
+    system_task_type        smallint     NOT NULL DEFAULT 3,
+    parent_id               varchar(64)  NOT NULL DEFAULT '',
+    ext_attrs               varchar(256) NULL     DEFAULT '',
+    deleted                 smallint     NOT NULL DEFAULT 0,
+    create_dt               timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt               timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_job_task_batch_01 ON sj_job_task_batch (job_id, task_batch_status);
+CREATE INDEX idx_sj_job_task_batch_02 ON sj_job_task_batch (create_dt);
+CREATE INDEX idx_sj_job_task_batch_03 ON sj_job_task_batch (namespace_id, group_name);
+CREATE INDEX idx_sj_job_task_batch_04 ON sj_job_task_batch (workflow_task_batch_id, workflow_node_id);
+
+COMMENT ON COLUMN sj_job_task_batch.id IS '主键';
+COMMENT ON COLUMN sj_job_task_batch.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job_task_batch.group_name IS '组名称';
+COMMENT ON COLUMN sj_job_task_batch.job_id IS '任务id';
+COMMENT ON COLUMN sj_job_task_batch.workflow_node_id IS '工作流节点id';
+COMMENT ON COLUMN sj_job_task_batch.parent_workflow_node_id IS '工作流任务父批次id';
+COMMENT ON COLUMN sj_job_task_batch.workflow_task_batch_id IS '工作流任务批次id';
+COMMENT ON COLUMN sj_job_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功';
+COMMENT ON COLUMN sj_job_task_batch.operation_reason IS '操作原因';
+COMMENT ON COLUMN sj_job_task_batch.execution_at IS '任务执行时间';
+COMMENT ON COLUMN sj_job_task_batch.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务';
+COMMENT ON COLUMN sj_job_task_batch.parent_id IS '父节点';
+COMMENT ON COLUMN sj_job_task_batch.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_job_task_batch.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_job_task_batch.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_job_task_batch.update_dt IS '修改时间';
+COMMENT ON TABLE sj_job_task_batch IS '任务批次';
+
+-- sj_job_summary
+CREATE TABLE sj_job_summary
+(
+    id               bigserial PRIMARY KEY,
+    namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name       varchar(64)  NOT NULL DEFAULT '',
+    business_id      bigint       NOT NULL,
+    system_task_type smallint     NOT NULL DEFAULT 3,
+    trigger_at       timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    success_num      int          NOT NULL DEFAULT 0,
+    fail_num         int          NOT NULL DEFAULT 0,
+    fail_reason      varchar(512) NOT NULL DEFAULT '',
+    stop_num         int          NOT NULL DEFAULT 0,
+    stop_reason      varchar(512) NOT NULL DEFAULT '',
+    cancel_num       int          NOT NULL DEFAULT 0,
+    cancel_reason    varchar(512) NOT NULL DEFAULT '',
+    create_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_job_summary_01 ON sj_job_summary (trigger_at, system_task_type, business_id);
+
+CREATE INDEX idx_sj_job_summary_01 ON sj_job_summary (namespace_id, group_name, business_id);
+
+COMMENT ON COLUMN sj_job_summary.id IS '主键';
+COMMENT ON COLUMN sj_job_summary.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job_summary.group_name IS '组名称';
+COMMENT ON COLUMN sj_job_summary.business_id IS '业务id  ( job_id或workflow_id ) ';
+COMMENT ON COLUMN sj_job_summary.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务';
+COMMENT ON COLUMN sj_job_summary.trigger_at IS '统计时间';
+COMMENT ON COLUMN sj_job_summary.success_num IS '执行成功-日志数量';
+COMMENT ON COLUMN sj_job_summary.fail_num IS '执行失败-日志数量';
+COMMENT ON COLUMN sj_job_summary.fail_reason IS '失败原因';
+COMMENT ON COLUMN sj_job_summary.stop_num IS '执行失败-日志数量';
+COMMENT ON COLUMN sj_job_summary.stop_reason IS '失败原因';
+COMMENT ON COLUMN sj_job_summary.cancel_num IS '执行失败-日志数量';
+COMMENT ON COLUMN sj_job_summary.cancel_reason IS '失败原因';
+COMMENT ON COLUMN sj_job_summary.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_job_summary.update_dt IS '修改时间';
+COMMENT ON TABLE sj_job_summary IS 'DashBoard_Job';
+
+-- sj_retry_summary
+CREATE TABLE sj_retry_summary
+(
+    id            bigserial PRIMARY KEY,
+    namespace_id  varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name    varchar(64) NOT NULL DEFAULT '',
+    scene_name    varchar(50) NOT NULL DEFAULT '',
+    trigger_at    timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    running_num   int         NOT NULL DEFAULT 0,
+    finish_num    int         NOT NULL DEFAULT 0,
+    max_count_num int         NOT NULL DEFAULT 0,
+    suspend_num   int         NOT NULL DEFAULT 0,
+    create_dt     timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt     timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE UNIQUE INDEX uk_sj_retry_summary_01 ON sj_retry_summary (namespace_id, group_name, scene_name, trigger_at);
+
+CREATE INDEX idx_sj_retry_summary_01 ON sj_retry_summary (trigger_at);
+
+COMMENT ON COLUMN sj_retry_summary.id IS '主键';
+COMMENT ON COLUMN sj_retry_summary.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_summary.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_summary.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_summary.trigger_at IS '统计时间';
+COMMENT ON COLUMN sj_retry_summary.running_num IS '重试中-日志数量';
+COMMENT ON COLUMN sj_retry_summary.finish_num IS '重试完成-日志数量';
+COMMENT ON COLUMN sj_retry_summary.max_count_num IS '重试到达最大次数-日志数量';
+COMMENT ON COLUMN sj_retry_summary.suspend_num IS '暂停重试-日志数量';
+COMMENT ON COLUMN sj_retry_summary.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_summary.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_summary IS 'DashBoard_Retry';
+
+-- sj_workflow
+CREATE TABLE sj_workflow
+(
+    id               bigserial PRIMARY KEY,
+    workflow_name    varchar(64)  NOT NULL,
+    namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name       varchar(64)  NOT NULL,
+    workflow_status  smallint     NOT NULL DEFAULT 1,
+    trigger_type     smallint     NOT NULL,
+    trigger_interval varchar(255) NOT NULL,
+    next_trigger_at  bigint       NOT NULL,
+    block_strategy   smallint     NOT NULL DEFAULT 1,
+    executor_timeout int          NOT NULL DEFAULT 0,
+    description      varchar(256) NOT NULL DEFAULT '',
+    flow_info        text         NULL     DEFAULT NULL,
+    wf_context       text         NULL     DEFAULT NULL,
+    bucket_index     int          NOT NULL DEFAULT 0,
+    version          int          NOT NULL,
+    ext_attrs        varchar(256) NULL     DEFAULT '',
+    deleted          smallint     NOT NULL DEFAULT 0,
+    create_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt);
+CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_workflow.id IS '主键';
+COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称';
+COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_workflow.group_name IS '组名称';
+COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启';
+COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
+COMMENT ON COLUMN sj_workflow.trigger_interval IS '间隔时长';
+COMMENT ON COLUMN sj_workflow.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN sj_workflow.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
+COMMENT ON COLUMN sj_workflow.executor_timeout IS '任务执行超时时间,单位秒';
+COMMENT ON COLUMN sj_workflow.description IS '描述';
+COMMENT ON COLUMN sj_workflow.flow_info IS '流程信息';
+COMMENT ON COLUMN sj_workflow.wf_context IS '上下文';
+COMMENT ON COLUMN sj_workflow.bucket_index IS 'bucket';
+COMMENT ON COLUMN sj_workflow.version IS '版本号';
+COMMENT ON COLUMN sj_workflow.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_workflow.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_workflow.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_workflow.update_dt IS '修改时间';
+COMMENT ON TABLE sj_workflow IS '工作流';
+
+-- sj_workflow_node
+CREATE TABLE sj_workflow_node
+(
+    id                   bigserial PRIMARY KEY,
+    namespace_id         varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    node_name            varchar(64)  NOT NULL,
+    group_name           varchar(64)  NOT NULL,
+    job_id               bigint       NOT NULL,
+    workflow_id          bigint       NOT NULL,
+    node_type            smallint     NOT NULL DEFAULT 1,
+    expression_type      smallint     NOT NULL DEFAULT 0,
+    fail_strategy        smallint     NOT NULL DEFAULT 1,
+    workflow_node_status smallint     NOT NULL DEFAULT 1,
+    priority_level       int          NOT NULL DEFAULT 1,
+    node_info            text         NULL     DEFAULT NULL,
+    version              int          NOT NULL,
+    ext_attrs            varchar(256) NULL     DEFAULT '',
+    deleted              smallint     NOT NULL DEFAULT 0,
+    create_dt            timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt            timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_workflow_node_01 ON sj_workflow_node (create_dt);
+CREATE INDEX idx_sj_workflow_node_02 ON sj_workflow_node (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_workflow_node.id IS '主键';
+COMMENT ON COLUMN sj_workflow_node.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_workflow_node.node_name IS '节点名称';
+COMMENT ON COLUMN sj_workflow_node.group_name IS '组名称';
+COMMENT ON COLUMN sj_workflow_node.job_id IS '任务信息id';
+COMMENT ON COLUMN sj_workflow_node.workflow_id IS '工作流ID';
+COMMENT ON COLUMN sj_workflow_node.node_type IS '1、任务节点 2、条件节点';
+COMMENT ON COLUMN sj_workflow_node.expression_type IS '1、SpEl、2、Aviator 3、QL';
+COMMENT ON COLUMN sj_workflow_node.fail_strategy IS '失败策略 1、跳过 2、阻塞';
+COMMENT ON COLUMN sj_workflow_node.workflow_node_status IS '工作流节点状态 0、关闭、1、开启';
+COMMENT ON COLUMN sj_workflow_node.priority_level IS '优先级';
+COMMENT ON COLUMN sj_workflow_node.node_info IS '节点信息 ';
+COMMENT ON COLUMN sj_workflow_node.version IS '版本号';
+COMMENT ON COLUMN sj_workflow_node.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_workflow_node.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_workflow_node.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_workflow_node.update_dt IS '修改时间';
+COMMENT ON TABLE sj_workflow_node IS '工作流节点';
+
+-- sj_workflow_task_batch
+CREATE TABLE sj_workflow_task_batch
+(
+    id                bigserial PRIMARY KEY,
+    namespace_id      varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name        varchar(64)  NOT NULL,
+    workflow_id       bigint       NOT NULL,
+    task_batch_status smallint     NOT NULL DEFAULT 0,
+    operation_reason  smallint     NOT NULL DEFAULT 0,
+    flow_info         text         NULL     DEFAULT NULL,
+    wf_context        text         NULL     DEFAULT NULL,
+    execution_at      bigint       NOT NULL DEFAULT 0,
+    ext_attrs         varchar(256) NULL     DEFAULT '',
+    version           int          NOT NULL DEFAULT 1,
+    deleted           smallint     NOT NULL DEFAULT 0,
+    create_dt         timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt         timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_sj_workflow_task_batch_01 ON sj_workflow_task_batch (workflow_id, task_batch_status);
+CREATE INDEX idx_sj_workflow_task_batch_02 ON sj_workflow_task_batch (create_dt);
+CREATE INDEX idx_sj_workflow_task_batch_03 ON sj_workflow_task_batch (namespace_id, group_name);
+
+COMMENT ON COLUMN sj_workflow_task_batch.id IS '主键';
+COMMENT ON COLUMN sj_workflow_task_batch.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_workflow_task_batch.group_name IS '组名称';
+COMMENT ON COLUMN sj_workflow_task_batch.workflow_id IS '工作流任务id';
+COMMENT ON COLUMN sj_workflow_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功';
+COMMENT ON COLUMN sj_workflow_task_batch.operation_reason IS '操作原因';
+COMMENT ON COLUMN sj_workflow_task_batch.flow_info IS '流程信息';
+COMMENT ON COLUMN sj_workflow_task_batch.wf_context IS '全局上下文';
+COMMENT ON COLUMN sj_workflow_task_batch.execution_at IS '任务执行时间';
+COMMENT ON COLUMN sj_workflow_task_batch.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_workflow_task_batch.version IS '版本号';
+COMMENT ON COLUMN sj_workflow_task_batch.deleted IS '逻辑删除 1、删除';
+COMMENT ON COLUMN sj_workflow_task_batch.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_workflow_task_batch.update_dt IS '修改时间';
+COMMENT ON TABLE sj_workflow_task_batch IS '工作流批次';

+ 88 - 0
continew-extension/continew-extension-schedule-server/src/main/resources/logback-spring.xml

@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="true" scanPeriod="30 seconds">
+
+    <!-- 关闭 Logback 的状态监听器(通过更换默认状态监听器实现) -->
+    <statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
+
+    <!-- 应用名 -->
+    <springProperty name="APP_NAME" source="spring.application.name" scope="context"/>
+    <!-- 保存路径 -->
+    <property name="LOG_PATH" value="${LOG_PATH:-./logs/job-server}"/>
+    <!-- 字符集 -->
+    <property name="LOG_CHARSET" value="utf-8"/>
+    <!-- 格式化输出:%d 表示日期;%thread 表示线程名;%-5level:级别从左显示 5 个字符宽度;%msg:日志消息;%n 是换行符 -->
+    <!-- 控制台输出格式(带颜色) -->
+    <property name="CONSOLE_LOG_PATTERN" value="%red(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %green([%thread]) %boldMagenta(%logger{50}) - %msg%n"/>
+    <!-- 文件输出格式 -->
+    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{50} - %msg%n"/>
+    <!-- 单个日志文件大小上限 -->
+    <property name="FILE_MAX_SIZE" value="20MB"/>
+
+    <!-- 输出日志到控制台 -->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <charset>${LOG_CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <!-- 输出日志到控制台(不带颜色) -->
+    <appender name="CONSOLE_PROD" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>${LOG_CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <!-- 输出日志到文件 -->
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APP_NAME}.log</file>
+        <!-- 滚动策略:基于文件大小和时间归档日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- 日志文件的路径及文件名 -->
+            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <!-- 日志文件大小(超过指定大小后,会切分新文件,从索引 0 开始计数,例如:app.2024-01-01.1.log.gz ) -->
+            <maxFileSize>${FILE_MAX_SIZE}</maxFileSize>
+            <!-- 日志保留天数 -->
+            <maxHistory>${FILE_MAX_HISTORY}</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>${LOG_CHARSET}</charset>
+        </encoder>
+    </appender>
+
+    <!-- 输出日志到文件(异步) -->
+    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 不丢失日志,默认:如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 更改默认的队列的深度,该值会影响性能,默认:256 -->
+        <queueSize>512</queueSize>
+        <!-- 添加附加的 appender,最多只能添加一个 -->
+        <appender-ref ref="FILE"/>
+    </appender>
+
+    <!-- Snail Job Server -->
+    <appender name="JOB_SERVER" class="com.aizuda.snailjob.server.common.appender.SnailJobServerLogbackAppender" />
+
+    <!-- 开发环境:只打印到控制台 -->
+    <springProfile name="dev">
+        <!-- 如果配置的日志等级,和 application.yml 中的日志等级配置重叠,application.yml 配置优先级高 -->
+        <root level="INFO">
+            <appender-ref ref="CONSOLE"/>
+            <appender-ref ref="JOB_SERVER"/>
+        </root>
+    </springProfile>
+
+    <!-- 生产环境:打印到控制台并输出到文件 -->
+    <springProfile name="prod">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_PROD"/>
+            <appender-ref ref="ASYNC_FILE"/>
+            <appender-ref ref="JOB_SERVER"/>
+        </root>
+        <!-- 日志保留天数(根据国家法律,网络运行状态、网络安全事件、个人敏感信息操作等相关记录,留存的日志不少于六个月,并且进行网络多机备份。) -->
+        <property name="FILE_MAX_HISTORY" value="180"/>
+    </springProfile>
+</configuration>

+ 17 - 0
continew-extension/pom.xml

@@ -0,0 +1,17 @@
+<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>
+    <parent>
+        <groupId>top.continew</groupId>
+        <artifactId>continew-admin</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>continew-extension</artifactId>
+    <packaging>pom</packaging>
+    <description>扩展模块(存放其他扩展模块)</description>
+
+    <modules>
+        <module>continew-extension-schedule-server</module>
+    </modules>
+</project>

+ 22 - 0
continew-module-system/pom.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         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>
+    <parent>
+        <groupId>top.continew</groupId>
+        <artifactId>continew-admin</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>continew-module-system</artifactId>
+    <description>系统管理模块(存放系统管理相关业务功能,例如:部门管理、角色管理、用户管理等)</description>
+
+    <dependencies>
+        <!-- 公共模块(存放公共工具类,公共配置等) -->
+        <dependency>
+            <groupId>top.continew</groupId>
+            <artifactId>continew-common</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 66 - 0
continew-module-system/src/main/java/top/continew/admin/auth/model/query/OnlineUserQuery.java

@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.auth.model.query;
+
+import cn.hutool.core.date.DatePattern;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 在线用户查询条件
+ *
+ * @author Charles7c
+ * @since 2023/1/20 23:07
+ */
+@Data
+@Schema(description = "在线用户查询条件")
+public class OnlineUserQuery implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户昵称
+     */
+    @Schema(description = "用户昵称", example = "张三")
+    private String nickname;
+
+    /**
+     * 登录时间
+     */
+    @Schema(description = "登录时间", example = "2023-08-08 00:00:00,2023-08-08 23:59:59")
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    private List<Date> loginTime;
+
+    /**
+     * 用户 ID
+     */
+    @Schema(hidden = true)
+    private Long userId;
+
+    /**
+     * 角色 ID
+     */
+    @Schema(hidden = true)
+    private Long roleId;
+}

+ 64 - 0
continew-module-system/src/main/java/top/continew/admin/auth/model/req/AccountLoginReq.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.auth.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 账号登录参数
+ *
+ * @author Charles7c
+ * @since 2022/12/21 20:43
+ */
+@Data
+@Schema(description = "账号登录参数")
+public class AccountLoginReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户名
+     */
+    @Schema(description = "用户名", example = "zhangsan")
+    @NotBlank(message = "用户名不能为空")
+    private String username;
+
+    /**
+     * 密码(加密)
+     */
+    @Schema(description = "密码(加密)", example = "HHwZoiBwCfh0xLdWOAd0bHOkEZlIMMOQKJyeFUw9T3ArrhL57od2i42s1o0sSXKkeHPJXvQsninhPFH2lArDDQ==")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+    /**
+     * 验证码
+     */
+    @Schema(description = "验证码", example = "ABCD")
+    private String captcha;
+
+    /**
+     * 验证码标识
+     */
+    @Schema(description = "验证码标识", example = "090b9a2c-1691-4fca-99db-e4ed0cff362f")
+    private String uuid;
+}

+ 57 - 0
continew-module-system/src/main/java/top/continew/admin/auth/model/req/EmailLoginReq.java

@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.auth.model.req;
+
+import cn.hutool.core.lang.RegexPool;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 邮箱登录参数
+ *
+ * @author Charles7c
+ * @since 2023/10/23 20:15
+ */
+@Data
+@Schema(description = "邮箱登录参数")
+public class EmailLoginReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 邮箱
+     */
+    @Schema(description = "邮箱", example = "123456789@qq.com")
+    @NotBlank(message = "邮箱不能为空")
+    @Pattern(regexp = RegexPool.EMAIL, message = "邮箱格式错误")
+    private String email;
+
+    /**
+     * 验证码
+     */
+    @Schema(description = "验证码", example = "888888")
+    @NotBlank(message = "验证码不能为空")
+    @Length(max = 6, message = "验证码非法")
+    private String captcha;
+}

+ 57 - 0
continew-module-system/src/main/java/top/continew/admin/auth/model/req/PhoneLoginReq.java

@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.auth.model.req;
+
+import cn.hutool.core.lang.RegexPool;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 手机号登录参数
+ *
+ * @author Charles7c
+ * @since 2023/10/26 22:37
+ */
+@Data
+@Schema(description = "手机号登录参数")
+public class PhoneLoginReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 手机号
+     */
+    @Schema(description = "手机号", example = "13811111111")
+    @NotBlank(message = "手机号不能为空")
+    @Pattern(regexp = RegexPool.MOBILE, message = "手机号格式错误")
+    private String phone;
+
+    /**
+     * 验证码
+     */
+    @Schema(description = "验证码", example = "8888")
+    @NotBlank(message = "验证码不能为空")
+    @Length(max = 4, message = "验证码非法")
+    private String captcha;
+}

+ 75 - 0
continew-module-system/src/main/java/top/continew/admin/auth/model/resp/CaptchaResp.java

@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.auth.model.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 验证码信息
+ *
+ * @author Charles7c
+ * @since 2022/12/11 13:55
+ */
+@Data
+@Builder
+@Schema(description = "验证码信息")
+public class CaptchaResp implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 验证码标识
+     */
+    @Schema(description = "验证码标识", example = "090b9a2c-1691-4fca-99db-e4ed0cff362f")
+    private String uuid;
+
+    /**
+     * 验证码图片(Base64编码,带图片格式:data:image/gif;base64)
+     */
+    @Schema(description = "验证码图片(Base64编码,带图片格式:data:image/gif;base64)", example = "data:image/png;base64,iVBORw0KGgoAAAAN...")
+    private String img;
+
+    /**
+     * 过期时间戳
+     */
+    @Schema(description = "过期时间戳", example = "1714376969409")
+    private Long expireTime;
+
+    /**
+     * 是否启用
+     */
+    @Schema(description = "是否启用", example = "true")
+    private Boolean isEnabled;
+
+    /**
+     * 构建验证码信息
+     *
+     * @param uuid       验证码标识
+     * @param img        验证码图片(Base64编码,带图片格式:data:image/gif;base64)
+     * @param expireTime 过期时间戳
+     * @return 验证码信息
+     */
+    public static CaptchaResp of(String uuid, String img, Long expireTime) {
+        return CaptchaResp.builder().uuid(uuid).img(img).expireTime(expireTime).isEnabled(true).build();
+    }
+}

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