return ((int) (hilo >> 32)) ^ (int) hilo;
}
- // -------------------------------------------------------------------------------------------------------------------
- // Private method start
-
/**
* 将此对象与指定对象比较。
*
@@ -439,6 +403,8 @@ public final class UUID implements java.io.Serializable, Comparable
return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits);
}
+ // Comparison Operations
+
/**
* 将此 UUID 与指定的 UUID 比较。
*
@@ -462,6 +428,21 @@ public final class UUID implements java.io.Serializable, Comparable
0))));
}
+ // -------------------------------------------------------------------------------------------------------------------
+ // Private method start
+ /**
+ * 返回指定数字对应的hex值
+ *
+ * @param val 值
+ * @param digits 位
+ * @return 值
+ */
+ private static String digits(long val, int digits)
+ {
+ long hi = 1L << (digits * 4);
+ return Long.toHexString(hi | (val & (hi - 1))).substring(1);
+ }
+
/**
* 检查是否为time-based版本UUID
*/
@@ -474,11 +455,30 @@ public final class UUID implements java.io.Serializable, Comparable
}
/**
- * SecureRandom 的单例
- *
+ * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG)
+ *
+ * @return {@link SecureRandom}
*/
- private static class Holder
+ public static SecureRandom getSecureRandom()
{
- static final SecureRandom numberGenerator = getSecureRandom();
+ try
+ {
+ return SecureRandom.getInstance("SHA1PRNG");
+ }
+ catch (NoSuchAlgorithmException e)
+ {
+ throw new UtilException(e);
+ }
+ }
+
+ /**
+ * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。
+ *
+ * @return {@link ThreadLocalRandom}
+ */
+ public static ThreadLocalRandom getRandom()
+ {
+ return ThreadLocalRandom.current();
}
}
diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml
index 5a88c8e..9bd9ee6 100644
--- a/ruoyi-framework/pom.xml
+++ b/ruoyi-framework/pom.xml
@@ -1,11 +1,11 @@
-
ruoyi
com.ruoyi
- 3.8.6
+ 3.7.0
4.0.0
@@ -37,11 +37,11 @@
- pro.fessional
+ com.github.penggle
kaptcha
- servlet-api
+ javax.servlet-api
javax.servlet
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
index 9839f38..226e150 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
@@ -1,21 +1,20 @@
package com.ruoyi.framework.aspectj;
+import java.lang.reflect.Method;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.core.text.Convert;
-import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.security.context.PermissionContextHolder;
-import org.aspectj.lang.JoinPoint;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Before;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.ruoyi.common.utils.SecurityUtils;
/**
* 数据过滤处理
@@ -56,36 +55,58 @@ public class DataScopeAspect
*/
public static final String DATA_SCOPE = "dataScope";
+ // 配置织入点
+ @Pointcut("@annotation(com.ruoyi.common.annotation.DataScope)")
+ public void dataScopePointCut()
+ {
+ }
+
+ @Before("dataScopePointCut()")
+ public void doBefore(JoinPoint point) throws Throwable
+ {
+ clearDataScope(point);
+ handleDataScope(point);
+ }
+
+ protected void handleDataScope(final JoinPoint joinPoint)
+ {
+ // 获得注解
+ DataScope controllerDataScope = getAnnotationLog(joinPoint);
+ if (controllerDataScope == null)
+ {
+ return;
+ }
+ // 获取当前的用户
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (StringUtils.isNotNull(loginUser))
+ {
+ SysUser currentUser = loginUser.getUser();
+ // 如果是超级管理员,则不过滤数据
+ if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
+ {
+ dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
+ controllerDataScope.userAlias());
+ }
+ }
+ }
+
/**
* 数据范围过滤
*
* @param joinPoint 切点
* @param user 用户
- * @param deptAlias 部门别名
- * @param userAlias 用户别名
- * @param permission 权限字符
+ * @param userAlias 别名
*/
- public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission)
+ public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
{
StringBuilder sqlString = new StringBuilder();
- List conditions = new ArrayList();
for (SysRole role : user.getRoles())
{
String dataScope = role.getDataScope();
- if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope))
- {
- continue;
- }
- if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions())
- && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission)))
- {
- continue;
- }
if (DATA_SCOPE_ALL.equals(dataScope))
{
sqlString = new StringBuilder();
- conditions.add(dataScope);
break;
}
else if (DATA_SCOPE_CUSTOM.equals(dataScope))
@@ -113,16 +134,9 @@ public class DataScopeAspect
else
{
// 数据权限为仅本人且没有userAlias别名不查询任何数据
- sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
+ sqlString.append(" OR 1=0 ");
}
}
- conditions.add(dataScope);
- }
-
- // 多角色情况下,所有角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据
- if (StringUtils.isEmpty(conditions))
- {
- sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
}
if (StringUtils.isNotBlank(sqlString.toString()))
@@ -136,28 +150,20 @@ public class DataScopeAspect
}
}
- @Before("@annotation(controllerDataScope)")
- public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable
+ /**
+ * 是否存在注解,如果存在就获取
+ */
+ private DataScope getAnnotationLog(JoinPoint joinPoint)
{
- clearDataScope(point);
- handleDataScope(point, controllerDataScope);
- }
+ Signature signature = joinPoint.getSignature();
+ MethodSignature methodSignature = (MethodSignature) signature;
+ Method method = methodSignature.getMethod();
- protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope)
- {
- // 获取当前的用户
- LoginUser loginUser = SecurityUtils.getLoginUser();
- if (StringUtils.isNotNull(loginUser))
+ if (method != null)
{
- SysUser currentUser = loginUser.getUser();
- // 如果是超级管理员,则不过滤数据
- if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
- {
- String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext());
- dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
- controllerDataScope.userAlias(), permission);
- }
+ return method.getAnnotation(DataScope.class);
}
+ return null;
}
/**
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java
index 04729e9..8c2c9f4 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java
@@ -1,8 +1,6 @@
package com.ruoyi.framework.aspectj;
-import com.ruoyi.common.annotation.DataSource;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
+import java.util.Objects;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@@ -13,8 +11,9 @@ import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
-
-import java.util.Objects;
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
/**
* 多数据源处理
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
index 14334dc..89b5a32 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
@@ -1,35 +1,36 @@
package com.ruoyi.framework.aspectj;
-import com.alibaba.fastjson2.JSON;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.HandlerMapping;
+import com.alibaba.fastjson.JSON;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.BusinessStatus;
import com.ruoyi.common.enums.HttpMethod;
-import com.ruoyi.common.filter.PropertyPreExcludeFilter;
-import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.IpUtils;
+import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.domain.SysOperLog;
-import org.apache.commons.lang3.ArrayUtils;
-import org.aspectj.lang.JoinPoint;
-import org.aspectj.lang.annotation.AfterReturning;
-import org.aspectj.lang.annotation.AfterThrowing;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Before;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.NamedThreadLocal;
-import org.springframework.stereotype.Component;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Collection;
-import java.util.Map;
/**
* 操作日志记录处理
@@ -40,19 +41,12 @@ import java.util.Map;
@Component
public class LogAspect
{
- /** 排除敏感属性字段 */
- public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" };
private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
- /** 计算操作消耗时间 */
- private static final ThreadLocal TIME_THREADLOCAL = new NamedThreadLocal("Cost Time");
- /**
- * 处理请求前执行
- */
- @Before(value = "@annotation(controllerLog)")
- public void boBefore(JoinPoint joinPoint, Log controllerLog)
+ // 配置织入点
+ @Pointcut("@annotation(com.ruoyi.common.annotation.Log)")
+ public void logPointCut()
{
- TIME_THREADLOCAL.set(System.currentTimeMillis());
}
/**
@@ -60,10 +54,10 @@ public class LogAspect
*
* @param joinPoint 切点
*/
- @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
- public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult)
+ @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
+ public void doAfterReturning(JoinPoint joinPoint, Object jsonResult)
{
- handleLog(joinPoint, controllerLog, null, jsonResult);
+ handleLog(joinPoint, null, jsonResult);
}
/**
@@ -72,16 +66,23 @@ public class LogAspect
* @param joinPoint 切点
* @param e 异常
*/
- @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
- public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e)
+ @AfterThrowing(value = "logPointCut()", throwing = "e")
+ public void doAfterThrowing(JoinPoint joinPoint, Exception e)
{
- handleLog(joinPoint, controllerLog, e, null);
+ handleLog(joinPoint, e, null);
}
- protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult)
+ protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult)
{
try
{
+ // 获得注解
+ Log controllerLog = getAnnotationLog(joinPoint);
+ if (controllerLog == null)
+ {
+ return;
+ }
+
// 获取当前的用户
LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -89,9 +90,12 @@ public class LogAspect
SysOperLog operLog = new SysOperLog();
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
// 请求的地址
- String ip = IpUtils.getIpAddr();
+ String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
operLog.setOperIp(ip);
- operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
+ // 返回参数
+ operLog.setJsonResult(JSON.toJSONString(jsonResult));
+
+ operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
if (loginUser != null)
{
operLog.setOperName(loginUser.getUsername());
@@ -109,22 +113,17 @@ public class LogAspect
// 设置请求方式
operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
// 处理设置注解上的参数
- getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
- // 设置消耗时间
- operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get());
+ getControllerMethodDescription(joinPoint, controllerLog, operLog);
// 保存数据库
AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
}
catch (Exception exp)
{
// 记录本地异常日志
+ log.error("==前置通知异常==");
log.error("异常信息:{}", exp.getMessage());
exp.printStackTrace();
}
- finally
- {
- TIME_THREADLOCAL.remove();
- }
}
/**
@@ -134,7 +133,7 @@ public class LogAspect
* @param operLog 操作日志
* @throws Exception
*/
- public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception
+ public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog) throws Exception
{
// 设置action动作
operLog.setBusinessType(log.businessType().ordinal());
@@ -146,12 +145,7 @@ public class LogAspect
if (log.isSaveRequestData())
{
// 获取参数的信息,传入到数据库中。
- setRequestValue(joinPoint, operLog, log.excludeParamNames());
- }
- // 是否需要保存response,参数和值
- if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult))
- {
- operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));
+ setRequestValue(joinPoint, operLog);
}
}
@@ -161,56 +155,57 @@ public class LogAspect
* @param operLog 操作日志
* @throws Exception 异常
*/
- private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception
+ private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception
{
- Map, ?> paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest());
String requestMethod = operLog.getRequestMethod();
- if (StringUtils.isEmpty(paramsMap)
- && (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)))
+ if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))
{
- String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames);
+ String params = argsArrayToString(joinPoint.getArgs());
operLog.setOperParam(StringUtils.substring(params, 0, 2000));
}
else
{
- operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter(excludeParamNames)), 0, 2000));
+ Map, ?> paramsMap = (Map, ?>) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
+ operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000));
}
}
+ /**
+ * 是否存在注解,如果存在就获取
+ */
+ private Log getAnnotationLog(JoinPoint joinPoint) throws Exception
+ {
+ Signature signature = joinPoint.getSignature();
+ MethodSignature methodSignature = (MethodSignature) signature;
+ Method method = methodSignature.getMethod();
+
+ if (method != null)
+ {
+ return method.getAnnotation(Log.class);
+ }
+ return null;
+ }
+
/**
* 参数拼装
*/
- private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames)
+ private String argsArrayToString(Object[] paramsArray)
{
String params = "";
if (paramsArray != null && paramsArray.length > 0)
{
- for (Object o : paramsArray)
+ for (int i = 0; i < paramsArray.length; i++)
{
- if (StringUtils.isNotNull(o) && !isFilterObject(o))
+ if (StringUtils.isNotNull(paramsArray[i]) && !isFilterObject(paramsArray[i]))
{
- try
- {
- String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter(excludeParamNames));
- params += jsonObj.toString() + " ";
- }
- catch (Exception e)
- {
- }
+ Object jsonObj = JSON.toJSON(paramsArray[i]);
+ params += jsonObj.toString() + " ";
}
}
}
return params.trim();
}
- /**
- * 忽略敏感属性
- */
- public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames)
- {
- return new PropertyPreExcludeFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames));
- }
-
/**
* 判断是否需要过滤的对象。
*
@@ -228,17 +223,17 @@ public class LogAspect
else if (Collection.class.isAssignableFrom(clazz))
{
Collection collection = (Collection) o;
- for (Object value : collection)
+ for (Iterator iter = collection.iterator(); iter.hasNext();)
{
- return value instanceof MultipartFile;
+ return iter.next() instanceof MultipartFile;
}
}
else if (Map.class.isAssignableFrom(clazz))
{
Map map = (Map) o;
- for (Object value : map.entrySet())
+ for (Iterator iter = map.entrySet().iterator(); iter.hasNext();)
{
- Map.Entry entry = (Map.Entry) value;
+ Map.Entry entry = (Map.Entry) iter.next();
return entry.getValue() instanceof MultipartFile;
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java
index 20cc62c..12aa291 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java
@@ -1,13 +1,13 @@
package com.ruoyi.framework.aspectj;
-import com.ruoyi.common.annotation.RateLimiter;
-import com.ruoyi.common.enums.LimitType;
-import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.ip.IpUtils;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -15,10 +15,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
+import com.ruoyi.common.annotation.RateLimiter;
+import com.ruoyi.common.enums.LimitType;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.ip.IpUtils;
/**
* 限流处理
@@ -47,9 +49,17 @@ public class RateLimiterAspect
this.limitScript = limitScript;
}
- @Before("@annotation(rateLimiter)")
- public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable
+ // 配置织入点
+ @Pointcut("@annotation(com.ruoyi.common.annotation.RateLimiter)")
+ public void rateLimiterPointCut()
+ {
+ }
+
+ @Before("rateLimiterPointCut()")
+ public void doBefore(JoinPoint point) throws Throwable
{
+ RateLimiter rateLimiter = getAnnotationRateLimiter(point);
+ String key = rateLimiter.key();
int time = rateLimiter.time();
int count = rateLimiter.count();
@@ -60,9 +70,9 @@ public class RateLimiterAspect
Long number = redisTemplate.execute(limitScript, keys, count, time);
if (StringUtils.isNull(number) || number.intValue() > count)
{
- throw new ServiceException("访问过于频繁,请稍候再试");
+ throw new ServiceException("访问过于频繁,请稍后再试");
}
- log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey);
+ log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), key);
}
catch (ServiceException e)
{
@@ -70,8 +80,24 @@ public class RateLimiterAspect
}
catch (Exception e)
{
- throw new RuntimeException("服务器限流异常,请稍候再试");
+ throw new RuntimeException("服务器限流异常,请稍后再试");
+ }
+ }
+
+ /**
+ * 是否存在注解,如果存在就获取
+ */
+ private RateLimiter getAnnotationRateLimiter(JoinPoint joinPoint)
+ {
+ Signature signature = joinPoint.getSignature();
+ MethodSignature methodSignature = (MethodSignature) signature;
+ Method method = methodSignature.getMethod();
+
+ if (method != null)
+ {
+ return method.getAnnotation(RateLimiter.class);
}
+ return null;
}
public String getCombineKey(RateLimiter rateLimiter, JoinPoint point)
@@ -79,12 +105,12 @@ public class RateLimiterAspect
StringBuffer stringBuffer = new StringBuffer(rateLimiter.key());
if (rateLimiter.limitType() == LimitType.IP)
{
- stringBuffer.append(IpUtils.getIpAddr()).append("-");
+ stringBuffer.append(IpUtils.getIpAddr(ServletUtils.getRequest()));
}
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
Class> targetClass = method.getDeclaringClass();
- stringBuffer.append(targetClass.getName()).append("-").append(method.getName());
+ stringBuffer.append("-").append(targetClass.getName()).append("- ").append(method.getName());
return stringBuffer.toString();
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
index 63693fb..1d4dc1f 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
@@ -1,13 +1,12 @@
package com.ruoyi.framework.config;
+import java.util.TimeZone;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
-import java.util.TimeZone;
-
/**
* 程序注解配置
*
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
index 3ad9b38..43e78ae 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
@@ -1,26 +1,11 @@
package com.ruoyi.framework.config;
-import com.google.code.kaptcha.impl.DefaultKaptcha;
-import com.google.code.kaptcha.util.Config;
+import java.util.Properties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-
-import java.util.Properties;
-
-import static com.google.code.kaptcha.Constants.KAPTCHA_BORDER;
-import static com.google.code.kaptcha.Constants.KAPTCHA_BORDER_COLOR;
-import static com.google.code.kaptcha.Constants.KAPTCHA_IMAGE_HEIGHT;
-import static com.google.code.kaptcha.Constants.KAPTCHA_IMAGE_WIDTH;
-import static com.google.code.kaptcha.Constants.KAPTCHA_NOISE_COLOR;
-import static com.google.code.kaptcha.Constants.KAPTCHA_NOISE_IMPL;
-import static com.google.code.kaptcha.Constants.KAPTCHA_OBSCURIFICATOR_IMPL;
-import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_CONFIG_KEY;
-import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH;
-import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE;
-import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR;
-import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES;
-import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE;
-import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_IMPL;
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import static com.google.code.kaptcha.Constants.*;
/**
* 验证码配置
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java
index ff4aacf..f6abac1 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java
@@ -1,5 +1,20 @@
package com.ruoyi.framework.config;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.sql.DataSource;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
@@ -8,22 +23,6 @@ import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.config.properties.DruidProperties;
import com.ruoyi.framework.datasource.DynamicDataSource;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.sql.DataSource;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
/**
* druid 配置多数据源
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java
index a9d9e35..59812ea 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java
@@ -1,11 +1,14 @@
package com.ruoyi.framework.config;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONReader;
-import com.alibaba.fastjson2.JSONWriter;
+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;
/**
@@ -15,10 +18,18 @@ import java.nio.charset.Charset;
*/
public class FastJson2JsonRedisSerializer implements RedisSerializer
{
+ @SuppressWarnings("unused")
+ private ObjectMapper objectMapper = new ObjectMapper();
+
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private Class clazz;
+ static
+ {
+ ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
+ }
+
public FastJson2JsonRedisSerializer(Class clazz)
{
super();
@@ -32,7 +43,7 @@ public class FastJson2JsonRedisSerializer implements RedisSerializer
{
return new byte[0];
}
- return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
+ return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
}
@Override
@@ -44,6 +55,17 @@ public class FastJson2JsonRedisSerializer implements RedisSerializer
}
String str = new String(bytes, DEFAULT_CHARSET);
- return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
+ 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);
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java
index 8b668d6..87b3750 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java
@@ -1,17 +1,16 @@
package com.ruoyi.framework.config;
-import com.ruoyi.common.filter.RepeatableFilter;
-import com.ruoyi.common.filter.XssFilter;
-import com.ruoyi.common.utils.StringUtils;
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.DispatcherType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-
-import javax.servlet.DispatcherType;
-import java.util.HashMap;
-import java.util.Map;
+import com.ruoyi.common.filter.RepeatableFilter;
+import com.ruoyi.common.filter.XssFilter;
+import com.ruoyi.common.utils.StringUtils;
/**
* Filter配置
@@ -19,6 +18,7 @@ import java.util.Map;
* @author ruoyi
*/
@Configuration
+@ConditionalOnProperty(value = "xss.enabled", havingValue = "true")
public class FilterConfig
{
@Value("${xss.excludes}")
@@ -29,7 +29,6 @@ public class FilterConfig
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
- @ConditionalOnProperty(value = "xss.enabled", havingValue = "true")
public FilterRegistrationBean xssFilterRegistration()
{
FilterRegistrationBean registration = new FilterRegistrationBean();
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java
index ff6a368..3e74580 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java
@@ -1,12 +1,11 @@
package com.ruoyi.framework.config;
-import com.google.code.kaptcha.text.impl.DefaultTextCreator;
-
import java.util.Random;
+import com.google.code.kaptcha.text.impl.DefaultTextCreator;
/**
* 验证码文本生成器
- *
+ *
* @author ruoyi
*/
public class KaptchaTextCreator extends DefaultTextCreator
@@ -21,7 +20,7 @@ public class KaptchaTextCreator extends DefaultTextCreator
int x = random.nextInt(10);
int y = random.nextInt(10);
StringBuilder suChinese = new StringBuilder();
- int randomoperands = random.nextInt(3);
+ int randomoperands = (int) Math.round(Math.random() * 2);
if (randomoperands == 0)
{
result = x * y;
@@ -31,7 +30,7 @@ public class KaptchaTextCreator extends DefaultTextCreator
}
else if (randomoperands == 1)
{
- if ((x != 0) && y % x == 0)
+ if (!(x == 0) && y % x == 0)
{
result = y / x;
suChinese.append(CNUMBERS[y]);
@@ -46,7 +45,7 @@ public class KaptchaTextCreator extends DefaultTextCreator
suChinese.append(CNUMBERS[y]);
}
}
- else
+ else if (randomoperands == 2)
{
if (x >= y)
{
@@ -63,6 +62,13 @@ public class KaptchaTextCreator extends DefaultTextCreator
suChinese.append(CNUMBERS[x]);
}
}
+ else
+ {
+ result = x + y;
+ suChinese.append(CNUMBERS[x]);
+ suChinese.append("+");
+ suChinese.append(CNUMBERS[y]);
+ }
suChinese.append("=?@" + result);
return suChinese.toString();
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
index fc3633c..057c941 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
@@ -1,6 +1,11 @@
package com.ruoyi.framework.config;
-import com.ruoyi.common.utils.StringUtils;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import javax.sql.DataSource;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
@@ -17,13 +22,7 @@ import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;
-
-import javax.sql.DataSource;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
+import com.ruoyi.common.utils.StringUtils;
/**
* Mybatis支持*匹配扫描包
@@ -33,10 +32,11 @@ import java.util.List;
@Configuration
public class MyBatisConfig
{
- static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
@Autowired
private Environment env;
+ static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
+
public static String setTypeAliasesPackage(String typeAliasesPackage)
{
ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java
index 3f4f485..3c3185e 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java
@@ -8,6 +8,11 @@ import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
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配置
@@ -27,6 +32,11 @@ public class RedisConfig extends CachingConfigurerSupport
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
+ 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);
+
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
@@ -58,12 +68,12 @@ public class RedisConfig extends CachingConfigurerSupport
"local time = tonumber(ARGV[2])\n" +
"local current = redis.call('get', key);\n" +
"if current and tonumber(current) > count then\n" +
- " return tonumber(current);\n" +
+ " return current;\n" +
"end\n" +
"current = redis.call('incr', key)\n" +
"if tonumber(current) == 1 then\n" +
" redis.call('expire', key, time)\n" +
"end\n" +
- "return tonumber(current);";
+ "return current;";
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
index d15b8fb..5e4ab00 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
@@ -1,20 +1,17 @@
package com.ruoyi.framework.config;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.http.CacheControl;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-import java.util.concurrent.TimeUnit;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;
/**
* 通用配置
@@ -31,13 +28,10 @@ public class ResourcesConfig implements WebMvcConfigurer
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
/** 本地文件上传路径 */
- registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
- .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/");
+ registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + RuoYiConfig.getProfile() + "/");
/** swagger配置 */
- registry.addResourceHandler("/swagger-ui/**")
- .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
- .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());;
+ registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
}
/**
@@ -55,20 +49,17 @@ public class ResourcesConfig implements WebMvcConfigurer
@Bean
public CorsFilter corsFilter()
{
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
- config.addAllowedOriginPattern("*");
+ config.addAllowedOrigin("*");
// 设置访问源请求头
config.addAllowedHeader("*");
// 设置访问源请求方法
config.addAllowedMethod("*");
- // 有效期 1800秒
- config.setMaxAge(1800L);
- // 添加映射路径,拦截一切请求
- UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ // 对接口配置跨域设置
source.registerCorsConfiguration("/**", config);
- // 返回新的CorsFilter
return new CorsFilter(source);
}
}
\ No newline at end of file
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index 9bf8240..7333182 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -1,9 +1,5 @@
package com.ruoyi.framework.config;
-import com.ruoyi.framework.config.properties.PermitAllUrlProperties;
-import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter;
-import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl;
-import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
@@ -12,13 +8,15 @@ import org.springframework.security.config.annotation.authentication.builders.Au
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.web.filter.CorsFilter;
+import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter;
+import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl;
+import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
/**
* spring security配置
@@ -57,13 +55,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
*/
@Autowired
private CorsFilter corsFilter;
-
- /**
- * 允许匿名访问的地址
- */
- @Autowired
- private PermitAllUrlProperties permitAllUrl;
-
+
/**
* 解决 无法直接注入 AuthenticationManager
*
@@ -95,15 +87,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
- // 注解标记允许匿名访问的url
- ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();
- permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll());
-
httpSecurity
// CSRF禁用,因为不使用session
.csrf().disable()
- // 禁用HTTP响应标头
- .headers().cacheControl().disable().and()
// 认证失败处理类
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// 基于token,所以不需要session
@@ -111,15 +97,27 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 过滤请求
.authorizeRequests()
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
- .antMatchers("/login", "/register", "/captchaImage").permitAll()
- // 静态资源,可匿名访问
- .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
- .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
+ .antMatchers("/login", "/register", "/captchaImage").anonymous()
+ .antMatchers(
+ HttpMethod.GET,
+ "/",
+ "/*.html",
+ "/**/*.html",
+ "/**/*.css",
+ "/**/*.js",
+ "/profile/**"
+ ).permitAll()
+ .antMatchers("/common/download**").anonymous()
+ .antMatchers("/common/download/resource**").anonymous()
+ .antMatchers("/swagger-ui.html").anonymous()
+ .antMatchers("/swagger-resources/**").anonymous()
+ .antMatchers("/webjars/**").anonymous()
+ .antMatchers("/*/api-docs").anonymous()
+ .antMatchers("/druid/**").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();
- // 添加Logout filter
httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
// 添加JWT filter
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java
index a4977e5..b5b7de3 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java
@@ -1,9 +1,8 @@
package com.ruoyi.framework.config;
-import com.ruoyi.common.utils.ServletUtils;
-import org.springframework.stereotype.Component;
-
import javax.servlet.http.HttpServletRequest;
+import org.springframework.stereotype.Component;
+import com.ruoyi.common.utils.ServletUtils;
/**
* 服务相关配置
@@ -13,16 +12,9 @@ import javax.servlet.http.HttpServletRequest;
@Component
public class ServerConfig
{
- public static String getDomain(HttpServletRequest request)
- {
- StringBuffer url = request.getRequestURL();
- String contextPath = request.getServletContext().getContextPath();
- return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
- }
-
/**
* 获取完整的请求路径,包括:域名,端口,上下文访问路径
- *
+ *
* @return 服务地址
*/
public String getUrl()
@@ -30,4 +22,11 @@ public class ServerConfig
HttpServletRequest request = ServletUtils.getRequest();
return getDomain(request);
}
+
+ public static String getDomain(HttpServletRequest request)
+ {
+ StringBuffer url = request.getRequestURL();
+ String contextPath = request.getServletContext().getContextPath();
+ return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
+ }
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java
index 36695a2..0d67c22 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java
@@ -1,14 +1,13 @@
package com.ruoyi.framework.config;
-import com.ruoyi.common.utils.Threads;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.ThreadPoolExecutor;
+import com.ruoyi.common.utils.Threads;
/**
* 线程池配置
@@ -50,8 +49,7 @@ public class ThreadPoolConfig
protected ScheduledExecutorService scheduledExecutorService()
{
return new ScheduledThreadPoolExecutor(corePoolSize,
- new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
- new ThreadPoolExecutor.CallerRunsPolicy())
+ new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build())
{
@Override
protected void afterExecute(Runnable r, Throwable t)
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java
index 8064ec8..84f7e00 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java
@@ -1,8 +1,8 @@
package com.ruoyi.framework.config.properties;
-import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
+import com.alibaba.druid.pool.DruidDataSource;
/**
* druid 配置属性
@@ -24,12 +24,6 @@ public class DruidProperties
@Value("${spring.datasource.druid.maxWait}")
private int maxWait;
- @Value("${spring.datasource.druid.connectTimeout}")
- private int connectTimeout;
-
- @Value("${spring.datasource.druid.socketTimeout}")
- private int socketTimeout;
-
@Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@@ -60,12 +54,6 @@ public class DruidProperties
/** 配置获取连接等待超时的时间 */
datasource.setMaxWait(maxWait);
-
- /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */
- datasource.setConnectTimeout(connectTimeout);
-
- /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */
- datasource.setSocketTimeout(socketTimeout);
/** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java
index 9d585fc..e70b8cf 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java
@@ -1,9 +1,8 @@
package com.ruoyi.framework.datasource;
-import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
-import javax.sql.DataSource;
import java.util.Map;
+import javax.sql.DataSource;
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* 动态数据源
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java
index 9b929b0..3572db9 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java
@@ -14,25 +14,25 @@ public class DynamicDataSourceContextHolder
/**
* 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
- * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
+ * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
*/
private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>();
/**
- * 获得数据源的变量
+ * 设置数据源的变量
*/
- public static String getDataSourceType()
+ public static void setDataSourceType(String dsType)
{
- return CONTEXT_HOLDER.get();
+ log.info("切换到{}数据源", dsType);
+ CONTEXT_HOLDER.set(dsType);
}
/**
- * 设置数据源的变量
+ * 获得数据源的变量
*/
- public static void setDataSourceType(String dsType)
+ public static String getDataSourceType()
{
- log.info("切换到{}数据源", dsType);
- CONTEXT_HOLDER.set(dsType);
+ return CONTEXT_HOLDER.get();
}
/**
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java
index a057002..17d607f 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java
@@ -1,16 +1,15 @@
package com.ruoyi.framework.interceptor;
-import com.alibaba.fastjson2.JSON;
+import java.lang.reflect.Method;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.ServletUtils;
-import org.springframework.stereotype.Component;
-import org.springframework.web.method.HandlerMethod;
-import org.springframework.web.servlet.HandlerInterceptor;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.lang.reflect.Method;
/**
* 防止重复提交拦截器
@@ -18,7 +17,7 @@ import java.lang.reflect.Method;
* @author ruoyi
*/
@Component
-public abstract class RepeatSubmitInterceptor implements HandlerInterceptor
+public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
@@ -30,10 +29,10 @@ public abstract class RepeatSubmitInterceptor implements HandlerInterceptor
RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);
if (annotation != null)
{
- if (this.isRepeatSubmit(request, annotation))
+ if (this.isRepeatSubmit(request))
{
- AjaxResult ajaxResult = AjaxResult.error(annotation.message());
- ServletUtils.renderString(response, JSON.toJSONString(ajaxResult));
+ AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试");
+ ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult));
return false;
}
}
@@ -41,7 +40,7 @@ public abstract class RepeatSubmitInterceptor implements HandlerInterceptor
}
else
{
- return true;
+ return super.preHandle(request, response, handler);
}
}
@@ -52,5 +51,5 @@ public abstract class RepeatSubmitInterceptor implements HandlerInterceptor
* @return
* @throws Exception
*/
- public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation);
+ public abstract boolean isRepeatSubmit(HttpServletRequest request);
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
index 34230aa..cb4edbe 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
@@ -1,21 +1,19 @@
package com.ruoyi.framework.interceptor.impl;
-import com.alibaba.fastjson2.JSON;
-import com.ruoyi.common.annotation.RepeatSubmit;
-import com.ruoyi.common.constant.CacheConstants;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.filter.RepeatedlyRequestWrapper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpHelper;
import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
/**
* 判断请求url和数据是否和上一次相同,
@@ -37,9 +35,21 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
@Autowired
private RedisCache redisCache;
+ /**
+ * 间隔时间,单位:秒 默认10秒
+ *
+ * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
+ */
+ private int intervalTime = 10;
+
+ public void setIntervalTime(int intervalTime)
+ {
+ this.intervalTime = intervalTime;
+ }
+
@SuppressWarnings("unchecked")
@Override
- public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation)
+ public boolean isRepeatSubmit(HttpServletRequest request)
{
String nowParams = "";
if (request instanceof RepeatedlyRequestWrapper)
@@ -51,7 +61,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
// body参数为空,获取Parameter的数据
if (StringUtils.isEmpty(nowParams))
{
- nowParams = JSON.toJSONString(request.getParameterMap());
+ nowParams = JSONObject.toJSONString(request.getParameterMap());
}
Map nowDataMap = new HashMap();
nowDataMap.put(REPEAT_PARAMS, nowParams);
@@ -61,10 +71,14 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
String url = request.getRequestURI();
// 唯一值(没有消息头则使用请求地址)
- String submitKey = StringUtils.trimToEmpty(request.getHeader(header));
+ String submitKey = request.getHeader(header);
+ if (StringUtils.isEmpty(submitKey))
+ {
+ submitKey = url;
+ }
- // 唯一标识(指定key + url + 消息头)
- String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey;
+ // 唯一标识(指定key + 消息头)
+ String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + submitKey;
Object sessionObj = redisCache.getCacheObject(cacheRepeatKey);
if (sessionObj != null)
@@ -73,7 +87,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
if (sessionMap.containsKey(url))
{
Map preDataMap = (Map) sessionMap.get(url);
- if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval()))
+ if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap))
{
return true;
}
@@ -81,7 +95,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
}
Map cacheMap = new HashMap();
cacheMap.put(url, nowDataMap);
- redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS);
+ redisCache.setCacheObject(cacheRepeatKey, cacheMap, intervalTime, TimeUnit.SECONDS);
return false;
}
@@ -98,11 +112,11 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
/**
* 判断两次间隔时间
*/
- private boolean compareTime(Map nowMap, Map preMap, int interval)
+ private boolean compareTime(Map nowMap, Map preMap)
{
long time1 = (Long) nowMap.get(REPEAT_TIME);
long time2 = (Long) preMap.get(REPEAT_TIME);
- if ((time1 - time2) < interval)
+ if ((time1 - time2) < (this.intervalTime * 1000))
{
return true;
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java
index 93da79f..7387a02 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java
@@ -1,11 +1,10 @@
package com.ruoyi.framework.manager;
-import com.ruoyi.common.utils.Threads;
-import com.ruoyi.common.utils.spring.SpringUtils;
-
import java.util.TimerTask;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import com.ruoyi.common.utils.Threads;
+import com.ruoyi.common.utils.spring.SpringUtils;
/**
* 异步任务管理器
@@ -14,11 +13,11 @@ import java.util.concurrent.TimeUnit;
*/
public class AsyncManager
{
- private static AsyncManager me = new AsyncManager();
/**
* 操作延迟10毫秒
*/
private final int OPERATE_DELAY_TIME = 10;
+
/**
* 异步操作任务调度线程池
*/
@@ -29,6 +28,8 @@ public class AsyncManager
*/
private AsyncManager(){}
+ private static AsyncManager me = new AsyncManager();
+
public static AsyncManager me()
{
return me;
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java
index db928d4..e36ca3c 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java
@@ -3,7 +3,6 @@ package com.ruoyi.framework.manager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
-
import javax.annotation.PreDestroy;
/**
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
index 4920d5f..23d0230 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
@@ -1,5 +1,8 @@
package com.ruoyi.framework.manager.factory;
+import java.util.TimerTask;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.LogUtils;
import com.ruoyi.common.utils.ServletUtils;
@@ -12,10 +15,6 @@ import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.service.ISysLogininforService;
import com.ruoyi.system.service.ISysOperLogService;
import eu.bitwalker.useragentutils.UserAgent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.TimerTask;
/**
* 异步工厂(产生任务用)
@@ -39,7 +38,7 @@ public class AsyncFactory
final Object... args)
{
final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
- final String ip = IpUtils.getIpAddr();
+ final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
return new TimerTask()
{
@Override
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java
index caadd4b..3eb2495 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java
@@ -1,21 +1,20 @@
package com.ruoyi.framework.security.filter;
-import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.web.service.TokenService;
+import java.io.IOException;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
/**
* token过滤器 验证token有效性
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java
index fed2232..c22dd32 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java
@@ -1,18 +1,17 @@
package com.ruoyi.framework.security.handle;
-import com.alibaba.fastjson2.JSON;
+import java.io.IOException;
+import java.io.Serializable;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+import com.alibaba.fastjson.JSON;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.AuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.Serializable;
/**
* 认证失败处理类 返回未授权
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
index 5f94762..e5fc11d 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
@@ -1,7 +1,16 @@
package com.ruoyi.framework.security.handle;
-import com.alibaba.fastjson2.JSON;
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import com.alibaba.fastjson.JSON;
import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.ServletUtils;
@@ -9,15 +18,6 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.web.service.TokenService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
/**
* 自定义退出处理类 返回成功
@@ -48,6 +48,6 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
// 记录用户退出日志
AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
}
- ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success("退出成功")));
+ ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.SUCCESS, "退出成功")));
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java
index d64f191..63b03da 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java
@@ -1,5 +1,9 @@
package com.ruoyi.framework.web.domain;
+import java.net.UnknownHostException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
import com.ruoyi.common.utils.Arith;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.framework.web.domain.server.Cpu;
@@ -17,11 +21,6 @@ import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;
-import java.net.UnknownHostException;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
/**
* 服务器相关信息
*
@@ -106,30 +105,6 @@ public class Server
this.sysFiles = sysFiles;
}
- /**
- * 设置磁盘信息
- */
- private void setSysFiles(OperatingSystem os)
- {
- FileSystem fileSystem = os.getFileSystem();
- List fsArray = fileSystem.getFileStores();
- for (OSFileStore fs : fsArray)
- {
- long free = fs.getUsableSpace();
- long total = fs.getTotalSpace();
- long used = total - free;
- SysFile sysFile = new SysFile();
- sysFile.setDirName(fs.getMount());
- sysFile.setSysTypeName(fs.getType());
- sysFile.setTypeName(fs.getName());
- sysFile.setTotal(convertFileSize(total));
- sysFile.setFree(convertFileSize(free));
- sysFile.setUsed(convertFileSize(used));
- sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100));
- sysFiles.add(sysFile);
- }
- }
-
public void copyTo() throws Exception
{
SystemInfo si = new SystemInfo();
@@ -208,6 +183,30 @@ public class Server
jvm.setHome(props.getProperty("java.home"));
}
+ /**
+ * 设置磁盘信息
+ */
+ private void setSysFiles(OperatingSystem os)
+ {
+ FileSystem fileSystem = os.getFileSystem();
+ List fsArray = fileSystem.getFileStores();
+ for (OSFileStore fs : fsArray)
+ {
+ long free = fs.getUsableSpace();
+ long total = fs.getTotalSpace();
+ long used = total - free;
+ SysFile sysFile = new SysFile();
+ sysFile.setDirName(fs.getMount());
+ sysFile.setSysTypeName(fs.getType());
+ sysFile.setTypeName(fs.getName());
+ sysFile.setTotal(convertFileSize(total));
+ sysFile.setFree(convertFileSize(free));
+ sysFile.setUsed(convertFileSize(used));
+ sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100));
+ sysFiles.add(sysFile);
+ }
+ }
+
/**
* 字节转换
*
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java
index 463477a..485d201 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java
@@ -1,10 +1,9 @@
package com.ruoyi.framework.web.domain.server;
+import java.lang.management.ManagementFactory;
import com.ruoyi.common.utils.Arith;
import com.ruoyi.common.utils.DateUtils;
-import java.lang.management.ManagementFactory;
-
/**
* JVM相关信息
*
@@ -118,14 +117,6 @@ public class Jvm
*/
public String getRunTime()
{
- return DateUtils.timeDistance(DateUtils.getNowDate(), DateUtils.getServerStartDate());
- }
-
- /**
- * 运行参数
- */
- public String getInputArgs()
- {
- return ManagementFactory.getRuntimeMXBean().getInputArguments().toString();
+ return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate());
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
index 42f7978..51dd8c5 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
@@ -1,22 +1,19 @@
package com.ruoyi.framework.web.exception;
-import com.ruoyi.common.constant.HttpStatus;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.exception.DemoModeException;
-import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.StringUtils;
+import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
-import org.springframework.web.bind.MissingPathVariableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
-import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
-
-import javax.servlet.http.HttpServletRequest;
+import com.ruoyi.common.constant.HttpStatus;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.exception.DemoModeException;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
/**
* 全局异常处理器
@@ -62,28 +59,6 @@ public class GlobalExceptionHandler
return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
}
- /**
- * 请求路径中缺少必需的路径变量
- */
- @ExceptionHandler(MissingPathVariableException.class)
- public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request)
- {
- String requestURI = request.getRequestURI();
- log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e);
- return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName()));
- }
-
- /**
- * 请求参数类型不匹配
- */
- @ExceptionHandler(MethodArgumentTypeMismatchException.class)
- public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request)
- {
- String requestURI = request.getRequestURI();
- log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e);
- return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue()));
- }
-
/**
* 拦截未知的运行时异常
*/
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java
index 44c25ef..68b1d69 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java
@@ -1,14 +1,12 @@
package com.ruoyi.framework.web.service;
+import java.util.Set;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.security.context.PermissionContextHolder;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
-import java.util.Set;
/**
* RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母
@@ -45,7 +43,6 @@ public class PermissionService
{
return false;
}
- PermissionContextHolder.setContext(permission);
return hasPermissions(loginUser.getPermissions(), permission);
}
@@ -63,7 +60,7 @@ public class PermissionService
/**
* 验证用户是否具有以下任意一个权限
*
- * @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表
+ * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
* @return 用户是否具有以下任意一个权限
*/
public boolean hasAnyPermi(String permissions)
@@ -77,7 +74,6 @@ public class PermissionService
{
return false;
}
- PermissionContextHolder.setContext(permissions);
Set authorities = loginUser.getPermissions();
for (String permission : permissions.split(PERMISSION_DELIMETER))
{
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index 0572eeb..cdccaed 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -1,34 +1,28 @@
package com.ruoyi.framework.web.service;
-import com.ruoyi.common.constant.CacheConstants;
+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.constant.UserConstants;
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.ServiceException;
-import com.ruoyi.common.exception.user.BlackListException;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
-import com.ruoyi.common.exception.user.UserNotExistsException;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MessageUtils;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
-import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.system.service.ISysConfigService;
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;
/**
* 登录校验方法
@@ -64,18 +58,19 @@ public class SysLoginService
*/
public String login(String username, String password, String code, String uuid)
{
- // 验证码校验
- validateCaptcha(username, code, uuid);
- // 登录前置校验
- loginPreCheck(username, password);
+// boolean captchaOnOff = configService.selectCaptchaOnOff();
+// // 验证码开关
+// if (captchaOnOff)
+// {
+// validateCaptcha(username, code, uuid);
+// }
// 用户验证
Authentication authentication = null;
try
{
- UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
- AuthenticationContextHolder.setContext(authenticationToken);
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
- authentication = authenticationManager.authenticate(authenticationToken);
+ authentication = authenticationManager
+ .authenticate(new UsernamePasswordAuthenticationToken(username, password));
}
catch (Exception e)
{
@@ -90,13 +85,9 @@ public class SysLoginService
throw new ServiceException(e.getMessage());
}
}
- finally
- {
- AuthenticationContextHolder.clearContext();
- }
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
- recordLoginInfo(loginUser.getUserId());
+ recordLoginInfo(loginUser.getUser());
// 生成token
return tokenService.createToken(loginUser);
}
@@ -111,72 +102,28 @@ public class SysLoginService
*/
public void validateCaptcha(String username, String code, String uuid)
{
- boolean captchaEnabled = configService.selectCaptchaEnabled();
- if (captchaEnabled)
- {
- String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(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();
- }
- }
- }
-
- /**
- * 登录前置校验
- * @param username 用户名
- * @param password 用户密码
- */
- public void loginPreCheck(String username, String password)
- {
- // 用户名或密码为空 错误
- if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password))
- {
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
- throw new UserNotExistsException();
- }
- // 密码如果不在指定范围内 错误
- if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
- || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
- {
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
- throw new UserPasswordNotMatchException();
- }
- // 用户名不在指定范围内 错误
- if (username.length() < UserConstants.USERNAME_MIN_LENGTH
- || username.length() > UserConstants.USERNAME_MAX_LENGTH)
+ 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.password.not.match")));
- throw new UserPasswordNotMatchException();
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
+ throw new CaptchaExpireException();
}
- // IP黑名单校验
- String blackStr = configService.selectConfigByKey("sys.login.blackIPList");
- if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
+ if (!code.equalsIgnoreCase(captcha))
{
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked")));
- throw new BlackListException();
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
+ throw new CaptchaException();
}
}
/**
* 记录登录信息
- *
- * @param userId 用户ID
*/
- public void recordLoginInfo(Long userId)
+ public void recordLoginInfo(SysUser user)
{
- SysUser sysUser = new SysUser();
- sysUser.setUserId(userId);
- sysUser.setLoginIp(IpUtils.getIpAddr());
- sysUser.setLoginDate(DateUtils.getNowDate());
- userService.updateUserProfile(sysUser);
+ user.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+ user.setLoginDate(DateUtils.getNowDate());
+ userService.updateUserProfile(user);
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java
index 2534005..feb8038 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java
@@ -1,16 +1,12 @@
package com.ruoyi.framework.web.service;
-import com.ruoyi.common.core.domain.entity.SysRole;
+import java.util.HashSet;
+import java.util.Set;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.system.service.ISysRoleService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
/**
* 用户权限处理
@@ -63,21 +59,7 @@ public class SysPermissionService
}
else
{
- List roles = user.getRoles();
- if (!CollectionUtils.isEmpty(roles))
- {
- // 多角色设置permissions属性,以便数据权限匹配权限
- for (SysRole role : roles)
- {
- Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId());
- role.setPermissions(rolePerms);
- perms.addAll(rolePerms);
- }
- }
- else
- {
- perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
- }
+ perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
}
return perms;
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java
index bdc7b98..a47cafd 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java
@@ -1,6 +1,8 @@
package com.ruoyi.framework.web.service;
-import com.ruoyi.common.constant.CacheConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser;
@@ -10,13 +12,10 @@ import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
/**
* 注册校验方法
@@ -41,14 +40,13 @@ public class SysRegisterService
public String register(RegisterBody registerBody)
{
String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword();
- SysUser sysUser = new SysUser();
- sysUser.setUserName(username);
+ boolean captchaOnOff = configService.selectCaptchaOnOff();
// 验证码开关
- boolean captchaEnabled = configService.selectCaptchaEnabled();
- if (captchaEnabled)
+ if (captchaOnOff)
{
- validateCaptcha(username, registerBody.getCode(), registerBody.getUuid());
+ //validateCaptcha(username, registerBody.getCode(), registerBody.getUuid());
+ validateCaptcha(username, registerBody.getUuid());
}
if (StringUtils.isEmpty(username))
@@ -69,14 +67,16 @@ public class SysRegisterService
{
msg = "密码长度必须在5到20个字符之间";
}
- else if (!userService.checkUserNameUnique(sysUser))
+ else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(username)))
{
msg = "保存用户'" + username + "'失败,注册账号已存在";
}
else
{
+ SysUser sysUser = new SysUser();
+ sysUser.setUserName(username);
sysUser.setNickName(username);
- sysUser.setPassword(SecurityUtils.encryptPassword(password));
+ sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword()));
boolean regFlag = userService.registerUser(sysUser);
if (!regFlag)
{
@@ -84,7 +84,8 @@ public class SysRegisterService
}
else
{
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success")));
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER,
+ MessageUtils.message("user.register.success")));
}
}
return msg;
@@ -98,18 +99,19 @@ public class SysRegisterService
* @param uuid 唯一标识
* @return 结果
*/
- public void validateCaptcha(String username, String code, String uuid)
+ public void validateCaptcha(String username, String uuid)
+ // public void validateCaptcha(String username, String code, String uuid)
{
- String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
+ String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String captcha = redisCache.getCacheObject(verifyKey);
redisCache.deleteObject(verifyKey);
if (captcha == null)
{
throw new CaptchaExpireException();
}
- if (!code.equalsIgnoreCase(captcha))
- {
- throw new CaptchaException();
- }
+// if (!code.equalsIgnoreCase(captcha))
+// {
+// throw new CaptchaException();
+// }
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
index 693328f..bf28e0f 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -1,6 +1,12 @@
package com.ruoyi.framework.web.service;
-import com.ruoyi.common.constant.CacheConstants;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
@@ -13,14 +19,6 @@ import eu.bitwalker.useragentutils.UserAgent;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
/**
* token验证处理
@@ -30,18 +28,24 @@ import java.util.concurrent.TimeUnit;
@Component
public class TokenService
{
- protected static final long MILLIS_SECOND = 1000;
- protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
- private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
// 令牌自定义标识
@Value("${token.header}")
private String header;
+
// 令牌秘钥
@Value("${token.secret}")
private String secret;
+
// 令牌有效期(默认30分钟)
@Value("${token.expireTime}")
private int expireTime;
+
+ protected static final long MILLIS_SECOND = 1000;
+
+ protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
+
+ private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
+
@Autowired
private RedisCache redisCache;
@@ -151,7 +155,7 @@ public class TokenService
public void setUserAgent(LoginUser loginUser)
{
UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
- String ip = IpUtils.getIpAddr();
+ String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
loginUser.setIpaddr(ip);
loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
loginUser.setBrowser(userAgent.getBrowser().getName());
@@ -216,6 +220,6 @@ public class TokenService
private String getTokenKey(String uuid)
{
- return CacheConstants.LOGIN_TOKEN_KEY + uuid;
+ return Constants.LOGIN_TOKEN_KEY + uuid;
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
index a4926fb..c8b1c7b 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
@@ -1,12 +1,5 @@
package com.ruoyi.framework.web.service;
-import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.enums.UserStatus;
-import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.MessageUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.service.ISysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -14,6 +7,12 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.enums.UserStatus;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysUserService;
/**
* 用户验证处理
@@ -27,9 +26,6 @@ public class UserDetailsServiceImpl implements UserDetailsService
@Autowired
private ISysUserService userService;
-
- @Autowired
- private SysPasswordService passwordService;
@Autowired
private SysPermissionService permissionService;
@@ -41,21 +37,19 @@ public class UserDetailsServiceImpl implements UserDetailsService
if (StringUtils.isNull(user))
{
log.info("登录用户:{} 不存在.", username);
- throw new ServiceException(MessageUtils.message("user.not.exists"));
+ throw new ServiceException("登录用户:" + username + " 不存在");
}
else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
{
log.info("登录用户:{} 已被删除.", username);
- throw new ServiceException(MessageUtils.message("user.password.delete"));
+ throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
}
else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
{
log.info("登录用户:{} 已被停用.", username);
- throw new ServiceException(MessageUtils.message("user.blocked"));
+ throw new ServiceException("对不起,您的账号:" + username + " 已停用");
}
- passwordService.validate(user);
-
return createLoginUser(user);
}
diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml
index c562372..e1c461b 100644
--- a/ruoyi-generator/pom.xml
+++ b/ruoyi-generator/pom.xml
@@ -1,11 +1,11 @@
-
ruoyi
com.ruoyi
- 3.8.6
+ 3.7.0
4.0.0
@@ -20,7 +20,7 @@
org.apache.velocity
- velocity-engine-core
+ velocity
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
index 8b6879f..6dfe5e3 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
@@ -1,15 +1,10 @@
package com.ruoyi.generator.controller;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.core.text.Convert;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.generator.domain.GenTable;
-import com.ruoyi.generator.domain.GenTableColumn;
-import com.ruoyi.generator.service.IGenTableColumnService;
-import com.ruoyi.generator.service.IGenTableService;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -22,12 +17,16 @@ import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.text.Convert;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.generator.domain.GenTable;
+import com.ruoyi.generator.domain.GenTableColumn;
+import com.ruoyi.generator.service.IGenTableColumnService;
+import com.ruoyi.generator.service.IGenTableService;
/**
* 代码生成 操作处理
@@ -60,17 +59,17 @@ public class GenController extends BaseController
* 修改代码生成业务
*/
@PreAuthorize("@ss.hasPermi('tool:gen:query')")
- @GetMapping(value = "/{tableId}")
- public AjaxResult getInfo(@PathVariable Long tableId)
+ @GetMapping(value = "/{talbleId}")
+ public AjaxResult getInfo(@PathVariable Long talbleId)
{
- GenTable table = genTableService.selectGenTableById(tableId);
+ GenTable table = genTableService.selectGenTableById(talbleId);
List tables = genTableService.selectGenTableAll();
- List list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
+ List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId);
Map map = new HashMap();
map.put("info", table);
map.put("rows", list);
map.put("tables", tables);
- return success(map);
+ return AjaxResult.success(map);
}
/**
@@ -89,7 +88,7 @@ public class GenController extends BaseController
* 查询数据表字段列表
*/
@PreAuthorize("@ss.hasPermi('tool:gen:list')")
- @GetMapping(value = "/column/{tableId}")
+ @GetMapping(value = "/column/{talbleId}")
public TableDataInfo columnList(Long tableId)
{
TableDataInfo dataInfo = new TableDataInfo();
@@ -111,7 +110,7 @@ public class GenController extends BaseController
// 查询表信息
List tableList = genTableService.selectDbTableListByNames(tableNames);
genTableService.importGenTable(tableList);
- return success();
+ return AjaxResult.success();
}
/**
@@ -124,7 +123,7 @@ public class GenController extends BaseController
{
genTableService.validateEdit(genTable);
genTableService.updateGenTable(genTable);
- return success();
+ return AjaxResult.success();
}
/**
@@ -136,7 +135,7 @@ public class GenController extends BaseController
public AjaxResult remove(@PathVariable Long[] tableIds)
{
genTableService.deleteGenTableByIds(tableIds);
- return success();
+ return AjaxResult.success();
}
/**
@@ -147,7 +146,7 @@ public class GenController extends BaseController
public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException
{
Map dataMap = genTableService.previewCode(tableId);
- return success(dataMap);
+ return AjaxResult.success(dataMap);
}
/**
@@ -171,7 +170,7 @@ public class GenController extends BaseController
public AjaxResult genCode(@PathVariable("tableName") String tableName)
{
genTableService.generatorCode(tableName);
- return success();
+ return AjaxResult.success();
}
/**
@@ -183,7 +182,7 @@ public class GenController extends BaseController
public AjaxResult synchDb(@PathVariable("tableName") String tableName)
{
genTableService.synchDb(tableName);
- return success();
+ return AjaxResult.success();
}
/**
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
index 3889ac9..269779c 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
@@ -1,13 +1,12 @@
package com.ruoyi.generator.domain;
+import java.util.List;
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import org.apache.commons.lang3.ArrayUtils;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.utils.StringUtils;
-import org.apache.commons.lang3.ArrayUtils;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotBlank;
-import java.util.List;
/**
* 业务表 gen_table
@@ -96,31 +95,6 @@ public class GenTable extends BaseEntity
/** 上级菜单名称字段 */
private String parentMenuName;
- public static boolean isSub(String tplCategory)
- {
- return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory);
- }
-
- public static boolean isTree(String tplCategory)
- {
- return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory);
- }
-
- public static boolean isCrud(String tplCategory)
- {
- return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory);
- }
-
- public static boolean isSuperColumn(String tplCategory, String javaField)
- {
- if (isTree(tplCategory))
- {
- return StringUtils.equalsAnyIgnoreCase(javaField,
- ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY));
- }
- return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY);
- }
-
public Long getTableId()
{
return tableId;
@@ -356,18 +330,43 @@ public class GenTable extends BaseEntity
return isSub(this.tplCategory);
}
+ public static boolean isSub(String tplCategory)
+ {
+ return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory);
+ }
+
public boolean isTree()
{
return isTree(this.tplCategory);
}
+ public static boolean isTree(String tplCategory)
+ {
+ return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory);
+ }
+
public boolean isCrud()
{
return isCrud(this.tplCategory);
}
+ public static boolean isCrud(String tplCategory)
+ {
+ return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory);
+ }
+
public boolean isSuperColumn(String javaField)
{
return isSuperColumn(this.tplCategory, javaField);
}
+
+ public static boolean isSuperColumn(String tplCategory, String javaField)
+ {
+ if (isTree(tplCategory))
+ {
+ return StringUtils.equalsAnyIgnoreCase(javaField,
+ ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY));
+ }
+ return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY);
+ }
}
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java
index 7a0335f..d1733b6 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java
@@ -1,10 +1,9 @@
package com.ruoyi.generator.domain;
+import javax.validation.constraints.NotBlank;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.utils.StringUtils;
-import javax.validation.constraints.NotBlank;
-
/**
* 代码生成业务字段表 gen_table_column
*
@@ -69,19 +68,9 @@ public class GenTableColumn extends BaseEntity
/** 排序 */
private Integer sort;
- public static boolean isSuperColumn(String javaField)
- {
- return StringUtils.equalsAnyIgnoreCase(javaField,
- // BaseEntity
- "createBy", "createTime", "updateBy", "updateTime", "remark",
- // TreeEntity
- "parentName", "parentId", "orderNum", "ancestors");
- }
-
- public static boolean isUsableColumn(String javaField)
+ public void setColumnId(Long columnId)
{
- // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单
- return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark");
+ this.columnId = columnId;
}
public Long getColumnId()
@@ -89,9 +78,9 @@ public class GenTableColumn extends BaseEntity
return columnId;
}
- public void setColumnId(Long columnId)
+ public void setTableId(Long tableId)
{
- this.columnId = columnId;
+ this.tableId = tableId;
}
public Long getTableId()
@@ -99,9 +88,9 @@ public class GenTableColumn extends BaseEntity
return tableId;
}
- public void setTableId(Long tableId)
+ public void setColumnName(String columnName)
{
- this.tableId = tableId;
+ this.columnName = columnName;
}
public String getColumnName()
@@ -109,9 +98,9 @@ public class GenTableColumn extends BaseEntity
return columnName;
}
- public void setColumnName(String columnName)
+ public void setColumnComment(String columnComment)
{
- this.columnName = columnName;
+ this.columnComment = columnComment;
}
public String getColumnComment()
@@ -119,9 +108,9 @@ public class GenTableColumn extends BaseEntity
return columnComment;
}
- public void setColumnComment(String columnComment)
+ public void setColumnType(String columnType)
{
- this.columnComment = columnComment;
+ this.columnType = columnType;
}
public String getColumnType()
@@ -129,9 +118,9 @@ public class GenTableColumn extends BaseEntity
return columnType;
}
- public void setColumnType(String columnType)
+ public void setJavaType(String javaType)
{
- this.columnType = columnType;
+ this.javaType = javaType;
}
public String getJavaType()
@@ -139,9 +128,9 @@ public class GenTableColumn extends BaseEntity
return javaType;
}
- public void setJavaType(String javaType)
+ public void setJavaField(String javaField)
{
- this.javaType = javaType;
+ this.javaField = javaField;
}
public String getJavaField()
@@ -149,24 +138,19 @@ public class GenTableColumn extends BaseEntity
return javaField;
}
- public void setJavaField(String javaField)
- {
- this.javaField = javaField;
- }
-
public String getCapJavaField()
{
return StringUtils.capitalize(javaField);
}
- public String getIsPk()
+ public void setIsPk(String isPk)
{
- return isPk;
+ this.isPk = isPk;
}
- public void setIsPk(String isPk)
+ public String getIsPk()
{
- this.isPk = isPk;
+ return isPk;
}
public boolean isPk()
@@ -199,14 +183,14 @@ public class GenTableColumn extends BaseEntity
return isIncrement != null && StringUtils.equals("1", isIncrement);
}
- public String getIsRequired()
+ public void setIsRequired(String isRequired)
{
- return isRequired;
+ this.isRequired = isRequired;
}
- public void setIsRequired(String isRequired)
+ public String getIsRequired()
{
- this.isRequired = isRequired;
+ return isRequired;
}
public boolean isRequired()
@@ -219,14 +203,14 @@ public class GenTableColumn extends BaseEntity
return isRequired != null && StringUtils.equals("1", isRequired);
}
- public String getIsInsert()
+ public void setIsInsert(String isInsert)
{
- return isInsert;
+ this.isInsert = isInsert;
}
- public void setIsInsert(String isInsert)
+ public String getIsInsert()
{
- this.isInsert = isInsert;
+ return isInsert;
}
public boolean isInsert()
@@ -239,14 +223,14 @@ public class GenTableColumn extends BaseEntity
return isInsert != null && StringUtils.equals("1", isInsert);
}
- public String getIsEdit()
+ public void setIsEdit(String isEdit)
{
- return isEdit;
+ this.isEdit = isEdit;
}
- public void setIsEdit(String isEdit)
+ public String getIsEdit()
{
- this.isEdit = isEdit;
+ return isEdit;
}
public boolean isEdit()
@@ -259,14 +243,14 @@ public class GenTableColumn extends BaseEntity
return isEdit != null && StringUtils.equals("1", isEdit);
}
- public String getIsList()
+ public void setIsList(String isList)
{
- return isList;
+ this.isList = isList;
}
- public void setIsList(String isList)
+ public String getIsList()
{
- this.isList = isList;
+ return isList;
}
public boolean isList()
@@ -279,14 +263,14 @@ public class GenTableColumn extends BaseEntity
return isList != null && StringUtils.equals("1", isList);
}
- public String getIsQuery()
+ public void setIsQuery(String isQuery)
{
- return isQuery;
+ this.isQuery = isQuery;
}
- public void setIsQuery(String isQuery)
+ public String getIsQuery()
{
- this.isQuery = isQuery;
+ return isQuery;
}
public boolean isQuery()
@@ -299,14 +283,14 @@ public class GenTableColumn extends BaseEntity
return isQuery != null && StringUtils.equals("1", isQuery);
}
- public String getQueryType()
+ public void setQueryType(String queryType)
{
- return queryType;
+ this.queryType = queryType;
}
- public void setQueryType(String queryType)
+ public String getQueryType()
{
- this.queryType = queryType;
+ return queryType;
}
public String getHtmlType()
@@ -319,14 +303,19 @@ public class GenTableColumn extends BaseEntity
this.htmlType = htmlType;
}
+ public void setDictType(String dictType)
+ {
+ this.dictType = dictType;
+ }
+
public String getDictType()
{
return dictType;
}
- public void setDictType(String dictType)
+ public void setSort(Integer sort)
{
- this.dictType = dictType;
+ this.sort = sort;
}
public Integer getSort()
@@ -334,14 +323,18 @@ public class GenTableColumn extends BaseEntity
return sort;
}
- public void setSort(Integer sort)
+ public boolean isSuperColumn()
{
- this.sort = sort;
+ return isSuperColumn(this.javaField);
}
- public boolean isSuperColumn()
+ public static boolean isSuperColumn(String javaField)
{
- return isSuperColumn(this.javaField);
+ return StringUtils.equalsAnyIgnoreCase(javaField,
+ // BaseEntity
+ "createBy", "createTime", "updateBy", "updateTime", "remark",
+ // TreeEntity
+ "parentName", "parentId", "orderNum", "ancestors");
}
public boolean isUsableColumn()
@@ -349,6 +342,12 @@ public class GenTableColumn extends BaseEntity
return isUsableColumn(javaField);
}
+ public static boolean isUsableColumn(String javaField)
+ {
+ // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单
+ return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark");
+ }
+
public String readConverterExp()
{
String remarks = StringUtils.substringBetween(this.columnComment, "(", ")");
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java
index 4119882..951e166 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java
@@ -1,8 +1,7 @@
package com.ruoyi.generator.mapper;
-import com.ruoyi.generator.domain.GenTableColumn;
-
import java.util.List;
+import com.ruoyi.generator.domain.GenTableColumn;
/**
* 业务字段 数据层
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java
index 5e6bd42..9b330df 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java
@@ -1,8 +1,7 @@
package com.ruoyi.generator.mapper;
-import com.ruoyi.generator.domain.GenTable;
-
import java.util.List;
+import com.ruoyi.generator.domain.GenTable;
/**
* 业务 数据层
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java
index 2ec4495..0679689 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java
@@ -1,12 +1,11 @@
package com.ruoyi.generator.service;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.generator.domain.GenTableColumn;
import com.ruoyi.generator.mapper.GenTableColumnMapper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
/**
* 业务字段 服务层实现
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java
index 2e3b00f..499da03 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java
@@ -1,7 +1,27 @@
package com.ruoyi.generator.service;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.core.text.CharsetKit;
@@ -15,28 +35,6 @@ import com.ruoyi.generator.mapper.GenTableMapper;
import com.ruoyi.generator.util.GenUtils;
import com.ruoyi.generator.util.VelocityInitializer;
import com.ruoyi.generator.util.VelocityUtils;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.Velocity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
/**
* 业务 服务层实现
@@ -54,26 +52,9 @@ public class GenTableServiceImpl implements IGenTableService
@Autowired
private GenTableColumnMapper genTableColumnMapper;
- /**
- * 获取代码生成地址
- *
- * @param table 业务表信息
- * @param template 模板文件路径
- * @return 生成地址
- */
- public static String getGenPath(GenTable table, String template)
- {
- String genPath = table.getGenPath();
- if (StringUtils.equals(genPath, "/"))
- {
- return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table);
- }
- return genPath + File.separator + VelocityUtils.getFileName(template, table);
- }
-
/**
* 查询业务信息
- *
+ *
* @param id 业务ID
* @return 业务信息
*/
@@ -87,7 +68,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 查询业务列表
- *
+ *
* @param genTable 业务信息
* @return 业务集合
*/
@@ -99,7 +80,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 查询据库列表
- *
+ *
* @param genTable 业务信息
* @return 数据库表集合
*/
@@ -111,7 +92,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 查询据库列表
- *
+ *
* @param tableNames 表名称组
* @return 数据库表集合
*/
@@ -123,7 +104,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 查询所有表信息
- *
+ *
* @return 表信息集合
*/
@Override
@@ -134,7 +115,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 修改业务
- *
+ *
* @param genTable 业务信息
* @return 结果
*/
@@ -156,7 +137,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 删除业务对象
- *
+ *
* @param tableIds 需要删除的数据ID
* @return 结果
*/
@@ -170,7 +151,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 导入表结构
- *
+ *
* @param tableList 导入表列表
*/
@Override
@@ -205,7 +186,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 预览代码
- *
+ *
* @param tableId 表编号
* @return 预览数据列表
*/
@@ -238,7 +219,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 生成代码(下载方式)
- *
+ *
* @param tableName 表名称
* @return 数据
*/
@@ -254,7 +235,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 生成代码(自定义路径)
- *
+ *
* @param tableName 表名称
*/
@Override
@@ -296,7 +277,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 同步数据库
- *
+ *
* @param tableName 表名称
*/
@Override
@@ -305,7 +286,7 @@ public class GenTableServiceImpl implements IGenTableService
{
GenTable table = genTableMapper.selectGenTableByName(tableName);
List tableColumns = table.getColumns();
- Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity()));
+ List tableColumnNames = tableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList());
List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
if (StringUtils.isEmpty(dbTableColumns))
@@ -315,29 +296,9 @@ public class GenTableServiceImpl implements IGenTableService
List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList());
dbTableColumns.forEach(column -> {
- GenUtils.initColumnField(column, table);
- if (tableColumnMap.containsKey(column.getColumnName()))
- {
- GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName());
- column.setColumnId(prevColumn.getColumnId());
- if (column.isList())
- {
- // 如果是列表,继续保留查询方式/字典类型选项
- column.setDictType(prevColumn.getDictType());
- column.setQueryType(prevColumn.getQueryType());
- }
- if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk()
- && (column.isInsert() || column.isEdit())
- && ((column.isUsableColumn()) || (!column.isSuperColumn())))
- {
- // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项
- column.setIsRequired(prevColumn.getIsRequired());
- column.setHtmlType(prevColumn.getHtmlType());
- }
- genTableColumnMapper.updateGenTableColumn(column);
- }
- else
+ if (!tableColumnNames.contains(column.getColumnName()))
{
+ GenUtils.initColumnField(column, table);
genTableColumnMapper.insertGenTableColumn(column);
}
});
@@ -351,7 +312,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 批量生成代码(下载方式)
- *
+ *
* @param tableNames 表数组
* @return 数据
*/
@@ -398,7 +359,7 @@ public class GenTableServiceImpl implements IGenTableService
zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table)));
IOUtils.write(sw.toString(), zip, Constants.UTF8);
IOUtils.closeQuietly(sw);
- zip.flush();
+ zip.flush();
zip.closeEntry();
}
catch (IOException e)
@@ -410,7 +371,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 修改保存参数校验
- *
+ *
* @param genTable 业务信息
*/
@Override
@@ -419,7 +380,7 @@ public class GenTableServiceImpl implements IGenTableService
if (GenConstants.TPL_TREE.equals(genTable.getTplCategory()))
{
String options = JSON.toJSONString(genTable.getParams());
- JSONObject paramsObj = JSON.parseObject(options);
+ JSONObject paramsObj = JSONObject.parseObject(options);
if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE)))
{
throw new ServiceException("树编码字段不能为空");
@@ -448,7 +409,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 设置主键列信息
- *
+ *
* @param table 业务表信息
*/
public void setPkColumn(GenTable table)
@@ -484,7 +445,7 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 设置主子表信息
- *
+ *
* @param table 业务表信息
*/
public void setSubTable(GenTable table)
@@ -498,12 +459,12 @@ public class GenTableServiceImpl implements IGenTableService
/**
* 设置代码生成其他选项值
- *
+ *
* @param genTable 设置后的生成对象
*/
public void setTableFromOptions(GenTable genTable)
{
- JSONObject paramsObj = JSON.parseObject(genTable.getOptions());
+ JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions());
if (StringUtils.isNotNull(paramsObj))
{
String treeCode = paramsObj.getString(GenConstants.TREE_CODE);
@@ -511,7 +472,7 @@ public class GenTableServiceImpl implements IGenTableService
String treeName = paramsObj.getString(GenConstants.TREE_NAME);
String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID);
String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME);
-
+
genTable.setTreeCode(treeCode);
genTable.setTreeParentCode(treeParentCode);
genTable.setTreeName(treeName);
@@ -519,4 +480,21 @@ public class GenTableServiceImpl implements IGenTableService
genTable.setParentMenuName(parentMenuName);
}
}
+
+ /**
+ * 获取代码生成地址
+ *
+ * @param table 业务表信息
+ * @param template 模板文件路径
+ * @return 生成地址
+ */
+ public static String getGenPath(GenTable table, String template)
+ {
+ String genPath = table.getGenPath();
+ if (StringUtils.equals(genPath, "/"))
+ {
+ return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table);
+ }
+ return genPath + File.separator + VelocityUtils.getFileName(template, table);
+ }
}
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java
index 36a3215..3037f70 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java
@@ -1,8 +1,7 @@
package com.ruoyi.generator.service;
-import com.ruoyi.generator.domain.GenTableColumn;
-
import java.util.List;
+import com.ruoyi.generator.domain.GenTableColumn;
/**
* 业务字段 服务层
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java
index 86195db..9d53f95 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java
@@ -1,9 +1,8 @@
package com.ruoyi.generator.service;
-import com.ruoyi.generator.domain.GenTable;
-
import java.util.List;
import java.util.Map;
+import com.ruoyi.generator.domain.GenTable;
/**
* 业务 服务层
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java
index c9d26ad..06c6821 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java
@@ -1,13 +1,12 @@
package com.ruoyi.generator.util;
+import java.util.Arrays;
+import org.apache.commons.lang3.RegExUtils;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.generator.config.GenConfig;
import com.ruoyi.generator.domain.GenTable;
import com.ruoyi.generator.domain.GenTableColumn;
-import org.apache.commons.lang3.RegExUtils;
-
-import java.util.Arrays;
/**
* 代码生成器 工具类
@@ -43,7 +42,6 @@ public class GenUtils
column.setJavaField(StringUtils.toCamelCase(columnName));
// 设置默认类型
column.setJavaType(GenConstants.TYPE_STRING);
- column.setQueryType(GenConstants.QUERY_EQ);
if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType))
{
@@ -153,7 +151,8 @@ public class GenUtils
{
int lastIndex = packageName.lastIndexOf(".");
int nameLength = packageName.length();
- return StringUtils.substring(packageName, lastIndex + 1, nameLength);
+ String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength);
+ return moduleName;
}
/**
@@ -166,7 +165,8 @@ public class GenUtils
{
int lastIndex = tableName.lastIndexOf("_");
int nameLength = tableName.length();
- return StringUtils.substring(tableName, lastIndex + 1, nameLength);
+ String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength);
+ return businessName;
}
/**
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java
index dbecfe4..32452b8 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java
@@ -1,9 +1,8 @@
package com.ruoyi.generator.util;
-import com.ruoyi.common.constant.Constants;
-import org.apache.velocity.app.Velocity;
-
import java.util.Properties;
+import org.apache.velocity.app.Velocity;
+import com.ruoyi.common.constant.Constants;
/**
* VelocityEngine工厂
@@ -21,9 +20,10 @@ public class VelocityInitializer
try
{
// 加载classpath目录下的vm文件
- p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
+ p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
// 定义字符集
p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8);
+ p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8);
// 初始化Velocity引擎,指定配置Properties
Velocity.init(p);
}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
index 915e05e..4472928 100644
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
+++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
@@ -1,18 +1,15 @@
package com.ruoyi.generator.util;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import org.apache.velocity.VelocityContext;
+import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.generator.domain.GenTable;
import com.ruoyi.generator.domain.GenTableColumn;
-import org.apache.velocity.VelocityContext;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
/**
* 模板处理工具类
@@ -61,7 +58,6 @@ public class VelocityUtils
velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
velocityContext.put("columns", genTable.getColumns());
velocityContext.put("table", genTable);
- velocityContext.put("dicts", getDicts(genTable));
setMenuVelocityContext(velocityContext, genTable);
if (GenConstants.TPL_TREE.equals(tplCategory))
{
@@ -77,7 +73,7 @@ public class VelocityUtils
public static void setMenuVelocityContext(VelocityContext context, GenTable genTable)
{
String options = genTable.getOptions();
- JSONObject paramsObj = JSON.parseObject(options);
+ JSONObject paramsObj = JSONObject.parseObject(options);
String parentMenuId = getParentMenuId(paramsObj);
context.put("parentMenuId", parentMenuId);
}
@@ -85,7 +81,7 @@ public class VelocityUtils
public static void setTreeVelocityContext(VelocityContext context, GenTable genTable)
{
String options = genTable.getOptions();
- JSONObject paramsObj = JSON.parseObject(options);
+ JSONObject paramsObj = JSONObject.parseObject(options);
String treeCode = getTreecode(paramsObj);
String treeParentCode = getTreeParentCode(paramsObj);
String treeName = getTreeName(paramsObj);
@@ -230,7 +226,8 @@ public class VelocityUtils
public static String getPackagePrefix(String packageName)
{
int lastIndex = packageName.lastIndexOf(".");
- return StringUtils.substring(packageName, 0, lastIndex);
+ String basePackage = StringUtils.substring(packageName, 0, lastIndex);
+ return basePackage;
}
/**
@@ -263,44 +260,6 @@ public class VelocityUtils
return importList;
}
- /**
- * 根据列类型获取字典组
- *
- * @param genTable 业务表对象
- * @return 返回字典组
- */
- public static String getDicts(GenTable genTable)
- {
- List columns = genTable.getColumns();
- Set dicts = new HashSet();
- addDicts(dicts, columns);
- if (StringUtils.isNotNull(genTable.getSubTable()))
- {
- List subColumns = genTable.getSubTable().getColumns();
- addDicts(dicts, subColumns);
- }
- return StringUtils.join(dicts, ", ");
- }
-
- /**
- * 添加字典列表
- *
- * @param dicts 字典列表
- * @param columns 列集合
- */
- public static void addDicts(Set dicts, List columns)
- {
- for (GenTableColumn column : columns)
- {
- if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
- column.getHtmlType(),
- new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX }))
- {
- dicts.add("'" + column.getDictType() + "'");
- }
- }
- }
-
/**
* 获取权限前缀
*
@@ -383,7 +342,7 @@ public class VelocityUtils
public static int getExpandColumn(GenTable genTable)
{
String options = genTable.getOptions();
- JSONObject paramsObj = JSON.parseObject(options);
+ JSONObject paramsObj = JSONObject.parseObject(options);
String treeName = paramsObj.getString(GenConstants.TREE_NAME);
int num = 0;
for (GenTableColumn column : genTable.getColumns())
diff --git a/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-generator/src/main/resources/generator.yml
index 7eae68e..27aee34 100644
--- a/ruoyi-generator/src/main/resources/generator.yml
+++ b/ruoyi-generator/src/main/resources/generator.yml
@@ -1,10 +1,10 @@
# 代码生成
-gen:
+gen:
# 作者
author: ruoyi
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
- packageName: com.ruoyi.system
+ packageName: com.ruoyi.zjgyyingji
# 自动去除表前缀,默认是false
autoRemovePre: false
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
- tablePrefix: sys_
\ No newline at end of file
+ tablePrefix: b_
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml
index 66109de..5fa790f 100644
--- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml
+++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml
@@ -3,7 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
+
@@ -28,23 +28,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
+
select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column
-
+
-
+
-
+
insert into gen_table_column (
table_id,
@@ -88,37 +88,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sysdate()
)
-
+
update gen_table_column
- column_comment = #{columnComment},
- java_type = #{javaType},
- java_field = #{javaField},
- is_insert = #{isInsert},
- is_edit = #{isEdit},
- is_list = #{isList},
- is_query = #{isQuery},
- is_required = #{isRequired},
- query_type = #{queryType},
- html_type = #{htmlType},
- dict_type = #{dictType},
- sort = #{sort},
- update_by = #{updateBy},
+ column_comment = #{columnComment},
+ java_type = #{javaType},
+ java_field = #{javaField},
+ is_insert = #{isInsert},
+ is_edit = #{isEdit},
+ is_list = #{isList},
+ is_query = #{isQuery},
+ is_required = #{isRequired},
+ query_type = #{queryType},
+ html_type = #{htmlType},
+ dict_type = #{dictType},
+ sort = #{sort},
+ update_by = #{updateBy},
update_time = sysdate()
where column_id = #{columnId}
- delete from gen_table_column where table_id in
+ delete from gen_table_column where table_id in
#{tableId}
-
+
- delete from gen_table_column where column_id in
+ delete from gen_table_column where column_id in
#{item.columnId}
diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm
index bf88988..e634340 100644
--- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm
+++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm
@@ -1,7 +1,9 @@
package ${packageName}.controller;
+import com.ruoyi.common.annotation.DataScope;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
import java.util.List;
-import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -26,10 +28,12 @@ import com.ruoyi.common.core.page.TableDataInfo;
/**
* ${functionName}Controller
- *
+ *
* @author ${author}
* @date ${datetime}
*/
+@Api(tags="${functionName}" ,description =
+"${className}")
@RestController
@RequestMapping("/${moduleName}/${businessName}")
public class ${ClassName}Controller extends BaseController
@@ -40,7 +44,9 @@ public class ${ClassName}Controller extends BaseController
/**
* 查询${functionName}列表
*/
+@ApiOperation("查询${functionName}信息")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
+ @DataScope( deptAlias = "t", userAlias = "t")
@GetMapping("/list")
#if($table.crud || $table.sub)
public TableDataInfo list(${ClassName} ${className})
@@ -53,58 +59,69 @@ public class ${ClassName}Controller extends BaseController
public AjaxResult list(${ClassName} ${className})
{
List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
- return success(list);
+ return AjaxResult.success(list);
}
#end
/**
* 导出${functionName}列表
*/
+ @ApiOperation("导出${functionName}列表")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
@Log(title = "${functionName}", businessType = BusinessType.EXPORT)
- @PostMapping("/export")
- public void export(HttpServletResponse response, ${ClassName} ${className})
+ @GetMapping("/export")
+ public AjaxResult export(${ClassName} ${className})
{
List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
- util.exportExcel(response, list, "${functionName}数据");
+ return util.exportExcel(list, "${functionName}数据");
}
/**
* 获取${functionName}详细信息
*/
+ @ApiOperation("获取${functionName}详细信息")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")
@GetMapping(value = "/{${pkColumn.javaField}}")
public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
{
- return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
+ return AjaxResult.success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
}
/**
* 新增${functionName}
*/
+ @ApiOperation("新增${functionName}详细信息")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')")
@Log(title = "${functionName}", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody ${ClassName} ${className})
{
+ ${className}.setCreateId(getUserId());
+ ${className}.setCreateBy(getUsername());
+ ${className}.setUserId(getUserId());
+ ${className}.setDeptId(getDeptId());
return toAjax(${className}Service.insert${ClassName}(${className}));
}
/**
* 修改${functionName}
*/
+ @ApiOperation("修改${functionName}详细信息")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
@Log(title = "${functionName}", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody ${ClassName} ${className})
{
+ ${className}.setUpdateId(getUserId());
+ ${className}.setUpdateBy(getUsername());
return toAjax(${className}Service.update${ClassName}(${className}));
}
/**
* 删除${functionName}
*/
+ @ApiOperation("删除${functionName}详细信息")
@PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")
@Log(title = "${functionName}", businessType = BusinessType.DELETE)
@DeleteMapping("/{${pkColumn.javaField}s}")
diff --git a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
index 7e7d7c2..42d015d 100644
--- a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
+++ b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
@@ -69,7 +69,7 @@ public interface ${ClassName}Mapper
* @param ${pkColumn.javaField}s 需要删除的数据主键集合
* @return 结果
*/
- public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
+ public int delete${subClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
/**
* 批量新增${subTable.functionName}
diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
index 14746e1..75105ce 100644
--- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
+++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
@@ -129,9 +129,6 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
* @param ${pkColumn.javaField} ${functionName}主键
* @return 结果
*/
-#if($table.sub)
- @Transactional
-#end
@Override
public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
{
diff --git a/ruoyi-generator/src/main/resources/vm/js/api.js.vm b/ruoyi-generator/src/main/resources/vm/js/api.js.vm
index 9295524..296d41a 100644
--- a/ruoyi-generator/src/main/resources/vm/js/api.js.vm
+++ b/ruoyi-generator/src/main/resources/vm/js/api.js.vm
@@ -42,3 +42,12 @@ export function del${BusinessName}(${pkColumn.javaField}) {
method: 'delete'
})
}
+
+// 导出${functionName}
+export function export${BusinessName}(query) {
+ return request({
+ url: '/${moduleName}/${businessName}/export',
+ method: 'get',
+ params: query
+ })
+}
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
index 07104a7..58790c2 100644
--- a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
+++ b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
@@ -1,6 +1,6 @@
-
+
#foreach($column in $columns)
#if($column.query)
#set($dictType=$column.dictType)
@@ -17,29 +17,30 @@
v-model="queryParams.${column.javaField}"
placeholder="请输入${comment}"
clearable
+ size="small"
@keyup.enter.native="handleQuery"
/>
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-
+
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-
+
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-
新增
-
- 展开/折叠
-
#foreach($column in $columns)
@@ -113,20 +105,10 @@
{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}
-#elseif($column.list && $column.htmlType == "imageUpload")
-
-
-
-
-
#elseif($column.list && "" != $column.dictType)
-#if($column.htmlType == "checkbox")
-
-#else
-
-#end
+
#elseif($column.list && "" != $javaField)
@@ -187,12 +169,12 @@
#elseif($column.htmlType == "imageUpload")
-
-
+
+
#elseif($column.htmlType == "fileUpload")
-
-
+
+
#elseif($column.htmlType == "editor")
@@ -202,14 +184,11 @@
@@ -220,45 +199,42 @@
#elseif($column.htmlType == "checkbox" && "" != $dictType)
-
+
- {{dict.label}}
+ v-for="dict in ${field}Options"
+ :key="dict.dictValue"
+ :label="dict.dictValue">
+ {{dict.dictLabel}}
#elseif($column.htmlType == "checkbox" && $dictType)
-
+
请选择字典生成
#elseif($column.htmlType == "radio" && "" != $dictType)
-
+
{{dict.label}}
+ v-for="dict in ${field}Options"
+ :key="dict.dictValue"
+ #if($column.javaType == "Integer" || $column.javaType == "Long"):label="parseInt(dict.dictValue)"#else:label="dict.dictValue"#end
+
+ >{{dict.dictLabel}}
#elseif($column.htmlType == "radio" && $dictType)
-
+
请选择字典生成
#elseif($column.htmlType == "datetime")
-
diff --git a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm
index 0ceb3d8..0895aee 100644
--- a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm
+++ b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm
@@ -23,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#end
- select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName}
+ select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName}