Gaokun Wang 2 months ago
commit
43464f80c4
100 changed files with 5905 additions and 0 deletions
  1. 53 0
      .gitignore
  2. 20 0
      LICENSE
  3. 246 0
      README.md
  4. BIN
      image/00.png
  5. BIN
      image/01.png
  6. BIN
      image/02.png
  7. BIN
      image/03.png
  8. BIN
      image/04.png
  9. BIN
      image/05.png
  10. BIN
      image/06.png
  11. BIN
      image/07.png
  12. BIN
      image/08.png
  13. BIN
      image/09.png
  14. BIN
      image/10.png
  15. BIN
      image/11.png
  16. BIN
      image/12.png
  17. BIN
      image/13.png
  18. BIN
      image/QQ区-官方交流1群.png
  19. 481 0
      pom.xml
  20. 35 0
      ruoyi-admin/Dockerfile
  21. 129 0
      ruoyi-admin/pom.xml
  22. 21 0
      ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java
  23. 18 0
      ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIServletInitializer.java
  24. 34 0
      ruoyi-admin/src/main/java/org/ruoyi/StartApplication.java
  25. 175 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/AuthController.java
  26. 152 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/CaptchaController.java
  27. 26 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/IndexController.java
  28. 184 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java
  29. 67 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/OllamaController.java
  30. 99 0
      ruoyi-admin/src/main/resources/application-dev.yml
  31. 98 0
      ruoyi-admin/src/main/resources/application-local.yml
  32. 174 0
      ruoyi-admin/src/main/resources/application-prod.yml
  33. 322 0
      ruoyi-admin/src/main/resources/application.yml
  34. 2 0
      ruoyi-admin/src/main/resources/banner.txt
  35. 54 0
      ruoyi-admin/src/main/resources/i18n/messages.properties
  36. 54 0
      ruoyi-admin/src/main/resources/i18n/messages_en_US.properties
  37. 54 0
      ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties
  38. BIN
      ruoyi-admin/src/main/resources/ip2region.xdb
  39. 129 0
      ruoyi-admin/src/main/resources/logback-plus.xml
  40. 1 0
      ruoyi-admin/src/main/resources/spy.properties
  41. 46 0
      ruoyi-admin/src/main/resources/static/.gitignore
  42. 0 0
      ruoyi-admin/src/main/resources/static/.nojekyll
  43. 1 0
      ruoyi-admin/src/main/resources/static/CNAME
  44. 74 0
      ruoyi-admin/src/main/resources/static/README.md
  45. 32 0
      ruoyi-admin/src/main/resources/static/_coverpage.md
  46. 2 0
      ruoyi-admin/src/main/resources/static/_footer.md
  47. 9 0
      ruoyi-admin/src/main/resources/static/_navbar.md
  48. 16 0
      ruoyi-admin/src/main/resources/static/_sidebar.md
  49. 27 0
      ruoyi-admin/src/main/resources/static/common/add_group.md
  50. 7 0
      ruoyi-admin/src/main/resources/static/common/blacklist.md
  51. 18 0
      ruoyi-admin/src/main/resources/static/common/column.md
  52. 69 0
      ruoyi-admin/src/main/resources/static/common/contribution.md
  53. 13 0
      ruoyi-admin/src/main/resources/static/common/demo_system.md
  54. 37 0
      ruoyi-admin/src/main/resources/static/common/pr.md
  55. 80 0
      ruoyi-admin/src/main/resources/static/common/user_register.md
  56. 85 0
      ruoyi-admin/src/main/resources/static/common/video.md
  57. 74 0
      ruoyi-admin/src/main/resources/static/index.html
  58. 22 0
      ruoyi-admin/src/main/resources/static/plus-ui/_sidebar.md
  59. 234 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/common_func.md
  60. 55 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/component_use.md
  61. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/content_copy.md
  62. 16 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/dev_norm.md
  63. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/dict_use.md
  64. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/exception_handling.md
  65. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/icon_use.md
  66. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/page_cache.md
  67. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/param_use.md
  68. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/permissions_use.md
  69. 65 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/request_process.md
  70. 82 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/router_use.md
  71. 53 0
      ruoyi-admin/src/main/resources/static/plus-ui/home.md
  72. 34 0
      ruoyi-admin/src/main/resources/static/questions/_sidebar.md
  73. 148 0
      ruoyi-admin/src/main/resources/static/questions/api_encrypt.md
  74. 10 0
      ruoyi-admin/src/main/resources/static/questions/bean_null.md
  75. 13 0
      ruoyi-admin/src/main/resources/static/questions/deploy_vue.md
  76. 41 0
      ruoyi-admin/src/main/resources/static/questions/domestic_databases.md
  77. 18 0
      ruoyi-admin/src/main/resources/static/questions/dubbo_ip.md
  78. 27 0
      ruoyi-admin/src/main/resources/static/questions/https_config.md
  79. 10 0
      ruoyi-admin/src/main/resources/static/questions/identify_fail.md
  80. 4 0
      ruoyi-admin/src/main/resources/static/questions/import_excel.md
  81. 12 0
      ruoyi-admin/src/main/resources/static/questions/jar_run_fail.md
  82. 3 0
      ruoyi-admin/src/main/resources/static/questions/jce_cannot.md
  83. 66 0
      ruoyi-admin/src/main/resources/static/questions/kinfe4j.md
  84. 69 0
      ruoyi-admin/src/main/resources/static/questions/login_step.md
  85. 4 0
      ruoyi-admin/src/main/resources/static/questions/lombok.md
  86. 35 0
      ruoyi-admin/src/main/resources/static/questions/nacos_naming_instance_metadata.md
  87. 15 0
      ruoyi-admin/src/main/resources/static/questions/nacos_read_fail.md
  88. 11 0
      ruoyi-admin/src/main/resources/static/questions/only_one_subscriber.md
  89. 40 0
      ruoyi-admin/src/main/resources/static/questions/parse_exception.md
  90. 15 0
      ruoyi-admin/src/main/resources/static/questions/permission_denied.md
  91. 11 0
      ruoyi-admin/src/main/resources/static/questions/read_metadata.md
  92. 8 0
      ruoyi-admin/src/main/resources/static/questions/sentinel_404.md
  93. 11 0
      ruoyi-admin/src/main/resources/static/questions/st_not_support.md
  94. 3 0
      ruoyi-admin/src/main/resources/static/questions/swagger.md
  95. 3 0
      ruoyi-admin/src/main/resources/static/questions/synchronous_update.md
  96. 20 0
      ruoyi-admin/src/main/resources/static/questions/use_druid.md
  97. 9 0
      ruoyi-admin/src/main/resources/static/questions/use_tomcat.md
  98. 70 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/_sidebar.md
  99. 1385 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/changlog.md
  100. 37 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/elk.md

+ 53 - 0
.gitignore

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

+ 20 - 0
LICENSE

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

+ 246 - 0
README.md

