Ver Fonte

2.0版本

ageerle há 4 meses atrás
pai
commit
c1cbfc2b93
100 ficheiros alterados com 4694 adições e 289 exclusões
  1. BIN
      image/03.png
  2. BIN
      image/04.png
  3. BIN
      image/05.png
  4. BIN
      image/06.png
  5. BIN
      image/07.png
  6. BIN
      image/08.png
  7. BIN
      image/09.png
  8. BIN
      image/10.png
  9. BIN
      image/11.png
  10. BIN
      image/12.png
  11. 7 18
      pom.xml
  12. 9 39
      ruoyi-admin/pom.xml
  13. 21 0
      ruoyi-admin/src/main/java/org/ruoyi/RuoYiApplication.java
  14. 18 0
      ruoyi-admin/src/main/java/org/ruoyi/RuoYiServletInitializer.java
  15. 162 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/AuthController.java
  16. 152 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/CaptchaController.java
  17. 36 0
      ruoyi-admin/src/main/java/org/ruoyi/controller/IndexController.java
  18. 7 39
      ruoyi-admin/src/main/resources/application-dev.yml
  19. 79 90
      ruoyi-admin/src/main/resources/application.yml
  20. 0 7
      ruoyi-admin/src/main/resources/banner.txt
  21. 46 0
      ruoyi-admin/src/main/resources/static/.gitignore
  22. 0 0
      ruoyi-admin/src/main/resources/static/.nojekyll
  23. 1 0
      ruoyi-admin/src/main/resources/static/CNAME
  24. 74 0
      ruoyi-admin/src/main/resources/static/README.md
  25. 32 0
      ruoyi-admin/src/main/resources/static/_coverpage.md
  26. 2 0
      ruoyi-admin/src/main/resources/static/_footer.md
  27. 9 0
      ruoyi-admin/src/main/resources/static/_navbar.md
  28. 16 0
      ruoyi-admin/src/main/resources/static/_sidebar.md
  29. 27 0
      ruoyi-admin/src/main/resources/static/common/add_group.md
  30. 7 0
      ruoyi-admin/src/main/resources/static/common/blacklist.md
  31. 18 0
      ruoyi-admin/src/main/resources/static/common/column.md
  32. 69 0
      ruoyi-admin/src/main/resources/static/common/contribution.md
  33. 13 0
      ruoyi-admin/src/main/resources/static/common/demo_system.md
  34. 37 0
      ruoyi-admin/src/main/resources/static/common/pr.md
  35. 80 0
      ruoyi-admin/src/main/resources/static/common/user_register.md
  36. 85 0
      ruoyi-admin/src/main/resources/static/common/video.md
  37. 66 96
      ruoyi-admin/src/main/resources/static/index.html
  38. 22 0
      ruoyi-admin/src/main/resources/static/plus-ui/_sidebar.md
  39. 234 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/common_func.md
  40. 55 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/component_use.md
  41. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/content_copy.md
  42. 16 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/dev_norm.md
  43. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/dict_use.md
  44. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/exception_handling.md
  45. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/icon_use.md
  46. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/page_cache.md
  47. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/param_use.md
  48. 4 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/permissions_use.md
  49. 65 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/request_process.md
  50. 82 0
      ruoyi-admin/src/main/resources/static/plus-ui/devdoc/router_use.md
  51. 53 0
      ruoyi-admin/src/main/resources/static/plus-ui/home.md
  52. 34 0
      ruoyi-admin/src/main/resources/static/questions/_sidebar.md
  53. 148 0
      ruoyi-admin/src/main/resources/static/questions/api_encrypt.md
  54. 10 0
      ruoyi-admin/src/main/resources/static/questions/bean_null.md
  55. 13 0
      ruoyi-admin/src/main/resources/static/questions/deploy_vue.md
  56. 41 0
      ruoyi-admin/src/main/resources/static/questions/domestic_databases.md
  57. 18 0
      ruoyi-admin/src/main/resources/static/questions/dubbo_ip.md
  58. 27 0
      ruoyi-admin/src/main/resources/static/questions/https_config.md
  59. 10 0
      ruoyi-admin/src/main/resources/static/questions/identify_fail.md
  60. 4 0
      ruoyi-admin/src/main/resources/static/questions/import_excel.md
  61. 12 0
      ruoyi-admin/src/main/resources/static/questions/jar_run_fail.md
  62. 3 0
      ruoyi-admin/src/main/resources/static/questions/jce_cannot.md
  63. 66 0
      ruoyi-admin/src/main/resources/static/questions/kinfe4j.md
  64. 69 0
      ruoyi-admin/src/main/resources/static/questions/login_step.md
  65. 4 0
      ruoyi-admin/src/main/resources/static/questions/lombok.md
  66. 35 0
      ruoyi-admin/src/main/resources/static/questions/nacos_naming_instance_metadata.md
  67. 15 0
      ruoyi-admin/src/main/resources/static/questions/nacos_read_fail.md
  68. 11 0
      ruoyi-admin/src/main/resources/static/questions/only_one_subscriber.md
  69. 40 0
      ruoyi-admin/src/main/resources/static/questions/parse_exception.md
  70. 15 0
      ruoyi-admin/src/main/resources/static/questions/permission_denied.md
  71. 11 0
      ruoyi-admin/src/main/resources/static/questions/read_metadata.md
  72. 8 0
      ruoyi-admin/src/main/resources/static/questions/sentinel_404.md
  73. 11 0
      ruoyi-admin/src/main/resources/static/questions/st_not_support.md
  74. 3 0
      ruoyi-admin/src/main/resources/static/questions/swagger.md
  75. 3 0
      ruoyi-admin/src/main/resources/static/questions/synchronous_update.md
  76. 20 0
      ruoyi-admin/src/main/resources/static/questions/use_druid.md
  77. 9 0
      ruoyi-admin/src/main/resources/static/questions/use_tomcat.md
  78. 70 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/_sidebar.md
  79. 1385 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/changlog.md
  80. 37 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/elk.md
  81. 26 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/es.md
  82. 9 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/kafka.md
  83. 20 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/maxkey.md
  84. 13 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/nacos.md
  85. 45 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/prometheus_grafana.md
  86. 10 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/rabbitmq.md
  87. 9 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/rocketmq.md
  88. 75 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/shardingproxy.md
  89. 41 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/extend-function/skywalking.md
  90. 3 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/architecture_diagram.md
  91. 27 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/collaboration.md
  92. 88 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/doc.md
  93. 31 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/i18n.md
  94. 19 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/inner_authentication.md
  95. 39 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/new_module.md
  96. 33 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/update_package_name.md
  97. 25 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/update_url.md
  98. 85 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/basic/client.md
  99. 86 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/basic/code_generate.md
  100. 250 0
      ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/basic/export.md

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


+ 7 - 18
pom.xml

@@ -4,7 +4,7 @@
          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>com.xmzs</groupId>
+    <groupId>org.ruoyi</groupId>
     <artifactId>ruoyi-ai</artifactId>
     <version>${revision}</version>
 
@@ -58,6 +58,7 @@
         <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>
     </properties>
 
     <profiles>
@@ -114,7 +115,7 @@
 
             <!-- common 的依赖配置-->
             <dependency>
-                <groupId>com.xmzs</groupId>
+                <groupId>org.ruoyi</groupId>
                 <artifactId>ruoyi-common-bom</artifactId>
                 <version>${revision}</version>
                 <type>pom</type>
@@ -307,33 +308,21 @@
             </dependency>
 
             <dependency>
-                <groupId>com.xmzs</groupId>
+                <groupId>org.ruoyi</groupId>
                 <artifactId>ruoyi-system</artifactId>
                 <version>${revision}</version>
             </dependency>
 
-            <dependency>
-                <groupId>com.xmzs</groupId>
-                <artifactId>ruoyi-job</artifactId>
-                <version>${revision}</version>
-            </dependency>
 
             <dependency>
-                <groupId>com.xmzs</groupId>
-                <artifactId>ruoyi-midjourney</artifactId>
+                <groupId>org.ruoyi</groupId>
+                <artifactId>ruoyi-fusion</artifactId>
                 <version>${revision}</version>
             </dependency>
 
 
-
-            <dependency>
-                <groupId>com.xmzs</groupId>
-                <artifactId>ruoyi-generator</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
             <dependency>
-                <groupId>com.xmzs</groupId>
+                <groupId>org.ruoyi</groupId>
                 <artifactId>ruoyi-demo</artifactId>
                 <version>${revision}</version>
             </dependency>

+ 9 - 39
ruoyi-admin/pom.xml

