作者 钟来

开发U渔设备功能

正在显示 17 个修改的文件 包含 541 行增加368 行删除
... ... @@ -17,4 +17,14 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
//package com.zhonglai.luhui.log.aspectj;
//
//import com.alibaba.fastjson.JSON;
//import com.ruoyi.common.annotation.Log;
//import com.ruoyi.common.core.domain.BaseLoginUser;
//import com.ruoyi.common.enums.BusinessStatus;
//import com.ruoyi.common.enums.HttpMethod;
//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.system.domain.sys.SysOperLog;
//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.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 javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.util.Collection;
//import java.util.Map;
//
///**
// * 操作日志记录处理
// *
// * @author ruoyi
// */
//@Aspect
//@Component
//public class LogAspect
//{
// private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
//
// /**
// * 处理完请求后执行
// *
// * @param joinPoint 切点
// */
// @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
// public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult)
// {
// handleLog(joinPoint, controllerLog, null, jsonResult);
// }
//
// /**
// * 拦截异常操作
// *
// * @param joinPoint 切点
// * @param e 异常
// */
// @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
// public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e)
// {
// handleLog(joinPoint, controllerLog, e, null);
// }
//
// protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult)
// {
// try
// {
// // 获取当前的用户
// BaseLoginUser loginUser = SecurityUtils.getLoginUser();
//
// // *========数据库日志=========*//
// SysOperLog operLog = new SysOperLog();
// operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
// // 请求的地址
// String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
// operLog.setOperIp(ip);
// operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
// if (loginUser != null)
// {
// operLog.setOperName(loginUser.getUsername());
// }
//
// if (e != null)
// {
// operLog.setStatus(BusinessStatus.FAIL.ordinal());
// operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
// }
// // 设置方法名称
// String className = joinPoint.getTarget().getClass().getName();
// String methodName = joinPoint.getSignature().getName();
// operLog.setMethod(className + "." + methodName + "()");
// // 设置请求方式
// operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
// // 处理设置注解上的参数
// getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
// // 保存数据库
// AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
// }
// catch (Exception exp)
// {
// // 记录本地异常日志
// log.error("==前置通知异常==");
// log.error("异常信息:{}", exp.getMessage());
// exp.printStackTrace();
// }
// }
//
// /**
// * 获取注解中对方法的描述信息 用于Controller层注解
// *
// * @param log 日志
// * @param operLog 操作日志
// * @throws Exception
// */
// public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception
// {
// // 设置action动作
// operLog.setBusinessType(log.businessType().ordinal());
// // 设置标题
// operLog.setTitle(log.title());
// // 设置操作人类别
// operLog.setOperatorType(log.operatorType().ordinal());
// // 是否需要保存request,参数和值
// if (log.isSaveRequestData())
// {
// // 获取参数的信息,传入到数据库中。
// setRequestValue(joinPoint, operLog);
// }
// // 是否需要保存response,参数和值
// if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult))
// {
// operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));
// }
// }
//
// /**
// * 获取请求的参数,放到log中
// *
// * @param operLog 操作日志
// * @throws Exception 异常
// */
// private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception
// {
// String requestMethod = operLog.getRequestMethod();
// if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))
// {
// String params = argsArrayToString(joinPoint.getArgs());
// operLog.setOperParam(StringUtils.substring(params, 0, 2000));
// }
// else
// {
// Map<?, ?> paramsMap = (Map<?, ?>) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
// operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000));
// }
// }
//
// /**
// * 参数拼装
// */
// private String argsArrayToString(Object[] paramsArray)
// {
// String params = "";
// if (paramsArray != null && paramsArray.length > 0)
// {
// for (Object o : paramsArray)
// {
// if (StringUtils.isNotNull(o) && !isFilterObject(o))
// {
// try
// {
// Object jsonObj = JSON.toJSON(o);
// params += jsonObj.toString() + " ";
// }
// catch (Exception e)
// {
// }
// }
// }
// }
// return params.trim();
// }
//
// /**
// * 判断是否需要过滤的对象。
// *
// * @param o 对象信息。
// * @return 如果是需要过滤的对象,则返回true;否则返回false。
// */
// @SuppressWarnings("rawtypes")
// public boolean isFilterObject(final Object o)
// {
// Class<?> clazz = o.getClass();
// if (clazz.isArray())
// {
// return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
// }
// else if (Collection.class.isAssignableFrom(clazz))
// {
// Collection collection = (Collection) o;
// for (Object value : collection)
// {
// return value instanceof MultipartFile;
// }
// }
// else if (Map.class.isAssignableFrom(clazz))
// {
// Map map = (Map) o;
// for (Object value : map.entrySet())
// {
// Map.Entry entry = (Map.Entry) value;
// return entry.getValue() instanceof MultipartFile;
// }
// }
// return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
// || o instanceof BindingResult;
// }
//}
package com.zhonglai.luhui.log.aspectj;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessStatus;
import com.ruoyi.common.enums.HttpMethod;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.system.domain.sys.SysOperLog;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import com.zhonglai.luhui.sys.manager.AsyncManager;
import com.zhonglai.luhui.sys.manager.factory.AsyncFactory;
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.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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.Map;
/**
* 操作日志记录处理
*
* @author ruoyi
*/
@Aspect
@Component
public class LogAspect
{
private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
/**
* 处理完请求后执行
*
* @param joinPoint 切点
*/
@AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult)
{
handleLog(joinPoint, controllerLog, null, jsonResult);
}
/**
* 拦截异常操作
*
* @param joinPoint 切点
* @param e 异常
*/
@AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e)
{
handleLog(joinPoint, controllerLog, e, null);
}
protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult)
{
try
{
// 获取当前的用户
BaseLoginUser loginUser = SecurityUtils.getLoginUser();
// *========数据库日志=========*//
SysOperLog operLog = new SysOperLog();
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
// 请求的地址
String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
operLog.setOperIp(ip);
operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
if (loginUser != null)
{
operLog.setOperName(loginUser.getUsername());
operLog.setUserId(Long.valueOf(loginUser.getUserId()).intValue());
}
if (e != null)
{
operLog.setStatus(BusinessStatus.FAIL.ordinal());
operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
}
// 设置方法名称
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
operLog.setMethod(className + "." + methodName + "()");
// 设置请求方式
operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
// 处理设置注解上的参数
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
// 保存数据库
AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
}
catch (Exception exp)
{
// 记录本地异常日志
log.error("==前置通知异常==");
log.error("异常信息:{}", exp.getMessage());
exp.printStackTrace();
}
}
/**
* 获取注解中对方法的描述信息 用于Controller层注解
*
* @param log 日志
* @param operLog 操作日志
* @throws Exception
*/
public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception
{
// 设置action动作
operLog.setBusinessType(log.businessType().ordinal());
// 设置标题
operLog.setTitle(log.title());
// 设置操作人类别
operLog.setOperatorType(log.operatorType().ordinal());
// 是否需要保存request,参数和值
if (log.isSaveRequestData())
{
// 获取参数的信息,传入到数据库中。
setRequestValue(joinPoint, operLog);
}
// 是否需要保存response,参数和值
if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult))
{
operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));
}
}
/**
* 获取请求的参数,放到log中
*
* @param operLog 操作日志
* @throws Exception 异常
*/
private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception
{
String requestMethod = operLog.getRequestMethod();
if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))
{
String params = argsArrayToString(joinPoint.getArgs());
operLog.setOperParam(StringUtils.substring(params, 0, 2000));
}
else
{
Map<?, ?> paramsMap = (Map<?, ?>) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000));
}
}
/**
* 参数拼装
*/
private String argsArrayToString(Object[] paramsArray)
{
String params = "";
if (paramsArray != null && paramsArray.length > 0)
{
for (Object o : paramsArray)
{
if (StringUtils.isNotNull(o) && !isFilterObject(o))
{
try
{
Object jsonObj = JSON.toJSON(o);
params += jsonObj.toString() + " ";
}
catch (Exception e)
{
}
}
}
}
return params.trim();
}
/**
* 判断是否需要过滤的对象。
*
* @param o 对象信息。
* @return 如果是需要过滤的对象,则返回true;否则返回false。
*/
@SuppressWarnings("rawtypes")
public boolean isFilterObject(final Object o)
{
Class<?> clazz = o.getClass();
if (clazz.isArray())
{
return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
}
else if (Collection.class.isAssignableFrom(clazz))
{
Collection collection = (Collection) o;
for (Object value : collection)
{
return value instanceof MultipartFile;
}
}
else if (Map.class.isAssignableFrom(clazz))
{
Map map = (Map) o;
for (Object value : map.entrySet())
{
Map.Entry entry = (Map.Entry) value;
return entry.getValue() instanceof MultipartFile;
}
}
return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
|| o instanceof BindingResult;
}
}
... ...
... ... @@ -104,6 +104,11 @@ public class SysOperLog extends BaseEntity
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date operTime;
@ApiModelProperty("操作人员id")
@Excel(name = "状态")
private Integer userId;
public Long getOperId()
{
return operId;
... ... @@ -273,4 +278,12 @@ public class SysOperLog extends BaseEntity
{
this.operTime = operTime;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
}
... ...
package com.zhonglai.luhui.redis.listener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Properties;
@Component
public class RedisAllKeyListener {
private String keyspaceNotificationsConfigParameter = "KEA";
@Autowired
private RedisDeleteListener redisDeleteListener ;
@Autowired
private RedisExpiredListener redisExpiredListener ;
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisConnection connection = connectionFactory.getConnection();
Properties config = connection.info("notify-keyspace-events");
if (!StringUtils.hasText(config.getProperty("notify-keyspace-events"))) {
connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
}
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//监听所有key的删除事件
container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
//监听所有key的过期事件
container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
return container;
}
}
//package com.zhonglai.luhui.redis.listener;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.data.redis.connection.RedisConnection;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.listener.RedisMessageListenerContainer;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//
//import java.util.Properties;
//
//@Component
//public class RedisAllKeyListener {
// private String keyspaceNotificationsConfigParameter = "KEA";
//
// @Autowired
// private RedisDeleteListener redisDeleteListener ;
// @Autowired
// private RedisExpiredListener redisExpiredListener ;
// @Bean
// RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
// RedisConnection connection = connectionFactory.getConnection();
// Properties config = connection.info("notify-keyspace-events");
//
// if (!StringUtils.hasText(config.getProperty("notify-keyspace-events"))) {
// connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
// }
// RedisMessageListenerContainer container = new RedisMessageListenerContainer();
// container.setConnectionFactory(connectionFactory);
// //监听所有key的删除事件
// container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
// //监听所有key的过期事件
// container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
// return container;
// }
//}
... ...
package com.zhonglai.luhui.redis.listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;
@Component
public class RedisDeleteListener implements MessageListener {
private static final Logger logger = LoggerFactory.getLogger(RedisDeleteListener.class);
//监听的主题
private final PatternTopic topic = new PatternTopic("__keyevent@1__:del"); //#是对db2数据库,key前缀为order所有键的键空间通知
@Override
public void onMessage(Message message, byte[] pattern){
String topic = new String(pattern);
String msg = new String(message.getBody());
logger.info("收到key删除,消息主题是:"+ topic+",消息内容是:"+msg);
}
public PatternTopic getTopic() {
return topic;
}
}
//package com.zhonglai.luhui.redis.listener;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.data.redis.connection.Message;
//import org.springframework.data.redis.connection.MessageListener;
//import org.springframework.data.redis.listener.PatternTopic;
//import org.springframework.stereotype.Component;
//
//@Component
//public class RedisDeleteListener implements MessageListener {
// private static final Logger logger = LoggerFactory.getLogger(RedisDeleteListener.class);
//
// //监听的主题
// private final PatternTopic topic = new PatternTopic("__keyevent@1__:del"); //#是对db2数据库,key前缀为order所有键的键空间通知
//
// @Override
// public void onMessage(Message message, byte[] pattern){
// String topic = new String(pattern);
// String msg = new String(message.getBody());
// logger.info("收到key删除,消息主题是:"+ topic+",消息内容是:"+msg);
// }
//
// public PatternTopic getTopic() {
// return topic;
// }
//}
... ...
package com.zhonglai.luhui.redis.listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;
@Component
public class RedisExpiredListener implements MessageListener {
private static final Logger logger = LoggerFactory.getLogger(RedisExpiredListener.class);
//监听的主题
private final PatternTopic topic = new PatternTopic("__keyevent@1__:expired");
@Override
public void onMessage(Message message, byte[] pattern){
String topic = new String(pattern);
String msg = new String(message.getBody());
logger.info("收到key失效,消息主题是:"+ topic+",消息内容是:"+msg);
}
public PatternTopic getTopic() {
return topic;
}
}
\ No newline at end of file
//package com.zhonglai.luhui.redis.listener;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.data.redis.connection.Message;
//import org.springframework.data.redis.connection.MessageListener;
//import org.springframework.data.redis.listener.PatternTopic;
//import org.springframework.stereotype.Component;
//
//@Component
//public class RedisExpiredListener implements MessageListener {
// private static final Logger logger = LoggerFactory.getLogger(RedisExpiredListener.class);
// //监听的主题
// private final PatternTopic topic = new PatternTopic("__keyevent@1__:expired");
//
// @Override
// public void onMessage(Message message, byte[] pattern){
// String topic = new String(pattern);
// String msg = new String(message.getBody());
// logger.info("收到key失效,消息主题是:"+ topic+",消息内容是:"+msg);
// }
// public PatternTopic getTopic() {
// return topic;
// }
//}
\ No newline at end of file
... ...
package com.zhonglai.luhui.redis.listener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
/**
* 不指定redis数据库(全局监听)
*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Autowired
private DataPersistenceService dtaPersistenceService;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();
String devicePath = dtaPersistenceService.getRedicDeviceKeyPath();
String terminalPath = dtaPersistenceService.getRedicTerminalKeyPath();
if(expiredKey.startsWith(devicePath)) //如果是主机
{
String imei = expiredKey.replace(devicePath,"").replace(":","");
dtaPersistenceService.offLine(imei);
}
if(expiredKey.startsWith(terminalPath)) //如果是终端
{
String imei = expiredKey.replace(devicePath,"").replace(":","");
dtaPersistenceService.offLine(imei);
}
}
}
//package com.zhonglai.luhui.redis.listener;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.connection.Message;
//import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
//import org.springframework.data.redis.listener.RedisMessageListenerContainer;
//import org.springframework.stereotype.Component;
//
///**
// * 不指定redis数据库(全局监听)
// */
//@Component
//public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
// @Autowired
// private DataPersistenceService dtaPersistenceService;
//
// public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
// super(listenerContainer);
// }
//
// @Override
// public void onMessage(Message message, byte[] pattern) {
// String expiredKey = message.toString();
//
// String devicePath = dtaPersistenceService.getRedicDeviceKeyPath();
// String terminalPath = dtaPersistenceService.getRedicTerminalKeyPath();
// if(expiredKey.startsWith(devicePath)) //如果是主机
// {
// String imei = expiredKey.replace(devicePath,"").replace(":","");
// dtaPersistenceService.offLine(imei);
// }
//
// if(expiredKey.startsWith(terminalPath)) //如果是终端
// {
// String imei = expiredKey.replace(devicePath,"").replace(":","");
// dtaPersistenceService.offLine(imei);
// }
// }
//}
... ...
... ... @@ -7,9 +7,9 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.AddressUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.security.dto.*;
import com.zhonglai.luhui.redis.service.RedisCache;
import com.zhonglai.luhui.security.dto.SysLoginUser;
import eu.bitwalker.useragentutils.UserAgent;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
... ... @@ -60,6 +60,9 @@ public class TokenService
@Autowired
private RedisCache redisCache;
@Autowired
private PublicService publicService;
/**
* 获取用户身份信息
*
... ... @@ -81,7 +84,7 @@ public class TokenService
Collection<String> keys = redisCache.keys(userKey);
if(null != keys && keys.size() != 0)
{
SysLoginUser user = redisCache.getCacheObject(keys.stream().findFirst().get());
BaseLoginUser user = redisCache.getCacheObject(keys.stream().findFirst().get());
return user;
}
}
... ... @@ -93,6 +96,62 @@ public class TokenService
return null;
}
public BaseLoginUser getApiLoginUser(HttpServletRequest request )
{
// 获取请求携带的令牌
String token = getToken(request);
if (StringUtils.isNotEmpty(token))
{
try
{
if(token.split(".").length==3)
{
Claims claims = parseToken(token);
// 解析对应的权限以及用户信息
String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
String userKey = getTokenKey(uuid);
Collection<String> keys = redisCache.keys(userKey);
if(null != keys && keys.size() != 0)
{
BaseLoginUser user = redisCache.getCacheObject(keys.stream().findFirst().get());
return user;
}
}else {
// 解析对应的权限以及用户信息
String userKey = getTokenKey(token);
if(redisCache.hasKey(userKey))
{
Collection<String> keys = redisCache.keys(userKey);
if(null != keys && keys.size() != 0)
{
BaseLoginUser user = redisCache.getCacheObject(keys.stream().findFirst().get());
return user;
}
}else{
LoginToken loginToken = new LoginToken(token);
Yu2leUserLogin yu2leUserLogin = publicService.getObjectForTableName(Yu2leUserLogin.class,"userId",loginToken.getUserId()+"","`liu_yu_le`.`user_login`");
Yu2leUserInfo yu2leUserInfo = publicService.getObjectForTableName(Yu2leUserInfo.class,"loginName",loginToken.getUserId()+"","`liu_yu_le`.`user_info`");
BaseLoginUser baseLoginUser = new ApiLoginUser(yu2leUserInfo, yu2leUserLogin);
baseLoginUser.setToken(token);
setUserAgent(baseLoginUser);
refreshToken(baseLoginUser);
return baseLoginUser;
}
}
}
catch (Exception e)
{
logger.error("令牌获取登录信息失败",e);
}
}
return null;
}
/**
* 设置用户身份信息
*/
... ... @@ -134,6 +193,17 @@ public class TokenService
return createToken(claims);
}
public String creatApiToken(BaseLoginUser loginUser)
{
LoginToken loginToken = new LoginToken(Long.valueOf(loginUser.getUserId()).intValue(),null,null,null);
String token = loginToken.get();
loginUser.setToken(token);
setUserAgent(loginUser);
refreshToken(loginUser);
return token;
}
public void upUser(BaseLoginUser loginUser, SysLogininforType sysLogininforType)
{
String userKey = getTokenKey(loginUser.getToken());
... ...
... ... @@ -56,4 +56,13 @@ public enum BusinessType
* 清空数据
*/
CLEAN,
/**
* 写操作指令
*/
WRITE,
/**
* 缓存
*/
CAHE,
}
... ...
... ... @@ -33,7 +33,7 @@ public abstract class ThingsModelItemBase<T> implements ThingsModelBase<T>
break;
case BOOL:
thingsModelItemBase = GsonConstructor.get().fromJson(specs,BoolModelOutput.class);
thingsModelItemBase.setValue(jsonElement.getAsBoolean());
thingsModelItemBase.setValue(Boolean.parseBoolean(jsonElement.getAsString()) || jsonElement.getAsString().equals("1"));
break;
case ENUM:
thingsModelItemBase = GsonConstructor.get().fromJson(specs,EnumModelOutput.class);
... ... @@ -69,7 +69,7 @@ public abstract class ThingsModelItemBase<T> implements ThingsModelBase<T>
}
ThingsModelItemBase thingsModelItemBase = new StringModelOutput();
ThingsModelDataTypeEnum thingsModelDataTypeEnum = Enum.valueOf(ThingsModelDataTypeEnum.class,type);
ThingsModelDataTypeEnum thingsModelDataTypeEnum = Enum.valueOf(ThingsModelDataTypeEnum.class,type.toUpperCase());
switch (thingsModelDataTypeEnum)
{
case STRING:
... ...
package com.zhonglai.luhui.device.analysis.comm.util;
import java.util.Arrays;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
public class ByteUtil {
/**
... ... @@ -106,7 +108,10 @@ public class ByteUtil {
}
public static void main(String[] args) {
System.out.println(ByteUtil.toHexString( ByteUtil.intToBytesASC(2011239256,4)));
byte[] bytes = new byte[]{(byte) 0xA5,0x0F,(byte) 0x80,0x21,0x70,0x04 ,(byte) 0xB9 ,0x00 ,0x4D ,0x0F ,(byte) 0x82 ,0x01 , (byte) 0xD2,0x00};
long crc = calculateChecksum(bytes);
System.out.println(crc);
System.out.println(verifyChecksum(bytes, (byte) 0x33));
}
/**
... ... @@ -196,4 +201,30 @@ public class ByteUtil {
return str.length() == 1 ? "0" + str : str.substring(str.length() - 2, str.length());
}
}
/**
* 计算 byte 数组的和
*
* @param byteArray 输入的 byte 数组
* @return 数组中所有字节的和
*/
public static byte calculateChecksum(byte[] byteArray) {
int sum = 0;
for (byte hex : byteArray) {
sum += hex;
}
return (byte) (sum & 0xFF);
}
/**
* 验证 byte 数组的和是否等于预期的校验和
*
* @param byteArray 输入的 byte 数组
* @param expectedChecksum 预期的校验和
* @return 如果计算出的和等于预期的校验和,则返回 true;否则返回 false
*/
public static boolean verifyChecksum(byte[] byteArray, byte expectedChecksum) {
long calculatedChecksum = calculateChecksum(byteArray);
return calculatedChecksum == expectedChecksum;
}
}
... ...
... ... @@ -51,64 +51,74 @@ public class TopicUtil {
*/
public static String generateRedicKey(Topic topic)
{
return generate(topic,":");
return generate(topic,SysParameter.topicconfig);
}
/**
* 生成发送消息的topic
* @return
*/
public static String generateSendMessageTopic(Topic topic,String topicconfig)
{
return generate(topic,topicconfig);
}
public static String generateSendMessageTopic(Topic topic)
{
return "/"+generate(topic,"/");
return generate(topic,SysParameter.topicconfig);
}
/**
* 生成客户端关键字
* @return
*/
public static String generateClienKey(Topic topic,String topicconfig)
{
return generate(topic,topicconfig);
}
public static String generateClienKey(Topic topic)
{
return "/"+generate(topic,"/");
return generate(topic,SysParameter.topicconfig);
}
private static String generate(Topic topic,String division)
private static String generate(Topic topic,String topicconfig)
{
String str = SysParameter.topicconfig;
String str = topicconfig;
if(StringUtils.isEmpty(topic.getRoleid()))
{
topic.setRoleid("2");
}
str = str.replace("/{{roleid}}",topic.getRoleid()+division);
str = str.replace("{{roleid}}",topic.getRoleid());
if(StringUtils.isEmpty(topic.getUsername()))
{
topic.setUsername("+");
}
str = str.replace("/{{username}}",topic.getUsername()+division);
str = str.replace("{{username}}",topic.getUsername());
if(StringUtils.isEmpty(topic.getClientid()))
{
topic.setClientid( "+");
}
str = str.replace("/{{clientid}}",topic.getClientid()+division);
str = str.replace("{{clientid}}",topic.getClientid());
if(StringUtils.isEmpty(topic.getPayloadtype()))
{
topic.setPayloadtype( "String");
}
str = str.replace("/{{payloadtype}}",topic.getPayloadtype()+division);
str = str.replace("{{payloadtype}}",topic.getPayloadtype());
if(StringUtils.isEmpty(topic.getTopicType()))
{
topic.setTopicType("PUT");
}
str = str.replace("/{{topicType}}",topic.getTopicType()+division);
str = str.replace("{{topicType}}",topic.getTopicType());
if(StringUtils.isNotEmpty(topic.getMessageid()))
{
str = str.replace("/{{messageid}}",topic.getMessageid());
str = str.replace("{{messageid}}",topic.getMessageid());
}
return str;
... ...
package com.zhonglai.luhui.device.dto;
public enum CommandType {
read,
write,
notice,
cleanDeviceHost,
cleanDeviceInfo,
upIotThingsModel,
upIotThingsModelTranslate
}
... ...
package com.zhonglai.luhui.device.dto;
import com.google.gson.JsonObject;
import lombok.Data;
@Data
public class DeviceCommand {
private String deviceId;
private JsonObject data;
private CommandType commandType;
}
... ...
... ... @@ -93,10 +93,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="used != null">used = #{used},</if>
<if test="mqtt_username != null and mqtt_username != ''">mqtt_username = #{mqtt_username},</if>
<if test="product_name != null and product_name != ''">product_name = #{product_name},</if>
<if test="role_id != null">is_sync_db = #{is_sync_db},</if>
<if test="role_id != null">role_id = #{sync_db},</if>
<if test="role_id != null">analysis_clas = #{analysis_clas},</if>
<if test="role_id != null">purification_clas = #{purification_clas},</if>
<if test="is_sync_db != null">is_sync_db = #{is_sync_db},</if>
<if test="sync_db != null">sync_db = #{sync_db},</if>
<if test="analysis_clas != null">analysis_clas = #{analysis_clas},</if>
<if test="purification_clas != null">purification_clas = #{purification_clas},</if>
</trim>
where id = #{id}
</update>
... ...
... ... @@ -55,4 +55,5 @@ public class RocketMqService {
return new Message(MessageCode.DEFAULT_FAIL_CODE);
}
}
... ...
... ... @@ -21,16 +21,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="status" column="status" />
<result property="errorMsg" column="error_msg" />
<result property="operTime" column="oper_time" />
<result property="userId" column="user_id" />
</resultMap>
<sql id="selectOperLogVo">
select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time
select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time,user_id
from sys_oper_log
</sql>
<insert id="insertOperlog" parameterType="SysOperLog">
insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time)
values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, sysdate())
insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time,user_id)
values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, sysdate(),#{userId})
</insert>
<select id="selectOperLogList" parameterType="SysOperLog" resultMap="SysOperLogResult">
... ... @@ -51,6 +52,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null">
AND status = #{status}
</if>
<if test="userId != null">
AND user_id = #{userId}
</if>
<if test="operName != null and operName != ''">
AND oper_name like concat('%', #{operName}, '%')
</if>
... ...