@@ -0,0 +1,246 @@
+
+
+# RuoYi AI
+
+
+
+<!-- PROJECT SHIELDS -->
+
+[![Contributors][contributors-shield]][contributors-url]
+[![Forks][forks-shield]][forks-url]
+[![Stargazers][stars-shield]][stars-url]
+[![Issues][issues-shield]][issues-url]
+[![MIT License][license-shield]][license-url]
+
+
+<!-- PROJECT LOGO -->
+<br />
+
+
+<img style="text-align: center;" src="image/00.png" alt="Logo" width="150" height="150">
+
+<h3 style="text-align: center;">快速搭建属于自己的 AI 助手平台</h3>
+
+<p style="text-align: center;">
+    全新升级,开箱即用,简单高效
+    <br />
+    <a href="https://doc.pandarobot.chat"><strong>探索本项目的文档 »</strong></a>
+    <br />
+    <br />
+    <a href="https://web.pandarobot.chat">项目预览</a>
+    ·
+    <a href="https://github.com/ageerle/ruoyi-ai/issues">报告Bug</a>
+    ·
+    <a href="https://github.com/ageerle/ruoyi-ai/issues">提出新特性</a>
+</p>
+
+## 目录
+
+- [源码地址](#源码地址)
+- [特色功能](#特色功能)
+- [项目演示](#项目演示)
+  - [后台管理](#后台管理)
+  - [用户端](#用户端)
+  - [小程序端](#小程序端)
+- [开发前的配置要求](#开发前的配置要求)
+- [文件目录说明](#文件目录说明)
+- [使用到的框架](#使用到的框架)
+- [贡献者](#贡献者)
+  - [如何参与开源项目](#如何参与开源项目)
+- [版本控制](#版本控制)
+- [作者](#作者)
+- [鸣谢](#鸣谢)
+
+### 源码地址
+- 项目文档: https://doc.pandarobot.chat
+- 前端-后台管理: https://github.com/ageerle/ruoyi-admin
+- 前端-用户端: https://github.com/ageerle/ruoyi-web
+- 小程序端: https://github.com/ageerle/ruoyi-uniapp
+- 演示地址: https://web.pandarobot.chat
+- 后台管理: https://admin.pandarobot.chat
+- 用户名: admin 密码:admin123
+
+### gitcode源码地址
+- https://gitcode.com/ageerle/ruoyi-ai
+- https://gitcode.com/ageerle/ruoyi-web
+- https://gitcode.com/ageerle/ruoyi-admin
+- https://gitcode.com/ageerle/ruoyi-uniapp
+
+### 特色功能
+1. 全套开源系统:提供完整的前端应用、后台管理以及小程序应用,基于MIT协议,开箱即用。
+2. 本地RAG方案:集成Milvus/Weaviate向量库、本地向量化模型与Ollama,实现本地化RAG
+3. 丰富插件功能:支持联网、SQL查询插件及Text2API插件,扩展系统能力与应用场景。
+4. 内置SSE、websocket等网络协议,支持对接多种大语言模型,同时还集成了MidJourney和DALLE AI绘画功能
+5. 强大的多媒体功能:支持AI翻译、PPT制作、语音克隆和翻唱等
+6. 扩展功能:支持将大模型接入个人或企业微信
+7. 支付功能:支持易支付、微信支付等多种支付方式
+
+### 项目演示
+
+#### 后台管理
+<div style="display: flex; flex-wrap: wrap; gap: 20px; justify-content: center;">
+  <img src="image/02.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+  <img src="image/03.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+  <img src="image/04.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+  <img src="image/05.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+</div>
+
+
+#### 用户端
+<div style="display: flex; flex-wrap: wrap; gap: 20px; justify-content: center;">
+  <img src="image/08.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+  <img src="image/09.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+  <img src="image/10.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+  <img src="image/11.png" alt="drawing" style="width: 600px; height: 300px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+</div>
+
+#### 小程序端
+<div style="display: flex; flex-wrap: wrap; gap: 20px; justify-content: flex-start;">
+  <img src="image/06.png" alt="drawing" style="width: 320px; height: 600px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+  <img src="image/07.png" alt="drawing" style="width: 320px; height: 600px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+</div>
+
+### 开发前的配置要求
+
+1. jdk 17
+2. mysql 5.7、8.0
+3. redis 版本必须 >= 5.X
+4. maven 3.8+
+5. nodejs 20+ & pnpm
+
+### 文件目录说明
+RuoYi-AI
+
+```
+├─ ruoyi-admin                         // 管理模块
+│  └─ RuoYiApplication                 // 启动类
+│  └─ RuoYiServletInitializer          // 容器部署初始化类
+│  └─ resources                        // 资源文件
+│      └─ i18n/messages.properties     // 国际化配置文件
+│      └─ application.yml              // 框架总配置文件
+│      └─ application-dev.yml          // 开发环境配置文件
+│      └─ application-prod.yml         // 生产环境配置文件
+│      └─ banner.txt                   // 框架启动图标
+│      └─ logback-plus.xml             // 日志配置文件
+│      └─ ip2region.xdb                // IP区域地址库
+├─ ruoyi-common                        // 通用模块
+│  └─ ruoyi-common-bom                 // common依赖包管理
+   └─ ruoyi-common-chat                // 聊天模块
+│  └─ ruoyi-common-core                // 核心模块
+│  └─ ruoyi-common-doc                 // 系统接口模块
+│  └─ ruoyi-common-encrypt             // 数据加解密模块
+│  └─ ruoyi-common-excel               // excel模块
+│  └─ ruoyi-common-idempotent          // 幂等功能模块
+│  └─ ruoyi-common-json                // 序列化模块
+│  └─ ruoyi-common-log                 // 日志模块
+│  └─ ruoyi-common-mail                // 邮件模块
+│  └─ ruoyi-common-mybatis             // 数据库模块
+│  └─ ruoyi-common-oss                 // oss服务模块
+│  └─ ruoyi-common-pay                 // 支付模块
+│  └─ ruoyi-common-ratelimiter         // 限流功能模块
+│  └─ ruoyi-common-redis               // 缓存服务模块
+│  └─ ruoyi-common-satoken             // satoken模块
+│  └─ ruoyi-common-security            // 安全模块
+│  └─ ruoyi-common-sensitive           // 脱敏模块
+│  └─ ruoyi-common-sms                 // 短信模块
+│  └─ ruoyi-common-tenant              // 租户模块
+│  └─ ruoyi-common-translation         // 通用翻译模块
+│  └─ ruoyi-common-web                 // web模块
+├─ ruoyi-modules                       // 模块组
+│  └─ ruoyi-demo                       // 演示模块
+│  └─ ruoyi-system                     // 业务模块
+├─ .run                 // 执行脚本文件
+├─ .editorconfig        // 编辑器编码格式配置
+├─ LICENSE              // 开源协议
+├─ pom.xml              // 公共依赖
+├─ README.md            // 框架说明文件
+
+
+```
+
+### 版本控制
+
+该项目使用Git进行版本管理。您可以在repository参看当前可用版本。
+
+
+
+### 版权说明
+
+该项目使用了MIT授权许可,详情请参阅 [LICENSE.txt](https://github.com/ageerle/ruoyi-ai/blob/main/LICENSE)
+
+###  项目现状
+
+目前,项目还处于早期阶段,距离成熟还有很长的路要走。由于个人精力有限,项目的发展速度受到了一定的限制。为了加快项目的进度,我真诚地希望更多人能够参与到项目中来。无论是经验丰富的开发者,还是刚刚入门的小白,我都热烈欢迎你们提交Pull Request(PR)。即使代码修改得很少,或者存在一些错误,都没有关系。我会认真审核每一位贡献者的代码,并和大家一起完善项目。
+
+###  开发计划
+
+- 智能体管理
+
+通过设置提示词、插件、知识库等,用户可以快速构建一个AI应用。这将极大地简化AI应用的开发流程,降低开发门槛,使更多企业能够轻松地利用AI技术。
+<div>
+  <img src="image/13.png" alt="drawing" width="600px" height="300px"/>
+</div>
+
+- 流程编排
+
+通过流程编排功能,用户可以将不同的模型按照业务逻辑进行有序连接。这将解决单一模型能力不足的问题,充分发挥多个模型的协同作用,从而更好地满足企业的复杂业务需求。
+
+-  感谢
+
+最后,我要感谢RuoYi-Vue-Plus、chatgpt-java、chatgpt-web-midjourney-proxy等优秀框架。正是因为这些项目的开源和共享,我才能够在这个基础上进行开发,使我们的项目能够取得今天的成果。再次感谢这些项目及其背后的开发者们!
+
+希望更多志同道合的朋友能够加入我们,共同推动这个项目的发展。让我们一起努力,将这个项目打造成一个真正成熟、实用的AI平台!
+
+#### 如何参与开源项目
+
+贡献使开源社区成为一个学习、激励和创造的绝佳场所。你所作的任何贡献都是**非常感谢**的。
+
+1. Fork 这个项目
+2. 创建你的功能分支 (`git checkout -b feature/dev`)
+3. 提交你的更改 (`git commit -m 'Add some dev'`)
+4. 推送到分支 (`git push origin feature/dev`)
+5. 打开拉取请求
+6. pr请提交到GitHub上,会定时同步到gitee
+
+#### 项目文档
+1. 项目文档基于vitepress构建
+2. 按照[如何参与开源项目](#如何参与开源项目)拉取 https://github.com/ageerle/ruoyi-doc
+3. 安装依赖:npm install
+4. 启动项目:npm run docs:dev
+5. 主页路径:docs/guide/introduction/index.md
+
+### 鸣谢
+- [chatgpt-java](https://github.com/Grt1228/chatgpt-java)
+- [RuoYi-Vue-Plus](https://gitee.com/dromara/RuoYi-Vue-Plus)
+- [chatgpt-web-midjourney-proxy](https://github.com/Dooy/chatgpt-web-midjourney-proxy)
+- [Vben Admin](https://github.com/vbenjs/vue-vben-admin)
+- [Naive UI](https://www.naiveui.com)
+
+<!-- links -->
+[your-project-path]:https://github.com/ageerle/ruoyi-ai
+[contributors-shield]: https://img.shields.io/github/contributors/ageerle/ruoyi-ai.svg?style=flat-square
+[contributors-url]: https://github.com/ageerle/ruoyi-ai/graphs/contributors
+[forks-shield]: https://img.shields.io/github/forks/ageerle/ruoyi-ai.svg?style=flat-square
+[forks-url]: https://github.com/ageerle/ruoyi-ai/network/members
+[stars-shield]: https://img.shields.io/github/stars/ageerle/ruoyi-ai.svg?style=flat-square
+[stars-url]: https://github.com/ageerle/ruoyi-ai/stargazers
+[issues-shield]: https://img.shields.io/github/issues/ageerle/ruoyi-ai.svg?style=flat-square
+[issues-url]: https://img.shields.io/github/issues/ageerle/ruoyi-ai.svg
+[license-shield]: https://img.shields.io/github/license/ageerle/ruoyi-ai.svg?style=flat-square
+[license-url]: https://github.com/ageerle/ruoyi-ai/blob/master/LICENSE.txt
+[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555
+
+
+### 附:讨论群
+    🏠 wx:ruoyi-ai(加人备注:ruoyi-ai)
+  
+    🏠 qq:1603234088 (加人备注:ruoyi-ai)
+
+        👏👏👏 ruoyi-ai官方交流1群(qq区):1034554687 
+
+<div style="display: flex; flex-wrap: wrap; gap: 20px; justify-content: center;">
+  <img src="image/QQ区-官方交流1群.png" alt="drawing" style="width: 400px; height: 400px; border: 2px solid #ddd; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);"/>
+</div>
+
+
+

BIN
image/00.png


BIN
image/01.png


BIN
image/02.png


BIN
image/03.png


BIN
image/04.png


BIN
image/05.png


BIN
image/06.png


BIN
image/07.png


BIN
image/08.png


BIN
image/09.png


BIN
image/10.png


BIN
image/11.png


BIN
image/12.png


BIN
image/13.png


BIN
image/QQ区-官方交流1群.png


+ 481 - 0
pom.xml

@@ -0,0 +1,481 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.ruoyi</groupId>
+    <artifactId>helper-ai</artifactId>
+    <version>${revision}</version>
+
+    <name>ruoyi-ai</name>
+    <url>https://gitee.com/ageerle/ruoyi-ai</url>
+    <description>AI助手</description>
+
+    <properties>
+        <revision>1.0.0</revision>
+        <spring-boot.version>3.0.6</spring-boot.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>21</java.version>
+        <spring-boot.mybatis>3.0.1</spring-boot.mybatis>
+        <springdoc.version>2.1.0</springdoc.version>
+        <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
+        <poi.version>5.2.3</poi.version>
+        <easyexcel.version>3.2.1</easyexcel.version>
+        <velocity.version>2.3</velocity.version>
+        <satoken.version>1.34.0</satoken.version>
+        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
+        <p6spy.version>3.9.1</p6spy.version>
+        <hutool.version>5.8.18</hutool.version>
+        <okhttp.version>4.10.0</okhttp.version>
+        <spring-boot-admin.version>3.0.3</spring-boot-admin.version>
+        <redisson.version>3.20.1</redisson.version>
+        <lock4j.version>2.2.4</lock4j.version>
+        <dynamic-ds.version>3.6.1</dynamic-ds.version>
+        <alibaba-ttl.version>2.14.2</alibaba-ttl.version>
+        <xxl-job.version>2.4.0</xxl-job.version>
+        <mapstruct-plus.version>1.2.1</mapstruct-plus.version>
+        <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
+        <lombok.version>1.18.36</lombok.version>
+        <bouncycastle.version>1.72</bouncycastle.version>
+        <!-- 离线IP地址定位库 -->
+        <ip2region.version>2.7.0</ip2region.version>
+
+        <!-- 临时修复 snakeyaml 漏洞 -->
+        <snakeyaml.version>1.33</snakeyaml.version>
+
+        <!-- OSS 配置 -->
+        <aws-java-sdk-s3.version>1.12.400</aws-java-sdk-s3.version>
+        <!-- SMS 配置 -->
+        <aliyun.sms.version>2.0.23</aliyun.sms.version>
+        <tencent.sms.version>3.1.687</tencent.sms.version>
+
+        <!-- 插件版本 -->
+        <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
+        <maven-war-plugin.version>3.2.2</maven-war-plugin.version>
+        <maven-compiler-plugin.verison>3.11.0</maven-compiler-plugin.verison>
+        <maven-surefire-plugin.version>3.0.0</maven-surefire-plugin.version>
+        <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
+        <weixin-java-miniapp.version>4.5.0</weixin-java-miniapp.version>
+        <weixin-java-pay.version>4.6.0</weixin-java-pay.version>
+        <weixin-java-cp.version>4.6.0</weixin-java-cp.version>
+    </properties>
+
+    <profiles>
+        <profile>
+            <id>local</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>local</profiles.active>
+                <logging.level>debug</logging.level>
+            </properties>
+        </profile>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>dev</profiles.active>
+                <logging.level>debug</logging.level>
+            </properties>
+            <activation>
+                <!-- 默认环境 -->
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <profiles.active>prod</profiles.active>
+                <logging.level>warn</logging.level>
+            </properties>
+        </profile>
+    </profiles>
+
+    <!-- 依赖声明 -->
+    <dependencyManagement>
+        <dependencies>
+
+            <!-- SpringBoot的依赖配置-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- hutool 的依赖配置-->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-bom</artifactId>
+                <version>${hutool.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- common 的依赖配置-->
+            <dependency>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-common-bom</artifactId>
+                <version>${revision}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springdoc</groupId>
+                <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
+                <version>${springdoc.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.github.therapi</groupId>
+                <artifactId>therapi-runtime-javadoc</artifactId>
+                <version>${therapi-javadoc.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.poi</groupId>
+                        <artifactId>poi-ooxml-schemas</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
+            <!-- velocity代码生成使用模板 -->
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity-engine-core</artifactId>
+                <version>${velocity.version}</version>
+            </dependency>
+
+            <!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-spring-boot3-starter</artifactId>
+                <version>${satoken.version}</version>
+            </dependency>
+            <!-- Sa-Token 整合 jwt -->
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-jwt</artifactId>
+                <version>${satoken.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>cn.hutool</groupId>
+                        <artifactId>hutool-all</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-core</artifactId>
+                <version>${satoken.version}</version>
+            </dependency>
+
+            <!-- dynamic-datasource 多数据源-->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+                <version>${dynamic-ds.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.mybatis.spring.boot</groupId>
+                <artifactId>mybatis-spring-boot-starter</artifactId>
+                <version>${spring-boot.mybatis}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-annotation</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+
+            <!-- sql性能分析插件 -->
+            <dependency>
+                <groupId>p6spy</groupId>
+                <artifactId>p6spy</artifactId>
+                <version>${p6spy.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.amazonaws</groupId>
+                <artifactId>aws-java-sdk-s3</artifactId>
+                <version>${aws-java-sdk-s3.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.aliyun</groupId>
+                <artifactId>dysmsapi20170525</artifactId>
+                <version>${aliyun.sms.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.tencentcloudapi</groupId>
+                <artifactId>tencentcloud-sdk-java-sms</artifactId>
+                <version>${tencent.sms.version}</version>
+            </dependency>
+
+            <!--            <dependency>-->
+            <!--                <groupId>de.codecentric</groupId>-->
+            <!--                <artifactId>spring-boot-admin-starter-server</artifactId>-->
+            <!--                <version>${spring-boot-admin.version}</version>-->
+            <!--            </dependency>-->
+            <!--            <dependency>-->
+            <!--                <groupId>de.codecentric</groupId>-->
+            <!--                <artifactId>spring-boot-admin-starter-client</artifactId>-->
+            <!--                <version>${spring-boot-admin.version}</version>-->
+            <!--            </dependency>-->
+
+            <!--redisson-->
+            <dependency>
+                <groupId>org.redisson</groupId>
+                <artifactId>redisson-spring-boot-starter</artifactId>
+                <version>${redisson.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
+                <version>${lock4j.version}</version>
+            </dependency>
+
+            <!-- xxl-job-core -->
+            <dependency>
+                <groupId>com.xuxueli</groupId>
+                <artifactId>xxl-job-core</artifactId>
+                <version>${xxl-job.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>transmittable-thread-local</artifactId>
+                <version>${alibaba-ttl.version}</version>
+            </dependency>
+
+            <!-- 临时修复 snakeyaml 漏洞 -->
+            <dependency>
+                <groupId>org.yaml</groupId>
+                <artifactId>snakeyaml</artifactId>
+                <version>${snakeyaml.version}</version>
+            </dependency>
+
+            <!-- 加密包引入 -->
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcprov-jdk15to18</artifactId>
+                <version>${bouncycastle.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>io.github.linpeilie</groupId>
+                <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
+                <version>${mapstruct-plus.version}</version>
+            </dependency>
+
+            <!-- 离线IP地址定位库 ip2region -->
+            <dependency>
+                <groupId>org.lionsoul</groupId>
+                <artifactId>ip2region</artifactId>
+                <version>${ip2region.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-system</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-chat</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-knowledge</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-generator</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-demo</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+    <modules>
+        <module>ruoyi-admin</module>
+        <module>ruoyi-common</module>
+        <module>ruoyi-modules</module>
+    </modules>
+    <packaging>pom</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.verison}</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>com.github.therapi</groupId>
+                            <artifactId>therapi-runtime-javadoc-scribe</artifactId>
+                            <version>${therapi-javadoc.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                            <version>${lombok.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.springframework.boot</groupId>
+                            <artifactId>spring-boot-configuration-processor</artifactId>
+                            <version>${spring-boot.version}</version>
+                        </path>
+                        <path>
+                            <groupId>io.github.linpeilie</groupId>
+                            <artifactId>mapstruct-plus-processor</artifactId>
+                            <version>${mapstruct-plus.version}</version>
+                        </path>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok-mapstruct-binding</artifactId>
+                            <version>${mapstruct-plus.lombok.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                    <compilerArgs>
+                        <arg>-parameters</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <!-- 单元测试使用 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${maven-surefire-plugin.version}</version>
+                <configuration>
+                    <!-- 根据打包环境执行对应的@Tag测试方法 -->
+                    <groups>${profiles.active}</groups>
+                    <!-- 排除标签 -->
+                    <excludedGroups>exclude</excludedGroups>
+                </configuration>
+            </plugin>
+            <!-- 统一版本号管理 -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>flatten-maven-plugin</artifactId>
+                <version>${flatten-maven-plugin.version}</version>
+                <configuration>
+                    <updatePomFile>true</updatePomFile>
+                    <flattenMode>resolveCiFriendliesOnly</flattenMode>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>flatten</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>flatten</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>flatten.clean</id>
+                        <phase>clean</phase>
+                        <goals>
+                            <goal>clean</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <!-- 关闭过滤 -->
+                <filtering>false</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <!-- 引入所有 匹配文件进行过滤 -->
+                <includes>
+                    <include>application*</include>
+                    <include>bootstrap*</include>
+                    <include>banner*</include>
+                </includes>
+                <!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>https://maven.aliyun.com/repository/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>https://maven.aliyun.com/repository/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>
+
+

+ 35 - 0
ruoyi-admin/Dockerfile

@@ -0,0 +1,35 @@
+#基础镜像
+FROM findepi/graalvm:java17-native
+
+# 设置环境变量
+ENV LANG C.UTF-8
+ENV LANGUAGE C.UTF-8
+ENV LC_ALL C.UTF-8
+ENV SERVER_PORT=6039
+
+MAINTAINER ageerle
+
+RUN mkdir -p /ruoyi/server/logs \
+    /ruoyi/server/temp \
+    /ruoyi/skywalking/agent
+
+
+#工作空间
+WORKDIR /ruoyi/server
+
+
+
+EXPOSE ${SERVER_PORT}
+
+ADD ./target/ruoyi-admin.jar ./app.jar
+
+
+ENTRYPOINT ["java", \
+            "-Djava.security.egd=file:/dev/./urandom", \
+            "-Dserver.port=${SERVER_PORT}", \
+            # 应用名称 如果想区分集群节点监控 改成不同的名称即可
+#            "-Dskywalking.agent.service_name=ruoyi-server", \
+#            "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
+            "-jar", "app.jar"]
+
+

+ 129 - 0
ruoyi-admin/pom.xml

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>helper-ai</artifactId>
+        <groupId>org.ruoyi</groupId>
+        <version>${revision}</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
+    <artifactId>ruoyi-admin</artifactId>
+
+    <description>
+        web服务入口
+    </description>
+
+    <dependencies>
+
+        <!-- Mysql驱动包 -->
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+
+        <!-- Oracle -->
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+        </dependency>
+
+        <!-- PostgreSql -->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+
+        <!-- SqlServer -->
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-chat</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-knowledge</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-generator</artifactId>
+        </dependency>
+
+        <!--  demo模块  -->
+        <dependency>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-demo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- 添加thumbnailator依赖 -->
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.11</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.ollama4j</groupId>
+            <artifactId>ollama4j</artifactId>
+            <version>1.0.79</version>
+            <scope>compile</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>${maven-jar-plugin.version}</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>${maven-war-plugin.version}</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 21 - 0
ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java

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

+ 18 - 0
ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIServletInitializer.java

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

+ 34 - 0
ruoyi-admin/src/main/java/org/ruoyi/StartApplication.java

@@ -0,0 +1,34 @@
+package org.ruoyi;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.Banner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.env.Environment;
+
+/**
+ * 启动程序
+ *
+ * @author Lion Li
+ */
+@SpringBootApplication
+@Slf4j
+public class StartApplication {
+
+    public static void main(String[] args) {
+        SpringApplication springApplication = new SpringApplication(StartApplication.class);
+        springApplication.setBannerMode(Banner.Mode.OFF);
+        springApplication.setApplicationStartup(new BufferingApplicationStartup(2048));
+        ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args);
+        Environment env = configurableApplicationContext.getEnvironment();
+        log.info("""
+                        StartApplication
+                        ----------------------------------------------------------
+                        -------------   URLs: http://localhost:{}
+                                        Startup successful, welcome!    ----------
+                        ----------------------------------------------------------""",
+                env.getProperty("server.port"));
+    }
+}

+ 175 - 0
ruoyi-admin/src/main/java/org/ruoyi/controller/AuthController.java

@@ -0,0 +1,175 @@
+package org.ruoyi.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.ruoyi.common.core.constant.Constants;
+import org.ruoyi.common.core.domain.R;
+import org.ruoyi.common.core.domain.model.EmailLoginBody;
+import org.ruoyi.common.core.domain.model.LoginBody;
+import org.ruoyi.common.core.domain.model.RegisterBody;
+import org.ruoyi.common.core.domain.model.SmsLoginBody;
+import org.ruoyi.common.core.domain.model.VisitorLoginBody;
+import org.ruoyi.common.core.utils.MapstructUtils;
+import org.ruoyi.common.core.utils.StreamUtils;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.ruoyi.common.satoken.utils.LoginHelper;
+import org.ruoyi.common.tenant.helper.TenantHelper;
+import org.ruoyi.system.domain.bo.SysTenantBo;
+import org.ruoyi.system.domain.vo.LoginTenantVo;
+import org.ruoyi.system.domain.vo.SysTenantVo;
+import org.ruoyi.system.domain.vo.TenantListVo;
+import org.ruoyi.system.service.ISysTenantService;
+
+import org.ruoyi.system.service.SysLoginService;
+import org.ruoyi.system.service.SysRegisterService;
+import org.ruoyi.system.domain.vo.LoginVo;
+
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URL;
+import java.util.List;
+
+/**
+ * 认证
+ *
+ * @author Lion Li
+ */
+@SaIgnore
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/auth")
+public class AuthController {
+
+    private final SysLoginService loginService;
+    private final SysRegisterService registerService;
+    private final ISysTenantService tenantService;
+
+
+    @PostMapping("/xcxLogin")
+    public R<LoginVo> login(@Validated @RequestBody String xcxCode) throws WxErrorException {
+
+        String openidFromCode = loginService.getOpenidFromCode((String) JSONUtil.parseObj(xcxCode).get("xcxCode"));
+        LoginVo loginVo = loginService.mpLogin(openidFromCode);
+            return R.ok(loginVo);
+    }
+
+    /**
+     * 登录方法
+     *
+     * @param body 登录信息
+     * @return 结果
+     */
+    @PostMapping("/login")
+    public R<LoginVo> login(@Validated @RequestBody LoginBody body) {
+        body.setTenantId(Constants.TENANT_ID);
+        LoginVo loginVo = new LoginVo();
+        // 生成令牌
+        String token = loginService.login(
+                body.getTenantId(),
+                body.getUsername(), body.getPassword(),
+                body.getCode(), body.getUuid());
+        loginVo.setToken(token);
+        loginVo.setAccess_token(token);
+        loginVo.setUserInfo(LoginHelper.getLoginUser());
+        return R.ok(loginVo);
+    }
+
+    /**
+     * 短信登录
+     *
+     * @param body 登录信息
+     * @return 结果
+     */
+    @PostMapping("/smsLogin")
+    public R<LoginVo> smsLogin(@Validated @RequestBody SmsLoginBody body) {
+        LoginVo loginVo = new LoginVo();
+        // 生成令牌
+        String token = loginService.smsLogin(body.getTenantId(), body.getPhonenumber(), body.getSmsCode());
+        loginVo.setToken(token);
+        return R.ok(loginVo);
+    }
+
+    /**
+     * 访客登录
+     *
+     * @param loginBody 登录信息
+     * @return token信息
+     */
+    @PostMapping("/visitorLogin")
+    public R<LoginVo> visitorLogin(@RequestBody VisitorLoginBody loginBody) {
+        LoginVo loginVo = new LoginVo();
+        return R.ok(loginVo);
+    }
+
+    /**
+     * 邮件登录
+     *
+     * @param body 登录信息
+     * @return 结果
+     */
+    @PostMapping("/emailLogin")
+    public R<LoginVo> emailLogin(@Validated @RequestBody EmailLoginBody body) {
+        LoginVo loginVo = new LoginVo();
+        // 生成令牌
+        String token = loginService.emailLogin(body.getTenantId(), body.getEmail(), body.getEmailCode());
+        loginVo.setToken(token);
+        return R.ok(loginVo);
+    }
+
+    /**
+     * 退出登录
+     */
+    @PostMapping("/logout")
+    public R<Void> logout() {
+        loginService.logout();
+        return R.ok("退出成功");
+    }
+
+    /**
+     * 用户注册
+     */
+    @PostMapping("/register")
+    public R<Void> register(@Validated @RequestBody RegisterBody user, HttpServletRequest request) {
+        String domainName = request.getServerName();
+        user.setDomainName(domainName);
+        registerService.register(user);
+        return R.ok();
+    }
+
+    /**
+     * 重置密码
+     */
+    @PostMapping("/reset/password")
+    @SaIgnore
+    public R<Void> resetPassWord(@Validated @RequestBody RegisterBody user) {
+        registerService.resetPassWord(user);
+        return R.ok();
+    }
+
+    /**
+     * 登录页面租户下拉框
+     *
+     * @return 租户列表
+     */
+    @GetMapping("/tenant/list")
+    public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
+        List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo());
+        List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
+        // 获取域名
+        String host = new URL(request.getRequestURL().toString()).getHost();
+        // 根据域名进行筛选
+        List<TenantListVo> list = StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(), host));
+        // 返回对象
+        LoginTenantVo vo = new LoginTenantVo();
+        vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
+        vo.setTenantEnabled(TenantHelper.isEnable());
+        return R.ok(vo);
+    }
+
+}

+ 152 - 0
ruoyi-admin/src/main/java/org/ruoyi/controller/CaptchaController.java

@@ -0,0 +1,152 @@
+package org.ruoyi.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.captcha.AbstractCaptcha;
+import cn.hutool.captcha.generator.CodeGenerator;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.RandomUtil;
+import org.ruoyi.common.core.constant.Constants;
+import org.ruoyi.common.core.constant.GlobalConstants;
+import org.ruoyi.common.core.domain.R;
+import org.ruoyi.common.core.exception.ServiceException;
+import org.ruoyi.common.core.service.ConfigService;
+import org.ruoyi.common.core.utils.SpringUtils;
+import org.ruoyi.common.core.utils.StringUtils;
+import org.ruoyi.common.core.utils.reflect.ReflectUtils;
+import org.ruoyi.common.mail.utils.MailUtils;
+import org.ruoyi.common.redis.utils.RedisUtils;
+import org.ruoyi.common.sms.config.properties.SmsProperties;
+import org.ruoyi.common.sms.core.SmsTemplate;
+import org.ruoyi.common.sms.entity.SmsResult;
+import org.ruoyi.common.web.config.properties.CaptchaProperties;
+import org.ruoyi.common.web.enums.CaptchaType;
+import org.ruoyi.system.domain.request.EmailRequest;
+import org.ruoyi.system.domain.vo.CaptchaVo;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Duration;
+import java.util.*;
+
+/**
+ * 验证码操作处理
+ *
+ * @author Lion Li
+ */
+@SaIgnore
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+public class CaptchaController {
+
+    private final CaptchaProperties captchaProperties;
+    private final SmsProperties smsProperties;
+    private final ConfigService configService;
+
+    /**
+     * 短信验证码
+     *
+     * @param phonenumber 用户手机号
+     */
+    @GetMapping("/resource/sms/code")
+    public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
+        if (!smsProperties.getEnabled()) {
+            return R.fail("当前系统没有开启短信功能!");
+        }
+        String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
+        String code = RandomUtil.randomNumbers(4);
+        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        // 验证码模板id 自行处理 (查数据库或写死均可)
+        String templateId = "";
+        Map<String, String> map = new HashMap<>(1);
+        map.put("code", code);
+        SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
+        SmsResult result = smsTemplate.send(phonenumber, templateId, map);
+        if (!result.isSuccess()) {
+            log.error("验证码短信发送异常 => {}", result);
+            return R.fail(result.getMessage());
+        }
+        return R.ok();
+    }
+
+    /**
+     * 邮箱验证码
+     *
+     * @param emailRequest 用户邮箱
+     */
+    @PostMapping("/resource/email/code")
+    public R<Void> emailCode(@RequestBody @Valid EmailRequest emailRequest) {
+        String key = GlobalConstants.CAPTCHA_CODE_KEY + emailRequest.getUsername();
+        String code = RandomUtil.randomNumbers(4);
+        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        // 检验邮箱后缀
+        String suffix = configService.getConfigValue("mail", "suffix");
+        String prompt = configService.getConfigValue("mail", "prompt");
+        if(StringUtils.isNotEmpty(suffix)){
+            // 动态的域名列表
+            String[] invalidDomains = suffix.split(",");
+            for (String domain : invalidDomains) {
+                if (emailRequest.getUsername().endsWith(domain)) {
+                    throw new ServiceException(prompt);
+                }
+            }
+        }
+        // 自定义邮箱模板
+        String model = configService.getConfigValue("mail", "mailModel");
+        String mailTitle = configService.getConfigValue("mail", "mailTitle");
+        String replacedModel = model.replace("{code}", code);
+        try {
+            MailUtils.sendHtml(emailRequest.getUsername(), mailTitle, replacedModel);
+        } catch (Exception e) {
+            log.error("邮箱验证码发送异常 => {}", e.getMessage());
+            return R.fail(e.getMessage());
+        }
+        return R.ok();
+    }
+
+    /**
+     * 生成验证码
+     */
+    @GetMapping("/auth/code")
+    public R<CaptchaVo> getCode() {
+        CaptchaVo captchaVo = new CaptchaVo();
+        boolean captchaEnabled = captchaProperties.getEnable();
+        if (!captchaEnabled) {
+            captchaVo.setCaptchaEnabled(false);
+            return R.ok(captchaVo);
+        }
+        // 保存验证码信息
+        String uuid = IdUtil.simpleUUID();
+        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
+        // 生成验证码
+        CaptchaType captchaType = captchaProperties.getType();
+        boolean isMath = CaptchaType.MATH == captchaType;
+        Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
+        CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
+        AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
+        captcha.setGenerator(codeGenerator);
+        captcha.createCode();
+        String code = captcha.getCode();
+        if (isMath) {
+            ExpressionParser parser = new SpelExpressionParser();
+            Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
+            code = exp.getValue(String.class);
+        }
+        RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        captchaVo.setUuid(uuid);
+        captchaVo.setImg(captcha.getImageBase64());
+        return R.ok(captchaVo);
+    }
+
+}

+ 26 - 0
ruoyi-admin/src/main/java/org/ruoyi/controller/IndexController.java

@@ -0,0 +1,26 @@
+package org.ruoyi.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 首页
+ *
+ * @author Lion Li
+ */
+@SaIgnore
+@RequiredArgsConstructor
+@RestController
+public class IndexController {
+
+    /**
+     * 访问首页,提示语
+     */
+    @GetMapping("/")
+    public String index() {
+        return "RuoYi-AI 启动成功";
+    }
+
+}

+ 184 - 0
ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java

@@ -0,0 +1,184 @@
+package org.ruoyi.controller;
+
+import cn.dev33.satoken.stp.StpUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.ruoyi.common.chat.domain.request.ChatRequest;
+import org.ruoyi.common.chat.entity.chat.Message;
+import org.ruoyi.common.core.domain.R;
+import org.ruoyi.common.core.validate.AddGroup;
+import org.ruoyi.common.excel.utils.ExcelUtil;
+import org.ruoyi.common.log.annotation.Log;
+import org.ruoyi.common.log.enums.BusinessType;
+import org.ruoyi.common.mybatis.core.page.PageQuery;
+import org.ruoyi.common.mybatis.core.page.TableDataInfo;
+import org.ruoyi.common.satoken.utils.LoginHelper;
+import org.ruoyi.common.web.core.BaseController;
+import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
+import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
+import org.ruoyi.knowledge.domain.bo.KnowledgeFragmentBo;
+import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
+import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
+import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
+import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
+import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.knowledge.service.EmbeddingService;
+import org.ruoyi.knowledge.service.IKnowledgeAttachService;
+import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
+import org.ruoyi.knowledge.service.IKnowledgeInfoService;
+import org.ruoyi.system.service.ISseService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+import java.util.List;
+
+
+/**
+ * 知识库
+ *
+ * @author Lion Li
+ * @date 2024-10-21
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/knowledge")
+public class KnowledgeController extends BaseController {
+
+    private final IKnowledgeInfoService knowledgeInfoService;
+
+    private final VectorStore vectorStore;
+
+    private final IKnowledgeAttachService attachService;
+
+    private final IKnowledgeFragmentService fragmentService;
+
+    private final EmbeddingService embeddingService;
+
+    private final ISseService sseService;
+
+    /**
+     * 知识库对话
+     */
+    @PostMapping("/send")
+    public SseEmitter send(@RequestBody @Valid ChatRequest chatRequest, HttpServletRequest request) {
+        List<Message> messages = chatRequest.getMessages();
+        // 获取知识库信息
+        Message message = messages.get(messages.size() - 1);
+        StringBuilder sb = new StringBuilder(message.getContent().toString());
+        List<String> nearestList;
+        List<Double> queryVector = embeddingService.getQueryVector(message.getContent().toString(), chatRequest.getKid());
+        nearestList = vectorStore.nearest(queryVector, chatRequest.getKid());
+        for (String prompt : nearestList) {
+            sb.append("\n####").append(prompt);
+        }
+        sb.append( (nearestList.size() > 0 ? "\n\n注意:回答问题时,须严格根据我给你的系统上下文内容原文进行回答,请不要自己发挥,回答时保持原来文本的段落层级" : ""));
+        message.setContent(sb.toString());
+        return sseService.sseChat(chatRequest, request);
+    }
+
+    /**
+     * 根据用户信息查询本地知识库
+     */
+    @GetMapping("/list")
+    public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
+        if(!StpUtil.isLogin()){
+            return null;
+        }
+        bo.setUid(LoginHelper.getUserId());
+        return knowledgeInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 新增知识库
+     */
+    @Log(title = "知识库", businessType = BusinessType.INSERT)
+    @PostMapping("/save")
+    public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
+        knowledgeInfoService.saveOne(bo);
+        return R.ok();
+    }
+
+    /**
+     * 删除知识库
+     */
+    @PostMapping("/remove/{id}")
+    public R<String> remove(@PathVariable String id){
+        knowledgeInfoService.removeKnowledge(id);
+        return R.ok("删除知识库成功!");
+    }
+
+    /**
+     * 修改知识库
+     */
+    @Log(title = "知识库", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public R<Void> edit( @RequestBody KnowledgeInfoBo bo) {
+        return toAjax(knowledgeInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 导出知识库列表
+     */
+    @Log(title = "知识库", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
+        List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "知识库", KnowledgeInfoVo.class, response);
+    }
+
+    /**
+     * 查询知识附件信息
+     */
+    @GetMapping("/detail/{kid}")
+    public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,@PathVariable String kid){
+        bo.setKid(kid);
+        return attachService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 上传知识库附件
+     */
+    @PostMapping(value = "/attach/upload")
+    public R<String> upload(KnowledgeInfoUploadRequest request){
+        knowledgeInfoService.upload(request);
+        return R.ok("上传知识库附件成功!");
+    }
+
+    /**
+     * 获取知识库附件详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("attach/info/{id}")
+    public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "主键不能为空")
+                                              @PathVariable Long id) {
+        return R.ok(attachService.queryById(id));
+    }
+
+    /**
+     * 删除知识库附件
+     *
+     */
+    @PostMapping("attach/remove/{docId}")
+    public R<Void> removeAttach(@NotEmpty(message = "主键不能为空") @PathVariable String docId) {
+        attachService.removeKnowledgeAttach(docId);
+        return R.ok();
+    }
+
+
+    /**
+     * 查询知识片段
+     */
+    @GetMapping("/fragment/list/{docId}")
+    public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo, PageQuery pageQuery, @PathVariable String docId) {
+        bo.setDocId(docId);
+        return fragmentService.queryPageList(bo, pageQuery);
+    }
+
+}

+ 67 - 0
ruoyi-admin/src/main/java/org/ruoyi/controller/OllamaController.java

@@ -0,0 +1,67 @@
+package org.ruoyi.controller;
+
+
+import io.github.ollama4j.OllamaAPI;
+import io.github.ollama4j.exceptions.OllamaBaseException;
+import io.github.ollama4j.models.chat.OllamaChatMessageRole;
+import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
+import io.github.ollama4j.models.chat.OllamaChatRequestModel;
+import io.github.ollama4j.models.chat.OllamaChatResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+
+/**
+ * 描述:Ollama API调用
+ *
+ * @author ageerle@163.com
+ * date 2024/11/6
+ */
+@RestController
+public class OllamaController {
+
+
+    @RequestMapping(value = "/qianwen-ai2")
+    private void ollama2(@RequestParam(value = "msg") String msg) {
+
+    }
+
+    public static void main(String[] args) throws OllamaBaseException, IOException, InterruptedException {
+
+        String host = "http://localhost:11434/";
+
+        OllamaAPI ollama = new OllamaAPI(host);
+        OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance("qwen2.5:7b");
+        // 设置超时时间
+        ollama.setRequestTimeoutSeconds(100);
+        // create first user question
+        String text = "";
+
+        String json = "{\"instruction\": \"解答以下数学问题。\",\"input\": \"计算 2 + 3 的结果。\",\"output\": \"2 + 3 = 5\"}";
+
+        OllamaChatRequestModel requestModel = builder.withMessage
+                (OllamaChatMessageRole.USER, "###文本:"+text+"###,理解文本内容,并且将文本内容转换为:"+json+"输出JSON格式,不要包含其他无关内容,内部使用无需脱敏")
+            .withGetJsonResponse()
+            .withStreaming()
+            .build();
+
+        // start conversation with model
+        OllamaChatResult chatResult = ollama.chat(requestModel);
+
+        System.out.println("First answer: " + chatResult.getResponse());
+
+        // create next userQuestion
+       // requestModel = builder.withMessages(chatResult.getChatHistory()).withMessage(OllamaChatMessageRole.USER, "And what is the second largest city?").build();
+
+        // "continue" conversation with model
+      //  chatResult = ollamaAPI.chat(requestModel);
+
+        //System.out.println("Second answer: " + chatResult.getResponse());
+
+        // 历史记录
+        //System.out.println("Chat History: " + chatResult.getChatHistory());
+    }
+
+}

+ 99 - 0
ruoyi-admin/src/main/resources/application-dev.yml

@@ -0,0 +1,99 @@
+--- # 监控中心配置
+spring.boot.admin.client:
+  # 增加客户端开关
+  enabled: false
+  url: http://localhost:9090/admin
+  instance:
+    service-host-type: IP
+  username: ruoyi
+  password: 123456
+
+--- # 数据源配置
+spring:
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
+    dynamic:
+      # 性能分析插件(有性能损耗 不建议生产环境使用)
+      p6spy: true
+      # 设置默认的数据源或者数据源组,默认值即为 master
+      primary: master
+      # 严格模式 匹配不到数据源则报错
+      strict: true
+      datasource:
+        # 主库数据源
+        master:
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://43.139.70.230:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          username: ruoyi-ai
+          password: ruoyi-ai
+
+
+      hikari:
+        # 最大连接池数量
+        maxPoolSize: 20
+        # 最小空闲线程数量
+        minIdle: 10
+        # 配置获取连接等待超时的时间
+        connectionTimeout: 30000
+        # 校验超时时间
+        validationTimeout: 5000
+        # 空闲连接存活最大时间,默认10分钟
+        idleTimeout: 600000
+        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
+        maxLifetime: 1800000
+        # 连接测试query(配置检测连接是否有效)
+        connectionTestQuery: SELECT 1
+        # 多久检查一次连接的活性
+        keepaliveTime: 30000
+
+--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
+spring.data:
+  redis:
+    # 地址
+    host: 127.0.0.1
+    # 端口,默认为6379
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码(如没有密码请注释掉)
+    # password: 123456
+    # 连接超时时间
+    timeout: 10S
+    # 是否开启ssl
+    ssl: false
+
+redisson:
+  # redis key前缀
+  keyPrefix:
+  # 线程池数量
+  threads: 4
+  # Netty线程池数量
+  nettyThreads: 8
+  # 单节点配置
+  singleServerConfig:
+    # 客户端名称
+    clientName: ${ruoyi.name}
+    # 最小空闲连接数
+    connectionMinimumIdleSize: 8
+    # 连接池大小
+    connectionPoolSize: 32
+    # 连接空闲超时,单位:毫秒
+    idleConnectionTimeout: 10000
+    # 命令等待超时,单位:毫秒
+    timeout: 3000
+    # 发布和订阅连接池大小
+    subscriptionConnectionPoolSize: 50
+
+--- # sms 短信
+sms:
+  enabled: false
+  # 阿里云 dysmsapi.aliyuncs.com
+  # 腾讯云 sms.tencentcloudapi.com
+  endpoint: "dysmsapi.aliyuncs.com"
+  accessKeyId: xxxxxxx
+  accessKeySecret: xxxxxx
+  signName: 测试
+  # 腾讯专用
+  sdkAppId:

+ 98 - 0
ruoyi-admin/src/main/resources/application-local.yml

@@ -0,0 +1,98 @@
+--- # 监控中心配置
+spring.boot.admin.client:
+  # 增加客户端开关
+  enabled: false
+  url: http://localhost:9090/admin
+  instance:
+    service-host-type: IP
+  username: eco
+  password: 123456
+
+--- # 数据源配置
+spring:
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
+    dynamic:
+      # 性能分析插件(有性能损耗 不建议生产环境使用)
+      p6spy: true
+      # 设置默认的数据源或者数据源组,默认值即为 master
+      primary: master
+      # 严格模式 匹配不到数据源则报错
+      strict: true
+      datasource:
+        # 主库数据源
+        master:
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://localhost:3306/eco?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          username: root
+          password: root123
+
+      hikari:
+        # 最大连接池数量
+        maxPoolSize: 20
+        # 最小空闲线程数量
+        minIdle: 10
+        # 配置获取连接等待超时的时间
+        connectionTimeout: 30000
+        # 校验超时时间
+        validationTimeout: 5000
+        # 空闲连接存活最大时间,默认10分钟
+        idleTimeout: 600000
+        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
+        maxLifetime: 1800000
+        # 连接测试query(配置检测连接是否有效)
+        connectionTestQuery: SELECT 1
+        # 多久检查一次连接的活性
+        keepaliveTime: 30000
+
+--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
+spring.data:
+  redis:
+    # 地址
+    host: 127.0.0.1
+    # 端口,默认为6379
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码(如没有密码请注释掉)
+    # password: 123456
+    # 连接超时时间
+    timeout: 10S
+    # 是否开启ssl
+    ssl: false
+
+redisson:
+  # redis key前缀
+  keyPrefix:
+  # 线程池数量
+  threads: 4
+  # Netty线程池数量
+  nettyThreads: 8
+  # 单节点配置
+  singleServerConfig:
+    # 客户端名称
+    clientName: ${ruoyi.name}
+    # 最小空闲连接数
+    connectionMinimumIdleSize: 8
+    # 连接池大小
+    connectionPoolSize: 32
+    # 连接空闲超时,单位:毫秒
+    idleConnectionTimeout: 10000
+    # 命令等待超时,单位:毫秒
+    timeout: 3000
+    # 发布和订阅连接池大小
+    subscriptionConnectionPoolSize: 50
+
+--- # sms 短信
+sms:
+  enabled: false
+  # 阿里云 dysmsapi.aliyuncs.com
+  # 腾讯云 sms.tencentcloudapi.com
+  endpoint: "dysmsapi.aliyuncs.com"
+  accessKeyId: xxxxxxx
+  accessKeySecret: xxxxxx
+  signName: 测试
+  # 腾讯专用
+  sdkAppId:

+ 174 - 0
ruoyi-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,174 @@
+--- # 临时文件存储位置 避免临时文件被系统清理报错
+spring.servlet.multipart.location: /ruoyi/server/temp
+
+--- # 监控中心配置
+spring.boot.admin.client:
+  # 增加客户端开关
+  enabled: false
+  url: http://localhost:9090/admin
+  instance:
+    service-host-type: IP
+  username: ruoyi
+  password: 123456
+
+--- # xxl-job 配置
+xxl.job:
+  # 执行器开关
+  enabled: false
+  # 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
+  admin-addresses: http://localhost:9100/xxl-job-admin
+  # 执行器通讯TOKEN:非空时启用
+  access-token: xxl-job
+  executor:
+    # 执行器AppName:执行器心跳注册分组依据;为空则关闭自动注册
+    appname: xxl-job-executor
+    # 执行器端口号 执行器从9101开始往后写
+    port: 9101
+    # 执行器注册:默认IP:PORT
+    address:
+    # 执行器IP:默认自动获取IP
+    ip:
+    # 执行器运行日志文件存储磁盘路径
+    logpath: ./logs/xxl-job
+    # 执行器日志文件保存天数:大于3生效
+    logretentiondays: 30
+
+--- # 数据源配置
+spring:
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
+    dynamic:
+      # 性能分析插件(有性能损耗 不建议生产环境使用)
+      p6spy: false
+      # 设置默认的数据源或者数据源组,默认值即为 master
+      primary: master
+      # 严格模式 匹配不到数据源则报错
+      strict: true
+      datasource:
+        # 主库数据源
+        master:
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
+          # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
+          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          username: root
+          password: root
+        # 从库数据源
+        slave:
+          lazy: true
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          username:
+          password:
+#        oracle:
+#          type: ${spring.datasource.type}
+#          driverClassName: oracle.jdbc.OracleDriver
+#          url: jdbc:oracle:thin:@//localhost:1521/XE
+#          username: ROOT
+#          password: root
+#          hikari:
+#            connectionTestQuery: SELECT 1 FROM DUAL
+#        postgres:
+#          type: ${spring.datasource.type}
+#          driverClassName: org.postgresql.Driver
+#          url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
+#          username: root
+#          password: root
+#        sqlserver:
+#          type: ${spring.datasource.type}
+#          driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
+#          url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
+#          username: SA
+#          password: root
+      hikari:
+        # 最大连接池数量
+        maxPoolSize: 20
+        # 最小空闲线程数量
+        minIdle: 10
+        # 配置获取连接等待超时的时间
+        connectionTimeout: 30000
+        # 校验超时时间
+        validationTimeout: 5000
+        # 空闲连接存活最大时间,默认10分钟
+        idleTimeout: 600000
+        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
+        maxLifetime: 1800000
+        # 连接测试query(配置检测连接是否有效)
+        connectionTestQuery: SELECT 1
+        # 多久检查一次连接的活性
+        keepaliveTime: 30000
+
+--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
+spring.data:
+  redis:
+    # 地址
+    host: localhost
+    # 端口,默认为6379
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码(如没有密码请注释掉)
+    # password:
+    # 连接超时时间
+    timeout: 10s
+    # 是否开启ssl
+    ssl: false
+
+redisson:
+  # redis key前缀
+  keyPrefix:
+  # 线程池数量
+  threads: 16
+  # Netty线程池数量
+  nettyThreads: 32
+  # 单节点配置
+  singleServerConfig:
+    # 客户端名称
+    clientName: ${ruoyi.name}
+    # 最小空闲连接数
+    connectionMinimumIdleSize: 32
+    # 连接池大小
+    connectionPoolSize: 64
+    # 连接空闲超时,单位:毫秒
+    idleConnectionTimeout: 10000
+    # 命令等待超时,单位:毫秒
+    timeout: 3000
+    # 发布和订阅连接池大小
+    subscriptionConnectionPoolSize: 50
+
+--- # mail 邮件发送
+mail:
+  enabled: false
+  host: smtp.163.com
+  port: 465
+  # 是否需要用户名密码验证
+  auth: true
+  # 发送方,遵循RFC-822标准
+  from: xxx@163.com
+  # 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
+  user: xxx@163.com
+  # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
+  pass: xxxxxxxxxx
+  # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
+  starttlsEnable: true
+  # 使用SSL安全连接
+  sslEnable: true
+  # SMTP超时时长,单位毫秒,缺省值不超时
+  timeout: 0
+  # Socket连接超时值,单位毫秒,缺省值不超时
+  connectionTimeout: 0
+
+--- # sms 短信
+sms:
+  enabled: false
+  # 阿里云 dysmsapi.aliyuncs.com
+  # 腾讯云 sms.tencentcloudapi.com
+  endpoint: "dysmsapi.aliyuncs.com"
+  accessKeyId: xxxxxxx
+  accessKeySecret: xxxxxx
+  signName: 测试
+  # 腾讯专用
+  sdkAppId:

+ 322 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -0,0 +1,322 @@
+
+# 项目相关配置
+ruoyi:
+  # 名称
+  name: "ruoyi"
+  # 版本
+  version: ${revision}
+  # 版权年份
+  copyrightYear: 2025
+  # 实例演示开关
+  demoEnabled: true
+  # 获取ip地址开关
+  addressEnabled: false
+
+captcha:
+  enable: false
+  # 页面 <参数设置> 可开启关闭 验证码校验
+  # 验证码类型 math 数组计算 char 字符验证
+  type: MATH
+  # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
+  category: CIRCLE
+  # 数字验证码位数
+  numberLength: 1
+  # 字符验证码长度
+  charLength: 4
+
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为8080
+  port: 6039
+  servlet:
+    # 应用的访问路径
+    context-path: /
+  # undertow 配置
+  undertow:
+    # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
+    max-http-post-size: -1
+    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
+    # 每块buffer的空间大小,越小的空间被利用越充分
+    buffer-size: 512
+    # 是否分配的直接内存
+    direct-buffers: true
+    threads:
+      # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
+      io: 8
+      # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
+      worker: 256
+
+# 日志配置
+logging:
+  level:
+    org.ruoyi: @logging.level@
+    org.springframework: warn
+  config: classpath:logback-plus.xml
+
+# 用户配置
+user:
+  password:
+    # 密码最大错误次数
+    maxRetryCount: 5
+    # 密码锁定时间(默认10分钟)
+    lockTime: 10
+
+# Spring配置
+spring:
+  application:
+    name: ${ruoyi.name}
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: i18n/messages
+  profiles:
+    active: @profiles.active@
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size: 50MB
+      # 设置总上传的文件大小
+      max-request-size: 200MB
+  mvc:
+    format:
+      date-time: yyyy-MM-dd HH:mm:ss
+  jackson:
+    # 日期格式化
+    date-format: yyyy-MM-dd HH:mm:ss
+    serialization:
+      # 格式化输出
+      indent_output: false
+      # 忽略无法转换的对象
+      fail_on_empty_beans: false
+    deserialization:
+      # 允许对象忽略json中不存在的属性
+      fail_on_unknown_properties: false
+
+# Sa-Token配置
+sa-token:
+  # token名称 (同时也是cookie名称)
+  token-name: Authorization
+  # token有效期 设为7天 (必定过期) 单位: 秒
+  timeout: 604800
+  # token临时有效期 (指定时间无操作就过期) 单位: 秒
+  activity-timeout: 604800
+  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
+  is-share: false
+  # 是否尝试从header里读取token
+  is-read-header: true
+  # 是否尝试从cookie里读取token
+  is-read-cookie: false
+  # token前缀
+  token-prefix: "Bearer"
+  # jwt秘钥
+  jwt-secret-key: abcdefghijklmnopqrstuvwxyz
+
+# security配置
+security:
+  # 排除路径
+  excludes:
+    # 支付回调
+    - /pay/returnUrl
+    - /pay/notifyUrl
+    # 上传文件
+    - /resource/oss/upload
+    # 重置密码
+    - /auth/reset/password
+    # 聊天接口
+    - /chat
+    # 静态资源
+    - /*.html
+    - /**/*.html
+    - /**/*.css
+    - /**/*.js
+    # 公共路径
+    - /favicon.ico
+    - /error
+    # swagger 文档配置
+    - /*/api-docs
+    - /*/api-docs/**
+    # actuator 监控配置
+    - /actuator
+    - /actuator/**
+# 多租户配置
+tenant:
+  # 是否开启
+  enable: false
+  # 排除表
+  excludes:
+    - sys_menu
+    - sys_tenant
+    - sys_tenant_package
+    - sys_role_dept
+    - sys_role_menu
+    - sys_user_post
+    - sys_user_role
+
+# MyBatisPlus配置
+# https://baomidou.com/config/
+mybatis-plus:
+  # 不支持多包, 如有需要可在注解配置 或 提升扫包等级
+  # 例如 com.**.**.mapper
+  mapperPackage: org.ruoyi.**.mapper
+  # 对应的 XML 文件位置
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 实体扫描,多个package用逗号或者分号分隔
+  typeAliasesPackage: org.ruoyi.**.domain
+  # 启动时是否检查 MyBatis XML 文件的存在,默认不检查
+  checkConfigLocation: false
+  configuration:
+    # 自动驼峰命名规则(camel case)映射
+    mapUnderscoreToCamelCase: true
+    # MyBatis 自动映射策略
+    # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
+    autoMappingBehavior: FULL
+    # MyBatis 自动映射时未知列或未知属性处理策
+    # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息
+    autoMappingUnknownColumnBehavior: NONE
+    # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl
+    # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl
+    # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl
+    logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl
+  global-config:
+    # 是否打印 Logo banner
+    banner: true
+    dbConfig:
+      # 主键类型
+      # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
+      idType: ASSIGN_ID
+      # 逻辑已删除值
+      logicDeleteValue: 2
+      # 逻辑未删除值
+      logicNotDeleteValue: 0
+      # 字段验证策略之 insert,在 insert 的时候的字段验证策略
+      # IGNORED 忽略 NOT_NULL 非NULL NOT_EMPTY 非空 DEFAULT 默认 NEVER 不加入 SQL
+      insertStrategy: NOT_NULL
+      # 字段验证策略之 update,在 update 的时候的字段验证策略
+      updateStrategy: NOT_NULL
+      # 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件
+      where-strategy: NOT_NULL
+
+# 数据加密
+mybatis-encryptor:
+  # 是否开启加密
+  enable: false
+  # 默认加密算法
+  algorithm: BASE64
+  # 编码方式 BASE64/HEX。默认BASE64
+  encode: BASE64
+  # 安全秘钥 对称算法的秘钥 如:AES,SM4
+  password:
+  # 公私钥 非对称算法的公私钥 如:SM2,RSA
+  publicKey:
+  privateKey:
+
+# Swagger配置
+swagger:
+  info:
+    # 标题
+    title: '标题:${ruoyi.name}多租户管理系统_接口文档'
+    # 描述
+    description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
+    # 版本
+    version: '版本号: ${ruoyi.version}'
+    # 作者信息
+    contact:
+      name: ageerle
+      email: ageerle@163.com
+      url: https://gitee.com/ageerle/ruoyi-ai
+  components:
+    # 鉴权方式配置
+    security-schemes:
+      apiKey:
+        type: APIKEY
+        in: HEADER
+        name: ${sa-token.token-name}
+
+springdoc:
+  api-docs:
+    # 是否开启接口文档
+    enabled: true
+  swagger-ui:
+    # 持久化认证数据
+    persistAuthorization: true
+  #这里定义了两个分组,可定义多个,也可以不定义
+  group-configs:
+    - group: 1.演示模块
+      packages-to-scan: org.ruoyi.demo
+    - group: 2.通用模块
+      packages-to-scan: org.ruoyi.web
+    - group: 3.系统模块
+      packages-to-scan: org.ruoyi.system
+    - group: 4.代码生成模块
+      packages-to-scan: org.ruoyi.generator
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+# 全局线程池相关配置
+thread-pool:
+  # 是否开启线程池
+  enabled: false
+  # 队列最大长度
+  queueCapacity: 128
+  # 线程池维护线程所允许的空闲时间
+  keepAliveSeconds: 300
+
+--- # 分布式锁 lock4j 全局配置
+lock4j:
+  # 获取分布式锁超时时间,默认为 3000 毫秒
+  acquire-timeout: 3000
+  # 分布式锁的超时时间,默认为 30 秒
+  expire: 30000
+
+--- # Actuator 监控端点的配置项
+management:
+  endpoints:
+    web:
+      exposure:
+        include: '*'
+  endpoint:
+    health:
+      show-details: ALWAYS
+    logfile:
+      external-file: ./logs/sys-console.log
+
+# websocket
+websocket:
+  enabled: true
+  # 路径
+  path: '/resource/websocket'
+  # 设置访问源地址
+  allowedOrigins: '*'
+
+# 微信小程序配置信息
+wx:
+  miniapp:
+    configs:
+      - appid: # 你的appid
+        secret: # 你的secret
+        token: #微信小程序消息服务器配置的token
+        aesKey: #微信小程序消息服务器配置的EncodingAESKey
+        msgDataFormat: JSON
+
+  #  企业微信应用
+wechat:
+  cp:
+    corpId:
+    appConfigs:
+      - agentId:
+        secret: ''
+        token:   ''
+        aesKey: ''
+
+
+

+ 2 - 0
ruoyi-admin/src/main/resources/banner.txt

@@ -0,0 +1,2 @@
+Application Version: ${revision}
+Spring Boot Version: ${spring-boot.version}

+ 54 - 0
ruoyi-admin/src/main/resources/i18n/messages.properties

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

+ 54 - 0
ruoyi-admin/src/main/resources/i18n/messages_en_US.properties

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

+ 54 - 0
ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties

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

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


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

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

+ 1 - 0
ruoyi-admin/src/main/resources/spy.properties

@@ -0,0 +1 @@
+exclude=SELECT 1

+ 46 - 0
ruoyi-admin/src/main/resources/static/.gitignore

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

+ 0 - 0
ruoyi-admin/src/main/resources/static/.nojekyll


+ 1 - 0
ruoyi-admin/src/main/resources/static/CNAME

@@ -0,0 +1 @@
+plus-doc.dromara.org

+ 74 - 0
ruoyi-admin/src/main/resources/static/README.md

@@ -0,0 +1,74 @@
+# 框架介绍
+- - -
+- `RuoYi-Vue-Plus` 分布式集群框架 [文档跳转](/ruoyi-vue-plus/home.md)
+- `RuoYi-Cloud-Plus` 微服务框架 [文档跳转](/ruoyi-cloud-plus/home.md)
+- `plus-ui` 统一 Vue3 前端项目 [文档跳转](/plus-ui/home.md)
+- `plus-doc` 统一文档项目
+
+## 特别赞助
+
+<a href="https://gitee.com/dromara/MaxKey"><img src="https://foruda.gitee.com/images/1700187453544179968/7342304a_1766278.png" width="400px" height="100px"></a>
+<a href="http://ccflow.org/?frm=ryPlus"><img src="https://foruda.gitee.com/images/1704162419429172656/d0521e59_1766278.png" width="400px" height="100px"></a>
+<br>
+<a href="http://www.shuduokeji.com"><img src="https://foruda.gitee.com/images/1705569347386939952/3f187980_1766278.jpeg" width="400px" height="100px"></a>
+<a href="https://www.jnpfsoft.com/index.html?from=plus-doc"><img src="https://foruda.gitee.com/images/1711681233267310022/2ffbcff2_1766278.png" width="400px" height="100px"></a>
+<br>
+<a href="https://item.jd.com/13928958.html?from=plus-doc"><img src="https://foruda.gitee.com/images/1723791569938403230/769e98da_1766278.jpeg" width="400px" height="100px"></a>
+
+[如何成为赞助商 加群联系作者详谈](/common/add_group.md)
+
+## 代码地址
+
+| 介绍         | 项目名              | 项目地址                                                                                                                   | 注意事项                       |
+|------------|:-----------------|------------------------------------------------------------------------------------------------------------------------|----------------------------|
+| 🔥 分布式集群框架 | RuoYi-Vue-Plus   | - [Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus)<br> - [GitHub](https://github.com/dromara/RuoYi-Vue-Plus)    | 重写RuoYi-Vue全方位升级(不兼容原框架)   |
+| 🔥 微服务框架   | RuoYi-Cloud-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Cloud-Plus)<br>- [GitHub](https://github.com/dromara/RuoYi-Cloud-Plus) | 重写RuoYi-Cloud全方位升级(不兼容原框架) |
+| 🔥 统一前端项目  | plus-ui          | - [Gitee](https://gitee.com/JavaLionLi/plus-ui)<br>- [GitHub](https://github.com/JavaLionLi/plus-ui)                   | Vue与Cloud项目通用前端            |
+| 🔥 统一文档项目  | plus-doc         | - [Gitee](https://gitee.com/dromara/plus-doc)<br>- [GitHub](https://github.com/dromara/plus-doc)                  | 通用文档                       |
+
+
+## 业务功能
+
+| 功能    | 介绍                                    |
+|-------|---------------------------------------|
+| 租户管理  | 配置系统租户,支持 SaaS 场景下的多租户功能。             |
+| 用户管理  | 用户是系统操作者,该功能主要完成系统用户配置。               |
+| 部门管理  | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。       |
+| 岗位管理  | 配置系统用户所属担任职务。                         |
+| 菜单管理  | 配置系统菜单,操作权限,按钮权限标识等。                  |
+| 角色管理  | 角色菜单权限分配、设置角色按机构进行数据范围权限划分。           |
+| 字典管理  | 对系统中经常使用的一些较为固定的数据进行维护。               |
+| 参数管理  | 对系统动态配置常用参数。                          |
+| 通知公告  | 系统通知公告信息发布维护。                         |
+| 操作日志  | 系统正常操作日志记录和查询;系统异常信息日志记录和查询。          |
+| 登录日志  | 系统登录日志记录查询包含登录异常。                     |
+| 文件管理  | 系统文件上传、下载等管理。                         |
+| 定时任务  | 在线(添加、修改、删除)任务调度包含执行结果日志。             |
+| 代码生成  | 前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 |
+| 系统接口  | 根据业务代码自动生成相关的api接口文档。                 |
+| 服务监控  | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等。  |
+| 缓存监控  | 对系统的缓存信息查询,命令统计等。                     |
+| 在线构建器 | 拖动表单元素生成相应的HTML代码。                    |
+| 使用案例  | 系统的一些功能案例                             |
+
+## 关注作者
+
+作者博客: [https://lionli.blog.csdn.net/?type=blog](https://lionli.blog.csdn.net/?type=blog)
+
+公众号: **<狮子领域 程序圈>**
+<br>
+![输入图片说明](https://foruda.gitee.com/images/1678975769377570440/507062df_1766278.png "屏幕截图")
+
+## 捐献作者
+
+**作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭**
+<br>
+<img src="https://foruda.gitee.com/images/1725259663554875162/bd86a165_1766278.png" width="300px" height="450px" /><img src="https://foruda.gitee.com/images/1725259708005620620/22833e19_1766278.jpeg" width="300px" height="450px" />
+
+## Dromara 全家福
+
+社区仓库地址: [dromara开源社区](https://gitee.com/organizations/dromara/projects)
+
+![输入图片说明](https://foruda.gitee.com/images/1706071866226295002/68cffcf6_1766278.png "屏幕截图")
+
+

+ 32 - 0
ruoyi-admin/src/main/resources/static/_coverpage.md

@@ -0,0 +1,32 @@
+<!-- _coverpage.md -->
+<html>
+<img src="./static/image/logo2.png" width="260px" height="260px">
+<div style="display: flex; align-content:center; justify-content: center;">
+<div >
+<div style="font-weight: bold; font-size: 40px;">百搭AI</div>
+<!-- <div style="font-weight: bold; font-size: 40px;margin-bottom: 30px;">多租户权限管理系统</div> -->
+
+[![码云Gitee](https://gitee.com/ageerle/ruoyi-ai/badge/star.svg?theme=blue)](https://gitee.com/ageerle/ruoyi-ai)
+[![GitHub](https://img.shields.io/github/stars/ageerle/ruoyi-ai.svg?style=social&label=Stars)](https://github.com/dromara/RuoYi-Vue-Plus)
+[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/ageerle/ruoyi-ai/blob/master/LICENSE)
+<br>
+[![ruoyi-ai](https://img.shields.io/badge/ruoyi-ai-5.2.2-success.svg)](https://gitee.com/ageerle/ruoyi-ai)
+[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.2-blue.svg)]()
+
+</div>
+<div>
+
+</div>
+
+</div>
+</html>
+
+> 百搭AI是一个整合了多种大语言模型API的开源平台,实现了AI对话、绘图、声音克隆和私有知识库等功能。
+>
+> 平台配备管理后台,支持微信支付、微信公众号、微信多开、Stripe国际支付和百度文本审核等运营功能。
+>
+> 项目采用Java+Vue+Vben5技术栈构建,遵循MIT License,允许二次开发并用于商业销售。
+
+Copyright ©  2023-2024 版权所有:ageerle@163.com 备案号:<a href="https://beian.miit.gov.cn/">鄂ICP备2023007672号</a>
+
+[开始使用 Let's Go](/README.md)

+ 2 - 0
ruoyi-admin/src/main/resources/static/_footer.md

@@ -0,0 +1,2 @@
+<!-- _footer.md 页脚配置 -->
+对文档有疑问?欢迎您帮助我们 [完善此文档](https://gitee.com/JavaLionLi/plus-doc) !

+ 9 - 0
ruoyi-admin/src/main/resources/static/_navbar.md

@@ -0,0 +1,9 @@
+<!-- _navbar.md -->
+
+* [文档导航](/README.md)
+* [Vue版本](/ruoyi-vue-plus/home.md)
+* [Cloud版本](/ruoyi-cloud-plus/home.md)
+* [前端文档](/plus-ui/home.md)
+* [常见问题](/questions/lombok.md)
+* [视频教程](/common/video.md)
+* [演示系统](/common/demo_system.md)

+ 16 - 0
ruoyi-admin/src/main/resources/static/_sidebar.md

@@ -0,0 +1,16 @@
+<!-- _sidebar.md -->
+- **特别赞助**
+- [![输入图片说明](https://foruda.gitee.com/images/1704162419429172656/d0521e59_1766278.png "2024-01-02=>2028-01-02")](http://ccflow.org/?frm=ryPlus)
+- [![输入图片说明](https://foruda.gitee.com/images/1705569347386939952/3f187980_1766278.jpeg "2024-01-18=>2025-01-18")](http://www.shuduokeji.com)
+- [![输入图片说明](https://foruda.gitee.com/images/1711681233267310022/2ffbcff2_1766278.png "2024-03-29=>2025-03-29")](https://www.jnpfsoft.com/index.html?from=plus-doc)
+
+- **开始**
+  - [框架介绍](/README.md)
+  - [演示系统](/common/demo_system.md)
+  - [官方视频教程](/common/video.md)
+  - [粉丝专栏](/common/column.md)
+  - [参与贡献项目](/common/contribution.md)
+  - [如何提交PR](/common/pr.md)
+  - [如何加群](/common/add_group.md)
+  - [使用者登记](/common/user_register.md)
+  - [黑名单](/common/blacklist.md)

+ 27 - 0
ruoyi-admin/src/main/resources/static/common/add_group.md

@@ -0,0 +1,27 @@
+# 加群方式
+- - -
+### 交流群(不提供任何问题解答 纯交流)
+
+**加 <小助手> 微信备注 <加群>**<br>
+**视频课程咨询或其他问题咨询请查看下方信息(小助手是机器人)**
+
+<img src="https://foruda.gitee.com/images/1680762410689884638/60b546ca_1766278.png" width="300" height="300">
+
+### VIP群(付费加群 提供问题解答、技术支持、技术分享)
+
+首先感谢 `RuoYi` 提供分享开源 框架基于 `RuoYi` 重写大部分功能实现<br>
+项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可<br>
+VIP群是作者提供的私人服务 不代表着项目收费
+
+> 问问题等于做习题 听作者解答问题等于习题讲解<br>
+> 一个人接触的问题有限 一群人接触的问题无限 早进群早接触更多的问题(每天99+)<br>
+> 承诺: 看见必回复 让你感受作者有多话痨<br>
+
+两种途径:
+1. 购买官方视频进群 [官方视频](/common/video.md)
+2. 扫描下方二维码付款进群(无视频)
+
+支付后申请加群即可 QQ群号 : **<637757165>**<br>
+
+**加群扫码**<br>
+<img src="https://foruda.gitee.com/images/1725259839682556495/2897bc86_1766278.png" width="300px" height="450px" /><img src="https://foruda.gitee.com/images/1725259806547656944/f870a5c7_1766278.jpeg" width="300px" height="450px" />

+ 7 - 0
ruoyi-admin/src/main/resources/static/common/blacklist.md

@@ -0,0 +1,7 @@
+# 黑名单
+- - -
+
+地址: https://github.com/QNAV/RuoYi-X-Plus
+<br>
+上榜缘由 使用本框架二次开源并未有任何声明与标注 将所有代码的作者名全都改成了自己 剽窃本框架代码
+

+ 18 - 0
ruoyi-admin/src/main/resources/static/common/column.md

@@ -0,0 +1,18 @@
+# 粉丝专栏
+- - -
+**由上到下 从易到难**
+
+> 粉丝整理 欢迎投稿
+
+| 作者            | 文档地址                                                          | 说明                 |
+|---------------|---------------------------------------------------------------|--------------------|
+| 抓蛙师           | https://www.bilibili.com/video/BV1TG41157Ef/                  | 学会问问题(小白必看)        |
+| 抓蛙师           | https://www.bilibili.com/video/BV1mr4y1j75M                   | Vue框架基础视频专栏(新人必看)  |
+| 抓蛙师           | https://www.bilibili.com/video/BV1Na411u7eC                   | Vue框架改造视频专栏(新人必看)  |
+| 抓蛙师           | https://www.bilibili.com/video/BV1te4y1D7hi                   | 小程序鉴权与uniapp联动     |
+| 抓蛙师           | https://www.bilibili.com/video/BV1zt4y137UP                   | 公众号集成              |
+| mayuanfei     | https://note.youdao.com/s/XpvKnxAb                            | 入门专栏(新人必看)         |
+| 程序猿一枚_        | https://blog.csdn.net/zhaozhiqiang1981/category_12221291.html | 玩转RuoYi-Cloud-Plus |
+| 程序猿一枚_        | https://www.bilibili.com/video/BV1yA411r7ji/                  | Cloud环境搭建以及进阶开发    |
+| MichelleChung | https://blog.csdn.net/michelle_zhong/category_11109741.html   | 源码解析专栏(进阶必看)       |
+| MichelleChung | https://blog.csdn.net/michelle_zhong/category_12058476.html   | Cloud源码解析专栏        |

+ 69 - 0
ruoyi-admin/src/main/resources/static/common/contribution.md

@@ -0,0 +1,69 @@
+# 参与贡献的方式
+- - -
+参与贡献开源的方式有很多种 听作者来介绍
+
+## 为开源项目点一个Star
+
+> Star的多少关系到项目能否被更多人看到
+<br>
+同时Star也是作者前进的动力(作者每天都在盯着Star 涨了会开心 跌了会失落)
+<br>
+<br>
+> 大家在寻找开源项目的时候, 大多数情况也是会先看Star比较多的项目
+<br>
+所以请给您觉得好的开源项目点一个小小的Star, 让好的项目能够被更多人看到
+<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678934493115487351/0c45121e_1766278.png "屏幕截图")
+<br>
+<font size="4">Vue版本: [Gitee我要点Star](https://gitee.com/dromara/RuoYi-Vue-Plus/stargazers) [Github我要点Star](https://github.com/dromara/RuoYi-Vue-Plus)</font>
+<br>
+<font size="4">Cloud版本: [Gitee我要点Star](https://gitee.com/dromara/RuoYi-Cloud-Plus/stargazers) [Github我要点Star](https://github.com/dromara/RuoYi-Cloud-Plus)</font>
+
+## 为社区处理问题
+
+> Issue是社区的交流地 大家会在这里提出自己的问题 或者是项目的功能异常
+
+> 提问的规范在Issue的模板里已经写好了 按照模板填写有助于作者或者其他社区人员快速有效的回答问题
+![输入图片说明](https://foruda.gitee.com/images/1678935068341532603/4b9d7af9_1766278.png "屏幕截图")
+
+> 为提出问题的小伙伴答疑 可以有效降的帮助别人<br>
+> 而且可以降低社区人员的精力分散 使精力全部投入到项目设计研发中
+![输入图片说明](https://foruda.gitee.com/images/1678935380481365514/dddc9ce9_1766278.png "屏幕截图")
+
+## 改进社区文档
+
+> 大家都知道 我们程序员都不擅长写作<br>
+> 有时候作者把文档写完了也不知道用户是什么感觉 是否能看懂<br>
+
+> 所以参与社区文档建设绝对是一件意义重大的事情<br>
+> 大家可以在Issue提出观后感 觉得哪看不懂 觉得哪应该详细说明<br>
+> 当然了 大家也可以对文档进行改进后提交PR修改申请
+
+<font size="6">文档仓库: [plus-doc](https://gitee.com/JavaLionLi/plus-doc) 👈点他点他</font>
+![输入图片说明](https://foruda.gitee.com/images/1678935992827063291/d7c4dc5b_1766278.png "屏幕截图")
+
+## 贡献代码
+
+> 想参与贡献代码的小伙伴 重点来了: 作者会经常在Issue里发布需求认领<br>
+> 觉得自己能做的可以在Issue里跟作者讨论 如需求还不够清晰 或者做的过程中遇到了什么问题
+
+<img src="https://foruda.gitee.com/images/1678936513184771725/f26349dd_1766278.png" width="550px" height="450px" />
+
+> 需求确定了以后就可以开始专注的写代码了<br>
+> 但在开始写代码之前 一定要先看一下如何正确的提交PR
+
+<font size="4">一点要仔细看: [如何提交PR](/common/pr.md) 👈点他点他</font>
+
+## 如何成为项目成员
+
+> 1.对框架有重大贡献者(由作者与团队成员判定)<br>
+> 2.完成社区发布的两项复杂任务<br>
+> 3.持续完成社区发布的简单任务若干(作者会关注到)<br>
+> 4.持续为社区优化文档或处理issue若干(作者会关注到)<br>
+
+## 项目成员待遇
+
+> 1.可免费进入vip收费群<br>
+> 2.每年还会发放IDEA正版授权<br>
+

+ 13 - 0
ruoyi-admin/src/main/resources/static/common/demo_system.md

@@ -0,0 +1,13 @@
+# 系统演示(请大家不要乱改数据 影响他人体验 谢谢配合)
+- - -
+**感谢 `孤舟烟雨` 贡献的演示服务器**
+
+**1核2G 小服务器 经不起压测 请理性操作 违者直接封IP**
+
+> 访问地址: [http://43.138.9.96/](http://43.138.9.96/)
+
+> 登录账户 admin/admin123
+
+> Admin监控中心 ruoyi/123456
+
+> 任务调度中心 admin/123456

+ 37 - 0
ruoyi-admin/src/main/resources/static/common/pr.md

@@ -0,0 +1,37 @@
+# 如何提交PR贡献代码
+- - -
+### 步骤一 Fork项目到自己仓库
+
+![输入图片说明](https://foruda.gitee.com/images/1673427084798343408/142a55d0_1766278.png "屏幕截图")
+
+### 步骤二 基于dev分支 新建一个此PR功能点的专属分支
+
+![输入图片说明](https://foruda.gitee.com/images/1673427220695789412/14c4f4ff_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1673427193964585607/16ea99d9_1766278.png "屏幕截图")
+
+### 步骤三 使用Git工具 将自己仓库的项目拉去到本地做代码编写
+
+![输入图片说明](https://foruda.gitee.com/images/1673427313201488937/f2df59bf_1766278.png "屏幕截图")
+
+### 步骤四 使用Idea打开项目 切换到新建的功能分支
+
+![输入图片说明](https://foruda.gitee.com/images/1673427394686229310/c479a5a5_1766278.png "屏幕截图")
+
+### 步骤五 将编写好的代码 提交到自己的远程仓库
+
+![输入图片说明](https://foruda.gitee.com/images/1673427519150795591/d88c2bc9_1766278.png "屏幕截图")
+
+### 步骤六 创建PR申请(此操作在自己仓库或者要PR的仓库都可以)
+
+![输入图片说明](https://foruda.gitee.com/images/1673427616155043776/fe2ce097_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1673427865031025513/0f58a137_1766278.png "屏幕截图")
+
+### 步骤七 等待作者评审 按要求更改 直到没有问题后被作者合并
+
+![输入图片说明](https://foruda.gitee.com/images/1673428029932524584/93234628_1766278.png "屏幕截图")
+
+### 评审期间 如需对PR内容做更改 直接在新功能分支提交代码即可
+### 无需重复提交PR申请 这边会自动比对两个分支的差异
+
+![输入图片说明](https://foruda.gitee.com/images/1673428054139366497/4ecb6e98_1766278.png "屏幕截图")
+

+ 80 - 0
ruoyi-admin/src/main/resources/static/common/user_register.md

@@ -0,0 +1,80 @@
+# 使用者登记
+- - -
+**使用此开源项目的公司或者组织**
+> Vue版本登记地址: https://gitee.com/dromara/RuoYi-Vue-Plus/issues/I4QP39
+
+> Cloud版本登记地址: https://gitee.com/dromara/RuoYi-Cloud-Plus/issues/I4VJ7G
+
+| 公司名               | 官网                             | LOGO                                                                                                           |
+|-------------------|:-------------------------------|----------------------------------------------------------------------------------------------------------------|
+| 中国联通(长春分公司)       | http://www.10010.com           | <img src="https://foruda.gitee.com/images/1679554727740431371/bd179d0f_1766278.png" width="300" height="200">  |
+| 中国电信(湖南分公司)       | http://www.189.cn/hn/          | <img src="https://foruda.gitee.com/images/1699838764871886313/61b44b7d_1766278.png" width="300" height="200">  |
+| 南京感知信息技术有限公司    | https://njgzxx.cn/             | <img src="https://foruda.gitee.com/images/1725589695335847776/10bb2088_1766278.png" width="400" height="200">  |
+| 陕西骏景索道运营管理有限公司  | https://www.junjingsuodao.com/    | <img src="https://foruda.gitee.com/images/1724394959451680041/24ac17ff_7408092.png" width="300" height="200">  |
+| 悠码科技有限公司           | https://orise.trytowish.cn/    | <img src="https://foruda.gitee.com/images/1722916054523975884/686ee49e_8929785.png" width="200" height="200">  |
+| 苏州龙的信息系统股份有限公司   | http://www.longdayinfo.com/         | <img src="https://foruda.gitee.com/images/1721182313605689705/f676882a_2113976.png" width="400" height="200">  |
+| 北京数通智达科技有限公司   | http://www.bzdtech.com/         | <img src="https://foruda.gitee.com/images/1717744899576682096/7d6cf41f_1766278.png" width="400" height="200">  |
+| 广州六六七七科技有限公司   | https://artiversehub.ai/         | <img src="https://foruda.gitee.com/images/1716976454631958575/44abbb05_1766278.png" width="300" height="200">  |
+| 宁波三品软件科技有限公司   | http://nbsanpin.com/         | <img src="https://foruda.gitee.com/images/1715845257022437822/1a096edc_14415359.png" width="300" height="200"> |
+| 北京御一科技信息技术有限公司 | https://www.yudoctor.com | <img src="https://foruda.gitee.com/images/1715157943995574211/09aa2229_1766278.png" width="400" height="200">  |
+| 成都卡恩特医疗科技有限公司 | http://www.scknot.com | <img src="https://foruda.gitee.com/images/1711091474880818044/96ddef90_1766278.png" width="400" height="200">  |
+| 无锡科艾思科技有限公司 | https://www.kyoeis.com | <img src="https://foruda.gitee.com/images/1710929131545545232/a87f838e_1766278.png" width="400" height="200">  |
+| 深圳市海联天下科技有限公司       | www.sealinkin.com          | <img src="https://foruda.gitee.com/images/1709870697911145583/453db298_1766278.png" width="400" height="200">  |
+| 上海非定义旅游服务有限公司       | http://www.anonymity.love/          | <img src="https://foruda.gitee.com/images/1706165274431234456/f4be93d3_1766278.png" width="400" height="200">  |
+| 重庆威爱云科技有限公司       | https://www.51vive.com          | <img src="https://foruda.gitee.com/images/1700460635019084607/f073724d_1766278.png" width="400" height="200">  |
+| 中城智联(成都)创新科技有限公司       | http://www.zc-zl.com/          | <img src="https://foruda.gitee.com/images/1699841115050735040/0d6893d1_1766278.png" width="300" height="200">  |
+| 浙江海亮股份有限公司       | https://www.hailiangstock.com          | <img src="https://foruda.gitee.com/images/1699841174631804104/fd3466fd_1766278.png" width="300" height="200">  |
+| 河北雄安山禾咨询工程有限公司       | https://shanheqei.club/          | <img src="https://foruda.gitee.com/images/1699855302878416881/6bfdb2d5_1766278.png" width="300" height="200">  |
+| 数舵(河北雄安)信息科技有限公司 | http://www.shuduokeji.com  | <img src="https://foruda.gitee.com/images/1698888517162767014/8a2840ff_1766278.png" width="400" height="200">  |
+| 南昌鼎欣科技股份有限公司 | https://www.openzt.com           | <img src="https://foruda.gitee.com/images/1697701810520579719/4da9666e_1766278.png" width="400" height="200">  |
+| 东莞市码载网络科技有限公司 | https://www.codeload.top           | <img src="https://foruda.gitee.com/images/1697618746817506398/57af2eaa_10583761.png" width="400" height="200"> |
+| 北京农信通科技有限责任公司 | http://www.nxt.com.cn           | <img src="https://foruda.gitee.com/images/1696428611360166577/72e7f7c4_971517.png" width="400" height="200">   |
+| 中康腾华网络科技(重庆)有限公司 | https://www.zkthwlkj.com/   | <img src="https://foruda.gitee.com/images/1695112845600729239/a16e34e2_1766278.png" width="200" height="100">  |
+| 杭州码恒信息科技有限公司      | http://www.mh-barcode.com/     | <img src="https://foruda.gitee.com/images/1690881482450489558/2d689bc1_1766278.png" width="400" height="200">  |
+| 南京晶益科技有限公司        | https://www.nanjingjingyi.com/ | <img src="https://foruda.gitee.com/images/1689576488369281878/bec504ce_1766278.png" width="400" height="200">  | 
+| 合肥智享亿云科技有限公司      | http://www.izxyy.com           | <img src="https://foruda.gitee.com/images/1685096398913604988/e6c16816_1766278.png" width="300" height="200">  |
+| 锡简科技              | https://www.xj-fast.com        | <img src="https://foruda.gitee.com/images/1683858424104223718/172f2c2e_1766278.png" width="300" height="200">  |
+| 福建亘前科技有限公司        | https://genqian.top            | <img src="https://foruda.gitee.com/images/1683170298723703161/891feff4_1766278.png" width="400" height="200">  |
+| 北京联宇信通科技有限公司      | http://www.lyxtkj.com/         | <img src="https://foruda.gitee.com/images/1680068618387237935/5e195ad8_1766278.png" width="400" height="200">  |
+| 厦门市熵时光科技有限公司      | https://www.xetsoft.com        | <img src="https://foruda.gitee.com/images/1672299365177532128/f0e78c26_1766278.png" width="400" height="200">  |
+| 广州润沁教育科技有限公司      | https://www.ca163.net          | <img src="https://foruda.gitee.com/images/1678976000893686992/1acbda54_1766278.png" width="400" height="200">  |
+| 广东乐善智能装备股份有限公司    | https://www.china-leshan.com/  | <img src="https://foruda.gitee.com/images/1672299473733272899/2065e28c_1766278.png" width="400" height="200">  |
+| 数字江西科技有限公司        | https://www.digitaljx.com/     | <img src="https://foruda.gitee.com/images/1660527156328976445/屏幕截图.png" width="300" height="200">              |
+| 上海极锐星瀚传感技术有限公司    | http://www.jrsensing.com/      | <img src="https://foruda.gitee.com/images/1669694597446652604/6997f99a_1766278.png" width="400" height="100">  |
+| 北京数影互联科技有限公司      | http://www.dataflying.top/     | <img src="https://foruda.gitee.com/images/1686118090145603656/46dbe579_1766278.png" width="200" height="100">  |
+| 广州创服信息科技有限公司      | https://www.cfkjcloud.com      | <img src="https://foruda.gitee.com/images/1678975960889135530/85fa904f_1766278.png" width="400" height="200">  |
+| 茂名云智科技有限公司        | http://www.winzkj.com          | <img src="https://foruda.gitee.com/images/1678975967691323451/6343e6b7_1766278.png" width="400" height="200">  |
+| 成都时光旅迹科技有限公司      | https://www.ttmup.com/         | <img src="https://foruda.gitee.com/images/1678975973935607983/a0f8dce2_1766278.png" width="400" height="200">  |
+| 成都炫影全息科技有限公司      | http://xyqxgs.com              | <img src="https://foruda.gitee.com/images/1678975979873588062/e34db081_1766278.png" width="400" height="200">  |
+| 中山厚德快速模具有限公司      | http://hordrt.com              | <img src="https://foruda.gitee.com/images/1678975986213675141/7436dcb9_1766278.png" width="400" height="200">  |
+| 深圳市深南夙星科技有限公司     | http://www.szsnsx.com/         | <img src="https://foruda.gitee.com/images/1678975994674685698/a2c05a6e_1766278.png" width="400" height="200">  |
+| 陕西华恒军创信息科技有限公司    | http://hhjc.cc                 | <img src="https://foruda.gitee.com/images/1678976006389002991/3786a1bc_1766278.png" width="400" height="200">  |
+| 河南小牛信息科技有限公司      | http://www.hnxn888.com/        | <img src="https://foruda.gitee.com/images/1681106560964010687/d8969ed2_1766278.png" width="200" height="100">  |
+| 武汉华智讯网络信息技术有限公司   | http://www.xun188.com          | <img src="https://foruda.gitee.com/images/1678975944577016382/93c4541d_1766278.png" width="200" height="100">  |
+| 易税信息技术有限公司        | https://www.etax.top           | <img src="https://foruda.gitee.com/images/1678975950137235651/211a63c4_1766278.png" width="200" height="100">  |
+| 广西华景城建筑设计有限公司     | http://www.hjcadc.com          | <img src="https://foruda.gitee.com/images/1678975955216975234/e83c8c6e_1766278.png" width="200" height="100">  |
+| 铭创科技有限公司          | https://www.mcck.cn/           | <img src="https://foruda.gitee.com/images/1693967206668467582/8c234a6d_1766278.png" width="200" height="100">  |
+| 西安鼎慧网络科技有限公司 |                                  | <img src="https://foruda.gitee.com/images/1721271356660437424/b85c5754_8776295.jpeg" width="400" height="200"> |
+| 营口鼎瑞网络科技有限公司 |                                  | <img src="https://foruda.gitee.com/images/1715836865319520119/5dc34a5f_8693506.png" width="400" height="200">  |
+| 南昌漫库书店有限公司        |                                | <img src="https://foruda.gitee.com/images/1687656369793887183/ce1a33f6_1766278.png" width="200" height="100">  |
+| 广西文韬智能科技有限公司      |                                | <img src="https://foruda.gitee.com/images/1678976034543683491/8d8a1ebe_1766278.png" width="200" height="100">  |
+| 贵州亿瑞祺科技有限公司      |                               |
+| 贵州新绿视界环保科技有限公司  |                             |
+| 湖南智才伯乐数据科技有限公司 |                            |
+| 德州商储超市有限公司    |                                |
+| 曲沃亿分科技中心        |                                |
+| 南京杰度信息技术有限公司 |                                |
+| 武汉忆秋科技有限公司 |                                      |
+| 济南千惠网络科技有限公司      |                                |
+| 江苏泛联科技有限公司        |                                |
+| 沈阳市果冻网络信息科技有限责任公司 |                                |
+| 灵劲科技有限公司          |                                |
+| 亿世达餐饮管理(北京)有限公司   |                                |
+| 深圳市凯帝电子商务有限公司     |                                |
+| 成都数智源蓉卡科技有限公司     |                                |
+| 上海振福信息科技有限公司      |                                |
+| 重庆六客会科技有限公司       |                                |
+| 无限创优(西安)科技有限公司    |                                |
+| 惠族网络科技发展有限公司      |                                |
+| 纳森科技有限公司          |                                |
+

+ 85 - 0
ruoyi-admin/src/main/resources/static/common/video.md

@@ -0,0 +1,85 @@
+# 视频教程(联合出品)
+
+### 主讲与后期剪辑: `抓蛙师` 
+
+抓蛙师简介: B站知名UP主 B站首页: https://space.bilibili.com/520725002
+
+### 知识点统筹与内容审核: `疯狂的狮子Li`
+
+疯狂的狮子Li简介: RuoYi-Vue-Plus 与 RuoYi-Cloud-Plus 作者
+
+## 已完结🎉🎉🎉 优惠价: 598(仅限前500名) ~~原价: 698~~
+
+**注意: 视频采用 RuoYi-Vue-Plus 版本 4.X 分支讲解!!! (内容为通用技术与版本关联性不大)**<br>
+**内容为框架内所用到的技术与设计原理(打破不知道、不会用、不知应用场景等问题)**
+
+课程简介: https://www.bilibili.com/video/BV16j411D7BX/
+<br>
+试看课程: https://www.bilibili.com/video/BV1uS411P7JD/
+<br>
+试看课程: https://www.bilibili.com/video/BV1vLbNeuESn/
+<br>
+试看课程: https://www.bilibili.com/video/BV1xV4y127KM/
+<br>
+试看课程: https://www.bilibili.com/video/BV1W5v8eBEgs/
+<br>
+课程总结: https://www.bilibili.com/video/BV1734y1g7fk/
+<br>
+
+## 购买方式
+
+**小本生意 用心录制 拒绝砍价 已更新到 236 集 课程完结**<br>
+> 课程咨询或购买请联系 价格598<br>
+> QQ:  906670865 (疯狂的狮子Li)<br>
+> QQ:  770492966 (抓蛙师)
+
+## 购买前常见问题答疑
+> 问题1: 购买后是否有群可以解答问题<br>
+> 答: 购买后有专属课程付费群(千人大群)讲师在线答疑
+> 
+> 问题2: 是否持续更新 如新版本功能<br>
+> 答: 课程目录即为全部课程内容 以课程目录为准 明年大概会出二期来讲新版本内容<br>
+> 因为持续更新会导致前面的技术老旧 新购买的人无法及时学习新技术<br>
+> 故而采用分期出课程制度 已经购买过的老客户 再次购买下一次会给力度非常大的折扣
+> 
+> 问题3: 目前视频未全部录制完成 后续更新是否二次收费<br>
+> 答: 视频目录即为全部视频内容 一次收费后续更新仍然可看直到视频全部更新完成(明年出二期课程不算在内)
+>
+> 问题4: 视频如何下载如何观看<br>
+> 答: 视频文件已加密 采用专门的播放器(播放器只限制截图录屏等不限制其他软件使用) 由管理员发放授权码观看<br>
+> 支持通过 百度云 或者 阿里云 网盘下载视频资源
+>
+> 问题5: 视频平均时长和总时长大概多久<br>
+> 答: 视频每集短的大概10分钟以上 长的大概40个分钟左右 平均时长20多分钟每集<br>
+> 目前已经录制了236集总时长为80多个小时
+> 
+> 问题6: 是否有讲解 Cloud 版本相关内容<br>
+> 答: 视频主要讲解内容为框架内所用到的技术与设计原理 无论什么版本 功能和设计都是一样的<br>
+> Cloud 版本只是多了 alibaba 的几个组件完全可以B站自学
+
+## 课程目录
+
+![输入图片说明](https://foruda.gitee.com/images/1695105467795304336/58fcd6db_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105494170842444/10f98fed_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105523526589287/f131c614_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105547992880680/9f4137f3_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105560849590514/d19fad6a_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105586641712428/349a971b_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105595501187093/fb819d35_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105609163585390/833dd89c_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105630469565265/8dbba1d2_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695105659037093525/09a4f6e1_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1695714493079698007/311980ee_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1697446957351573520/cab3617d_1766278.png "屏幕截图")
+
+## 学员观后感
+
+|                                                                                             |                                                                                             |
+|---------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
+| ![输入图片说明](https://foruda.gitee.com/images/1691386100129796781/44b69dae_1766278.jpeg "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1691386076834242484/a6073f7d_1766278.png "屏幕截图")  |
+| ![输入图片说明](https://foruda.gitee.com/images/1691386089186649583/98ac8b7c_1766278.png "屏幕截图")  | ![输入图片说明](https://foruda.gitee.com/images/1691386108722171132/b937b23a_1766278.jpeg "屏幕截图") |
+| ![输入图片说明](https://foruda.gitee.com/images/1695714607596127461/513b6893_1766278.png "屏幕截图")  | ![输入图片说明](https://foruda.gitee.com/images/1692804549604261480/09ef12f6_1766278.png "屏幕截图")  |
+| ![输入图片说明](https://foruda.gitee.com/images/1692804541482477905/578e5448_1766278.png "屏幕截图")  | ![输入图片说明](https://foruda.gitee.com/images/1695714614517941469/cac681fb_1766278.png "屏幕截图")  |
+| ![输入图片说明](https://foruda.gitee.com/images/1698225407961714462/4d271901_1766278.png "屏幕截图")  | ![输入图片说明](https://foruda.gitee.com/images/1698225416488201339/30572e7f_1766278.png "屏幕截图")  |
+| ![输入图片说明](https://foruda.gitee.com/images/1698807198508085566/16c37a1b_1766278.png "屏幕截图")  | ![输入图片说明](https://foruda.gitee.com/images/1698807208125772586/ceed632e_1766278.png "屏幕截图")  |
+| ![输入图片说明](https://foruda.gitee.com/images/1698807214013013096/ad3bc016_1766278.png "屏幕截图")  | ![输入图片说明](https://foruda.gitee.com/images/1698807221010472627/72b10901_1766278.png "屏幕截图")  | 

+ 74 - 0
ruoyi-admin/src/main/resources/static/index.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>plus-doc</title>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
+    <meta name="description" content="Description">
+    <meta name="viewport"
+          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+    <!-- 设置浏览器图标 -->
+    <link rel="icon" href="./static/image/favicon.ico" type="image/x-icon"/>
+    <link rel="shortcut icon" href="./static/image/favicon.ico" type="image/x-icon"/>
+    <meta charset="UTF-8">
+    <!-- 默认主题 -->
+    <link rel="stylesheet" href="./static/css/vue.css">
+</head>
+<body>
+<div id="app"></div>
+<script>
+    window.$docsify = {
+        // 项目名称
+        name: 'ruoyi-ai',
+        // 仓库地址,点击右上角的Github章鱼猫头像会跳转到此地址
+        repo: 'https://gitee.com/ruoyi-ai',
+        // 侧边栏支持,默认加载的是项目根目录下的_sidebar.md文件
+        loadSidebar: true,
+        // 导航栏支持,默认加载的是项目根目录下的_navbar.md文件
+        loadNavbar: true,
+        // 封面支持,默认加载的是项目根目录下的_coverpage.md文件
+        coverpage: true,
+        // 最大支持渲染的标题层级
+        maxLevel: 5,
+        // 自定义侧边栏后默认不会再生成目录,设置生成目录的最大层级(建议配置为2-4)
+        subMaxLevel: 4,
+        // 小屏设备下合并导航栏到侧边栏
+        mergeNavbar: true,
+        // 页脚支持,默认加载的是 _footer.md
+        loadFooter: true,
+        // 首页只展示封面(默认为false,与README.md进行拼接)
+        onlyCover: true,
+        search: {
+            maxAge: 86400000,// 过期时间,单位毫秒,默认一天
+            paths: 'auto',// 注意:仅适用于 paths: 'auto' 模式
+            placeholder: '👉👉👉在这里搜索关键字👈👈👈',
+            noData: '找不到结果',
+            depth: 4,
+            hideOtherSidebarContent: false,
+            namespace: 'Docsify-Guide',
+        }
+    }
+</script>
+<!-- docsify的js依赖 -->
+<script src="./static/js/docsify.min.js"></script>
+<!-- emoji表情支持 -->
+<script src="./static/js/emoji.min.js"></script>
+<!-- 图片放大缩小支持 -->
+<script src="./static/js/zoom-image.min.js"></script>
+<!-- 搜索功能支持 -->
+<script src="./static/js/search.min.js"></script>
+<!--在所有的代码块上添加一个简单的Click to copy按钮来允许用户从你的文档中轻易地复制代码-->
+<script src="./static/js/docsify-copy-code.min.js"></script>
+
+<!-- 回到顶部 -->
+<script src="./static/js/docsify-scroll-to-top.min.js"></script>
+<!-- 分页导航 -->
+<script src="./static/js/docsify-pagination.min.js"></script>
+<!-- 页脚-->
+<script src="./static/js/docsify-footer.min.js"></script>
+
+<!-- 代码高亮 -->
+<script src="./static/js/prism-typescript.min.js"></script>
+<script src="./static/js/prism-bash.min.js"></script>
+</body>
+</html>

+ 22 - 0
ruoyi-admin/src/main/resources/static/plus-ui/_sidebar.md

@@ -0,0 +1,22 @@
+<!-- _sidebar.md -->
+- **特别赞助**
+- [![输入图片说明](https://foruda.gitee.com/images/1704162419429172656/d0521e59_1766278.png "2024-01-02=>2028-01-02")](http://ccflow.org/?frm=ryPlus)
+- [![输入图片说明](https://foruda.gitee.com/images/1705569347386939952/3f187980_1766278.jpeg "2024-01-18=>2025-01-18")](http://www.shuduokeji.com)
+- [![输入图片说明](https://foruda.gitee.com/images/1711681233267310022/2ffbcff2_1766278.png "2024-03-29=>2025-03-29")](https://www.jnpfsoft.com/index.html?from=plus-doc)
+
+
+* **简介**
+  * [项目简介](/plus-ui/home.md)
+* **开发文档**
+  * [通用方法](/plus-ui/devdoc/common_func.md)
+  * [开发规范](/plus-ui/devdoc/dev_norm.md)
+  * [请求流程](/plus-ui/devdoc/request_process.md)
+  * [路由使用](/plus-ui/devdoc/router_use.md)
+  * [组件使用](/plus-ui/devdoc/component_use.md)
+  * [权限使用](/plus-ui/devdoc/permissions_use.md)
+  * [页签缓存](/plus-ui/devdoc/page_cache.md)
+  * [使用图标](/plus-ui/devdoc/icon_use.md)
+  * [使用字典](/plus-ui/devdoc/dict_use.md)
+  * [使用参数](/plus-ui/devdoc/param_use.md)
+  * [异常处理](/plus-ui/devdoc/exception_handling.md)
+  * [内容复制](/plus-ui/devdoc/content_copy.md)

+ 234 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/common_func.md

@@ -0,0 +1,234 @@
+# 通用方法
+- - -
+
+### $tab对象
+> `$tab`对象用于做页签操作、刷新页签、关闭页签、打开页签、修改页签等,它定义在`plugins/tab.ts`文件中,它有如下方法
+* 打开页签
+
+```typescript
+// 打开页签
+proxy?.$tab.openPage('/system/user');
+// 打开页签并指定页签标题
+proxy?.$tab.openPage('/system/user', '用户管理');
+proxy?.$tab.openPage('/system/user', '用户管理').then(() => {
+    // 执行结束的逻辑
+})
+```
+
+* 修改页签
+
+```typescript
+// 修改当前页签
+const obj = Object.assign({}, route, { title: '自定义标题' });
+proxy?.$tab.updatePage(obj);
+```
+* 关闭页签
+
+```typescript
+// 关闭当前
+proxy?.$tab.closePage();
+// 关闭指定页签
+const obj = { path: "/system/user", name: "User" };
+proxy?.$tab.closePage(obj);
+
+proxy?.$tab.closePage(obj).then(() => {
+    // 执行结束的逻辑
+})
+```
+
+* 刷新页签
+
+```typescript
+// 刷新当前页签
+proxy?.$tab.refreshPage();
+
+// 刷新指定页签
+const obj = { path: "/system/user", name: "User" };
+proxy?.$tab.refreshPage(obj);
+
+proxy?.$tab.refreshPage(obj).then(() => {
+    // 执行结束的逻辑
+})
+```
+
+* 关闭所有页签
+
+```typescript
+proxy?.$tab.closeAllPage();
+
+proxy?.$tab.closeAllPage().then(() => {
+  // 执行结束的逻辑
+})
+```
+
+* 关闭左侧页签
+
+```typescript
+// 关闭当前页签的左侧页签
+proxy?.$tab.closeLeftPage();
+
+// 关闭指定页签的左侧页签
+const obj = { path: "/system/user", name: "User" };
+proxy?.$tab.closeLeftPage(obj);
+
+proxy?.$tab.closeLeftPage(obj).then(() => {
+  // 执行结束的逻辑
+})
+```
+
+* 关闭右侧页签
+
+```typescript
+// 关闭当前页签的右侧页签
+proxy?.$tab.closeRightPage();
+
+// 关闭指定页签的右侧页签
+const obj = { path: "/system/user", name: "User" };
+proxy?.$tab.closeRightPage(obj);
+
+proxy?.$tab.closeRightPage(obj).then(() => {
+  // 执行结束的逻辑
+})
+```
+
+* 关闭其他页签
+
+```typescript
+proxy?.$tab.closeOtherPage();
+
+const obj = { path: "/system/user", name: "User" };
+proxy?.$tab.closeOtherPage(obj);
+
+proxy?.$tab.closeOtherPage(obj).then(() => {
+  // 执行结束的逻辑
+})
+```
+
+### $modal对象
+> `$modal`对象用于做消息提示、通知提示、对话框提醒、二次确认、遮罩等,它定义在`plugins/modal.ts`文件中,它有如下方法
+
+* 提供成功、警告和错误等反馈信息
+
+```typescript
+proxy?.$modal.msg("默认反馈");
+proxy?.$modal.msgError("错误反馈");
+proxy?.$modal.msgSuccess("成功反馈");
+proxy?.$modal.msgWarning("警告反馈");
+```
+
+* 提供成功、警告和错误等提示信息
+
+```typescript
+proxy?.$modal.alert("默认提示");
+proxy?.$modal.alertError("错误提示");
+proxy?.$modal.alertSuccess("成功提示");
+proxy?.$modal.alertWarning("警告提示");
+```
+
+* 提供成功、警告和错误等通知信息
+
+```typescript
+proxy?.$modal.notify("默认通知");
+proxy?.$modal.notifyError("错误通知");
+proxy?.$modal.notifySuccess("成功通知");
+proxy?.$modal.notifyWarning("警告通知");
+```
+
+* 提供确认窗体信息
+
+```typescript
+proxy?.$modal.confirm('确认信息').then(function() {
+  ...
+}).then(() => {
+  ...
+}).catch(() => {});
+```
+
+* 提供遮罩层信息
+
+```typescript
+// 打开遮罩层
+proxy?.$modal.loading("正在导出数据,请稍后...");
+
+// 关闭遮罩层
+proxy?.$modal.closeLoading();
+```
+
+### $auth对象
+> `$auth`对象用于验证用户是否拥有某(些)权限或角色,它定义在`plugins/auth.ts`文件中,它有如下方法
+
+* 验证用户权限
+
+```typescript
+// 验证用户是否具备某权限
+proxy?.$auth.hasPermi("system:user:add");
+// 验证用户是否含有指定权限,只需包含其中一个
+proxy?.$auth.hasPermiOr(["system:user:add", "system:user:update"]);
+// 验证用户是否含有指定权限,必须全部拥有
+proxy?.$auth.hasPermiAnd(["system:user:add", "system:user:update"]);
+```
+
+* 验证用户角色
+
+```typescript
+// 验证用户是否具备某角色
+proxy?.$auth.hasRole("admin");
+// 验证用户是否含有指定角色,只需包含其中一个
+proxy?.$auth.hasRoleOr(["admin", "common"]);
+// 验证用户是否含有指定角色,必须全部拥有
+proxy?.$auth.hasRoleAnd(["admin", "common"]);
+```
+
+### $cache对象
+> `$cache`对象用于处理缓存。我们并不建议您直接使用`sessionStorage`或`localStorage`(vue3版本推荐使用useStorage),因为项目的缓存策略可能发生变化,通过`$cache`对象做一层调用代理则是一个不错的选择。`$cache`提供`session`和`local`两种级别的缓存,如下:
+
+| 对象名称 | 缓存类型                           |
+| -------- | ---------------------------------- |
+| session  | 会话级缓存,通过sessionStorage实现 |
+| local    | 本地级缓存,通过localStorage实现   |
+
+
+**示例**
+
+```typescript
+// local 普通值
+proxy?.$cache.local.set('key', 'local value')
+console.log(proxy?.$cache.local.get('key')) // 输出'local value'
+
+// session 普通值
+proxy?.$cache.session.set('key', 'session value')
+console.log(proxy?.$cache.session.get('key')) // 输出'session value'
+
+// local JSON值
+proxy?.$cache.local.setJSON('jsonKey', { localProp: 1 })
+console.log(proxy?.$cache.local.getJSON('jsonKey')) // 输出'{localProp: 1}'
+
+// session JSON值
+proxy?.$cache.session.setJSON('jsonKey', { sessionProp: 1 })
+console.log(proxy?.$cache.session.getJSON('jsonKey')) // 输出'{sessionProp: 1}'
+
+// 删除值
+proxy?.$cache.local.remove('key')
+proxy?.$cache.session.remove('key')
+```
+
+### $download对象
+
+> `$download`对象用于文件下载,它定义在`plugins/download.ts`文件中,它有如下方法
+
+* 通过ossId从存储中下载文件
+
+``` typescript
+// 默认下载方法
+proxy?.$download.oss(ossId);
+```
+
+* 根据请求地址下载zip包
+
+```typescript
+const url = '/tool/gen/batchGenCode?tables=' + tableNames;
+const name = 'ruoyi';
+
+// 默认方法
+proxy?.$download.zip(url, name);
+```

+ 55 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/component_use.md

@@ -0,0 +1,55 @@
+# 组件使用
+- - -
+
+vue 注册组件的两种方式
+在 `@/components` 下创建的.vue文件自动为全局组件,可直接在任意位置使用。
+
+### 局部注册
+在对应页使用`components`注册组件。
+```typescript
+<script setup lang=ts>
+import ComponentA from './ComponentA.vue'
+</script>
+
+<template>
+  <ComponentA />
+</template>
+```
+
+### 全局注册
+我们可以使用[ Vue 应用实例](https://cn.vuejs.org/guide/essentials/application.html)的 `.component()` 方法,让组件在当前 Vue 应用中全局可用。
+```typescript
+import { createApp } from 'vue'
+
+const app = createApp({})
+
+app.component(
+  // 注册的名字
+  'MyComponent',
+  // 组件的实现
+  {
+    /* ... */
+  }
+)
+```
+如果使用单文件组件,你可以注册被导入的 `.vue` 文件:
+```typescript
+import MyComponent from './App.vue'
+
+app.component('MyComponent', MyComponent)
+```
+`.component()` 方法可以被链式调用:
+```typescript
+app
+  .component('ComponentA', ComponentA)
+  .component('ComponentB', ComponentB)
+  .component('ComponentC', ComponentC)
+```
+全局注册的组件可以在此应用的任意组件的模板中使用:
+```Typescript
+// 这在当前应用的任意组件中都可用
+<ComponentA/>
+<ComponentB/>
+<ComponentC/>
+```
+所有的子组件也可以使用全局注册的组件,这意味着这三个组件也都可以在彼此内部使用。

+ 4 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/content_copy.md

@@ -0,0 +1,4 @@
+# 内容复制
+- - -
+
+文档建设中

+ 16 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/dev_norm.md

@@ -0,0 +1,16 @@
+# 开发规范
+- - -
+
+### 新增view
+> 在`@/views`文件下创建对应的文件夹,一般性一个路由对应一个文件, 该模块下的功能就建议在本文件夹下创建一个新文件夹,各个功能模块维护自己的`utils`或`components`组件。
+
+### 新增api
+> 在`@/api`文件夹下创建本模块对应的api服务。  
+> 在api服务同级创建`types.ts`类型声明文件。
+
+### 新增组件
+> 在全局的`@/components`写一些全局的组件,如富文本,各种搜索组件,封装的分页组件等等能被公用的组件。 每个页面或者模块特定的业务组件则会写在当前`@/views`下面。
+如:`@/views/system/user/components/xxx.vue`。这样拆分大大减轻了维护成本。
+
+### 新增样式
+> 页面的样式和组件是一个道理,全局的`@/style`放置一下全局公用的样式,每一个页面的样式就写在当前 views下面,请记住加上scoped 就只会作用在当前组件内了,避免造成全局的样式污染。

+ 4 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/dict_use.md

@@ -0,0 +1,4 @@
+# 使用字典
+- - -
+
+文档建设中

+ 4 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/exception_handling.md

@@ -0,0 +1,4 @@
+# 异常处理
+- - -
+
+文档建设中

+ 4 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/icon_use.md

@@ -0,0 +1,4 @@
+# 使用图标
+- - -
+
+文档建设中

+ 4 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/page_cache.md

@@ -0,0 +1,4 @@
+# 页签缓存
+- - -
+
+文档建设中

+ 4 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/param_use.md

@@ -0,0 +1,4 @@
+# 使用参数
+- - -
+
+文档建设中

+ 4 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/permissions_use.md

@@ -0,0 +1,4 @@
+# 权限使用
+- - -
+
+文档建设中

+ 65 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/request_process.md

@@ -0,0 +1,65 @@
+# 请求流程
+- - -
+
+### 交互流程
+一个完整的前端UI交互到服务器端处理流程是这样的:  
+
+1. UI 组件交互操作;
+2. 调用统一管理的 api service 请求函数;
+3. 使用封装的 request.js 发送请求;
+4. 获取服务端返回;
+5. 更新 data;
+
+为了方便管理维护,统一的请求处理都放在`@/src/api`文件夹中,并且一般按照`model`维度进行拆分文件,如:
+```
+api/
+  system/
+    user/
+      index.ts
+      types.ts
+    role/
+      index.ts
+      types.ts
+  monitor/
+    operlog/
+      index.ts
+      types.ts
+    logininfor/
+      index.ts
+      types.ts
+  ...
+```
+> **提示**  
+> 其中`@/src/utils/request.ts`是基于 axios 的封装,便于统一处理 POST,GET 等请求参数,请求头,以及错误提示信息等。 它封装了全局request拦截器、response拦截器、统一的错误处理、统一做了超时处理、baseURL设置等。
+
+### 请求示例
+```typescript
+// @/api/system/user/index.ts
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { UserQuery, UserVO } from './types';
+
+export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => {
+  return request({
+    url: '/system/user/list',
+    method: 'get',
+    params: query
+  });
+};
+
+// @/views/system/user/index.vue
+import api from '@/api/system/user';
+const res = await api.listUser(proxy?.addDateRange(queryParams.value, dateRange.value));
+```
+> **提示**  
+> 如果有不同的`baseURL`,直接通过覆盖的方式,让它具有不同的`baseURL`。
+> ```typescript
+> export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => {
+>   return request({
+>     url: '/system/user/list',
+>     method: 'get',
+>     params: query,
+>     baseURL: process.env.BASE_API
+>   });
+> };
+> ```

+ 82 - 0
ruoyi-admin/src/main/resources/static/plus-ui/devdoc/router_use.md

@@ -0,0 +1,82 @@
+# 路由使用
+- - -
+
+框架的核心是通过路由自动生成对应导航,所以除了路由的基本配置,还需要了解框架提供了哪些配置项。
+### 路由配置
+```typescript
+// 当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1
+hidden: true // (默认 false)
+
+//当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
+redirect: 'noRedirect'
+
+// 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
+// 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
+// 若你想不管路由下面的 children 声明的个数都显示你的根路由
+// 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
+alwaysShow: true
+
+name: 'router-name' // 设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题
+query: '{"id": 1, "name": "ry"}'     // 访问路由的默认传递参数
+roles: ['admin', 'common']           // 访问路由的角色权限
+permissions: ['a:a:a', 'b:b:b']      // 访问路由的菜单权限
+ 
+meta: {
+  title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
+  icon: 'svg-name' // 设置该路由的图标,支持 svg-class,也支持 el-icon-x element-ui 的 icon
+  noCache: true // 如果设置为true,则不会被 <keep-alive> 缓存(默认 false)
+  breadcrumb: false //  如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)
+  affix: true // 如果设置为true,它则会固定在tags-view中(默认 false)
+
+  // 当路由设置了该属性,则会高亮相对应的侧边栏。
+  // 这在某些场景非常有用,比如:一个文章的列表页路由为:/article/list
+  // 点击文章进入文章详情页,这时候路由为/article/1,但你想在侧边栏高亮文章列表的路由,就可以进行如下设置
+  activeMenu: '/article/list'
+}
+```
+**普通示例**
+```json
+{
+  path: '/system/test',
+  component: Layout,
+  redirect: 'noRedirect',
+  hidden: false,
+  alwaysShow: true,
+  meta: { title: '系统管理', icon : "system" },
+  children: [{
+    path: 'index',
+    component: (resolve) => require(['@/views/index'], resolve),
+    name: 'Test',
+    meta: {
+      title: '测试管理',
+      icon: 'user'
+    }
+  }]
+}
+```
+**外链示例**
+```json
+{
+  path: 'http://ruoyi.vip',
+  meta: { title: '若依官网', icon : "guide" }
+}
+```
+### 静态路由
+代表那些不需要动态判断权限的路由,如登录页、404、等通用页面,在`@/router/index.ts`配置对应的公共路由。
+### 动态路由
+代表那些需要根据用户动态判断权限并通过addRoutes动态添加的页面,在`@/store/modules/permission.ts`加载后端接口路由配置。
+> **提示**
+> * 动态路由可以在系统管理-菜单管理进行新增和修改操作,前端加载会自动请求接口获取菜单信息并转换成前端对应的路由。
+> * 动态路由在生产环境下会默认使用路由懒加载,实现方式参考loadView方法的判断。
+### 常用方法
+想要跳转到不同的页面,使用`router.push`方法
+```Typescript
+const router = useRouter();
+router.push({ path: "/system/user" });
+```
+跳转页面并设置请求参数,使用`query`属性
+```Typescript
+const router = useRouter();
+router.push({ path: "/system/user", query: {id: "1", name: "若依"} });
+```
+更多使用可以参考[vue-router](https://router.vuejs.org/zh/)官方文档。

+ 53 - 0
ruoyi-admin/src/main/resources/static/plus-ui/home.md

@@ -0,0 +1,53 @@
+# 项目简介
+
+---
+
+## 平台简介
+
+- 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
+- 配套后端代码仓库地址
+- [RuoYi-Vue-Plus 5.X(注意版本号)](https://gitee.com/dromara/RuoYi-Vue-Plus)
+- [RuoYi-Cloud-Plus 2.X(注意版本号)](https://gitee.com/dromara/RuoYi-Cloud-Plus)
+
+## 前端运行
+
+```bash
+# 克隆项目
+git clone https://gitee.com/JavaLionLi/plus-ui.git
+
+# 安装依赖
+npm install --registry=https://registry.npmmirror.com
+
+# 启动服务
+npm run dev
+
+# 推荐使用yarn或pnpm包管理工具
+# 构建测试环境 yarn build:stage
+# 构建生产环境 yarn build:prod
+# 前端访问地址 http://localhost:80
+```
+
+## 后端改造
+
+参考后端代码内 `ruoyi-gen/resources/vm/vue/v3/readme.txt` 说明
+
+## 内置功能
+
+1. 租户管理:配置系统租户,支持 SaaS 场景下的多租户功能。
+2. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
+3. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
+4. 岗位管理:配置系统用户所属担任职务。
+5. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
+6. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
+7. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
+8. 参数管理:对系统动态配置常用参数。
+9. 通知公告:系统通知公告信息发布维护。
+10. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
+11. 登录日志:系统登录日志记录查询包含登录异常。
+12. 在线用户:当前系统中活跃用户状态监控。
+13. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
+14. 代码生成:前后端代码的生成(java、html、xml、sql)支持 CRUD 下载 。
+15. 系统接口:根据业务代码自动生成相关的 api 接口文档。
+16. 服务监控:监视当前系统 CPU、内存、磁盘、堆栈等相关信息。
+17. 缓存监控:对系统的缓存信息查询,命令统计等。
+18. 在线构建器:拖动表单元素生成相应的 HTML 代码。(TS 版本正在开发中。)

+ 34 - 0
ruoyi-admin/src/main/resources/static/questions/_sidebar.md

@@ -0,0 +1,34 @@
+<!-- _sidebar.md -->
+- **特别赞助**
+- [![输入图片说明](https://foruda.gitee.com/images/1704162419429172656/d0521e59_1766278.png "2024-01-02=>2028-01-02")](http://ccflow.org/?frm=ryPlus)
+- [![输入图片说明](https://foruda.gitee.com/images/1705569347386939952/3f187980_1766278.jpeg "2024-01-18=>2025-01-18")](http://www.shuduokeji.com)
+- [![输入图片说明](https://foruda.gitee.com/images/1711681233267310022/2ffbcff2_1766278.png "2024-03-29=>2025-03-29")](https://www.jnpfsoft.com/index.html?from=plus-doc)
+
+
+
+* **常见问题**
+  * [Lombok注解爆红](/questions/lombok.md)
+  * [如何使用Tomcat](/questions/use_tomcat.md)
+  * [如何使用druid连接池](/questions/use_druid.md)
+  * [vue与boot整合部署](/questions/deploy_vue.md)
+  * [导入excel实体类为空](/questions/import_excel.md)
+  * [如何同步项目更新](/questions/synchronous_update.md)
+  * [ParseException SQL解析异常](/questions/parse_exception.md)
+  * [swagger相关问题](/questions/swagger.md)
+  * [实体bean为空问题](/questions/bean_null.md)
+  * [Redis 报错 Permission denied](/questions/permission_denied.md)
+  * [关于HTTPS配置](/questions/https_config.md)
+  * [放行接口提示认证失败](/questions/identify_fail.md)
+  * [打包jar运行报错](/questions/jar_run_fail.md)
+  * [如何指定dubbo注册ip](/questions/dubbo_ip.md)
+  * [Sentinel页面404问题](/questions/sentinel_404.md)
+  * [无法读取nacos配置](/questions/nacos_read_fail.md)
+  * [接口文档对接knife4j](/questions/kinfe4j.md)
+  * [不支持ST请求](/questions/st_not_support.md)
+  * [Only one connection receive subscriber allowed](/questions/only_one_subscriber.md)
+  * [nacos 报错 The Raft Group [naming_instance_metadata]](/questions/nacos_naming_instance_metadata.md)
+  * [unable to read meta-data for class xxx](/questions/read_metadata.md)
+  * [JCE cannot authenticate the provider BC](/questions/jce_cannot.md)
+  * [关于请求响应参数解密](/questions/api_encrypt.md)
+  * [关于登录调试步骤](/questions/login_step.md)
+  * [如何对接国产数据库](/questions/domestic_databases.md)

+ 148 - 0
ruoyi-admin/src/main/resources/static/questions/api_encrypt.md

@@ -0,0 +1,148 @@
+# 关于请求响应参数解密
+---
+## 1:前端加密请求
+
+![输入图片说明](https://foruda.gitee.com/images/1717033672316716771/8e30a2f1_4959041.png "屏幕截图")
+
+通过控制台获取加密结果:
+
+![输入图片说明](https://foruda.gitee.com/images/1717033792384655437/900a0e0d_4959041.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1717033896868612970/55581f0a_4959041.png "屏幕截图")
+
+
+加密密钥:
+
+```
+PAg/fZzpV/cz0T1fMUJMJo/LEZvwVLb4bZgtCHkbB6FQAJWlLm/RLKtQ5fOo1blMjAkY+9ryWhsAfCqoMPTU4w==
+```
+
+请求参数加密结果:
+
+```
+F+Qxq6PzShcudDsUZHhp50lA67eBeTe63x5uGbdm/HJGgcDmjKncUk5VQm0evD8pz1sbmCbmmSl3X1D07K/qgHvP1YhjYSRBJf/M0GTfMkfOZqIkOtvfE5Z6fSFd8RYf6ji/qYxAmCiRmP/uADyJUAoBY1gMi5+zuvyHH3In/FyoFeD0rmJWvO4o4fn3n5GElHMWbP0O/HWPfgHFfg1F7bZQPuf4zAuDKQIqUG3jJTem3O97kAbTWw6lSSuYi1/8tV4cE9rq8SMSjx36/ZLSog==
+```
+
+### 解密步骤
+
+1. 使用配置文件私钥对加密密钥解密
+
+```java
+// 参数说明:
+// requestKey:即请求标头加密密钥 
+// privateKey:application.yml 配置文件私钥
+String decryptByRsa = EncryptUtils.decryptByRsa(requestKey, privateKey);
+```
+
+2. 对步骤一结果进行 Base64 解密,得到 AES 加密密钥
+
+```java
+String aesPassword = EncryptUtils.decryptByBase64(decryptByRsa);
+```
+
+3. 使用步骤二得到的密钥,对请求参数进行解密
+
+```java
+String decryptBody = EncryptUtils.decryptByAes(requestBody, aesPassword);
+```
+
+得到解密请求参数(已格式化):
+
+```json
+{
+    "tenantId": "000000",
+    "username": "admin",
+    "password": "admin123",
+    "rememberMe": false,
+    "uuid": "a39962b22c874f60872ef5db1cd811f5",
+    "code": "5",
+    "clientId": "e5cd7e4891bf95d1d19206ce24a7b32e",
+    "grantType": "password"
+}
+```
+
+|参数名|说明|
+|---|---|
+|tenantId| 租户id |
+|username| 用户名 |
+|password| 密码 |
+|rememberMe| 记住密码 |
+|uuid| - |
+|code| 验证码结果 |
+|clientId| 客户端id(表 sys_client) |
+|grantType| 授权类型(表 sys_client) |
+
+## 2:后端加密响应
+
+对请求使用了注解 `@ApiEncrypt(response = true)`
+
+![输入图片说明](https://foruda.gitee.com/images/1717035066844744866/2286b394_4959041.png "屏幕截图")
+
+通过控制台获取加密结果:
+
+![输入图片说明](https://foruda.gitee.com/images/1717035156784270596/156f2aa7_4959041.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1717035193189175688/214631e5_4959041.png "屏幕截图")
+
+加密密钥:
+
+```
+MXnKYnXcXeFYWKZg8utuhDtbz54cPDcov11E1KT5l19/vMt37d4NhzzwBWnqug72SOgOK5URGaWPJSs9VdaP0Q==
+```
+
+响应参数加密结果:
+
+```
+70 O63EMmwvbAyWPqDDmVOGTy+BOQnIVgKInMFNRtp8Zwzs8DEL20VgL2IslYrL8bc1u7lPhYNU/6 Q3iTYebm4EokwiG+styaT+LO3M9bUimggoAGpBTW8gCRF/34 kJaOITSRqYqYcXIJKn73+Gqn7jevyKUHyRXog/3 q/PlBdmUjNiB4gtxlOO/Vm+4 o+0 W4jcEe0xwwzV91+Ze3S6Eu/1 XN21g0iOsYT34emv/vhd9Hy3p5LfJlAHvn96x/c3MQBQUU32uM3Vkk3o6IpVHjJljE64gnGximSwB9vrmMA21xX+fq9HYioumknmDDbaY/JAKh32CDgn5M5hdaIklf08sU38r1IyvipySzrHX+ci9GmOZhP2ttCtoZ7SGvFFbNEuyojssxwxXEmJHAsG/OhIAeRXMUr3+dzDJ++XvvMuMgNJR0BMldNydFAjNOQEszgcVM1QEGwxfW5rElW8VxQaaqPyDATX+y2JrK1vdKxxdI/hF5dGpQMdU4FAEhHIftoIbD/FH4XcWJamZjJpbVtZvTkFYpbhiU7sz9MICSuKwaoSFJ8JGANc0bDdVoWpA8sXi7a27IM0pDzk9gD/FADcFGHXxPYUhENkXiUcnmg5LSdigiY4J6HrqEJdH6zNSwoGubcsXhiPdlB3V0DqcLAHFt+GYj5lcxZeqUAmixGVGCV7gSBWNiyo9/NnXcynA/EIlV3OZIvgzjWxiKzcVJ1HOKoXGEcg3Q54QNh5pCqEa7AtqVkKO7/Ffgg8nSEeCdJPzTV7zmr3n94Hn671OL8A==
+```
+
+### 解密步骤
+
+1. 使用前端配置文件私钥对加密密钥解密
+
+```java
+// 参数说明:
+// responseKey:即响应标头加密密钥 
+// privateKey:前端 .env.development | .env.production 配置文件私钥,注意和后端私钥区分
+String decryptByRsa = EncryptUtils.decryptByRsa(responseKey, privateKey);
+```
+
+2. 对步骤一结果进行 Base64 解密,得到 AES 加密密钥
+
+```java
+String aesPassword = EncryptUtils.decryptByBase64(decryptByRsa);
+```
+
+3. 使用步骤二得到的密钥,对响应参数进行解密
+
+```java
+String decryptBody = EncryptUtils.decryptByAes(responseBody, aesPassword);
+```
+
+得到解密请求参数(已格式化):
+
+```json
+{
+    "code": 200,
+    "msg": "操作成功",
+    "data": {
+        "scope": null,
+        "openid": null,
+        "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJjOVNWU1hRRVY4QVhFRkt4b2FrbndSSWxPczd4ajdRZCIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCJ9.YuaXPu6eTzJVkLyQC3ekzmPS_jXp50ykaIB2nWy11qM",
+        "refresh_token": null,
+        "expire_in": 604799,
+        "refresh_expire_in": null,
+        "client_id": "e5cd7e4891bf95d1d19206ce24a7b32e"
+    }
+}
+```
+
+|参数名|说明|
+|---|---|
+|scope| 令牌权限 |
+|openid| 用户 openid |
+|access_token| 授权令牌 |
+|refresh_token| 刷新令牌 |
+|expire_in| 授权令牌 access_token 的有效期 |
+|refresh_expire_in| 刷新令牌 refresh_token 的有效期 |
+|clientId| 客户端id(表 sys_client) |

+ 10 - 0
ruoyi-admin/src/main/resources/static/questions/bean_null.md

@@ -0,0 +1,10 @@
+# 实体bean为空问题
+- - -
+### 问题排查
+
+检查是否存在 `链式调用` 注解 `@Accessors(chain = true)` 删除即可
+
+### 原因
+java 规范 set 返回值为 `void` 链式调用 set 返回值为 `this`<br>
+故多数框架底层使用 jdk 工具导致找不到 set 方法<br>
+例如: `easyexcel` `cglib` `mybatis` 等

+ 13 - 0
ruoyi-admin/src/main/resources/static/questions/deploy_vue.md

@@ -0,0 +1,13 @@
+# 关于vue与boot整合部署
+- - -
+* [前端静态资源如何整合到后端访问](https://doc.ruoyi.vip/ruoyi-vue/other/faq.html#前端静态资源如何整合到后端访问)
+
+3.X 需在 `pom.xml` 增加资源过滤排除
+
+```xml
+<resource>
+    <directory>src/main/resources/页面目录</directory>
+    <!-- 关闭过滤 -->
+    <filtering>false</filtering>
+</resource>
+```

+ 41 - 0
ruoyi-admin/src/main/resources/static/questions/domestic_databases.md

@@ -0,0 +1,41 @@
+# 如何对接国产数据库
+
+> 1. 框架采用 mybatis-plus 几乎支持大部分市面上的数据库且框架内几乎没有sql语句存在
+<br>
+所以不用担心兼容性问题(顶多就是有一些关键字什么的 对接很简单)
+<br>
+> 2. 国产数据库大多都兼容主流三大数据库 mysql oracle postgresql
+<br>
+例如 达梦兼容oracle 人大金仓兼容mysql oceanbase兼容mysql 等等
+
+# 对接方式
+
+### 这里用 `达梦` 数据库为例
+
+1.首先增加 jdbc依赖包 `vue版本在ruoyi-admin模块下` `cloud版本在ruoyi-common-mybatis模块下`
+
+![输入图片说明](https://foruda.gitee.com/images/1723288594335994875/216ae8e7_1766278.png "屏幕截图")
+
+2.在配置文件yml内配置数据库连接
+
+![输入图片说明](https://foruda.gitee.com/images/1723288760519808620/3db91ba5_1766278.png "屏幕截图")
+
+3.sql脚本使用框架内自带的sql文件根据兼容的数据库模式 例如 达梦用oracle的sql脚本
+
+![输入图片说明](https://foruda.gitee.com/images/1723289018873298537/4d95c892_1766278.png "屏幕截图")
+
+4.在代码生成器内 增加对应的数据库生成器依赖 代码生成器使用 anyline 支持几百种数据库只需要增加对应的依赖即可
+
+![输入图片说明](https://foruda.gitee.com/images/1723288974693848785/3e8fc61f_1766278.png "屏幕截图")
+
+这样基本就完成了所有需要做的事可以尝试启动项目了
+
+5.如果项目启或者运行动过程中有sql报错 不要慌基本上都是一些关键字引起的
+<br>
+例如 达梦内的`domain`就是关键字 在我们的`SysOssConfig`表内使用`domain`进行自定义的域名存储
+<br>
+我们只需要在`SysOssConfig`实体类的`domain`属性增加一个注解即可解决此问题
+<br>
+**注意: 各种数据库处理关键字的标识符不一样注意替换**
+
+![输入图片说明](https://foruda.gitee.com/images/1723289232470339283/480d5172_1766278.png "屏幕截图")

+ 18 - 0
ruoyi-admin/src/main/resources/static/questions/dubbo_ip.md

@@ -0,0 +1,18 @@
+# 如何指定dubbo注册ip
+- - -
+## 重点说明
+以下方法指定IP必须是本地有网卡的自己可以访问的IP 不可以随意乱写<br>
+(云服务器公网IP是没有网卡的)
+
+## 在`nacos`指定协议IP地址(全局生效)
+```yml
+dubbo:
+  protocol:
+    # 指定dubbo协议注册ip
+    host: 192.168.0.100
+```
+
+## docker指定dubbo环境变量(单服务生效)
+
+![输入图片说明](https://foruda.gitee.com/images/1678981332028792584/7eeef9c5_1766278.png "屏幕截图")
+

+ 27 - 0
ruoyi-admin/src/main/resources/static/questions/https_config.md

@@ -0,0 +1,27 @@
+# 关于HTTPS配置
+- - -
+### 后端 HTTPS 改造
+
+将申请的 `https` 证书放置到 `nginx` 对应目录内<br>
+根据框架 `nginx https` 示例 更改后端代理为 `https`<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678981283573122208/87cf19ad_1766278.png "屏幕截图")
+
+### 监控中心 与 任务调度中心 改造
+
+`监控中心` 与 `任务调度中心` 属于系统管控服务<br>
+应在内网使用 不应该暴漏到外网 也无需配置 `https`
+
+更改 `系统 -> 菜单管理 -> 监控中心 与 任务调度中心` 菜单配置<br>
+将其改为 `外链访问` 访问路径为 **注意: 如果是外网使用 url需配置为 http://外网ip:端口**
+
+![输入图片说明](https://foruda.gitee.com/images/1678981287686638349/3734f085_1766278.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1678981292545287978/f2471f97_1766278.png "屏幕截图")
+
+`nginx` 配置 `独立的端口` 进行反向代理即可访问(代理编写方式参考后端反向代理)
+
+### Minio https 改造
+
+下方链接包含 minio+nginx 与 minio本身配置https 两种方案<br>
+[终极版minio配置https教程](https://blog.csdn.net/Michelle_Zhong/article/details/126484358)

+ 10 - 0
ruoyi-admin/src/main/resources/static/questions/identify_fail.md

@@ -0,0 +1,10 @@
+# 放行接口提示认证失败
+- - -
+## 可能的原因
+接口放行后不需要token即可访问<br>
+但是没有token也就无法获取用户信息与鉴权
+
+## 解决方案
+删除接口上的鉴权注解<br>
+删除接口内获取用户信息功能<br>
+删除数据库实体类 自动注入 `createBy` `updateBy` 因为会获取用户数据

+ 4 - 0
ruoyi-admin/src/main/resources/static/questions/import_excel.md

@@ -0,0 +1,4 @@
+# 关于导入excel实体类为空
+- - -
+* 禁止在导入实体使用 `lombok` 链式调用注解 `@Accessors(chain = true)`
+* 会导致找不到 `set` 方法无法注入内容

+ 12 - 0
ruoyi-admin/src/main/resources/static/questions/jar_run_fail.md

@@ -0,0 +1,12 @@
+# 打包jar运行报错问题
+- - -
+
+**常见于 windows 平台以命令方式启动**
+
+windows 平台默认编码为 GBK 所以读取到所有的配置都是乱码
+
+## 解决方案
+
+需要在命令增加 `-Dfile.encoding=utf-8` 指定文件编码
+
+例如: `java -Dfile.encoding=utf-8 -jar ruoyi-xxx.jar`

+ 3 - 0
ruoyi-admin/src/main/resources/static/questions/jce_cannot.md

@@ -0,0 +1,3 @@
+# 问题说明 由于 OracleJDK 强校验加密证书导致
+
+解决方案 禁止使用 oraclejdk 更换为其他例如 openjdk

+ 66 - 0
ruoyi-admin/src/main/resources/static/questions/kinfe4j.md

@@ -0,0 +1,66 @@
+# 对接前声明
+
+经常有小伙伴希望可以对接 knife4j
+
+那么这里将介绍如何使用 框架生成的 openapi 对接 knife4j
+
+# 如何对接
+
+**重点声明: 本框架生成标准openapi结构 如对接后遇到不好用等问题 皆与本框架无关**
+
+knife4j 本身提供了独立的文档中间件 可以零成本的介入 openapi
+
+文档地址: https://doc.xiaominfo.com/docs/middleware-sources
+
+**注意: 此组件应单独搞一个boot项目 不要往框架里做任何代码上的更改**
+
+使用文档提供的 Cloud 模式 对接咱们框架的 openapi 地址即可完成对接
+
+![输入图片说明](https://foruda.gitee.com/images/1685953873117929554/22dce56e_1766278.png "屏幕截图")
+
+vue版本对接配置如下: 
+
+```yml
+knife4j:
+  enable-aggregation: true
+  cloud:
+    enable: true
+    routes:
+      - name: 演示模块
+        uri: localhost:8080
+        location: /v3/api-docs/1.演示模块
+      - name: 系统模块
+        uri: localhost:8080
+        location: /v3/api-docs/2.系统模块
+      - name: 代码生成模块
+        uri: localhost:8080
+        location: /v3/api-docs/3.代码生成模块
+```
+
+cloud版本对接配置如下: 
+
+```yml
+knife4j:
+  enable-aggregation: true
+  cloud:
+    enable: true
+    routes:
+      - name: 演示模块
+        uri: localhost:8080
+        location: /demo/v3/api-docs
+      - name: 认证服务
+        uri: localhost:8080
+        location: /auth/v3/api-docs
+      - name: 资源服务
+        uri: localhost:8080
+        location: /resource/v3/api-docs
+      - name: 系统服务
+        uri: localhost:8080
+        location: /system/v3/api-docs
+      - name: 监控服务
+        uri: localhost:8080
+        location: /monitor/v3/api-docs
+      - name: 代码生成服务
+        uri: localhost:8080
+        location: /gen/v3/api-docs
+```

+ 69 - 0
ruoyi-admin/src/main/resources/static/questions/login_step.md

@@ -0,0 +1,69 @@
+# 关于登录调试步骤
+
+## 1:关闭 api 接口加密
+
+1. 修改后端配置文件 `application.yml`
+
+![输入图片说明](https://foruda.gitee.com/images/1717037518256330645/c5a9f0fc_4959041.png "屏幕截图")
+
+2. 修改前端配置文件 `.env.development` | `.env.production`
+
+![输入图片说明](https://foruda.gitee.com/images/1717037555118359683/0e73a369_4959041.png "屏幕截图")
+
+## 2:登录参数
+
+![输入图片说明](https://foruda.gitee.com/images/1717038201634120005/e02882d3_4959041.png "屏幕截图")
+
+|参数名|说明|
+|---|---|
+|tenantId| 租户id |
+|username| 用户名 |
+|password| 密码 |
+|rememberMe| 记住密码 |
+|uuid| - |
+|code| 验证码结果 |
+|clientId| 客户端id(表 sys_client) |
+|grantType| 授权类型(表 sys_client) |
+
+## 3:使用接口文档调试
+
+### 3.1:使用接口文档请求
+
+1. 配置接口文档([参考文档](/ruoyi-vue-plus/framework/association/doc))
+2. 请求接口 `http://localhost:8080/auth/login`
+
+![输入图片说明](https://foruda.gitee.com/images/1717039200581756307/97efbc9c_4959041.png "屏幕截图")
+
+### 3.2:使用 idea 请求
+
+![输入图片说明](https://foruda.gitee.com/images/1717039459944753490/040d2b9d_4959041.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1717039534863944601/df91df67_4959041.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1717039598067298052/cc9fe61b_4959041.png "屏幕截图")
+
+### 3.3:获取验证码以及 uuid
+
+!> 验证码以及 uuid 获取方式: Redis | 控制台
+
+方式一、Redis:
+
+![输入图片说明](https://foruda.gitee.com/images/1717040260329977942/42f7ed62_4959041.png "屏幕截图")
+
+> **如果没有验证码相关 key,说明已经过期被清理了,去前端页面刷新一下即可。**
+
+方式二、控制台:
+
+![输入图片说明](https://foruda.gitee.com/images/1717040428227070908/1ef7562a_4959041.png "屏幕截图")
+
+### 3.4:关闭验证码
+
+如果嫌验证码太麻烦,可以关闭,修改后端配置文件 `application.yml`
+
+![输入图片说明](https://foruda.gitee.com/images/1717040533266608114/054fd984_4959041.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1717040745251872562/374267e8_4959041.png "屏幕截图")
+
+请求参数:
+
+![输入图片说明](https://foruda.gitee.com/images/1717040762860943102/81c9b44a_4959041.png "屏幕截图")

+ 4 - 0
ruoyi-admin/src/main/resources/static/questions/lombok.md

@@ -0,0 +1,4 @@
+# 关于lombok注解爆红
+- - -
+* 已知 lombok 插件与 idea中文插件 存在兼容性问题
+* 移除中文插件或手动关闭idea检查

+ 35 - 0
ruoyi-admin/src/main/resources/static/questions/nacos_naming_instance_metadata.md

@@ -0,0 +1,35 @@
+# nacos 报错 The Raft Group [naming_instance_metadata]
+- - -
+## Nacos 服务下线报错问题
+
+问题描述:
+
+Nacos 服务管理 > 服务列表 > 详情 > 下线 报错
+
+
+
+报错详情:
+
+```
+caused: errCode: 500, errMsg: do metadata operation failed ;caused: com.alibaba.nacos.consistency.exception.ConsistencyException: The Raft Group [naming_instance_metadata] did not find the Leader node;caused: The Raft Group [naming_instance_metadata] did not find the Leader node;
+```
+
+
+
+解决方案:
+
+**删除 Nacos 根目录下 data 文件夹下的 protocol 文件夹**
+
+(推荐使用全局搜索软件查询,windows 环境根目录一般在 C:\Users\用户名\nacos)
+
+
+
+问题原因:
+
+> Nacos 采用 raft 算法来计算 Leader,并且会记录上次启动的集群地址,所以当我们自己的服务器 IP 改变时(网络环境不稳定,如WIFI, IP 地址也经常变化),导致 raft 记录的集群地址失效,导致选 Leader 出现问题。
+
+
+
+参考目录:
+
+[解决疑难问题之服务下线报:The Raft Group naming_instance_metadata\] did not find the Leader node; - 嘉美祥瑞 - 博客园 (cnblogs.com)](https://www.cnblogs.com/whl-jx911/p/16736625.html)

+ 15 - 0
ruoyi-admin/src/main/resources/static/questions/nacos_read_fail.md

@@ -0,0 +1,15 @@
+# 无法读取nacos配置
+- - -
+### 检查 `group` 与 `namespace` 是否一致
+
+如果未使用框架自带 `ry-config.sql` 文件进行配置 会导致 `namespace` 不一致 无法查询配置
+
+### 检查 `8848` `9848` `9849` 端口是否开启可用
+
+### 检查配置文件名是否一致 例如: "xxx" 与 "xxx.yml" 的区别
+
+### 检查是否手动改过 `nacos` 数据库数据
+
+`nacos` 数据表层层关联 不要自作聪明手动改数据库
+
+已经改过的 需要重新导入 `ry-config.sql` 之后在页面进行改数据操作

+ 11 - 0
ruoyi-admin/src/main/resources/static/questions/only_one_subscriber.md

@@ -0,0 +1,11 @@
+# Only one connection receive subscriber allowed
+- - -
+## 问题原因
+**经多人反馈 共同点为全都是做`小程序开发`使用的`uniapp`发送的网络请求而出现这种问题**
+
+`uniapp` 错误设置 `Content-Type` 将所有请求类型全都设置成了 `json` 导致不该读body的请求也读取了body 最终导致报错
+
+## 解决方案
+
+方案1: 升级 1.4.0 已经对这种不合规发的请求做了兼容处理(被迫)<br>
+方案2: `uniapp` 内的请求设置正确的 `Content-Type`

+ 40 - 0
ruoyi-admin/src/main/resources/static/questions/parse_exception.md

@@ -0,0 +1,40 @@
+# ParseException SQL解析异常
+- - -
+## 异常内容
+
+`net.sf.jsqlparser.parser.ParseException: Encountered unexpected token:`
+
+![输入图片说明](https://foruda.gitee.com/images/1678981169309778625/a17ff852_1766278.png "屏幕截图")
+
+此异常为 SQL 解析异常, 应检查 SQL 语句内是否包含 SQL 关键字
+
+异常通常都会提供坐标
+
+![输入图片说明](https://foruda.gitee.com/images/1678981173813116217/a6f9ee32_1766278.png "屏幕截图")
+
+检查报错 SQL 相关坐标位置
+
+![输入图片说明](https://foruda.gitee.com/images/1678981179153564043/bf4912b4_1766278.png "屏幕截图")
+
+## 异常由来
+由 Mybatis-Plus 拦截器进行 SQL 解析导致<br>
+常见拦截器导致问题 `TenantLineInnerInterceptor` `DataPermissionInterceptor`
+
+## 解决方案
+
+> 将关键字增加标识符区别开
+
+1.实体类字段处理(以下仅限于mysql 其他数据库方法各不相同)
+
+![输入图片说明](https://foruda.gitee.com/images/1678981183515542682/fccd85ad_1766278.png "屏幕截图")
+
+2.自定义 SQL 或 XML 处理
+
+![输入图片说明](https://foruda.gitee.com/images/1678981187926917963/38437edb_1766278.png "屏幕截图")
+
+3.Mapper排除
+> 查看具体使用了哪些拦截器导致问题 使用忽略注解依次进行排除即可
+
+![输入图片说明](https://foruda.gitee.com/images/1678981192902044584/fb1c41eb_1766278.png "屏幕截图")
+
+

+ 15 - 0
ruoyi-admin/src/main/resources/static/questions/permission_denied.md

@@ -0,0 +1,15 @@
+# Redis 报错 Permission denied
+- - -
+### 此报错为无权限
+
+需确保 redis 数据存储文件夹具有写权限
+
+```shell
+chmod 777 /docker/redis/data
+```
+
+没有写权限无法对数据进行存储
+
+### 关于RDB报错 `/etc` 无权限问题
+
+增加redis密码校验 无密码导致配置不安全

+ 11 - 0
ruoyi-admin/src/main/resources/static/questions/read_metadata.md

@@ -0,0 +1,11 @@
+# unable to read meta-data for class xxx
+- - -
+## 问题原因
+
+此问题由改包名导致框架内组件 spring 的 spi 配置文件包名被改乱套
+
+## 解决方案
+
+更正组件包下的 spring spi 配置文件内的类包名
+
+![输入图片说明](https://foruda.gitee.com/images/1668608724503582409/50a77b4b_1766278.jpeg "test.jpg")

+ 8 - 0
ruoyi-admin/src/main/resources/static/questions/sentinel_404.md

@@ -0,0 +1,8 @@
+# Sentinel页面404问题
+- - -
+## 原因
+检查 `webapp` 目录是否为资源目录 低版本 `idea` 不会自动解析
+## 解决方案
+手动设置 `webapp` 为资源目录即可<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678981354612151228/52f2a886_1766278.png "屏幕截图")

+ 11 - 0
ruoyi-admin/src/main/resources/static/questions/st_not_support.md

@@ -0,0 +1,11 @@
+# 不支持ST请求
+- - -
+## 问题原因
+**经多人反馈 共同点为全都是做`小程序开发`使用的`uniapp`发送的网络请求而出现这种问题**
+
+`uniapp` 错误设置 `Content-Type` 将所有请求类型全都设置成了 `json` 导致不该读body的请求也读取了body 最终导致报错
+
+## 解决方案
+
+方案1: 升级 1.4.0 已经对这种不合规发的请求做了兼容处理(被迫)<br>
+方案2: `uniapp` 内的请求设置正确的 `Content-Type`

+ 3 - 0
ruoyi-admin/src/main/resources/static/questions/swagger.md

@@ -0,0 +1,3 @@
+# 框架内没有任何swagger
+
+想使用接口文档功能 请查看框架接口文档说明

+ 3 - 0
ruoyi-admin/src/main/resources/static/questions/synchronous_update.md

@@ -0,0 +1,3 @@
+# 如何同步项目更新
+- - -
+参考文章: [关于如何同步更新开源项目](https://blog.csdn.net/qq_31360283/article/details/118345795)

+ 20 - 0
ruoyi-admin/src/main/resources/static/questions/use_druid.md

@@ -0,0 +1,20 @@
+# 如何使用druid连接池
+- - -
+## 为何移除druid
+
+性能低下 bug频发 内含fastjson问题众多 监控不支持集群(鸡肋) 不支持一些高版本数据库 社区活跃度冰点
+
+### 性能对比图
+![输入图片说明](https://foruda.gitee.com/images/1667888745256002635/1bbd3481_1766278.png "屏幕截图")
+### 包大小对比图
+![输入图片说明](https://foruda.gitee.com/images/1667888760611300040/87af8d82_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1667888766932068690/7b379298_1766278.png "屏幕截图")
+
+## 为何使用hikari(中文: 光)
+
+spring默认自带 代码量少结构简单 稳定可靠 性能突出(自行百度一堆测评)
+
+## 参考提交记录反向操作即可
+
+https://gitee.com/dromara/RuoYi-Vue-Plus/commit/1f42bd3d22c104aaa2d780c20a555b5e467858bf <br>
+https://gitee.com/dromara/RuoYi-Vue-Plus/commit/a63abbf268e4c0a60344f63b5cba828a1347e178

+ 9 - 0
ruoyi-admin/src/main/resources/static/questions/use_tomcat.md

@@ -0,0 +1,9 @@
+# 关于如何使用Tomcat
+- - -
+### 查看ruoyi-framework模块的pom.xml文件,根据注释更改依赖
+
+![输入图片说明](https://foruda.gitee.com/images/1678981109106652929/0803004d_1766278.png "屏幕截图")
+
+### 查看ruoyi-admin模块中的application.yml文件,根据注释更改配置
+
+![输入图片说明](https://foruda.gitee.com/images/1678981112652965294/dda8df86_1766278.png "屏幕截图")

+ 70 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/_sidebar.md

@@ -0,0 +1,70 @@
+<!-- _sidebar.md -->
+- **特别赞助**
+- [![输入图片说明](https://foruda.gitee.com/images/1704162419429172656/d0521e59_1766278.png "2024-01-02=>2028-01-02")](http://ccflow.org/?frm=ryPlus)
+- [![输入图片说明](https://foruda.gitee.com/images/1705569347386939952/3f187980_1766278.jpeg "2024-01-18=>2025-01-18")](http://www.shuduokeji.com)
+- [![输入图片说明](https://foruda.gitee.com/images/1711681233267310022/2ffbcff2_1766278.png "2024-03-29=>2025-03-29")](https://www.jnpfsoft.com/index.html?from=plus-doc)
+
+
+* **简介**
+  * [项目简介](/ruoyi-cloud-plus/home.md)
+  * [更新日志](/ruoyi-cloud-plus/changlog.md)
+* **快速开始**
+  * [项目初始化](/ruoyi-cloud-plus/quickstart/init.md)
+  * [1.X项目初始化](/ruoyi-cloud-plus/quickstart/1.Xinit.md)
+  * [工作流初始化](/ruoyi-cloud-plus/quickstart/worker_init.md)
+  * [idea环境配置](/ruoyi-cloud-plus/quickstart/idea_environment.md)
+  * [应用部署](/ruoyi-cloud-plus/quickstart/deploy.md)
+  * [扩展项目](/ruoyi-cloud-plus/quickstart/extend_project.md)
+  * [搭建SnailJob调度中心](/ruoyi-cloud-plus/quickstart/snail_job_init.md)
+  * [(废弃)搭建PowerJob调度中心](/ruoyi-cloud-plus/quickstart/power_job_init.md)
+* **框架功能**
+  * [项目结构](/ruoyi-cloud-plus/framework/tree.md)
+  * [软件架构图](/ruoyi-cloud-plus/framework/architecture_diagram.md)
+  * 框架相关
+    * [创建新服务](/ruoyi-cloud-plus/framework/association/new_module.md)
+    * [修改包名](/ruoyi-cloud-plus/framework/association/update_package_name.md)
+    * [接口文档](/ruoyi-cloud-plus/framework/association/doc.md)
+    * [修改应用路径](/ruoyi-cloud-plus/framework/association/update_url.md)
+    * [国际化](/ruoyi-cloud-plus/framework/association/i18n.md)
+    * [多团队开发](/ruoyi-cloud-plus/framework/association/collaboration.md)
+    * [内网鉴权](/ruoyi-cloud-plus/framework/association/inner_authentication.md)
+  * 基础功能
+    * [系统用户相关](/ruoyi-cloud-plus/framework/basic/user.md)
+    * [权限控制](/ruoyi-cloud-plus/framework/basic/permissions_control.md)
+    * [导出功能](/ruoyi-cloud-plus/framework/basic/export.md)
+    * [导入功能](/ruoyi-cloud-plus/framework/basic/import.md)
+    * [参数校验](/ruoyi-cloud-plus/framework/basic/param_check.md)
+    * [代码生成](/ruoyi-cloud-plus/framework/basic/code_generate.md)
+    * [分页功能](/ruoyi-cloud-plus/framework/basic/page.md)
+    * [OSS功能](/ruoyi-cloud-plus/framework/basic/oss.md)
+    * [数据权限](/ruoyi-cloud-plus/framework/basic/permissions.md)
+    * [网关路由与放行](/ruoyi-cloud-plus/framework/basic/router_release.md)
+    * [多租户功能](/ruoyi-cloud-plus/framework/basic/tenant.md)
+    * [第三方授权功能](/ruoyi-cloud-plus/framework/basic/social.md)
+    * [客户端管理功能](/ruoyi-cloud-plus/framework/basic/client.md)
+  * 扩展功能
+    * [多数据源](/ruoyi-cloud-plus/framework/extend/dynamic_datasource.md)
+    * [短信模块](/ruoyi-cloud-plus/framework/extend/sms.md)
+    * [邮件功能](/ruoyi-cloud-plus/framework/extend/mail.md)
+    * [防重幂等](/ruoyi-cloud-plus/framework/extend/idempotent.md)
+    * [数据脱敏](/ruoyi-cloud-plus/framework/extend/sensitive.md)
+    * [API加解密](/ruoyi-cloud-plus/framework/extend/api_encrypt.md)
+    * [数据加解密](/ruoyi-cloud-plus/framework/extend/encrypt.md)
+    * [翻译功能](/ruoyi-cloud-plus/framework/extend/translation.md)
+    * [WebSocket功能](/ruoyi-cloud-plus/framework/extend/websocket.md)
+  * 功能说明
+    * [事务相关](/ruoyi-cloud-plus/framework/explain/transaction.md)
+    * [单元测试](/ruoyi-cloud-plus/framework/explain/test.md)
+    * [主键使用说明](/ruoyi-cloud-plus/framework/explain/key.md)
+    * [关于多表查询](/ruoyi-cloud-plus/framework/explain/about_join.md)
+* **扩展功能**
+  * [ELK搭建](/ruoyi-cloud-plus/extend-function/elk.md)
+  * [ES搜索引擎](/ruoyi-cloud-plus/extend-function/es.md)
+  * [RabbitMQ搭建](/ruoyi-cloud-plus/extend-function/rabbitmq.md)
+  * [RocketMQ搭建](/ruoyi-cloud-plus/extend-function/rocketmq.md)
+  * [Kafka搭建](/ruoyi-cloud-plus/extend-function/kafka.md)
+  * [Nacos集群搭建](/ruoyi-cloud-plus/extend-function/nacos.md)
+  * [SkyWalking搭建与集成](/ruoyi-cloud-plus/extend-function/skywalking.md)
+  * [Prometheus+Grafana搭建](/ruoyi-cloud-plus/extend-function/prometheus_grafana.md)
+  * [Sharding-Proxy搭建分库分表](/ruoyi-cloud-plus/extend-function/shardingproxy.md)
+  * [对接MaxKey单点登录](/ruoyi-cloud-plus/extend-function/maxkey.md)

+ 1385 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/changlog.md

@@ -0,0 +1,1385 @@
+# 更新日志
+- - -
+
+## v2.2.1 - 2024-08-26
+
+### 重大改动
+
+* 增加 ruoyi-common-sse 模块 支持SSE推送 比ws更轻量更稳定的推送
+* 增加 springboot snailjob 等 actuator 账号密码认证 杜绝内外网信息泄漏问题
+* 增加 重构代码生成器 集成anyline开源框架 支持400+种数据库适配
+
+### 依赖升级
+
+* update springboot 3.2.6 => 3.2.9
+* update snailjob 1.0.1 => 1.1.2
+* update mapstruct-plus 1.4.3 => 1.4.4
+* update hutool 5.8.27 => 5.8.31 解决hutool不兼容jakarta问题
+* update anyline 8.7.2-20240808
+* update sms4j 3.2.1 => 3.3.2
+* update redisson 3.31.0 => 3.34.1
+* update mapstruct-plus 1.3.6 => 1.4.3
+* update lombok 1.18.32 => 1.18.34
+* update easyexcel 3.3.4 => 4.0.2
+* update springdoc 2.5.0 => 2.6.0
+* update flowable 7.0.0 => 7.0.1
+
+### cloud内容更新
+
+* update springcloud 2023.0.2 => 2023.0.3
+* update springcloud-alibaba 2023.0.1.0 => 2023.0.1.2
+* update redis 6.2.7 => 6.2.12 解决订阅key报错问题
+* update 优化 seata dockerfile 增加环境变量
+* update 优化 增加日志处理器顺序说明
+* update 优化 使用 seata-server 官方依赖简化seata集成方式
+* update 优化 屏蔽 sentinel 心跳日志
+* update 优化 dubbo元数据注册redis支持timeout(注意时间必须使用数字)
+* update 优化 调整sentinel日志级别 屏蔽心跳日志
+* update 优化 sky-agent 默认开启即使连不上服务端也跟踪配置 (有些人就爱这么用)
+* update 优化 kafka 自动创建 topic 部分人副本数不够报错问题
+* add 增加 nacos sentinel snailjob 健康检查 actuator 账号密码认证
+* fix 修复 dubbo redis元数据中心 获取监听器null问题
+* fix 修复 nacos sentinel seata 不适配新版undertow问题 先换回tomcat
+* fix 修复 依赖漏洞 限制部分依赖版本
+* fix 修复 由于alibaba sentinel 初始化机制变更导致的无法连接问题
+* fix 修复 dubbo 日志输出异常判断错误
+* remove 删除 kafka-streams 所有人都不会用也不学怎么用 删除了事
+
+### 功能更新
+
+* update 优化 去除日志部署环境判断 通过日志级别控制
+* update 优化 忽略租户与忽略数据权限支持嵌套使用(感谢 amadeus5201)
+* update 优化 租户相关controller 增加租户开关配置控制是否注册
+* update 优化 移除 alibaba ttl 与线程池搭配有问题(可传递但无法清除与更新)
+* update 优化 个人中心编辑 忽略数据权限
+* update 优化 兼容部分用户不想给用户分配角色与部门的场景
+* update 优化 租户套餐重名校验
+* update 优化 部门下存在岗位不允许删除
+* update 优化 角色编辑状态未校验问题
+* update 优化 用户脱敏增加编辑权限标识符
+* update 优化 代码生成器 自动适配oss翻译
+* update 优化 临时升级 undertow 版本 解决虚拟线程溢出问题
+* update 优化 支持通过配置文件关闭工作流
+* update 优化 增加mybatis-plus填充器兜底策略
+* update 优化 TenantSpringCacheManager 处理逻辑
+* update 优化 角色权限判断
+* update 优化 增加删除标志位常量优化查询代码
+* update 优化 监控使用独立web依赖
+* update 优化 更多脱敏策略(感谢 hemengji)
+* update 优化 设置nginx sse相关代理参数
+* update 优化 调整默认推送使用SSE
+* update 优化 Monitor监控服务通知分类打印(感谢 AprilWind)
+* update 优化 限流注解 又写key又不是表达式的情况
+* update 优化 WorkflowUtils查询用户信息发送消息未查询邮件和手机号(感谢 yanzy)
+* update 优化 注释掉其他数据库 jdbc 依赖 由用户手动添加
+* update 优化 oracle snailjob 兼容低版本oracle索引名称长度限制
+* update 优化 数据权限支持通过菜单标识符获取数据所有权
+* update 优化 数据权限支持自定义连接符
+* update 优化 TestDemo 删除前校验数据权限
+* update 优化 更换docker镜像底层系统 避免无字体情况
+
+### 问题修复
+
+* fix 修复 三方登录构建去除无用代码
+* fix 修复 多线程对同一个session发送ws消息报错问题
+* fix 修复 依赖漏洞 限制部分依赖版本
+* fix 修复 excel 基于其他字段 合并错误问题
+* fix 修复 一级缓存key未区分租户问题
+* fix 修复 id字符串格式转换错误问题
+* fix 修复 登出无法正确删除对应的租户数据问题
+* fix 修复 登录错误锁定不区分租户问题
+* fix 修复 转换模型缺少分类字段
+* fix 修复 权限标识符处理未设置成功状态问题
+* fix 修复 无法导入 bpmn 类型文件问题
+
+### 前端改动
+
+* update element-plus 2.7.5 => 2.7.8
+* update vue 3.4.25 => 3.4.34
+* update vite 5.2.10 => 5.2.12
+* add 增加 使用 vueuse 编写 sse 推送功能
+* update 优化 使用匹配模式简化预编译配置
+* update 优化 时间搜索组件统一
+* update 优化 oss 配置按钮 使用ossConfig权限标识符与oss权限分离
+* update 优化 类型报错问题
+* update 优化 切换租户后刷新首页
+* update 优化 实现表格行选中切换
+* update 优化 使用 vueuse 重构 websocket 实现
+* update 优化 代码生成器编辑页禁用缓存 防止同步后页面不更新问题
+* update 优化 调整默认推送使用SSE
+* fix 修复 租户套餐导出路径错误问题
+* fix 修复 登出后重新登录 sse推送报错问题
+
+
+## v2.2.0 - 2024-07-09
+
+### 重大更新
+
+* [重大更新] 使用 caffeine 重构 PlusSaTokenDao 层实现 减少将近90%的redis查询提高性能
+* [重大更新] 新增 PlusCacheWrapper 装饰器 为 SpringCache 增加本地缓存减少redis查询提高性能
+* [重大更新] 升级 awsS3 到2.X版本 支持异步与自动分片上传下载(感谢 AprilWind)
+* [重大更新] 新增 flowable 工作流功能(感谢 May)
+* [重大更新] 新增 snailjob 调度中心 移除 powerjob (投诉的人太多) (感谢 dhb52)
+* [重大更新] 重构 将spring-cloud-stream改为普通的mq依赖用法(感谢 Xbhog)
+* [重大更新] 新增 ruoyi-common-bus 消息总线组件 基于MQ跨服务投递事件消息
+
+### 依赖升级
+
+* update springboot 3.1.7 => 3.2.6 支持虚拟线程
+* update springboot-admin 3.1.8 => 3.2.3
+* update springdoc 2.2.0 => 2.5.0
+* update redisson 3.24.3 => 3.29.0 支持虚拟线程
+* update hutool 5.8.22 => 5.8.26
+* update dynamic-ds 4.2.0 => 4.3.0
+* update mybatis-plus 3.5.4 => 3.5.7 修复与boot代码冲突问题
+* update lock4j 2.2.5 => 2.2.7 消除启动警告
+* update sms4j 2.2.0 => 3.2.1 支持自定义配置key 可用于多厂商多租户等
+* update mapstruct-plus 1.3.5 => 1.3.6
+* update easyexcel 3.3.3 => 3.3.4
+* update lombok 1.18.30 => 1.18.32
+* update satoken 1.37.0 -> 1.38.0
+* update aws-oss 1.12.600 => 2.25.15
+
+### 功能更新
+
+* update 优化 StreamUtils 抽取 findFirst findAny 方法
+* update 优化 更新使用 Spring 官方推荐 JDK
+* update 优化 webscoket 配置与异常拦截
+* update 优化 isTenantAdmin 空校验
+* update 优化 修改路由name命名规则(感谢 玲娜贝er)
+* update 优化 大数据量下join卡顿问题 使用子查询提高性能
+* update 优化 用户ID查询角色列表(感谢 AprilWind)
+* update 优化 获取用户账户(感谢 AprilWind)
+* update 优化 租户列表接口 避免登录之后列表被域名过滤
+* update 优化 三方登录不同域名获取不到租户id问题
+* update 优化 获取aop代理的方式 减少与其他使用aop的功能冲突的概率
+* update 优化 临时解决 spring 启动报 warn 问题
+* update 优化 移除表单构建菜单(没有可用组件 用处不大以后再考虑)
+* update 优化 修改用户信息接口(感谢 AprilWind)
+* update 优化 切换动态租户 默认线程内切换(如需全局 手动传参)
+* update 优化 适配最新前端代码生成模板
+* update 优化 代码生成 el-radio 标签过期属性
+* update 优化 文件下载(使用对流传递 降低内存使用量)(感谢 秋辞未寒)
+* update 优化 去除gc日志参数(有需要自己加)
+* update 优化 拆分异常处理器
+* update 优化 常规web异常状态码
+* update 优化 设置静态资源路径防止所有请求都可以访问静态资源
+* update 优化 代码生成表导入 排除工作流相关表
+* update 优化 redis 对Long值的存储类型不同问题
+* update 优化 去除加密请求类型限制
+* update 优化 mp多租户插件注入逻辑
+* update 优化 移除删表语句 用户自行处理
+* update 优化 RedisUtils 支持忽略租户
+* update 更新 ip地址 xdb文件
+* update 优化 新增修改菜单权限字符校验
+* update 优化 验证码背景色改为浅灰色
+* update 优化 更新 mybatis 多包扫描配置
+* update 优化 RateLimiter 注解使用体验(感谢 ly-chn)
+* update 优化 GET 方法响应体支持加密
+* update 优化 excel 单元格合并可以基于注解选择需要依赖哪些字段(感谢 司猫子)
+* update 优化 OssFactory 获取实例锁性能(感谢 fanc)
+* update 优化 登录消息 支持集群发送
+* update 优化 数据权限 使用预扫描mapper注解提升代码性能
+* update 优化 数据加密 使用预扫描实体类提升代码性能(感谢 老马)
+* update 优化 Async 针对虚拟线程配置 与其他注意事项注释
+* update 优化 框架整体sql提高查询性能
+* update 优化 将p6spy配置文件统一放置到 common-mybatis 插件包内
+* update 优化 使用翻译注解简化用户查询 调整用户查询逻辑
+
+
+### 新增功能
+
+* add 新增 SMS异常处理器(感谢 AprilWind)
+* add 新增 在线设备管理(个人中心)(感谢 AprilWind)
+* add 新增 岗位编码与部门编码 并将岗位放到部门下(感谢 秋辞未寒)
+* add 新增 分布式锁Lock4j异常拦截(感谢 AprilWind)
+* add 新增 BaseMapperPlus提供一组可选是否抛出异常的selectVoOne方法(感谢 秋辞未寒)
+* add 新增 用户、部门、角色、岗位 下拉选接口与代码实现优化
+* add 新增 JustAuth 整合 TopIam 单点登录(感谢 马铃薯头)
+* add 新增 StringUtils.isVirtual 方法
+* add 新增 正则工具类 字符串提取 字符串校验
+
+### 问题修复
+
+* fix 修复 isLogin 方法抛异常无法正常返回值问题
+* fix 修复 spring路径规则 导致 actuator 被特殊方式访问问题
+* fix 修复token无效时关闭ws(感谢 AprilWind)
+* fix 修复 oss未使用租户 拼接租户id null问题
+* fix 修复 用户昵称修改后未清除对应缓存问题
+* fix 修复 文件上传图片预览问题
+* fix 修复 三方账号可以被同一个用户多次绑定问题
+* fix 修复 兼容redis5.0出现的问题
+* fix 修复 字典键值可重复配置问题
+* fix 修复 部分浏览器无法获取加密响应头问题
+* fix 修复 用户未设置部门 登录报错问题
+* fix 修复 全局异常处理器 空指针null问题
+* fix 修复 excel 表达式字典 下拉框导出格式错误
+* fix 修复 InjectionMetaObjectHandler 已存在数据依旧会获取用户信息报异常问题
+* fix 修复 关闭租户功能 三方登录报错问题
+* fix 修复 部门树排序问题
+* fix 修复 CryptoFilter 代码逻辑问题
+
+### 前端改动
+
+* update 升级 element vite 版本 最低nodejs版本提升到18.18.0
+* update 优化 更改客户端状态接口 使用clientId传参
+* update 优化 ws开关改为常开(vite5修复了崩溃bug)
+* update 优化 移除cjs
+* update 优化 对Volar支持
+* update 优化 富文本组件,修复两个组件上传图片位置错乱问题
+* update 优化 request请求类判断请求头方式
+* update 优化 密码校验策略增加非法字符限制
+* update 优化 支持全局开启或关闭接口加密功能
+* update 优化 暗黑模式,增加vxe的暗黑模式
+* update 优化 首页打开topNav不展开菜单问题
+* update 优化 el-select 与 el-input 全局样式
+* update 优化 跟密码相关的默认前端关闭防重功能
+* add 新增 社交登录整合 TopIam
+* add 新增 图片上传组件增加压缩功能支持,可自行开关
+* add 新增 vxe-table依赖支持
+* add 新增 全局用户选择组件
+* add 新增 工作流相关页面与组件
+* add 新增 使用bpmnjs流程预览
+* add 新增 在线登录设备管理(感谢 AprilWind)
+* add 新增 用户选择角色时 可搜索功能(感谢 追梦稻草人Li)
+* fix 修复 登录失效,重新登录丢失参数问题(感谢 爱宇阳)
+* fix 修复 websocket 非index页面刷新无法重连问题
+* fix 修复 全局属性找不到的问题(感谢 ahaos)
+* fix 修复 vue 类型识别问题
+* fix 修复 富文本编辑器 单页面多实例图片混乱问题
+* fix 修复 i18n无感刷新问题
+* fix 修复 文件预览大写后缀不展示的问题(感谢 北桥)
+* fix 修复 面板因为min width原因收缩不全
+* fix 修复 移动端下 无法展开菜单问题
+* fix 修复 菜单搜索下方出现白色区域
+* fix 修复 el-tag标签类型不一致问题
+* fix 修复 角色必填*号
+
+### 微服务修改
+
+* update springcloud 2022.0.4 => 2023.0.2
+* update springcloud-alibaba 2022.0.0.0 => 2023.0.1.0
+* update dubbo 3.2.7 => 3.2.14
+* update easy-es 2.0.0-beta4 => 2.0.0 正式版
+* update nacos 2.2.1 => 2.3.2 默认开启nacos服务端授权认证 (感谢 OldDriver9527)
+* update rocketmq 4.9.4 => 5.2.0 docker镜像升级
+* update kafka 3.2.0 => 3.6.2 docker镜像升级
+* update rabbitmq 3.10.6 => 3.13.3 docker镜像升级
+* update sentinel 1.8.6 => 1.8.8
+* update skywalking 9.3.0 => 9.7.0
+* update skywalking-agent 8.16.0 => 9.2.0
+* update 优化 dubbo 使用 redis 作为元数据中心管理 支持过期时间 避免过期数据堆积 解放nacos存储空间
+* update 优化 调整配置文件语法
+* update 优化 使用spring工具自定义dubbo ip获取方法(针对多网卡ip获取不正确问题)
+* update 优化 common-dubbo 删除无用依赖
+* update 优化 去除重复的扫描器 @EnableDubbo 会自行扫描包
+* update 优化 加密组件 mp依赖改为可选
+* update 优化 mybatis依赖设置为可选依赖 避免出现不应该注入的情况
+* fix 修复 sentinel-dashboard的pom引入logaback冲突问题
+* fix 修复 nacos 不兼容 logback 1.4 新版本问题
+* fix 修复 开启数据库加密 auth服务报错问题
+* fix 修复 gateway sentinel 限流报错问题(临时方案) https://github.com/alibaba/Sentinel/issues/3298
+
+
+## v2.1.2 - 2023-12-22
+
+### 依赖升级
+
+* update springboot 3.1.5 => 3.1.7
+* update springboot 2.7.17 => 2.7.18(扩展服务升级到boot2最终版本)
+* update mybatis-boot 3.0.2 => 3.0.3 优化依赖传递
+* update powerjob 4.3.3 => 4.3.6
+* update easyexcel 3.3.2 => 3.3.3
+* update transmittable-thread-local 2.14.2 => 2.14.4
+* update justauth 1.16.5 => 1.16.6
+* update redisson 3.24.1 => 3.24.3 修复订阅重启连接超时问题
+* update easy-es 1.1.1 => 2.0.0-beta4
+
+### 功能更新
+
+* update 优化 oss 远程调用 支持降级处理
+* update 优化 丰富RedisUtils对List Set类型的操作
+* update 优化 为 admin 模块 单独增加ratelimiter模块
+* update 优化 验证码接口 增加限流配置
+* update 优化 excel合并注解会根据第一合并列的结果来决定后续的列合并 (感谢 Simple)
+* update 优化 SocialUtils 代码
+* update 优化 删除无用异常类
+* update 优化 补全三方登录校验国际化
+* update 优化 sms组件 预留自动配置类
+* update 更新 关于数据库的说明
+* update 优化 sms组件 预留自动配置类
+* update 优化 将 OSS配置 改为全局模式 降低使用难度 保留sql便于用户自行扩展(常规项目用不上配置分多租户)
+* update 优化 细化oss配置管理权限控制
+* update 优化 开启 redisson 脚本缓存 减少网络传输
+* update 优化 删除 hikaricp 官方不推荐使用的配置 jdbc4 协议自带校验方法
+* update 优化 减少 PlusSaTokenDao 不必要的查询优化性能
+* update 优化 更新用户异常提示 使用登录账号
+* update 优化 使用登录用户判断是否登录 提高效率
+* update 优化 重构 LoginHelper 将本地存储代码操作封装
+* update 优化 getTenantId 判断是否开启多租户
+* update 优化 Dockerfile 使用shell模式 支持环境变量传入jvm参数
+* update 优化 WebSocketUtils 连接关闭改为警告
+* update 优化 excel多sheet页导出 (感谢 May)
+* update 优化 删除无用接口实现
+* update 优化 jvm参数调整 全面启用zgc
+* update 优化 使用动态租户重构业务对租户的逻辑
+* update 优化 TenantHelper 动态租户支持函数式方法
+* update 优化 支持多租户绑定相同的三方登录
+* update 优化 更新用户登录信息方法忽略数据权限
+* update 优化 补全三方绑定时间字段 删除无用excel注解
+* update 优化 将登录记录抽取到监听器统一处理
+* update 优化 登录消息推送异常拦截(未启动resource也不耽误用)
+* update 优化 租户插件 ignoreTable 方法支持动态租户
+
+### 新增功能
+
+* add 新增 RedisUtils.setObjectIfExists 如果存在则设置方法
+* add 新增 丰富RedisUtils对List Set类型的操作
+* add 新增 翻译组件 用户昵称翻译实现
+* add 新增 响应加密功能 支持注解强制加密接口数据 (感谢 MichelleChung)
+* add 新增 common-ratelimiter 限流模块 用于自定义业务限流 与 sentinel不冲突
+
+### 问题修复
+
+* fix 修复 stream-mq 测试服务未导入租户模块 导致鉴权不一致问题
+* fix 修复 使用zgc导致seata报错(未知原因 将alibaba组件全还原)
+* fix 修复 sentinel 镜像添加了多余接口参数
+* fix 修复 注册接口获取开关未在租户范围内问题
+* fix 修复 seata-server logback版本冲突问题
+* fix 修复 selectDictTypeByType 查询方法错误问题
+* fix 修复 一些不正常类无法加载报错问题
+* fix 修复 powerjob sql脚本针对其他数据库转义符问题 (感谢 branches)
+* fix 修复 MybatisSystemException 空指针问题
+* fix 修复 excel合并注解会根据第一合并列的结果来决定后续的列合并
+* fix 修复 session 多账号共用覆盖问题 改为 tokenSession 独立存储
+* fix 修复 token 失效后 登录获取用户null问题
+* fix 修复 powerjob部署方案 高版本nginx不生效问题
+* fix 修复 OssFactory 并发多创建实例问题
+* fix 修复 延迟队列在投递消息未到达时间的时候 服务死机导致重启收不到消息
+
+### 前端改动
+
+* update 优化 用户头像 img 变量无确定类型问题
+* update 优化 细化oss配置管理权限控制
+* update 优化 明确打包命令
+* update 优化 代码中存在的警告
+* update 优化 前端白名单页面放行逻辑
+* update 优化 页面关于权限标识符说明
+* fix 修复 append-to-body 编写错误 (感谢 Ai3_刘小龙)
+* fix 关闭动态路由tab页签时不清理组件缓存 (感谢 NickLuo)
+* fix 删除重复环境变量ElUploadInstance (感谢 棉花)
+* fix 修复 在线用户 强推按钮点击取消控制台警告问题
+* fix 修复 字典使用 default 样式报警告问题
+
+## v1.8.2 - 2023-11-27
+
+### 依赖升级
+
+* update springboot 2.7.16 => 2.7.18 升级到2.X最终版本(官方停更)
+* update mybatis-plus 3.5.3.2 => 3.5.4
+* update satoken 1.36.0 => 1.37.0
+* update hutool 5.8.20 => 5.8.22
+* update aws-java-sdk-s3 1.12.400 => 1.12.540
+* update vue-quill 1.1.0 => 1.2.0
+
+### 功能更新
+
+* update 优化 页面关于权限标识符说明
+* update 优化 数据权限拦截器优先判断方法是否有效 提高性能减少无用sql解析
+* update 优化 部门数据权限使用默认兜底方案
+* update 优化 补全代码生成 columnList 接口参数注解缺失
+* update 优化 AddressUtils 兼容linux系统本地ip
+* update 优化 操作日志 部门信息完善
+* update 优化 数据权限 减少二次校验查询
+* update 修改 获取用户token和后端不一致的问题 (感谢 bestrevens)
+* update 优化 vue3 版本用户初始密码从字典查询
+* update 优化 富文本Editor组件检验图片格式
+* update 优化 操作日志列表新增IP地址查询
+* update 优化 全局数据存储用户编号
+* update 优化 菜单管理类型为按钮状态可选
+
+### 问题修复
+
+* fix 修复 OssFactory 并发多创建实例问题
+* fix 修复 demo页面字段编写错误
+* fix 修复 数据权限优化后 update delete 报null问题
+* fix 修复 五级路由缓存无效问题
+* fix 修复 oss服务无法连接
+* fix 修复 内链iframe没有传递参数问题
+* fix 修复 外链带端口出现的异常
+* fix 修复 普通角色编辑使用内置管理员code越权问题
+* fix 修复 seata XA模式缺失druid工具问题
+* fix 修复 代码生成 是否必填与数据库不匹配问题
+* fix 修复 富文本上传接口地址错误
+* fix 修复 HeaderSearch组件跳转query参数丢失问题
+* fix 修复树结构代码生成新增方法赋值错误
+
+## v2.1.1 - 2023-11-14
+
+### 依赖升级
+
+* update springboot 3.1.3 => 3.1.5
+* update springboot 2.7.14 => 2.7.17(扩展服务)
+* update springboot-admin 3.1.5 => 3.1.7
+* update satoken 1.35.0.RC => 1.37.0
+* update mybatis-plus 3.5.3.2 => 3.5.4 适配mp新版本改动
+* update dynamic-ds 4.1.3 => 4.2.0
+* update bouncycastle 1.72 => 1.76
+* update poi 5.2.3 => 5.2.4
+* update redisson 3.23.2 => 3.24.1
+* update hutool 5.8.20 => 5.8.22
+* update lombok 1.18.26 => 1.18.30(适配支持jdk21)
+* update vue-quill 1.1.0 => 1.2.0
+* update seata 1.7.0 => 1.7.1
+* update dubbo 3.2.5 => 3.2.7
+
+### 功能更新
+
+* update 优化 移除不合理的方法 携带附件的邮件建议直接集成插件发送
+* update 优化 携带 clientid 跨域问题
+* update 优化 数据权限拦截器优先判断方法是否有效 提高性能减少无用sql解析
+* update 优化 适配 maxkey 新版本
+* update 优化 @Sensitive脱敏增加角色和权限校验 (感谢 盘古给你一斧)
+* update 优化 部门数据权限使用默认兜底方案
+* update 优化 更改默认日志等级为info 避免日志过多(按需开启debug)
+* update 优化 登录策略代码优化(感谢 David Wei)
+* update 优化 补全代码生成 columnList 接口参数注解缺失
+* update 优化 nginx 配置支持 websocket
+* update 优化 notice 新增通知公告发送ws推送
+* update 优化 websocket 模块减少日志输出 增加登录推送
+* update 优化 重构登录策略增加扩展性降低复杂度
+* update 优化 addressUtils 兼容linux系统本地ip
+* update 优化 补全操作日志部门数据
+* update 优化 支持数据库操作在非web环境下切换租户
+* update 优化 排除powerjob无用的依赖 减少打包30M体积
+* update 优化 删除 satoken yml 时间配置 此功能已迁移至客户端管理
+* update 优化 redis 集群模式注释说明
+* update 优化 客户端禁用限制
+* update 优化 登录日志, 在线用户展示信息(增加 客户端, 设备类型)(感谢 MichelleChung)
+* update 优化 限制框架中的fastjson版本
+* update 优化 数据权限 减少二次校验查询
+* update 优化 将部门id存入token避免过度查询redis
+* update 优化 增加租户ID为Null错误日志
+* update 优化 操作日志列表新增IP地址查询
+* update 优化 通过参数键名获取键值接口的返回体(感谢 David Wei)
+* update 优化 为 sys_grant_type 字典增加样式
+* update 优化 代码生成 页面输入框样式
+* update 优化 全业务分页查询增加排序规则避免因where条件导致乱序问题
+* update 优化 登录接口租户id被强制校验问题
+* update 优化 加密模块 支持父类统一使用加密注解(感谢 Tyler Ge)
+* update 优化 将graalvm镜像更新为openjdk镜像 需要的人自行切换即可
+* update 优化 部分使用者乱设权限导致无法获取用户信息 增加权限提示
+* update 优化 表格列的显示与隐藏小组件(感谢 bestrevens)
+* update 优化 增加表单构建不能使用说明
+* update 优化 富文本Editor组件检验图片格式
+* update 优化 操作日志列表新增IP地址查询
+* update 优化 菜单管理类型为按钮状态可选
+* update 优化 用户初始密码从参数配置查询
+* update 优化 通过参数键名获取键值接口的返回体(感谢 David Wei)
+* update 优化 字典标签支持数组和多标签(感谢 抓蛙师)
+
+### 新增功能
+
+* add 新增 websocket 群发功能
+* add 新增 前端接入websocket接收消息(感谢 三个三)
+* add 增加 rpc消息推送接口与实现
+* add 新增 CacheController Redis 缓存监控接口(感谢 Michelle.Chung)
+
+### 问题修复
+
+* fix 修复 因扩展服务不支持boot3导致无法引入common-web包 日志写出不生效问题
+* fix 修复 seata XA模式缺失druid工具问题
+* fix 修复 oss服务无法连接 导致业务异常问题 查询不应该影响业务
+* fix 修复 租户id为null 无法匹配字符串导致的嵌套key问题
+* fix 修复 部门管理orderNum排序失效问题
+* fix 修复 外链带端口出现的异常
+* fix 修复 普通角色编辑使用内置管理员code越权问题
+* fix 修复 代码生成 是否必填与数据库不匹配问题
+* fix 修复 用户注册接口校验用户名不区分租户问题
+* fix 修复 错误增加组导致的校验不生效问题
+* fix 修复 新增校验主键id问题
+* fix 修复 powerjob 使用 nginx 部署无法访问的问题
+* fix 修复 SysUserMapper 内标签使用错误(不影响使用)
+* fix 修复 新增或编辑 SysOssConfig 数据后 推送到 redis 数据不完整
+* fix 修复 树表生成查询变量使用错误
+* fix 修复 个人信息修改密码接口隐藏新旧密码参数明文(感谢 bleachtred)
+* fix 修复 删除字段后 * update sql 未更新问题
+* fix 修复 三方登录支付宝source与实际支付宝业务code不匹配问题
+* fix 修复 五级路由缓存无效问题
+* fix 修复 内链iframe没有传递参数问题
+* fix 修复 绑定第三方帐号参数“wechar”更正为“wechat” (感谢 scmiot)
+* fix 修复 用户注册缺失 clientid 问题
+* fix 修复 HeaderSearch组件跳转query参数丢失问题
+* fix 修复 自定义字典样式不生效的问题
+* fix 修复 login 页面 loading 未关闭问题
+
+## v1.8.1 - 2023-09-26
+
+### 依赖升级
+
+* update springboot 2.7.14 => 2.7.16
+* update springboot-admin 2.7.10 => 2.7.11
+* update satoken 1.35.0.RC => 1.36.0
+* update lombok 1.18.26 =. 1.18.30
+* update springboot 2.7.13 => 2.7.14
+* update mybatis-plus 3.5.3.1 => 3.5.3.2
+* update easyexcel 3.3.1 => 3.3.2
+* update hutool 5.8.18 => 5.8.20
+* update dubbo 3.1.8 => 3.1.11
+
+### 功能更新
+
+* update 优化 代码生成 vo实体类序列化
+* update 优化 excel 导出不必要的请求头
+* update 优化 字典标签支持传分隔符分隔的字符串和数组
+* update 优化 控制台debuger位置错误问题 
+* update 优化 TopNav 菜单样式
+* update 优化 注册用户异常报错不正确问题
+* update 优化 全局异常处理器 业务异常不输出具体堆栈信息 减少无用日志存储
+* update 优化 用户管理 只查询未禁用的部门角色岗位数据
+* update 优化 岗位如果绑定了用户则不允许禁用
+* update 优化 部门与角色如果绑定了用户则不允许禁用
+* update 优化 加密实现 使用 EncryptUtils 统一处理
+* update 优化 适配 mysql 8.0.34 升级连接机制
+* update 优化 excel导出字典转下拉框 无需标记index自动处理
+* update 优化 excel 导出字典默认转为下拉框
+* update 删除一些跟swagger有关的字眼 避免误解
+* update 优化 角色权限支持仅本人权限查看 解决无法查看自己创建的角色问题
+* update 优化 xxljob 端口随着主应用端口飘逸 避免集群冲突
+
+### 问题修复
+
+* fix 修复 自定义字典样式不生效的问题
+* fix 修复 新建用户可能会存在的越权行为
+* fix 修复 字典缓存删除方法参数错误问题
+* fix 修复 修复树模板父级编码变量错误
+* fix 修复 demo 模块缺少 security 依赖问题
+* fix 修复 升级 mp 版本导致的问题
+* fix 修复 加密模块数据转换异常问题
+* fix 修复 动态设置 token 有效期不生效问题
+* fix 修复 token 过期登出无法清理在线用户问题
+
+
+## v2.1.0 - 2023-09-06
+
+# 开发历程
+
+* 2023年5月 开始 2.1.0 计划 历经1个月的设计与讨论
+* 2023年6月 开始着手开发 历经2个多月的开发 特别感谢团队的小伙伴与一些热心的粉丝 参与功能开发与测试
+* 2023年8月 开始公测 历经将近1个月的公测与修复工作(期间成功支持多位使用者生产使用)
+* 2023年9月初 正式发布(经过多个小伙伴的生产实践 已基本可尝试生产使用)
+> 关于1.X的说明 由于SpringBoot2.X与vue2.X均在11月底停止维护<br>
+> 故而咱们vue版本1.X也无法再继续更新<br>
+> 介于1.X的用户量特别庞大 功能也非常的稳定<br>
+> 计划于11月底同Boot2.X一同停止更新但还会持续维护修复bug(修复的形式为直接提交到1.X分支停止发版)<br>
+
+# 视频介绍
+
+为了更好的让大家了解 2.1.0 作者录制了相关的视频 供大家快速了解上手
+
+* 2.1.0 新功能与变更介绍: https://www.bilibili.com/video/BV1fj411y71X/
+
+# 更新日志
+
+### 重大更新
+
+* [重大更新] 优化 相关代码 完成代码生成多数据源统一存储(感谢 WangBQ)
+* [不兼容更新] 移除 原短信功能 集成更强大的 sms4j 短信工具包(感谢 友杰)
+* [不兼容更新] 对接 powerjob 实现分布式任务调度 删除原有 xxljob 原因为社区不更新功能太少只支持mysql(感谢 yhan219)
+* [重大更新] 新增 三方授权绑定登录功能 基于 justauth 支持市面上大部分三方登录(感谢 三个三)
+* [不兼容更新] 新增 客户端授权功能 不需要更改任何代码即可完成多端动态对接(感谢 Michelle.Chung)
+* [重大更新] 新增 前后端接口请求加密传输 基于AES+RSA动态高强度加密(感谢 wdhcr)
+* [重大更新] 新增 三方授权登录 对接 maxkey 单点登录
+* [不兼容更新] 优化 redis序列化配置 更改为通用格式(升级需清除redis所有数据)
+* [重大更新] 新增 通过 sharding-proxy 实现分库分表(感谢 rice666 !pr94)
+
+### 依赖升级
+
+* update springboot 3.0.7 => 3.1.3
+* update springboot-admin 3.1.3 => 3.1.5
+* update springcloud 2022.0.2 => 2022.0.4
+* update springcloud-alibaba 2022.0.0.0-RC2 => 2022.0.0.0
+* update springdoc 2.1.0 => 2.2.0
+* update spring-mybatis 3.0.1 => 3.0.2
+* update mybatis-plus 3.5.3.1 => 3.5.3.2
+* update easyexcel 3.2.1 => 3.3.2
+* update mapstruct-plus 1.2.3 => 1.3.5 解决修改实体类 idea不编译问题
+* update satoken 1.34.0 => 1.35.0.RC 优化过期配置 支持多端token自定义有效期
+* update dynamic-ds 3.6.1 => 4.1.3 支持 SpringBoot3
+* update sms4j 2.2.0
+* update hutool 5.8.18 => 5.8.20
+* update redisson 3.20.1 => 3.23.4
+* update lock4j 2.2.4 => 2.2.5
+* update aws-java-sdk-s3 1.12.400 => 1.12.540
+* update maven-surefire-plugin 3.0.0 => 3.1.2
+* update seata 1.6.1 => 1.7.0
+* update sharding-proxy 5.4.0
+* update dubbo 3.2.2 => 3.2.5
+* update skywalking-toolkit 8.14.0 => 8.16.0
+* update logstash 7.2 => 7.4
+
+### 功能更新
+
+* update 优化 与 vue 版本同步代码结构
+* update 优化 放行springboot默认error接口
+* update 优化 RepeatSubmitAspect 逻辑避免并发请求问题
+* update 调整 gateway 访问日志输出等级
+* update 优化 修改角色如果未绑定用户则无需清理
+* update 优化 用户昵称非空校验
+* update 优化 在全局异常拦截器中增加两类异常处理
+* update 优化 StreamUtils 方法过滤null值
+* update 优化 powerjob 端口随着主应用端口飘逸 避免集群冲突
+* update 优化 角色权限支持仅本人权限查看 解决无法查看自己创建的角色问题
+* update 修改代码生成模版,日期范围统一采用addDateRange方法
+* update 优化 树表生成前端缺少 children 字段
+* update 优化 ruoyi-resource 服务添加 websocket 模块
+* update 优化 放行验证码接口、第三方登录请求与回调
+* update 更新 GlobalLogFilter#filter 根据请求头判断加密参数(感谢 Michelle.Chung !pr100)
+* update 优化 SaReactorFilter 过滤器判断 token 客户端 id 是否有效(感谢 Michelle.Chung !pr101)
+* update 删除一些跟swagger有关的字眼 避免误解
+* update 优化 兼容 clientid 通过 param 传输
+* update 优化 excel导出字典转下拉框 无需标记index自动处理(感谢 一夏coco)
+* update 优化 增加线程池销毁配置
+* update 优化 屏蔽 powerjob 无用的心跳日志
+* update 优化 适配 mysql 8.0.34 升级连接机制
+* update 优化 加密实现 使用 EncryptUtils 统一处理
+* update 优化 删除字典无用状态字段(基本用不上 禁用后还会导致回显问题)
+* update 优化 部门与角色如果绑定了用户则不允许禁用
+* update 优化 岗位如果绑定了用户则不允许禁用
+* update 优化 用户管理 只查询未禁用的部门角色岗位数据
+* update 优化 登录用户增加昵称返回
+* update 优化 全局异常处理器 业务异常不输出具体堆栈信息 减少无用日志存储
+* update 优化 将部门管理 负责人选项改为下拉框选择
+* update 优化 登录用户缓存 去除冗余统一存储
+* update 优化 注册用户异常报错不正确问题
+* update 优化 放宽菜单权限 角色关联菜单无需管理员
+
+### 新增功能
+
+* add 增加 RedisUtils 批量删除 hash key 方法
+* add 新增 Oss 上传 File 文件方法(感谢 jenn)
+* add 增加 excel 导出下拉框功能
+* add 新增 RedisUtils.setObjectIfAbsent 如果不存在则设置方法
+
+### 修复问题
+
+* fix 修复 用户重名登录报错问题
+* fix 修复 服务未添加 common-security 模块导致异常拦截器不生效问题
+* fix 修复 用户篡改管理员角色标识符越权问题
+* fix 修复 文件管理 创建人未翻译问题
+* fix 修复 monitor 监控无法展示数据问题
+* fix 修复 更换 satoken dubbo 插件导致包名不一致问题
+* fix 修复 字典缓存注解使用错误问题
+* fix 修复 接口文档未拼接服务路径问题
+* fix 修复 excel 枚举反向解析失败问题
+* fix 修复 查询部门下拉树未过滤数据权限问题
+* fix 修复 CacheName 缓存key存储错误问题
+* fix 修复 oss 列表 用户名回显错误
+* fix 修复 不同vo相同字段mybatis会自动赋值问题
+* fix 修复 删除 skywalking dubbo 2.X 插件避免与 3.X 出现兼容性问题
+* fix 修复 新增角色使用内置管理员标识符问题
+* fix 修复 token 过期登出无法清理在线用户问题
+* fix 修复 动态设置 token 有效期不生效问题
+* fix 修复 加密模块数据转换异常问题
+* fix 修复 dubbo 更改内部序列化方式 导致异常类无法反序列化问题
+* fix 修复 客户端编辑时授权类型变更未保存的问题
+* fix 修正 缺失 SysClientVoConvert 导致转换异常(感谢 Michelle.Chung)
+* fix 修正 auth 模块缺失引用导致解密异常(感谢 Michelle.Chung)
+* fix 修复 demo 与 stream-mq 模块缺少 security 依赖问题
+* fix 修复 导入用户数据 变量使用错误问题
+* fix 修复 验证码开关未动态刷新问题
+* fix 修复 自动填充数据 loginUser 为 null(感谢 charles !pr108)
+* fix 修复 修复树模板父级编码变量错误
+* fix 修复 部署部分系统出现乱码问题
+* fix 修复 一级菜单无法显示问题
+* fix 修复 新建用户可能会存在的越权行为
+* fix 修复 代码生成页面参数缺少逗号问题
+
+### 移除功能
+
+* remove 移除原有短信功能(建议使用sms4j)
+* remove 移除xxljob功能(建议使用powerjob)
+
+
+## v1.8.0 - 2023-07-11
+
+### 重大更新
+
+* [重大更新] 新增 sms4j 短信融合框架整合(支持数十种短信厂商接入、发送限制、负载均衡等功能)
+* [不兼容更新] 移除 原短信功能(建议使用新 sms4j 功能)
+* [重要迁移] 迁移 vue3 前端到主仓库统一维护
+
+### 依赖升级
+
+* update springboot 2.7.11 => 2.7.13
+* update spring-cloud 2021.0.7 => 2021.0.8
+* update satoken 1.34.0 => 1.35.0.RC
+* update easyexcel 3.2.1 => 3.3.1
+* update sms4j 2.2.0
+* update element 2.15.12 => 2.15.13
+
+### 功能更新
+
+* update 优化 StreamUtils 方法过滤null值
+* update 优化 页签在Firefox浏览器被遮挡
+* update 优化 在全局异常拦截器中增加两类异常处理
+* update 优化 下载zip方法增加遮罩层(感谢@梁剑锋)
+* update 优化 用户昵称非空校验
+* update 优化 修改角色如果未绑定用户则无需清理
+* update 优化 RepeatSubmitAspect 逻辑避免并发请求问题
+* update 优化 satoken 过期配置 支持多端token自定义有效期
+* update 优化 加密注解注释错误
+* update 优化 切换 maven 仓库到华为云(aliyun 不可用)
+* update 优化 excel 导出存在合并项时在初始化类时进行数据的处理避免多次调用(感谢@yueye)
+* update 优化 重构 CellMergeStrategy 支持多级表头修复一些小问题 整理代码结构
+* update 补全 SysLogininforMapper.xml 缺失字段
+* update 优化 demo 模块 路径适配统一前端
+* update 调整 gateway 访问日志输出等级
+
+### 新增功能
+
+* add 新增 RedisUtils.setObjectIfAbsent 不存在则设置方法
+* add 新增 Excel 导出附带有下拉框(字典自动导出为下拉框) 可自定义多级下拉框(感谢@Emil.Zhang)
+* add 新增 OssClient File 文件上传方法
+* add 增加 RedisUtils 批量删除 hash key 方法
+
+### 问题修复
+
+* fix 修复 sa-token.check-same-token 开关对网关鉴权无效问题
+* fix 修复 服务未添加 common-security 模块导致异常拦截器不生效问题
+* fix 修复 删除 skywalking dubbo 2.X 插件避免与 3.X 出现兼容性问题
+* fix 修复 excel 枚举反向解析失败问题
+* fix 修复 字典缓存注解使用错误问题
+* fix 修复 新增角色使用内置管理员标识符问题
+* fix 修复 缓存监控图表 支持跟随屏幕大小自适应调整(感谢@抓蛙师)
+* fix 修复 防重组件 错删注解问题
+* fix 修复 CacheName 缓存key存储错误问题
+* fix 修复 字典缓存注解使用错误问题
+* fix 修复 用户篡改管理员角色标识符越权问题
+* fix 修复 登录校验错误次数未达到上限时 错误次数缓存未设置有效时间问题
+* fix 修复 OssClient 切换服务 实例不正确问题
+* fix 修复 element ui 因版本而未被工具识别问题(感谢@梁剑锋)
+* fix 修复 admin监控 切换tab页需要重复登录问题
+* fix 修复 个人中心tab栏关闭页面内容压缩问题
+
+## v2.0.0 - 2023-06-15
+
+**重点说明: 由于 SpringCloudAlibaba 一直未发布正式版 导致系统底层组件可能存在些许问题 故而不建议生产使用 框架也将直接开启后续 2.1.0 的开发工作**
+
+### 重大更新
+
+* [不兼容升级] java 版本从 jdk 8 升级到 jdk 17 且需要使用 graalvm 运行(暂时未解决原生jdk存在的问题)
+* [不兼容升级] springboot 升级 3.0 版本
+* [不兼容升级] 重构 项目模块结构 采用插件化结构 易扩展易解耦
+* [不兼容升级] com.sun.mail 更改为 jakarta.mail 修改最新写法
+* [不兼容升级] javax.servlet 替换为 jakarta.servlet 更新所有代码
+* [简化性升级] 默认开启复杂结构 resultMap 自动映射 简化xml编码(多结构实体需带上主键id) 
+* [数据库改动] 更新 create_by update_by 字段类型 (保存用户id)
+* [数据库改动] 新增 create_dept 字段 (保存创建部门id)
+* [不兼容更新] system 模块 所有实体类均使用 bo|vo 规范化
+* [重大更新] 新增 多租户功能设计 整体框架代码结构与数据库更改
+* [重大更新] 新增 mapstruct-plus 替换 BeanUtil 与 BeanCopyUtils 工具
+* [不兼容更新] 重构 登录注解接口与cloud版本统一接口路径
+* [不兼容更新] 重构 BaseMapperPlus接口 去除 `@param <M> Mapper` 泛型
+* [不兼容更新] 移除 vue2 前端工程 全面启用 vue3
+* [重大更新] 新增 vue3 + TS 版本前端(独立仓库后续与Cloud版本共用)
+* [重大更新] 增加 websocket 模块 支持token鉴权 支持分布式集群消息同步
+* [重大更新] 框架文档全面翻新 https://plus-doc.dromara.org
+* [不兼容更新] 代码生成 支持代码生成多数据源统一存储(主库存储子库的表 无需子库加gen表了)
+* [不兼容更新] 重构 将系统内置配置放置到common包内独立加载 不允许用户随意修改
+
+### 依赖升级
+
+* update java 1.8 => 17
+* update springboot 2.7.7 => 3.0.7
+* update springcloud 2021.0.6 => 2022.0.2
+* update springcloud-alibaba 2022.0.0.0-RC2
+* update springboot-admin 2.7.10 => 3.0.4
+* update springdoc 1.6.14 => 2.1.0
+* udpate dubbo 3.1.8 => 3.2.2
+* update lock4j 2.2.3 => 2.2.4
+* update dynamic-ds 3.5.2 => 3.6.1
+* update easyexcel 3.1.5 => 3.2.1
+* update hutool 5.8.11 => 5.8.18
+* update redisson 3.19.2 => 3.20.1
+* update lombok 1.18.24 => 1.18.26
+* update spring-boot.mybatis 2.2.2 => 3.0.1
+* update mapstruct-plus 1.2.3
+* update maven-compiler-plugin 3.10.1 => 3.11.0
+* update maven-surefire-plugin 3.0.0-M7 => 3.0.0
+* update docker mysql 8.0.31 => 8.0.33
+* update docker nginx 1.22.1 => 1.32.4
+* update docker redis 6.2.7 => 6.2.12
+* update docker minio RELEASE.2023-04-13T03-08-07Z
+
+### 功能更新
+
+* update 适配 AsyncConfig 替换过期继承类改为实现 AsyncConfigurer 接口
+* update 适配 redis 新版本配置文件写法
+* update 适配 获取redis 监控参数接口 替换过期语法
+* update 适配 sa-token 替换新依赖 sa-token-spring-boot3-starter
+* update 适配 springboot-admin 改为最新 spring-security 写法
+* update 适配 springdoc 新版本配置方式
+* update 适配 ServletUtils 更换继承 JakartaServletUtil
+* update 适配 新序列化注解
+* update 优化 利用 resultMap 自动映射配置 简化 xml (非嵌套)
+* update 优化 调整 system entity 实体与 controller 包结构
+* update 优化 实体类中校验注解的提示信息
+* update 优化 使用 jdk17 语法优化代码
+* update 优化 所有 properties 文件改为注解启用
+* update 更新 docker 基础镜像 graalvm java17
+* update 优化 用户头像 改为存储 ossId 使用转换模块转为 url 展示
+* update 优化 重构 CellMergeStrategy 支持多级表头修复一些小问题 整理代码结构
+* update 优化 登录流程代码注释
+* update 优化 将框架内的swagger命名更改为springdoc命名避免误解
+
+### 新增功能
+
+* add 新增 flatten-maven-plugin 插件统一版本号管理
+* add 新增 ip2region 实现离线IP地址定位库
+
+### 移除功能
+
+* remove 移除 BeanCopyUtils 工具类 与 JDK17 不兼容
+* remove 移除 devtools 依赖 并不好用(建议直接用idea自带的热更)
+* remove 移除 vue2 前端工程 统一使用 vue3 工程
+
+### 修复功能
+
+* fix 修复 根据 seata 官方提交记录 临时修复 seata 关于jdk17代理的bug
+* fix 修复 登录校验错误次数未达到上限时 错误次数缓存未设置有效时间问题
+* fix 修复 common-core 包使用aop注解 但未添加aop实现类导致单独使用报错问题
+
+## v1.7.0 - 2023-05-10
+
+### 依赖升级
+
+* update springboot 2.7.9 => 2.7.11 修复 DoS 漏洞 修复CVE漏洞
+* update springcloud 2021.0.6 => 2021.0.7
+* update springcloud-alibaba 2021.0.4.0 => 2021.0.5.0
+* update dubbo 3.1.7 => 3.1.10
+* update nacos 2.2.0 => 2.2.1
+* update xxljob 2.3.1 => 2.4.0
+* update minio 升级至最新版 避免低版本信息泄漏问题
+* update hutool 5.8.15 => 5.8.18
+* update redisson 3.20.0 => 3.20.1
+* update lombok 1.18.24 => 1.18.26
+
+### 功能更新
+
+* update 优化 更改 sys_oss_config 表注释 避免误解
+* update 优化 sys_logininfor 丰富多种信息
+* update 项目正式入驻 dromara 开源社区 更改项目地址
+* update 全新 logo 全新背景图(设计师打造)
+* update 优化 代码生成模块的数据同步功能
+* update 修改多团队开发插件,支持多网卡
+* update 修改controller中校验直接返回R.fail
+* update 优化 角色sort值一样的排序问题
+* update 更换默认用户头像
+* update 优化 WebFluxUtils.getOriginalRequestUrl 方法获取空路径报错问题
+* update 去除same-token有限期配置,使用默认配置(一天)
+* update 优化固定头部页签滚动条被隐藏的问题
+* update delete vue-multiselect style
+* update 按代码规范补全重写注解
+* update 优化 极端情况获取LoginUser可能为null问题
+* update 优化 更改系统所有服务日志配置文件命名为 logback-plus.xml 避免与其他框架默认配置冲突
+* update 优化 skywalking-agent 探针日志等级调整为 WARN 减少无用日志输出
+* update 优化 加解密模块 将null判断下推防止任何可能的null出现
+* update 优化 在线用户token获取方式
+* update 优化 用户更改角色 踢掉角色相关所有在线用户
+
+### 新功能
+
+* add 集成 ip2region 实现离线IP地址定位库
+* add 增加 邮箱验证码发送接口
+* add 增加 邮箱登陆接口
+* add 增加 EncryptUtils 加解密安全工具类 可以处理base64,aes,sm4,sm2,rsa,md5,sha256加解密
+* add 增加 EncryptUtils 类中增加国密sm3的不可逆加密算法
+* add 新增 忽略数据权限写法 防止异常不执行关闭问题
+
+### 问题修复
+
+* fix 修复 MybatisExceptionHandler 未自动装载问题
+* fix 修复 代码生成 点选按钮不生效问题
+* fix 修复 Nacos 服务 SpringBoot-admin 客户端功能失效问题
+* fix 修复 findInSet 在mysql下方法搜索非数字字段时 无引号报错问题
+* fix 修复 ruoyi-demo postgres 数据库用户名密码变量错误
+* fix 修复 oracle postgres 数据库日志表索引创建错误
+* fix 修复 无法注入 mailProperties 导致 resource 模块无法启动问题
+* fix 修复tab栏”关闭其他“异常的问题
+* fix 修复 加解密拦截器 对象属性为null问题
+* fix 修复 取消oss预览状态修改 图标变化不正常问题
+* fix 修复 nacos 新版本升级后 与 docker 基础镜像系统存在兼容性问题
+
+
+## v1.6.0 - 2023-03-14
+
+### 重大更新
+
+[重大更新] add 新增 通用翻译模块 `ruoyi-common-translation` 实现(部门名、字典、oss、用户名)
+[重大更新] add 新增 数据加解密模块 `ruoyi-common-encrypt`
+
+
+### 依赖升级
+
+* update springboot 2.7.7 => 2.7.9
+* update springcloud 2021.0.5 => 2021.0.6
+* update easyexcel 3.1.5 => 3.2.1
+* update redisson 3.19.1 => 3.20.0
+* update springdoc 1.6.14 => 1.6.15
+* update hutool 5.8.12 => 5.8.15 (13与14有问题勿使用)
+* update logstash-sdk 7.1.1 => 7.2
+* update aws-java-sdk-s3 1.12.373 => 1.12.400
+* update tencent-sms 3.1.660 => 3.1.687
+* update skywalking 8.9.1 => 9.3.0
+* update skywalking-agent 8.13.0 => 8.14.0
+* update dubbo 3.1.4 => 3.1.7 解决dubbo报一些无用警告问题
+* update element-ui 2.15.10 => 2.15.12
+
+### 功能更新
+
+* update 优化 修改 oss 配置页面开关说明 避免造成误解
+* update 优化 `gateway` 对接 `sentinel` 使用网关特定模式
+* update 优化 转移 `logback-common` 配置到 `common-web` 模块 `gateway` 单独处理
+* update 优化 调整连接池默认参数
+* update 优化 `zookeeper` 自带控制台占用 `8080` 端口
+* update 优化 `DictDataMapper` 注解标注过期 推荐使用 `@Translation` 注解
+* update 优化 获取菜单数据权限接口 删除无用角色属性与逻辑
+* update 优化 调整连接池最长生命周期 防止出现警告
+* update 优化 连接池增加 `keepaliveTime` 探活参数
+* update 优化 `DataPermissionHelper` 增加 `开启/关闭` 忽略数据权限功能
+* update 重构 `OssFactory` 加载方式 改为每次比对配置做实例更新
+* update 优化 更新角色后踢掉所有相关的登录用户 用户量过大会导致redis阻塞卡顿(应粉丝要求)
+* update 优化 翻译组件 支持返回值泛型 支持多种类型数据翻译(例如: 根据主键翻译成对象)
+* update 优化 `tagsView` 右选框,首页不应该存在关闭左侧选项
+* update 优化 `copyright 2023`
+* update 优化 日志注解支持排除指定的请求参数
+* update 优化 业务校验优化代码
+* update 优化 日志管理使用索引提升查询性能
+* update 优化 框架时间检索使用时间默认值 `00:00:00 - 23:59:59`
+* update 优化 oss 预览使用 `ImagePreview` 组件
+* update 优化 统一登录接口令牌key
+
+
+### 新功能
+
+* add 新增 数据加解密模块 测试案例
+* add 新增 `StringUtils` `splitTo` 与 `splitList` 方法 优化业务代码
+
+### 问题修复
+
+* fix 修复 vue3模板 删除功能书写错误
+* fix 修复 部分服务未开启日志存储
+* fix 修复 接口问题开关不生效问题
+* fix 修复 优化文件下载出现的异常
+* fix 修复 修改密码日志存储明文问题
+* fix 修复 代码生成 `postgreSQL` 查出多余的已删除字段
+
+## v1.5.0 - 2023-01-13
+
+### 重大更新
+
+* [重大更新] 框架主体业务与代码生成器 完成 oracle postgres 多数据库类型支持(中间件不支持)
+* [重大更新] 使用 spring 事件发布机制 重构登录日志与操作日志 支持多事件监听无入侵扩展
+* 例如: 可以增加一个监听者将日志上传至ES等存储 对原有逻辑无影响
+
+### 依赖升级
+
+* update springboot 2.7.6 => 2.7.7
+* update springboot-admin 2.7.7 => 2.7.10
+* update dubbo 3.1.3 => 3.1.4
+* update seata 1.5.2 => 1.6.1 适配升级
+* update nacos 2.1.2 => 2.2.0 适配升级
+* update mybatis-plus 3.5.2 => 3.5.3.1
+* update sa-token 1.33.0 => 1.34.0
+* update springdoc 1.6.13 => 1.6.14
+* update snakeyaml 1.32 => 1.33
+* update easyexcel 3.1.3 => 3.1.5
+* update redisson 3.18.0 => 3.19.1
+* update easy-es 1.1.0 => 1.1.1
+* update hutool 5.8.10 => 5.8.11
+* update aws-s3 1.12.349 => 1.12.373
+* update aliyun-sms 2.0.22 => 2.0.23
+* update tencent-sms 3.1.635 => 3.1.660
+* update echarts 4.9.0 => 5.4.0
+
+### 功能更新
+
+* update 优化 BaseMapperPlus 使用 MP V3.5.3 新工具类 Db 简化批处理操作实现
+* update 优化 demo服务 过滤健康检查 sql 打印
+* update 优化 代码生成与框架主体使用相同的主键生成器 全局统一避免问题
+* update 优化 系统登录 使用单表查询校验用户 避免多次join查询
+* update 优化 适配框架多数据库支持 完成 oracle postgres 数据库适配(放弃 sqlserver 适配 原因: 基础中间件均不支持)
+* update 优化 删除主 sql 内无用数据
+* update 优化 删除 vue3 模板无用参数
+* update 优化 重构 ExcelUtil 全导出方法支持 OutputStream 流导出 不局限于 response
+* update 优化 maven 地址切换回 aliyun 仓库
+* update 优化 springdoc 配置鉴权头写死问题 增加持久化鉴权头配置
+* update 优化 actuator 依赖整合到 common-web 模块
+* update 优化 验证码结果使用 spel 引擎自动计算
+* update 优化 数据权限处理器 变量命名错误
+* update 优化 去除 RedisUtils 无用继承
+* update 优化 弹窗内容过多展示不全问题
+* update 优化 删除 fuse 无效选项 maxPatternLength
+* update 优化 minio 安装警告 使用新版本参数
+* update 优化 使用 spring 事件发布机制 重构登录日志与操作日志
+* update 优化 使用 spring 事件机制 重构 OssConfig 缓存更新
+* update 优化 单元格合并判断cellValue是否相等方法
+* update 优化 调整 gateway 拦截器执行顺序 优先处理 xss 过滤 然后进行缓存处理
+
+### 新功能
+
+* add 增加 GET 请求提交日期参数 默认格式化配置
+* add 增加 RedisUtils 检查缓存对象是否存在方法
+* add 增加 oracle postgres docker编排
+* add 新增 代码生成器适配 多数据库可切换生成代码
+* add 新增 oracle postgres 数据库框架sql脚本
+* add 增加 DataBaseHelper 数据库助手 用于适配多类型数据库
+* add 新增 BeanCopyUtils#mapToMap 方法
+
+### 问题修复
+
+* fix 修复 注册页面 验证码开关不生效问题
+* fix 修复 新版本 dubbo-filter-seata 插件内核与seata不一致问题(临时)
+* fix 修复 根据 key 更新参数配置报 null 问题
+* fix 修复 用户注册 用户类型字段书写错误
+* fix 修复 代码生成图片/文件/单选时选择必填无法校验问题
+* fix 修复 修改参数键名时 未移除过期缓存配置
+* fix 修复 内网鉴权 Filter 优先级问题 导致 websocket 连接失败
+* fix 修复 gateway 流控规则生效但不显示问题
+* fix 修复 新版本 Redisson 存在与 boot 2.X 的兼容性问题
+
+## v1.4.0 - 2022-12-01
+
+### 重大更新
+* [重大更新] 新增 对接 skywalking 全功能(详细看下方新功能列表)
+* [重大更新] 重构 ruoyi-nacos 使用官方依赖整合 解决一些问题 并升级 2.1.2 版本
+* [重大更新] 新增 oss 私有库功能(数据库结构改动 需执行升级sql)
+* [重大更新] 优化 数据源连接池从 druid 切换到 hikari(原因看文档)
+* [重大更新] 新增 对接 prometheus + grafana 全功能(详细看下方新功能列表)
+
+### 依赖升级
+* update springcloud 2021.0.4 => 2021.0.5
+* update springboot 2.7.4 => 2.7.6
+* update springboot-admin 2.7.5 => 2.7.7
+* update springdoc 1.6.11 => 1.6.13
+* update poi 5.2.2 => 5.2.3
+* update hutool 5.8.6 => 5.8.10
+* update aliyun-sms 2.0.18 => 2.0.22
+* update tencent-sms 3.1.591 => 3.1.611
+* update sa-token 1.30.0 => 1.33.0
+* update redisson 3.17.6 => 3.18.0
+* update easy-es 1.0.2 => 1.1.0
+* update easyexcel 3.1.1 => 3.1.3
+* update lock4j 2.2.2 => 2.2.3
+* update s3-adk 1.12.300 => 1.12.349
+* update sentinel 1.8.5 => 1.8.6
+* update nacos 2.1.1 => 2.1.2
+* update ELK 7.17.2 => 7.17.6 升级镜像版本
+* update nginx 1.21.6 => 1.22.1 修复漏洞
+* update mysql-docker 8.0.29 => 8.0.31
+
+### 功能更新
+* update 优化 分页对象 PageQuery 支持多排序 适配 文件管理 页面支持多排序
+* update 优化 获取用户信息getInfo接口 使用缓存数据获取
+* update 优化 rpc文件上传 增加 ossId 数据返回
+* update 优化 nacos 集群模式搭建 关于 nacos.home 注释说明
+* update 优化 修改头像在小屏幕上页面布局错位的问题
+* update 优化 oss 云厂商增加 华为obs关键字
+* update 优化 重置时取消部门选中
+* update 优化 新增返回警告消息提示
+* update 优化 抽取 logback 通用配置 logback-common.xml 简化其他服务日志文件书写
+* update 更改 nacos 配置文件目录 从dev文件夹迁移到nacos文件夹与其他配置区分
+* update 优化 gateway 只缓存body
+* update 优化 Dockerfile 创建目录命令简化操作
+* update 优化 gateway filter顺序 与 代码工具封装
+* update 优化 将空 catch 块形参重命名为 ignored
+* update 优化 satoken 依赖传递
+* update 优化 重写字典查询 使用本地缓存优化网络开销 提升到上级实现减少rpc调用频率 使用流处理减少字符串操作
+* update 优化 减小腾讯短信引入jar包的体积
+* update 优化 简化一些方法的写法
+* update 优化 消除Vue3控制台出现的警告信息
+* update 优化 忽略不必要的属性数据返回
+* update 优化 重构 mysql-jdbc 依赖到 mybatis 包内 替换为最新坐标
+
+### 新功能
+* add 新增 所有服务 docker 部署对接 skywalking
+* add 新增 三大 mq 整合 skywalking
+* add 新增 seata 整合 skywalking 手动编译 seata 插件包
+* add 新增 ruoyi-common-skylog 整合 skywalking 日志推送
+* add 增加 skywalking docker编排
+* add 增加 ruoyi-seata-server redis模式配置
+* add 新增 ruoyi-common-prometheus 模块 用于对接 prometheus 监控
+* add 新增 docker prometheus + grafana 容器编排
+* add 新增 ruoyi-monitor 监控服务 提供 prometheus http_sd 服务发现功能
+* add 新增 所有服务整合 ruoyi-common-prometheus 模块
+* add 新增 grafana 监控大屏配置文件(框架定制)
+* add 新增 使用 mica-metrics 为 undertow 提供健康检查
+* add 新增 字典数据映射翻译注解
+* add 增加 RedisUtils 获取缓存Map的key列表
+
+### 问题修复
+* fix 修复 开启账号同端互斥登录 被顶掉后登出报null异常问题
+* fix 修复 设置NameMapper导致队列功能异常问题
+* fix 修复 EnvironmentPostProcessor 不生效问题
+* fix 修复 文件上传组件格式验证问题
+* fix 修复 ruoyi-xxl-job-admin 服务健康检查配置缺失问题
+* fix 修复 Excel导出字典值转换方法由于内部调用缓存不生效bug
+* fix 修复 SysOss 方法内部调用导致缓存不生效 bug
+* fix 修复 主题颜色在Drawer组件不会加载问题
+* fix 修复 修改用户信息 校验用户名未排除当前用户问题
+* fix 修复 升级 nginx 修复漏洞 https://www.oschina.net/news/214309
+* fix 修复 用户编辑时角色和部门存在无法修改情况
+* fix 修复 RemoteDictServiceImpl 代理对象获取异常bug
+* fix 修复 菜单激活无法填充颜色 去除某些svg图标的fill属性
+* fix 修复 使用透明底png图片时, 自动填充黑色背景
+* fix 修复 table中更多按钮切换主题色未生效修复问题
+* fix 修复 dubbo 使用 tri 协议 header 请求头变为小写导致无法获取参数问题
+* fix 修复 DubboRequestFilter 优先级过高导致的 skywalking tid 取不到问题
+* fix 修复 前端脚本乱码问题
+* fix 修复 WebFluxUtils 读取空 body 报 null 问题
+* fix 修复 Log注解GET请求记录不到参数问题
+* fix 修复 某些特性的环境生成代码变乱码TXT文件问题
+* fix 修复 开启TopNav没有子菜单隐藏侧边栏
+* fix 修复 回显数据字典数组异常问题
+* fix 修复 升级 satoken 导致白名单热更不生效问题
+* fix 修复 swagger 版本与 springdoc 版本不一致导致找不到class问题
+* fix 修复 grafana 监控模板绑定数据源ID 导致无法正常读取数据问题
+
+## v1.3.0 - 2022-09-29
+
+### 重大更新
+
+* [重大更新] 新增 ruoyi-nacos 源码集成 nacos 服务端控制台 支持单机/集群模式
+* [重大更新] 重写 spring-cache 实现 更人性化的操作 支持注解指定ttl等一些参数
+* [重大更新] 新增 RuoYi-Cloud-Plus-UI 项目 Vue3 前端分支
+* [重大更新] 移除maven docker插件 过于老旧功能缺陷大 使用idea自带的docker插件替代
+* [重大更新] 优化 ruoyi-common-job 支持通过调度中心服务名注册 xxl-job-admin
+* [重大更新] 新增 ruoyi-common-sentinel 模块 支持使用服务名注册 sentinel 控制台
+
+### 依赖升级
+
+* update spring-cloud 2021.0.3 => 2021.0.4
+* update springboot 2.7.2 => 2.7.4
+* update springboot-admin 2.7.3 => 2.7.5
+* update sentinel 1.8.4 => 1.8.5 集成新 dubbo3 插件
+* update springdoc 1.6.9 => 1.6.11
+* update easy-es 0.9.80 => 1.0.2
+* update dubbo 3.0.10 => 3.1.1
+* update redisson 3.17.5 => 3.17.6
+* update druid 1.2.11 => 1.2.12
+* update hutool 5.8.5 => 5.8.6
+* update dynamic-ds 3.5.1 => 3.5.2
+* update aws-java-sdk-s3 1.12.264 => 1.12.300
+* update aliyun-sms 2.0.16 => 2.0.18
+* update tencent-sms 3.1.555 => 3.1.591
+* update snakeyaml 1.30 => 1.32
+
+### 功能更新
+
+* update 优化 getLoginId 增加必要参数空校验
+* update 优化 将 elasticsearch 解压后放入 避免造成用户误解
+* update 优化 修改资料头像与部门被覆盖的问题
+* update 优化 字典管理操作类型新增其他
+* update 优化 使用 spring-cache 注解优化缓存
+* update 优化 easy-es.enable=false 关闭 actuator 健康检查
+* update 优化 优化多角色数据权限匹配规则
+* update dubbo 升级 3.1.0 删除自行处理的源码修复 采用官方修复后的代码
+* update 优化 页面内嵌iframe切换tab不刷新数据
+* update 优化 调整 oss表key 与 ossconfig的service 字段长度不匹配
+* update 优化 操作日志密码脱敏
+* update 优化 补全缺失的接口 更改更新日志链接
+* update 优化 插入 SysOperLog 时, 限制 operUrl 属性的长度
+* update 优化 satoken 鉴权拦截器 优化多次校验
+
+### 新功能
+
+* add 增加 项目中使用到的请求头放行跨域
+* add 新增 获取oss对象元数据方法
+* add 新增 字典管理操作类型 其他
+
+### 问题修复
+
+* fix 修复 个人中心卡死或鼠标点击和键盘输入无效
+* fix 修复 BaseMapperPlus 方法命令不一致问题
+* fix 修复 图片预览组件src属性为null值控制台报错问
+* fix 修复 短信功能是否启用判断不生效
+* fix 修复 web模块 不引入nacos依赖报错问题
+* fix 修复 sentinel 构建无法读取webapp目录问题
+* fix 修复 菜单管理遗漏的prop属性
+* fix 修复 minio配置https遇到的问题
+* fix 修复 点击删除后点击取消控制台报错问题
+* fix 修复 文件/图片上传组件 第一次上传报错导致后续上传无限loading问题
+* fix 修复 ruoyi-auth 服务与 elasticsearch 端口号冲突问题
+* fix 修复 ruoyi-resource 服务与 elasticsearch 端口号冲突问题
+* fix 修复 角色部门状态字典错误 与 菜单注释错误
+* fix 修复 hutool 存在多版本问题
+* fix 修复 openapi结构体 因springdoc缓存导致多次拼接接口路径问题
+* fix 修复 oss配置删除内部数据id匹配类型问题
+* fix 修复 没有权限的用户编辑部门缺少数据
+* fix 修复 用户导入存在则更新不生效
+* fix 修复 日志转换非json数据导致报错
+* fix 修复 p6spy输出sql语句时间格式化不正确问题
+* fix 修复 不同网段因reset请求头导致下载导出跨域问题
+* fix 修复 在线用户设置永不过期 超时时间-1推送redis无效问题
+* fix 修复 snakeyaml 1.31 依旧存在漏洞 升级 1.32
+
+## v1.2.0 - 2022-08-09
+
+### 重大更新
+
+* [重大更新] 新增 ruoyi-common-elasticsearch 模块 集成 easy-es 傻瓜式操作搜索引擎
+* [重大更新] 新增 ruoyi-common-doc 整合 springdoc 基于 javadoc 实现无注解零入侵生成接口文档
+* [不兼容更新] 移除 swagger 所属 ruoyi-doc ruoyi-common-swagger 两个模块 建议使用 ruoyi-common-doc 模块
+
+### 依赖升级
+
+* update springboot 2.6.9 => 2.7.2 重构使用最新自动配置方式
+* update springboot-admin 2.6.7 => 2.7.3
+* update dubbo 3.0.9 => 3.0.10
+* update redisson 3.17.4 => 3.17.5
+* update hutool 5.8.3 => 5.8.5
+* update okhttp 4.9.1 => 4.10.0
+* update aws-java-sdk-s3 1.12.248 => 1.12.264 修复依赖安全漏洞
+* update aliyun.sms 2.0.9 => 2.0.16
+* update tencent.sms 3.1.537 => 3.1.555
+* update guava 30.0-jre => 31.1-jre
+
+### 功能更新
+
+* update 修改 资源服务 不提供默认短信 sdk 依赖
+* update 优化表格上右侧工具条(搜索按钮显隐&右侧样式凸出)
+* update 优化 前后端多环境部署保持一致 删除无用环境文件
+* update 优化 错误登录锁定与新增解锁功能
+* update 优化字典数据使用store存取
+* update 优化布局设置使用el-drawer抽屉显示
+* update 更新框架文档 专栏与视频 链接地址
+* update 优化 对象上传 主动设置文件公共读 解决天翼云OSS文件私有问题
+* update 优化 网关验证码过滤器 路径匹配改为严格匹配
+* update 优化 数据导致权限生成 SQL 重复问题
+
+### 新功能
+
+* add 增加 全局跨域过滤器 处理跨域请求 适配移动端访问
+* add 增加 搜索引擎 crud 演示案例
+
+### 问题修复
+
+* fix 防止date-picker组件报错,降级element-ui版本
+* fix 修复 RedisUtils 并发 set ttl 错误问题
+* fix 防止vue3主键字段名与row或ids一致导致报错的问题
+* fix 修复 幂等组件 逻辑问题导致线程变量未清除
+* fix 修复 图片回显查询 路径错误问题
+* fix 修复 脱敏没有实现类导致返回数据异常问题
+* fix 修复 xxljob 错误导入配置文件引发的问题
+* fix 修复 gateway模块 dockerfile 端口编写错误
+* fix 修复用户导出字典使用错误
+* fix 修复 demo 模块 远程调用失败问题
+* fix 修复 sentinel 控制台未适配 springboot 2.6 新路由策略导致无法登录问题
+
+## v1.1.0 - 2022-07-18
+
+### 重大更新
+
+* [重大更新] 新增 ELK 分布式日志中心整合
+* [重大更新] 新增 ruoyi-stream-mq 演示模块 完成 RabbitMQ RocketMQ Kafka 整合
+* [重大更新] 优化 docker 部署方式 使用 host 模式简化部署流程 降低使用成本
+* [重大更新] 调整 dubbo 服务注册命名空间与 cloud 服务保持一致 通过注册组区分访问服务
+* [安全性] 优化 nginx 限制外网访问内网 actuator 相关路径 建议升级
+
+### 依赖升级
+
+* update springboot 2.6.8 => 2.6.9
+* update easyexcel 3.1.0 => 3.1.1
+* update hutool 5.8.2 => 5.8.3
+* update redisson 3.17.2 => 3.17.4
+* update aws-java-sdk-s3 1.12.215 => 1.12.248
+* update tencentcloud-sdk-java 3.1.500 => 3.1.537
+* update dubbo 3.0.8 => 3.0.9
+* update seata 1.5.1 => 1.5.2
+
+### 功能更新
+
+* update 增加 redisson key 前缀配置
+* update 优化 DateColumn 支持单模板多key场景
+* update 优化部署脚本 增加 elk kafka rabbitmq rocketmq 等配置
+* update 修改 oss 客户端自定义域名 统一使用https开关控制协议头
+* update 优化 使用 StreamUtils 简化业务流操纵
+* update 优化 ruoyi-demo 模块 去除用不上的 seata 依赖
+* update 优化 接口文档 接口地址与服务地址不匹配问题
+* update 优化字典数据回显样式下拉框显示值
+* update 默认不启用压缩文件缓存防止node_modules过大
+* update 优化登出方法
+
+### 新功能
+
+* add 增加 rocketmq docker编排
+* add 新增 rabbitmq docker编排 包含延迟插件
+* add 新增 kafka docker编排
+* add 增加 es ik 分词器插件集成
+* add 增加 StreamUtils 流工具 简化 stream 流操纵
+
+### 问题修复
+
+* fix 修复 获取 SensitiveService 空问题 增加空兼容
+* fix 修复 演示页面导出路径错误
+* fix 修复 minio 上传自定义域名回显路径错误问题
+* fix 修复 hutool 工具返回不可操纵类型 导致报错问题
+* fix 修复 远程调用短信功能返回实体 SysSms 序列化报错问题
+* fix 修复 复制过程错误 导致演示excel文件损坏问题
+* fix 修复 dubbo 注册组不生效问题 通过覆盖源码方式
+* fix 修复代码生成首字母大写问题
+
+
+## v1.0.0 - 2022-06-20
+
+### 新增/优化 工程模块
+
+* add 新增 ruoyi-common-alibaba-bom 工程管理 alibaba 相关依赖
+* add 新增 ruoyi-common-bom 工程管理 ruoyi-common 相关依赖
+* add 新增 ruoyi-api-bom 工程管理 ruoyi-api 依赖项
+* add 新增 ruoyi-api-resource 模块 规范用法 移除 ruoyi-file 模块
+* add 新增 ruoyi-common-web 模块 使用 undertow 替换 tomcat
+* add 新增 ruoyi-common-dubbo 整合 dubbo 3.X 实现高性能 rpc 远程调用 替换 feign
+* add 新增 ruoyi-common-dict 实现字典多服务调用
+* add 新增 ruoyi-common-loadbalancer 自定义负载均衡模块 用于多团队开发
+* add 新增 ruoyi-common-excel 模块 集成 Alibaba EasyExcel 替换 自带excel实现
+* add 新增 ruoyi-common-oss 模块 支持 AWS S3 协议 分布式文件存储
+* add 新增 ruoyi-common-mail 邮件模块
+* add 新增 ruoyi-common-sms 短信模块 整合 阿里云、腾讯云 短信功能
+* add 新增 ruoyi-common-idempotent 分布式幂等模块
+* add 新增 ruoyi-common-satoken 整合 sa-token 重写所有权限
+* add 新增 ruoyi-xxl-job-admin 整合 xxljob 替换 quartz 支持分布式任务调度
+* add 新增 ruoyi-job 模块 统一远程处理任务 规范用法
+* add 新增 ruoyi-doc 模块 集成 Knife4j 替换 swagger
+* add 新增 ruoyi-seata-server 源码集成 Seata 1.5.X 服务端
+* add 新增 ruoyi-sentinel-dashboard 模块 源码集成 sentinel 控制台
+* update 抽取所有公用配置到 maven profile 管理
+
+### 代码依赖改动
+
+* update SpringCloud 2021.0.3
+* update 适配 SpringCloudAlibaba 2021.0.1.0 全新配置方式
+* update poi 4.1.2 => 5.2.2 性能大幅提升
+* update 重构 整合 jackson 替换 fastjson
+* update 重构 整合 redisson 客户端
+* update 重构 整合 mybatis-plus
+* update 重写 数据权限实现 基于 mybatis-plus
+* add 增加 lombok 优化原生代码
+* add 整合 hutool 优化相关代码
+* add 新增 国际化 功能
+* add 新增 lock4j 分布式锁
+* add 增加监控中心 在线日志监控 优化日志文件格式
+* add 适配 docker 部署方式
+
+### 后续/进行中计划
+
+* 增加 Vue3 前端工程
+* 应用模块 适配 Oracle、PostgreSQL、SQLServer
+* 增加 SpringCloud Stream 支持
+* 适配 Apache Kafka、Apache RocketMQ、RabbitMQ
+* 适配 ElasticSearch 分布式搜索引擎
+* 适配 Alibaba Canal 分布式数据同步中心
+* 适配 Apache SkyWalking 分布式链路追踪监控中心
+* 适配 ELK 分布式日志中心
+* 适配 Prometheus、Grafana 分布式全方位数据大屏监控

+ 37 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/elk.md

@@ -0,0 +1,37 @@
+# ELK搭建
+- - -
+# 环境搭建
+
+项目内置 `ELK` 的 `docker-compose` 编排 可查看 `/docker/docker-compose.yml` 文件下方扩展编排
+
+**注意: `/docker/elk/elasticsearch/` 目录下所有文件夹 均需要写权限**
+
+`chmod 777 /docker/elk/elasticsearch/data`<br>
+`chmod 777 /docker/elk/elasticsearch/logs`<br>
+`chmod 777 /docker/elk/elasticsearch/plugins`<br>
+**注意: es插件需要解压后放入 `plugins` 目录**
+
+# 运行命令
+
+```shell
+docker-compose up -d elasticsearch kibana logstash
+```
+
+# 参考文章
+[docker-compose 搭建 ELK 7.X 并整合 SpringBoot](https://lionli.blog.csdn.net/article/details/125743132)
+
+# 项目内配置
+
+服务引入依赖项
+
+```xml
+<!-- ELK 日志收集 -->
+<dependency>
+    <groupId>com.ruoyi</groupId>
+    <artifactId>ruoyi-common-logstash</artifactId>
+</dependency>
+```
+
+更改主 `pom` 文件 `logstash.address` 地址<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678981534923588112/ba6cb5b7_1766278.png "屏幕截图")

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