@@ -4,7 +4,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>ruoyi-ai</artifactId>
-        <groupId>com.xmzs</groupId>
+        <groupId>org.ruoyi</groupId>
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
@@ -23,16 +23,19 @@
             <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>
@@ -40,68 +43,35 @@
         </dependency>
 
         <dependency>
-            <groupId>com.xmzs</groupId>
+            <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-common-doc</artifactId>
         </dependency>
 
         <dependency>
-            <groupId>com.xmzs</groupId>
+            <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-system</artifactId>
         </dependency>
 
         <dependency>
-            <groupId>com.xmzs</groupId>
-            <artifactId>ruoyi-common-chat</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.xmzs</groupId>
-            <artifactId>ruoyi-job</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.xmzs</groupId>
-            <artifactId>ruoyi-midjourney</artifactId>
+            <groupId>org.ruoyi</groupId>
+            <artifactId>ruoyi-fusion</artifactId>
         </dependency>
 
 
 
 
-        <!-- 代码生成-->
-        <dependency>
-            <groupId>com.xmzs</groupId>
-            <artifactId>ruoyi-generator</artifactId>
-        </dependency>
-
         <!--  demo模块  -->
         <dependency>
-            <groupId>com.xmzs</groupId>
+            <groupId>org.ruoyi</groupId>
             <artifactId>ruoyi-demo</artifactId>
         </dependency>
 
-<!--        <dependency>-->
-<!--            <groupId>de.codecentric</groupId>-->
-<!--            <artifactId>spring-boot-admin-starter-client</artifactId>-->
-<!--        </dependency>-->
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
 
-        <!-- skywalking 整合 logback -->
-<!--        <dependency>-->
-<!--            <groupId>org.apache.skywalking</groupId>-->
-<!--            <artifactId>apm-toolkit-logback-1.x</artifactId>-->
-<!--            <version>${与你的agent探针版本保持一致}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.apache.skywalking</groupId>-->
-<!--            <artifactId>apm-toolkit-trace</artifactId>-->
-<!--            <version>${与你的agent探针版本保持一致}</version>-->
-<!--        </dependency>-->
-
         <!-- 添加thumbnailator依赖 -->
         <dependency>
             <groupId>net.coobird</groupId>

+ 21 - 0
ruoyi-admin/src/main/java/org/ruoyi/RuoYiApplication.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 RuoYiApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(RuoYiApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        System.out.println("(♥◠‿◠)ノ゙  RuoYiAi启动成功   ლ(´ڡ`ლ)゙");
+    }
+}

+ 18 - 0
ruoyi-admin/src/main/java/org/ruoyi/RuoYiServletInitializer.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 RuoYiServletInitializer extends SpringBootServletInitializer {
+
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+        return application.sources(RuoYiApplication.class);
+    }
+
+}

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

@@ -0,0 +1,162 @@
+package org.ruoyi.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.collection.CollUtil;
+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;
+
+    /**
+     * 登录方法
+     *
+     * @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.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);
+    }
+
+}

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

@@ -0,0 +1,36 @@
+package org.ruoyi.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * 首页
+ *
+ * @author Lion Li
+ */
+@SaIgnore
+@RequiredArgsConstructor
+@Controller
+public class IndexController {
+
+    /**
+     * 访问首页,提示语
+     */
+    @GetMapping("/")
+    public String index() {
+        return "index.html";
+    }
+
+    @GetMapping("/success")
+    public String success(){
+        return "paySuccess.html";
+    }
+
+    @GetMapping("/cancel")
+    public String cancel(){
+        return "cancel";
+    }
+
+}

+ 7 - 39
ruoyi-admin/src/main/resources/application-dev.yml

@@ -47,41 +47,9 @@ spring:
         master:
           type: ${spring.datasource.type}
           driverClassName: com.mysql.cj.jdbc.Driver
-          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
-          # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-          url: ${DB_URL}
-          username: ${DB_USERNAME}
-          password: ${DB_PASSWORD}
-
-
-        # 从库数据源
-      #        slave:
-      #          lazy: true
-      #          type: ${spring.datasource.type}
-      #          driverClassName: com.mysql.cj.jdbc.Driver
-      #          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
-      #          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
+          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: TZ7yaGtSRWeeBaBJ
       hikari:
         # 最大连接池数量
         maxPoolSize: 20
@@ -104,15 +72,15 @@ spring:
 spring.data:
   redis:
     # 地址
-    host: ${REDIS_HOST}
+    host: 127.0.0.1
     # 端口,默认为6379
-    port: ${REDIS_PORT}
+    port: 6379
     # 数据库索引
     database: 0
     # 密码(如没有密码请注释掉)
-    # password:
+    #password:
     # 连接超时时间
-    timeout: 10s
+    timeout: 10S
     # 是否开启ssl
     ssl: false
 

+ 79 - 90
ruoyi-admin/src/main/resources/application.yml

@@ -1,7 +1,8 @@
+
 # 项目相关配置
 ruoyi:
   # 名称
-  name: "xmzs"
+  name: "ruoyi"
   # 版本
   version: ${revision}
   # 版权年份
@@ -48,7 +49,7 @@ server:
 # 日志配置
 logging:
   level:
-    com.xmzs: '@logging.level@'
+    org.ruoyi: @logging.level@
     org.springframework: warn
   config: classpath:logback-plus.xml
 
@@ -69,14 +70,14 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: '@profiles.active@'
+    active: @profiles.active@
   # 文件上传
   servlet:
     multipart:
       # 单个文件大小
-      max-file-size: 10MB
+      max-file-size: 50MB
       # 设置总上传的文件大小
-      max-request-size: 20MB
+      max-request-size: 200MB
   mvc:
     format:
       date-time: yyyy-MM-dd HH:mm:ss
@@ -117,8 +118,7 @@ sa-token:
 security:
   # 排除路径
   excludes:
-    # 修改用户头像
-    - /system/user/edit/avatar
+    # 支付回调
     - /pay/returnUrl
     - /pay/notifyUrl
     # 上传文件
@@ -160,11 +160,11 @@ tenant:
 mybatis-plus:
   # 不支持多包, 如有需要可在注解配置 或 提升扫包等级
   # 例如 com.**.**.mapper
-  mapperPackage: com.xmzs.**.mapper
+  mapperPackage: org.ruoyi.**.mapper
   # 对应的 XML 文件位置
   mapperLocations: classpath*:mapper/**/*Mapper.xml
   # 实体扫描,多个package用逗号或者分号分隔
-  typeAliasesPackage: com.xmzs.**.domain
+  typeAliasesPackage: org.ruoyi.**.domain
   # 启动时是否检查 MyBatis XML 文件的存在,默认不检查
   checkConfigLocation: false
   configuration:
@@ -245,13 +245,13 @@ springdoc:
   #这里定义了两个分组,可定义多个,也可以不定义
   group-configs:
     - group: 1.演示模块
-      packages-to-scan: com.xmzs.demo
+      packages-to-scan: org.ruoyi.demo
     - group: 2.通用模块
-      packages-to-scan: com.xmzs.web
+      packages-to-scan: org.ruoyi.web
     - group: 3.系统模块
-      packages-to-scan: com.xmzs.system
+      packages-to-scan: org.ruoyi.system
     - group: 4.代码生成模块
-      packages-to-scan: com.xmzs.generator
+      packages-to-scan: org.ruoyi.generator
 
 # 防止XSS攻击
 xss:
@@ -290,9 +290,9 @@ management:
     logfile:
       external-file: ./logs/sys-console.log
 
---- # websocket
+# websocket
 websocket:
-  enabled: false
+  enabled: true
   # 路径
   path: ''
   # 设置访问源地址
@@ -307,83 +307,72 @@ wx:
         token: #微信小程序消息服务器配置的token
         aesKey: #微信小程序消息服务器配置的EncodingAESKey
         msgDataFormat: JSON
-baidu:
-  # 是否开启文本审核
-  enabled: false
-  # 文本审核
-  textReview:
-    apiKey: '' # apiKey
-    secretKey: '' # secretKey
-  appKey: xxxxxxxxxxxxxxxxx
-  secretKey: xxxxxxxxxxxxxxxxxxxxxxx
 
