!69 同步dev分支

Merge pull request !69 from 疯狂的狮子Li/dev
This commit is contained in:
疯狂的狮子Li 2021-07-13 05:50:21 +00:00 committed by Gitee
commit 83905db717
32 changed files with 146 additions and 116 deletions

View File

@ -4,7 +4,7 @@
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE)
[![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
<br> <br>
[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-2.5.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-2.5.1-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.4-blue.svg)]() [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.4-blue.svg)]()
[![JDK-8+](https://img.shields.io/badge/JDK-8+-green.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8+-green.svg)]()
[![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]()

View File

@ -76,12 +76,13 @@ services:
ipv4_address: 172.30.0.48 ipv4_address: 172.30.0.48
ruoyi-server1: ruoyi-server1:
image: "ruoyi/ruoyi-server:2.5.0" image: "ruoyi/ruoyi-server:2.5.1"
environment: environment:
- TZ=Asia/Shanghai - TZ=Asia/Shanghai
volumes: volumes:
# 配置文件 # 配置文件
- /docker/server1/logs/:/ruoyi/server/logs/ - /docker/server1/logs/:/ruoyi/server/logs/
- /docker/ruoyi/uploadPath/:/ruoyi/server/ruoyi/uploadPath/
privileged: true privileged: true
restart: always restart: always
networks: networks:
@ -89,12 +90,13 @@ services:
ipv4_address: 172.30.0.60 ipv4_address: 172.30.0.60
ruoyi-server2: ruoyi-server2:
image: "ruoyi/ruoyi-server:2.5.0" image: "ruoyi/ruoyi-server:2.5.1"
environment: environment:
- TZ=Asia/Shanghai - TZ=Asia/Shanghai
volumes: volumes:
# 配置文件 # 配置文件
- /docker/server2/logs/:/ruoyi/server/logs/ - /docker/server2/logs/:/ruoyi/server/logs/
- /docker/ruoyi/uploadPath/:/ruoyi/server/ruoyi/uploadPath/
privileged: true privileged: true
restart: always restart: always
networks: networks:
@ -102,7 +104,7 @@ services:
ipv4_address: 172.30.0.61 ipv4_address: 172.30.0.61
ruoyi-monitor-admin: ruoyi-monitor-admin:
image: "ruoyi/ruoyi-monitor-admin:2.5.0" image: "ruoyi/ruoyi-monitor-admin:2.5.1"
environment: environment:
- TZ=Asia/Shanghai - TZ=Asia/Shanghai
privileged: true privileged: true

View File

@ -6,14 +6,14 @@
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<version>2.5.0</version> <version>2.5.1</version>
<name>RuoYi-Vue-Plus</name> <name>RuoYi-Vue-Plus</name>
<url>https://gitee.com/JavaLionLi/RuoYi-Vue-Plus</url> <url>https://gitee.com/JavaLionLi/RuoYi-Vue-Plus</url>
<description>RuoYi-Vue-Plus后台管理系统</description> <description>RuoYi-Vue-Plus后台管理系统</description>
<properties> <properties>
<ruoyi-vue-plus.version>2.5.0</ruoyi-vue-plus.version> <ruoyi-vue-plus.version>2.5.1</ruoyi-vue-plus.version>
<spring-boot.version>2.4.8</spring-boot.version> <spring-boot.version>2.4.8</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

View File

@ -4,6 +4,7 @@ MAINTAINER Lion Li
RUN mkdir -p /ruoyi/server RUN mkdir -p /ruoyi/server
RUN mkdir -p /ruoyi/server/logs RUN mkdir -p /ruoyi/server/logs
RUN mkdir -p /ruoyi/server/ruoyi/uploadPath
WORKDIR /ruoyi/server WORKDIR /ruoyi/server

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -14,6 +14,7 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.framework.captcha.UnsignedMathGenerator; import com.ruoyi.framework.captcha.UnsignedMathGenerator;
import com.ruoyi.framework.config.properties.CaptchaProperties; import com.ruoyi.framework.config.properties.CaptchaProperties;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -26,7 +27,7 @@ import java.util.concurrent.TimeUnit;
/** /**
* 验证码操作处理 * 验证码操作处理
* *
* @author Lion Li * @author ruoyi
*/ */
@RestController @RestController
public class CaptchaController { public class CaptchaController {
@ -47,15 +48,18 @@ public class CaptchaController {
@Autowired @Autowired
private CaptchaProperties captchaProperties; private CaptchaProperties captchaProperties;
@Autowired
private ISysConfigService configService;
/** /**
* 生成验证码 * 生成验证码
*/ */
@GetMapping("/captchaImage") @GetMapping("/captchaImage")
public AjaxResult getCode() { public AjaxResult getCode() {
Map<String, Object> ajax = new HashMap<>(); Map<String, Object> ajax = new HashMap<>();
Boolean enabled = captchaProperties.getEnabled(); boolean captchaOnOff = configService.selectCaptchaOnOff();
ajax.put("enabled", enabled); ajax.put("captchaOnOff", captchaOnOff);
if (!enabled) { if (!captchaOnOff) {
return AjaxResult.success(ajax); return AjaxResult.success(ajax);
} }
// 保存验证码信息 // 保存验证码信息

View File

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import cn.hutool.core.lang.Validator;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
@ -9,7 +10,6 @@ import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -97,7 +97,7 @@ public class SysMenuController extends BaseController
{ {
return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
} }
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !Validator.isUrl(menu.getPath()))
{ {
return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头"); return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
} }
@ -117,7 +117,7 @@ public class SysMenuController extends BaseController
{ {
return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
} }
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !Validator.isUrl(menu.getPath()))
{ {
return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头"); return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
} }

View File

@ -14,8 +14,6 @@ ruoyi:
addressEnabled: true addressEnabled: true
captcha: captcha:
# 验证码开关
enabled: true
# 验证码类型 math 数组计算 char 字符验证 # 验证码类型 math 数组计算 char 字符验证
type: math type: math
# line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -1,28 +0,0 @@
package com.ruoyi.common.utils;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.constant.Constants;
/**
* 字符串工具类
*
* @author ruoyi
*/
public class StringUtils extends org.apache.commons.lang3.StringUtils {
/** 空字符串 */
private static final String NULLSTR = "";
/** 下划线 */
private static final char SEPARATOR = '_';
/**
* 是否为http(s)://开头
*
* @param link 链接
* @return 结果
*/
public static boolean ishttp(String link) {
return StrUtil.startWithAny(link, Constants.HTTP, Constants.HTTPS);
}
}

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-extend</artifactId> <artifactId>ruoyi-extend</artifactId>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-extend</artifactId> <artifactId>ruoyi-extend</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -14,11 +14,6 @@ import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "captcha") @ConfigurationProperties(prefix = "captcha")
public class CaptchaProperties { public class CaptchaProperties {
/**
* 验证码开关
*/
private Boolean enabled;
/** /**
* 验证码类型 * 验证码类型
*/ */

View File

@ -11,7 +11,7 @@ import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.framework.config.properties.CaptchaProperties; import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
@ -41,10 +41,10 @@ public class SysLoginService
private RedisCache redisCache; private RedisCache redisCache;
@Autowired @Autowired
private CaptchaProperties captchaProperties; private ISysUserService userService;
@Autowired @Autowired
private ISysUserService userService; private ISysConfigService configService;
@Autowired @Autowired
private AsyncService asyncService; private AsyncService asyncService;
@ -61,18 +61,11 @@ public class SysLoginService
public String login(String username, String password, String code, String uuid) public String login(String username, String password, String code, String uuid)
{ {
HttpServletRequest request = ServletUtils.getRequest(); HttpServletRequest request = ServletUtils.getRequest();
if(captchaProperties.getEnabled()) { boolean captchaOnOff = configService.selectCaptchaOnOff();
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; // 验证码开关
String captcha = redisCache.getCacheObject(verifyKey); if (captchaOnOff)
redisCache.deleteObject(verifyKey); {
if (captcha == null) { validateCapcha(username, code, uuid, request);
asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), request);
throw new CaptchaExpireException();
}
if (!code.equalsIgnoreCase(captcha)) {
asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"), request);
throw new CaptchaException();
}
} }
// 用户验证 // 用户验证
Authentication authentication = null; Authentication authentication = null;
@ -102,6 +95,28 @@ public class SysLoginService
return tokenService.createToken(loginUser); return tokenService.createToken(loginUser);
} }
/**
* 校验验证码
*
* @param username 用户名
* @param code 验证码
* @param uuid 唯一标识
* @return 结果
*/
public void validateCapcha(String username, String code, String uuid, HttpServletRequest request) {
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String captcha = redisCache.getCacheObject(verifyKey);
redisCache.deleteObject(verifyKey);
if (captcha == null) {
asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), request);
throw new CaptchaExpireException();
}
if (!code.equalsIgnoreCase(captcha)) {
asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"), request);
throw new CaptchaException();
}
}
/** /**
* 记录登录信息 * 记录登录信息
*/ */

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -35,10 +35,7 @@ import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.Arrays; import java.util.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@ -137,13 +134,16 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
for (GenTableColumn cenTableColumn : genTable.getColumns()) { for (GenTableColumn cenTableColumn : genTable.getColumns()) {
genTableColumnMapper.update(cenTableColumn, genTableColumnMapper.update(cenTableColumn,
new LambdaUpdateWrapper<GenTableColumn>() new LambdaUpdateWrapper<GenTableColumn>()
.set(cenTableColumn.getIsPk() == null, GenTableColumn::getIsPk, null) .set(StrUtil.isBlank(cenTableColumn.getColumnComment()), GenTableColumn::getColumnComment, null)
.set(cenTableColumn.getIsIncrement() == null, GenTableColumn::getIsIncrement, null) .set(StrUtil.isBlank(cenTableColumn.getIsPk()), GenTableColumn::getIsPk, null)
.set(cenTableColumn.getIsInsert() == null, GenTableColumn::getIsInsert, null) .set(StrUtil.isBlank(cenTableColumn.getIsIncrement()), GenTableColumn::getIsIncrement, null)
.set(cenTableColumn.getIsEdit() == null, GenTableColumn::getIsEdit, null) .set(StrUtil.isBlank(cenTableColumn.getIsInsert()), GenTableColumn::getIsInsert, null)
.set(cenTableColumn.getIsList() == null, GenTableColumn::getIsList, null) .set(StrUtil.isBlank(cenTableColumn.getIsEdit()), GenTableColumn::getIsEdit, null)
.set(cenTableColumn.getIsQuery() == null, GenTableColumn::getIsQuery, null) .set(StrUtil.isBlank(cenTableColumn.getIsList()), GenTableColumn::getIsList, null)
.set(cenTableColumn.getIsRequired() == null, GenTableColumn::getIsRequired, null) .set(StrUtil.isBlank(cenTableColumn.getIsQuery()), GenTableColumn::getIsQuery, null)
.set(StrUtil.isBlank(cenTableColumn.getIsRequired()), GenTableColumn::getIsRequired, null)
.set(StrUtil.isBlank(cenTableColumn.getQueryType()), GenTableColumn::getQueryType, null)
.set(StrUtil.isBlank(cenTableColumn.getDictType()), GenTableColumn::getDictType, null)
.eq(GenTableColumn::getColumnId,cenTableColumn.getColumnId())); .eq(GenTableColumn::getColumnId,cenTableColumn.getColumnId()));
} }
} }
@ -180,10 +180,14 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
if (row > 0) { if (row > 0) {
// 保存列信息 // 保存列信息
List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
List<GenTableColumn> saveColumns = new ArrayList<>();
for (GenTableColumn column : genTableColumns) { for (GenTableColumn column : genTableColumns) {
GenUtils.initColumnField(column, table); GenUtils.initColumnField(column, table);
saveColumns.add(column);
}
if (CollUtil.isNotEmpty(saveColumns)) {
genTableColumnMapper.insertAll(saveColumns);
} }
genTableColumnMapper.insertAll(genTableColumns);
} }
} }
} catch (Exception e) { } catch (Exception e) {
@ -287,12 +291,16 @@ public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTabl
} }
List<String> dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); List<String> dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList());
List<GenTableColumn> saveColumns = new ArrayList<>();
dbTableColumns.forEach(column -> { dbTableColumns.forEach(column -> {
if (!tableColumnNames.contains(column.getColumnName())) { if (!tableColumnNames.contains(column.getColumnName())) {
GenUtils.initColumnField(column, table); GenUtils.initColumnField(column, table);
saveColumns.add(column);
} }
}); });
genTableColumnMapper.insertAll(tableColumns); if (CollUtil.isNotEmpty(saveColumns)) {
genTableColumnMapper.insertAll(saveColumns);
}
List<GenTableColumn> delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); List<GenTableColumn> delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(delColumns)) { if (CollUtil.isNotEmpty(delColumns)) {

View File

@ -285,7 +285,7 @@ export default {
#else #else
#set($comment=$column.columnComment) #set($comment=$column.columnComment)
#end #end
#if(${column.dictType} != '') #if(${column.dictType} && ${column.dictType} != '')
// $comment字典 // $comment字典
${column.javaField}Options: [], ${column.javaField}Options: [],
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
@ -327,7 +327,7 @@ export default {
created() { created() {
this.getList(); this.getList();
#foreach ($column in $columns) #foreach ($column in $columns)
#if(${column.dictType} != '') #if(${column.dictType} && ${column.dictType} != '')
this.getDicts("${column.dictType}").then(response => { this.getDicts("${column.dictType}").then(response => {
this.${column.javaField}Options = response.data; this.${column.javaField}Options = response.data;
}); });
@ -379,7 +379,7 @@ export default {
}); });
}, },
#foreach ($column in $columns) #foreach ($column in $columns)
#if(${column.dictType} != '') #if(${column.dictType} && ${column.dictType} != '')
#set($parentheseIndex=$column.columnComment.indexOf("")) #set($parentheseIndex=$column.columnComment.indexOf(""))
#if($parentheseIndex != -1) #if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex)) #set($comment=$column.columnComment.substring(0, $parentheseIndex))

View File

@ -350,7 +350,7 @@ export default {
#else #else
#set($comment=$column.columnComment) #set($comment=$column.columnComment)
#end #end
#if(${column.dictType} != '') #if(${column.dictType} && ${column.dictType} != '')
// $comment字典 // $comment字典
${column.javaField}Options: [], ${column.javaField}Options: [],
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
@ -394,7 +394,7 @@ export default {
created() { created() {
this.getList(); this.getList();
#foreach ($column in $columns) #foreach ($column in $columns)
#if(${column.dictType} != '') #if(${column.dictType} && ${column.dictType} != '')
this.getDicts("${column.dictType}").then(response => { this.getDicts("${column.dictType}").then(response => {
this.${column.javaField}Options = response.data; this.${column.javaField}Options = response.data;
}); });
@ -427,7 +427,7 @@ export default {
}); });
}, },
#foreach ($column in $columns) #foreach ($column in $columns)
#if(${column.dictType} != '') #if(${column.dictType} && ${column.dictType} != '')
#set($parentheseIndex=$column.columnComment.indexOf("")) #set($parentheseIndex=$column.columnComment.indexOf(""))
#if($parentheseIndex != -1) #if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex)) #set($comment=$column.columnComment.substring(0, $parentheseIndex))

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi-vue-plus</artifactId> <artifactId>ruoyi-vue-plus</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>2.5.0</version> <version>2.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -1,6 +1,6 @@
package com.ruoyi.system.domain.vo; package com.ruoyi.system.domain.vo;
import com.ruoyi.common.utils.StringUtils; import cn.hutool.core.lang.Validator;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -56,7 +56,7 @@ public class MetaVo {
this.title = title; this.title = title;
this.icon = icon; this.icon = icon;
this.noCache = noCache; this.noCache = noCache;
if (StringUtils.ishttp(link)) { if (Validator.isUrl(link)) {
this.link = link; this.link = link;
} }
} }

