mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 08:13:44 +08:00 
			
		
		
		
	@@ -41,13 +41,18 @@
 | 
			
		||||
 | 
			
		||||
### 其他
 | 
			
		||||
 | 
			
		||||
* 同步升级 RuoYi-Vue 3.4.0
 | 
			
		||||
* 同步升级 RuoYi-Vue 3.5.0
 | 
			
		||||
* 单模块 fast 分支 [RuoYi-Vue-Plus-fast](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/)
 | 
			
		||||
 | 
			
		||||
## 关注作者(扫码请备注: "加群")
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
## 捐献作者
 | 
			
		||||
作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭  
 | 
			
		||||
<img src="https://images.gitee.com/uploads/images/2021/0525/101654_451e4523_1766278.jpeg" width="300px" height="450px" />
 | 
			
		||||
<img src="https://images.gitee.com/uploads/images/2021/0525/101713_3d18b119_1766278.jpeg" width="300px" height="450px" />
 | 
			
		||||
 | 
			
		||||
## 重点注意事项
 | 
			
		||||
 | 
			
		||||
若依文档对事务注解的描述 [关于事务](https://doc.ruoyi.vip/ruoyi/document/htsc.html#%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86)  以下对多数据源事务做补充:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								pom.xml
									
									
									
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
<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>
 | 
			
		||||
	<modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <groupId>com.ruoyi</groupId>
 | 
			
		||||
    <artifactId>ruoyi-vue-plus</artifactId>
 | 
			
		||||
@@ -13,21 +13,21 @@
 | 
			
		||||
    <description>RuoYi-Vue-Plus后台管理系统</description>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
        <ruoyi-vue-plus.version>2.1.2</ruoyi-vue-plus.version>
 | 
			
		||||
        <ruoyi-vue-plus.version>2.2.0</ruoyi-vue-plus.version>
 | 
			
		||||
        <spring-boot.version>2.3.11.RELEASE</spring-boot.version>
 | 
			
		||||
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
			
		||||
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 | 
			
		||||
        <java.version>1.8</java.version>
 | 
			
		||||
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
 | 
			
		||||
        <druid.version>1.2.4</druid.version>
 | 
			
		||||
        <druid.version>1.2.6</druid.version>
 | 
			
		||||
        <knife4j.version>3.0.2</knife4j.version>
 | 
			
		||||
        <swagger-annotations.version>1.5.22</swagger-annotations.version>
 | 
			
		||||
        <fastjson.version>1.2.75</fastjson.version>
 | 
			
		||||
        <fastjson.version>1.2.76</fastjson.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.3</mybatis-plus.version>
 | 
			
		||||
        <hutool.version>5.5.8</hutool.version>
 | 
			
		||||
        <hutool.version>5.6.5</hutool.version>
 | 
			
		||||
        <feign.version>2.2.6.RELEASE</feign.version>
 | 
			
		||||
        <feign-okhttp.version>11.0</feign-okhttp.version>
 | 
			
		||||
        <spring-boot-admin.version>2.3.1</spring-boot-admin.version>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,89 +1,89 @@
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</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>
 | 
			
		||||
 | 
			
		||||
         <!-- 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>
 | 
			
		||||
        <finalName>${project.artifactId}</finalName>
 | 
			
		||||
        <plugins>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                <artifactId>spring-boot-maven-plugin</artifactId>
 | 
			
		||||
                <version>${spring-boot.version}</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>
 | 
			
		||||
    </build>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</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>
 | 
			
		||||
 | 
			
		||||
         <!-- 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>
 | 
			
		||||
        <finalName>${project.artifactId}</finalName>
 | 
			
		||||
        <plugins>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                <artifactId>spring-boot-maven-plugin</artifactId>
 | 
			
		||||
                <version>${spring-boot.version}</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>
 | 
			
		||||
    </build>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -52,6 +52,12 @@ public class CaptchaController {
 | 
			
		||||
	 */
 | 
			
		||||
	@GetMapping("/captchaImage")
 | 
			
		||||
	public AjaxResult getCode() {
 | 
			
		||||
		Map<String, Object> ajax = new HashMap<>();
 | 
			
		||||
		Boolean enabled = captchaProperties.getEnabled();
 | 
			
		||||
		ajax.put("enabled", enabled);
 | 
			
		||||
		if (!enabled) {
 | 
			
		||||
			return AjaxResult.success(ajax);
 | 
			
		||||
		}
 | 
			
		||||
		// 保存验证码信息
 | 
			
		||||
		String uuid = IdUtil.simpleUUID();
 | 
			
		||||
		String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
 | 
			
		||||
@@ -90,7 +96,6 @@ public class CaptchaController {
 | 
			
		||||
			code = captcha.getCode();
 | 
			
		||||
		}
 | 
			
		||||
		redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
 | 
			
		||||
		Map<String,Object> ajax = new HashMap<>();
 | 
			
		||||
		ajax.put("uuid", uuid);
 | 
			
		||||
		ajax.put("img", captcha.getImageBase64());
 | 
			
		||||
		return AjaxResult.success(ajax);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,7 @@
 | 
			
		||||
---
 | 
			
		||||
server:
 | 
			
		||||
  port: 8081
 | 
			
		||||
---
 | 
			
		||||
# 数据源配置
 | 
			
		||||
spring:
 | 
			
		||||
  datasource:
 | 
			
		||||
@@ -6,9 +10,9 @@ spring:
 | 
			
		||||
    druid:
 | 
			
		||||
      # 主库数据源
 | 
			
		||||
      master:
 | 
			
		||||
        url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
 | 
			
		||||
        username: root
 | 
			
		||||
        password: root
 | 
			
		||||
        url: jdbc:mysql://39.101.143.184:3306/ruoyi-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
 | 
			
		||||
        username: ruoyi-vue
 | 
			
		||||
        password: ryvue
 | 
			
		||||
      # 从库数据源
 | 
			
		||||
      slave:
 | 
			
		||||
        # 从数据源开关/默认关闭
 | 
			
		||||
@@ -58,13 +62,13 @@ spring:
 | 
			
		||||
  # redis 配置
 | 
			
		||||
  redis:
 | 
			
		||||
    # 地址
 | 
			
		||||
    host: localhost
 | 
			
		||||
    host: 39.101.143.184
 | 
			
		||||
    # 端口,默认为6379
 | 
			
		||||
    port: 6379
 | 
			
		||||
    # 数据库索引
 | 
			
		||||
    database: 0
 | 
			
		||||
    # 密码
 | 
			
		||||
    password:
 | 
			
		||||
    password: ryvue
 | 
			
		||||
    # 连接超时时间
 | 
			
		||||
    timeout: 10s
 | 
			
		||||
    lettuce:
 | 
			
		||||
@@ -76,4 +80,4 @@ spring:
 | 
			
		||||
        # 连接池的最大数据库连接数
 | 
			
		||||
        max-active: 8
 | 
			
		||||
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
 | 
			
		||||
        max-wait: -1ms
 | 
			
		||||
        max-wait: -1ms
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,8 @@ ruoyi:
 | 
			
		||||
  addressEnabled: false
 | 
			
		||||
 | 
			
		||||
captcha:
 | 
			
		||||
  # 验证码开关
 | 
			
		||||
  enabled: true
 | 
			
		||||
  # 验证码类型 math 数组计算 char 字符验证
 | 
			
		||||
  type: math
 | 
			
		||||
  # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@
 | 
			
		||||
            <groupId>org.apache.commons</groupId>
 | 
			
		||||
            <artifactId>commons-lang3</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
        <!-- JSON工具类 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.fasterxml.jackson.core</groupId>
 | 
			
		||||
@@ -153,4 +153,4 @@
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ import java.util.Set;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 登录用户身份权限
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@@ -81,6 +81,7 @@ public class LoginUser implements UserDetails
 | 
			
		||||
        return user.getPassword();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	@JsonIgnore
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getUsername()
 | 
			
		||||
    {
 | 
			
		||||
@@ -99,7 +100,7 @@ public class LoginUser implements UserDetails
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 指定用户是否解锁,锁定的用户无法进行身份验证
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @JsonIgnore
 | 
			
		||||
@@ -111,7 +112,7 @@ public class LoginUser implements UserDetails
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @JsonIgnore
 | 
			
		||||
@@ -123,7 +124,7 @@ public class LoginUser implements UserDetails
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否可用 ,禁用的用户不能身份验证
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @JsonIgnore
 | 
			
		||||
@@ -133,6 +134,7 @@ public class LoginUser implements UserDetails
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	@JsonIgnore
 | 
			
		||||
    @Override
 | 
			
		||||
    public Collection<? extends GrantedAuthority> getAuthorities()
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package com.ruoyi.common.filter;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.lang.Validator;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.hutool.http.HtmlUtil;
 | 
			
		||||
import org.apache.commons.io.IOUtils;
 | 
			
		||||
import org.springframework.http.HttpHeaders;
 | 
			
		||||
@@ -15,7 +16,7 @@ import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * XSS过滤处理
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
 | 
			
		||||
@@ -94,12 +95,12 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否是Json请求
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @param request
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isJsonRequest()
 | 
			
		||||
    {
 | 
			
		||||
        String header = super.getHeader(HttpHeaders.CONTENT_TYPE);
 | 
			
		||||
        return MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(header);
 | 
			
		||||
        return StrUtil.startWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,72 +1,72 @@
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</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>
 | 
			
		||||
 | 
			
		||||
        <!-- SpringBoot 校验框架 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-validation</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 阿里数据库连接池 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba</groupId>
 | 
			
		||||
            <artifactId>druid-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 系统模块-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-system</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</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>
 | 
			
		||||
 | 
			
		||||
        <!-- SpringBoot 校验框架 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-validation</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 阿里数据库连接池 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba</groupId>
 | 
			
		||||
            <artifactId>druid-spring-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 系统模块-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.ruoyi</groupId>
 | 
			
		||||
            <artifactId>ruoyi-system</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package com.ruoyi.framework.aspectj;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.lang.Validator;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.alibaba.fastjson.JSON;
 | 
			
		||||
import com.ruoyi.common.annotation.Log;
 | 
			
		||||
@@ -36,7 +37,7 @@ import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 操作日志记录处理
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Aspect
 | 
			
		||||
@@ -64,7 +65,7 @@ public class LogAspect
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 拦截异常操作
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @param joinPoint 切点
 | 
			
		||||
     * @param e 异常
 | 
			
		||||
     */
 | 
			
		||||
@@ -130,7 +131,7 @@ public class LogAspect
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取注解中对方法的描述信息 用于Controller层注解
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @param log 日志
 | 
			
		||||
     * @param operLog 操作日志
 | 
			
		||||
     * @throws Exception
 | 
			
		||||
@@ -153,7 +154,7 @@ public class LogAspect
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取请求的参数,放到log中
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @param operLog 操作日志
 | 
			
		||||
     * @throws Exception 异常
 | 
			
		||||
     */
 | 
			
		||||
@@ -198,7 +199,7 @@ public class LogAspect
 | 
			
		||||
        {
 | 
			
		||||
            for (int i = 0; i < paramsArray.length; i++)
 | 
			
		||||
            {
 | 
			
		||||
                if (!isFilterObject(paramsArray[i]))
 | 
			
		||||
                if (Validator.isNotNull(paramsArray[i]) && !isFilterObject(paramsArray[i]))
 | 
			
		||||
                {
 | 
			
		||||
                    Object jsonObj = JSON.toJSON(paramsArray[i]);
 | 
			
		||||
                    params += jsonObj.toString() + " ";
 | 
			
		||||
@@ -210,7 +211,7 @@ public class LogAspect
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 判断是否需要过滤的对象。
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @param o 对象信息。
 | 
			
		||||
     * @return 如果是需要过滤的对象,则返回true;否则返回false。
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,71 +0,0 @@
 | 
			
		||||
package com.ruoyi.framework.config;
 | 
			
		||||
 | 
			
		||||
import com.alibaba.fastjson.JSON;
 | 
			
		||||
import com.alibaba.fastjson.serializer.SerializerFeature;
 | 
			
		||||
import com.fasterxml.jackson.databind.JavaType;
 | 
			
		||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
			
		||||
import com.fasterxml.jackson.databind.type.TypeFactory;
 | 
			
		||||
import org.springframework.data.redis.serializer.RedisSerializer;
 | 
			
		||||
import org.springframework.data.redis.serializer.SerializationException;
 | 
			
		||||
import com.alibaba.fastjson.parser.ParserConfig;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import java.nio.charset.Charset;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Redis使用FastJson序列化
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
 | 
			
		||||
{
 | 
			
		||||
    @SuppressWarnings("unused")
 | 
			
		||||
    private ObjectMapper objectMapper = new ObjectMapper();
 | 
			
		||||
 | 
			
		||||
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
 | 
			
		||||
 | 
			
		||||
    private Class<T> clazz;
 | 
			
		||||
 | 
			
		||||
    static
 | 
			
		||||
    {
 | 
			
		||||
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public FastJson2JsonRedisSerializer(Class<T> clazz)
 | 
			
		||||
    {
 | 
			
		||||
        super();
 | 
			
		||||
        this.clazz = clazz;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public byte[] serialize(T t) throws SerializationException
 | 
			
		||||
    {
 | 
			
		||||
        if (t == null)
 | 
			
		||||
        {
 | 
			
		||||
            return new byte[0];
 | 
			
		||||
        }
 | 
			
		||||
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public T deserialize(byte[] bytes) throws SerializationException
 | 
			
		||||
    {
 | 
			
		||||
        if (bytes == null || bytes.length <= 0)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        String str = new String(bytes, DEFAULT_CHARSET);
 | 
			
		||||
 | 
			
		||||
        return JSON.parseObject(str, clazz);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setObjectMapper(ObjectMapper objectMapper)
 | 
			
		||||
    {
 | 
			
		||||
        Assert.notNull(objectMapper, "'objectMapper' must not be null");
 | 
			
		||||
        this.objectMapper = objectMapper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected JavaType getJavaType(Class<?> clazz)
 | 
			
		||||
    {
 | 
			
		||||
        return TypeFactory.defaultInstance().constructType(clazz);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package com.ruoyi.framework.config;
 | 
			
		||||
 | 
			
		||||
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
 | 
			
		||||
import org.springframework.cache.annotation.CachingConfigurerSupport;
 | 
			
		||||
import org.springframework.cache.annotation.EnableCaching;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
@@ -7,15 +8,10 @@ import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
 | 
			
		||||
import org.springframework.data.redis.core.RedisTemplate;
 | 
			
		||||
import org.springframework.data.redis.serializer.StringRedisSerializer;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonAutoDetect;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
 | 
			
		||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
 | 
			
		||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
			
		||||
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * redis配置
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@@ -29,16 +25,17 @@ public class RedisConfig extends CachingConfigurerSupport
 | 
			
		||||
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
 | 
			
		||||
        template.setConnectionFactory(connectionFactory);
 | 
			
		||||
 | 
			
		||||
        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
 | 
			
		||||
        GenericFastJsonRedisSerializer serializer = new GenericFastJsonRedisSerializer();
 | 
			
		||||
		StringRedisSerializer keySerializer = new StringRedisSerializer();
 | 
			
		||||
 | 
			
		||||
        ObjectMapper mapper = new ObjectMapper();
 | 
			
		||||
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
 | 
			
		||||
        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
 | 
			
		||||
        serializer.setObjectMapper(mapper);
 | 
			
		||||
 | 
			
		||||
        template.setValueSerializer(serializer);
 | 
			
		||||
        // 使用StringRedisSerializer来序列化和反序列化redis的key值
 | 
			
		||||
        template.setKeySerializer(new StringRedisSerializer());
 | 
			
		||||
		template.setKeySerializer(keySerializer);
 | 
			
		||||
        template.setValueSerializer(serializer);
 | 
			
		||||
 | 
			
		||||
        // Hash的key也采用StringRedisSerializer的序列化方式
 | 
			
		||||
        template.setHashKeySerializer(keySerializer);
 | 
			
		||||
        template.setHashValueSerializer(serializer);
 | 
			
		||||
 | 
			
		||||
        template.afterPropertiesSet();
 | 
			
		||||
        return template;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -13,12 +13,29 @@ import org.springframework.stereotype.Component;
 | 
			
		||||
@Component
 | 
			
		||||
@ConfigurationProperties(prefix = "captcha")
 | 
			
		||||
public class CaptchaProperties {
 | 
			
		||||
    // 验证码类型
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 验证码开关
 | 
			
		||||
	 */
 | 
			
		||||
	private Boolean enabled;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 验证码类型
 | 
			
		||||
 	 */
 | 
			
		||||
    private String type;
 | 
			
		||||
    // 验证码类别
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 验证码类别
 | 
			
		||||
	 */
 | 
			
		||||
    private String category;
 | 
			
		||||
    // 数字验证码位数
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 数字验证码位数
 | 
			
		||||
	 */
 | 
			
		||||
    private Integer numberLength;
 | 
			
		||||
    // 字符验证码长度
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 字符验证码长度
 | 
			
		||||
	 */
 | 
			
		||||
    private Integer charLength;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,26 +1,33 @@
 | 
			
		||||
package com.ruoyi.framework.web.service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.security.authentication.AuthenticationManager;
 | 
			
		||||
import org.springframework.security.authentication.BadCredentialsException;
 | 
			
		||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 | 
			
		||||
import org.springframework.security.core.Authentication;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import com.ruoyi.common.constant.Constants;
 | 
			
		||||
import com.ruoyi.common.core.domain.entity.SysUser;
 | 
			
		||||
import com.ruoyi.common.core.domain.model.LoginUser;
 | 
			
		||||
import com.ruoyi.common.core.redis.RedisCache;
 | 
			
		||||
import com.ruoyi.common.exception.CustomException;
 | 
			
		||||
import com.ruoyi.common.exception.user.CaptchaException;
 | 
			
		||||
import com.ruoyi.common.exception.user.CaptchaExpireException;
 | 
			
		||||
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
 | 
			
		||||
import com.ruoyi.common.utils.DateUtils;
 | 
			
		||||
import com.ruoyi.common.utils.MessageUtils;
 | 
			
		||||
import com.ruoyi.common.utils.ServletUtils;
 | 
			
		||||
import com.ruoyi.common.utils.ip.IpUtils;
 | 
			
		||||
import com.ruoyi.framework.config.properties.CaptchaProperties;
 | 
			
		||||
import com.ruoyi.framework.manager.AsyncManager;
 | 
			
		||||
import com.ruoyi.framework.manager.factory.AsyncFactory;
 | 
			
		||||
import com.ruoyi.system.service.ISysUserService;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.security.authentication.AuthenticationManager;
 | 
			
		||||
import org.springframework.security.authentication.BadCredentialsException;
 | 
			
		||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 | 
			
		||||
import org.springframework.security.core.Authentication;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 登录校验方法
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Component
 | 
			
		||||
@@ -35,9 +42,15 @@ public class SysLoginService
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RedisCache redisCache;
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private CaptchaProperties captchaProperties;
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
    private ISysUserService userService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 登录验证
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @param username 用户名
 | 
			
		||||
     * @param password 密码
 | 
			
		||||
     * @param code 验证码
 | 
			
		||||
@@ -46,19 +59,19 @@ public class SysLoginService
 | 
			
		||||
     */
 | 
			
		||||
    public String login(String username, String password, String code, String uuid)
 | 
			
		||||
    {
 | 
			
		||||
        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
 | 
			
		||||
        String captcha = redisCache.getCacheObject(verifyKey);
 | 
			
		||||
        redisCache.deleteObject(verifyKey);
 | 
			
		||||
        if (captcha == null)
 | 
			
		||||
        {
 | 
			
		||||
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
 | 
			
		||||
            throw new CaptchaExpireException();
 | 
			
		||||
        }
 | 
			
		||||
        if (!code.equalsIgnoreCase(captcha))
 | 
			
		||||
        {
 | 
			
		||||
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
 | 
			
		||||
            throw new CaptchaException();
 | 
			
		||||
        }
 | 
			
		||||
		if(captchaProperties.getEnabled()) {
 | 
			
		||||
			String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
 | 
			
		||||
			String captcha = redisCache.getCacheObject(verifyKey);
 | 
			
		||||
			redisCache.deleteObject(verifyKey);
 | 
			
		||||
			if (captcha == null) {
 | 
			
		||||
				AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
 | 
			
		||||
				throw new CaptchaExpireException();
 | 
			
		||||
			}
 | 
			
		||||
			if (!code.equalsIgnoreCase(captcha)) {
 | 
			
		||||
				AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
 | 
			
		||||
				throw new CaptchaException();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
        // 用户验证
 | 
			
		||||
        Authentication authentication = null;
 | 
			
		||||
        try
 | 
			
		||||
@@ -82,7 +95,19 @@ public class SysLoginService
 | 
			
		||||
        }
 | 
			
		||||
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
 | 
			
		||||
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
 | 
			
		||||
        recordLoginInfo(loginUser.getUser());
 | 
			
		||||
        // 生成token
 | 
			
		||||
        return tokenService.createToken(loginUser);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 记录登录信息
 | 
			
		||||
     */
 | 
			
		||||
    public void recordLoginInfo(SysUser user)
 | 
			
		||||
    {
 | 
			
		||||
        user.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
 | 
			
		||||
        user.setLoginDate(DateUtils.getNowDate());
 | 
			
		||||
		user.setUpdateBy(user.getUserName());
 | 
			
		||||
        userService.updateUserProfile(user);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,34 +1,34 @@
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</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>
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</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>
 | 
			
		||||
 
 | 
			
		||||
@@ -143,6 +143,7 @@ public class GenTableServiceImpl extends ServiceImpl<GenTableMapper, GenTable> i
 | 
			
		||||
                                .set(cenTableColumn.getIsEdit() == null, GenTableColumn::getIsEdit, null)
 | 
			
		||||
                                .set(cenTableColumn.getIsList() == null, GenTableColumn::getIsList, null)
 | 
			
		||||
                                .set(cenTableColumn.getIsQuery() == null, GenTableColumn::getIsQuery, null)
 | 
			
		||||
								.set(cenTableColumn.getIsRequired() == null, GenTableColumn::getIsRequired, null)
 | 
			
		||||
                                .eq(GenTableColumn::getColumnId,cenTableColumn.getColumnId()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -458,4 +459,4 @@ public class GenTableServiceImpl extends ServiceImpl<GenTableMapper, GenTable> i
 | 
			
		||||
        }
 | 
			
		||||
        return genPath + File.separator + VelocityUtils.getFileName(template, table);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,10 +29,12 @@ public class ${ClassName}AddBo {
 | 
			
		||||
#if($column.javaType == 'Date')
 | 
			
		||||
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
#end
 | 
			
		||||
#if($column.isRequired==1)
 | 
			
		||||
#if($column.javaType == 'String')
 | 
			
		||||
    @NotBlank(message = "$column.columnComment不能为空")
 | 
			
		||||
#else
 | 
			
		||||
    @NotNull(message = "$column.columnComment不能为空")
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
    private $column.javaType $column.javaField;
 | 
			
		||||
#end
 | 
			
		||||
 
 | 
			
		||||
@@ -29,10 +29,12 @@ public class ${ClassName}EditBo {
 | 
			
		||||
#if($column.javaType == 'Date')
 | 
			
		||||
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
#end
 | 
			
		||||
#if($column.isRequired==1)
 | 
			
		||||
#if($column.javaType == 'String')
 | 
			
		||||
    @NotBlank(message = "$column.columnComment不能为空")
 | 
			
		||||
#else
 | 
			
		||||
    @NotNull(message = "$column.columnComment不能为空")
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
    private $column.javaType $column.javaField;
 | 
			
		||||
#end
 | 
			
		||||
 
 | 
			
		||||
@@ -108,6 +108,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
		  :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['${moduleName}:${businessName}:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -158,7 +159,7 @@
 | 
			
		||||
        </template>
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
    </el-table>
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    <pagination
 | 
			
		||||
      v-show="total>0"
 | 
			
		||||
      :total="total"
 | 
			
		||||
@@ -354,6 +355,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
#if($table.sub)
 | 
			
		||||
@@ -630,10 +633,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return export${BusinessName}(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,40 +1,40 @@
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>ruoyi-quartz</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        quartz定时任务
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- 定时任务 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-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>
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <artifactId>ruoyi-quartz</artifactId>
 | 
			
		||||
 | 
			
		||||
    <description>
 | 
			
		||||
        quartz定时任务
 | 
			
		||||
    </description>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 | 
			
		||||
        <!-- 定时任务 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-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,134 +1,134 @@
 | 
			
		||||
package com.ruoyi.quartz.domain;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.*;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonFormat;
 | 
			
		||||
import com.ruoyi.common.annotation.Excel;
 | 
			
		||||
import com.ruoyi.common.annotation.Excel.ColumnType;
 | 
			
		||||
import com.ruoyi.common.constant.ScheduleConstants;
 | 
			
		||||
import com.ruoyi.quartz.util.CronUtils;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
 | 
			
		||||
import javax.validation.constraints.NotBlank;
 | 
			
		||||
import javax.validation.constraints.Size;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 定时任务调度表 sys_job
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@Accessors(chain = true)
 | 
			
		||||
@TableName("sys_job")
 | 
			
		||||
public class SysJob implements Serializable {
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务ID
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "任务序号", cellType = ColumnType.NUMERIC)
 | 
			
		||||
    @TableId(value = "job_id", type = IdType.AUTO)
 | 
			
		||||
    private Long jobId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务名称
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "任务名称不能为空")
 | 
			
		||||
    @Size(min = 0, max = 64, message = "任务名称不能超过64个字符")
 | 
			
		||||
    @Excel(name = "任务名称")
 | 
			
		||||
    private String jobName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务组名
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "任务组名")
 | 
			
		||||
    private String jobGroup;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用目标字符串
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "调用目标字符串不能为空")
 | 
			
		||||
    @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符")
 | 
			
		||||
    @Excel(name = "调用目标字符串")
 | 
			
		||||
    private String invokeTarget;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * cron执行表达式
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "Cron执行表达式不能为空")
 | 
			
		||||
    @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符")
 | 
			
		||||
    @Excel(name = "执行表达式 ")
 | 
			
		||||
    private String cronExpression;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * cron计划策略
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行")
 | 
			
		||||
    private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否并发执行(0允许 1禁止)
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止")
 | 
			
		||||
    private String concurrent;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务状态(0正常 1暂停)
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停")
 | 
			
		||||
    private String status;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建者
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(fill = FieldFill.INSERT)
 | 
			
		||||
    private String createBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建时间
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(fill = FieldFill.INSERT)
 | 
			
		||||
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
    private Date createTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新者
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(fill = FieldFill.INSERT_UPDATE)
 | 
			
		||||
    private String updateBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新时间
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(fill = FieldFill.INSERT_UPDATE)
 | 
			
		||||
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
    private Date updateTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 备注
 | 
			
		||||
     */
 | 
			
		||||
    private String remark;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 请求参数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(exist = false)
 | 
			
		||||
    private Map<String, Object> params = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
    public Date getNextValidTime() {
 | 
			
		||||
        if (StrUtil.isNotEmpty(cronExpression)) {
 | 
			
		||||
            return CronUtils.getNextExecution(cronExpression);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
package com.ruoyi.quartz.domain;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.*;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonFormat;
 | 
			
		||||
import com.ruoyi.common.annotation.Excel;
 | 
			
		||||
import com.ruoyi.common.annotation.Excel.ColumnType;
 | 
			
		||||
import com.ruoyi.common.constant.ScheduleConstants;
 | 
			
		||||
import com.ruoyi.quartz.util.CronUtils;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
import lombok.experimental.Accessors;
 | 
			
		||||
 | 
			
		||||
import javax.validation.constraints.NotBlank;
 | 
			
		||||
import javax.validation.constraints.Size;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 定时任务调度表 sys_job
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@Accessors(chain = true)
 | 
			
		||||
@TableName("sys_job")
 | 
			
		||||
public class SysJob implements Serializable {
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务ID
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "任务序号", cellType = ColumnType.NUMERIC)
 | 
			
		||||
    @TableId(value = "job_id", type = IdType.AUTO)
 | 
			
		||||
    private Long jobId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务名称
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "任务名称不能为空")
 | 
			
		||||
    @Size(min = 0, max = 64, message = "任务名称不能超过64个字符")
 | 
			
		||||
    @Excel(name = "任务名称")
 | 
			
		||||
    private String jobName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务组名
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "任务组名")
 | 
			
		||||
    private String jobGroup;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用目标字符串
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "调用目标字符串不能为空")
 | 
			
		||||
    @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符")
 | 
			
		||||
    @Excel(name = "调用目标字符串")
 | 
			
		||||
    private String invokeTarget;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * cron执行表达式
 | 
			
		||||
     */
 | 
			
		||||
    @NotBlank(message = "Cron执行表达式不能为空")
 | 
			
		||||
    @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符")
 | 
			
		||||
    @Excel(name = "执行表达式 ")
 | 
			
		||||
    private String cronExpression;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * cron计划策略
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行")
 | 
			
		||||
    private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否并发执行(0允许 1禁止)
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止")
 | 
			
		||||
    private String concurrent;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 任务状态(0正常 1暂停)
 | 
			
		||||
     */
 | 
			
		||||
    @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停")
 | 
			
		||||
    private String status;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建者
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(fill = FieldFill.INSERT)
 | 
			
		||||
    private String createBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建时间
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(fill = FieldFill.INSERT)
 | 
			
		||||
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
    private Date createTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新者
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(fill = FieldFill.INSERT_UPDATE)
 | 
			
		||||
    private String updateBy;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新时间
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(fill = FieldFill.INSERT_UPDATE)
 | 
			
		||||
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
    private Date updateTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 备注
 | 
			
		||||
     */
 | 
			
		||||
    private String remark;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 请求参数
 | 
			
		||||
     */
 | 
			
		||||
    @TableField(exist = false)
 | 
			
		||||
    private Map<String, Object> params = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
			
		||||
    public Date getNextValidTime() {
 | 
			
		||||
        if (StrUtil.isNotEmpty(cronExpression)) {
 | 
			
		||||
            return CronUtils.getNextExecution(cronExpression);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +1,28 @@
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</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>
 | 
			
		||||
<?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-vue-plus</artifactId>
 | 
			
		||||
        <groupId>com.ruoyi</groupId>
 | 
			
		||||
        <version>${ruoyi-vue-plus.version}</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>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "ruoyi-vue-plus",
 | 
			
		||||
  "version": "2.1.2",
 | 
			
		||||
  "version": "2.2.0",
 | 
			
		||||
  "description": "RuoYi-Vue-Plus后台管理系统",
 | 
			
		||||
  "author": "LionLi",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										46
									
								
								ruoyi-ui/public/html/ie.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								ruoyi-ui/public/html/ie.html
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -7,6 +7,7 @@
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
 | 
			
		||||
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
 | 
			
		||||
    <title><%= webpackConfig.name %></title>
 | 
			
		||||
    <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
 | 
			
		||||
	  <style>
 | 
			
		||||
    html,
 | 
			
		||||
    body,
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,21 @@
 | 
			
		||||
            <span>更新日志</span>
 | 
			
		||||
          </div>
 | 
			
		||||
          <el-collapse accordion>
 | 
			
		||||
            <el-collapse-item title="v2.1.1 - 2021-5-21">
 | 
			
		||||
            <el-collapse-item title="v2.2.0 - 2021-5-25">
 | 
			
		||||
              <ol>
 | 
			
		||||
                <li>同步升级 RuoYi-Vue 3.5.0</li>
 | 
			
		||||
                <li>add 增加验证码开关</li>
 | 
			
		||||
                <li>add 新增IE浏览器版本过低提示页面</li>
 | 
			
		||||
                <li>update 升级druid到最新版本v1.2.6</li>
 | 
			
		||||
                <li>update 升级fastjson到最新版1.2.76</li>
 | 
			
		||||
                <li>update 修改bo加入判断是否设置必填再加载必填注解</li>
 | 
			
		||||
                <li>update 生成vue模板导出按钮点击后添加遮罩</li>
 | 
			
		||||
                <li>update Redis设置HashKey序列化</li>
 | 
			
		||||
                <li>update 优化Redis序列化配置</li>
 | 
			
		||||
                <li>fix 修复代码生成器中表字段取消必填无法更新问题</li>
 | 
			
		||||
              </ol>
 | 
			
		||||
            </el-collapse-item>
 | 
			
		||||
            <el-collapse-item title="v2.1.2 - 2021-5-21">
 | 
			
		||||
              <ol>
 | 
			
		||||
                <li>update springboot 升级 2.3.11</li>
 | 
			
		||||
                <li>update mybatis-plus 升级 3.4.3 分页Plus对象适配更新</li>
 | 
			
		||||
@@ -166,7 +180,7 @@ export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      // 版本号
 | 
			
		||||
      version: "2.1.0",
 | 
			
		||||
      version: "2.2.0",
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
 | 
			
		||||
        </el-input>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
      <el-form-item prop="code">
 | 
			
		||||
      <el-form-item prop="code" v-if="captchaEnabled">
 | 
			
		||||
        <el-input
 | 
			
		||||
          v-model="loginForm.code"
 | 
			
		||||
          auto-complete="off"
 | 
			
		||||
@@ -81,7 +81,8 @@ export default {
 | 
			
		||||
        code: [{ required: true, trigger: "change", message: "验证码不能为空" }]
 | 
			
		||||
      },
 | 
			
		||||
      loading: false,
 | 
			
		||||
      redirect: undefined
 | 
			
		||||
      redirect: undefined,
 | 
			
		||||
      captchaEnabled:false
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
@@ -99,8 +100,11 @@ export default {
 | 
			
		||||
  methods: {
 | 
			
		||||
    getCode() {
 | 
			
		||||
      getCodeImg().then(res => {
 | 
			
		||||
        this.codeUrl = "data:image/gif;base64," + res.data.img;
 | 
			
		||||
        this.loginForm.uuid = res.data.uuid;
 | 
			
		||||
        this.captchaEnabled = res.data.enabled;
 | 
			
		||||
        if(res.data.enabled){
 | 
			
		||||
          this.codeUrl = "data:image/gif;base64," + res.data.img;
 | 
			
		||||
          this.loginForm.uuid = res.data.uuid;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    getCookie() {
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['monitor:job:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -274,6 +275,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非单个禁用
 | 
			
		||||
@@ -477,12 +480,14 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportJob(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -89,6 +89,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['monitor:job:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -175,6 +176,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非多个禁用
 | 
			
		||||
@@ -288,10 +291,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportJobLog(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['monitor:logininfor:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -126,6 +127,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非多个禁用
 | 
			
		||||
@@ -221,10 +224,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportLogininfor(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -99,6 +99,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['monitor:operlog:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -195,6 +196,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非多个禁用
 | 
			
		||||
@@ -309,10 +312,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportOperlog(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -88,6 +88,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['system:config:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -188,6 +189,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非单个禁用
 | 
			
		||||
@@ -344,10 +347,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportConfig(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    },
 | 
			
		||||
    /** 清理缓存按钮操作 */
 | 
			
		||||
@@ -358,4 +363,4 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['system:dict:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -169,6 +170,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非单个禁用
 | 
			
		||||
@@ -343,10 +346,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportData(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -94,6 +94,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['system:dict:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -196,6 +197,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非单个禁用
 | 
			
		||||
@@ -348,10 +351,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportType(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    },
 | 
			
		||||
    /** 清理缓存按钮操作 */
 | 
			
		||||
@@ -362,4 +367,4 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -176,7 +176,7 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { listNotice, getNotice, delNotice, addNotice, updateNotice, exportNotice } from "@/api/system/notice";
 | 
			
		||||
import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice";
 | 
			
		||||
import Editor from '@/components/Editor';
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
@@ -340,4 +340,4 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -74,6 +74,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['system:post:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -112,7 +113,7 @@
 | 
			
		||||
        </template>
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
    </el-table>
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    <pagination
 | 
			
		||||
      v-show="total>0"
 | 
			
		||||
      :total="total"
 | 
			
		||||
@@ -163,6 +164,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非单个禁用
 | 
			
		||||
@@ -315,12 +318,14 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportPost(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -94,6 +94,7 @@
 | 
			
		||||
          plain
 | 
			
		||||
          icon="el-icon-download"
 | 
			
		||||
          size="mini"
 | 
			
		||||
          :loading="exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
          v-hasPermi="['system:role:export']"
 | 
			
		||||
        >导出</el-button>
 | 
			
		||||
@@ -258,6 +259,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非单个禁用
 | 
			
		||||
@@ -599,10 +602,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportRole(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -131,6 +131,7 @@
 | 
			
		||||
              plain
 | 
			
		||||
              icon="el-icon-download"
 | 
			
		||||
              size="mini"
 | 
			
		||||
              :loading="exportLoading"
 | 
			
		||||
              @click="handleExport"
 | 
			
		||||
              v-hasPermi="['system:user:export']"
 | 
			
		||||
            >导出</el-button>
 | 
			
		||||
@@ -356,6 +357,8 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 导出遮罩层
 | 
			
		||||
      exportLoading: false,
 | 
			
		||||
      // 选中数组
 | 
			
		||||
      ids: [],
 | 
			
		||||
      // 非单个禁用
 | 
			
		||||
@@ -637,10 +640,12 @@ export default {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.exportLoading = true;
 | 
			
		||||
          return exportUser(queryParams);
 | 
			
		||||
        }).then(response => {
 | 
			
		||||
          this.download(response.msg);
 | 
			
		||||
          this.exportLoading = false;
 | 
			
		||||
        })
 | 
			
		||||
    },
 | 
			
		||||
    /** 导入按钮操作 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user