-wechat:
-  #  是否使用微信 true/false
-  enable: true
-  #  生成的登录二维码路径 默认与项目同级
-  qrPath: "./"
+# 知识库配置
+chain:
+  split:
+    chunk:
+      endspliter: "<STOP>"
+      # 分块文本大小
+      size: 500
+      overlay: 0
+      qaspliter: "######"
+  # 知识库中检索的条数
+  limits: 5
+  vectorization:
+    type: openai
+    openai:
+      model: 'text-embedding-3-small'
+    baidu:
+      model: bge-large-zh
+    zhipu:
+      model: embedding-2
+      # 智普API KEY
+      token: xx
+  vector:
+    store:
+      type: weaviate
+      weaviate:
+        protocol: http
+        host: 127.0.0.1:6038
+        classname: LocalKnowledge
+      milvus:
+        host: 127.0.0.1
+        port: 19530
+        dimension: 1536
+        collection: LocalKnowledge
+  llm:
+    openai:
+      token: sk-xx
+      model: gpt-4-1106-preview
+    chatglm:
+      baseurl: http://127.0.0.1:8000/
+      model: chatglm2-6b
+    baidu:
+      appKey: xx
+      secretKey: xx
+      model: ernie_bot
+    zhipu:
+      model: glm-4
+    audio:
+      type: openai
+    text:
+      type: openai
+    function:
+      type: baidu
+    vision:
+      type: openai
+    image:
+      type: openai
 
-keyword:
-  #  重置会话指令
-  reset: "重置会话"
-  #  ai画图指令(DALL·E模型 https://platform.openai.com/docs/models/dall-e)
-  #  generation 根据关键词生成图片(https://platform.openai.com/docs/guides/images/generations)
-  image: "ai画图"
-  #  ai语音指令(TTS模型 https://platform.openai.com/docs/api-reference/audio)
-  audio: "ai语音"
+upload:
+  path: /data/upload
 
-#绘画价格配置(元)
-mj:
-  # 放大
-  upsample: 0.1
-  # 变化
-  change: 0.3
-  # 图生图
-  blend: 0.3
-  # 图生文
-  describe: 0.1
-  # 文生图
-  imagine: 0.3
-  # 局部重绘
-  inpaint: 0.3
-  # 提示词分析
-  shorten: 0.1
-  # 换脸
-  faceSwapping: 0.3
+proxy:
+  socket:
+    host: 127.0.0.1
+    port: 7890
 
---- # mail 邮件发送
-mail:
-  enabled: true
-  host: smtp.163.com
-  port: 465
-  # 是否需要用户名密码验证
-  auth: true
-  # 发送方,遵循RFC-822标准
-  from: ageerle@163.com
-  # 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
-  user: ageerle@163.com
-  # 密码(填写授权码)
-  pass: ${MAIL_PASS}
-  # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
-  starttlsEnable: true
-  # 使用SSL安全连接
-  sslEnable: true
-  # SMTP超时时长,单位毫秒,缺省值不超时
-  timeout: 0
-  # Socket连接超时值,单位毫秒,缺省值不超时
-  connectionTimeout: 0
+resource:
+  domain: http://127.0.0.1:${server.port}/resources
 
-# chatgpt和mj共用一个key
-chat:
-  apiKey: ${CHAT_API_KEY}
-  apiHost: ${CHAT_API_HOST}
-# 支付配置信息
-pay:
-  pid: ${PAY_PID}
-  key: ${PAY_KEY}
-  payUrl: 'https://pay.pandarobot.chat/mapi.php'
-  notify_url: 'https://www.pandarobot.chat/pay/returnUrl'
-  return_url: 'https://www.pandarobot.chat/pay/notifyUrl'
-  type: 'wxpay'
-  device: 'pc'
-  sign_type: 'MD5'

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

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

+ 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 "屏幕截图")  | 

+ 66 - 96
ruoyi-admin/src/main/resources/static/index.html

@@ -1,104 +1,74 @@
 <!DOCTYPE html>
-<html>
-
+<html lang="en">
 <head>
-    <!-- Meta, title, CSS, favicons, etc. -->
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <meta name="description" content="Padna Home">
-    <meta name="keywords" content="Padna,Homepage">
-    <meta name="author" content="Padna">
-    <title>熊猫助手</title>
-    <link rel="stylesheet" type="text/css" href="./assets/css/onlinewebfonts.css"/>
-    <link rel="stylesheet" type="text/css" href="./assets/css/vno.css">
-    <link rel="stylesheet" type="text/css" href="./assets/css/iconfont.css">
-    <link rel="icon" href="./assets/svg/favicon.svg">
+    <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>
-    <span class="mobile btn-mobile-menu">
-        <i class="social iconfont icon-list btn-mobile-menu__icon"></i>
-        <i class="social iconfont icon-angleup btn-mobile-close__icon hidden"></i>
-    </span>
-    <header id="panel" class="panel-cover">
-        <div class="panel-main">
-            <div class="panel-main__inner panel-inverted">
-                <div class="panel-main__content">
-                    <div class="ih-item circle effect right_to_left">
-                        <a href="#" title="" class="blog-button">
-                            <div>
-							<img src="./assets/img/logo1.jpg" alt="img" class="js-avatar iUp profilepic"></div>
-                        </a>
-                    </div>
-                    <h1 class="panel-cover__title panel-title iUp">
-                        <a href="#" title="Dmego Home">ageerle</a>
-                    </h1>
-                    <p class="panel-cover__subtitle panel-subtitle iUp">Code Create Life</p>
-                    <hr class="panel-cover__divider iUp" />
-                    <p id="description" class="panel-cover__description iUp">如何得与凉风约, 不共尘沙一并来!
-                        <br/>
-                        <strong>-「中牟道中」</strong>
-                    </p>
-                    <div class="navigation-wrapper iUp">
-                        <div>
-                            <nav class="cover-navigation cover-navigation--primary">
-                                <ul class="navigation">
-                                    <li class="navigation__item">
-                                        <a href="#" class="blog-button">首页</a>
-                                    </li>
-                                    <li class="navigation__item">
-                                        <a href="#" class="blog-button" target="_blank">博客</a>
-                                    </li>
-                                    <li class="navigation__item">
-                                        <a href="#" class="blog-button" target="_blank">简历</a>
-                                    </li>
-                                    <li class="navigation__item">
-                                        <a href="#" class="blog-button" target="_blank">关于</a>
-                                    </li>
-                                </ul>
-                            </nav>
-                        </div>
-                        <div class="iUp">
-                            <nav class="cover-navigation navigation--social">
-                                <ul class="navigation">
-                                    <li class="navigation__item">
-                                        <a href="https://github.com/ageerle/ruoyi-ai" title="github" target="_blank">
-                                            <i class='social iconfont icon-github'></i>
-                                            <span class="label">github</span>
-                                        </a>
-                                    </li>
-                                    <li class="navigation__item">
-                                        <a href="https://blog.csdn.net/weixin_42416319" title="csdn" target="_blank">
-                                            <i class='social iconfont icon-csdn'></i>
-                                            <span class="label">csdn</span>
-                                        </a>
-                                    </li>
-
-                                    <li class="navigation__item">
-                                        <a href="https://gitee.com/ageerle/ruoyi-ai" title="gitee" target="_blank">
-                                            <i class='social iconfont icon-cnblogs'></i>
-                                            <span class="label">gitee</span>
-                                        </a>
-                                    </li>
+<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>
 
-                                </ul>
-                            </nav>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="panel-cover--overlay cover-slate">
-			</div>
-        </div>
+<!-- 回到顶部 -->
+<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>
 
-        <div class="remark iUp">
-            <p class="power" >
-               Copyright &copy; 2023-2024 版权所有:xmzs 备案号:<a href="https://beian.miit.gov.cn/">鄂ICP备20231008611号</a>
-            </p>
-        </div>
-    </header>
-    <script type="text/javascript" src="./assets/js/main.js"></script>
-    <script type="text/javascript" src="./assets/json/images.json?cb=getBingImages"></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 "屏幕截图")

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

