mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	init 单模块项目
This commit is contained in:
		@@ -35,6 +35,7 @@
 | 
			
		||||
* 升级MybatisPlus 3.4.2
 | 
			
		||||
* 增加demo模块示例(给不会增加模块的小伙伴做参考)
 | 
			
		||||
* 同步升级 3.4.0
 | 
			
		||||
* 多模块 master 分支 https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/master/
 | 
			
		||||
 | 
			
		||||
## 平台简介
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										281
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										281
									
								
								pom.xml
									
									
									
									
									
								
							@@ -1,281 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
	<modelVersion>4.0.0</modelVersion>
 | 
			
		||||
	
 | 
			
		||||
    <groupId>com.ruoyi</groupId>
 | 
			
		||||
    <artifactId>ruoyi</artifactId>
 | 
			
		||||
    <version>3.4.0</version>
 | 
			
		||||
 | 
			
		||||
    <name>ruoyi</name>
 | 
			
		||||
    <url>http://www.ruoyi.vip</url>
 | 
			
		||||
    <description>若依管理系统</description>
 | 
			
		||||
    
 | 
			
		||||
    <properties>
 | 
			
		||||
        <ruoyi.version>3.4.0</ruoyi.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.1.1</maven-jar-plugin.version>
 | 
			
		||||
        <druid.version>1.2.4</druid.version>
 | 
			
		||||
        <knife4j.version>2.0.8</knife4j.version>
 | 
			
		||||
        <pagehelper.boot.version>1.3.0</pagehelper.boot.version>
 | 
			
		||||
        <fastjson.version>1.2.75</fastjson.version>
 | 
			
		||||
        <oshi.version>5.6.0</oshi.version>
 | 
			
		||||
        <jna.version>5.7.0</jna.version>
 | 
			
		||||
        <poi.version>4.1.2</poi.version>
 | 
			
		||||
        <velocity.version>1.7</velocity.version>
 | 
			
		||||
        <jwt.version>0.9.1</jwt.version>
 | 
			
		||||
        <mybatis-plus.version>3.4.2</mybatis-plus.version>
 | 
			
		||||
        <hutool.version>5.5.8</hutool.version>
 | 
			
		||||
        <feign.version>2.2.6.RELEASE</feign.version>
 | 
			
		||||
        <feign-okhttp.version>11.0</feign-okhttp.version>
 | 
			
		||||
    </properties>
 | 
			
		||||
	
 | 
			
		||||
    <!-- 依赖声明 -->
 | 
			
		||||
    <dependencyManagement>
 | 
			
		||||
        <dependencies>
 | 
			
		||||
        
 | 
			
		||||
            <!-- SpringBoot的依赖配置-->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                <artifactId>spring-boot-dependencies</artifactId>
 | 
			
		||||
                <version>2.2.13.RELEASE</version>
 | 
			
		||||
                <type>pom</type>
 | 
			
		||||
                <scope>import</scope>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            
 | 
			
		||||
            <!--阿里数据库连接池 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.alibaba</groupId>
 | 
			
		||||
                <artifactId>druid-spring-boot-starter</artifactId>
 | 
			
		||||
                <version>${druid.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
			
 | 
			
		||||
            <!-- pagehelper 分页插件 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.github.pagehelper</groupId>
 | 
			
		||||
                <artifactId>pagehelper-spring-boot-starter</artifactId>
 | 
			
		||||
                <version>${pagehelper.boot.version}</version>
 | 
			
		||||
                <exclusions>
 | 
			
		||||
                    <exclusion>
 | 
			
		||||
                        <groupId>org.mybatis</groupId>
 | 
			
		||||
                        <artifactId>mybatis</artifactId>
 | 
			
		||||
                    </exclusion>
 | 
			
		||||
                </exclusions>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <!-- 获取系统信息 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.github.oshi</groupId>
 | 
			
		||||
                <artifactId>oshi-core</artifactId>
 | 
			
		||||
                <version>${oshi.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>net.java.dev.jna</groupId>
 | 
			
		||||
                <artifactId>jna</artifactId>
 | 
			
		||||
                <version>${jna.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>net.java.dev.jna</groupId>
 | 
			
		||||
                <artifactId>jna-platform</artifactId>
 | 
			
		||||
                <version>${jna.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.github.xiaoymin</groupId>
 | 
			
		||||
                <artifactId>knife4j-spring-boot-starter</artifactId>
 | 
			
		||||
                <version>${knife4j.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
			
 | 
			
		||||
            <!-- excel工具 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.apache.poi</groupId>
 | 
			
		||||
                <artifactId>poi-ooxml</artifactId>
 | 
			
		||||
                <version>${poi.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
			
 | 
			
		||||
            <!--velocity代码生成使用模板 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.apache.velocity</groupId>
 | 
			
		||||
                <artifactId>velocity</artifactId>
 | 
			
		||||
                <version>${velocity.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <!-- 阿里JSON解析器 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.alibaba</groupId>
 | 
			
		||||
                <artifactId>fastjson</artifactId>
 | 
			
		||||
                <version>${fastjson.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
			
 | 
			
		||||
            <!--Token生成与解析-->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>io.jsonwebtoken</groupId>
 | 
			
		||||
                <artifactId>jjwt</artifactId>
 | 
			
		||||
                <version>${jwt.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.baomidou</groupId>
 | 
			
		||||
                <artifactId>mybatis-plus-boot-starter</artifactId>
 | 
			
		||||
                <version>${mybatis-plus.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.baomidou</groupId>
 | 
			
		||||
                <artifactId>mybatis-plus-extension</artifactId>
 | 
			
		||||
                <version>${mybatis-plus.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>cn.hutool</groupId>
 | 
			
		||||
                <artifactId>hutool-all</artifactId>
 | 
			
		||||
                <version>${hutool.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.springframework.cloud</groupId>
 | 
			
		||||
                <artifactId>spring-cloud-starter-openfeign</artifactId>
 | 
			
		||||
                <version>${feign.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>io.github.openfeign</groupId>
 | 
			
		||||
                <artifactId>feign-okhttp</artifactId>
 | 
			
		||||
                <version>${feign-okhttp.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <!-- 定时任务-->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.ruoyi</groupId>
 | 
			
		||||
                <artifactId>ruoyi-quartz</artifactId>
 | 
			
		||||
                <version>${ruoyi.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
	
 | 
			
		||||
            <!-- 代码生成-->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.ruoyi</groupId>
 | 
			
		||||
                <artifactId>ruoyi-generator</artifactId>
 | 
			
		||||
                <version>${ruoyi.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
			
 | 
			
		||||
            <!-- 核心模块-->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.ruoyi</groupId>
 | 
			
		||||
                <artifactId>ruoyi-framework</artifactId>
 | 
			
		||||
                <version>${ruoyi.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
			
 | 
			
		||||
            <!-- 系统模块-->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.ruoyi</groupId>
 | 
			
		||||
                <artifactId>ruoyi-system</artifactId>
 | 
			
		||||
                <version>${ruoyi.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
			
 | 
			
		||||
            <!-- 通用工具-->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.ruoyi</groupId>
 | 
			
		||||
                <artifactId>ruoyi-common</artifactId>
 | 
			
		||||
                <version>${ruoyi.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <!-- demo模块 -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.ruoyi</groupId>
 | 
			
		||||
                <artifactId>ruoyi-demo</artifactId>
 | 
			
		||||
                <version>${ruoyi.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
        </dependencies>
 | 
			
		||||
    </dependencyManagement>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
        <module>ruoyi-admin</module>
 | 
			
		||||
        <module>ruoyi-framework</module>
 | 
			
		||||
        <module>ruoyi-system</module>
 | 
			
		||||
        <module>ruoyi-quartz</module>
 | 
			
		||||
        <module>ruoyi-generator</module>
 | 
			
		||||
        <module>ruoyi-common</module>
 | 
			
		||||
        <module>ruoyi-demo</module>
 | 
			
		||||
    </modules>
 | 
			
		||||
    <packaging>pom</packaging>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
        <plugins>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                <artifactId>maven-compiler-plugin</artifactId>
 | 
			
		||||
                <version>3.1</version>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <source>${java.version}</source>
 | 
			
		||||
                    <target>${java.version}</target>
 | 
			
		||||
                    <encoding>${project.build.sourceEncoding}</encoding>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
        </plugins>
 | 
			
		||||
        <resources>
 | 
			
		||||
            <resource>
 | 
			
		||||
                <!--打包该目录下的 application.yml -->
 | 
			
		||||
                <directory>src/main/resources</directory>
 | 
			
		||||
                <!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
 | 
			
		||||
                <filtering>true</filtering>
 | 
			
		||||
            </resource>
 | 
			
		||||
        </resources>
 | 
			
		||||
    </build>
 | 
			
		||||
 | 
			
		||||
    <repositories>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>public</id>
 | 
			
		||||
            <name>aliyun nexus</name>
 | 
			
		||||
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
 | 
			
		||||
            <releases>
 | 
			
		||||
                <enabled>true</enabled>
 | 
			
		||||
            </releases>
 | 
			
		||||
        </repository>
 | 
			
		||||
    </repositories>
 | 
			
		||||
 | 
			
		||||
    <pluginRepositories>
 | 
			
		||||
        <pluginRepository>
 | 
			
		||||
            <id>public</id>
 | 
			
		||||
            <name>aliyun nexus</name>
 | 
			
		||||
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
 | 
			
		||||
            <releases>
 | 
			
		||||
                <enabled>true</enabled>
 | 
			
		||||
            </releases>
 | 
			
		||||
            <snapshots>
 | 
			
		||||
                <enabled>false</enabled>
 | 
			
		||||
            </snapshots>
 | 
			
		||||
        </pluginRepository>
 | 
			
		||||
    </pluginRepositories>
 | 
			
		||||
 | 
			
		||||
    <profiles>
 | 
			
		||||
        <profile>
 | 
			
		||||
            <id>dev</id>
 | 
			
		||||
            <properties>
 | 
			
		||||
                <!-- 环境标识,需要与配置文件的名称相对应 -->
 | 
			
		||||
                <profiles.active>dev</profiles.active>
 | 
			
		||||
                <logging.level>debug</logging.level>
 | 
			
		||||
            </properties>
 | 
			
		||||
            <activation>
 | 
			
		||||
                <!-- 默认环境 -->
 | 
			
		||||
                <activeByDefault>true</activeByDefault>
 | 
			
		||||
            </activation>
 | 
			
		||||
        </profile>
 | 
			
		||||
        <profile>
 | 
			
		||||
            <id>prod</id>
 | 
			
		||||
            <properties>
 | 
			
		||||
                <profiles.active>prod</profiles.active>
 | 
			
		||||
                <logging.level>warn</logging.level>
 | 
			
		||||
            </properties>
 | 
			
		||||
        </profile>
 | 
			
		||||
    </profiles>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,118 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>3.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
    <packaging>jar</packaging>
 | 
			
		||||
    <artifactId>ruoyi-admin</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        web服务入口
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- spring-boot-devtools -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-devtools</artifactId>
 | 
			
		||||
            <optional>true</optional> <!-- 表示依赖不会传递 -->
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
<!--        <!– swagger2–>-->
 | 
			
		||||
<!--        <dependency>-->
 | 
			
		||||
<!--            <groupId>io.springfox</groupId>-->
 | 
			
		||||
<!--            <artifactId>springfox-swagger2</artifactId>-->
 | 
			
		||||
<!--        </dependency>-->
 | 
			
		||||
 | 
			
		||||
<!--        <!–防止进入swagger页面报类型转换错误,排除2.9.2中的引用,手动增加1.5.21版本–>-->
 | 
			
		||||
<!--        <dependency>-->
 | 
			
		||||
<!--            <groupId>io.swagger</groupId>-->
 | 
			
		||||
<!--            <artifactId>swagger-annotations</artifactId>-->
 | 
			
		||||
<!--            <version>1.5.21</version>-->
 | 
			
		||||
<!--        </dependency>-->
 | 
			
		||||
 | 
			
		||||
<!--        <dependency>-->
 | 
			
		||||
<!--            <groupId>io.swagger</groupId>-->
 | 
			
		||||
<!--            <artifactId>swagger-models</artifactId>-->
 | 
			
		||||
<!--            <version>1.5.21</version>-->
 | 
			
		||||
<!--        </dependency>-->
 | 
			
		||||
 | 
			
		||||
<!--        <dependency>-->
 | 
			
		||||
<!--            <groupId>com.github.xiaoymin</groupId>-->
 | 
			
		||||
<!--            <artifactId>swagger-bootstrap-ui</artifactId>-->
 | 
			
		||||
<!--        </dependency>-->
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.xiaoymin</groupId>
 | 
			
		||||
            <artifactId>knife4j-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
         <!-- Mysql驱动包 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>mysql</groupId>
 | 
			
		||||
            <artifactId>mysql-connector-java</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 核心模块-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-framework</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 定时任务-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-quartz</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 代码生成-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-generator</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--  demo模块  -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-demo</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
        <plugins>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                <artifactId>spring-boot-maven-plugin</artifactId>
 | 
			
		||||
                <version>2.1.1.RELEASE</version>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
 | 
			
		||||
                </configuration>
 | 
			
		||||
                <executions>
 | 
			
		||||
                    <execution>
 | 
			
		||||
                        <goals>
 | 
			
		||||
                            <goal>repackage</goal>
 | 
			
		||||
                        </goals>
 | 
			
		||||
                    </execution>
 | 
			
		||||
                </executions>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            <plugin>   
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>   
 | 
			
		||||
                <artifactId>maven-war-plugin</artifactId>   
 | 
			
		||||
                <version>3.1.0</version>   
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <failOnMissingWebXml>false</failOnMissingWebXml>
 | 
			
		||||
                    <warName>${project.artifactId}</warName>
 | 
			
		||||
                </configuration>   
 | 
			
		||||
           </plugin>   
 | 
			
		||||
        </plugins>
 | 
			
		||||
        <finalName>${project.artifactId}</finalName>
 | 
			
		||||
    </build>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,133 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>3.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>ruoyi-common</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        common通用工具
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- Spring框架基本的核心工具 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework</groupId>
 | 
			
		||||
            <artifactId>spring-context-support</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- SpringWeb模块 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework</groupId>
 | 
			
		||||
            <artifactId>spring-web</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- spring security 安全认证 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-security</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- pagehelper 分页插件 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.pagehelper</groupId>
 | 
			
		||||
            <artifactId>pagehelper-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 自定义验证注解 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>javax.validation</groupId>
 | 
			
		||||
            <artifactId>validation-api</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--常用工具类 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.commons</groupId>
 | 
			
		||||
            <artifactId>commons-lang3</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
  
 | 
			
		||||
        <!-- JSON工具类 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.fasterxml.jackson.core</groupId>
 | 
			
		||||
            <artifactId>jackson-databind</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 阿里JSON解析器 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba</groupId>
 | 
			
		||||
            <artifactId>fastjson</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- excel工具 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.poi</groupId>
 | 
			
		||||
            <artifactId>poi-ooxml</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- yml解析器 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.yaml</groupId>
 | 
			
		||||
            <artifactId>snakeyaml</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--Token生成与解析-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>io.jsonwebtoken</groupId>
 | 
			
		||||
            <artifactId>jjwt</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- redis 缓存操作 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-data-redis</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- pool 对象池 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.commons</groupId>
 | 
			
		||||
            <artifactId>commons-pool2</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- servlet包 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>javax.servlet</groupId>
 | 
			
		||||
            <artifactId>javax.servlet-api</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.baomidou</groupId>
 | 
			
		||||
            <artifactId>mybatis-plus-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.baomidou</groupId>
 | 
			
		||||
            <artifactId>mybatis-plus-extension</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>cn.hutool</groupId>
 | 
			
		||||
            <artifactId>hutool-all</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.projectlombok</groupId>
 | 
			
		||||
            <artifactId>lombok</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.cloud</groupId>
 | 
			
		||||
            <artifactId>spring-cloud-starter-openfeign</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>io.github.openfeign</groupId>
 | 
			
		||||
            <artifactId>feign-okhttp</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,33 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>3.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>ruoyi-demo</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        demo模块
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- 通用工具-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.xiaoymin</groupId>
 | 
			
		||||
            <artifactId>knife4j-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.controller;
 | 
			
		||||
 | 
			
		||||
import com.ruoyi.common.core.domain.AjaxResult;
 | 
			
		||||
import com.ruoyi.demo.feign.FeignTestService;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.PathVariable;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
@RequiredArgsConstructor(onConstructor_ = @Autowired)
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/feign/test")
 | 
			
		||||
public class FeignTestController {
 | 
			
		||||
 | 
			
		||||
    private final FeignTestService feignTestService;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/search/{wd}")
 | 
			
		||||
    public AjaxResult search(@PathVariable String wd) {
 | 
			
		||||
        String search = feignTestService.search(wd);
 | 
			
		||||
        return AjaxResult.success("操作成功",search);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.controller;
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.domain;
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.feign;
 | 
			
		||||
 | 
			
		||||
import com.ruoyi.demo.feign.fallback.FeignTestFallback;
 | 
			
		||||
import org.springframework.cloud.openfeign.FeignClient;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestParam;
 | 
			
		||||
 | 
			
		||||
@FeignClient(name = "baidu",url = "http://www.baidu.com",fallback = FeignTestFallback.class)
 | 
			
		||||
public interface FeignTestService {
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/s")
 | 
			
		||||
    String search(@RequestParam("wd") String wd);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.feign.fallback;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import com.ruoyi.demo.feign.FeignTestService;
 | 
			
		||||
 | 
			
		||||
public class FeignTestFallback implements FeignTestService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String search(String wd) {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.feign.fallback;
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.feign;
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.mapper;
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.service.impl;
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package com.ruoyi.demo.service;
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>3.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>ruoyi-framework</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        framework框架核心
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- BEGIN 如果想使用 Tomcat 注释掉以下代码 -->
 | 
			
		||||
        <!-- SpringBoot Web容器 -->
 | 
			
		||||
         <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-web</artifactId>
 | 
			
		||||
             <exclusions>
 | 
			
		||||
                 <exclusion>
 | 
			
		||||
                     <artifactId>spring-boot-starter-tomcat</artifactId>
 | 
			
		||||
                     <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                 </exclusion>
 | 
			
		||||
             </exclusions>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- web 容器使用 undertow 性能更强 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-undertow</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- END -->
 | 
			
		||||
 | 
			
		||||
        <!-- BEGIN 如果想使用 Tomcat 解除以下代码注释 -->
 | 
			
		||||
<!--        <dependency>-->
 | 
			
		||||
<!--            <groupId>org.springframework.boot</groupId>-->
 | 
			
		||||
<!--            <artifactId>spring-boot-starter-web</artifactId>-->
 | 
			
		||||
<!--        </dependency>-->
 | 
			
		||||
        <!-- END -->
 | 
			
		||||
 | 
			
		||||
        <!-- SpringBoot 拦截器 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-aop</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 阿里数据库连接池 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba</groupId>
 | 
			
		||||
            <artifactId>druid-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 获取系统信息 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.oshi</groupId>
 | 
			
		||||
            <artifactId>oshi-core</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 系统模块-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-system</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>3.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>ruoyi-generator</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        generator代码生成
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!--velocity代码生成使用模板 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.velocity</groupId>
 | 
			
		||||
            <artifactId>velocity</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 通用工具-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,40 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>3.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>ruoyi-quartz</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        quartz定时任务
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- 定时任务 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.quartz-scheduler</groupId>
 | 
			
		||||
            <artifactId>quartz</artifactId>
 | 
			
		||||
            <exclusions>
 | 
			
		||||
                <exclusion>
 | 
			
		||||
                    <groupId>com.mchange</groupId>
 | 
			
		||||
                    <artifactId>c3p0</artifactId>
 | 
			
		||||
                </exclusion>
 | 
			
		||||
            </exclusions>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 通用工具-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,33 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <parent>
 | 
			
		||||
        <artifactId>ruoyi</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>3.4.0</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>ruoyi-system</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        system系统模块
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- 通用工具-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.xiaoymin</groupId>
 | 
			
		||||
            <artifactId>knife4j-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -34,7 +34,7 @@ module.exports = {
 | 
			
		||||
    proxy: {
 | 
			
		||||
      // detail: https://cli.vuejs.org/config/#devserver-proxy
 | 
			
		||||
      [process.env.VUE_APP_BASE_API]: {
 | 
			
		||||
        target: `http://localhost:8080`,
 | 
			
		||||
        target: `http://localhost:8081`,
 | 
			
		||||
        changeOrigin: true,
 | 
			
		||||
        pathRewrite: {
 | 
			
		||||
          ['^' + process.env.VUE_APP_BASE_API]: ''
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										370
									
								
								ruoyi/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										370
									
								
								ruoyi/pom.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,370 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <groupId>com.ruoyi</groupId>
 | 
			
		||||
    <artifactId>ruoyi</artifactId>
 | 
			
		||||
    <version>3.4.0</version>
 | 
			
		||||
 | 
			
		||||
    <name>ruoyi</name>
 | 
			
		||||
    <url>http://www.ruoyi.vip</url>
 | 
			
		||||
    <description>若依管理系统</description>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
        <ruoyi.version>3.4.0</ruoyi.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.1.1</maven-jar-plugin.version>
 | 
			
		||||
        <druid.version>1.2.4</druid.version>
 | 
			
		||||
        <knife4j.version>2.0.8</knife4j.version>
 | 
			
		||||
        <pagehelper.boot.version>1.3.0</pagehelper.boot.version>
 | 
			
		||||
        <fastjson.version>1.2.75</fastjson.version>
 | 
			
		||||
        <oshi.version>5.6.0</oshi.version>
 | 
			
		||||
        <jna.version>5.7.0</jna.version>
 | 
			
		||||
        <poi.version>4.1.2</poi.version>
 | 
			
		||||
        <velocity.version>1.7</velocity.version>
 | 
			
		||||
        <jwt.version>0.9.1</jwt.version>
 | 
			
		||||
        <mybatis-plus.version>3.4.2</mybatis-plus.version>
 | 
			
		||||
        <hutool.version>5.5.8</hutool.version>
 | 
			
		||||
        <feign.version>2.2.6.RELEASE</feign.version>
 | 
			
		||||
        <feign-okhttp.version>11.0</feign-okhttp.version>
 | 
			
		||||
    </properties>
 | 
			
		||||
 | 
			
		||||
    <!-- 依赖声明 -->
 | 
			
		||||
    <dependencyManagement>
 | 
			
		||||
        <dependencies>
 | 
			
		||||
 | 
			
		||||
            <!-- SpringBoot的依赖配置-->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                <artifactId>spring-boot-dependencies</artifactId>
 | 
			
		||||
                <version>2.2.13.RELEASE</version>
 | 
			
		||||
                <type>pom</type>
 | 
			
		||||
                <scope>import</scope>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
        </dependencies>
 | 
			
		||||
    </dependencyManagement>
 | 
			
		||||
 | 
			
		||||
    <packaging>jar</packaging>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- BEGIN 如果想使用 Tomcat 注释掉以下代码 -->
 | 
			
		||||
        <!-- SpringBoot Web容器 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-web</artifactId>
 | 
			
		||||
            <exclusions>
 | 
			
		||||
                <exclusion>
 | 
			
		||||
                    <artifactId>spring-boot-starter-tomcat</artifactId>
 | 
			
		||||
                    <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                </exclusion>
 | 
			
		||||
            </exclusions>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- web 容器使用 undertow 性能更强 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-undertow</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- END -->
 | 
			
		||||
 | 
			
		||||
        <!-- SpringBoot 拦截器 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-aop</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--阿里数据库连接池 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba</groupId>
 | 
			
		||||
            <artifactId>druid-spring-boot-starter</artifactId>
 | 
			
		||||
            <version>${druid.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 获取系统信息 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.oshi</groupId>
 | 
			
		||||
            <artifactId>oshi-core</artifactId>
 | 
			
		||||
            <version>${oshi.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>net.java.dev.jna</groupId>
 | 
			
		||||
            <artifactId>jna</artifactId>
 | 
			
		||||
            <version>${jna.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>net.java.dev.jna</groupId>
 | 
			
		||||
            <artifactId>jna-platform</artifactId>
 | 
			
		||||
            <version>${jna.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--velocity代码生成使用模板 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.velocity</groupId>
 | 
			
		||||
            <artifactId>velocity</artifactId>
 | 
			
		||||
            <version>${velocity.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 定时任务 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.quartz-scheduler</groupId>
 | 
			
		||||
            <artifactId>quartz</artifactId>
 | 
			
		||||
            <exclusions>
 | 
			
		||||
                <exclusion>
 | 
			
		||||
                    <groupId>com.mchange</groupId>
 | 
			
		||||
                    <artifactId>c3p0</artifactId>
 | 
			
		||||
                </exclusion>
 | 
			
		||||
            </exclusions>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- spring-boot-devtools -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-devtools</artifactId>
 | 
			
		||||
            <optional>true</optional> <!-- 表示依赖不会传递 -->
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.xiaoymin</groupId>
 | 
			
		||||
            <artifactId>knife4j-spring-boot-starter</artifactId>
 | 
			
		||||
            <version>${knife4j.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- Mysql驱动包 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>mysql</groupId>
 | 
			
		||||
            <artifactId>mysql-connector-java</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- Spring框架基本的核心工具 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework</groupId>
 | 
			
		||||
            <artifactId>spring-context-support</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- SpringWeb模块 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework</groupId>
 | 
			
		||||
            <artifactId>spring-web</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- spring security 安全认证 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-security</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- pagehelper 分页插件 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.pagehelper</groupId>
 | 
			
		||||
            <artifactId>pagehelper-spring-boot-starter</artifactId>
 | 
			
		||||
            <version>${pagehelper.boot.version}</version>
 | 
			
		||||
            <exclusions>
 | 
			
		||||
                <exclusion>
 | 
			
		||||
                    <groupId>org.mybatis</groupId>
 | 
			
		||||
                    <artifactId>mybatis</artifactId>
 | 
			
		||||
                </exclusion>
 | 
			
		||||
            </exclusions>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 自定义验证注解 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>javax.validation</groupId>
 | 
			
		||||
            <artifactId>validation-api</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--常用工具类 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.commons</groupId>
 | 
			
		||||
            <artifactId>commons-lang3</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- JSON工具类 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.fasterxml.jackson.core</groupId>
 | 
			
		||||
            <artifactId>jackson-databind</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 阿里JSON解析器 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba</groupId>
 | 
			
		||||
            <artifactId>fastjson</artifactId>
 | 
			
		||||
            <version>${fastjson.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- excel工具 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.poi</groupId>
 | 
			
		||||
            <artifactId>poi-ooxml</artifactId>
 | 
			
		||||
            <version>${poi.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- yml解析器 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.yaml</groupId>
 | 
			
		||||
            <artifactId>snakeyaml</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--Token生成与解析-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>io.jsonwebtoken</groupId>
 | 
			
		||||
            <artifactId>jjwt</artifactId>
 | 
			
		||||
            <version>${jwt.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- redis 缓存操作 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-data-redis</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- pool 对象池 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.commons</groupId>
 | 
			
		||||
            <artifactId>commons-pool2</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- servlet包 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>javax.servlet</groupId>
 | 
			
		||||
            <artifactId>javax.servlet-api</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.baomidou</groupId>
 | 
			
		||||
            <artifactId>mybatis-plus-boot-starter</artifactId>
 | 
			
		||||
            <version>${mybatis-plus.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.baomidou</groupId>
 | 
			
		||||
            <artifactId>mybatis-plus-extension</artifactId>
 | 
			
		||||
            <version>${mybatis-plus.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>cn.hutool</groupId>
 | 
			
		||||
            <artifactId>hutool-all</artifactId>
 | 
			
		||||
            <version>${hutool.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.projectlombok</groupId>
 | 
			
		||||
            <artifactId>lombok</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.cloud</groupId>
 | 
			
		||||
            <artifactId>spring-cloud-starter-openfeign</artifactId>
 | 
			
		||||
            <version>${feign.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>io.github.openfeign</groupId>
 | 
			
		||||
            <artifactId>feign-okhttp</artifactId>
 | 
			
		||||
            <version>${feign-okhttp.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
        <finalName>${project.artifactId}</finalName>
 | 
			
		||||
        <plugins>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                <artifactId>spring-boot-maven-plugin</artifactId>
 | 
			
		||||
                <version>2.2.13.RELEASE</version>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
 | 
			
		||||
                </configuration>
 | 
			
		||||
                <executions>
 | 
			
		||||
                    <execution>
 | 
			
		||||
                        <goals>
 | 
			
		||||
                            <goal>repackage</goal>
 | 
			
		||||
                        </goals>
 | 
			
		||||
                    </execution>
 | 
			
		||||
                </executions>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                <artifactId>maven-war-plugin</artifactId>
 | 
			
		||||
                <version>3.1.0</version>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <failOnMissingWebXml>false</failOnMissingWebXml>
 | 
			
		||||
                    <warName>${project.artifactId}</warName>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                <artifactId>maven-compiler-plugin</artifactId>
 | 
			
		||||
                <version>3.1</version>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <source>${java.version}</source>
 | 
			
		||||
                    <target>${java.version}</target>
 | 
			
		||||
                    <encoding>${project.build.sourceEncoding}</encoding>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
        </plugins>
 | 
			
		||||
        <resources>
 | 
			
		||||
            <resource>
 | 
			
		||||
                <!--打包该目录下的 application.yml -->
 | 
			
		||||
                <directory>src/main/resources</directory>
 | 
			
		||||
                <!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
 | 
			
		||||
                <filtering>true</filtering>
 | 
			
		||||
            </resource>
 | 
			
		||||
        </resources>
 | 
			
		||||
    </build>
 | 
			
		||||
 | 
			
		||||
    <repositories>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>public</id>
 | 
			
		||||
            <name>aliyun nexus</name>
 | 
			
		||||
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
 | 
			
		||||
            <releases>
 | 
			
		||||
                <enabled>true</enabled>
 | 
			
		||||
            </releases>
 | 
			
		||||
        </repository>
 | 
			
		||||
    </repositories>
 | 
			
		||||
 | 
			
		||||
    <pluginRepositories>
 | 
			
		||||
        <pluginRepository>
 | 
			
		||||
            <id>public</id>
 | 
			
		||||
            <name>aliyun nexus</name>
 | 
			
		||||
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
 | 
			
		||||
            <releases>
 | 
			
		||||
                <enabled>true</enabled>
 | 
			
		||||
            </releases>
 | 
			
		||||
            <snapshots>
 | 
			
		||||
                <enabled>false</enabled>
 | 
			
		||||
            </snapshots>
 | 
			
		||||
        </pluginRepository>
 | 
			
		||||
    </pluginRepositories>
 | 
			
		||||
 | 
			
		||||
    <profiles>
 | 
			
		||||
        <profile>
 | 
			
		||||
            <id>dev</id>
 | 
			
		||||
            <properties>
 | 
			
		||||
                <!-- 环境标识,需要与配置文件的名称相对应 -->
 | 
			
		||||
                <profiles.active>dev</profiles.active>
 | 
			
		||||
                <logging.level>debug</logging.level>
 | 
			
		||||
            </properties>
 | 
			
		||||
            <activation>
 | 
			
		||||
                <!-- 默认环境 -->
 | 
			
		||||
                <activeByDefault>true</activeByDefault>
 | 
			
		||||
            </activation>
 | 
			
		||||
        </profile>
 | 
			
		||||
        <profile>
 | 
			
		||||
            <id>prod</id>
 | 
			
		||||
            <properties>
 | 
			
		||||
                <profiles.active>prod</profiles.active>
 | 
			
		||||
                <logging.level>warn</logging.level>
 | 
			
		||||
            </properties>
 | 
			
		||||
        </profile>
 | 
			
		||||
    </profiles>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -1,165 +1,165 @@
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 自定义导出Excel数据注解
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@Target(ElementType.FIELD)
 | 
			
		||||
public @interface Excel
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出时在excel中排序
 | 
			
		||||
     */
 | 
			
		||||
    public int sort() default Integer.MAX_VALUE;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出到Excel中的名字.
 | 
			
		||||
     */
 | 
			
		||||
    public String name() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 日期格式, 如: yyyy-MM-dd
 | 
			
		||||
     */
 | 
			
		||||
    public String dateFormat() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
 | 
			
		||||
     */
 | 
			
		||||
    public String dictType() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 读取内容转表达式 (如: 0=男,1=女,2=未知)
 | 
			
		||||
     */
 | 
			
		||||
    public String readConverterExp() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分隔符,读取字符串组内容
 | 
			
		||||
     */
 | 
			
		||||
    public String separator() default ",";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
 | 
			
		||||
     */
 | 
			
		||||
    public int scale() default -1;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
 | 
			
		||||
     */
 | 
			
		||||
    public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出类型(0数字 1字符串)
 | 
			
		||||
     */
 | 
			
		||||
    public ColumnType cellType() default ColumnType.STRING;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出时在excel中每个列的高度 单位为字符
 | 
			
		||||
     */
 | 
			
		||||
    public double height() default 14;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出时在excel中每个列的宽 单位为字符
 | 
			
		||||
     */
 | 
			
		||||
    public double width() default 16;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 文字后缀,如% 90 变成90%
 | 
			
		||||
     */
 | 
			
		||||
    public String suffix() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 当值为空时,字段的默认值
 | 
			
		||||
     */
 | 
			
		||||
    public String defaultValue() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 提示信息
 | 
			
		||||
     */
 | 
			
		||||
    public String prompt() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置只能选择不能输入的列内容.
 | 
			
		||||
     */
 | 
			
		||||
    public String[] combo() default {};
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isExport() default true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 另一个类中的属性名称,支持多级获取,以小数点隔开
 | 
			
		||||
     */
 | 
			
		||||
    public String targetAttr() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否自动统计数据,在最后追加一行统计数据总和
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isStatistics() default false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右)
 | 
			
		||||
     */
 | 
			
		||||
    Align align() default Align.AUTO;
 | 
			
		||||
 | 
			
		||||
    public enum Align
 | 
			
		||||
    {
 | 
			
		||||
        AUTO(0), LEFT(1), CENTER(2), RIGHT(3);
 | 
			
		||||
        private final int value;
 | 
			
		||||
 | 
			
		||||
        Align(int value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int value()
 | 
			
		||||
        {
 | 
			
		||||
            return this.value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 字段类型(0:导出导入;1:仅导出;2:仅导入)
 | 
			
		||||
     */
 | 
			
		||||
    Type type() default Type.ALL;
 | 
			
		||||
 | 
			
		||||
    public enum Type
 | 
			
		||||
    {
 | 
			
		||||
        ALL(0), EXPORT(1), IMPORT(2);
 | 
			
		||||
        private final int value;
 | 
			
		||||
 | 
			
		||||
        Type(int value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int value()
 | 
			
		||||
        {
 | 
			
		||||
            return this.value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum ColumnType
 | 
			
		||||
    {
 | 
			
		||||
        NUMERIC(0), STRING(1), IMAGE(2);
 | 
			
		||||
        private final int value;
 | 
			
		||||
 | 
			
		||||
        ColumnType(int value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int value()
 | 
			
		||||
        {
 | 
			
		||||
            return this.value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 自定义导出Excel数据注解
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@Target(ElementType.FIELD)
 | 
			
		||||
public @interface Excel
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出时在excel中排序
 | 
			
		||||
     */
 | 
			
		||||
    public int sort() default Integer.MAX_VALUE;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出到Excel中的名字.
 | 
			
		||||
     */
 | 
			
		||||
    public String name() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 日期格式, 如: yyyy-MM-dd
 | 
			
		||||
     */
 | 
			
		||||
    public String dateFormat() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
 | 
			
		||||
     */
 | 
			
		||||
    public String dictType() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 读取内容转表达式 (如: 0=男,1=女,2=未知)
 | 
			
		||||
     */
 | 
			
		||||
    public String readConverterExp() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分隔符,读取字符串组内容
 | 
			
		||||
     */
 | 
			
		||||
    public String separator() default ",";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
 | 
			
		||||
     */
 | 
			
		||||
    public int scale() default -1;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
 | 
			
		||||
     */
 | 
			
		||||
    public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出类型(0数字 1字符串)
 | 
			
		||||
     */
 | 
			
		||||
    public ColumnType cellType() default ColumnType.STRING;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出时在excel中每个列的高度 单位为字符
 | 
			
		||||
     */
 | 
			
		||||
    public double height() default 14;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出时在excel中每个列的宽 单位为字符
 | 
			
		||||
     */
 | 
			
		||||
    public double width() default 16;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 文字后缀,如% 90 变成90%
 | 
			
		||||
     */
 | 
			
		||||
    public String suffix() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 当值为空时,字段的默认值
 | 
			
		||||
     */
 | 
			
		||||
    public String defaultValue() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 提示信息
 | 
			
		||||
     */
 | 
			
		||||
    public String prompt() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置只能选择不能输入的列内容.
 | 
			
		||||
     */
 | 
			
		||||
    public String[] combo() default {};
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isExport() default true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 另一个类中的属性名称,支持多级获取,以小数点隔开
 | 
			
		||||
     */
 | 
			
		||||
    public String targetAttr() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否自动统计数据,在最后追加一行统计数据总和
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isStatistics() default false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右)
 | 
			
		||||
     */
 | 
			
		||||
    Align align() default Align.AUTO;
 | 
			
		||||
 | 
			
		||||
    public enum Align
 | 
			
		||||
    {
 | 
			
		||||
        AUTO(0), LEFT(1), CENTER(2), RIGHT(3);
 | 
			
		||||
        private final int value;
 | 
			
		||||
 | 
			
		||||
        Align(int value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int value()
 | 
			
		||||
        {
 | 
			
		||||
            return this.value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 字段类型(0:导出导入;1:仅导出;2:仅导入)
 | 
			
		||||
     */
 | 
			
		||||
    Type type() default Type.ALL;
 | 
			
		||||
 | 
			
		||||
    public enum Type
 | 
			
		||||
    {
 | 
			
		||||
        ALL(0), EXPORT(1), IMPORT(2);
 | 
			
		||||
        private final int value;
 | 
			
		||||
 | 
			
		||||
        Type(int value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int value()
 | 
			
		||||
        {
 | 
			
		||||
            return this.value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum ColumnType
 | 
			
		||||
    {
 | 
			
		||||
        NUMERIC(0), STRING(1), IMAGE(2);
 | 
			
		||||
        private final int value;
 | 
			
		||||
 | 
			
		||||
        ColumnType(int value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public int value()
 | 
			
		||||
        {
 | 
			
		||||
            return this.value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,18 +1,18 @@
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Excel注解集
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Target(ElementType.FIELD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface Excels
 | 
			
		||||
{
 | 
			
		||||
    Excel[] value();
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Excel注解集
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Target(ElementType.FIELD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface Excels
 | 
			
		||||
{
 | 
			
		||||
    Excel[] value();
 | 
			
		||||
}
 | 
			
		||||
@@ -1,23 +1,23 @@
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.Documented;
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Inherited;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 自定义注解防止表单重复提交
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
@Inherited
 | 
			
		||||
@Target(ElementType.METHOD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@Documented
 | 
			
		||||
public @interface RepeatSubmit
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.Documented;
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Inherited;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 自定义注解防止表单重复提交
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
@Inherited
 | 
			
		||||
@Target(ElementType.METHOD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@Documented
 | 
			
		||||
public @interface RepeatSubmit
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,50 +1,50 @@
 | 
			
		||||
package com.ruoyi.common.constant;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 任务调度通用常量
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class ScheduleConstants
 | 
			
		||||
{
 | 
			
		||||
    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
 | 
			
		||||
 | 
			
		||||
    /** 执行目标key */
 | 
			
		||||
    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
 | 
			
		||||
 | 
			
		||||
    /** 默认 */
 | 
			
		||||
    public static final String MISFIRE_DEFAULT = "0";
 | 
			
		||||
 | 
			
		||||
    /** 立即触发执行 */
 | 
			
		||||
    public static final String MISFIRE_IGNORE_MISFIRES = "1";
 | 
			
		||||
 | 
			
		||||
    /** 触发一次执行 */
 | 
			
		||||
    public static final String MISFIRE_FIRE_AND_PROCEED = "2";
 | 
			
		||||
 | 
			
		||||
    /** 不触发立即执行 */
 | 
			
		||||
    public static final String MISFIRE_DO_NOTHING = "3";
 | 
			
		||||
 | 
			
		||||
    public enum Status
 | 
			
		||||
    {
 | 
			
		||||
        /**
 | 
			
		||||
         * 正常
 | 
			
		||||
         */
 | 
			
		||||
        NORMAL("0"),
 | 
			
		||||
        /**
 | 
			
		||||
         * 暂停
 | 
			
		||||
         */
 | 
			
		||||
        PAUSE("1");
 | 
			
		||||
 | 
			
		||||
        private String value;
 | 
			
		||||
 | 
			
		||||
        private Status(String value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public String getValue()
 | 
			
		||||
        {
 | 
			
		||||
            return value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.constant;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 任务调度通用常量
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class ScheduleConstants
 | 
			
		||||
{
 | 
			
		||||
    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
 | 
			
		||||
 | 
			
		||||
    /** 执行目标key */
 | 
			
		||||
    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
 | 
			
		||||
 | 
			
		||||
    /** 默认 */
 | 
			
		||||
    public static final String MISFIRE_DEFAULT = "0";
 | 
			
		||||
 | 
			
		||||
    /** 立即触发执行 */
 | 
			
		||||
    public static final String MISFIRE_IGNORE_MISFIRES = "1";
 | 
			
		||||
 | 
			
		||||
    /** 触发一次执行 */
 | 
			
		||||
    public static final String MISFIRE_FIRE_AND_PROCEED = "2";
 | 
			
		||||
 | 
			
		||||
    /** 不触发立即执行 */
 | 
			
		||||
    public static final String MISFIRE_DO_NOTHING = "3";
 | 
			
		||||
 | 
			
		||||
    public enum Status
 | 
			
		||||
    {
 | 
			
		||||
        /**
 | 
			
		||||
         * 正常
 | 
			
		||||
         */
 | 
			
		||||
        NORMAL("0"),
 | 
			
		||||
        /**
 | 
			
		||||
         * 暂停
 | 
			
		||||
         */
 | 
			
		||||
        PAUSE("1");
 | 
			
		||||
 | 
			
		||||
        private String value;
 | 
			
		||||
 | 
			
		||||
        private Status(String value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public String getValue()
 | 
			
		||||
        {
 | 
			
		||||
            return value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,79 +1,79 @@
 | 
			
		||||
package com.ruoyi.common.core.domain;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tree基类
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class TreeEntity extends BaseEntity
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /** 父菜单名称 */
 | 
			
		||||
    private String parentName;
 | 
			
		||||
 | 
			
		||||
    /** 父菜单ID */
 | 
			
		||||
    private Long parentId;
 | 
			
		||||
 | 
			
		||||
    /** 显示顺序 */
 | 
			
		||||
    private Integer orderNum;
 | 
			
		||||
 | 
			
		||||
    /** 祖级列表 */
 | 
			
		||||
    private String ancestors;
 | 
			
		||||
 | 
			
		||||
    /** 子部门 */
 | 
			
		||||
    private List<?> children = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    public String getParentName()
 | 
			
		||||
    {
 | 
			
		||||
        return parentName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setParentName(String parentName)
 | 
			
		||||
    {
 | 
			
		||||
        this.parentName = parentName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getParentId()
 | 
			
		||||
    {
 | 
			
		||||
        return parentId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setParentId(Long parentId)
 | 
			
		||||
    {
 | 
			
		||||
        this.parentId = parentId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Integer getOrderNum()
 | 
			
		||||
    {
 | 
			
		||||
        return orderNum;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setOrderNum(Integer orderNum)
 | 
			
		||||
    {
 | 
			
		||||
        this.orderNum = orderNum;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAncestors()
 | 
			
		||||
    {
 | 
			
		||||
        return ancestors;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAncestors(String ancestors)
 | 
			
		||||
    {
 | 
			
		||||
        this.ancestors = ancestors;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<?> getChildren()
 | 
			
		||||
    {
 | 
			
		||||
        return children;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setChildren(List<?> children)
 | 
			
		||||
    {
 | 
			
		||||
        this.children = children;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.core.domain;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tree基类
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class TreeEntity extends BaseEntity
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /** 父菜单名称 */
 | 
			
		||||
    private String parentName;
 | 
			
		||||
 | 
			
		||||
    /** 父菜单ID */
 | 
			
		||||
    private Long parentId;
 | 
			
		||||
 | 
			
		||||
    /** 显示顺序 */
 | 
			
		||||
    private Integer orderNum;
 | 
			
		||||
 | 
			
		||||
    /** 祖级列表 */
 | 
			
		||||
    private String ancestors;
 | 
			
		||||
 | 
			
		||||
    /** 子部门 */
 | 
			
		||||
    private List<?> children = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    public String getParentName()
 | 
			
		||||
    {
 | 
			
		||||
        return parentName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setParentName(String parentName)
 | 
			
		||||
    {
 | 
			
		||||
        this.parentName = parentName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getParentId()
 | 
			
		||||
    {
 | 
			
		||||
        return parentId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setParentId(Long parentId)
 | 
			
		||||
    {
 | 
			
		||||
        this.parentId = parentId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Integer getOrderNum()
 | 
			
		||||
    {
 | 
			
		||||
        return orderNum;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setOrderNum(Integer orderNum)
 | 
			
		||||
    {
 | 
			
		||||
        this.orderNum = orderNum;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAncestors()
 | 
			
		||||
    {
 | 
			
		||||
        return ancestors;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAncestors(String ancestors)
 | 
			
		||||
    {
 | 
			
		||||
        this.ancestors = ancestors;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<?> getChildren()
 | 
			
		||||
    {
 | 
			
		||||
        return children;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setChildren(List<?> children)
 | 
			
		||||
    {
 | 
			
		||||
        this.children = children;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,69 +1,69 @@
 | 
			
		||||
package com.ruoyi.common.core.domain.model;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 用户登录对象
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class LoginBody
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户名
 | 
			
		||||
     */
 | 
			
		||||
    private String username;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户密码
 | 
			
		||||
     */
 | 
			
		||||
    private String password;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 验证码
 | 
			
		||||
     */
 | 
			
		||||
    private String code;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 唯一标识
 | 
			
		||||
     */
 | 
			
		||||
    private String uuid = "";
 | 
			
		||||
 | 
			
		||||
    public String getUsername()
 | 
			
		||||
    {
 | 
			
		||||
        return username;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setUsername(String username)
 | 
			
		||||
    {
 | 
			
		||||
        this.username = username;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getPassword()
 | 
			
		||||
    {
 | 
			
		||||
        return password;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setPassword(String password)
 | 
			
		||||
    {
 | 
			
		||||
        this.password = password;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getCode()
 | 
			
		||||
    {
 | 
			
		||||
        return code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCode(String code)
 | 
			
		||||
    {
 | 
			
		||||
        this.code = code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getUuid()
 | 
			
		||||
    {
 | 
			
		||||
        return uuid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setUuid(String uuid)
 | 
			
		||||
    {
 | 
			
		||||
        this.uuid = uuid;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.core.domain.model;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 用户登录对象
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class LoginBody
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户名
 | 
			
		||||
     */
 | 
			
		||||
    private String username;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户密码
 | 
			
		||||
     */
 | 
			
		||||
    private String password;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 验证码
 | 
			
		||||
     */
 | 
			
		||||
    private String code;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 唯一标识
 | 
			
		||||
     */
 | 
			
		||||
    private String uuid = "";
 | 
			
		||||
 | 
			
		||||
    public String getUsername()
 | 
			
		||||
    {
 | 
			
		||||
        return username;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setUsername(String username)
 | 
			
		||||
    {
 | 
			
		||||
        this.username = username;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getPassword()
 | 
			
		||||
    {
 | 
			
		||||
        return password;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setPassword(String password)
 | 
			
		||||
    {
 | 
			
		||||
        this.password = password;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getCode()
 | 
			
		||||
    {
 | 
			
		||||
        return code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCode(String code)
 | 
			
		||||
    {
 | 
			
		||||
        this.code = code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getUuid()
 | 
			
		||||
    {
 | 
			
		||||
        return uuid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setUuid(String uuid)
 | 
			
		||||
    {
 | 
			
		||||
        this.uuid = uuid;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,34 +1,34 @@
 | 
			
		||||
package com.ruoyi.common.exception.job;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 计划策略异常
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class TaskException extends Exception
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    private Code code;
 | 
			
		||||
 | 
			
		||||
    public TaskException(String msg, Code code)
 | 
			
		||||
    {
 | 
			
		||||
        this(msg, code, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public TaskException(String msg, Code code, Exception nestedEx)
 | 
			
		||||
    {
 | 
			
		||||
        super(msg, nestedEx);
 | 
			
		||||
        this.code = code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Code getCode()
 | 
			
		||||
    {
 | 
			
		||||
        return code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum Code
 | 
			
		||||
    {
 | 
			
		||||
        TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE
 | 
			
		||||
    }
 | 
			
		||||
package com.ruoyi.common.exception.job;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 计划策略异常
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class TaskException extends Exception
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    private Code code;
 | 
			
		||||
 | 
			
		||||
    public TaskException(String msg, Code code)
 | 
			
		||||
    {
 | 
			
		||||
        this(msg, code, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public TaskException(String msg, Code code, Exception nestedEx)
 | 
			
		||||
    {
 | 
			
		||||
        super(msg, nestedEx);
 | 
			
		||||
        this.code = code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Code getCode()
 | 
			
		||||
    {
 | 
			
		||||
        return code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum Code
 | 
			
		||||
    {
 | 
			
		||||
        TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,48 +1,48 @@
 | 
			
		||||
package com.ruoyi.common.filter;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import org.springframework.http.MediaType;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.*;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Repeatable 过滤器
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class RepeatableFilter implements Filter
 | 
			
		||||
{
 | 
			
		||||
    @Override
 | 
			
		||||
    public void init(FilterConfig filterConfig) throws ServletException
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 | 
			
		||||
            throws IOException, ServletException
 | 
			
		||||
    {
 | 
			
		||||
        ServletRequest requestWrapper = null;
 | 
			
		||||
        if (request instanceof HttpServletRequest
 | 
			
		||||
                && StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE))
 | 
			
		||||
        {
 | 
			
		||||
            requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
 | 
			
		||||
        }
 | 
			
		||||
        if (null == requestWrapper)
 | 
			
		||||
        {
 | 
			
		||||
            chain.doFilter(request, response);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            chain.doFilter(requestWrapper, response);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void destroy()
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.filter;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import org.springframework.http.MediaType;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.*;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Repeatable 过滤器
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class RepeatableFilter implements Filter
 | 
			
		||||
{
 | 
			
		||||
    @Override
 | 
			
		||||
    public void init(FilterConfig filterConfig) throws ServletException
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 | 
			
		||||
            throws IOException, ServletException
 | 
			
		||||
    {
 | 
			
		||||
        ServletRequest requestWrapper = null;
 | 
			
		||||
        if (request instanceof HttpServletRequest
 | 
			
		||||
                && StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE))
 | 
			
		||||
        {
 | 
			
		||||
            requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
 | 
			
		||||
        }
 | 
			
		||||
        if (null == requestWrapper)
 | 
			
		||||
        {
 | 
			
		||||
            chain.doFilter(request, response);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            chain.doFilter(requestWrapper, response);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void destroy()
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,75 +1,75 @@
 | 
			
		||||
package com.ruoyi.common.filter;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import javax.servlet.ReadListener;
 | 
			
		||||
import javax.servlet.ServletInputStream;
 | 
			
		||||
import javax.servlet.ServletResponse;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletRequestWrapper;
 | 
			
		||||
import com.ruoyi.common.utils.http.HttpHelper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 构建可重复读取inputStream的request
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
 | 
			
		||||
{
 | 
			
		||||
    private final byte[] body;
 | 
			
		||||
 | 
			
		||||
    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        super(request);
 | 
			
		||||
        request.setCharacterEncoding("UTF-8");
 | 
			
		||||
        response.setCharacterEncoding("UTF-8");
 | 
			
		||||
 | 
			
		||||
        body = HttpHelper.getBodyString(request).getBytes("UTF-8");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public BufferedReader getReader() throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        return new BufferedReader(new InputStreamReader(getInputStream()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ServletInputStream getInputStream() throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
 | 
			
		||||
        return new ServletInputStream()
 | 
			
		||||
        {
 | 
			
		||||
            @Override
 | 
			
		||||
            public int read() throws IOException
 | 
			
		||||
            {
 | 
			
		||||
                return bais.read();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public int available() throws IOException
 | 
			
		||||
            {
 | 
			
		||||
                return body.length;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean isFinished()
 | 
			
		||||
            {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean isReady()
 | 
			
		||||
            {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void setReadListener(ReadListener readListener)
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.filter;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import javax.servlet.ReadListener;
 | 
			
		||||
import javax.servlet.ServletInputStream;
 | 
			
		||||
import javax.servlet.ServletResponse;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletRequestWrapper;
 | 
			
		||||
import com.ruoyi.common.utils.http.HttpHelper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 构建可重复读取inputStream的request
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
 | 
			
		||||
{
 | 
			
		||||
    private final byte[] body;
 | 
			
		||||
 | 
			
		||||
    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        super(request);
 | 
			
		||||
        request.setCharacterEncoding("UTF-8");
 | 
			
		||||
        response.setCharacterEncoding("UTF-8");
 | 
			
		||||
 | 
			
		||||
        body = HttpHelper.getBodyString(request).getBytes("UTF-8");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public BufferedReader getReader() throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        return new BufferedReader(new InputStreamReader(getInputStream()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ServletInputStream getInputStream() throws IOException
 | 
			
		||||
    {
 | 
			
		||||
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
 | 
			
		||||
        return new ServletInputStream()
 | 
			
		||||
        {
 | 
			
		||||
            @Override
 | 
			
		||||
            public int read() throws IOException
 | 
			
		||||
            {
 | 
			
		||||
                return bais.read();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public int available() throws IOException
 | 
			
		||||
            {
 | 
			
		||||
                return body.length;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean isFinished()
 | 
			
		||||
            {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean isReady()
 | 
			
		||||
            {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void setReadListener(ReadListener readListener)
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,177 +1,177 @@
 | 
			
		||||
package com.ruoyi.common.utils;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.lang.Validator;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.ruoyi.common.constant.Constants;
 | 
			
		||||
import com.ruoyi.common.core.domain.entity.SysDictData;
 | 
			
		||||
import com.ruoyi.common.core.redis.RedisCache;
 | 
			
		||||
import com.ruoyi.common.utils.spring.SpringUtils;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 字典工具类
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class DictUtils
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 分隔符
 | 
			
		||||
     */
 | 
			
		||||
    public static final String SEPARATOR = ",";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置字典缓存
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key 参数键
 | 
			
		||||
     * @param dictDatas 字典数据列表
 | 
			
		||||
     */
 | 
			
		||||
    public static void setDictCache(String key, List<SysDictData> dictDatas)
 | 
			
		||||
    {
 | 
			
		||||
        SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取字典缓存
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key 参数键
 | 
			
		||||
     * @return dictDatas 字典数据列表
 | 
			
		||||
     */
 | 
			
		||||
    public static List<SysDictData> getDictCache(String key)
 | 
			
		||||
    {
 | 
			
		||||
        Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
 | 
			
		||||
        if (Validator.isNotNull(cacheObj))
 | 
			
		||||
        {
 | 
			
		||||
            List<SysDictData> dictDatas = (List<SysDictData>)cacheObj;
 | 
			
		||||
            return dictDatas;
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据字典类型和字典值获取字典标签
 | 
			
		||||
     * 
 | 
			
		||||
     * @param dictType 字典类型
 | 
			
		||||
     * @param dictValue 字典值
 | 
			
		||||
     * @return 字典标签
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDictLabel(String dictType, String dictValue)
 | 
			
		||||
    {
 | 
			
		||||
        return getDictLabel(dictType, dictValue, SEPARATOR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据字典类型和字典标签获取字典值
 | 
			
		||||
     * 
 | 
			
		||||
     * @param dictType 字典类型
 | 
			
		||||
     * @param dictLabel 字典标签
 | 
			
		||||
     * @return 字典值
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDictValue(String dictType, String dictLabel)
 | 
			
		||||
    {
 | 
			
		||||
        return getDictValue(dictType, dictLabel, SEPARATOR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据字典类型和字典值获取字典标签
 | 
			
		||||
     * 
 | 
			
		||||
     * @param dictType 字典类型
 | 
			
		||||
     * @param dictValue 字典值
 | 
			
		||||
     * @param separator 分隔符
 | 
			
		||||
     * @return 字典标签
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDictLabel(String dictType, String dictValue, String separator)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder propertyString = new StringBuilder();
 | 
			
		||||
        List<SysDictData> datas = getDictCache(dictType);
 | 
			
		||||
 | 
			
		||||
        if (StrUtil.containsAny(separator, dictValue) && 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();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return StrUtil.strip(propertyString.toString(), null, separator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据字典类型和字典标签获取字典值
 | 
			
		||||
     * 
 | 
			
		||||
     * @param dictType 字典类型
 | 
			
		||||
     * @param dictLabel 字典标签
 | 
			
		||||
     * @param separator 分隔符
 | 
			
		||||
     * @return 字典值
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDictValue(String dictType, String dictLabel, String separator)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder propertyString = new StringBuilder();
 | 
			
		||||
        List<SysDictData> datas = getDictCache(dictType);
 | 
			
		||||
 | 
			
		||||
        if (StrUtil.containsAny(separator, dictLabel) && 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();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return StrUtil.strip(propertyString.toString(), null, separator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 清空字典缓存
 | 
			
		||||
     */
 | 
			
		||||
    public static void clearDictCache()
 | 
			
		||||
    {
 | 
			
		||||
        Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*");
 | 
			
		||||
        SpringUtils.getBean(RedisCache.class).deleteObject(keys);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置cache key
 | 
			
		||||
     * 
 | 
			
		||||
     * @param configKey 参数键
 | 
			
		||||
     * @return 缓存键key
 | 
			
		||||
     */
 | 
			
		||||
    public static String getCacheKey(String configKey)
 | 
			
		||||
    {
 | 
			
		||||
        return Constants.SYS_DICT_KEY + configKey;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.utils;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.lang.Validator;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.ruoyi.common.constant.Constants;
 | 
			
		||||
import com.ruoyi.common.core.domain.entity.SysDictData;
 | 
			
		||||
import com.ruoyi.common.core.redis.RedisCache;
 | 
			
		||||
import com.ruoyi.common.utils.spring.SpringUtils;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 字典工具类
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class DictUtils
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 分隔符
 | 
			
		||||
     */
 | 
			
		||||
    public static final String SEPARATOR = ",";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置字典缓存
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key 参数键
 | 
			
		||||
     * @param dictDatas 字典数据列表
 | 
			
		||||
     */
 | 
			
		||||
    public static void setDictCache(String key, List<SysDictData> dictDatas)
 | 
			
		||||
    {
 | 
			
		||||
        SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取字典缓存
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key 参数键
 | 
			
		||||
     * @return dictDatas 字典数据列表
 | 
			
		||||
     */
 | 
			
		||||
    public static List<SysDictData> getDictCache(String key)
 | 
			
		||||
    {
 | 
			
		||||
        Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
 | 
			
		||||
        if (Validator.isNotNull(cacheObj))
 | 
			
		||||
        {
 | 
			
		||||
            List<SysDictData> dictDatas = (List<SysDictData>)cacheObj;
 | 
			
		||||
            return dictDatas;
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据字典类型和字典值获取字典标签
 | 
			
		||||
     * 
 | 
			
		||||
     * @param dictType 字典类型
 | 
			
		||||
     * @param dictValue 字典值
 | 
			
		||||
     * @return 字典标签
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDictLabel(String dictType, String dictValue)
 | 
			
		||||
    {
 | 
			
		||||
        return getDictLabel(dictType, dictValue, SEPARATOR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据字典类型和字典标签获取字典值
 | 
			
		||||
     * 
 | 
			
		||||
     * @param dictType 字典类型
 | 
			
		||||
     * @param dictLabel 字典标签
 | 
			
		||||
     * @return 字典值
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDictValue(String dictType, String dictLabel)
 | 
			
		||||
    {
 | 
			
		||||
        return getDictValue(dictType, dictLabel, SEPARATOR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据字典类型和字典值获取字典标签
 | 
			
		||||
     * 
 | 
			
		||||
     * @param dictType 字典类型
 | 
			
		||||
     * @param dictValue 字典值
 | 
			
		||||
     * @param separator 分隔符
 | 
			
		||||
     * @return 字典标签
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDictLabel(String dictType, String dictValue, String separator)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder propertyString = new StringBuilder();
 | 
			
		||||
        List<SysDictData> datas = getDictCache(dictType);
 | 
			
		||||
 | 
			
		||||
        if (StrUtil.containsAny(separator, dictValue) && 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();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return StrUtil.strip(propertyString.toString(), null, separator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据字典类型和字典标签获取字典值
 | 
			
		||||
     * 
 | 
			
		||||
     * @param dictType 字典类型
 | 
			
		||||
     * @param dictLabel 字典标签
 | 
			
		||||
     * @param separator 分隔符
 | 
			
		||||
     * @return 字典值
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDictValue(String dictType, String dictLabel, String separator)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder propertyString = new StringBuilder();
 | 
			
		||||
        List<SysDictData> datas = getDictCache(dictType);
 | 
			
		||||
 | 
			
		||||
        if (StrUtil.containsAny(separator, dictLabel) && 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();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return StrUtil.strip(propertyString.toString(), null, separator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 清空字典缓存
 | 
			
		||||
     */
 | 
			
		||||
    public static void clearDictCache()
 | 
			
		||||
    {
 | 
			
		||||
        Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*");
 | 
			
		||||
        SpringUtils.getBean(RedisCache.class).deleteObject(keys);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置cache key
 | 
			
		||||
     * 
 | 
			
		||||
     * @param configKey 参数键
 | 
			
		||||
     * @return 缓存键key
 | 
			
		||||
     */
 | 
			
		||||
    public static String getCacheKey(String configKey)
 | 
			
		||||
    {
 | 
			
		||||
        return Constants.SYS_DICT_KEY + configKey;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,76 +1,76 @@
 | 
			
		||||
package com.ruoyi.common.utils.file;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 文件类型工具类
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class FileTypeUtils
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取文件类型
 | 
			
		||||
     * <p>
 | 
			
		||||
     * 例如: ruoyi.txt, 返回: txt
 | 
			
		||||
     * 
 | 
			
		||||
     * @param file 文件名
 | 
			
		||||
     * @return 后缀(不含".")
 | 
			
		||||
     */
 | 
			
		||||
    public static String getFileType(File file)
 | 
			
		||||
    {
 | 
			
		||||
        if (null == file)
 | 
			
		||||
        {
 | 
			
		||||
            return StringUtils.EMPTY;
 | 
			
		||||
        }
 | 
			
		||||
        return getFileType(file.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取文件类型
 | 
			
		||||
     * <p>
 | 
			
		||||
     * 例如: ruoyi.txt, 返回: txt
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileName 文件名
 | 
			
		||||
     * @return 后缀(不含".")
 | 
			
		||||
     */
 | 
			
		||||
    public static String getFileType(String fileName)
 | 
			
		||||
    {
 | 
			
		||||
        int separatorIndex = fileName.lastIndexOf(".");
 | 
			
		||||
        if (separatorIndex < 0)
 | 
			
		||||
        {
 | 
			
		||||
            return "";
 | 
			
		||||
        }
 | 
			
		||||
        return fileName.substring(separatorIndex + 1).toLowerCase();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取文件类型
 | 
			
		||||
     * 
 | 
			
		||||
     * @param photoByte 文件字节码
 | 
			
		||||
     * @return 后缀(不含".")
 | 
			
		||||
     */
 | 
			
		||||
    public static String getFileExtendName(byte[] photoByte)
 | 
			
		||||
    {
 | 
			
		||||
        String strFileExtendName = "JPG";
 | 
			
		||||
        if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
 | 
			
		||||
                && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
 | 
			
		||||
        {
 | 
			
		||||
            strFileExtendName = "GIF";
 | 
			
		||||
        }
 | 
			
		||||
        else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
 | 
			
		||||
        {
 | 
			
		||||
            strFileExtendName = "JPG";
 | 
			
		||||
        }
 | 
			
		||||
        else if ((photoByte[0] == 66) && (photoByte[1] == 77))
 | 
			
		||||
        {
 | 
			
		||||
            strFileExtendName = "BMP";
 | 
			
		||||
        }
 | 
			
		||||
        else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
 | 
			
		||||
        {
 | 
			
		||||
            strFileExtendName = "PNG";
 | 
			
		||||
        }
 | 
			
		||||
        return strFileExtendName;
 | 
			
		||||
    }
 | 
			
		||||
package com.ruoyi.common.utils.file;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 文件类型工具类
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class FileTypeUtils
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取文件类型
 | 
			
		||||
     * <p>
 | 
			
		||||
     * 例如: ruoyi.txt, 返回: txt
 | 
			
		||||
     * 
 | 
			
		||||
     * @param file 文件名
 | 
			
		||||
     * @return 后缀(不含".")
 | 
			
		||||
     */
 | 
			
		||||
    public static String getFileType(File file)
 | 
			
		||||
    {
 | 
			
		||||
        if (null == file)
 | 
			
		||||
        {
 | 
			
		||||
            return StringUtils.EMPTY;
 | 
			
		||||
        }
 | 
			
		||||
        return getFileType(file.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取文件类型
 | 
			
		||||
     * <p>
 | 
			
		||||
     * 例如: ruoyi.txt, 返回: txt
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileName 文件名
 | 
			
		||||
     * @return 后缀(不含".")
 | 
			
		||||
     */
 | 
			
		||||
    public static String getFileType(String fileName)
 | 
			
		||||
    {
 | 
			
		||||
        int separatorIndex = fileName.lastIndexOf(".");
 | 
			
		||||
        if (separatorIndex < 0)
 | 
			
		||||
        {
 | 
			
		||||
            return "";
 | 
			
		||||
        }
 | 
			
		||||
        return fileName.substring(separatorIndex + 1).toLowerCase();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取文件类型
 | 
			
		||||
     * 
 | 
			
		||||
     * @param photoByte 文件字节码
 | 
			
		||||
     * @return 后缀(不含".")
 | 
			
		||||
     */
 | 
			
		||||
    public static String getFileExtendName(byte[] photoByte)
 | 
			
		||||
    {
 | 
			
		||||
        String strFileExtendName = "JPG";
 | 
			
		||||
        if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
 | 
			
		||||
                && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
 | 
			
		||||
        {
 | 
			
		||||
            strFileExtendName = "GIF";
 | 
			
		||||
        }
 | 
			
		||||
        else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
 | 
			
		||||
        {
 | 
			
		||||
            strFileExtendName = "JPG";
 | 
			
		||||
        }
 | 
			
		||||
        else if ((photoByte[0] == 66) && (photoByte[1] == 77))
 | 
			
		||||
        {
 | 
			
		||||
            strFileExtendName = "BMP";
 | 
			
		||||
        }
 | 
			
		||||
        else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
 | 
			
		||||
        {
 | 
			
		||||
            strFileExtendName = "PNG";
 | 
			
		||||
        }
 | 
			
		||||
        return strFileExtendName;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,101 +1,101 @@
 | 
			
		||||
package com.ruoyi.common.utils.file;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.ruoyi.common.config.RuoYiConfig;
 | 
			
		||||
import com.ruoyi.common.constant.Constants;
 | 
			
		||||
import org.apache.poi.util.IOUtils;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.io.ByteArrayOutputStream;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.net.URLConnection;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 图片处理工具类
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class ImageUtils
 | 
			
		||||
{
 | 
			
		||||
    private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
 | 
			
		||||
 | 
			
		||||
    public static byte[] getImage(String imagePath)
 | 
			
		||||
    {
 | 
			
		||||
        InputStream is = getFile(imagePath);
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return IOUtils.toByteArray(is);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            log.error("图片加载异常 {}", e);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            IOUtils.closeQuietly(is);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static InputStream getFile(String imagePath)
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            byte[] result = readFile(imagePath);
 | 
			
		||||
            result = Arrays.copyOf(result, result.length);
 | 
			
		||||
            return new ByteArrayInputStream(result);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            log.error("获取图片异常 {}", e);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 读取文件为字节数据
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key 地址
 | 
			
		||||
     * @return 字节数据
 | 
			
		||||
     */
 | 
			
		||||
    public static byte[] readFile(String url)
 | 
			
		||||
    {
 | 
			
		||||
        InputStream in = null;
 | 
			
		||||
        ByteArrayOutputStream baos = null;
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            if (url.startsWith("http"))
 | 
			
		||||
            {
 | 
			
		||||
                // 网络地址
 | 
			
		||||
                URL urlObj = new URL(url);
 | 
			
		||||
                URLConnection urlConnection = urlObj.openConnection();
 | 
			
		||||
                urlConnection.setConnectTimeout(30 * 1000);
 | 
			
		||||
                urlConnection.setReadTimeout(60 * 1000);
 | 
			
		||||
                urlConnection.setDoInput(true);
 | 
			
		||||
                in = urlConnection.getInputStream();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                // 本机地址
 | 
			
		||||
                String localPath = RuoYiConfig.getProfile();
 | 
			
		||||
                String downloadPath = localPath + StrUtil.subAfter(url, Constants.RESOURCE_PREFIX,false);
 | 
			
		||||
                in = new FileInputStream(downloadPath);
 | 
			
		||||
            }
 | 
			
		||||
            return IOUtils.toByteArray(in);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            log.error("获取文件路径异常 {}", e);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            IOUtils.closeQuietly(baos);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.utils.file;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.ruoyi.common.config.RuoYiConfig;
 | 
			
		||||
import com.ruoyi.common.constant.Constants;
 | 
			
		||||
import org.apache.poi.util.IOUtils;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.io.ByteArrayOutputStream;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.net.URLConnection;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 图片处理工具类
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class ImageUtils
 | 
			
		||||
{
 | 
			
		||||
    private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
 | 
			
		||||
 | 
			
		||||
    public static byte[] getImage(String imagePath)
 | 
			
		||||
    {
 | 
			
		||||
        InputStream is = getFile(imagePath);
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return IOUtils.toByteArray(is);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            log.error("图片加载异常 {}", e);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            IOUtils.closeQuietly(is);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static InputStream getFile(String imagePath)
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            byte[] result = readFile(imagePath);
 | 
			
		||||
            result = Arrays.copyOf(result, result.length);
 | 
			
		||||
            return new ByteArrayInputStream(result);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            log.error("获取图片异常 {}", e);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 读取文件为字节数据
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key 地址
 | 
			
		||||
     * @return 字节数据
 | 
			
		||||
     */
 | 
			
		||||
    public static byte[] readFile(String url)
 | 
			
		||||
    {
 | 
			
		||||
        InputStream in = null;
 | 
			
		||||
        ByteArrayOutputStream baos = null;
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            if (url.startsWith("http"))
 | 
			
		||||
            {
 | 
			
		||||
                // 网络地址
 | 
			
		||||
                URL urlObj = new URL(url);
 | 
			
		||||
                URLConnection urlConnection = urlObj.openConnection();
 | 
			
		||||
                urlConnection.setConnectTimeout(30 * 1000);
 | 
			
		||||
                urlConnection.setReadTimeout(60 * 1000);
 | 
			
		||||
                urlConnection.setDoInput(true);
 | 
			
		||||
                in = urlConnection.getInputStream();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                // 本机地址
 | 
			
		||||
                String localPath = RuoYiConfig.getProfile();
 | 
			
		||||
                String downloadPath = localPath + StrUtil.subAfter(url, Constants.RESOURCE_PREFIX,false);
 | 
			
		||||
                in = new FileInputStream(downloadPath);
 | 
			
		||||
            }
 | 
			
		||||
            return IOUtils.toByteArray(in);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            log.error("获取文件路径异常 {}", e);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            IOUtils.closeQuietly(baos);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,56 +1,56 @@
 | 
			
		||||
package com.ruoyi.common.utils.http;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.exceptions.ExceptionUtil;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.ServletRequest;
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.nio.charset.Charset;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 通用http工具封装
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class HttpHelper
 | 
			
		||||
{
 | 
			
		||||
    private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class);
 | 
			
		||||
 | 
			
		||||
    public static String getBodyString(ServletRequest request)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder sb = new StringBuilder();
 | 
			
		||||
        BufferedReader reader = null;
 | 
			
		||||
        try (InputStream inputStream = request.getInputStream())
 | 
			
		||||
        {
 | 
			
		||||
            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
 | 
			
		||||
            String line = "";
 | 
			
		||||
            while ((line = reader.readLine()) != null)
 | 
			
		||||
            {
 | 
			
		||||
                sb.append(line);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (IOException e)
 | 
			
		||||
        {
 | 
			
		||||
            LOGGER.warn("getBodyString出现问题!");
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            if (reader != null)
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    reader.close();
 | 
			
		||||
                }
 | 
			
		||||
                catch (IOException e)
 | 
			
		||||
                {
 | 
			
		||||
                    LOGGER.error(ExceptionUtil.getMessage(e));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return sb.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.utils.http;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.exceptions.ExceptionUtil;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.ServletRequest;
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.nio.charset.Charset;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 通用http工具封装
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class HttpHelper
 | 
			
		||||
{
 | 
			
		||||
    private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class);
 | 
			
		||||
 | 
			
		||||
    public static String getBodyString(ServletRequest request)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder sb = new StringBuilder();
 | 
			
		||||
        BufferedReader reader = null;
 | 
			
		||||
        try (InputStream inputStream = request.getInputStream())
 | 
			
		||||
        {
 | 
			
		||||
            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
 | 
			
		||||
            String line = "";
 | 
			
		||||
            while ((line = reader.readLine()) != null)
 | 
			
		||||
            {
 | 
			
		||||
                sb.append(line);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (IOException e)
 | 
			
		||||
        {
 | 
			
		||||
            LOGGER.warn("getBodyString出现问题!");
 | 
			
		||||
        }
 | 
			
		||||
        finally
 | 
			
		||||
        {
 | 
			
		||||
            if (reader != null)
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    reader.close();
 | 
			
		||||
                }
 | 
			
		||||
                catch (IOException e)
 | 
			
		||||
                {
 | 
			
		||||
                    LOGGER.error(ExceptionUtil.getMessage(e));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return sb.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,406 +1,406 @@
 | 
			
		||||
package com.ruoyi.common.utils.reflect;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.convert.Convert;
 | 
			
		||||
import com.ruoyi.common.utils.DateUtils;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.apache.commons.lang3.Validate;
 | 
			
		||||
import org.apache.poi.ss.usermodel.DateUtil;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.*;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@SuppressWarnings("rawtypes")
 | 
			
		||||
public class ReflectUtils
 | 
			
		||||
{
 | 
			
		||||
    private static final String SETTER_PREFIX = "set";
 | 
			
		||||
 | 
			
		||||
    private static final String GETTER_PREFIX = "get";
 | 
			
		||||
 | 
			
		||||
    private static final String CGLIB_CLASS_SEPARATOR = "$$";
 | 
			
		||||
 | 
			
		||||
    private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用Getter方法.
 | 
			
		||||
     * 支持多级,如:对象名.对象名.方法
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <E> E invokeGetter(Object obj, String propertyName)
 | 
			
		||||
    {
 | 
			
		||||
        Object object = obj;
 | 
			
		||||
        for (String name : StringUtils.split(propertyName, "."))
 | 
			
		||||
        {
 | 
			
		||||
            String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
 | 
			
		||||
            object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
 | 
			
		||||
        }
 | 
			
		||||
        return (E) object;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用Setter方法, 仅匹配方法名。
 | 
			
		||||
     * 支持多级,如:对象名.对象名.方法
 | 
			
		||||
     */
 | 
			
		||||
    public static <E> void invokeSetter(Object obj, String propertyName, E value)
 | 
			
		||||
    {
 | 
			
		||||
        Object object = obj;
 | 
			
		||||
        String[] names = StringUtils.split(propertyName, ".");
 | 
			
		||||
        for (int i = 0; i < names.length; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i < names.length - 1)
 | 
			
		||||
            {
 | 
			
		||||
                String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
 | 
			
		||||
                object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
 | 
			
		||||
                invokeMethodByName(object, setterMethodName, new Object[] { value });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <E> E getFieldValue(final Object obj, final String fieldName)
 | 
			
		||||
    {
 | 
			
		||||
        Field field = getAccessibleField(obj, fieldName);
 | 
			
		||||
        if (field == null)
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        E result = null;
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            result = (E) field.get(obj);
 | 
			
		||||
        }
 | 
			
		||||
        catch (IllegalAccessException e)
 | 
			
		||||
        {
 | 
			
		||||
            logger.error("不可能抛出的异常{}", e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
 | 
			
		||||
     */
 | 
			
		||||
    public static <E> void setFieldValue(final Object obj, final String fieldName, final E value)
 | 
			
		||||
    {
 | 
			
		||||
        Field field = getAccessibleField(obj, fieldName);
 | 
			
		||||
        if (field == null)
 | 
			
		||||
        {
 | 
			
		||||
            // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
 | 
			
		||||
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            field.set(obj, value);
 | 
			
		||||
        }
 | 
			
		||||
        catch (IllegalAccessException e)
 | 
			
		||||
        {
 | 
			
		||||
            logger.error("不可能抛出的异常: {}", e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 直接调用对象方法, 无视private/protected修饰符.
 | 
			
		||||
     * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
 | 
			
		||||
     * 同时匹配方法名+参数类型,
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <E> E invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes,
 | 
			
		||||
            final Object[] args)
 | 
			
		||||
    {
 | 
			
		||||
        if (obj == null || methodName == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Method method = getAccessibleMethod(obj, methodName, parameterTypes);
 | 
			
		||||
        if (method == null)
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return (E) method.invoke(obj, args);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
 | 
			
		||||
            throw convertReflectionExceptionToUnchecked(msg, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 直接调用对象方法, 无视private/protected修饰符,
 | 
			
		||||
     * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
 | 
			
		||||
     * 只匹配函数名,如果有多个同名函数调用第一个。
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <E> E invokeMethodByName(final Object obj, final String methodName, final Object[] args)
 | 
			
		||||
    {
 | 
			
		||||
        Method method = getAccessibleMethodByName(obj, methodName, args.length);
 | 
			
		||||
        if (method == null)
 | 
			
		||||
        {
 | 
			
		||||
            // 如果为空不报错,直接返回空。
 | 
			
		||||
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            // 类型转换(将参数数据类型转换为目标方法参数类型)
 | 
			
		||||
            Class<?>[] cs = method.getParameterTypes();
 | 
			
		||||
            for (int i = 0; i < cs.length; i++)
 | 
			
		||||
            {
 | 
			
		||||
                if (args[i] != null && !args[i].getClass().equals(cs[i]))
 | 
			
		||||
                {
 | 
			
		||||
                    if (cs[i] == String.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toStr(args[i]);
 | 
			
		||||
                        if (StringUtils.endsWith((String) args[i], ".0"))
 | 
			
		||||
                        {
 | 
			
		||||
                            args[i] = StringUtils.substringBefore((String) args[i], ".0");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Integer.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toInt(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Long.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toLong(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Double.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toDouble(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Float.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toFloat(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Date.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (args[i] instanceof String)
 | 
			
		||||
                        {
 | 
			
		||||
                            args[i] = DateUtils.parseDate(args[i]);
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            args[i] = DateUtil.getJavaDate((Double) args[i]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == boolean.class || cs[i] == Boolean.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toBool(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return (E) method.invoke(obj, args);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
 | 
			
		||||
            throw convertReflectionExceptionToUnchecked(msg, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.
 | 
			
		||||
     * 如向上转型到Object仍无法找到, 返回null.
 | 
			
		||||
     */
 | 
			
		||||
    public static Field getAccessibleField(final Object obj, final String fieldName)
 | 
			
		||||
    {
 | 
			
		||||
        // 为空不报错。直接返回 null
 | 
			
		||||
        if (obj == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Validate.notBlank(fieldName, "fieldName can't be blank");
 | 
			
		||||
        for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass())
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Field field = superClass.getDeclaredField(fieldName);
 | 
			
		||||
                makeAccessible(field);
 | 
			
		||||
                return field;
 | 
			
		||||
            }
 | 
			
		||||
            catch (NoSuchFieldException e)
 | 
			
		||||
            {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
 | 
			
		||||
     * 如向上转型到Object仍无法找到, 返回null.
 | 
			
		||||
     * 匹配函数名+参数类型。
 | 
			
		||||
     * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
 | 
			
		||||
     */
 | 
			
		||||
    public static Method getAccessibleMethod(final Object obj, final String methodName,
 | 
			
		||||
            final Class<?>... parameterTypes)
 | 
			
		||||
    {
 | 
			
		||||
        // 为空不报错。直接返回 null
 | 
			
		||||
        if (obj == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Validate.notBlank(methodName, "methodName can't be blank");
 | 
			
		||||
        for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass())
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
 | 
			
		||||
                makeAccessible(method);
 | 
			
		||||
                return method;
 | 
			
		||||
            }
 | 
			
		||||
            catch (NoSuchMethodException e)
 | 
			
		||||
            {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
 | 
			
		||||
     * 如向上转型到Object仍无法找到, 返回null.
 | 
			
		||||
     * 只匹配函数名。
 | 
			
		||||
     * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
 | 
			
		||||
     */
 | 
			
		||||
    public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum)
 | 
			
		||||
    {
 | 
			
		||||
        // 为空不报错。直接返回 null
 | 
			
		||||
        if (obj == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Validate.notBlank(methodName, "methodName can't be blank");
 | 
			
		||||
        for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass())
 | 
			
		||||
        {
 | 
			
		||||
            Method[] methods = searchType.getDeclaredMethods();
 | 
			
		||||
            for (Method method : methods)
 | 
			
		||||
            {
 | 
			
		||||
                if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum)
 | 
			
		||||
                {
 | 
			
		||||
                    makeAccessible(method);
 | 
			
		||||
                    return method;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
 | 
			
		||||
     */
 | 
			
		||||
    public static void makeAccessible(Method method)
 | 
			
		||||
    {
 | 
			
		||||
        if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers()))
 | 
			
		||||
                && !method.isAccessible())
 | 
			
		||||
        {
 | 
			
		||||
            method.setAccessible(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
 | 
			
		||||
     */
 | 
			
		||||
    public static void makeAccessible(Field field)
 | 
			
		||||
    {
 | 
			
		||||
        if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())
 | 
			
		||||
                || Modifier.isFinal(field.getModifiers())) && !field.isAccessible())
 | 
			
		||||
        {
 | 
			
		||||
            field.setAccessible(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处
 | 
			
		||||
     * 如无法找到, 返回Object.class.
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <T> Class<T> getClassGenricType(final Class clazz)
 | 
			
		||||
    {
 | 
			
		||||
        return getClassGenricType(clazz, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
 | 
			
		||||
     * 如无法找到, 返回Object.class.
 | 
			
		||||
     */
 | 
			
		||||
    public static Class getClassGenricType(final Class clazz, final int index)
 | 
			
		||||
    {
 | 
			
		||||
        Type genType = clazz.getGenericSuperclass();
 | 
			
		||||
 | 
			
		||||
        if (!(genType instanceof ParameterizedType))
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType");
 | 
			
		||||
            return Object.class;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
 | 
			
		||||
 | 
			
		||||
        if (index >= params.length || index < 0)
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
 | 
			
		||||
                    + params.length);
 | 
			
		||||
            return Object.class;
 | 
			
		||||
        }
 | 
			
		||||
        if (!(params[index] instanceof Class))
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
 | 
			
		||||
            return Object.class;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return (Class) params[index];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Class<?> getUserClass(Object instance)
 | 
			
		||||
    {
 | 
			
		||||
        if (instance == null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new RuntimeException("Instance must not be null");
 | 
			
		||||
        }
 | 
			
		||||
        Class clazz = instance.getClass();
 | 
			
		||||
        if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR))
 | 
			
		||||
        {
 | 
			
		||||
            Class<?> superClass = clazz.getSuperclass();
 | 
			
		||||
            if (superClass != null && !Object.class.equals(superClass))
 | 
			
		||||
            {
 | 
			
		||||
                return superClass;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return clazz;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 将反射时的checked exception转换为unchecked exception.
 | 
			
		||||
     */
 | 
			
		||||
    public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e)
 | 
			
		||||
    {
 | 
			
		||||
        if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException
 | 
			
		||||
                || e instanceof NoSuchMethodException)
 | 
			
		||||
        {
 | 
			
		||||
            return new IllegalArgumentException(msg, e);
 | 
			
		||||
        }
 | 
			
		||||
        else if (e instanceof InvocationTargetException)
 | 
			
		||||
        {
 | 
			
		||||
            return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException());
 | 
			
		||||
        }
 | 
			
		||||
        return new RuntimeException(msg, e);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.common.utils.reflect;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.convert.Convert;
 | 
			
		||||
import com.ruoyi.common.utils.DateUtils;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.apache.commons.lang3.Validate;
 | 
			
		||||
import org.apache.poi.ss.usermodel.DateUtil;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.*;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@SuppressWarnings("rawtypes")
 | 
			
		||||
public class ReflectUtils
 | 
			
		||||
{
 | 
			
		||||
    private static final String SETTER_PREFIX = "set";
 | 
			
		||||
 | 
			
		||||
    private static final String GETTER_PREFIX = "get";
 | 
			
		||||
 | 
			
		||||
    private static final String CGLIB_CLASS_SEPARATOR = "$$";
 | 
			
		||||
 | 
			
		||||
    private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用Getter方法.
 | 
			
		||||
     * 支持多级,如:对象名.对象名.方法
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <E> E invokeGetter(Object obj, String propertyName)
 | 
			
		||||
    {
 | 
			
		||||
        Object object = obj;
 | 
			
		||||
        for (String name : StringUtils.split(propertyName, "."))
 | 
			
		||||
        {
 | 
			
		||||
            String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
 | 
			
		||||
            object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
 | 
			
		||||
        }
 | 
			
		||||
        return (E) object;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用Setter方法, 仅匹配方法名。
 | 
			
		||||
     * 支持多级,如:对象名.对象名.方法
 | 
			
		||||
     */
 | 
			
		||||
    public static <E> void invokeSetter(Object obj, String propertyName, E value)
 | 
			
		||||
    {
 | 
			
		||||
        Object object = obj;
 | 
			
		||||
        String[] names = StringUtils.split(propertyName, ".");
 | 
			
		||||
        for (int i = 0; i < names.length; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i < names.length - 1)
 | 
			
		||||
            {
 | 
			
		||||
                String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
 | 
			
		||||
                object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
 | 
			
		||||
                invokeMethodByName(object, setterMethodName, new Object[] { value });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <E> E getFieldValue(final Object obj, final String fieldName)
 | 
			
		||||
    {
 | 
			
		||||
        Field field = getAccessibleField(obj, fieldName);
 | 
			
		||||
        if (field == null)
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        E result = null;
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            result = (E) field.get(obj);
 | 
			
		||||
        }
 | 
			
		||||
        catch (IllegalAccessException e)
 | 
			
		||||
        {
 | 
			
		||||
            logger.error("不可能抛出的异常{}", e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
 | 
			
		||||
     */
 | 
			
		||||
    public static <E> void setFieldValue(final Object obj, final String fieldName, final E value)
 | 
			
		||||
    {
 | 
			
		||||
        Field field = getAccessibleField(obj, fieldName);
 | 
			
		||||
        if (field == null)
 | 
			
		||||
        {
 | 
			
		||||
            // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
 | 
			
		||||
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            field.set(obj, value);
 | 
			
		||||
        }
 | 
			
		||||
        catch (IllegalAccessException e)
 | 
			
		||||
        {
 | 
			
		||||
            logger.error("不可能抛出的异常: {}", e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 直接调用对象方法, 无视private/protected修饰符.
 | 
			
		||||
     * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
 | 
			
		||||
     * 同时匹配方法名+参数类型,
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <E> E invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes,
 | 
			
		||||
            final Object[] args)
 | 
			
		||||
    {
 | 
			
		||||
        if (obj == null || methodName == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Method method = getAccessibleMethod(obj, methodName, parameterTypes);
 | 
			
		||||
        if (method == null)
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return (E) method.invoke(obj, args);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
 | 
			
		||||
            throw convertReflectionExceptionToUnchecked(msg, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 直接调用对象方法, 无视private/protected修饰符,
 | 
			
		||||
     * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
 | 
			
		||||
     * 只匹配函数名,如果有多个同名函数调用第一个。
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <E> E invokeMethodByName(final Object obj, final String methodName, final Object[] args)
 | 
			
		||||
    {
 | 
			
		||||
        Method method = getAccessibleMethodByName(obj, methodName, args.length);
 | 
			
		||||
        if (method == null)
 | 
			
		||||
        {
 | 
			
		||||
            // 如果为空不报错,直接返回空。
 | 
			
		||||
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            // 类型转换(将参数数据类型转换为目标方法参数类型)
 | 
			
		||||
            Class<?>[] cs = method.getParameterTypes();
 | 
			
		||||
            for (int i = 0; i < cs.length; i++)
 | 
			
		||||
            {
 | 
			
		||||
                if (args[i] != null && !args[i].getClass().equals(cs[i]))
 | 
			
		||||
                {
 | 
			
		||||
                    if (cs[i] == String.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toStr(args[i]);
 | 
			
		||||
                        if (StringUtils.endsWith((String) args[i], ".0"))
 | 
			
		||||
                        {
 | 
			
		||||
                            args[i] = StringUtils.substringBefore((String) args[i], ".0");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Integer.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toInt(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Long.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toLong(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Double.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toDouble(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Float.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toFloat(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == Date.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (args[i] instanceof String)
 | 
			
		||||
                        {
 | 
			
		||||
                            args[i] = DateUtils.parseDate(args[i]);
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            args[i] = DateUtil.getJavaDate((Double) args[i]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (cs[i] == boolean.class || cs[i] == Boolean.class)
 | 
			
		||||
                    {
 | 
			
		||||
                        args[i] = Convert.toBool(args[i]);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return (E) method.invoke(obj, args);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e)
 | 
			
		||||
        {
 | 
			
		||||
            String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
 | 
			
		||||
            throw convertReflectionExceptionToUnchecked(msg, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.
 | 
			
		||||
     * 如向上转型到Object仍无法找到, 返回null.
 | 
			
		||||
     */
 | 
			
		||||
    public static Field getAccessibleField(final Object obj, final String fieldName)
 | 
			
		||||
    {
 | 
			
		||||
        // 为空不报错。直接返回 null
 | 
			
		||||
        if (obj == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Validate.notBlank(fieldName, "fieldName can't be blank");
 | 
			
		||||
        for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass())
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Field field = superClass.getDeclaredField(fieldName);
 | 
			
		||||
                makeAccessible(field);
 | 
			
		||||
                return field;
 | 
			
		||||
            }
 | 
			
		||||
            catch (NoSuchFieldException e)
 | 
			
		||||
            {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
 | 
			
		||||
     * 如向上转型到Object仍无法找到, 返回null.
 | 
			
		||||
     * 匹配函数名+参数类型。
 | 
			
		||||
     * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
 | 
			
		||||
     */
 | 
			
		||||
    public static Method getAccessibleMethod(final Object obj, final String methodName,
 | 
			
		||||
            final Class<?>... parameterTypes)
 | 
			
		||||
    {
 | 
			
		||||
        // 为空不报错。直接返回 null
 | 
			
		||||
        if (obj == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Validate.notBlank(methodName, "methodName can't be blank");
 | 
			
		||||
        for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass())
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
 | 
			
		||||
                makeAccessible(method);
 | 
			
		||||
                return method;
 | 
			
		||||
            }
 | 
			
		||||
            catch (NoSuchMethodException e)
 | 
			
		||||
            {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
 | 
			
		||||
     * 如向上转型到Object仍无法找到, 返回null.
 | 
			
		||||
     * 只匹配函数名。
 | 
			
		||||
     * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
 | 
			
		||||
     */
 | 
			
		||||
    public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum)
 | 
			
		||||
    {
 | 
			
		||||
        // 为空不报错。直接返回 null
 | 
			
		||||
        if (obj == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        Validate.notBlank(methodName, "methodName can't be blank");
 | 
			
		||||
        for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass())
 | 
			
		||||
        {
 | 
			
		||||
            Method[] methods = searchType.getDeclaredMethods();
 | 
			
		||||
            for (Method method : methods)
 | 
			
		||||
            {
 | 
			
		||||
                if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum)
 | 
			
		||||
                {
 | 
			
		||||
                    makeAccessible(method);
 | 
			
		||||
                    return method;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
 | 
			
		||||
     */
 | 
			
		||||
    public static void makeAccessible(Method method)
 | 
			
		||||
    {
 | 
			
		||||
        if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers()))
 | 
			
		||||
                && !method.isAccessible())
 | 
			
		||||
        {
 | 
			
		||||
            method.setAccessible(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
 | 
			
		||||
     */
 | 
			
		||||
    public static void makeAccessible(Field field)
 | 
			
		||||
    {
 | 
			
		||||
        if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())
 | 
			
		||||
                || Modifier.isFinal(field.getModifiers())) && !field.isAccessible())
 | 
			
		||||
        {
 | 
			
		||||
            field.setAccessible(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处
 | 
			
		||||
     * 如无法找到, 返回Object.class.
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public static <T> Class<T> getClassGenricType(final Class clazz)
 | 
			
		||||
    {
 | 
			
		||||
        return getClassGenricType(clazz, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
 | 
			
		||||
     * 如无法找到, 返回Object.class.
 | 
			
		||||
     */
 | 
			
		||||
    public static Class getClassGenricType(final Class clazz, final int index)
 | 
			
		||||
    {
 | 
			
		||||
        Type genType = clazz.getGenericSuperclass();
 | 
			
		||||
 | 
			
		||||
        if (!(genType instanceof ParameterizedType))
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType");
 | 
			
		||||
            return Object.class;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
 | 
			
		||||
 | 
			
		||||
        if (index >= params.length || index < 0)
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
 | 
			
		||||
                    + params.length);
 | 
			
		||||
            return Object.class;
 | 
			
		||||
        }
 | 
			
		||||
        if (!(params[index] instanceof Class))
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
 | 
			
		||||
            return Object.class;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return (Class) params[index];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Class<?> getUserClass(Object instance)
 | 
			
		||||
    {
 | 
			
		||||
        if (instance == null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new RuntimeException("Instance must not be null");
 | 
			
		||||
        }
 | 
			
		||||
        Class clazz = instance.getClass();
 | 
			
		||||
        if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR))
 | 
			
		||||
        {
 | 
			
		||||
            Class<?> superClass = clazz.getSuperclass();
 | 
			
		||||
            if (superClass != null && !Object.class.equals(superClass))
 | 
			
		||||
            {
 | 
			
		||||
                return superClass;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return clazz;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 将反射时的checked exception转换为unchecked exception.
 | 
			
		||||
     */
 | 
			
		||||
    public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e)
 | 
			
		||||
    {
 | 
			
		||||
        if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException
 | 
			
		||||
                || e instanceof NoSuchMethodException)
 | 
			
		||||
        {
 | 
			
		||||
            return new IllegalArgumentException(msg, e);
 | 
			
		||||
        }
 | 
			
		||||
        else if (e instanceof InvocationTargetException)
 | 
			
		||||
        {
 | 
			
		||||
            return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException());
 | 
			
		||||
        }
 | 
			
		||||
        return new RuntimeException(msg, e);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user