⛄发布 4.4.0 正式版
@@ -2,7 +2,7 @@
 | 
			
		||||
  <configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
 | 
			
		||||
    <deployment type="dockerfile">
 | 
			
		||||
      <settings>
 | 
			
		||||
        <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:4.3.1" />
 | 
			
		||||
        <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:4.4.0" />
 | 
			
		||||
        <option name="buildOnly" value="true" />
 | 
			
		||||
        <option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" />
 | 
			
		||||
      </settings>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
  <configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
 | 
			
		||||
    <deployment type="dockerfile">
 | 
			
		||||
      <settings>
 | 
			
		||||
        <option name="imageTag" value="ruoyi/ruoyi-server:4.3.1" />
 | 
			
		||||
        <option name="imageTag" value="ruoyi/ruoyi-server:4.4.0" />
 | 
			
		||||
        <option name="buildOnly" value="true" />
 | 
			
		||||
        <option name="sourceFilePath" value="ruoyi-admin/Dockerfile" />
 | 
			
		||||
      </settings>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
  <configuration default="false" name="ruoyi-xxl-job-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
 | 
			
		||||
    <deployment type="dockerfile">
 | 
			
		||||
      <settings>
 | 
			
		||||
        <option name="imageTag" value="ruoyi/ruoyi-xxl-job-admin:4.3.1" />
 | 
			
		||||
        <option name="imageTag" value="ruoyi/ruoyi-xxl-job-admin:4.4.0" />
 | 
			
		||||
        <option name="buildOnly" value="true" />
 | 
			
		||||
        <option name="sourceFilePath" value="ruoyi-extend/ruoyi-xxl-job-admin/Dockerfile" />
 | 
			
		||||
      </settings>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE)
 | 
			
		||||