@@ -0,0 +1,26 @@
+# ES搜索引擎
+- - -
+## 环境搭建(如果已经搭建了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
+```
+
+## Easy-ES 文档
+[Easy-ES 文档](https://www.easy-es.cn/)
+
+## 用法
+
+基本配置和用法可参考 `ruoyi-demo` 模块 更多高级用法请参考 Easy-ES 文档<br>
+![输入图片说明](https://foruda.gitee.com/images/1660030085169129908/屏幕截图.png "屏幕截图.png")

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

@@ -0,0 +1,9 @@
+# Kafka搭建
+- - -
+## 环境搭建
+参考文章: [docker-compose 安装 Kafka 3.X 附带可视化界面](https://lionli.blog.csdn.net/article/details/125855550)
+
+## 用法参考
+参考 `ruoyi-stream-mq` 模块内的测试案例
+
+![输入图片说明](https://foruda.gitee.com/images/1660031528265343174/屏幕截图.png "屏幕截图.png")

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

@@ -0,0 +1,20 @@
+# 对接 MaxKey 单点登录
+- - -
+
+# 安装 MaxKey 应用服务
+
+参考 MaxKey 官方文档安装 [MaxKey安装部署](http://www.maxkey.top/doc/docs/intro/)
+
+# 配置应用 OAuth2.0 认证注册
+
+![输入图片说明](https://foruda.gitee.com/images/1693377802128677240/0927270a_1766278.png "屏幕截图")
+
+# 配置后端服务
+
+找到 `Nacos` 内的 `ruoyi-auth.yml` 配置文件
+
+修改 `maxkey` 对应的 `client-id` 与 `client-secret`
+
+![输入图片说明](https://foruda.gitee.com/images/1693378118762354596/2f02c8a3_1766278.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1693378168538263792/24476d2a_1766278.png "屏幕截图")

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

@@ -0,0 +1,13 @@
+# Nacos集群搭建
+- - -
+## 集群搭建两种方式
+### 文件寻址集群
+[【RuoYi-Cloud-Plus】学习笔记 02 - Nacos(二)寻址机制之文件寻址分析](https://blog.csdn.net/Michelle_Zhong/article/details/127423521)
+
+### 地址服务器寻址集群(推荐)
+[【RuoYi-Cloud-Plus】学习笔记 03 - Nacos(三)使用 Nginx 实现地址服务器寻址及其原理分析](https://blog.csdn.net/Michelle_Zhong/article/details/127474238)
+
+## 集群路由代理设置
+[【RuoYi-Cloud-Plus】学习笔记 04 - Nacos(四)使用 Nginx 简单实现 Nacos 集群负载均衡](https://blog.csdn.net/Michelle_Zhong/article/details/127486350)
+
+设置好代理之后 跟单机用法一致 后端nacos地址写代理 `ip:端口` 即可

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

@@ -0,0 +1,45 @@
+# Prometheus+Grafana搭建
+- - -
+## 基础搭建
+
+参考文章: https://lionli.blog.csdn.net/article/details/127959009
+
+## 框架内扩展
+
+框架已经包含了 docker-compose 编排 执行如下命令启动容器即可
+
+```shell
+docker-compose up -d prometheus grafana
+```
+
+## 应用配置
+
+各个服务引入 `ruoyi-common-prometheus` 模块
+
+![输入图片说明](https://foruda.gitee.com/images/1668998415863943539/413dc560_1766278.png "屏幕截图")
+
+修改 `prometheus.yml` 配置采集数据源
+
+![输入图片说明](https://foruda.gitee.com/images/1668998433756761442/bf31c212_1766278.png "屏幕截图")
+
+修改 `Nacos` 地址 与 `SpringBoot-Admin` 监控地址 用于数据采集<br>
+如都为本地应用则无需更改
+
+![输入图片说明](https://foruda.gitee.com/images/1668998317973042740/2d3590ec_1766278.png "屏幕截图")
+
+## 导入框架特制模板
+**注意: 此处数据源名称必须与图片保持一致 不然会和模板对应不上导致无法读取数据**<br>
+![输入图片说明](https://foruda.gitee.com/images/1669866309495145064/1de987ce_1766278.png "屏幕截图")
+
+> 找到框架内的特制模板json文件 在grafana点击上传json文件 导入模板<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1668998149634542527/f0881c8e_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1668998179391197847/b1d3a630_1766278.png "屏幕截图")
+
+## 选择查看监控
+
+点击右侧菜单浏览 选择想要查看的监控即可
+
+![输入图片说明](https://foruda.gitee.com/images/1668998515814170229/817ac8b0_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1668998567335384306/acdf2833_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1668998616894681785/ac27538b_1766278.png "屏幕截图")

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

@@ -0,0 +1,10 @@
+# RabbitMQ搭建
+- - -
+## 环境搭建
+
+参考文章: [docker-compose 安装 RabbitMQ 3.X 附带延迟队列插件](https://lionli.blog.csdn.net/article/details/125855177)
+
+## 用法参考
+参考 `ruoyi-stream-mq` 模块内的测试案例
+
+![输入图片说明](https://foruda.gitee.com/images/1660031371503504748/屏幕截图.png "屏幕截图.png")

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

@@ -0,0 +1,9 @@
+# RocketMQ搭建
+- - -
+## 环境搭建
+参考文章: [docker-compose 安装 RocketMQ 4.9.X (apache官方镜像) namesrv broker 与可视化控制台 console](https://lionli.blog.csdn.net/article/details/125798865)
+
+## 用法参考
+参考 `ruoyi-stream-mq` 模块内的测试案例
+
+![输入图片说明](https://foruda.gitee.com/images/1660031496623275622/屏幕截图.png "屏幕截图.png")

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

@@ -0,0 +1,75 @@
+# Sharding-Proxy搭建分库分表
+- - -
+
+# 如何使用
+
+查看 `ruoyi-demo` 服务 `TestShardingController`
+
+![输入图片说明](https://foruda.gitee.com/images/1688014028842337522/cd26026a_1766278.png "屏幕截图")
+
+## 首先在 MySQL 创建两个库
+
+创建两个库 `data-center_0` `data-center_1` 分别执行如下SQL
+
+```sql
+CREATE TABLE `t_order_0` (
+  `order_id` bigint(20) UNSIGNED NOT NULL COMMENT '主键ID',
+  `user_id` bigint(20) UNSIGNED NOT NULL COMMENT '用户ID',
+  `total_money` int(10) UNSIGNED NOT NULL COMMENT '订单总金额',
+  PRIMARY KEY (`order_id`),
+  KEY `idx_user_id` (`user_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单总表';
+ 
+CREATE TABLE `t_order_1` (
+  `order_id` bigint(20) UNSIGNED NOT NULL COMMENT '主键ID',
+  `user_id` bigint(20) UNSIGNED NOT NULL COMMENT '用户ID',
+  `total_money` int(10) UNSIGNED NOT NULL COMMENT '订单总金额',
+  PRIMARY KEY (`order_id`),
+  KEY `idx_user_id` (`user_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单总表';
+ 
+CREATE TABLE `t_order_item_0` (
+  `order_item_id` bigint(20) UNSIGNED NOT NULL COMMENT '子订单ID',
+  `order_id` bigint(20) UNSIGNED NOT NULL COMMENT '主键ID',
+  `user_id` bigint(20) UNSIGNED NOT NULL COMMENT '用户ID',
+  `money` int(10) UNSIGNED NOT NULL COMMENT '子订单金额',
+  PRIMARY KEY (`order_item_id`),
+  KEY `idx_order_id` (`order_id`) USING BTREE,
+  KEY `idx_user_id` (`user_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单子表';
+ 
+CREATE TABLE `t_order_item_1` (
+  `order_item_id` bigint(20) UNSIGNED NOT NULL COMMENT '子订单ID',
+  `order_id` bigint(20) UNSIGNED NOT NULL COMMENT '主键ID',
+  `user_id` bigint(20) UNSIGNED NOT NULL COMMENT '用户ID',
+  `money` int(10) UNSIGNED NOT NULL COMMENT '子订单金额',
+  PRIMARY KEY (`order_item_id`),
+  KEY `idx_order_id` (`order_id`) USING BTREE,
+  KEY `idx_user_id` (`user_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单子表';
+ 
+```
+
+## 然后更改配置文件
+
+更改 `config-sharding.yaml` 配置文件内的数据库连接地址与用户名密码
+
+## 服务搭建
+
+参考部署文档上传 docker 文件夹 内部包含 `shardingproxy` 配置文件
+
+![输入图片说明](https://foruda.gitee.com/images/1688013921062151295/89652dda_1766278.png "屏幕截图")
+
+框架已经包含了 docker-compose 编排 执行如下命令启动容器即可
+
+```shell
+docker-compose up -d shardingproxy
+```
+
+## 最后运行 demo
+
+运行 demo 提供的 controller 代码查看数据库内数据即可
+
+## 用法参考视频(略有不同 理性观看)
+
+用法参考视频: https://www.bilibili.com/video/BV1XN411A7Tv/

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

@@ -0,0 +1,41 @@
+# SkyWalking搭建与集成
+- - -
+## 服务搭建
+参考文章: [SpringBoot 整合 SkyWalking 8.X (包含 Logback 日志采集)](https://lionli.blog.csdn.net/article/details/127656534)
+
+框架已经包含了 docker-compose 编排 执行如下命令启动容器即可
+
+```shell
+docker-compose up -d elasticsearch sky-oap sky-ui
+```
+
+### 本地开发使用
+参考上方文章
+
+### docker部署使用
+上传探针到服务器 `/docker/skywalking/agent` 目录<br>
+**不要使用网上下载的 请使用框架自带的 内含一些官网没有的插件**<br>
+![输入图片说明](https://foruda.gitee.com/images/1667453098143152651/f1b4f492_1766278.png "屏幕截图")
+
+在对应服务的`dockerfile`内 打开 `skywalking` 相关参数注释<br>
+![输入图片说明](https://foruda.gitee.com/images/1667452514896786032/f4322fb9_1766278.png "屏幕截图")
+
+服务编排增加探针路径映射<br>
+![输入图片说明](https://foruda.gitee.com/images/1667453276389844864/7e139aa9_1766278.png "屏幕截图")
+
+
+### 对接日志推送(不推荐 建议使用ELK收集日志)
+
+框架已经封装好了对应的依赖和配置 在服务内添加如下依赖
+
+```xml
+<!-- skywalking 日志收集 -->
+<dependency>
+    <groupId>com.ruoyi</groupId>
+    <artifactId>ruoyi-common-skylog</artifactId>
+</dependency>
+```
+
+在 `logback.xml` 日志配置文件内引入 `skylog` 配置文件
+
+![输入图片说明](https://foruda.gitee.com/images/1667452697748002725/a18212cd_1766278.png "屏幕截图")

+ 3 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/architecture_diagram.md

@@ -0,0 +1,3 @@
+# 软件架构图
+- - -
+![输入图片说明](https://foruda.gitee.com/images/1722569321458793955/8672b1fc_1766278.png "屏幕截图")

+ 27 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/collaboration.md

@@ -0,0 +1,27 @@
+# 多团队开发
+- - -
+## 功能介绍
+
+> 多人员/团队开发往往会出现 调试程序 被负载均衡到别人那里 自己抓不到请求等问题<br>
+> 正确团队开发模式 `测试机一台` 公共服务都放到测试机上<br>
+> 本地开发人员 需启动 `ruoyi-gateway` 与 其他 调试的业务模块<br>
+> 将所有服务都统一指向同一个 Nacos 服务<br>
+> 前端连接本机 `ruoyi-gateway` 网关调试程序<br>
+
+框架提供了 `ruoyi-common-loadbalancer` 多团队 负载均衡模块 可以将网关的请求锁定到与网关相同的IP服务
+
+需要在 `ruoyi-gateway` `ruoyi-auth` `ruoyi-modules` 引入 `ruoyi-common-loadbalancer` 模块
+
+![输入图片说明](https://foruda.gitee.com/images/1678980590168990366/afa2fdf6_1766278.png "屏幕截图")
+
+启动前端访问本机 `ruoyi-gateway` 网关在请求转发 和 `dubbo` 进行 RPC 调用时<br>
+会获取与本机IP地址相同的服务优先调用(如未找到 会随机返回)
+
+# 重点说明
+
+请检查本机是否有虚机网卡IP 如有多网卡获取IP地址会不准确
+
+可使用如下代码检查本机IP是否正常
+```java
+InetAddress.getLocalHost().getHostAddress()
+```

+ 88 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/doc.md

@@ -0,0 +1,88 @@
+# 接口文档
+- - -
+## 版本 >= `1.2.0`
+## 说明
+由于 `springfox` 与 `knife4j` 均停止维护 bug众多<br>
+故从 `1.2.0` 开始 迁移到 `springdoc` 框架<br>
+基于 `javadoc` 无注解零入侵生成规范的 `openapi` 结构体<br>
+由于框架自带文档UI功能单一扩展性差 故移除自带UI 建议使用外置文档工具
+
+## 文档工具使用
+由于框架采用 `openapi` 行业规范 故市面上大部分的框架均支持 可自行选择<br>
+例如: `apifox` `apipost` `postman` `torna` `knife4j` 等 根据对应工具的文档接入即可
+
+## Swagger升级SpringDoc指南
+
+常见功能如下 其他功能自行挖掘<br>
+**注意: `javadoc` 只能替换基础功能 特殊功能还需要使用注解实现**
+
+| swagger                          | springdoc                       | javadoc            |
+|----------------------------------|---------------------------------|--------------------|
+| @Api(name = "xxx")               | @Tag(name = "xxx")              | java类注释第一行         |
+| @Api(description= "xxx")         | @Tag(description= "xxx")        | java类注释            |
+| @ApiOperation                    | @Operation                      | java方法注释           | 
+| @ApiIgnore                       | @Hidden                         | 无                  | 
+| @ApiParam                        | @Parameter                      | java方法@param参数注释   | 
+| @ApiImplicitParam                | @Parameter                      | java方法@param参数注释   | 
+| @ApiImplicitParams               | @Parameters                     | 多个@param参数注释       | 
+| @ApiModel                        | @Schema                         | java实体类注释          | 
+| @ApiModelProperty                | @Schema                         | java属性注释           | 
+| @ApiModelProperty(hidden = true) | @Schema(accessMode = READ_ONLY) | 无                  | 
+| @ApiResponse                     | @ApiResponse                    | java方法@return返回值注释 | 
+
+# 建议使用 `Apifox`(常见问题有其他对接方式)
+
+官网连接: [https://www.apifox.cn/](https://www.apifox.cn/)<br>
+视频教程: [springdoc与apifox配合使用](https://www.bilibili.com/video/BV1mr4y1j75M?p=8&vd_source=8f52c77be3233dbdd1c5e332d4d45bfb)
+
+![输入图片说明](https://foruda.gitee.com/images/1678976476639902970/f1617b40_1766278.png "屏幕截图")
+
+支持 文档编写 接口调试 Mock 接口压测 自动化测试 等一系列功能
+
+### 接入框架
+
+> 1.下载或使用web在线版 创建一个自己的项目<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976502850663851/7bbd8728_1766278.png "屏幕截图")
+
+> 2.进入项目 选择项目设置 找到自动同步<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976508918240326/6a4a61a8_1766278.png "屏幕截图")
+
+> 3.根据项目内所有文档组完成所有数据源创建(拉取后端`openapi`结构体)<br>
+数据源URL格式 `http://网关ip:端口/服务路径/v3/api-docs`<br>
+项目内所需:<br>
+`http://localhost:8080/demo/v3/api-docs` 演示服务<br>
+`http://localhost:8080/auth/v3/api-docs` 认证服务<br>
+`http://localhost:8080/resource/v3/api-docs` 资源服务<br>
+`http://localhost:8080/system/v3/api-docs` 系统服务<br>
+`http://localhost:8080/code/v3/api-docs` 代码生成服务<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678980352012289965/24e0e4da_1766278.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1678980368645148754/62308680_1766278.png "屏幕截图")
+
+> 4.选择 接口管理 项目概览 点击立即导入 并等待导入完成<br>
+后续会根据策略每3个小时自动导入一次<br>
+每次重新进入apifox也会自动同步一次<br>
+后端有改动也可以手动点击导入<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678980393851604773/a0c657d3_1766278.png "屏幕截图")
+
+> 5.(注意版本号)设置鉴权 选择接口管理 项目概览 找到Auth 按照如下配置<br>
+
+**版本号: >= 2.X**
+
+![输入图片说明](https://foruda.gitee.com/images/1690966897370710566/6a688aea_1766278.png "屏幕截图")
+
+**版本号: 1.X**
+
+![输入图片说明](https://foruda.gitee.com/images/1678980398409729963/db4502a0_1766278.png "屏幕截图")
+
+> key对应项目配置 默认为 `Authorization`<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976544342001474/c2ff85d3_1766278.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1678976549237304743/bcdfadda_1766278.png "屏幕截图")
+
+

+ 31 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/i18n.md

@@ -0,0 +1,31 @@
+# 国际化方案
+- - -
+* 前端国际化参考 [ruoyi前端国际化文档](http://doc.ruoyi.vip/ruoyi-vue/document/htsc.html#前端国际化流程)<br>
+* 参考 `demo` 模块 `TestI18nController` 国际化演示案例
+  在 `Header` 请求头 增加上下文语言参数 `content-language` 参数需与国际化配置文件后缀对应
+  如 `zh_CN` `en_US` 等<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976722892396585/60917594_1766278.png "屏幕截图")
+
+## 获取 `code` 对应国际化内容
+
+![输入图片说明](https://foruda.gitee.com/images/1678976728533100954/0ab8e36a_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976733019209506/a16574d6_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976738409745057/a073b425_1766278.png "屏幕截图")
+
+## 使用 `Validator` 框架校验 `controller` 参数返回国际化
+
+`controller` 校验接口参数 需要在类增加 `@Validated` 注解<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976741834729507/6c19b9cc_1766278.png "屏幕截图")<br>
+参数对应校验注解 使用 `{code}` 形式标注使用国际化处理<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976746093285542/ad0989db_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976750822808564/56bd60d7_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976754755107198/b89bf173_1766278.png "屏幕截图")
+
+## 使用 `Validator` 框架校验 `Bean` 返回国际化
+
+`Bean` 校验需要在接口校验 `Bean` 参数使用 `@Validated` 注解<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976761015767874/729da3bc_1766278.png "屏幕截图")<br>
+`Bean` 内属性校验注解 使用 `{code}` 形式标注使用国际化处理<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976765122587920/0b1027af_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976769965314387/0c416ede_1766278.png "屏幕截图")