View File

@ -32,6 +32,13 @@ public interface ISysConfigService extends IServicePlus<SysConfig> {
*/ */
public String selectConfigByKey(String configKey); public String selectConfigByKey(String configKey);
/**
* 获取验证码开关
*
* @return true开启false关闭
*/
public boolean selectCaptchaOnOff();
/** /**
* 查询参数配置列表 * 查询参数配置列表
* *

View File

@ -93,6 +93,19 @@ public class SysConfigServiceImpl extends ServicePlusImpl<SysConfigMapper, SysCo
return StrUtil.EMPTY; return StrUtil.EMPTY;
} }
/**
* 获取验证码开关
*
* @return true开启false关闭
*/
public boolean selectCaptchaOnOff() {
String captchaOnOff = selectConfigByKey("sys.account.captchaOnOff");
if (StrUtil.isEmpty(captchaOnOff)) {
return true;
}
return Convert.toBool(captchaOnOff);
}
/** /**
* 查询参数配置列表 * 查询参数配置列表
* *

View File

@ -11,7 +11,6 @@ import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysRoleMenu; import com.ruoyi.system.domain.SysRoleMenu;
import com.ruoyi.system.domain.vo.MetaVo; import com.ruoyi.system.domain.vo.MetaVo;
import com.ruoyi.system.domain.vo.RouterVo; import com.ruoyi.system.domain.vo.RouterVo;
@ -19,6 +18,7 @@ import com.ruoyi.system.mapper.SysMenuMapper;
import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.mapper.SysRoleMapper;
import com.ruoyi.system.mapper.SysRoleMenuMapper; import com.ruoyi.system.mapper.SysRoleMenuMapper;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -371,7 +371,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl<SysMenuMapper, SysMenu>
* @return 结果 * @return 结果
*/ */
public boolean isInnerLink(SysMenu menu) { public boolean isInnerLink(SysMenu menu) {
return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath()); return menu.getIsFrame().equals(UserConstants.NO_FRAME) && Validator.isUrl(menu.getPath());
} }
/** /**

View File

@ -1,6 +1,6 @@
{ {
"name": "ruoyi-vue-plus", "name": "ruoyi-vue-plus",
"version": "2.5.0", "version": "2.5.1",
"description": "RuoYi-Vue-Plus后台管理系统", "description": "RuoYi-Vue-Plus后台管理系统",
"author": "LionLi", "author": "LionLi",
"license": "MIT", "license": "MIT",

View File

@ -130,14 +130,14 @@ export default {
this.quill.format("image", false); this.quill.format("image", false);
} }
}); });
toolbar.addHandler("video", (value) => { // toolbar.addHandler("video", (value) => {
this.uploadType = "video"; // this.uploadType = "video";
if (value) { // if (value) {
this.$refs.upload.$children[0].$refs.input.click(); // this.$refs.upload.$children[0].$refs.input.click();
} else { // } else {
this.quill.format("video", false); // this.quill.format("video", false);
} // }
}); // });
} }
this.Quill.pasteHTML(this.currentValue); this.Quill.pasteHTML(this.currentValue);
this.Quill.on("text-change", (delta, oldDelta, source) => { this.Quill.on("text-change", (delta, oldDelta, source) => {

View File

@ -116,7 +116,7 @@ export default {
methods: { methods: {
// //
handleRemove(file, fileList) { handleRemove(file, fileList) {
const findex = this.fileList.indexOf(file.name); const findex = this.fileList.map(f => f.name).indexOf(file.name);
this.fileList.splice(findex, 1); this.fileList.splice(findex, 1);
this.$emit("input", this.listToString(this.fileList)); this.$emit("input", this.listToString(this.fileList));
}, },

View File

@ -91,6 +91,18 @@
<span>更新日志</span> <span>更新日志</span>
</div> </div>
<el-collapse accordion> <el-collapse accordion>
<el-collapse-item title="v2.5.1 - 2021-7-13">
<ol>
<li>update 验证码开关 转移到表 参数管理 </li>
<li>update 使用hutool重构 判断是否url</li>
<li>fix 修复 docker业务集群部署与文件上传的问题</li>
<li>fix 修复代码生成同步表结构id冲突问题</li>
<li>fix 修复代码生成选择字典 无法取消问题</li>
<li>fix 修复代码生成字典为null问题</li>
<li>fix 图片上传 多图时无法删除相应图片修复</li>
<li>remove 删除富文本video事件</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.5.0 - 2021-7-12"> <el-collapse-item title="v2.5.0 - 2021-7-12">
<ol> <ol>
<li>update springboot 2.4.7 => 2.4.8</li> <li>update springboot 2.4.7 => 2.4.8</li>

View File

@ -18,7 +18,7 @@
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" /> <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="code" v-if="captchaEnabled"> <el-form-item prop="code" v-if="captchaOnOff">
<el-input <el-input
v-model="loginForm.code" v-model="loginForm.code"
auto-complete="off" auto-complete="off"
@ -81,8 +81,8 @@ export default {
code: [{ required: true, trigger: "change", message: "验证码不能为空" }] code: [{ required: true, trigger: "change", message: "验证码不能为空" }]
}, },
loading: false, loading: false,
redirect: undefined, captchaOnOff: true,
captchaEnabled:false redirect: undefined
}; };
}, },
watch: { watch: {
@ -100,8 +100,8 @@ export default {
methods: { methods: {
getCode() { getCode() {
getCodeImg().then(res => { getCodeImg().then(res => {
this.captchaEnabled = res.data.enabled; this.captchaOnOff = res.data.captchaOnOff === undefined ? true : res.data.captchaOnOff;
if(res.data.enabled){ if (this.captchaOnOff) {
this.codeUrl = "data:image/gif;base64," + res.data.img; this.codeUrl = "data:image/gif;base64," + res.data.img;
this.loginForm.uuid = res.data.uuid; this.loginForm.uuid = res.data.uuid;
} }
@ -134,7 +134,9 @@ export default {
this.$router.push({ path: this.redirect || "/" }).catch(()=>{}); this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
}).catch(() => { }).catch(() => {
this.loading = false; this.loading = false;
if (this.captchaOnOff) {
this.getCode(); this.getCode();
}
}); });
} }
}); });

View File

@ -540,6 +540,7 @@ create table sys_config (
insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' ); insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' );
insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark浅色主题theme-light' ); insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark浅色主题theme-light' );
insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaOnOff', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启登录验证码功能true开启false关闭');
-- ---------------------------- -- ----------------------------