[](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
 | 
			
		||||
<br>
 | 
			
		||||
[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
 | 
			
		||||
[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
 | 
			
		||||
[]()
 | 
			
		||||
[]()
 | 
			
		||||
[]()
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
> 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可<br>
 | 
			
		||||
活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源
 | 
			
		||||
 | 
			
		||||
> 系统演示: [传送门](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/系统演示?sort_id=4836388)
 | 
			
		||||
> 系统演示: [传送门](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4836388&doc_id=1469725)
 | 
			
		||||
 | 
			
		||||
| 功能介绍     | 使用技术                | 文档地址                                                                                              | 特性注意事项                     |
 | 
			
		||||
|----------|---------------------|---------------------------------------------------------------------------------------------------|----------------------------|
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
| 分布式队列    | Redisson            | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95)                        | 普通队列、延迟队列、优先队列 等           |
 | 
			
		||||
| 分布式锁     | Lock4j              | [Lock4j官网](https://gitee.com/baomidou/lock4j)                                                     | 注解锁、工具锁 多种多样               |
 | 
			
		||||
| 分布式幂等    | Redisson            | [Lock4j文档](https://gitee.com/baomidou/lock4j)                                                     | 拦截重复提交                     |
 | 
			
		||||
| 分布式日志    | TLog                | [TLog文档](https://yomahub.com/tlog/docs)                                                           | 支持跟踪链路日志记录、性能分析、链路排查       |
 | 
			
		||||
| 分布式链路追踪  | Apache SkyWalking   | [Apache SkyWalking文档](https://skywalking.apache.org/docs/)                                        | 链路追踪、网格分析、度量聚合、可视化         |
 | 
			
		||||
| 分布式任务调度  | Xxl-Job             | [Xxl-Job官网](https://www.xuxueli.com/xxl-job/)                                                     | 高性能 高可靠 易扩展                |
 | 
			
		||||
| 文件存储     | Minio               | [Minio文档](https://docs.min.io/)                                                                   | 本地存储                       |
 | 
			
		||||
| 文件存储     | 七牛、阿里、腾讯            | [OSS使用文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4359146&doc_id=1469725) | 云存储                        |
 | 
			
		||||
@@ -51,7 +51,7 @@
 | 
			
		||||
| Excel框架  | Alibaba EasyExcel   | [EasyExcel文档](https://www.yuque.com/easyexcel/doc/easyexcel)                                      | 性能优异 扩展性强                  |
 | 
			
		||||
| 文档框架     | SpringDoc、javadoc   | [接口文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=5805266&doc_id=1469725)    | 无注解零入侵基于java注释             |
 | 
			
		||||
| 工具类框架    | Hutool、Lombok       | [Hutool文档](https://www.hutool.cn/docs/)                                                           | 减少代码冗余 增加安全性               |
 | 
			
		||||
| 代码生成器    | 适配MP、Knife4j规范化代码   | [Hutool文档](https://www.hutool.cn/docs/)                                                           | 一键生成前后端代码                  |
 | 
			
		||||
| 代码生成器    | 适配MP、SpringDoc规范化代码 | [代码生成文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=5522329&doc_id=1469725)  | 一键生成前后端代码                  |
 | 
			
		||||
| 部署方式     | Docker              | [Docker文档](https://docs.docker.com/)                                                              | 容器编排 一键部署业务集群              |
 | 
			
		||||
| 国际化      | SpringMessage       | [SpringMVC文档](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc)   | Spring标准国际化方案              |
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										90
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						@@ -6,35 +6,34 @@
 | 
			
		||||
 | 
			
		||||
    <groupId>com.ruoyi</groupId>
 | 
			
		||||
    <artifactId>ruoyi-vue-plus</artifactId>
 | 
			
		||||
    <version>4.3.1</version>
 | 
			
		||||
    <version>4.4.0</version>
 | 
			
		||||
 | 
			
		||||
    <name>RuoYi-Vue-Plus</name>
 | 
			
		||||
    <url>https://gitee.com/JavaLionLi/RuoYi-Vue-Plus</url>
 | 
			
		||||
    <description>RuoYi-Vue-Plus后台管理系统</description>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
        <ruoyi-vue-plus.version>4.3.1</ruoyi-vue-plus.version>
 | 
			
		||||
        <spring-boot.version>2.7.5</spring-boot.version>
 | 
			
		||||
        <ruoyi-vue-plus.version>4.4.0</ruoyi-vue-plus.version>
 | 
			
		||||
        <spring-boot.version>2.7.6</spring-boot.version>
 | 
			
		||||
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
			
		||||
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 | 
			
		||||
        <java.version>1.8</java.version>
 | 
			
		||||
        <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
 | 
			
		||||
        <spring-boot.mybatis>2.2.2</spring-boot.mybatis>
 | 
			
		||||
        <druid.version>1.2.12</druid.version>
 | 
			
		||||
        <springdoc.version>1.6.12</springdoc.version>
 | 
			
		||||
        <springdoc.version>1.6.13</springdoc.version>
 | 
			
		||||
        <poi.version>5.2.3</poi.version>
 | 
			
		||||
        <easyexcel.version>3.1.1</easyexcel.version>
 | 
			
		||||
        <easyexcel.version>3.1.3</easyexcel.version>
 | 
			
		||||
        <velocity.version>2.3</velocity.version>
 | 
			
		||||
        <satoken.version>1.31.0</satoken.version>
 | 
			
		||||
        <satoken.version>1.33.0</satoken.version>
 | 
			
		||||
        <mybatis-plus.version>3.5.2</mybatis-plus.version>
 | 
			
		||||
        <p6spy.version>3.9.1</p6spy.version>
 | 
			
		||||
        <hutool.version>5.8.8</hutool.version>
 | 
			
		||||
        <hutool.version>5.8.10</hutool.version>
 | 
			
		||||
        <okhttp.version>4.10.0</okhttp.version>
 | 
			
		||||
        <spring-boot-admin.version>2.7.6</spring-boot-admin.version>
 | 
			
		||||
        <redisson.version>3.17.7</redisson.version>
 | 
			
		||||
        <lock4j.version>2.2.2</lock4j.version>
 | 
			
		||||
        <spring-boot-admin.version>2.7.7</spring-boot-admin.version>
 | 
			
		||||
        <redisson.version>3.18.0</redisson.version>
 | 
			
		||||
        <lock4j.version>2.2.3</lock4j.version>
 | 
			
		||||
        <dynamic-ds.version>3.5.2</dynamic-ds.version>
 | 
			
		||||
        <tlog.version>1.5.0</tlog.version>
 | 
			
		||||
        <alibaba-ttl.version>2.14.2</alibaba-ttl.version>
 | 
			
		||||
        <xxl-job.version>2.3.1</xxl-job.version>
 | 
			
		||||
        <lombok.version>1.18.24</lombok.version>
 | 
			
		||||
 | 
			
		||||
@@ -44,10 +43,10 @@
 | 
			
		||||
        <snakeyaml.version>1.32</snakeyaml.version>
 | 
			
		||||
 | 
			
		||||
        <!-- OSS 配置 -->
 | 
			
		||||
        <aws-java-sdk-s3.version>1.12.324</aws-java-sdk-s3.version>
 | 
			
		||||
        <aws-java-sdk-s3.version>1.12.349</aws-java-sdk-s3.version>
 | 
			
		||||
        <!-- SMS 配置 -->
 | 
			
		||||
        <aliyun.sms.version>2.0.22</aliyun.sms.version>
 | 
			
		||||
        <tencent.sms.version>3.1.611</tencent.sms.version>
 | 
			
		||||
        <tencent.sms.version>3.1.635</tencent.sms.version>
 | 
			
		||||
    </properties>
 | 
			
		||||
 | 
			
		||||
    <!-- 依赖声明 -->
 | 
			
		||||
@@ -72,13 +71,6 @@
 | 
			
		||||
                <scope>import</scope>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <!-- 阿里数据库连接池 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.alibaba</groupId>
 | 
			
		||||
                <artifactId>druid-spring-boot-starter</artifactId>
 | 
			
		||||
                <version>${druid.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.springdoc</groupId>
 | 
			
		||||
                <artifactId>springdoc-openapi-webmvc-core</artifactId>
 | 
			
		||||
@@ -189,7 +181,7 @@
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.tencentcloudapi</groupId>
 | 
			
		||||
                <artifactId>tencentcloud-sdk-java</artifactId>
 | 
			
		||||
                <artifactId>tencentcloud-sdk-java-sms</artifactId>
 | 
			
		||||
                <version>${tencent.sms.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
@@ -224,29 +216,9 @@
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.yomahub</groupId>
 | 
			
		||||
                <artifactId>tlog-web-spring-boot-starter</artifactId>
 | 
			
		||||
                <version>${tlog.version}</version>
 | 
			
		||||
                <exclusions>
 | 
			
		||||
                    <exclusion>
 | 
			
		||||
                        <artifactId>log4j</artifactId>
 | 
			
		||||
                        <groupId>log4j</groupId>
 | 
			
		||||
                    </exclusion>
 | 
			
		||||
                    <exclusion>
 | 
			
		||||
                        <artifactId>dom4j</artifactId>
 | 
			
		||||
                        <groupId>dom4j</groupId>
 | 
			
		||||
                    </exclusion>
 | 
			
		||||
                    <exclusion>
 | 
			
		||||
                        <artifactId>commons-beanutils</artifactId>
 | 
			
		||||
                        <groupId>commons-beanutils</groupId>
 | 
			
		||||
                    </exclusion>
 | 
			
		||||
                </exclusions>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.yomahub</groupId>
 | 
			
		||||
                <artifactId>tlog-xxljob-spring-boot-starter</artifactId>
 | 
			
		||||
                <version>${tlog.version}</version>
 | 
			
		||||
                <groupId>com.alibaba</groupId>
 | 
			
		||||
                <artifactId>transmittable-thread-local</artifactId>
 | 
			
		||||
                <version>${alibaba-ttl.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <!-- 统一 guava 版本 解决隐式漏洞问题 -->
 | 
			
		||||
@@ -256,6 +228,13 @@
 | 
			
		||||
                <version>${guava.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <!-- 临时修复 snakeyaml 漏洞 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.yaml</groupId>
 | 
			
		||||
                <artifactId>snakeyaml</artifactId>
 | 
			
		||||
                <version>${snakeyaml.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
        </dependencies>
 | 
			
		||||
    </dependencyManagement>
 | 
			
		||||
 | 
			
		||||
@@ -294,6 +273,19 @@
 | 
			
		||||
                    </annotationProcessorPaths>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            <!-- 单元测试使用 -->
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                <artifactId>maven-surefire-plugin</artifactId>
 | 
			
		||||
                <version>2.22.2</version>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <argLine>-Dfile.encoding=UTF-8</argLine>
 | 
			
		||||
                    <!-- 根据打包环境执行对应的@Tag测试方法 -->
 | 
			
		||||
                    <groups>${profiles.active}</groups>
 | 
			
		||||
                    <!-- 排除标签 -->
 | 
			
		||||
                    <excludedGroups>exclude</excludedGroups>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
        </plugins>
 | 
			
		||||
        <resources>
 | 
			
		||||
            <resource>
 | 
			
		||||
@@ -318,8 +310,8 @@
 | 
			
		||||
    <repositories>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>public</id>
 | 
			
		||||
            <name>aliyun nexus</name>
 | 
			
		||||
            <url>https://maven.aliyun.com/repository/public/</url>
 | 
			
		||||
            <name>huawei nexus</name>
 | 
			
		||||
            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
 | 
			
		||||
            <releases>
 | 
			
		||||
                <enabled>true</enabled>
 | 
			
		||||
            </releases>
 | 
			
		||||
@@ -329,8 +321,8 @@
 | 
			
		||||
    <pluginRepositories>
 | 
			
		||||
        <pluginRepository>
 | 
			
		||||
            <id>public</id>
 | 
			
		||||
            <name>aliyun nexus</name>
 | 
			
		||||
            <url>https://maven.aliyun.com/repository/public/</url>
 | 
			
		||||
            <name>huawei nexus</name>
 | 
			
		||||
            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
 | 
			
		||||
            <releases>
 | 
			
		||||
                <enabled>true</enabled>
 | 
			
		||||
            </releases>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>4.3.1</version>
 | 
			
		||||
        <version>4.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
    <artifactId>ruoyi-extend</artifactId>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ FROM anapsix/alpine-java:8_server-jre_unlimited
 | 
			
		||||
 | 
			
		||||
MAINTAINER Lion Li
 | 
			
		||||
 | 
			
		||||
RUN mkdir -p /ruoyi/monitor
 | 
			
		||||
RUN mkdir -p /ruoyi/monitor/logs
 | 
			
		||||
 | 
			
		||||
WORKDIR /ruoyi/monitor
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi-extend</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>4.3.1</version>
 | 
			
		||||
        <version>4.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
    <packaging>jar</packaging>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
--- # 监控配置
 | 
			
		||||
spring:
 | 
			
		||||
  boot:
 | 
			
		||||
    admin:
 | 
			
		||||
      # Spring Boot Admin Client 客户端的相关配置
 | 
			
		||||
      client:
 | 
			
		||||
        # 增加客户端开关
 | 
			
		||||
        enabled: true
 | 
			
		||||
        # 设置 Spring Boot Admin Server 地址
 | 
			
		||||
        url: http://localhost:9090/admin
 | 
			
		||||
        instance:
 | 
			
		||||
          service-host-type: IP
 | 
			
		||||
        username: ruoyi
 | 
			
		||||
        password: 123456
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
--- # 监控配置
 | 
			
		||||
spring:
 | 
			
		||||
  boot:
 | 
			
		||||
    admin:
 | 
			
		||||
      # Spring Boot Admin Client 客户端的相关配置
 | 
			
		||||
      client:
 | 
			
		||||
        # 增加客户端开关
 | 
			
		||||
        enabled: true
 | 
			
		||||
        # 设置 Spring Boot Admin Server 地址
 | 
			
		||||
        url: http://172.30.0.90:9090/admin
 | 
			
		||||
        instance:
 | 
			
		||||
          service-host-type: IP
 | 
			
		||||
        username: ruoyi
 | 
			
		||||
        password: 123456
 | 
			
		||||
@@ -2,7 +2,6 @@ FROM anapsix/alpine-java:8_server-jre_unlimited
 | 
			
		||||
 | 
			
		||||
MAINTAINER Lion Li
 | 
			
		||||
 | 
			
		||||
RUN mkdir -p /ruoyi/xxljob
 | 
			
		||||
RUN mkdir -p /ruoyi/xxljob/logs
 | 
			
		||||
 | 
			
		||||
WORKDIR /ruoyi/xxljob
 | 
			
		||||
@@ -14,4 +13,4 @@ EXPOSE 9100
 | 
			
		||||
 | 
			
		||||
ADD ./target/ruoyi-xxl-job-admin.jar ./app.jar
 | 
			
		||||
 | 
			
		||||
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
 | 
			
		||||
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi-extend</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>4.3.1</version>
 | 
			
		||||
        <version>4.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <artifactId>ruoyi-xxl-job-admin</artifactId>
 | 
			
		||||
    <packaging>jar</packaging>
 | 
			
		||||
@@ -64,8 +64,8 @@
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- mysql -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>mysql</groupId>
 | 
			
		||||
            <artifactId>mysql-connector-java</artifactId>
 | 
			
		||||
            <groupId>com.mysql</groupId>
 | 
			
		||||
            <artifactId>mysql-connector-j</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
@echo off
 | 
			
		||||
echo.
 | 
			
		||||
echo [<EFBFBD><EFBFBD>Ϣ] <20><>װWeb<65><62><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD>node_modules<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
echo [信息] 安装Web工程,生成node_modules文件。
 | 
			
		||||
echo.
 | 
			
		||||
 | 
			
		||||
%~d0
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
@echo off
 | 
			
		||||
echo.
 | 
			
		||||
echo [<EFBFBD><EFBFBD>Ϣ] ʹ<><CAB9> Vue CLI <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Web <20><><EFBFBD>̡<EFBFBD>
 | 
			
		||||
echo [信息] 使用 Vue CLI 命令运行 Web 工程。
 | 
			
		||||
echo.
 | 
			
		||||
 | 
			
		||||
%~d0
 | 
			
		||||
@@ -9,4 +9,4 @@ cd %~dp0
 | 
			
		||||
cd ..
 | 
			
		||||
npm run dev
 | 
			
		||||
 | 
			
		||||
pause
 | 
			
		||||
pause
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "ruoyi-vue-plus",
 | 
			
		||||
  "version": "4.3.1",
 | 
			
		||||
  "version": "4.4.0",
 | 
			
		||||
  "description": "RuoYi-Vue-Plus后台管理系统",
 | 
			
		||||
  "author": "LionLi",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" fill="#bfbfbf" p-id="2423"></path></svg>
 | 
			
		||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" p-id="2423"></path></svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 732 B After Width: | Height: | Size: 717 B  | 
@@ -1 +1 @@
 | 
			
		||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1547360688278" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M890 120H134a70 70 0 0 0-70 70v500a70 70 0 0 0 70 70h756a70 70 0 0 0 70-70V190a70 70 0 0 0-70-70z m-10 520a40 40 0 0 1-40 40H712V448a40 40 0 0 0-80 0v232h-80V368a40 40 0 0 0-80 0v312h-80V512a40 40 0 0 0-80 0v168H184a40 40 0 0 1-40-40V240a40 40 0 0 1 40-40h656a40 40 0 0 1 40 40zM696 824H328a40 40 0 0 0 0 80h368a40 40 0 0 0 0-80z" fill="#bfbfbf" p-id="6718"></path></svg>
 | 
			
		||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1547360688278" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M890 120H134a70 70 0 0 0-70 70v500a70 70 0 0 0 70 70h756a70 70 0 0 0 70-70V190a70 70 0 0 0-70-70z m-10 520a40 40 0 0 1-40 40H712V448a40 40 0 0 0-80 0v232h-80V368a40 40 0 0 0-80 0v312h-80V512a40 40 0 0 0-80 0v168H184a40 40 0 0 1-40-40V240a40 40 0 0 1 40-40h656a40 40 0 0 1 40 40zM696 824H328a40 40 0 0 0 0 80h368a40 40 0 0 0 0-80z" p-id="6718"></path></svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 757 B After Width: | Height: | Size: 742 B  | 
@@ -1,2 +1,2 @@
 | 
			
		||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543827724451" class="icon" style="" viewBox="0 0 1084 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10233" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css">@font-face { font-family: rbicon; src: url("chrome-extension://dipiagiiohfljcicegpgffpbnjmgjcnf/fonts/rbicon.woff2") format("woff2"); font-weight: normal; font-style: normal; }
 | 
			
		||||
</style></defs><path d="M1080.09609 434.500756c-4.216302-23.731757-26.9241-47.945376-50.595623-53.185637l-17.648235-4.095836a175.940257 175.940257 0 0 1-101.612877-80.832531 177.807476 177.807476 0 0 1-18.732427-129.801867l5.541425-16.684509c7.10748-23.129428-2.108151-54.992624-20.599646-70.833873 0 0-16.624276-14.094495-63.244529-41.199293-46.800951-26.984332-66.858502-34.513443-66.858502-34.513443-22.76803-8.372371-54.631227-0.361397-71.255503 17.407304l-12.287509 13.251234a173.470708 173.470708 0 0 1-120.465769 48.065842A174.13327 174.13327 0 0 1 421.329029 33.590675L409.583617 20.761071C393.140039 2.99237 361.096144-4.898138 338.267881 3.353767c0 0-20.358715 7.529111-67.099434 34.513443-46.800951 27.34573-63.244529 41.440225-63.244529 41.440225-18.431263 15.66055-27.646894 47.222582-20.539413 70.592941l5.059562 16.865207a178.048407 178.048407 0 0 1-18.672194 129.621169 174.916297 174.916297 0 0 1-102.275439 81.073463l-17.045906 3.854904c-23.310126 5.42096-46.258856 29.333415-50.595623 53.185637 0 0-3.854905 21.382674-3.854905 75.712737 0 54.330062 3.854905 75.712736 3.854905 75.712736 4.216302 23.972688 26.9241 47.945376 50.595623 53.185637l16.624276 3.854905a174.253736 174.253736 0 0 1 102.395904 81.314394c23.310126 40.837896 28.911785 87.337683 18.732427 129.801867l-4.81863 16.443578c-7.10748 23.129428 2.108151 54.992624 20.599646 70.833872 0 0 16.624276 14.094495 63.244529 41.199293 46.800951 27.104798 66.918735 34.513443 66.918735 34.513443 22.707798 8.372371 54.631227 0.361397 71.255503-17.407303l11.624947-12.588673a175.096996 175.096996 0 0 1 242.256662 0.120465l11.624947 12.648906c16.383345 17.708468 48.427239 25.598976 71.255503 17.347071 0 0 20.358715-7.529111 67.159666-34.513443 46.740719-27.104798 63.124063-41.199293 63.124064-41.199293 18.491496-15.600317 27.707127-47.463513 20.599646-70.833873l-5.059562-17.106139a176.723284 176.723284 0 0 1 18.672194-129.139305 176.060722 176.060722 0 0 1 102.395904-81.314394l16.68451-3.854905c23.310126-5.42096 46.258856-29.333415 50.595623-53.185637 0 0 3.854905-21.382674 3.854904-75.712737-0.240932-54.330062-4.095836-75.833202-4.095836-75.833202z m-537.819428 293.334149c-119.261112 0-216.175824-97.336342-216.175824-217.621412a216.657687 216.657687 0 0 1 216.236057-217.320249c119.200879 0 216.115591 97.276109 216.11559 217.56118-0.240932 120.044139-96.974945 217.320248-216.175823 217.320249z" p-id="10234" fill="#bfbfbf"></path></svg>
 | 
			
		||||
</style></defs><path d="M1080.09609 434.500756c-4.216302-23.731757-26.9241-47.945376-50.595623-53.185637l-17.648235-4.095836a175.940257 175.940257 0 0 1-101.612877-80.832531 177.807476 177.807476 0 0 1-18.732427-129.801867l5.541425-16.684509c7.10748-23.129428-2.108151-54.992624-20.599646-70.833873 0 0-16.624276-14.094495-63.244529-41.199293-46.800951-26.984332-66.858502-34.513443-66.858502-34.513443-22.76803-8.372371-54.631227-0.361397-71.255503 17.407304l-12.287509 13.251234a173.470708 173.470708 0 0 1-120.465769 48.065842A174.13327 174.13327 0 0 1 421.329029 33.590675L409.583617 20.761071C393.140039 2.99237 361.096144-4.898138 338.267881 3.353767c0 0-20.358715 7.529111-67.099434 34.513443-46.800951 27.34573-63.244529 41.440225-63.244529 41.440225-18.431263 15.66055-27.646894 47.222582-20.539413 70.592941l5.059562 16.865207a178.048407 178.048407 0 0 1-18.672194 129.621169 174.916297 174.916297 0 0 1-102.275439 81.073463l-17.045906 3.854904c-23.310126 5.42096-46.258856 29.333415-50.595623 53.185637 0 0-3.854905 21.382674-3.854905 75.712737 0 54.330062 3.854905 75.712736 3.854905 75.712736 4.216302 23.972688 26.9241 47.945376 50.595623 53.185637l16.624276 3.854905a174.253736 174.253736 0 0 1 102.395904 81.314394c23.310126 40.837896 28.911785 87.337683 18.732427 129.801867l-4.81863 16.443578c-7.10748 23.129428 2.108151 54.992624 20.599646 70.833872 0 0 16.624276 14.094495 63.244529 41.199293 46.800951 27.104798 66.918735 34.513443 66.918735 34.513443 22.707798 8.372371 54.631227 0.361397 71.255503-17.407303l11.624947-12.588673a175.096996 175.096996 0 0 1 242.256662 0.120465l11.624947 12.648906c16.383345 17.708468 48.427239 25.598976 71.255503 17.347071 0 0 20.358715-7.529111 67.159666-34.513443 46.740719-27.104798 63.124063-41.199293 63.124064-41.199293 18.491496-15.600317 27.707127-47.463513 20.599646-70.833873l-5.059562-17.106139a176.723284 176.723284 0 0 1 18.672194-129.139305 176.060722 176.060722 0 0 1 102.395904-81.314394l16.68451-3.854905c23.310126-5.42096 46.258856-29.333415 50.595623-53.185637 0 0 3.854905-21.382674 3.854904-75.712737-0.240932-54.330062-4.095836-75.833202-4.095836-75.833202z m-537.819428 293.334149c-119.261112 0-216.175824-97.336342-216.175824-217.621412a216.657687 216.657687 0 0 1 216.236057-217.320249c119.200879 0 216.115591 97.276109 216.11559 217.56118-0.240932 120.044139-96.974945 217.320248-216.175823 217.320249z" p-id="10234"></path></svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB  | 
@@ -1 +1 @@
 | 
			
		||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1553828490559" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1684" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M898.831744 900.517641 103.816972 900.517641c-36.002982 0-65.363683-29.286-65.363683-65.313541l0-554.949184c0-36.041868 29.361725-65.326844 65.363683-65.326844l795.015795 0c36.002982 0 65.198931 29.284977 65.198931 65.326844l0 554.949184C964.030675 871.231641 934.834726 900.517641 898.831744 900.517641L898.831744 900.517641zM103.816972 255.593236c-13.576203 0-24.711821 11.085476-24.711821 24.662703l0 554.949184c0 13.576203 11.136641 24.662703 24.711821 24.662703l795.015795 0c13.577227 0 24.547069-11.086499 24.547069-24.662703l0-554.949184c0-13.577227-10.970866-24.662703-24.547069-24.662703L103.816972 255.593236 103.816972 255.593236zM664.346245 251.774257c-11.161201 0-20.332071-9.080819-20.332071-20.332071l0-101.278661c0-13.576203-11.047614-24.623817-24.699542-24.623817L383.181611 105.539708c-13.576203 0-24.712845 11.04659-24.712845 24.623817l0 101.278661c0 11.252275-9.041934 20.332071-20.332071 20.332071-11.20111 0-20.319791-9.080819-20.319791-20.332071l0-101.278661c0-35.989679 29.323862-65.275679 65.364707-65.275679l236.133022 0c36.06745 0 65.402569 29.284977 65.402569 65.275679l0 101.278661C684.717202 242.694461 675.636383 251.774257 664.346245 251.774257L664.346245 251.774257zM413.233044 521.725502 75.694471 521.725502c-11.163247 0-20.333094-9.117658-20.333094-20.35663 0-11.252275 9.169847-20.332071 20.333094-20.332071l337.538573 0c11.277858 0 20.319791 9.080819 20.319791 20.332071C433.552835 512.607844 424.510902 521.725502 413.233044 521.725502L413.233044 521.725502zM912.894018 521.725502 575.367725 521.725502c-11.213389 0-20.332071-9.117658-20.332071-20.35663 0-11.252275 9.118682-20.332071 20.332071-20.332071l337.526293 0c11.290137 0 20.332071 9.080819 20.332071 20.332071C933.226089 512.607844 924.184155 521.725502 912.894018 521.725502L912.894018 521.725502zM557.56322 634.217552 445.085496 634.217552c-11.213389 0-20.332071-9.079796-20.332071-20.331048l0-168.763658c0-11.251252 9.118682-20.332071 20.332071-20.332071l112.478747 0c11.290137 0 20.370956 9.080819 20.370956 20.332071l0 168.763658C577.934177 625.137757 568.853357 634.217552 557.56322 634.217552L557.56322 634.217552zM465.417567 593.514525l71.827909 0L537.245476 465.454918l-71.827909 0L465.417567 593.514525 465.417567 593.514525z" p-id="1685" fill="#bfbfbf"></path></svg>
 | 
			
		||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1553828490559" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1684" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M898.831744 900.517641 103.816972 900.517641c-36.002982 0-65.363683-29.286-65.363683-65.313541l0-554.949184c0-36.041868 29.361725-65.326844 65.363683-65.326844l795.015795 0c36.002982 0 65.198931 29.284977 65.198931 65.326844l0 554.949184C964.030675 871.231641 934.834726 900.517641 898.831744 900.517641L898.831744 900.517641zM103.816972 255.593236c-13.576203 0-24.711821 11.085476-24.711821 24.662703l0 554.949184c0 13.576203 11.136641 24.662703 24.711821 24.662703l795.015795 0c13.577227 0 24.547069-11.086499 24.547069-24.662703l0-554.949184c0-13.577227-10.970866-24.662703-24.547069-24.662703L103.816972 255.593236 103.816972 255.593236zM664.346245 251.774257c-11.161201 0-20.332071-9.080819-20.332071-20.332071l0-101.278661c0-13.576203-11.047614-24.623817-24.699542-24.623817L383.181611 105.539708c-13.576203 0-24.712845 11.04659-24.712845 24.623817l0 101.278661c0 11.252275-9.041934 20.332071-20.332071 20.332071-11.20111 0-20.319791-9.080819-20.319791-20.332071l0-101.278661c0-35.989679 29.323862-65.275679 65.364707-65.275679l236.133022 0c36.06745 0 65.402569 29.284977 65.402569 65.275679l0 101.278661C684.717202 242.694461 675.636383 251.774257 664.346245 251.774257L664.346245 251.774257zM413.233044 521.725502 75.694471 521.725502c-11.163247 0-20.333094-9.117658-20.333094-20.35663 0-11.252275 9.169847-20.332071 20.333094-20.332071l337.538573 0c11.277858 0 20.319791 9.080819 20.319791 20.332071C433.552835 512.607844 424.510902 521.725502 413.233044 521.725502L413.233044 521.725502zM912.894018 521.725502 575.367725 521.725502c-11.213389 0-20.332071-9.117658-20.332071-20.35663 0-11.252275 9.118682-20.332071 20.332071-20.332071l337.526293 0c11.290137 0 20.332071 9.080819 20.332071 20.332071C933.226089 512.607844 924.184155 521.725502 912.894018 521.725502L912.894018 521.725502zM557.56322 634.217552 445.085496 634.217552c-11.213389 0-20.332071-9.079796-20.332071-20.331048l0-168.763658c0-11.251252 9.118682-20.332071 20.332071-20.332071l112.478747 0c11.290137 0 20.370956 9.080819 20.370956 20.332071l0 168.763658C577.934177 625.137757 568.853357 634.217552 557.56322 634.217552L557.56322 634.217552zM465.417567 593.514525l71.827909 0L537.245476 465.454918l-71.827909 0L465.417567 593.514525 465.417567 593.514525z" p-id="1685"></path></svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB  | 
@@ -149,10 +149,9 @@
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 表格更多操作下拉样式 */
 | 
			
		||||
.el-table .el-dropdown-link {
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  color: #409EFF;
 | 
			
		||||
  margin-left: 5px;
 | 
			
		||||
.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine {
 | 
			
		||||
	cursor: pointer;
 | 
			
		||||
	margin-left: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.el-table .el-dropdown, .el-icon-arrow-down {
 | 
			
		||||
 
 | 
			
		||||
@@ -92,7 +92,9 @@ export default {
 | 
			
		||||
      if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) {
 | 
			
		||||
        const tmpPath = path.substring(1, path.length);
 | 
			
		||||
        activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"));
 | 
			
		||||
        this.$store.dispatch('app/toggleSideBarHide', false);
 | 
			
		||||
        if (!this.$route.meta.link) {
 | 
			
		||||
          this.$store.dispatch('app/toggleSideBarHide', false);
 | 
			
		||||
        }
 | 
			
		||||
      } else if(!this.$route.children) {
 | 
			
		||||
        activePath = path;
 | 
			
		||||
        this.$store.dispatch('app/toggleSideBarHide', true);
 | 
			
		||||
@@ -145,6 +147,8 @@ export default {
 | 
			
		||||
      }
 | 
			
		||||
      if(routes.length > 0) {
 | 
			
		||||
        this.$store.commit("SET_SIDEBAR_ROUTERS", routes);
 | 
			
		||||
      } else {
 | 
			
		||||
        this.$store.dispatch('app/toggleSideBarHide', true);
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    ishttp(url) {
 | 
			
		||||
 
 | 
			
		||||
@@ -80,31 +80,24 @@ service.interceptors.response.use(res => {
 | 
			
		||||
    if (code === 401) {
 | 
			
		||||
      if (!isRelogin.show) {
 | 
			
		||||
        isRelogin.show = true;
 | 
			
		||||
        MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
 | 
			
		||||
          confirmButtonText: '重新登录',
 | 
			
		||||
          cancelButtonText: '取消',
 | 
			
		||||
          type: 'warning'
 | 
			
		||||
        }
 | 
			
		||||
      ).then(() => {
 | 
			
		||||
        isRelogin.show = false;
 | 
			
		||||
        store.dispatch('LogOut').then(() => {
 | 
			
		||||
          location.href = process.env.VUE_APP_CONTEXT_PATH + "index";
 | 
			
		||||
        })
 | 
			
		||||
        MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
 | 
			
		||||
          isRelogin.show = false;
 | 
			
		||||
          store.dispatch('LogOut').then(() => {
 | 
			
		||||
            location.href = process.env.VUE_APP_CONTEXT_PATH + "index";
 | 
			
		||||
          })
 | 
			
		||||
      }).catch(() => {
 | 
			
		||||
        isRelogin.show = false;
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
      return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
 | 
			
		||||
    } else if (code === 500) {
 | 
			
		||||
      Message({
 | 
			
		||||
        message: msg,
 | 
			
		||||
        type: 'error'
 | 
			
		||||
      })
 | 
			
		||||
      Message({ message: msg, type: 'error' })
 | 
			
		||||
      return Promise.reject(new Error(msg))
 | 
			
		||||
    } else if (code === 601) {
 | 
			
		||||
      Message({ message: msg, type: 'warning' })
 | 
			
		||||
      return Promise.reject('error')
 | 
			
		||||
    } else if (code !== 200) {
 | 
			
		||||
      Notification.error({
 | 
			
		||||
        title: msg
 | 
			
		||||
      })
 | 
			
		||||
      Notification.error({ title: msg })
 | 
			
		||||
      return Promise.reject('error')
 | 
			
		||||
    } else {
 | 
			
		||||
      return res.data
 | 
			
		||||
@@ -115,18 +108,12 @@ service.interceptors.response.use(res => {
 | 
			
		||||
    let { message } = error;
 | 
			
		||||
    if (message == "Network Error") {
 | 
			
		||||
      message = "后端接口连接异常";
 | 
			
		||||
    }
 | 
			
		||||
    else if (message.includes("timeout")) {
 | 
			
		||||
    } else if (message.includes("timeout")) {
 | 
			
		||||
      message = "系统接口请求超时";
 | 
			
		||||
    }
 | 
			
		||||
    else if (message.includes("Request failed with status code")) {
 | 
			
		||||
    } else if (message.includes("Request failed with status code")) {
 | 
			
		||||
      message = "系统接口" + message.substr(message.length - 3) + "异常";
 | 
			
		||||
    }
 | 
			
		||||
    Message({
 | 
			
		||||
      message: message,
 | 
			
		||||
      type: 'error',
 | 
			
		||||
      duration: 5 * 1000
 | 
			
		||||
    })
 | 
			
		||||
    Message({ message: message, type: 'error', duration: 5 * 1000 })
 | 
			
		||||
    return Promise.reject(error)
 | 
			
		||||
  }
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -86,11 +86,14 @@ export function selectDictLabel(datas, value) {
 | 
			
		||||
  return actions.join('');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 回显数据字典(字符串数组)
 | 
			
		||||
// 回显数据字典(字符串、数组)
 | 
			
		||||
export function selectDictLabels(datas, value, separator) {
 | 
			
		||||
  if (value === undefined) {
 | 
			
		||||
  if (value === undefined || value.length ===0) {
 | 
			
		||||
    return "";
 | 
			
		||||
  }
 | 
			
		||||
  if (Array.isArray(value)) {
 | 
			
		||||
    value = value.join(",");
 | 
			
		||||
  }
 | 
			
		||||
  var actions = [];
 | 
			
		||||
  var currentSeparator = undefined === separator ? "," : separator;
 | 
			
		||||
  var temp = value.split(currentSeparator);
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
          * 分布式限流 Redisson 全局、请求IP、集群ID 多种限流<br/>
 | 
			
		||||
          * 分布式锁 Lock4j 注解锁、工具锁 多种多样<br/>
 | 
			
		||||
          * 分布式幂等 Redisson 拦截重复提交<br/>
 | 
			
		||||
          * 分布式日志 TLog 支持跟踪链路日志记录、性能分析、链路排查<br/>
 | 
			
		||||
          * 分布式链路追踪 SkyWalking 支持链路追踪、网格分析、度量聚合、可视化<br/>
 | 
			
		||||
          * 分布式任务调度 Xxl-Job 高性能 高可靠 易扩展<br/>
 | 
			
		||||
          * 分布式文件存储 Minio 本地存储<br/>
 | 
			
		||||
          * 分布式云存储 七牛、阿里、腾讯 云存储<br/>
 | 
			
		||||
@@ -32,7 +32,7 @@
 | 
			
		||||
          * Excel框架 Alibaba EasyExcel 性能优异 扩展性强<br/>
 | 
			
		||||
          * 文档框架 SpringDoc、javadoc 无注解零入侵基于java注释<br/>
 | 
			
		||||
          * 工具类框架 Hutool、Lombok 减少代码冗余 增加安全性<br/>
 | 
			
		||||
          * 代码生成器 适配MP、Knife4j规范化代码 一键生成前后端代码<br/>
 | 
			
		||||
          * 代码生成器 适配MP、SpringDoc规范化代码 一键生成前后端代码<br/>
 | 
			
		||||
          * 部署方式 Docker 容器编排 一键部署业务集群<br/>
 | 
			
		||||
          * 国际化 SpringMessage Spring标准国际化方案<br/>
 | 
			
		||||
        </p>
 | 
			
		||||
@@ -114,7 +114,7 @@ export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      // 版本号
 | 
			
		||||
      version: "4.3.1",
 | 
			
		||||
      version: "4.4.0",
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <i-frame :src="url" />
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import iFrame from "@/components/iFrame/index";
 | 
			
		||||
export default {
 | 
			
		||||
  name: "Druid",
 | 
			
		||||
  components: { iFrame },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      url: process.env.VUE_APP_BASE_API + "/druid/login.html"
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
@@ -80,6 +80,13 @@
 | 
			
		||||
      <el-table-column label="桶名称" align="center" prop="bucketName" />
 | 
			
		||||
      <el-table-column label="前缀" align="center" prop="prefix" />
 | 
			
		||||
      <el-table-column label="域" align="center" prop="region" />
 | 
			
		||||
      <el-table-column label="桶权限类型" align="center" prop="accessPolicy">
 | 
			
		||||
        <template slot-scope="scope">
 | 
			
		||||
          <el-tag type="warning" v-if="scope.row.accessPolicy === '0'">private</el-tag>
 | 
			
		||||
          <el-tag type="success" v-if="scope.row.accessPolicy === '1'">public</el-tag>
 | 
			
		||||
          <el-tag type="info" v-if="scope.row.accessPolicy === '2'">custom</el-tag>
 | 
			
		||||
        </template>
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
      <el-table-column label="状态" align="center" prop="status">
 | 
			
		||||
        <template slot-scope="scope">
 | 
			
		||||
          <el-switch
 | 
			
		||||
@@ -151,6 +158,13 @@
 | 
			
		||||
            >{{dict.label}}</el-radio>
 | 
			
		||||
          </el-radio-group>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item label="桶权限类型">
 | 
			
		||||
          <el-radio-group v-model="form.accessPolicy">
 | 
			
		||||
            <el-radio label="0">private</el-radio>
 | 
			
		||||
            <el-radio label="1">public</el-radio>
 | 
			
		||||
            <el-radio label="2">custom</el-radio>
 | 
			
		||||
          </el-radio-group>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
        <el-form-item label="域" prop="region">
 | 
			
		||||
          <el-input v-model="form.region" placeholder="请输入域" />
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
@@ -259,6 +273,9 @@ export default {
 | 
			
		||||
            trigger: "blur",
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
        accessPolicy:[
 | 
			
		||||
          { required: true, message: "accessPolicy不能为空", trigger: "blur" }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
@@ -292,6 +309,7 @@ export default {
 | 
			
		||||
        endpoint: undefined,
 | 
			
		||||
        domain: undefined,
 | 
			
		||||
        isHttps: "N",
 | 
			
		||||
        accessPolicy: "1",
 | 
			
		||||
        region: undefined,
 | 
			
		||||
        status: "1",
 | 
			
		||||
        remark: undefined,
 | 
			
		||||
 
 | 
			
		||||
@@ -135,9 +135,7 @@
 | 
			
		||||
            v-hasPermi="['system:role:remove']"
 | 
			
		||||
          >删除</el-button>
 | 
			
		||||
          <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
 | 
			
		||||
            <span class="el-dropdown-link">
 | 
			
		||||
              <i class="el-icon-d-arrow-right el-icon--right"></i>更多
 | 
			
		||||
            </span>
 | 
			
		||||
            <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
 | 
			
		||||
            <el-dropdown-menu slot="dropdown">
 | 
			
		||||
              <el-dropdown-item command="handleDataScope" icon="el-icon-circle-check"
 | 
			
		||||
                v-hasPermi="['system:role:edit']">数据权限</el-dropdown-item>
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
            :expand-on-click-node="false"
 | 
			
		||||
            :filter-node-method="filterNode"
 | 
			
		||||
            ref="tree"
 | 
			
		||||
            node-key="id"
 | 
			
		||||
            default-expand-all
 | 
			
		||||
            highlight-current
 | 
			
		||||
            @node-click="handleNodeClick"
 | 
			
		||||
@@ -179,9 +180,7 @@
 | 
			
		||||
                v-hasPermi="['system:user:remove']"
 | 
			
		||||
              >删除</el-button>
 | 
			
		||||
              <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:user:resetPwd', 'system:user:edit']">
 | 
			
		||||
                <span class="el-dropdown-link">
 | 
			
		||||
                  <i class="el-icon-d-arrow-right el-icon--right"></i>更多
 | 
			
		||||
                </span>
 | 
			
		||||
                <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
 | 
			
		||||
                <el-dropdown-menu slot="dropdown">
 | 
			
		||||
                  <el-dropdown-item command="handleResetPwd" icon="el-icon-key"
 | 
			
		||||
                    v-hasPermi="['system:user:resetPwd']">重置密码</el-dropdown-item>
 | 
			
		||||
@@ -536,6 +535,8 @@ export default {
 | 
			
		||||
    resetQuery() {
 | 
			
		||||
      this.dateRange = [];
 | 
			
		||||
      this.resetForm("queryForm");
 | 
			
		||||
      this.queryParams.deptId = undefined;
 | 
			
		||||
      this.$refs.tree.setCurrentKey(null);
 | 
			
		||||
      this.handleQuery();
 | 
			
		||||
    },
 | 
			
		||||
    // 多选框选中数据
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@
 | 
			
		||||
            :autoCropWidth="options.autoCropWidth"
 | 
			
		||||
            :autoCropHeight="options.autoCropHeight"
 | 
			
		||||
            :fixedBox="options.fixedBox"
 | 
			
		||||
            :outputType="options.outputType"
 | 
			
		||||
            @realTime="realTime"
 | 
			
		||||
            v-if="visible"
 | 
			
		||||
          />
 | 
			
		||||
@@ -79,6 +80,7 @@ export default {
 | 
			
		||||
        autoCropWidth: 200, // 默认生成截图框宽度
 | 
			
		||||
        autoCropHeight: 200, // 默认生成截图框高度
 | 
			
		||||
        fixedBox: true, // 固定截图框大小 不允许改变
 | 
			
		||||
        outputType:"png", // 默认生成截图为PNG格式
 | 
			
		||||
        filename: ''
 | 
			
		||||
      },
 | 
			
		||||
      previews: {},
 | 
			
		||||
 
 | 
			
		||||
@@ -278,7 +278,7 @@ export default {
 | 
			
		||||
          this.$modal.msgSuccess("成功生成到自定义路径:" + row.genPath);
 | 
			
		||||
        });
 | 
			
		||||
      } else {
 | 
			
		||||
        this.$download.zip("/tool/gen/batchGenCode?tables=" + tableNames, "ruoyi");
 | 
			
		||||
        this.$download.zip("/tool/gen/batchGenCode?tables=" + tableNames, "ruoyi.zip");
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    /** 同步数据库操作 */
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,9 @@ FROM anapsix/alpine-java:8_server-jre_unlimited
 | 
			
		||||
 | 
			
		||||
MAINTAINER Lion Li
 | 
			
		||||
 | 
			
		||||
RUN mkdir -p /ruoyi/server
 | 
			
		||||
RUN mkdir -p /ruoyi/server/logs
 | 
			
		||||
RUN mkdir -p /ruoyi/server/temp
 | 
			
		||||
RUN mkdir -p /ruoyi/server/logs \
 | 
			
		||||
    /ruoyi/server/temp \
 | 
			
		||||
    /ruoyi/skywalking/agent
 | 
			
		||||
 | 
			
		||||
WORKDIR /ruoyi/server
 | 
			
		||||
 | 
			
		||||
@@ -14,4 +14,10 @@ EXPOSE ${SERVER_PORT}
 | 
			
		||||
 | 
			
		||||
ADD ./target/ruoyi-admin.jar ./app.jar
 | 
			
		||||
 | 
			
		||||
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dserver.port=${SERVER_PORT}","-jar", "app.jar"]
 | 
			
		||||
ENTRYPOINT ["java", \
 | 
			
		||||
            "-Djava.security.egd=file:/dev/./urandom", \
 | 
			
		||||
            "-Dserver.port=${SERVER_PORT}", \
 | 
			
		||||
            # 应用名称 如果想区分集群节点监控 改成不同的名称即可
 | 
			
		||||
#            "-Dskywalking.agent.service_name=ruoyi-server", \
 | 
			
		||||
#            "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
 | 
			
		||||
            "-jar", "app.jar"]
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>4.3.1</version>
 | 
			
		||||
        <version>4.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
    <packaging>jar</packaging>
 | 
			
		||||
@@ -33,12 +33,6 @@
 | 
			
		||||
            <artifactId>spring-boot-starter-undertow</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--阿里数据库连接池 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba</groupId>
 | 
			
		||||
            <artifactId>druid-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--velocity代码生成使用模板 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.velocity</groupId>
 | 
			
		||||
@@ -64,8 +58,8 @@
 | 
			
		||||
 | 
			
		||||
        <!-- Mysql驱动包 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>mysql</groupId>
 | 
			
		||||
            <artifactId>mysql-connector-java</artifactId>
 | 
			
		||||
            <groupId>com.mysql</groupId>
 | 
			
		||||
            <artifactId>mysql-connector-j</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- Oracle -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
@@ -215,13 +209,8 @@
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.yomahub</groupId>
 | 
			
		||||
            <artifactId>tlog-web-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.yomahub</groupId>
 | 
			
		||||
            <artifactId>tlog-xxljob-spring-boot-starter</artifactId>
 | 
			
		||||
            <groupId>com.alibaba</groupId>
 | 
			
		||||
            <artifactId>transmittable-thread-local</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
@@ -237,7 +226,7 @@
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.tencentcloudapi</groupId>
 | 
			
		||||
            <artifactId>tencentcloud-sdk-java</artifactId>
 | 
			
		||||
            <artifactId>tencentcloud-sdk-java-sms</artifactId>
 | 
			
		||||
            <exclusions>
 | 
			
		||||
                <exclusion>
 | 
			
		||||
                    <groupId>com.squareup.okio</groupId>
 | 
			
		||||
@@ -246,6 +235,24 @@
 | 
			
		||||
            </exclusions>
 | 
			
		||||
        </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>-->
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import cn.dev33.satoken.annotation.SaIgnore;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.Documented;
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 匿名访问不鉴权注解
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 * @deprecated 将在后续版本使用Sa-Token注解 {@link SaIgnore} 代替
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
@Target({ElementType.METHOD, ElementType.TYPE})
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@Documented
 | 
			
		||||
public @interface Anonymous {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,27 @@
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
 | 
			
		||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 | 
			
		||||
import com.ruoyi.common.jackson.DictDataJsonSerializer;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 字典数据映射注解
 | 
			
		||||
 *
 | 
			
		||||
 * @author itino
 | 
			
		||||
 */
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@Target({ElementType.FIELD, ElementType.METHOD})
 | 
			
		||||
@JacksonAnnotationsInside
 | 
			
		||||
@JsonSerialize(using = DictDataJsonSerializer.class)
 | 
			
		||||
public @interface DictDataMapper {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置字典的type值 (如: sys_user_sex)
 | 
			
		||||
     */
 | 
			
		||||
    String dictType() default "";
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,93 @@
 | 
			
		||||
package com.ruoyi.common.constant;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 返回状态码
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 */
 | 
			
		||||
public interface HttpStatus {
 | 
			
		||||
    /**
 | 
			
		||||
     * 操作成功
 | 
			
		||||
     */
 | 
			
		||||
    int SUCCESS = 200;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 对象创建成功
 | 
			
		||||
     */
 | 
			
		||||
    int CREATED = 201;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 请求已经被接受
 | 
			
		||||
     */
 | 
			
		||||
    int ACCEPTED = 202;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 操作已经执行成功,但是没有返回数据
 | 
			
		||||
     */
 | 
			
		||||
    int NO_CONTENT = 204;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 资源已被移除
 | 
			
		||||
     */
 | 
			
		||||
    int MOVED_PERM = 301;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 重定向
 | 
			
		||||
     */
 | 
			
		||||
    int SEE_OTHER = 303;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 资源没有被修改
 | 
			
		||||
     */
 | 
			
		||||
    int NOT_MODIFIED = 304;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 参数列表错误(缺少,格式不匹配)
 | 
			
		||||
     */
 | 
			
		||||
    int BAD_REQUEST = 400;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 未授权
 | 
			
		||||
     */
 | 
			
		||||
    int UNAUTHORIZED = 401;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 访问受限,授权过期
 | 
			
		||||
     */
 | 
			
		||||
    int FORBIDDEN = 403;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 资源,服务未找到
 | 
			
		||||
     */
 | 
			
		||||
    int NOT_FOUND = 404;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 不允许的http方法
 | 
			
		||||
     */
 | 
			
		||||
    int BAD_METHOD = 405;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 资源冲突,或者资源被锁
 | 
			
		||||
     */
 | 
			
		||||
    int CONFLICT = 409;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 不支持的数据,媒体类型
 | 
			
		||||
     */
 | 
			
		||||
    int UNSUPPORTED_TYPE = 415;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 系统内部错误
 | 
			
		||||
     */
 | 
			
		||||
    int ERROR = 500;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 接口未实现
 | 
			
		||||
     */
 | 
			
		||||
    int NOT_IMPLEMENTED = 501;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 系统警告消息
 | 
			
		||||
     */
 | 
			
		||||
    int WARN = 601;
 | 
			
		||||
}
 | 
			
		||||
@@ -2,6 +2,8 @@ package com.ruoyi.common.core.domain;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.FieldFill;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableField;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonIgnore;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonInclude;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
@@ -23,6 +25,7 @@ public class BaseEntity implements Serializable {
 | 
			
		||||
    /**
 | 
			
		||||
     * 搜索值
 | 
			
		||||
     */
 | 
			
		||||
    @JsonIgnore
 | 
			
		||||
    @TableField(exist = false)
 | 
			
		||||
    private String searchValue;
 | 
			
		||||
 | 
			
		||||
@@ -53,6 +56,7 @@ public class BaseEntity implements Serializable {
 | 
			
		||||
    /**
 | 
			
		||||
     * 请求参数
 | 
			
		||||
     */
 | 
			
		||||
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
 | 
			
		||||
    @TableField(exist = false)
 | 
			
		||||
    private Map<String, Object> params = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package com.ruoyi.common.core.domain;
 | 
			
		||||
 | 
			
		||||
import com.ruoyi.common.constant.HttpStatus;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
@@ -67,6 +68,27 @@ public class R<T> implements Serializable {
 | 
			
		||||
        return restResult(null, code, msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 返回警告消息
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg 返回内容
 | 
			
		||||
     * @return 警告消息
 | 
			
		||||
     */
 | 
			
		||||
    public static <T> R<T> warn(String msg) {
 | 
			
		||||
        return restResult(null, HttpStatus.WARN, msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 返回警告消息
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg 返回内容
 | 
			
		||||
     * @param data 数据对象
 | 
			
		||||
     * @return 警告消息
 | 
			
		||||
     */
 | 
			
		||||
    public static <T> R<T> warn(String msg, T data) {
 | 
			
		||||
        return restResult(data, HttpStatus.WARN, msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static <T> R<T> restResult(T data, int code, String msg) {
 | 
			
		||||
        R<T> r = new R<>();
 | 
			
		||||
        r.setCode(code);
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@ import java.io.BufferedReader;
 | 
			
		||||
import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 构建可重复读取inputStream的request
 | 
			
		||||
@@ -27,7 +26,7 @@ public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {
 | 
			
		||||
        request.setCharacterEncoding(Constants.UTF8);
 | 
			
		||||
        response.setCharacterEncoding(Constants.UTF8);
 | 
			
		||||
 | 
			
		||||
        body = IoUtil.readUtf8(request.getInputStream()).getBytes(StandardCharsets.UTF_8);
 | 
			
		||||
        body = IoUtil.readBytes(request.getInputStream(), false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package com.ruoyi.common.filter;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.io.IoUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.hutool.http.HtmlUtil;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import org.springframework.http.HttpHeaders;
 | 
			
		||||
@@ -50,7 +51,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 为空,直接返回
 | 
			
		||||
        String json = IoUtil.read(super.getInputStream(), StandardCharsets.UTF_8);
 | 
			
		||||
        String json = StrUtil.str(IoUtil.readBytes(super.getInputStream(), false), StandardCharsets.UTF_8);
 | 
			
		||||
        if (StringUtils.isEmpty(json)) {
 | 
			
		||||
            return super.getInputStream();
 | 
			
		||||
        }
 | 
			
		||||
@@ -88,7 +89,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否是Json请求
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isJsonRequest() {
 | 
			
		||||
        String header = super.getHeader(HttpHeaders.CONTENT_TYPE);
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package com.ruoyi.common.helper;
 | 
			
		||||
 | 
			
		||||
import cn.dev33.satoken.context.SaHolder;
 | 
			
		||||
import cn.dev33.satoken.stp.StpUtil;
 | 
			
		||||
import cn.hutool.core.util.ArrayUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.ruoyi.common.constant.UserConstants;
 | 
			
		||||
import com.ruoyi.common.core.domain.model.LoginUser;
 | 
			
		||||
@@ -80,18 +81,12 @@ public class LoginHelper {
 | 
			
		||||
        LoginUser loginUser = getLoginUser();
 | 
			
		||||
        if (ObjectUtil.isNull(loginUser)) {
 | 
			
		||||
            String loginId = StpUtil.getLoginIdAsString();
 | 
			
		||||
            String userId = null;
 | 
			
		||||
            for (UserType value : UserType.values()) {
 | 
			
		||||
                if (StringUtils.contains(loginId, value.getUserType())) {
 | 
			
		||||
                    String[] strs = StringUtils.split(loginId, JOIN_CODE);
 | 
			
		||||
                    // 用户id在总是在最后
 | 
			
		||||
                    userId = strs[strs.length - 1];
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (StringUtils.isBlank(userId)) {
 | 
			
		||||
            String[] strs = StringUtils.split(loginId, JOIN_CODE);
 | 
			
		||||
            if (!ArrayUtil.containsAny(strs, UserType.values())) {
 | 
			
		||||
                throw new UtilException("登录用户: LoginId异常 => " + loginId);
 | 
			
		||||
            }
 | 
			
		||||
            return Long.parseLong(userId);
 | 
			
		||||
            // 用户id在总是在最后
 | 
			
		||||
            return Long.parseLong(strs[strs.length - 1]);
 | 
			
		||||
        }
 | 
			
		||||
        return loginUser.getUserId();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,56 @@
 | 
			
		||||
package com.ruoyi.common.jackson;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.fasterxml.jackson.core.JsonGenerator;
 | 
			
		||||
import com.fasterxml.jackson.databind.BeanProperty;
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonMappingException;
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonSerializer;
 | 
			
		||||
import com.fasterxml.jackson.databind.SerializerProvider;
 | 
			
		||||
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
 | 
			
		||||
import com.ruoyi.common.annotation.DictDataMapper;
 | 
			
		||||
import com.ruoyi.common.core.service.DictService;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.common.utils.spring.SpringUtils;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.BeansException;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 字典数据json序列化工具
 | 
			
		||||
 *
 | 
			
		||||
 * @author itino
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class DictDataJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
 | 
			
		||||
 | 
			
		||||
    private String dictType;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
 | 
			
		||||
        try {
 | 
			
		||||
            DictService dictService = SpringUtils.getBean(DictService.class);
 | 
			
		||||
            if (ObjectUtil.isNotNull(dictService)) {
 | 
			
		||||
                String label = dictService.getDictLabel(dictType, value);
 | 
			
		||||
                gen.writeString(StringUtils.isNotBlank(label) ? label : value);
 | 
			
		||||
            } else {
 | 
			
		||||
                gen.writeString(value);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (BeansException e) {
 | 
			
		||||
            log.error("字典数据未查到, 采用默认处理 => {}", e.getMessage());
 | 
			
		||||
            gen.writeString(value);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
 | 
			
		||||
        DictDataMapper anno = property.getAnnotation(DictDataMapper.class);
 | 
			
		||||
        if (Objects.nonNull(anno) && StrUtil.isNotBlank(anno.dictType())) {
 | 
			
		||||
            this.dictType = anno.dictType();
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        return prov.findValueSerializer(property.getType(), property);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -11,6 +11,7 @@ import org.springframework.web.context.request.RequestAttributes;
 | 
			
		||||
import org.springframework.web.context.request.RequestContextHolder;
 | 
			
		||||
import org.springframework.web.context.request.ServletRequestAttributes;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.ServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import javax.servlet.http.HttpSession;
 | 
			
		||||
@@ -19,6 +20,9 @@ import java.io.UnsupportedEncodingException;
 | 
			
		||||
import java.net.URLDecoder;
 | 
			
		||||
import java.net.URLEncoder;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 客户端工具类
 | 
			
		||||
@@ -70,6 +74,31 @@ public class ServletUtils extends ServletUtil {
 | 
			
		||||
        return Convert.toBool(getRequest().getParameter(name), defaultValue);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得所有请求参数
 | 
			
		||||
     *
 | 
			
		||||
     * @param request 请求对象{@link ServletRequest}
 | 
			
		||||
     * @return Map
 | 
			
		||||
     */
 | 
			
		||||
    public static Map<String, String[]> getParams(ServletRequest request) {
 | 
			
		||||
        final Map<String, String[]> map = request.getParameterMap();
 | 
			
		||||
        return Collections.unmodifiableMap(map);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得所有请求参数
 | 
			
		||||
     *
 | 
			
		||||
     * @param request 请求对象{@link ServletRequest}
 | 
			
		||||
     * @return Map
 | 
			
		||||
     */
 | 
			
		||||
    public static Map<String, String> getParamMap(ServletRequest request) {
 | 
			
		||||
        Map<String, String> params = new HashMap<>();
 | 
			
		||||
        for (Map.Entry<String, String[]> entry : getParams(request).entrySet()) {
 | 
			
		||||
            params.put(entry.getKey(), StringUtils.join(entry.getValue(), ","));
 | 
			
		||||
        }
 | 
			
		||||
        return params;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取request
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -327,6 +327,17 @@ public class RedisUtils {
 | 
			
		||||
        return rMap.getAll(rMap.keySet());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得缓存Map的key列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param key 缓存的键值
 | 
			
		||||
     * @return key列表
 | 
			
		||||
     */
 | 
			
		||||
    public static <T> Set<String> getCacheMapKeySet(final String key) {
 | 
			
		||||
        RMap<String, T> rMap = CLIENT.getMap(key);
 | 
			
		||||
        return rMap.keySet();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 往Hash中存入数据
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ public class TestBatchController extends BaseController {
 | 
			
		||||
            testDemo.setValue("测试新增");
 | 
			
		||||
            list.add(testDemo);
 | 
			
		||||
        }
 | 
			
		||||
        return toAjax(testDemoMapper.insertBatch(list) ? 1 : 0);
 | 
			
		||||
        return toAjax(testDemoMapper.insertBatch(list));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -74,7 +74,7 @@ public class TestBatchController extends BaseController {
 | 
			
		||||
                testDemo.setId(null);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return toAjax(testDemoMapper.insertOrUpdateBatch(list) ? 1 : 0);
 | 
			
		||||
        return toAjax(testDemoMapper.insertOrUpdateBatch(list));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -119,7 +119,7 @@ public class TestDemoController extends BaseController {
 | 
			
		||||
        // 使用校验工具对标 @Validated(AddGroup.class) 注解
 | 
			
		||||
        // 用于在非 Controller 的地方校验对象
 | 
			
		||||
        ValidatorUtils.validate(bo, AddGroup.class);
 | 
			
		||||
        return toAjax(iTestDemoService.insertByBo(bo) ? 1 : 0);
 | 
			
		||||
        return toAjax(iTestDemoService.insertByBo(bo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -130,7 +130,7 @@ public class TestDemoController extends BaseController {
 | 
			
		||||
    @RepeatSubmit
 | 
			
		||||
    @PutMapping()
 | 
			
		||||
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) {
 | 
			
		||||
        return toAjax(iTestDemoService.updateByBo(bo) ? 1 : 0);
 | 
			
		||||
        return toAjax(iTestDemoService.updateByBo(bo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -143,6 +143,6 @@ public class TestDemoController extends BaseController {
 | 
			
		||||
    @DeleteMapping("/{ids}")
 | 
			
		||||
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
 | 
			
		||||
                          @PathVariable Long[] ids) {
 | 
			
		||||
        return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
 | 
			
		||||
        return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,7 @@ public class TestTreeController extends BaseController {
 | 
			
		||||
    @RepeatSubmit
 | 
			
		||||
    @PostMapping()
 | 
			
		||||
    public R<Void> add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) {
 | 
			
		||||
        return toAjax(iTestTreeService.insertByBo(bo) ? 1 : 0);
 | 
			
		||||
        return toAjax(iTestTreeService.insertByBo(bo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -89,7 +89,7 @@ public class TestTreeController extends BaseController {
 | 
			
		||||
    @RepeatSubmit
 | 
			
		||||
    @PutMapping()
 | 
			
		||||
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) {
 | 
			
		||||
        return toAjax(iTestTreeService.updateByBo(bo) ? 1 : 0);
 | 
			
		||||
        return toAjax(iTestTreeService.updateByBo(bo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -102,6 +102,6 @@ public class TestTreeController extends BaseController {
 | 
			
		||||
    @DeleteMapping("/{ids}")
 | 
			
		||||
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
 | 
			
		||||
                          @PathVariable Long[] ids) {
 | 
			
		||||
        return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
 | 
			
		||||
        return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@ import org.aspectj.lang.annotation.Aspect;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.springframework.validation.BindingResult;
 | 
			
		||||
import org.springframework.web.multipart.MultipartFile;
 | 
			
		||||
import org.springframework.web.servlet.HandlerMapping;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
@@ -92,7 +91,6 @@ public class LogAspect {
 | 
			
		||||
            SpringUtils.getBean(OperLogService.class).recordOper(operLog);
 | 
			
		||||
        } catch (Exception exp) {
 | 
			
		||||
            // 记录本地异常日志
 | 
			
		||||
            log.error("==前置通知异常==");
 | 
			
		||||
            log.error("异常信息:{}", exp.getMessage());
 | 
			
		||||
            exp.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
@@ -135,8 +133,9 @@ public class LogAspect {
 | 
			
		||||
            String params = argsArrayToString(joinPoint.getArgs());
 | 
			
		||||
            operLog.setOperParam(StringUtils.substring(params, 0, 2000));
 | 
			
		||||
        } else {
 | 
			
		||||
            Map<?, ?> paramsMap = (Map<?, ?>) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
 | 
			
		||||
            operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000));
 | 
			
		||||
            Map<String, String> paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest());
 | 
			
		||||
            MapUtil.removeAny(paramsMap, EXCLUDE_PROPERTIES);
 | 
			
		||||
            operLog.setOperParam(StringUtils.substring(JsonUtils.toJsonString(paramsMap), 0, 2000));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,63 +0,0 @@
 | 
			
		||||
package com.ruoyi.framework.config;
 | 
			
		||||
 | 
			
		||||
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
 | 
			
		||||
import com.alibaba.druid.util.Utils;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.*;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * druid 配置多数据源
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
public class DruidConfig {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 去除监控页面底部的广告
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings({"rawtypes", "unchecked"})
 | 
			
		||||
    @Bean
 | 
			
		||||
    @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
 | 
			
		||||
    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) {
 | 
			
		||||
        // 获取web监控页面的参数
 | 
			
		||||
        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
 | 
			
		||||
        // 提取common.js的配置路径
 | 
			
		||||
        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
 | 
			
		||||
        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
 | 
			
		||||
        final String filePath = "support/http/resources/js/common.js";
 | 
			
		||||
        // 创建filter进行过滤
 | 
			
		||||
        Filter filter = new Filter() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 | 
			
		||||
                throws IOException, ServletException {
 | 
			
		||||
                chain.doFilter(request, response);
 | 
			
		||||
                // 重置缓冲区,响应头不会被重置
 | 
			
		||||
//                response.resetBuffer();
 | 
			
		||||
                // 获取common.js
 | 
			
		||||
                String text = Utils.readFromResource(filePath);
 | 
			
		||||
                // 正则替换banner, 除去底部的广告信息
 | 
			
		||||
                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
 | 
			
		||||
                text = text.replaceAll("powered.*?shrek.wang</a>", "");
 | 
			
		||||
                response.getWriter().write(text);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void destroy() {
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
 | 
			
		||||
        registrationBean.setFilter(filter);
 | 
			
		||||
        registrationBean.addUrlPatterns(commonJsPattern);
 | 
			
		||||
        return registrationBean;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +1,8 @@
 | 
			
		||||
package com.ruoyi.framework.config;
 | 
			
		||||
 | 
			
		||||
import com.ruoyi.framework.interceptor.PlusWebInvokeTimeInterceptor;
 | 
			
		||||
import com.yomahub.tlog.web.interceptor.TLogWebInterceptor;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.http.CacheControl;
 | 
			
		||||
import org.springframework.web.cors.CorsConfiguration;
 | 
			
		||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 | 
			
		||||
import org.springframework.web.filter.CorsFilter;
 | 
			
		||||
@@ -22,8 +20,6 @@ public class ResourcesConfig implements WebMvcConfigurer {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void addInterceptors(InterceptorRegistry registry) {
 | 
			
		||||
        // 全局链路跟踪拦截器
 | 
			
		||||
        registry.addInterceptor(new TLogWebInterceptor());
 | 
			
		||||
        // 全局访问性能拦截
 | 
			
		||||
        registry.addInterceptor(new PlusWebInvokeTimeInterceptor());
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,6 @@ import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
 | 
			
		||||
import cn.dev33.satoken.router.SaRouter;
 | 
			
		||||
import cn.dev33.satoken.stp.StpLogic;
 | 
			
		||||
import cn.dev33.satoken.stp.StpUtil;
 | 
			
		||||
import com.ruoyi.common.utils.spring.SpringUtils;
 | 
			
		||||
import com.ruoyi.framework.config.properties.ExcludeUrlProperties;
 | 
			
		||||
import com.ruoyi.framework.config.properties.SecurityProperties;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
@@ -34,14 +32,10 @@ public class SaTokenConfig implements WebMvcConfigurer {
 | 
			
		||||
    public void addInterceptors(InterceptorRegistry registry) {
 | 
			
		||||
        // 注册路由拦截器,自定义验证规则
 | 
			
		||||
        registry.addInterceptor(new SaInterceptor(handler -> {
 | 
			
		||||
            // 自定义注解 @Anonymous 匿名访问配置,后续版本将删除
 | 
			
		||||
            ExcludeUrlProperties excludeUrlProperties = SpringUtils.getBean(ExcludeUrlProperties.class);
 | 
			
		||||
            // 登录验证 -- 排除多个路径
 | 
			
		||||
            SaRouter
 | 
			
		||||
                // 获取所有的
 | 
			
		||||
                .match("/**")
 | 
			
		||||
                // 排除下不需要拦截的(每次匹配)
 | 
			
		||||
                .notMatch(excludeUrlProperties.getExcludes())
 | 
			
		||||
                // 对未排除的路径进行检查
 | 
			
		||||
                .check(() -> {
 | 
			
		||||
                    // 检查是否登录 是否有token
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
package com.ruoyi.framework.config;
 | 
			
		||||
 | 
			
		||||
import com.yomahub.tlog.springboot.TLogWebAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 整合 TLog 框架配置
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 * @since 3.3.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
// 排除 web 自动配置 自定义实现
 | 
			
		||||
@EnableAutoConfiguration(exclude = TLogWebAutoConfiguration.class)
 | 
			
		||||
public class TLogConfig {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,69 +0,0 @@
 | 
			
		||||
package com.ruoyi.framework.config.properties;
 | 
			
		||||
 | 
			
		||||
import cn.dev33.satoken.annotation.SaIgnore;
 | 
			
		||||
import cn.dev33.satoken.interceptor.SaInterceptor;
 | 
			
		||||
import cn.hutool.core.util.ReUtil;
 | 
			
		||||
import com.ruoyi.common.annotation.Anonymous;
 | 
			
		||||
import com.ruoyi.common.utils.spring.SpringUtils;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import org.springframework.beans.factory.InitializingBean;
 | 
			
		||||
import org.springframework.context.annotation.Lazy;
 | 
			
		||||
import org.springframework.core.annotation.AnnotationUtils;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.springframework.web.method.HandlerMethod;
 | 
			
		||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
 | 
			
		||||
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
 | 
			
		||||
import org.springframework.web.util.pattern.PathPattern;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 设置注解允许匿名访问的url
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 * @deprecated 将在后续版本使用Sa-Token注解 {@link SaIgnore} 代替,
 | 
			
		||||
 * 底层过滤方法详见 {@link SaInterceptor#preHandle(HttpServletRequest, HttpServletResponse, Object)}
 | 
			
		||||
 */
 | 
			
		||||
@Deprecated
 | 
			
		||||
@Lazy
 | 
			
		||||
@Component
 | 
			
		||||
public class ExcludeUrlProperties implements InitializingBean {
 | 
			
		||||
 | 
			
		||||
    private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}");
 | 
			
		||||
 | 
			
		||||
    @Getter
 | 
			
		||||
    private final List<String> excludes = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void afterPropertiesSet() {
 | 
			
		||||
        String asterisk = "*";
 | 
			
		||||
        RequestMappingHandlerMapping mapping = SpringUtils.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
 | 
			
		||||
        Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();
 | 
			
		||||
 | 
			
		||||
        map.keySet().forEach(info -> {
 | 
			
		||||
            HandlerMethod handlerMethod = map.get(info);
 | 
			
		||||
 | 
			
		||||
            // 获取方法上边的注解 替代path variable 为 *
 | 
			
		||||
            Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class);
 | 
			
		||||
            Optional.ofNullable(method).ifPresent(anonymous -> {
 | 
			
		||||
                Set<PathPattern> patterns = info.getPathPatternsCondition().getPatterns();
 | 
			
		||||
                patterns.forEach(url -> {
 | 
			
		||||
                    excludes.add(ReUtil.replaceAll(url.getPatternString(), PATTERN, asterisk));
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            // 获取类上边的注解, 替代path variable 为 *
 | 
			
		||||
            Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class);
 | 
			
		||||
            Optional.ofNullable(controller).ifPresent(anonymous -> {
 | 
			
		||||
                Set<PathPattern> patterns = info.getPathPatternsCondition().getPatterns();
 | 
			
		||||
                patterns.forEach(url -> {
 | 
			
		||||
                    excludes.add(ReUtil.replaceAll(url.getPatternString(), PATTERN, asterisk));
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -102,6 +102,20 @@ public class UserActionListener implements SaTokenListener {
 | 
			
		||||
    public void doUntieDisable(String loginType, Object loginId, String service) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 每次打开二级认证时触发
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 每次创建Session时触发
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void doCloseSafe(String loginType, String tokenValue, String service) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 每次创建Session时触发
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -105,7 +105,7 @@ public class GlobalExceptionHandler {
 | 
			
		||||
    public R<Void> handleServiceException(ServiceException e, HttpServletRequest request) {
 | 
			
		||||
        log.error(e.getMessage(), e);
 | 
			
		||||
        Integer code = e.getCode();
 | 
			
		||||
        return ObjectUtil.isNotNull(code) ? R.fail(code.intValue(), e.getMessage()) : R.fail(e.getMessage());
 | 
			
		||||
        return ObjectUtil.isNotNull(code) ? R.fail(code, e.getMessage()) : R.fail(e.getMessage());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@ import java.io.InputStreamReader;
 | 
			
		||||
import java.net.HttpURLConnection;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * XxlJob开发示例(Bean模式)
 | 
			
		||||
@@ -39,7 +38,6 @@ public class SampleService {
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < 5; i++) {
 | 
			
		||||
            XxlJobHelper.log("beat at:" + i);
 | 
			
		||||
            TimeUnit.SECONDS.sleep(2);
 | 
			
		||||
        }
 | 
			
		||||
        // default success
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ public interface OssConstant {
 | 
			
		||||
    /**
 | 
			
		||||
     * 云服务商
 | 
			
		||||
     */
 | 
			
		||||
    String[] CLOUD_SERVICE = new String[] {"aliyun", "qcloud", "qiniu"};
 | 
			
		||||
    String[] CLOUD_SERVICE = new String[] {"aliyun", "qcloud", "qiniu", "obs"};
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * https 状态
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
package com.ruoyi.oss.core;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.io.IoUtil;
 | 
			
		||||
import cn.hutool.core.util.IdUtil;
 | 
			
		||||
import com.amazonaws.ClientConfiguration;
 | 
			
		||||
import com.amazonaws.HttpMethod;
 | 
			
		||||
import com.amazonaws.Protocol;
 | 
			
		||||
import com.amazonaws.auth.AWSCredentials;
 | 
			
		||||
import com.amazonaws.auth.AWSCredentialsProvider;
 | 
			
		||||
@@ -16,12 +18,15 @@ import com.ruoyi.common.utils.DateUtils;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.oss.constant.OssConstant;
 | 
			
		||||
import com.ruoyi.oss.entity.UploadResult;
 | 
			
		||||
import com.ruoyi.oss.enumd.AccessPolicyType;
 | 
			
		||||
import com.ruoyi.oss.enumd.PolicyType;
 | 
			
		||||
import com.ruoyi.oss.exception.OssException;
 | 
			
		||||
import com.ruoyi.oss.properties.OssProperties;
 | 
			
		||||
 | 
			
		||||
import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * S3 存储协议 所有兼容S3协议的云厂商均支持
 | 
			
		||||
@@ -57,7 +62,7 @@ public class OssClient {
 | 
			
		||||
                .withClientConfiguration(clientConfig)
 | 
			
		||||
                .withCredentials(credentialsProvider)
 | 
			
		||||
                .disableChunkedEncoding();
 | 
			
		||||
            if (!StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE)){
 | 
			
		||||
            if (!StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE)) {
 | 
			
		||||
                // minio 使用https限制使用域名访问 需要此配置 站点填域名
 | 
			
		||||
                build.enablePathStyleAccess();
 | 
			
		||||
            }
 | 
			
		||||
@@ -79,9 +84,10 @@ public class OssClient {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
 | 
			
		||||
            createBucketRequest.setCannedAcl(CannedAccessControlList.PublicRead);
 | 
			
		||||
            AccessPolicyType accessPolicy = getAccessPolicy();
 | 
			
		||||
            createBucketRequest.setCannedAcl(accessPolicy.getAcl());
 | 
			
		||||
            client.createBucket(createBucketRequest);
 | 
			
		||||
            client.setBucketPolicy(bucketName, getPolicy(bucketName, PolicyType.READ));
 | 
			
		||||
            client.setBucketPolicy(bucketName, getPolicy(bucketName, accessPolicy.getPolicyType()));
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            throw new OssException("创建Bucket失败, 请核对配置信息:[" + e.getMessage() + "]");
 | 
			
		||||
        }
 | 
			
		||||
@@ -92,13 +98,16 @@ public class OssClient {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public UploadResult upload(InputStream inputStream, String path, String contentType) {
 | 
			
		||||
        if (!(inputStream instanceof ByteArrayInputStream)) {
 | 
			
		||||
            inputStream = new ByteArrayInputStream(IoUtil.readBytes(inputStream));
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            ObjectMetadata metadata = new ObjectMetadata();
 | 
			
		||||
            metadata.setContentType(contentType);
 | 
			
		||||
            metadata.setContentLength(inputStream.available());
 | 
			
		||||
            PutObjectRequest putObjectRequest = new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata);
 | 
			
		||||
            // 设置上传对象的 Acl 为公共读
 | 
			
		||||
            putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);
 | 
			
		||||
            putObjectRequest.setCannedAcl(getAccessPolicy().getAcl());
 | 
			
		||||
            client.putObject(putObjectRequest);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]");
 | 
			
		||||
@@ -111,7 +120,7 @@ public class OssClient {
 | 
			
		||||
        try {
 | 
			
		||||
            client.deleteObject(properties.getBucketName(), path);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]");
 | 
			
		||||
            throw new OssException("删除文件失败,请检查配置信息:[" + e.getMessage() + "]");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -129,16 +138,23 @@ public class OssClient {
 | 
			
		||||
     * @param path 完整文件路径
 | 
			
		||||
     */
 | 
			
		||||
    public ObjectMetadata getObjectMetadata(String path) {
 | 
			
		||||
        path = path.replace(getUrl() + "/", "");
 | 
			
		||||
        S3Object object = client.getObject(properties.getBucketName(), path);
 | 
			
		||||
        return object.getObjectMetadata();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public InputStream getObjectContent(String path) {
 | 
			
		||||
        path = path.replace(getUrl() + "/", "");
 | 
			
		||||
        S3Object object = client.getObject(properties.getBucketName(), path);
 | 
			
		||||
        return object.getObjectContent();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getUrl() {
 | 
			
		||||
        String domain = properties.getDomain();
 | 
			
		||||
        String endpoint = properties.getEndpoint();
 | 
			
		||||
        String header = OssConstant.IS_HTTPS.equals(properties.getIsHttps()) ? "https://" : "http://";
 | 
			
		||||
        // 云服务商直接返回
 | 
			
		||||
        if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)){
 | 
			
		||||
        if (StringUtils.containsAny(endpoint, OssConstant.CLOUD_SERVICE)) {
 | 
			
		||||
            if (StringUtils.isNotBlank(domain)) {
 | 
			
		||||
                return header + domain;
 | 
			
		||||
            }
 | 
			
		||||
@@ -167,6 +183,24 @@ public class OssClient {
 | 
			
		||||
        return configKey;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getPrivateUrl(String objectKey, Integer second) {
 | 
			
		||||
        GeneratePresignedUrlRequest generatePresignedUrlRequest =
 | 
			
		||||
            new GeneratePresignedUrlRequest(properties.getBucketName(), objectKey)
 | 
			
		||||
                .withMethod(HttpMethod.GET)
 | 
			
		||||
                .withExpiration(new Date(System.currentTimeMillis() + 1000L * second));
 | 
			
		||||
        URL url = client.generatePresignedUrl(generatePresignedUrlRequest);
 | 
			
		||||
        return url.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取当前桶权限类型
 | 
			
		||||
     *
 | 
			
		||||
     * @return 当前桶权限类型code
 | 
			
		||||
     */
 | 
			
		||||
    public AccessPolicyType getAccessPolicy() {
 | 
			
		||||
        return AccessPolicyType.getByType(properties.getAccessPolicy());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static String getPolicy(String bucketName, PolicyType policyType) {
 | 
			
		||||
        StringBuilder builder = new StringBuilder();
 | 
			
		||||
        builder.append("{\n\"Statement\": [\n{\n\"Action\": [\n");
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,55 @@
 | 
			
		||||
package com.ruoyi.oss.enumd;
 | 
			
		||||
 | 
			
		||||
import com.amazonaws.services.s3.model.CannedAccessControlList;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 桶访问策略配置
 | 
			
		||||
 *
 | 
			
		||||
 * @author 陈賝
 | 
			
		||||
 */
 | 
			
		||||
@Getter
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
public enum AccessPolicyType {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * private
 | 
			
		||||
     */
 | 
			
		||||
    PRIVATE("0", CannedAccessControlList.Private, PolicyType.WRITE),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * public
 | 
			
		||||
     */
 | 
			
		||||
    PUBLIC("1", CannedAccessControlList.PublicRead, PolicyType.READ),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * custom
 | 
			
		||||
     */
 | 
			
		||||
    CUSTOM("2",CannedAccessControlList.PublicRead, PolicyType.READ);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 桶 权限类型
 | 
			
		||||
     */
 | 
			
		||||
    private final String type;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 文件对象 权限类型
 | 
			
		||||
     */
 | 
			
		||||
    private final CannedAccessControlList acl;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 桶策略类型
 | 
			
		||||
     */
 | 
			
		||||
    private final PolicyType policyType;
 | 
			
		||||
 | 
			
		||||
    public static AccessPolicyType getByType(String type) {
 | 
			
		||||
        for (AccessPolicyType value : values()) {
 | 
			
		||||
            if (value.getType().equals(type)) {
 | 
			
		||||
                return value;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        throw new RuntimeException("'type' not found By " + type);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -50,4 +50,9 @@ public class OssProperties {
 | 
			
		||||
     */
 | 
			
		||||
    private String isHttps;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 桶权限类型(0private 1public 2custom)
 | 
			
		||||
     */
 | 
			
		||||
    private String accessPolicy;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -82,4 +82,8 @@ public class SysOssConfig extends BaseEntity {
 | 
			
		||||
     */
 | 
			
		||||
    private String remark;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 桶权限类型(0private 1public 2custom)
 | 
			
		||||
     */
 | 
			
		||||
    private String accessPolicy;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -98,4 +98,10 @@ public class SysOssConfigBo extends BaseEntity {
 | 
			
		||||
     */
 | 
			
		||||
    private String remark;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 桶权限类型(0private 1public 2custom)
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "桶权限类型不能为空", groups = {AddGroup.class, EditGroup.class})
 | 
			
		||||
    private String accessPolicy;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -82,4 +82,9 @@ public class SysOssConfigVo {
 | 
			
		||||
     */
 | 
			
		||||
    private String remark;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 桶权限类型(0private 1public 2custom)
 | 
			
		||||
     */
 | 
			
		||||
    private String accessPolicy;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,8 @@ import com.ruoyi.system.domain.bo.SysOssBo;
 | 
			
		||||
import com.ruoyi.system.domain.vo.SysOssVo;
 | 
			
		||||
import org.springframework.web.multipart.MultipartFile;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@@ -23,7 +25,9 @@ public interface ISysOssService {
 | 
			
		||||
 | 
			
		||||
    SysOssVo getById(Long ossId);
 | 
			
		||||
 | 
			
		||||
    SysOss upload(MultipartFile file);
 | 
			
		||||
    SysOssVo upload(MultipartFile file);
 | 
			
		||||
 | 
			
		||||
    void download(Long ossId, HttpServletResponse response) throws IOException;
 | 
			
		||||
 | 
			
		||||
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -128,7 +128,7 @@ public class SysLoginService {
 | 
			
		||||
            LoginUser loginUser = LoginHelper.getLoginUser();
 | 
			
		||||
            StpUtil.logout();
 | 
			
		||||
            asyncService.recordLogininfor(loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"), ServletUtils.getRequest());
 | 
			
		||||
        } catch (NotLoginException e) {
 | 
			
		||||
        } catch (NotLoginException ignored) {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,12 @@
 | 
			
		||||
package com.ruoyi.system.service.impl;
 | 
			
		||||
 | 
			
		||||
import cn.dev33.satoken.context.SaHolder;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.ruoyi.common.constant.CacheConstants;
 | 
			
		||||
import com.ruoyi.common.constant.CacheNames;
 | 
			
		||||
import com.ruoyi.common.constant.UserConstants;
 | 
			
		||||
import com.ruoyi.common.core.domain.PageQuery;
 | 
			
		||||
@@ -27,6 +29,7 @@ import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 字典 业务层处理
 | 
			
		||||
@@ -231,28 +234,24 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
 | 
			
		||||
     * @param separator 分隔符
 | 
			
		||||
     * @return 字典标签
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked cast")
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getDictLabel(String dictType, String dictValue, String separator) {
 | 
			
		||||
        StringBuilder propertyString = new StringBuilder();
 | 
			
		||||
        List<SysDictData> datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
 | 
			
		||||
 | 
			
		||||
        if (StringUtils.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas)) {
 | 
			
		||||
            for (SysDictData dict : datas) {
 | 
			
		||||
                for (String value : dictValue.split(separator)) {
 | 
			
		||||
                    if (value.equals(dict.getDictValue())) {
 | 
			
		||||
                        propertyString.append(dict.getDictLabel() + separator);
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            for (SysDictData dict : datas) {
 | 
			
		||||
                if (dictValue.equals(dict.getDictValue())) {
 | 
			
		||||
                    return dict.getDictLabel();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        // 优先从本地缓存获取
 | 
			
		||||
        List<SysDictData> datas = (List<SysDictData>) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType);
 | 
			
		||||
        if (ObjectUtil.isNull(datas)) {
 | 
			
		||||
            datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
 | 
			
		||||
            SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Map<String, String> map = StreamUtils.toMap(datas, SysDictData::getDictValue, SysDictData::getDictLabel);
 | 
			
		||||
        if (StringUtils.containsAny(dictValue, separator)) {
 | 
			
		||||
            return Arrays.stream(dictValue.split(separator))
 | 
			
		||||
                .map(v -> map.getOrDefault(v, StringUtils.EMPTY))
 | 
			
		||||
                .collect(Collectors.joining(separator));
 | 
			
		||||
        } else {
 | 
			
		||||
            return map.getOrDefault(dictValue, StringUtils.EMPTY);
 | 
			
		||||
        }
 | 
			
		||||
        return StringUtils.stripEnd(propertyString.toString(), separator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -263,28 +262,24 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
 | 
			
		||||
     * @param separator 分隔符
 | 
			
		||||
     * @return 字典值
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked cast")
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getDictValue(String dictType, String dictLabel, String separator) {
 | 
			
		||||
        StringBuilder propertyString = new StringBuilder();
 | 
			
		||||
        List<SysDictData> datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
 | 
			
		||||
 | 
			
		||||
        if (StringUtils.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas)) {
 | 
			
		||||
            for (SysDictData dict : datas) {
 | 
			
		||||
                for (String label : dictLabel.split(separator)) {
 | 
			
		||||
                    if (label.equals(dict.getDictLabel())) {
 | 
			
		||||
                        propertyString.append(dict.getDictValue() + separator);
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            for (SysDictData dict : datas) {
 | 
			
		||||
                if (dictLabel.equals(dict.getDictLabel())) {
 | 
			
		||||
                    return dict.getDictValue();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        // 优先从本地缓存获取
 | 
			
		||||
        List<SysDictData> datas = (List<SysDictData>) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType);
 | 
			
		||||
        if (ObjectUtil.isNull(datas)) {
 | 
			
		||||
            datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
 | 
			
		||||
            SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Map<String, String> map = StreamUtils.toMap(datas, SysDictData::getDictLabel, SysDictData::getDictValue);
 | 
			
		||||
        if (StringUtils.containsAny(dictLabel, separator)) {
 | 
			
		||||
            return Arrays.stream(dictLabel.split(separator))
 | 
			
		||||
                .map(l -> map.getOrDefault(l, StringUtils.EMPTY))
 | 
			
		||||
                .collect(Collectors.joining(separator));
 | 
			
		||||
        } else {
 | 
			
		||||
            return map.getOrDefault(dictLabel, StringUtils.EMPTY);
 | 
			
		||||
        }
 | 
			
		||||
        return StringUtils.stripEnd(propertyString.toString(), separator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import com.ruoyi.common.constant.UserConstants;
 | 
			
		||||
import com.ruoyi.common.core.domain.entity.SysMenu;
 | 
			
		||||
import com.ruoyi.common.core.domain.entity.SysRole;
 | 
			
		||||
import com.ruoyi.common.helper.LoginHelper;
 | 
			
		||||
import com.ruoyi.common.utils.StreamUtils;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.common.utils.TreeBuildUtils;
 | 
			
		||||
import com.ruoyi.system.domain.SysRoleMenu;
 | 
			
		||||
@@ -425,13 +426,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
 | 
			
		||||
     * 得到子节点列表
 | 
			
		||||
     */
 | 
			
		||||
    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
 | 
			
		||||
        List<SysMenu> tlist = new ArrayList<SysMenu>();
 | 
			
		||||
        for (SysMenu n : list) {
 | 
			
		||||
            if (n.getParentId().longValue() == t.getMenuId().longValue()) {
 | 
			
		||||
                tlist.add(n);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return tlist;
 | 
			
		||||
        return StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package com.ruoyi.system.service.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.io.IoUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
@@ -8,10 +9,13 @@ import com.ruoyi.common.constant.CacheNames;
 | 
			
		||||
import com.ruoyi.common.core.domain.PageQuery;
 | 
			
		||||
import com.ruoyi.common.core.page.TableDataInfo;
 | 
			
		||||
import com.ruoyi.common.exception.ServiceException;
 | 
			
		||||
import com.ruoyi.common.utils.BeanCopyUtils;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.common.utils.file.FileUtils;
 | 
			
		||||
import com.ruoyi.common.utils.spring.SpringUtils;
 | 
			
		||||
import com.ruoyi.oss.core.OssClient;
 | 
			
		||||
import com.ruoyi.oss.entity.UploadResult;
 | 
			
		||||
import com.ruoyi.oss.enumd.AccessPolicyType;
 | 
			
		||||
import com.ruoyi.oss.factory.OssFactory;
 | 
			
		||||
import com.ruoyi.system.domain.SysOss;
 | 
			
		||||
import com.ruoyi.system.domain.bo.SysOssBo;
 | 
			
		||||
@@ -20,14 +24,18 @@ import com.ruoyi.system.mapper.SysOssMapper;
 | 
			
		||||
import com.ruoyi.system.service.ISysOssService;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import org.springframework.cache.annotation.Cacheable;
 | 
			
		||||
import org.springframework.http.MediaType;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.web.multipart.MultipartFile;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 文件上传 服务层实现
 | 
			
		||||
@@ -44,6 +52,8 @@ public class SysOssServiceImpl implements ISysOssService {
 | 
			
		||||
    public TableDataInfo<SysOssVo> queryPageList(SysOssBo bo, PageQuery pageQuery) {
 | 
			
		||||
        LambdaQueryWrapper<SysOss> lqw = buildQueryWrapper(bo);
 | 
			
		||||
        Page<SysOssVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
 | 
			
		||||
        List<SysOssVo> filterResult = result.getRecords().stream().map(this::matchingUrl).collect(Collectors.toList());
 | 
			
		||||
        result.setRecords(filterResult);
 | 
			
		||||
        return TableDataInfo.build(result);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -53,7 +63,7 @@ public class SysOssServiceImpl implements ISysOssService {
 | 
			
		||||
        for (Long id : ossIds) {
 | 
			
		||||
            SysOssVo vo = SpringUtils.getAopProxy(this).getById(id);
 | 
			
		||||
            if (ObjectUtil.isNotNull(vo)) {
 | 
			
		||||
                list.add(vo);
 | 
			
		||||
                list.add(this.matchingUrl(vo));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return list;
 | 
			
		||||
@@ -80,7 +90,25 @@ public class SysOssServiceImpl implements ISysOssService {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public SysOss upload(MultipartFile file) {
 | 
			
		||||
    public void download(Long ossId, HttpServletResponse response) throws IOException {
 | 
			
		||||
        SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId);
 | 
			
		||||
        if (ObjectUtil.isNull(sysOss)) {
 | 
			
		||||
            throw new ServiceException("文件数据不存在!");
 | 
			
		||||
        }
 | 
			
		||||
        FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
 | 
			
		||||
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
 | 
			
		||||
        OssClient storage = OssFactory.instance();
 | 
			
		||||
        try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) {
 | 
			
		||||
            int available = inputStream.available();
 | 
			
		||||
            IoUtil.copy(inputStream, response.getOutputStream(), available);
 | 
			
		||||
            response.setContentLength(available);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            throw new ServiceException(e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public SysOssVo upload(MultipartFile file) {
 | 
			
		||||
        String originalfileName = file.getOriginalFilename();
 | 
			
		||||
        String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
 | 
			
		||||
        OssClient storage = OssFactory.instance();
 | 
			
		||||
@@ -98,7 +126,9 @@ public class SysOssServiceImpl implements ISysOssService {
 | 
			
		||||
        oss.setOriginalName(originalfileName);
 | 
			
		||||
        oss.setService(storage.getConfigKey());
 | 
			
		||||
        baseMapper.insert(oss);
 | 
			
		||||
        return oss;
 | 
			
		||||
        SysOssVo sysOssVo = new SysOssVo();
 | 
			
		||||
        BeanCopyUtils.copy(oss, sysOssVo);
 | 
			
		||||
        return this.matchingUrl(sysOssVo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -114,4 +144,18 @@ public class SysOssServiceImpl implements ISysOssService {
 | 
			
		||||
        return baseMapper.deleteBatchIds(ids) > 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 匹配Url
 | 
			
		||||
     *
 | 
			
		||||
     * @param oss OSS对象
 | 
			
		||||
     * @return oss 匹配Url的OSS对象
 | 
			
		||||
     */
 | 
			
		||||
    private SysOssVo matchingUrl(SysOssVo oss) {
 | 
			
		||||
        OssClient storage = OssFactory.instance(oss.getService());
 | 
			
		||||
        // 仅修改桶类型为 private 的URL,临时URL时长为120s
 | 
			
		||||
        if (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) {
 | 
			
		||||
            oss.setUrl(storage.getPrivateUrl(oss.getFileName(), 120));
 | 
			
		||||
        }
 | 
			
		||||
        return oss;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ public class SysUserOnlineController extends BaseController {
 | 
			
		||||
    @GetMapping("/list")
 | 
			
		||||
    public TableDataInfo<SysUserOnline> list(String ipaddr, String userName) {
 | 
			
		||||
        // 获取所有未过期的 token
 | 
			
		||||
        List<String> keys = StpUtil.searchTokenValue("", -1, 0, false);
 | 
			
		||||
        List<String> keys = StpUtil.searchTokenValue("", 0, -1, false);
 | 
			
		||||
        List<UserOnlineDTO> userOnlineDTOList = new ArrayList<>();
 | 
			
		||||
        for (String key : keys) {
 | 
			
		||||
            String token = key.replace(CacheConstants.LOGIN_TOKEN_KEY, "");
 | 
			
		||||
@@ -83,7 +83,7 @@ public class SysUserOnlineController extends BaseController {
 | 
			
		||||
    public R<Void> forceLogout(@PathVariable String tokenId) {
 | 
			
		||||
        try {
 | 
			
		||||
            StpUtil.kickoutByTokenValue(tokenId);
 | 
			
		||||
        } catch (NotLoginException e) {
 | 
			
		||||
        } catch (NotLoginException ignored) {
 | 
			
		||||
        }
 | 
			
		||||
        return R.ok();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -108,10 +108,10 @@ public class SysDeptController extends BaseController {
 | 
			
		||||
    @DeleteMapping("/{deptId}")
 | 
			
		||||
    public R<Void> remove(@PathVariable Long deptId) {
 | 
			
		||||
        if (deptService.hasChildByDeptId(deptId)) {
 | 
			
		||||
            return R.fail("存在下级部门,不允许删除");
 | 
			
		||||
            return R.warn("存在下级部门,不允许删除");
 | 
			
		||||
        }
 | 
			
		||||
        if (deptService.checkDeptExistUser(deptId)) {
 | 
			
		||||
            return R.fail("部门存在用户,不允许删除");
 | 
			
		||||
            return R.warn("部门存在用户,不允许删除");
 | 
			
		||||
        }
 | 
			
		||||
        deptService.checkDeptDataScope(deptId);
 | 
			
		||||
        return toAjax(deptService.deleteDeptById(deptId));
 | 
			
		||||
 
 | 
			
		||||
@@ -117,10 +117,10 @@ public class SysMenuController extends BaseController {
 | 
			
		||||
    @DeleteMapping("/{menuId}")
 | 
			
		||||
    public R<Void> remove(@PathVariable("menuId") Long menuId) {
 | 
			
		||||
        if (menuService.hasChildByMenuId(menuId)) {
 | 
			
		||||
            return R.fail("存在子菜单,不允许删除");
 | 
			
		||||
            return R.warn("存在子菜单,不允许删除");
 | 
			
		||||
        }
 | 
			
		||||
        if (menuService.checkMenuExistRole(menuId)) {
 | 
			
		||||
            return R.fail("菜单已分配,不允许删除");
 | 
			
		||||
            return R.warn("菜单已分配,不允许删除");
 | 
			
		||||
        }
 | 
			
		||||
        return toAjax(menuService.deleteMenuById(menuId));
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,7 @@ public class SysOssConfigController extends BaseController {
 | 
			
		||||
    @RepeatSubmit()
 | 
			
		||||
    @PostMapping()
 | 
			
		||||
    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) {
 | 
			
		||||
        return toAjax(iSysOssConfigService.insertByBo(bo) ? 1 : 0);
 | 
			
		||||
        return toAjax(iSysOssConfigService.insertByBo(bo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -77,7 +77,7 @@ public class SysOssConfigController extends BaseController {
 | 
			
		||||
    @RepeatSubmit()
 | 
			
		||||
    @PutMapping()
 | 
			
		||||
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) {
 | 
			
		||||
        return toAjax(iSysOssConfigService.updateByBo(bo) ? 1 : 0);
 | 
			
		||||
        return toAjax(iSysOssConfigService.updateByBo(bo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -90,7 +90,7 @@ public class SysOssConfigController extends BaseController {
 | 
			
		||||
    @DeleteMapping("/{ossConfigIds}")
 | 
			
		||||
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
 | 
			
		||||
                          @PathVariable Long[] ossConfigIds) {
 | 
			
		||||
        return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true) ? 1 : 0);
 | 
			
		||||
        return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,8 @@ import com.ruoyi.common.core.validate.QueryGroup;
 | 
			
		||||
import com.ruoyi.common.enums.BusinessType;
 | 
			
		||||
import com.ruoyi.common.exception.ServiceException;
 | 
			
		||||
import com.ruoyi.common.utils.file.FileUtils;
 | 
			
		||||
import com.ruoyi.oss.core.OssClient;
 | 
			
		||||
import com.ruoyi.oss.factory.OssFactory;
 | 
			
		||||
import com.ruoyi.system.domain.SysOss;
 | 
			
		||||
import com.ruoyi.system.domain.bo.SysOssBo;
 | 
			
		||||
import com.ruoyi.system.domain.vo.SysOssVo;
 | 
			
		||||
@@ -80,7 +82,7 @@ public class SysOssController extends BaseController {
 | 
			
		||||
        if (ObjectUtil.isNull(file)) {
 | 
			
		||||
            throw new ServiceException("上传文件不能为空");
 | 
			
		||||
        }
 | 
			
		||||
        SysOss oss = iSysOssService.upload(file);
 | 
			
		||||
        SysOssVo oss = iSysOssService.upload(file);
 | 
			
		||||
        Map<String, String> map = new HashMap<>(2);
 | 
			
		||||
        map.put("url", oss.getUrl());
 | 
			
		||||
        map.put("fileName", oss.getOriginalName());
 | 
			
		||||
@@ -96,23 +98,7 @@ public class SysOssController extends BaseController {
 | 
			
		||||
    @SaCheckPermission("system:oss:download")
 | 
			
		||||
    @GetMapping("/download/{ossId}")
 | 
			
		||||
    public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException {
 | 
			
		||||
        SysOssVo sysOss = iSysOssService.getById(ossId);
 | 
			
		||||
        if (ObjectUtil.isNull(sysOss)) {
 | 
			
		||||
            throw new ServiceException("文件数据不存在!");
 | 
			
		||||
        }
 | 
			
		||||
        FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
 | 
			
		||||
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
 | 
			
		||||
        long data;
 | 
			
		||||
        try {
 | 
			
		||||
            data = HttpUtil.download(sysOss.getUrl(), response.getOutputStream(), false);
 | 
			
		||||
        } catch (HttpException e) {
 | 
			
		||||
            if (e.getMessage().contains("403")) {
 | 
			
		||||
                throw new ServiceException("无读取权限, 请在对应的OSS开启'公有读'权限!");
 | 
			
		||||
            } else {
 | 
			
		||||
                throw new ServiceException(e.getMessage());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        response.setContentLength(Convert.toInt(data));
 | 
			
		||||
        iSysOssService.download(ossId,response);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -125,7 +111,7 @@ public class SysOssController extends BaseController {
 | 
			
		||||
    @DeleteMapping("/{ossIds}")
 | 
			
		||||
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
 | 
			
		||||
                          @PathVariable Long[] ossIds) {
 | 
			
		||||
        return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true) ? 1 : 0);
 | 
			
		||||
        return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import com.ruoyi.common.helper.LoginHelper;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.common.utils.file.MimeTypeUtils;
 | 
			
		||||
import com.ruoyi.system.domain.SysOss;
 | 
			
		||||
import com.ruoyi.system.domain.vo.SysOssVo;
 | 
			
		||||
import com.ruoyi.system.service.ISysOssService;
 | 
			
		||||
import com.ruoyi.system.service.ISysUserService;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
@@ -115,7 +116,7 @@ public class SysProfileController extends BaseController {
 | 
			
		||||
            if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) {
 | 
			
		||||
                return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式");
 | 
			
		||||
            }
 | 
			
		||||
            SysOss oss = iSysOssService.upload(avatarfile);
 | 
			
		||||
            SysOssVo oss = iSysOssService.upload(avatarfile);
 | 
			
		||||
            String avatar = oss.getUrl();
 | 
			
		||||
            if (userService.updateUserAvatar(getUsername(), avatar)) {
 | 
			
		||||
                ajax.put("imgUrl", avatar);
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ xxl.job:
 | 
			
		||||
--- # 数据源配置
 | 
			
		||||
spring:
 | 
			
		||||
  datasource:
 | 
			
		||||
    type: com.alibaba.druid.pool.DruidDataSource
 | 
			
		||||
    type: com.zaxxer.hikari.HikariDataSource
 | 
			
		||||
    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
 | 
			
		||||
    dynamic:
 | 
			
		||||
      # 性能分析插件(有性能损耗 不建议生产环境使用)
 | 
			
		||||
@@ -45,6 +45,7 @@ spring:
 | 
			
		||||
      datasource:
 | 
			
		||||
        # 主库数据源
 | 
			
		||||
        master:
 | 
			
		||||
          type: ${spring.datasource.type}
 | 
			
		||||
          driverClassName: com.mysql.cj.jdbc.Driver
 | 
			
		||||
          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
 | 
			
		||||
          # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
 | 
			
		||||
@@ -54,72 +55,46 @@ spring:
 | 
			
		||||
        # 从库数据源
 | 
			
		||||
        slave:
 | 
			
		||||
          lazy: true
 | 
			
		||||
          type: ${spring.datasource.type}
 | 
			
		||||
          driverClassName: com.mysql.cj.jdbc.Driver
 | 
			
		||||
          url:
 | 
			
		||||
          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
 | 
			
		||||
#          druid:
 | 
			
		||||
#            validationQuery: SELECT 1 FROM DUAL
 | 
			
		||||
#          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;rewriteBatchedStatements=true
 | 
			
		||||
#          url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
 | 
			
		||||
#          username: SA
 | 
			
		||||
#          password: root
 | 
			
		||||
      druid:
 | 
			
		||||
        # 初始连接数
 | 
			
		||||
        initialSize: 5
 | 
			
		||||
        # 最小连接池数量
 | 
			
		||||
        minIdle: 10
 | 
			
		||||
      hikari:
 | 
			
		||||
        # 最大连接池数量
 | 
			
		||||
        maxActive: 20
 | 
			
		||||
        maxPoolSize: 20
 | 
			
		||||
        # 最小空闲线程数量
 | 
			
		||||
        minIdle: 10
 | 
			
		||||
        # 配置获取连接等待超时的时间
 | 
			
		||||
        maxWait: 60000
 | 
			
		||||
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
 | 
			
		||||
        timeBetweenEvictionRunsMillis: 60000
 | 
			
		||||
        # 配置一个连接在池中最小生存的时间,单位是毫秒
 | 
			
		||||
        minEvictableIdleTimeMillis: 300000
 | 
			
		||||
        # 配置一个连接在池中最大生存的时间,单位是毫秒
 | 
			
		||||
        maxEvictableIdleTimeMillis: 900000
 | 
			
		||||
        # 配置检测连接是否有效
 | 
			
		||||
        validationQuery: SELECT 1
 | 
			
		||||
        testWhileIdle: true
 | 
			
		||||
        testOnBorrow: false
 | 
			
		||||
        testOnReturn: false
 | 
			
		||||
        # 注意这个值和druid原生不一致,默认启动了stat
 | 
			
		||||
        filters: stat
 | 
			
		||||
 | 
			
		||||
--- # druid 配置
 | 
			
		||||
spring.datasource.druid:
 | 
			
		||||
  webStatFilter:
 | 
			
		||||
    enabled: true
 | 
			
		||||
  statViewServlet:
 | 
			
		||||
    enabled: true
 | 
			
		||||
    # 设置白名单,不填则允许所有访问
 | 
			
		||||
    allow:
 | 
			
		||||
    url-pattern: /druid/*
 | 
			
		||||
    # 控制台管理用户名和密码
 | 
			
		||||
    login-username: ruoyi
 | 
			
		||||
    login-password: 123456
 | 
			
		||||
  filter:
 | 
			
		||||
    stat:
 | 
			
		||||
      enabled: true
 | 
			
		||||
      # 慢SQL记录
 | 
			
		||||
      log-slow-sql: true
 | 
			
		||||
      slow-sql-millis: 1000
 | 
			
		||||
      merge-sql: true
 | 
			
		||||
    wall:
 | 
			
		||||
      config:
 | 
			
		||||
        multi-statement-allow: true
 | 
			
		||||
        connectionTimeout: 10000
 | 
			
		||||
        # 校验超时时间
 | 
			
		||||
        validationTimeout: 5000
 | 
			
		||||
        # 空闲连接存活最大时间,默认10分钟
 | 
			
		||||
        idleTimeout: 60000
 | 
			
		||||
        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
 | 
			
		||||
        maxLifetime: 900000
 | 
			
		||||
        # 连接测试query(配置检测连接是否有效)
 | 
			
		||||
        connectionTestQuery: SELECT 1
 | 
			
		||||
 | 
			
		||||
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
 | 
			
		||||
spring:
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ xxl.job:
 | 
			
		||||
--- # 数据源配置
 | 
			
		||||
spring:
 | 
			
		||||
  datasource:
 | 
			
		||||
    type: com.alibaba.druid.pool.DruidDataSource
 | 
			
		||||
    type: com.zaxxer.hikari.HikariDataSource
 | 
			
		||||
    # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
 | 
			
		||||
    dynamic:
 | 
			
		||||
      # 性能分析插件(有性能损耗 不建议生产环境使用)
 | 
			
		||||
@@ -48,6 +48,7 @@ spring:
 | 
			
		||||
      datasource:
 | 
			
		||||
        # 主库数据源
 | 
			
		||||
        master:
 | 
			
		||||
          type: ${spring.datasource.type}
 | 
			
		||||
          driverClassName: com.mysql.cj.jdbc.Driver
 | 
			
		||||
          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
 | 
			
		||||
          # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
 | 
			
		||||
@@ -57,72 +58,46 @@ spring:
 | 
			
		||||
        # 从库数据源
 | 
			
		||||
        slave:
 | 
			
		||||
          lazy: true
 | 
			
		||||
          type: ${spring.datasource.type}
 | 
			
		||||
          driverClassName: com.mysql.cj.jdbc.Driver
 | 
			
		||||
          url:
 | 
			
		||||
          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
 | 
			
		||||
#          druid:
 | 
			
		||||
#            validationQuery: SELECT 1 FROM DUAL
 | 
			
		||||
#          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;rewriteBatchedStatements=true
 | 
			
		||||
#          url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
 | 
			
		||||
#          username: SA
 | 
			
		||||
#          password: root
 | 
			
		||||
      druid:
 | 
			
		||||
        # 初始连接数
 | 
			
		||||
        initialSize: 5
 | 
			
		||||
        # 最小连接池数量
 | 
			
		||||
        minIdle: 10
 | 
			
		||||
      hikari:
 | 
			
		||||
        # 最大连接池数量
 | 
			
		||||
        maxActive: 20
 | 
			
		||||
        maxPoolSize: 20
 | 
			
		||||
        # 最小空闲线程数量
 | 
			
		||||
        minIdle: 10
 | 
			
		||||
        # 配置获取连接等待超时的时间
 | 
			
		||||
        maxWait: 60000
 | 
			
		||||
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
 | 
			
		||||
        timeBetweenEvictionRunsMillis: 60000
 | 
			
		||||
        # 配置一个连接在池中最小生存的时间,单位是毫秒
 | 
			
		||||
        minEvictableIdleTimeMillis: 300000
 | 
			
		||||
        # 配置一个连接在池中最大生存的时间,单位是毫秒
 | 
			
		||||
        maxEvictableIdleTimeMillis: 900000
 | 
			
		||||
        # 配置检测连接是否有效
 | 
			
		||||
        validationQuery: SELECT 1
 | 
			
		||||
        testWhileIdle: true
 | 
			
		||||
        testOnBorrow: false
 | 
			
		||||
        testOnReturn: false
 | 
			
		||||
        # 注意这个值和druid原生不一致,默认启动了stat
 | 
			
		||||
        filters: stat
 | 
			
		||||
 | 
			
		||||
--- # druid 配置
 | 
			
		||||
spring.datasource.druid:
 | 
			
		||||
  webStatFilter:
 | 
			
		||||
    enabled: true
 | 
			
		||||
  statViewServlet:
 | 
			
		||||
    enabled: true
 | 
			
		||||
    # 设置白名单,不填则允许所有访问
 | 
			
		||||
    allow:
 | 
			
		||||
    url-pattern: /druid/*
 | 
			
		||||
    # 控制台管理用户名和密码
 | 
			
		||||
    login-username: ruoyi
 | 
			
		||||
    login-password: 123456
 | 
			
		||||
  filter:
 | 
			
		||||
    stat:
 | 
			
		||||
      enabled: true
 | 
			
		||||
      # 慢SQL记录
 | 
			
		||||
      log-slow-sql: true
 | 
			
		||||
      slow-sql-millis: 1000
 | 
			
		||||
      merge-sql: true
 | 
			
		||||
    wall:
 | 
			
		||||
      config:
 | 
			
		||||
        multi-statement-allow: true
 | 
			
		||||
        connectionTimeout: 10000
 | 
			
		||||
        # 校验超时时间
 | 
			
		||||
        validationTimeout: 5000
 | 
			
		||||
        # 空闲连接存活最大时间,默认10分钟
 | 
			
		||||
        idleTimeout: 60000
 | 
			
		||||
        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
 | 
			
		||||
        maxLifetime: 900000
 | 
			
		||||
        # 连接测试query(配置检测连接是否有效)
 | 
			
		||||
        connectionTestQuery: SELECT 1
 | 
			
		||||
 | 
			
		||||
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
 | 
			
		||||
spring:
 | 
			
		||||
 
 | 
			
		||||
@@ -115,8 +115,6 @@ sa-token:
 | 
			
		||||
  token-prefix: "Bearer"
 | 
			
		||||
  # jwt秘钥
 | 
			
		||||
  jwt-secret-key: abcdefghijklmnopqrstuvwxyz
 | 
			
		||||
  # 是否输出操作日志
 | 
			
		||||
  is-log: true
 | 
			
		||||
 | 
			
		||||
# security配置
 | 
			
		||||
security:
 | 
			
		||||
@@ -131,8 +129,6 @@ security:
 | 
			
		||||
    - /favicon.ico
 | 
			
		||||
    - /*/api-docs
 | 
			
		||||
    - /*/api-docs/**
 | 
			
		||||
    # druid 监控配置
 | 
			
		||||
    - /druid/**
 | 
			
		||||
    # actuator 监控配置
 | 
			
		||||
    - /actuator
 | 
			
		||||
    - /actuator/**
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
    <!-- 控制台输出 -->
 | 
			
		||||
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
 | 
			
		||||
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
 | 
			
		||||
        <encoder>
 | 
			
		||||
            <pattern>${console.log.pattern}</pattern>
 | 
			
		||||
            <charset>utf-8</charset>
 | 
			
		||||
        </encoder>
 | 
			
		||||
@@ -22,7 +22,7 @@
 | 
			
		||||
            <!-- 日志最大 1天 -->
 | 
			
		||||
            <maxHistory>1</maxHistory>
 | 
			
		||||
        </rollingPolicy>
 | 
			
		||||
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
 | 
			
		||||
        <encoder>
 | 
			
		||||
            <pattern>${log.pattern}</pattern>
 | 
			
		||||
            <charset>utf-8</charset>
 | 
			
		||||
        </encoder>
 | 
			
		||||
@@ -42,7 +42,7 @@
 | 
			
		||||
            <!-- 日志最大的历史 60天 -->
 | 
			
		||||
            <maxHistory>60</maxHistory>
 | 
			
		||||
        </rollingPolicy>
 | 
			
		||||
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
 | 
			
		||||
        <encoder>
 | 
			
		||||
            <pattern>${log.pattern}</pattern>
 | 
			
		||||
        </encoder>
 | 
			
		||||
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
 | 
			
		||||
@@ -64,7 +64,7 @@
 | 
			
		||||
            <!-- 日志最大的历史 60天 -->
 | 
			
		||||
            <maxHistory>60</maxHistory>
 | 
			
		||||
        </rollingPolicy>
 | 
			
		||||
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
 | 
			
		||||
        <encoder>
 | 
			
		||||
            <pattern>${log.pattern}</pattern>
 | 
			
		||||
        </encoder>
 | 
			
		||||
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
 | 
			
		||||
@@ -78,7 +78,7 @@
 | 
			
		||||
    </appender>
 | 
			
		||||
 | 
			
		||||
    <!-- info异步输出 -->
 | 
			
		||||
    <appender name="async_info" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
 | 
			
		||||
    <appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
 | 
			
		||||
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
 | 
			
		||||
        <discardingThreshold>0</discardingThreshold>
 | 
			
		||||
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
 | 
			
		||||
@@ -88,7 +88,7 @@
 | 
			
		||||
    </appender>
 | 
			
		||||
 | 
			
		||||
    <!-- error异步输出 -->
 | 
			
		||||
    <appender name="async_error" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
 | 
			
		||||
    <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
 | 
			
		||||
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
 | 
			
		||||
        <discardingThreshold>0</discardingThreshold>
 | 
			
		||||
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
 | 
			
		||||
@@ -97,12 +97,33 @@
 | 
			
		||||
        <appender-ref ref="file_error"/>
 | 
			
		||||
    </appender>
 | 
			
		||||
 | 
			
		||||
    <!-- 整合 skywalking 控制台输出 tid -->
 | 
			
		||||
<!--    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">-->
 | 
			
		||||
<!--        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">-->
 | 
			
		||||
<!--            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">-->
 | 
			
		||||
<!--                <pattern>[%tid] ${console.log.pattern}</pattern>-->
 | 
			
		||||
<!--            </layout>-->
 | 
			
		||||
<!--            <charset>utf-8</charset>-->
 | 
			
		||||
<!--        </encoder>-->
 | 
			
		||||
<!--    </appender>-->
 | 
			
		||||
 | 
			
		||||
    <!-- 整合 skywalking 推送采集日志 -->
 | 
			
		||||
<!--    <appender name="sky_log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">-->
 | 
			
		||||
<!--        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">-->
 | 
			
		||||
<!--            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">-->
 | 
			
		||||
<!--                <pattern>[%tid] ${console.log.pattern}</pattern>-->
 | 
			
		||||
<!--            </layout>-->
 | 
			
		||||
<!--            <charset>utf-8</charset>-->
 | 
			
		||||
<!--        </encoder>-->
 | 
			
		||||
<!--    </appender>-->
 | 
			
		||||
 | 
			
		||||
    <!--系统操作日志-->
 | 
			
		||||
    <root level="info">
 | 
			
		||||
        <appender-ref ref="console" />
 | 
			
		||||
        <appender-ref ref="async_info" />
 | 
			
		||||
        <appender-ref ref="async_error" />
 | 
			
		||||
        <appender-ref ref="file_console" />
 | 
			
		||||
<!--        <appender-ref ref="sky_log"/>-->
 | 
			
		||||
    </root>
 | 
			
		||||
 | 
			
		||||
</configuration>
 | 
			
		||||
 
 | 
			
		||||
@@ -24,3 +24,5 @@ outagedetection=true
 | 
			
		||||
outagedetectioninterval=2
 | 
			
		||||
# 是否过滤 Log
 | 
			
		||||
filter=true
 | 
			
		||||
# 过滤 Log 时所排除的 sql 关键字,以逗号分隔
 | 
			
		||||
exclude=SELECT 1
 | 
			
		||||
 
 | 
			
		||||
@@ -89,7 +89,7 @@ public class ${ClassName}Controller extends BaseController {
 | 
			
		||||
    @RepeatSubmit()
 | 
			
		||||
    @PostMapping()
 | 
			
		||||
    public R<Void> add(@Validated(AddGroup.class) @RequestBody ${ClassName}Bo bo) {
 | 
			
		||||
        return toAjax(i${ClassName}Service.insertByBo(bo) ? 1 : 0);
 | 
			
		||||
        return toAjax(i${ClassName}Service.insertByBo(bo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -100,7 +100,7 @@ public class ${ClassName}Controller extends BaseController {
 | 
			
		||||
    @RepeatSubmit()
 | 
			
		||||
    @PutMapping()
 | 
			
		||||
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ${ClassName}Bo bo) {
 | 
			
		||||
        return toAjax(i${ClassName}Service.updateByBo(bo) ? 1 : 0);
 | 
			
		||||
        return toAjax(i${ClassName}Service.updateByBo(bo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -113,6 +113,6 @@ public class ${ClassName}Controller extends BaseController {
 | 
			
		||||
    @DeleteMapping("/{${pkColumn.javaField}s}")
 | 
			
		||||
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
 | 
			
		||||
                          @PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) {
 | 
			
		||||
        return toAjax(i${ClassName}Service.deleteWithValidByIds(Arrays.asList(${pkColumn.javaField}s), true) ? 1 : 0);
 | 
			
		||||
        return toAjax(i${ClassName}Service.deleteWithValidByIds(Arrays.asList(${pkColumn.javaField}s), true));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -136,24 +136,9 @@
 | 
			
		||||
#end
 | 
			
		||||
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
 | 
			
		||||
        <template #default="scope">
 | 
			
		||||
          <el-button
 | 
			
		||||
            type="text"
 | 
			
		||||
            icon="Edit"
 | 
			
		||||
            @click="handleUpdate(scope.row)"
 | 
			
		||||
            v-hasPermi="['${moduleName}:${businessName}:edit']"
 | 
			
		||||
          >修改</el-button>
 | 
			
		||||
          <el-button
 | 
			
		||||
            type="text"
 | 
			
		||||
            icon="Plus"
 | 
			
		||||
            @click="handleAdd(scope.row)"
 | 
			
		||||
            v-hasPermi="['${moduleName}:${businessName}:add']"
 | 
			
		||||
          >新增</el-button>
 | 
			
		||||
          <el-button
 | 
			
		||||
            type="text"
 | 
			
		||||
            icon="Delete"
 | 
			
		||||
            @click="handleDelete(scope.row)"
 | 
			
		||||
            v-hasPermi="['${moduleName}:${businessName}:remove']"
 | 
			
		||||
          >删除</el-button>
 | 
			
		||||
            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
 | 
			
		||||
            <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['${moduleName}:${businessName}:add']">新增</el-button>
 | 
			
		||||
            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
 | 
			
		||||
        </template>
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
    </el-table>
 | 
			
		||||
 
 | 
			
		||||
@@ -148,18 +148,8 @@
 | 
			
		||||
#end
 | 
			
		||||
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
 | 
			
		||||
        <template #default="scope">
 | 
			
		||||
          <el-button
 | 
			
		||||
            type="text"
 | 
			
		||||
            icon="Edit"
 | 
			
		||||
            @click="handleUpdate(scope.row)"
 | 
			
		||||
            v-hasPermi="['${moduleName}:${businessName}:edit']"
 | 
			
		||||
          >修改</el-button>
 | 
			
		||||
          <el-button
 | 
			
		||||
            type="text"
 | 
			
		||||
            icon="Delete"
 | 
			
		||||
            @click="handleDelete(scope.row)"
 | 
			
		||||
            v-hasPermi="['${moduleName}:${businessName}:remove']"
 | 
			
		||||
          >删除</el-button>
 | 
			
		||||
            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
 | 
			
		||||
            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
 | 
			
		||||
        </template>
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
    </el-table>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								ruoyi/src/test/java/com/ruoyi/test/AssertUnitTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,45 @@
 | 
			
		||||
package com.ruoyi.test;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Assertions;
 | 
			
		||||
import org.junit.jupiter.api.DisplayName;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 断言单元测试案例
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 */
 | 
			
		||||
@DisplayName("断言单元测试案例")
 | 
			
		||||
public class AssertUnitTest {
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 assertEquals 方法")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testAssertEquals() {
 | 
			
		||||
        Assertions.assertEquals("666", new String("666"));
 | 
			
		||||
        Assertions.assertNotEquals("666", new String("666"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 assertSame 方法")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testAssertSame() {
 | 
			
		||||
        Object obj = new Object();
 | 
			
		||||
        Object obj1 = obj;
 | 
			
		||||
        Assertions.assertSame(obj, obj1);
 | 
			
		||||
        Assertions.assertNotSame(obj, obj1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 assertTrue 方法")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testAssertTrue() {
 | 
			
		||||
        Assertions.assertTrue(true);
 | 
			
		||||
        Assertions.assertFalse(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 assertNull 方法")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testAssertNull() {
 | 
			
		||||
        Assertions.assertNull(null);
 | 
			
		||||
        Assertions.assertNotNull(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										70
									
								
								ruoyi/src/test/java/com/ruoyi/test/DemoUnitTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,70 @@
 | 
			
		||||
package com.ruoyi.test;
 | 
			
		||||
 | 
			
		||||
import com.ruoyi.common.config.RuoYiConfig;
 | 
			
		||||
import org.junit.jupiter.api.*;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.boot.test.context.SpringBootTest;
 | 
			
		||||
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 单元测试案例
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 */
 | 
			
		||||
@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件
 | 
			
		||||
@DisplayName("单元测试案例")
 | 
			
		||||
public class DemoUnitTest {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RuoYiConfig ruoYiConfig;
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testTest() {
 | 
			
		||||
        System.out.println(ruoYiConfig);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Disabled
 | 
			
		||||
    @DisplayName("测试 @Disabled 注解")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testDisabled() {
 | 
			
		||||
        System.out.println(ruoYiConfig);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Timeout(value = 2L, unit = TimeUnit.SECONDS)
 | 
			
		||||
    @DisplayName("测试 @Timeout 注解")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testTimeout() throws InterruptedException {
 | 
			
		||||
        Thread.sleep(3000);
 | 
			
		||||
        System.out.println(ruoYiConfig);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 @RepeatedTest 注解")
 | 
			
		||||
    @RepeatedTest(3)
 | 
			
		||||
    public void testRepeatedTest() {
 | 
			
		||||
        System.out.println(666);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @BeforeAll
 | 
			
		||||
    public static void testBeforeAll() {
 | 
			
		||||
        System.out.println("@BeforeAll ==================");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @BeforeEach
 | 
			
		||||
    public void testBeforeEach() {
 | 
			
		||||
        System.out.println("@BeforeEach ==================");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterEach
 | 
			
		||||
    public void testAfterEach() {
 | 
			
		||||
        System.out.println("@AfterEach ==================");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterAll
 | 
			
		||||
    public static void testAfterAll() {
 | 
			
		||||
        System.out.println("@AfterAll ==================");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										72
									
								
								ruoyi/src/test/java/com/ruoyi/test/ParamUnitTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,72 @@
 | 
			
		||||
package com.ruoyi.test;
 | 
			
		||||
 | 
			
		||||
import com.ruoyi.common.enums.UserType;
 | 
			
		||||
import org.junit.jupiter.api.AfterEach;
 | 
			
		||||
import org.junit.jupiter.api.BeforeEach;
 | 
			
		||||
import org.junit.jupiter.api.DisplayName;
 | 
			
		||||
import org.junit.jupiter.params.ParameterizedTest;
 | 
			
		||||
import org.junit.jupiter.params.provider.EnumSource;
 | 
			
		||||
import org.junit.jupiter.params.provider.MethodSource;
 | 
			
		||||
import org.junit.jupiter.params.provider.NullSource;
 | 
			
		||||
import org.junit.jupiter.params.provider.ValueSource;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Stream;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 带参数单元测试案例
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 */
 | 
			
		||||
@DisplayName("带参数单元测试案例")
 | 
			
		||||
public class ParamUnitTest {
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 @ValueSource 注解")
 | 
			
		||||
    @ParameterizedTest
 | 
			
		||||
    @ValueSource(strings = {"t1", "t2", "t3"})
 | 
			
		||||
    public void testValueSource(String str) {
 | 
			
		||||
        System.out.println(str);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 @NullSource 注解")
 | 
			
		||||
    @ParameterizedTest
 | 
			
		||||
    @NullSource
 | 
			
		||||
    public void testNullSource(String str) {
 | 
			
		||||
        System.out.println(str);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 @EnumSource 注解")
 | 
			
		||||
    @ParameterizedTest
 | 
			
		||||
    @EnumSource(UserType.class)
 | 
			
		||||
    public void testEnumSource(UserType type) {
 | 
			
		||||
        System.out.println(type.getUserType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DisplayName("测试 @MethodSource 注解")
 | 
			
		||||
    @ParameterizedTest
 | 
			
		||||
    @MethodSource("getParam")
 | 
			
		||||
    public void testMethodSource(String str) {
 | 
			
		||||
        System.out.println(str);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Stream<String> getParam() {
 | 
			
		||||
        List<String> list = new ArrayList<>();
 | 
			
		||||
        list.add("t1");
 | 
			
		||||
        list.add("t2");
 | 
			
		||||
        list.add("t3");
 | 
			
		||||
        return list.stream();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @BeforeEach
 | 
			
		||||
    public void testBeforeEach() {
 | 
			
		||||
        System.out.println("@BeforeEach ==================");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterEach
 | 
			
		||||
    public void testAfterEach() {
 | 
			
		||||
        System.out.println("@AfterEach ==================");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								ruoyi/src/test/java/com/ruoyi/test/TagUnitTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,54 @@
 | 
			
		||||
package com.ruoyi.test;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.*;
 | 
			
		||||
import org.springframework.boot.test.context.SpringBootTest;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 标签单元测试案例
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 */
 | 
			
		||||
@SpringBootTest
 | 
			
		||||
@DisplayName("标签单元测试案例")
 | 
			
		||||
public class TagUnitTest {
 | 
			
		||||
 | 
			
		||||
    @Tag("dev")
 | 
			
		||||
    @DisplayName("测试 @Tag dev")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testTagDev() {
 | 
			
		||||
        System.out.println("dev");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Tag("prod")
 | 
			
		||||
    @DisplayName("测试 @Tag prod")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testTagProd() {
 | 
			
		||||
        System.out.println("prod");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Tag("local")
 | 
			
		||||
    @DisplayName("测试 @Tag local")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testTagLocal() {
 | 
			
		||||
        System.out.println("local");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Tag("exclude")
 | 
			
		||||
    @DisplayName("测试 @Tag exclude")
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testTagExclude() {
 | 
			
		||||
        System.out.println("exclude");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @BeforeEach
 | 
			
		||||
    public void testBeforeEach() {
 | 
			
		||||
        System.out.println("@BeforeEach ==================");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterEach
 | 
			
		||||
    public void testAfterEach() {
 | 
			
		||||
        System.out.println("@AfterEach ==================");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,7 @@ version: '3'
 | 
			
		||||
 | 
			
		||||
services:
 | 
			
		||||
  mysql:
 | 
			
		||||
    image: mysql:8.0.29
 | 
			
		||||
    image: mysql:8.0.31
 | 
			
		||||
    container_name: mysql
 | 
			
		||||
    environment:
 | 
			
		||||
      # 时区上海
 | 
			
		||||
@@ -29,7 +29,7 @@ services:
 | 
			
		||||
    network_mode: "host"
 | 
			
		||||
 | 
			
		||||
  nginx-web:
 | 
			
		||||
    image: nginx:1.21.6
 | 
			
		||||
    image: nginx:1.22.1
 | 
			
		||||
    container_name: nginx-web
 | 
			
		||||
    environment:
 | 
			
		||||
      # 时区上海
 | 
			
		||||
@@ -100,7 +100,7 @@ services:
 | 
			
		||||
    network_mode: "host"
 | 
			
		||||
 | 
			
		||||
  ruoyi-server1:
 | 
			
		||||
    image: ruoyi/ruoyi-server:4.3.1
 | 
			
		||||
    image: ruoyi/ruoyi-server:4.4.0
 | 
			
		||||
    container_name: ruoyi-server1
 | 
			
		||||
    environment:
 | 
			
		||||
      # 时区上海
 | 
			
		||||
@@ -109,11 +109,13 @@ services:
 | 
			
		||||
    volumes:
 | 
			
		||||
      # 配置文件
 | 
			
		||||
      - /docker/server1/logs/:/ruoyi/server/logs/
 | 
			
		||||
      # skywalking 探针
 | 
			
		||||
#      - /docker/skywalking/agent/:/ruoyi/skywalking/agent
 | 
			
		||||
    privileged: true
 | 
			
		||||
    network_mode: "host"
 | 
			
		||||
 | 
			
		||||
  ruoyi-server2:
 | 
			
		||||
    image: "ruoyi/ruoyi-server:4.3.1"
 | 
			
		||||
    image: "ruoyi/ruoyi-server:4.4.0"
 | 
			
		||||
    container_name: ruoyi-server2
 | 
			
		||||
    environment:
 | 
			
		||||
      # 时区上海
 | 
			
		||||
@@ -122,11 +124,13 @@ services:
 | 
			
		||||
    volumes:
 | 
			
		||||
      # 配置文件
 | 
			
		||||
      - /docker/server2/logs/:/ruoyi/server/logs/
 | 
			
		||||
      # skywalking 探针
 | 
			
		||||
#      - /docker/skywalking/agent/:/ruoyi/skywalking/agent
 | 
			
		||||
    privileged: true
 | 
			
		||||
    network_mode: "host"
 | 
			
		||||
 | 
			
		||||
  ruoyi-monitor-admin:
 | 
			
		||||
    image: ruoyi/ruoyi-monitor-admin:4.3.1
 | 
			
		||||
    image: ruoyi/ruoyi-monitor-admin:4.4.0
 | 
			
		||||
    container_name: ruoyi-monitor-admin
 | 
			
		||||
    environment:
 | 
			
		||||
      # 时区上海
 | 
			
		||||
@@ -138,7 +142,7 @@ services:
 | 
			
		||||
    network_mode: "host"
 | 
			
		||||
 | 
			
		||||
  ruoyi-xxl-job-admin:
 | 
			
		||||
    image: ruoyi/ruoyi-xxl-job-admin:4.3.1
 | 
			
		||||
    image: ruoyi/ruoyi-xxl-job-admin:4.4.0
 | 
			
		||||
    container_name: ruoyi-xxl-job-admin
 | 
			
		||||
    environment:
 | 
			
		||||
      # 时区上海
 | 
			
		||||
 
 | 
			
		||||
@@ -257,7 +257,6 @@ insert into sys_menu values('106',  '参数设置', '1',   '7', 'config',     's
 | 
			
		||||
insert into sys_menu values('107',  '通知公告', '1',   '8', 'notice',     'system/notice/index',      '', 1, 0, 'C', '0', '0', 'system:notice:list',      'message',       'admin', sysdate, '', null, '通知公告菜单');
 | 
			
		||||
insert into sys_menu values('108',  '日志管理', '1',   '9', 'log',        '',                         '', 1, 0, 'M', '0', '0', '',                        'log',           'admin', sysdate, '', null, '日志管理菜单');
 | 
			
		||||
insert into sys_menu values('109',  '在线用户', '2',   '1', 'online',     'monitor/online/index',     '', 1, 0, 'C', '0', '0', 'monitor:online:list',     'online',        'admin', sysdate, '', null, '在线用户菜单');
 | 
			
		||||
insert into sys_menu values('111',  '数据监控', '2',   '3', 'druid',      'monitor/druid/index',      '', 1, 0, 'C', '0', '0', 'monitor:druid:list',      'druid',         'admin', sysdate, '', null, '数据监控菜单');
 | 
			
		||||
insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', sysdate, '', null, '缓存列表菜单');
 | 
			
		||||
insert into sys_menu values('113',  '缓存监控', '2',   '5', 'cache',      'monitor/cache/index',      '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis',         'admin', sysdate, '', null, '缓存监控菜单');
 | 
			
		||||
insert into sys_menu values('114',  '表单构建', '3',   '1', 'build',      'tool/build/index',         '', 1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate, '', null, '表单构建菜单');
 | 
			
		||||
@@ -910,6 +909,7 @@ create table sys_oss_config (
 | 
			
		||||
  domain          varchar(255)  default '',
 | 
			
		||||
  is_https        char(1)       default 'N',
 | 
			
		||||
  region          varchar(255)  default '',
 | 
			
		||||
  access_policy   char(1)       default '1' not null,
 | 
			
		||||
  status          char(1)       default '1',
 | 
			
		||||
  ext1            varchar(255)  default '',
 | 
			
		||||
  create_by       varchar(64)   default '',
 | 
			
		||||
@@ -932,6 +932,7 @@ comment on column sys_oss_config.endpoint is '访问站点';
 | 
			
		||||
comment on column sys_oss_config.domain is '自定义域名';
 | 
			
		||||
comment on column sys_oss_config.is_https is '是否https(Y=是,N=否)';
 | 
			
		||||
comment on column sys_oss_config.region is '域';
 | 
			
		||||
comment on column sys_oss_config.access_policy is '桶权限类型(0=private 1=public 2=custom)';
 | 
			
		||||
comment on column sys_oss_config.status is '状态(0=正常,1=停用)';
 | 
			
		||||
comment on column sys_oss_config.ext1 is '扩展字段';
 | 
			
		||||
comment on column sys_oss_config.remark is '备注';
 | 
			
		||||
@@ -940,11 +941,11 @@ comment on column sys_oss_config.create_time is '创建时间';
 | 
			
		||||
comment on column sys_oss_config.update_by is '更新者';
 | 
			
		||||
comment on column sys_oss_config.update_time is '更新时间';
 | 
			
		||||
 | 
			
		||||
insert into sys_oss_config values (1, 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                '','N', '',            '0', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (2, 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',     '','N', '',            '1', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (3, 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',   '','N', '',            '1', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (4, 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',   '','N', 'ap-beijing',  '1', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (5, 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',           '','N', '',            '1', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (1, 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                '','N', '',            '1', '0', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (2, 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',     '','N', '',            '1', '1', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (3, 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',   '','N', '',            '1', '1', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (4, 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',   '','N', 'ap-beijing',  '1', '1', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
insert into sys_oss_config values (5, 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',           '','N', '',            '1', '1', '', NULL, 'admin', sysdate, 'admin', sysdate);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- ----------------------------
 | 
			
		||||
 
 | 
			
		||||
@@ -260,7 +260,6 @@ insert into sys_menu values('106',  '参数设置', '1',   '7', 'config',     's
 | 
			
		||||
insert into sys_menu values('107',  '通知公告', '1',   '8', 'notice',     'system/notice/index',      '', '1', '0', 'C', '0', '0', 'system:notice:list',      'message',       'admin', now(), '', null, '通知公告菜单');
 | 
			
		||||
insert into sys_menu values('108',  '日志管理', '1',   '9', 'log',        '',                         '', '1', '0', 'M', '0', '0', '',                        'log',           'admin', now(), '', null, '日志管理菜单');
 | 
			
		||||
insert into sys_menu values('109',  '在线用户', '2',   '1', 'online',     'monitor/online/index',     '', '1', '0', 'C', '0', '0', 'monitor:online:list',     'online',        'admin', now(), '', null, '在线用户菜单');
 | 
			
		||||
insert into sys_menu values('111',  '数据监控', '2',   '3', 'druid',      'monitor/druid/index',      '', '1', '0', 'C', '0', '0', 'monitor:druid:list',      'druid',         'admin', now(), '', null, '数据监控菜单');
 | 
			
		||||
insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', '1', '0', 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', now(), '', null, '缓存列表菜单');
 | 
			
		||||
insert into sys_menu values('113',  '缓存监控', '2',   '5', 'cache',      'monitor/cache/index',      '', '1', '0', 'C', '0', '0', 'monitor:cache:list',      'redis',         'admin', now(), '', null, '缓存监控菜单');
 | 
			
		||||
insert into sys_menu values('114',  '表单构建', '3',   '1', 'build',      'tool/build/index',         '', '1', '0', 'C', '0', '0', 'tool:build:list',         'build',         'admin', now(), '', null, '表单构建菜单');
 | 
			
		||||
@@ -923,6 +922,7 @@ create table if not exists sys_oss_config
 | 
			
		||||
    domain        varchar(255) default ''::varchar,
 | 
			
		||||
    is_https      char         default 'N'::bpchar,
 | 
			
		||||
    region        varchar(255) default ''::varchar,
 | 
			
		||||
    access_policy char(1)      default '1'::bpchar not null,
 | 
			
		||||
    status        char         default '1'::bpchar,
 | 
			
		||||
    ext1          varchar(255) default ''::varchar,
 | 
			
		||||
    create_by     varchar(64)  default ''::varchar,
 | 
			
		||||
@@ -944,6 +944,7 @@ comment on column sys_oss_config.endpoint is '访问站点';
 | 
			
		||||
comment on column sys_oss_config.domain is '自定义域名';
 | 
			
		||||
comment on column sys_oss_config.is_https is '是否https(Y=是,N=否)';
 | 
			
		||||
comment on column sys_oss_config.region is '域';
 | 
			
		||||
comment on column sys_oss_config.access_policy is '桶权限类型(0=private 1=public 2=custom)';
 | 
			
		||||
comment on column sys_oss_config.status is '状态(0=正常,1=停用)';
 | 
			
		||||
comment on column sys_oss_config.ext1 is '扩展字段';
 | 
			
		||||
comment on column sys_oss_config.create_by is '创建者';
 | 
			
		||||
@@ -952,11 +953,11 @@ comment on column sys_oss_config.update_by is '更新者';
 | 
			
		||||
comment on column sys_oss_config.update_time is '更新时间';
 | 
			
		||||
comment on column sys_oss_config.remark is '备注';
 | 
			
		||||
 | 
			
		||||
insert into sys_oss_config values (1, 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                      '','N', '',            '0', '', 'admin', now(), 'admin', now(), null);
 | 
			
		||||
insert into sys_oss_config values (2, 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',           '','N', '',            '1', '', 'admin', now(), 'admin', now(), null);
 | 
			
		||||
insert into sys_oss_config values (3, 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',         '','N', '',            '1', '', 'admin', now(), 'admin', now(), null);
 | 
			
		||||
insert into sys_oss_config values (4, 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',         '','N', 'ap-beijing',  '1', '', 'admin', now(), 'admin', now(), null);
 | 
			
		||||
insert into sys_oss_config values (5, 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',                 '','N', '',            '1', '', 'admin', now(), 'admin', now(), NULL);
 | 
			
		||||
insert into sys_oss_config values (1, 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                      '','N', '',            '1', '0', '', 'admin', now(), 'admin', now(), null);
 | 
			
		||||
insert into sys_oss_config values (2, 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',           '','N', '',            '1', '1', '', 'admin', now(), 'admin', now(), null);
 | 
			
		||||
insert into sys_oss_config values (3, 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',         '','N', '',            '1', '1', '', 'admin', now(), 'admin', now(), null);
 | 
			
		||||
insert into sys_oss_config values (4, 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',         '','N', 'ap-beijing',  '1', '1', '', 'admin', now(), 'admin', now(), null);
 | 
			
		||||
insert into sys_oss_config values (5, 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',                 '','N', '',            '1', '1', '', 'admin', now(), 'admin', now(), NULL);
 | 
			
		||||
 | 
			
		||||
-- 字符串自动转时间 避免框架时间查询报错问题
 | 
			
		||||
create or replace function cast_varchar_to_timestamp(varchar) returns timestamptz as $$
 | 
			
		||||
 
 | 
			
		||||
@@ -172,7 +172,6 @@ insert into sys_menu values('106',  '参数设置', '1',   '7', 'config',     's
 | 
			
		||||
insert into sys_menu values('107',  '通知公告', '1',   '8', 'notice',     'system/notice/index',      '', 1, 0, 'C', '0', '0', 'system:notice:list',      'message',       'admin', sysdate(), '', null, '通知公告菜单');
 | 
			
		||||
insert into sys_menu values('108',  '日志管理', '1',   '9', 'log',        '',                         '', 1, 0, 'M', '0', '0', '',                        'log',           'admin', sysdate(), '', null, '日志管理菜单');
 | 
			
		||||
insert into sys_menu values('109',  '在线用户', '2',   '1', 'online',     'monitor/online/index',     '', 1, 0, 'C', '0', '0', 'monitor:online:list',     'online',        'admin', sysdate(), '', null, '在线用户菜单');
 | 
			
		||||
insert into sys_menu values('111',  '数据监控', '2',   '3', 'druid',      'monitor/druid/index',      '', 1, 0, 'C', '0', '0', 'monitor:druid:list',      'druid',         'admin', sysdate(), '', null, '数据监控菜单');
 | 
			
		||||
insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', sysdate(), '', null, '缓存列表菜单');
 | 
			
		||||
insert into sys_menu values('113',  '缓存监控', '2',   '5', 'cache',      'monitor/cache/index',      '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis',         'admin', sysdate(), '', null, '缓存监控菜单');
 | 
			
		||||
insert into sys_menu values('114',  '表单构建', '3',   '1', 'build',      'tool/build/index',         '', 1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate(), '', null, '表单构建菜单');
 | 
			
		||||
@@ -674,6 +673,7 @@ create table sys_oss_config (
 | 
			
		||||
  domain           varchar(255)           default ''      comment '自定义域名',
 | 
			
		||||
  is_https         char(1)                default 'N'     comment '是否https(Y=是,N=否)',
 | 
			
		||||
  region           varchar(255)           default ''      comment '域',
 | 
			
		||||
  access_policy    char(1)     not null   default '1'     comment '桶权限类型(0=private 1=public 2=custom)',
 | 
			
		||||
  status           char(1)                default '1'     comment '状态(0=正常,1=停用)',
 | 
			
		||||
  ext1             varchar(255)           default ''      comment '扩展字段',
 | 
			
		||||
  create_by       varchar(64)             default ''      comment '创建者',
 | 
			
		||||
@@ -684,9 +684,8 @@ create table sys_oss_config (
 | 
			
		||||
  primary key (oss_config_id)
 | 
			
		||||
) engine=innodb comment='对象存储配置表';
 | 
			
		||||
 | 
			
		||||
insert into sys_oss_config values (1, 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                '','N', '',            '0', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
insert into sys_oss_config values (2, 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',     '','N', '',            '1', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
insert into sys_oss_config values (3, 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',   '','N', '',            '1', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
insert into sys_oss_config values (4, 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',   '','N', 'ap-beijing',  '1', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
insert into sys_oss_config values (5, 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',           '','N', '',            '1', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
 | 
			
		||||
insert into sys_oss_config values (1, 'minio',  'ruoyi',            'ruoyi123',        'ruoyi',             '', '127.0.0.1:9000',                '','N', '',             '1' ,'0', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
insert into sys_oss_config values (2, 'qiniu',  'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 's3-cn-north-1.qiniucs.com',     '','N', '',             '1' ,'1', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
insert into sys_oss_config values (3, 'aliyun', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi',             '', 'oss-cn-beijing.aliyuncs.com',   '','N', '',             '1' ,'1', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
insert into sys_oss_config values (4, 'qcloud', 'XXXXXXXXXXXXXXX',  'XXXXXXXXXXXXXXX', 'ruoyi-1250000000',  '', 'cos.ap-beijing.myqcloud.com',   '','N', 'ap-beijing',   '1' ,'1', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
insert into sys_oss_config values (5, 'image',  'ruoyi',            'ruoyi123',        'ruoyi',             'image', '127.0.0.1:9000',           '','N', '',             '1' ,'1', '', 'admin', sysdate(), 'admin', sysdate(), NULL);
 | 
			
		||||
 
 | 
			
		||||
@@ -1078,8 +1078,6 @@ INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [co
 | 
			
		||||
GO
 | 
			
		||||
INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (109, N'在线用户', 2, 1, N'online', N'monitor/online/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:online:list', N'online', N'admin', getdate(), N'', NULL, N'在线用户菜单')
 | 
			
		||||
GO
 | 
			
		||||
INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (111, N'数据监控', 2, 3, N'druid', N'monitor/druid/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:druid:list', N'druid', N'admin', getdate(), N'', NULL, N'数据监控菜单')
 | 
			
		||||
GO
 | 
			
		||||
INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (112, N'缓存列表', 2, 6, N'cacheList', N'monitor/cache/list', N'', 1, 0, N'C', N'0', N'0', N'monitor:cache:list', N'redis-list', N'admin', getdate(), N'', NULL, N'缓存列表菜单')
 | 
			
		||||
GO
 | 
			
		||||
INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (113, N'缓存监控', 2, 5, N'cache', N'monitor/cache/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:cache:list', N'redis', N'admin', getdate(), N'', NULL, N'缓存监控菜单')
 | 
			
		||||
@@ -1851,8 +1849,6 @@ INSERT [sys_role_menu] ([role_id], [menu_id]) VALUES (2, 1044)
 | 
			
		||||
GO
 | 
			
		||||
INSERT [sys_role_menu] ([role_id], [menu_id]) VALUES (2, 1045)
 | 
			
		||||
GO
 | 
			
		||||
INSERT [sys_role_menu] ([role_id], [menu_id]) VALUES (2, 1050)
 | 
			
		||||
GO
 | 
			
		||||
INSERT [sys_role_menu] ([role_id], [menu_id]) VALUES (2, 1046)
 | 
			
		||||
GO
 | 
			
		||||
INSERT [sys_role_menu] ([role_id], [menu_id]) VALUES (2, 1047)
 | 
			
		||||
@@ -2202,6 +2198,7 @@ CREATE TABLE [sys_oss_config]
 | 
			
		||||
    [domain]        nvarchar(255) DEFAULT ''    NULL,
 | 
			
		||||
    [is_https]      nchar(1)      DEFAULT ('N') NULL,
 | 
			
		||||
    [region]        nvarchar(255) DEFAULT ''    NULL,
 | 
			
		||||
    [access_policy] nchar(1)      DEFAULT ('1') NOT NULL,
 | 
			
		||||
    [status]        nchar(1)      DEFAULT ('1') NULL,
 | 
			
		||||
    [ext1]          nvarchar(255) DEFAULT ''    NULL,
 | 
			
		||||
    [create_by]     nvarchar(64)  DEFAULT ''    NULL,
 | 
			
		||||
@@ -2276,6 +2273,12 @@ EXEC sp_addextendedproperty
 | 
			
		||||
    'TABLE', N'sys_oss_config',
 | 
			
		||||
    'COLUMN', N'region'
 | 
			
		||||
GO
 | 
			
		||||
EXEC sp_addextendedproperty
 | 
			
		||||
     'MS_Description', N'桶权限类型(0=private 1=public 2=custom)',
 | 
			
		||||
     'SCHEMA', N'dbo',
 | 
			
		||||
     'TABLE', N'sys_oss_config',
 | 
			
		||||
     'COLUMN', N'access_policy'
 | 
			
		||||
GO
 | 
			
		||||
EXEC sp_addextendedproperty
 | 
			
		||||
    'MS_Description', N'状态(0=正常,1=停用)',
 | 
			
		||||
    'SCHEMA', N'dbo',
 | 
			
		||||
@@ -2324,13 +2327,13 @@ EXEC sp_addextendedproperty
 | 
			
		||||
    'TABLE', N'sys_oss_config'
 | 
			
		||||
GO
 | 
			
		||||
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'1', N'minio', N'ruoyi',            N'ruoyi123',        N'ruoyi',            N'', N'127.0.0.1:9000',                    N'',N'N', N'',           N'0', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [access_policy], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'1', N'minio', N'ruoyi',            N'ruoyi123',        N'ruoyi',            N'', N'127.0.0.1:9000',                    N'',N'N', N'',           N'1', N'0', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
GO
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2', N'qiniu', N'XXXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi',            N'', N's3-cn-north-1.qiniucs.com',         N'',N'N', N'',           N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [access_policy], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'2', N'qiniu', N'XXXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi',            N'', N's3-cn-north-1.qiniucs.com',         N'',N'N', N'',           N'1', N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
GO
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'3', N'aliyun', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi',            N'', N'oss-cn-beijing.aliyuncs.com',       N'',N'N', N'',           N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [access_policy], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'3', N'aliyun', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi',            N'', N'oss-cn-beijing.aliyuncs.com',       N'',N'N', N'',           N'1', N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
GO
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'4', N'qcloud', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi-1250000000', N'', N'cos.ap-beijing.myqcloud.com',       N'',N'N', N'ap-beijing', N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [access_policy], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'4', N'qcloud', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi-1250000000', N'', N'cos.ap-beijing.myqcloud.com',       N'',N'N', N'ap-beijing', N'1', N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
GO
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'5', N'image',  N'ruoyi',           N'ruoyi123',        N'ruoyi',            N'image', N'127.0.0.1:9000',               N'',N'N', N'',           N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [access_policy], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'5', N'image',  N'ruoyi',           N'ruoyi123',        N'ruoyi',            N'image', N'127.0.0.1:9000',               N'',N'N', N'',           N'1', N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
 | 
			
		||||
GO
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'm
 | 
			
		||||
 | 
			
		||||
delete from sys_menu WHERE menu_id = 116;
 | 
			
		||||
 | 
			
		||||
update sys_config set config_key = 'sys.account.captchaEnabled' where config_id = 4
 | 
			
		||||
update sys_config set config_key = 'sys.account.captchaEnabled' where config_id = 4;
 | 
			
		||||
 | 
			
		||||
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock',  '#', 'admin', sysdate, '', null, '');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								script/sql/update/oracle/update-4.3-4.4.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
ALTER TABLE "SYS_OSS_CONFIG" ADD ("ACCESS_POLICY" CHAR(1) DEFAULT '1' NOT NULL);
 | 
			
		||||
 | 
			
		||||
COMMENT ON COLUMN "SYS_OSS_CONFIG"."ACCESS_POLICY" IS '桶权限类型(0=private 1=public 2=custom)';
 | 
			
		||||
@@ -2,7 +2,7 @@ insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'm
 | 
			
		||||
 | 
			
		||||
delete from sys_menu WHERE menu_id = 116;
 | 
			
		||||
 | 
			
		||||
update sys_config set config_key = 'sys.account.captchaEnabled' where config_id = 4
 | 
			
		||||
update sys_config set config_key = 'sys.account.captchaEnabled' where config_id = 4;
 | 
			
		||||
 | 
			
		||||
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:unlock',  '#', 'admin', now(), '', null, '');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								script/sql/update/postgres/update-4.3-4.4.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
ALTER TABLE "sys_oss_config" ADD COLUMN "access_policy" char(1) NOT NULL DEFAULT '1'::bpchar;
 | 
			
		||||
 | 
			
		||||
COMMENT ON COLUMN "sys_oss_config"."access_policy" IS '桶权限类型(0=private 1=public 2=custom)';
 | 
			
		||||
							
								
								
									
										9
									
								
								script/sql/update/sqlserver/update-4.3-4.4.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,9 @@
 | 
			
		||||
ALTER TABLE [sys_oss_config] ADD [access_policy] nchar(1) DEFAULT ('1') NOT NULL
 | 
			
		||||
GO
 | 
			
		||||
 | 
			
		||||
EXEC sp_addextendedproperty
 | 
			
		||||
'MS_Description', N'桶权限类型(0=private 1=public 2=custom)',
 | 
			
		||||
'SCHEMA', N'dbo',
 | 
			
		||||
'TABLE', N'sys_oss_config',
 | 
			
		||||
'COLUMN', N'access_policy'
 | 
			
		||||
GO
 | 
			
		||||
@@ -2,7 +2,7 @@ insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'm
 | 
			
		||||
 | 
			
		||||
delete from sys_menu WHERE menu_id = 116;
 | 
			
		||||
 | 
			
		||||
update sys_config set config_key = 'sys.account.captchaEnabled' where config_id = 4
 | 
			
		||||
update sys_config set config_key = 'sys.account.captchaEnabled' where config_id = 4;
 | 
			
		||||
 | 
			
		||||
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock',  '#', 'admin', sysdate(), '', null, '');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								script/sql/update/update-4.3-4.4.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
ALTER TABLE sys_oss_config ADD COLUMN access_policy char(1) NOT NULL DEFAULT 1 COMMENT '桶权限类型(0=private 1=public 2=custom)' AFTER region;
 | 
			
		||||