+ 19 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/inner_authentication.md

@@ -0,0 +1,19 @@
+# 内网鉴权
+- - -
+## 功能介绍
+
+此功能用于防止外部请求访问内部服务应用<br>
+在请求经过 `gateway网关` 会生成一个 `id-token` 携带到后续服务进行校验<br>
+若未经过 `gateway网关` 调用内网服务 会出现 `id-token无效` 异常<br>
+有效防止非法请求直接访问内网服务<br>
+
+## 开启/关闭内网鉴权
+
+更改 `application-common.yml` 配置文件的 `sa-token.check-id-token` 配置即可
+
+![输入图片说明](https://foruda.gitee.com/images/1678980608778275681/9a2c1054_1766278.png "屏幕截图")
+
+## 放行内网鉴权
+进入 `ruoyi-common-security` 模块找到 `SecurityConfiguration` 类 增加排除路径即可
+
+![输入图片说明](https://foruda.gitee.com/images/1678980612657326393/cea32a8c_1766278.png "屏幕截图")

+ 39 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/new_module.md

@@ -0,0 +1,39 @@
+# 创建新服务
+- - -
+### 最简单的方式
+> 找个配置好的 例如 `ruoyi-system` 直接copy一份
+
+> 将 `pom` 名称改掉<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678980168782983123/c717e9ba_1766278.png "屏幕截图")
+
+> 服务启动类 名称改掉<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678980179829877203/f89d5c18_1766278.png "屏幕截图")
+
+> `application.yml` 配置服务应用名 改掉<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678980184047648028/e4c6c6cc_1766278.png "屏幕截图")
+
+> `nacos` 新建一份新的 对应新模块名称的 配置文件<br>
+![输入图片说明](https://foruda.gitee.com/images/1678980188806372269/cfd9731a_1766278.png "屏幕截图")
+
+更改 `nacos` 上的 `ruoyi-gateway.yml` 增加新服务路由<br>
+新服务访问路径 `网关ip:端口/服务路径/controller路径/接口路径`<br>
+例子: `http://localhost:8080/system/user/list` <br>
+
+![输入图片说明](https://foruda.gitee.com/images/1666861595048863422/9e9755b3_1766278.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1666861629037264535/bdfd5484_1766278.png "屏幕截图")
+
+### 注意事项
+如果是两个不同包名的模块 需要修改如下配置
+
+![输入图片说明](https://foruda.gitee.com/images/1719813861680271619/82435586_1766278.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1692006501957936219/059f8526_1766278.png "屏幕截图")
+
+如果新服务需要使用 `seata` 分布式事务<br>
+需要在 `nacos` 上的 `seata-server.properties` 文件内增加服务组
+
+![输入图片说明](https://foruda.gitee.com/images/1692006825427360840/5b9e410c_1766278.png "屏幕截图")

+ 33 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/update_package_name.md

@@ -0,0 +1,33 @@
+# 关于修改包名
+- - -
+
+**注意: 老包名为 com.ruoyi**
+
+## 1.随便找个地方新建 org.dromara 包
+![输入图片说明](https://foruda.gitee.com/images/1708491220807198688/b95c0c34_1766278.png "屏幕截图")
+
+## 2.在包上右键选择 refactor -> rename 选择 All Directories
+![输入图片说明](https://foruda.gitee.com/images/1683276891079076405/79808b22_1766278.png "屏幕截图")
+![输入图片说明](https://foruda.gitee.com/images/1708491697128844860/1e87ad39_1766278.png "屏幕截图")
+
+**因为dromara组织下有很多依赖导致idea无法识别完整包名**
+<br>
+![输入图片说明](https://foruda.gitee.com/images/1708490576909691001/692e5b37_1766278.png "屏幕截图")
+
+**需要先将dromara修改为 例如: ruoyi 然后重复上述步骤 这样就可以整包修改了**
+<br>
+![输入图片说明](https://foruda.gitee.com/images/1708490906933084793/ff104cd7_1766278.png "屏幕截图")
+
+## 3.使用IDEA全局替换 org.dromara 替换为 com.xxx
+
+![输入图片说明](https://foruda.gitee.com/images/1708491055347995519/dedda0d1_1766278.png "屏幕截图")
+
+**注意: 由于dromara组织下项目很多 非本框架的依赖模块 请勿修改 例如上图中的 org.dromara.sms4j**
+
+## 4.如有需要 将所有模块名逐一修改即可
+
+## 5.修改完成后需查看所有common包下模块spi文件是否修改正确
+
+**老版本idea或者未按照教程修改包名可能导致文件丢包问题**
+
+![输入图片说明](https://foruda.gitee.com/images/1708491365841192006/8bc337c2_1766278.png "屏幕截图")

+ 25 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/association/update_url.md

@@ -0,0 +1,25 @@
+# 修改应用路径
+- - -
+# 修改访问后端接口路径
+
+更改 前端环境配置文件 `VITE_APP_BASE_API` 代理路径
+
+![输入图片说明](https://foruda.gitee.com/images/1661824572484410642/14265f05_1766278.png "屏幕截图") <br>
+
+![输入图片说明](https://foruda.gitee.com/images/1724317552931269967/f7515655_1766278.png "屏幕截图")
+
+`prod` 生产环境需修改 `nginx.conf` 后端代理路径(上述配置文件也要改)
+
+![输入图片说明](https://foruda.gitee.com/images/1678980501204821424/d3340308_1766278.png "屏幕截图")
+
+# 修改前端页面访问路径
+修改对应环境的 `.env.环境` 文件内的 `VITE_APP_CONTEXT_PATH` 应用访问路径即可
+
+![输入图片说明](https://foruda.gitee.com/images/1661824572484410642/14265f05_1766278.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1724317049535973756/0a2cc43b_1766278.png "屏幕截图")
+
+生产环境 `nginx.conf` 与之对应修改即可 <br>
+**注意: 文件真实目录为 `/usr/share/nginx/html/admin/index.html` 此功能一般为多项目部署需要 故会增加一层目录 如不需要可以自行修改** <br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976662194341301/2720b7e9_1766278.png "屏幕截图")

+ 85 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/basic/client.md

@@ -0,0 +1,85 @@
+# 客户端管理功能
+- - -
+## 版本 >= 2.X
+
+## 客户端管理页面
+
+![输入图片说明](https://foruda.gitee.com/images/1690961819029076660/c44374ac_4959041.png "屏幕截图")
+
+### 客户端管理字段说明
+| 字段名称           | 取值说明                       | 注意事项                           |
+|----------------|----------------------------|--------------------------------|
+| 客户端id          | 由后端生成,用于前端登录校验以及接口数据加密     | 无法修改,不要删除默认数据,否则会报错            |
+| 客户端key         | 前端自定义                      | 无法修改,不要删除默认数据,否则会报错            |
+| 客户端秘钥          | 前端自定义                      | 无法修改,不要删除默认数据,否则会报错            |
+| 授权类型           | 密码认证、短信认证、邮件认证、小程序认证、第三方认证 | 根据授权类型判断当前客户端是否支持该登录方式         |
+| 设备类型           | PC端、APP端                   |                                |
+| Token活跃超时时间    | 自定义                        | 指定时间无操作则过期(单位:秒),默认30分钟(1800秒) |
+| Token固定超时时间    | 自定义                        | 指定时间必定过期(单位:秒),默认七天(604800秒)   |
+
+### 前后端使用新的客户端id
+
+步骤如下:
+1. 前端管理页面生成新的客户端id。
+2. 将新的客户端id复制到前端配置文件。
+
+![输入图片说明](https://foruda.gitee.com/images/1690962894318847386/133d2f90_4959041.png "屏幕截图")
+
+## 新增自定义客户端
+
+### 步骤一:新增客户端数据(例如增加小程序端)
+
+![输入图片说明](https://foruda.gitee.com/images/1690965463070099188/baeb4441_4959041.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1690965508836621042/df06248f_4959041.png "屏幕截图")
+
+### 步骤二:配置前端请求头信息
+
+需要在全局请求头 header 中增加 cientid <br>
+确保客户端所有请求都携带此id 可参考项目 `request.ts`
+
+![输入图片说明](https://foruda.gitee.com/images/1690965768235114596/980b88d2_4959041.png "屏幕截图")
+
+`VITE_APP_CLIENT_ID` 即配置文件中的客户端id。
+
+**重点:不同客户端登录获取到的token不同与其他端不互通(例如: app登录获取到的token无法用于pc端接口查询)**
+
+## 新增自定义登录方式授权类型
+
+**重点说明: 不要单独增加登录接口 系统全局统一只有一个登录接口 只需增加不同的鉴权方式即可**
+
+如何调试使用登录看这里 -> [关于登录调试步骤](/questions/login_step.md)
+
+### 步骤一:新增字典数据
+
+![输入图片说明](https://foruda.gitee.com/images/1690968849418013624/3b28417e_4959041.png "屏幕截图")
+
+![输入图片说明](https://foruda.gitee.com/images/1690968865819397010/64529fad_4959041.png "屏幕截图")
+
+### 步骤二:新增/修改客户端数据
+
+### 步骤三:后端新增认证策略
+
+新增策略实现类实现 `IAuthStrategy` 接口。<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1690972828588111954/7614a4c5_4959041.png "屏幕截图")
+
+参照已有策略实现类实现自定义参数校验登录方法逻辑。<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1718951146945578143/789c80e4_1766278.png "屏幕截图")
+
+**注意修改 `@Service` 名称保证规范性**
+
+![输入图片说明](https://foruda.gitee.com/images/1718951179571300385/8db730b9_1766278.png "屏幕截图")
+
+`LoginBody` 校验参数(可自定义)<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1718951237123374392/f7840db2_1766278.png "屏幕截图")
+
+例如 扩展小程序登录参数 只需要继承 `LoginBody <br>
+
+![输入图片说明](https://foruda.gitee.com/images/1718951283931895761/e6348be5_1766278.png "屏幕截图")`
+
+校验分组(可自定义)<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1718951343601334215/8ef404b4_1766278.png "屏幕截图")

+ 86 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/basic/code_generate.md

@@ -0,0 +1,86 @@
+# 代码生成
+- - -
+## 功能介绍
+
+### 数据源配置
+
+![输入图片说明](https://foruda.gitee.com/images/1678976867341325193/a2be0608_1766278.png "屏幕截图")
+
+<font size="4">**项目适配多种类型数据库 可以在代码生成页面切换**</font><br>
+
+> 填写对应的数据源名称 点击搜索按钮 即可切换到对应的数据源<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976876081856486/4ef4841c_1766278.png "屏幕截图")
+
+<font size="4">**>= 2.2.1版本 项目支持100+种数据库适配 在代码生成模块增加对应的数据库依赖即可**</font><br>
+
+![输入图片说明](https://foruda.gitee.com/images/1722396530340741054/3914eb72_1766278.png "屏幕截图")
+
+
+### 导入数据表
+
+> 点击导入按钮 会加载系统数据库所有的表<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976880393939803/3ecf1dcc_1766278.png "屏幕截图")
+
+> 选择需要的表 点击确定即可<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976885370716109/4834faa5_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976891856866728/853420d9_1766278.png "屏幕截图")
+
+### 编辑表生成结构
+
+> 点击表对应的编辑按钮<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976899111822310/aeaa33f9_1766278.png "屏幕截图")
+
+> 更改要生成表的数据<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976903345795925/4326f6ee_1766278.png "屏幕截图")<br>
+![输入图片说明](https://foruda.gitee.com/images/1678976908897387614/4cdf939b_1766278.png "屏幕截图")
+
+### 生成条件影响
+
+![输入图片说明](https://foruda.gitee.com/images/1678976913809284051/24da09b0_1766278.png "屏幕截图")
+
+
+* `插入` `编辑` 影响生成 BO 类 与 前端添加编辑页面 是否有该字段
+* `列表` 影响生成 VO 类 与 前端列表页面展示 是否有该字段
+* `查询` 影响 前端页面是否有该字段的搜索框 与 后端代码是否生成对应的查询条件
+* `查询方式` 影响生成查询条件的类型
+* `必填` 影响 BO 类 与 页面是否强制校验
+* `显示类型` 影响生成页面使用何种展示组件
+* `字典类型` 影响页面是否生成与字典的关联
+
+### 树表配置
+
+> 编辑表生成信息 生成模板为 `树表` 填写对应数据即可<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976917918548901/f5886c5c_1766278.png "屏幕截图")
+
+### 主子表说明
+
+框架不支持也不推荐使用主子表<br>
+原因一般业务场景 基本都是一对N表 多表关联场景<br>
+还有一些 主 => 子 <= 主 场景 需求很复杂 很少有单纯主子表场景出现<br>
+另外主子表关联 很容易出现 笛卡尔积 或者数据错乱等问题 需要自行sql调优场景<br>
+所以建议大家都按照 单表生成 自行编写业务逻辑
+
+### 预览功能
+
+> 配置好生成信息后 可以点击预览按钮<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976924411765532/2e9747df_1766278.png "屏幕截图")
+
+> 系统会根据已经配置好的数据 生成对应的代码预览<br>
+> 可以再此处观察代码的生成结构和数据是否正确等<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976945982406065/ca7383bb_1766278.png "屏幕截图")
+
+
+### 代码结构同步
+
+> 实际开发中 难免会有表结构更改的需求<br>
+> 这时可以使用 同步功能 点击同步按钮 即可与实时数据库表进行字段同步<br>
+
+![输入图片说明](https://foruda.gitee.com/images/1678976952919156537/3c47c078_1766278.png "屏幕截图")

+ 250 - 0
ruoyi-admin/src/main/resources/static/ruoyi-cloud-plus/framework/basic/export.md

@@ -0,0 +1,250 @@
+# 导出功能
+
+- - -
+
+在本框架中引入了 `Easy Excel` 依赖(对 `Apache POI`进行了封装以及扩展),可以对数据进行导出操作(即写 Excel)。
+
+[EasyExcel 文档地址](https://easyexcel.opensource.alibaba.com/)
+
+## 导出功能使用流程说明
+
+### 步骤一:定义导出实体对象
+
+以框架中 `SysUserExportVo` 为例:
+
+```Java
+    /**
+     * 用户ID
+     */
+    @ExcelProperty(value = "用户序号")
+    private Long userId;
+
+    // .......................
+
+    /**
+     * 用户性别
+     */
+    @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_user_sex")
+    private String sex;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_normal_disable")
+    private String status;
+```
+
+> 说明:<br>
+> 1. 使用 `@ExcelProperty` 注解标注需要导出的属性。
+> 2. 注解 `@ExcelProperty` 中 `value` 属性代表表格头部标题字段,`converter` 代表使用的转换器,后面会详细说明。
+> 3. 注解 `@ExcelDictFormat` 为自定义注解,与自定义转换器结合使用,同样在后面进行详细说明。
+
+### 步骤二:使用导出方法
+
+以框架中 `SysUserController#export` 方法为例:
+
+```Java
+    /**
+     * 导出用户列表
+     */
+    @PostMapping("/export")
+    public void export(SysUserBo user, HttpServletResponse response) {
+        // 根据参数查询导出的用户列表数据
+        List<SysUserVo> list = userService.selectUserList(user);
+        // 将列表转换为导出对象列表
+        List<SysUserExportVo> listVo = MapstructUtils.convert(list, SysUserExportVo.class);
+        // 导出方法
+        ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response);
+    }
+```
+
+> 说明:<br>
+> 使用 `ExcelUtil.exportExcel` 方法完成导出功能,上述 Demo 传入参数分别是:导出对象集合,Excel sheet 表名称,导出对象类型,response。
+
+## 框架工具使用说明
+
+### 1:字典转换器
+
+字典转换器 `ExcelDictConvert` 与自定义注解 `@ExcelDictFormat` 结合使用,标注在需要转换的属性上。
+
+使用方式一:
+
+```Java
+    /**
+     * 用户性别
+     */
+    @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_user_sex")
+    private String sex;
+```
+
+使用方式二:
+
+```Java
+    /**
+     * 用户性别
+     */
+    @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp="0=男,1=女,2=未知", separator=",")
+    private String sex;
+```
+
+`@ExcelDictFormat` 注解属性说明:
+
+| 属性名称             | 属性类型   | 默认值 | 说明                                |
+|------------------|--------|-----|-----------------------------------|
+| dictType         | String | ""  | 字典的type值 (如: sys_user_sex)        |
+| readConverterExp | String | ""  | 读取内容转表达式 (如: 0=男,1=女,2=未知)        |
+| separator        | String | "," | 与 readConverterExp 属性结合使用,表达式的分隔符 |
+
+### 2:枚举转换器
+
+字典转换器 `ExcelEnumConvert` 与自定义注解 `@ExcelEnumFormat` 结合使用,标注在需要转换的属性上。
+
+使用方式:
+
+```Java
+    /**
+     * 用户类型
+     * </p>
+     * 使用ExcelEnumFormat注解需要进行下拉选的部分
+     */
+    @ExcelProperty(value = "用户类型", index = 1, converter = ExcelEnumConvert.class)
+    @ExcelEnumFormat(enumClass = UserStatus.class, textField = "info")
+    private String userStatus;
+```
+
+`@ExcelEnumFormat` 注解属性说明:
+
+| 属性名称      | 属性类型       | 默认值  | 说明                           |
+|-----------|------------|------|------------------------------|
+| enumClass | Enum Class | -    | 字典枚举类型                       |
+| codeField | String     | code | 字典枚举类中对应的 code 属性名称,默认为 code |
+| textField | String     | text | 字典枚举类中对应的 text 属性名称,默认为 text |
+
+### 3:合并单元格
+
+`@CellMerge` 注解用于合并相同的列数据,需要结合 `CellMergeStrategy` 策略使用,标注在需要转换的属性上。
+
+使用方式:
+
+步骤一:在属性标注 `@CellMerge` 注解:
+```Java
+    /**
+     * 部门id
+     */
+    @CellMerge
+    @ExcelProperty(value = "部门id")
+    private Long deptId;
+```
+
+`@CellMerge` 注解属性说明:
+
+| 属性名称    | 属性类型     | 默认值 | 说明                           |
+|---------|----------|-----|------------------------------|
+| index   | int      | -1  | 合并列的下标,建议使用默认值               |
+| mergeBy | String[] | {}  | 合并需要依赖的其他字段名称(基于这个字段内容做合并条件) |
+
+
+步骤二:导出方法开启合并:
+```Java
+    /**
+     * 导出测试单表列表
+     */
+    @PostMapping("/export")
+    public void export(@Validated TestDemoBo bo, HttpServletResponse response) {
+        List<TestDemoVo> list = testDemoService.queryList(bo);
+        // 参数 true 表示开启合并单元格策略
+        ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, true, response);
+    } 
+```
+![输入图片说明](https://foruda.gitee.com/images/1700128921644543994/e8d4704f_1766278.png "屏幕截图")
+
+### 4:复杂 Excel 导出示例
+`TestExcelController` 提供了几种导出示例,如果需要可以参照相应方法进行导出。
+
+#### 4.1:单列表多数据导出(模板导出)
+
+模板内容:
+
+![输入图片说明](https://foruda.gitee.com/images/1700124852002972562/d9f57a8c_4959041.png "屏幕截图")
+
+模板位置:`ruoyi-example/ruoyi-demo/src/main/resources/excel/`
+
+导出示例代码:参考 demo 模块 `TestExcelController` 模板写法请查看 `EasyExcel` 文档
+
+导出结果:
+
+![输入图片说明](https://foruda.gitee.com/images/1700124885532359879/0d011d05_4959041.png "屏幕截图")
+
+#### 4.2:多列表多数据导出(模板导出)
+
+模板内容:
+
+![输入图片说明](https://foruda.gitee.com/images/1700125025931981176/105dbaaa_4959041.png "屏幕截图")
+
+模板位置:`ruoyi-example/ruoyi-demo/src/main/resources/excel/`
+
+导出示例代码:参考 demo 模块 `TestExcelController` 模板写法请查看 `EasyExcel` 文档
+
+导出结果:
+
+![输入图片说明](https://foruda.gitee.com/images/1700125054011300002/71869c1d_4959041.png "屏幕截图")
+
+#### 4.3:导出下拉框
+
+`ExcelDictFormat` 注解指定的字典项默认都会转换成下拉框
+
+自定义导出省市区下拉框示例代码:参考 demo 模块 `TestExcelController`
+
+导出结果:
+
+![输入图片说明](https://foruda.gitee.com/images/1700125265411678973/7f767719_4959041.png "屏幕截图")
+
+## Easy Excel 常用注解
+
+`Easy Excel` 提供了丰富的注解可以对导出对象进行定制化操作,这里的注解说明针对的是原生注解,自定义注解会结合转换器一起进行说明。
+
+| 类型    | 注解名称                    | 使用举例                                                                                                       | 说明                                                                                                       |
+|-------|-------------------------|------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
+| 格式化注解 | @DateTimeFormat         | @DateTimeFormat(value=格式化值)                                                                                | 对字符串进行日期格式化 (参照 `java.text.SimpleDateFormat` 书写即可)                                                       |
+| 格式化注解 | @NumberFormat           | @NumberFormat(value=格式化值, roundingMode=舍入模式)                                                               | 对字符串进行数值格式化 (参照 `java.text.DecimalFormat` 书写即可, `roundingMode` 默认 `RoundingMode.HALF_UP`)                |
+| 样式注解  | @ColumnWidth            | @ColumnWidth(value=值)                                                                                      | 设置列宽                                                                                                     |
+| 样式注解  | @ContentFontStyle       | @ContentFontStyle(color=颜色)                                                                                | 可以设置字体类型,颜色,粗细,是否斜体,下划线等,具体可查看注解 `@ContentFontStyle`                                                     |
+| 样式注解  | @ContentLoopMerge       | @ContentLoopMerge(eachRow=行值, columnExtend=列值)                                                             | 设置循环合并的区域                                                                                                |
+| 样式注解  | @ContentRowHeight       | @ContentRowHeight(value=值)                                                                                 | 设置内容行高                                                                                                   |
+| 样式注解  | @ContentStyle           | -                                                                                                          | 设置单元格样式,具体可查看注解 `@ContentStyle`                                                                          |
+| 样式注解  | @HeadFontStyle          | @HeadFontStyle(color=颜色)                                                                                   | 设置表头字体格式,类似 `@ContentFontStyle`,具体可查看注解 `@HeadFontStyle`                                                 |
+| 样式注解  | @HeadRowHeight          | @HeadRowHeight(value=值)                                                                                    | 设置表头行高                                                                                                   |
+| 样式注解  | @HeadStyle              | -                                                                                                          | 设置表头样式,具体可查看注解 `@HeadStyle`                                                                              |
+| 样式注解  | @OnceAbsoluteMerge      | @OnceAbsoluteMerge(firstRowIndex=开始行下标, lastRowIndex=结束行下标, firstColumnIndex=开始列下标, lastColumnIndex=结束列下标) | 根据设置值合并单元格                                                                                               |
+| 属性注解  | @ExcelIgnore            | @ExcelIgnore                                                                                               | 导出忽略该字段                                                                                                  |
+| 属性注解  | @ExcelIgnoreUnannotated | @ExcelIgnoreUnannotated                                                                                    | 默认不管加不加 `@ExcelProperty` 的注解的所有字段都会参与读写,加了 `@ExcelIgnoreUnannotated` 注解以后,不加 `@ExcelProperty` 注解的字段就不会参与 |
+| 属性注解  | @ExcelProperty          | @ExcelProperty(value=值, order=排序值, index=下标, converter=转换器)                                                | 默认按照对象属性顺序导出,如果设置了 `order` 以及 `index`,优先级 `index` > `order` > 默认;converter 可以自定义                         |
+
+## 扩展说明
+
+### 自定义转换器实现
+
+由于业务需要,原生注解不一定能够符合需要,因而衍生出了自定义转换器。能够实现定制化的内容转换需要。
+以下以框架中的字典转换器 `ExcelDictConvert` 为例进行说明。
+
+字典转换器 `ExcelDictConvert`,字典转换器使用了自定义注解 `@ExcelDictFormat` 配合使用。
+
+_**注:自定义转换器并非一定需要自定义注解,也可以针对已有的注解进行自定义转换实现。**_
+
+#### 实现方式
+
+自定义转换器需要实现 `com.alibaba.excel.converters.Converter` 接口,实现接口中的方法。
+
+![输入图片说明](https://foruda.gitee.com/images/1700104014304819918/33eb0c42_4959041.png "屏幕截图")
+
+转换方法 `ExcelDictConvert#convertToExcelData` :
+
+![输入图片说明](https://foruda.gitee.com/images/1700104426131801297/72931ef0_4959041.png "屏幕截图")
+
+## 更多功能
+
+更多导出功能使用可以参照 `Easy Excel` [官方文档](https://easyexcel.opensource.alibaba.com/docs/current/api/write)。

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff