update 优化 将logininfor规范化为loginInfo

update 优化 规范DTO命名
add 新增注解类工具
update 优化 使用动态规划优化菜单树的构建
update 更新 统一枚举相关包名为enums
This commit is contained in:
疯狂的狮子Li
2026-03-19 12:03:58 +08:00
parent 6a8ca4a74d
commit e8fc7fb0df
55 changed files with 439 additions and 402 deletions

View File

@@ -1,6 +1,6 @@
package org.dromara.system.api;
import org.dromara.system.api.domain.bo.RemoteLogininforBo;
import org.dromara.system.api.domain.bo.RemoteLoginInfoBo;
import org.dromara.system.api.domain.bo.RemoteOperLogBo;
/**
@@ -20,8 +20,8 @@ public interface RemoteLogService {
/**
* 保存访问记录
*
* @param sysLogininfor 访问实体
* @param sysLoginInfo 访问实体
*/
void saveLogininfor(RemoteLogininforBo sysLogininfor);
void saveLoginInfo(RemoteLoginInfoBo sysLoginInfo);
}

View File

@@ -10,13 +10,13 @@ import java.util.HashMap;
import java.util.Map;
/**
* 系统访问记录表 sys_logininfor
* 系统访问记录表 sys_login_info
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public class RemoteLogininforBo implements Serializable {
public class RemoteLoginInfoBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

View File

@@ -15,7 +15,7 @@ import org.dromara.common.core.utils.MessageUtils;
import org.dromara.common.core.utils.ServletUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.ip.AddressUtils;
import org.dromara.common.log.event.LogininforEvent;
import org.dromara.common.log.event.LoginInfoEvent;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.resource.api.RemoteMessageService;
@@ -65,11 +65,11 @@ public class UserActionListener implements SaTokenListener {
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline, Duration.ofSeconds(loginParameter.getTimeout()));
}
// 记录登录日志
LogininforEvent logininforEvent = new LogininforEvent();
logininforEvent.setUsername(username);
logininforEvent.setStatus(Constants.LOGIN_SUCCESS);
logininforEvent.setMessage(MessageUtils.message("user.login.success"));
SpringUtils.context().publishEvent(logininforEvent);
LoginInfoEvent loginInfoEvent = new LoginInfoEvent();
loginInfoEvent.setUsername(username);
loginInfoEvent.setStatus(Constants.LOGIN_SUCCESS);
loginInfoEvent.setMessage(MessageUtils.message("user.login.success"));
SpringUtils.context().publishEvent(loginInfoEvent);
// 更新登录信息
remoteUserService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip);
log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue);

View File

@@ -24,7 +24,7 @@ import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.MessageUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.log.event.LogininforEvent;
import org.dromara.common.log.event.LoginInfoEvent;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.RemoteSocialService;
@@ -107,7 +107,7 @@ public class SysLoginService {
if (ObjectUtil.isNull(loginUser)) {
return;
}
recordLogininfor(loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"));
recordLoginInfo(loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success"));
} catch (NotLoginException ignored) {
} finally {
try {
@@ -143,7 +143,7 @@ public class SysLoginService {
if (!regFlag) {
throw new UserException("user.register.error");
}
recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"));
recordLoginInfo(username, Constants.REGISTER, MessageUtils.message("user.register.success"));
}
/**
@@ -158,11 +158,11 @@ public class SysLoginService {
String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey);
if (captcha == null) {
recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
recordLoginInfo(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
if (!StringUtils.equalsIgnoreCase(code, captcha)) {
recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
recordLoginInfo(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
throw new CaptchaException();
}
}
@@ -175,13 +175,13 @@ public class SysLoginService {
* @param message 消息内容
* @return
*/
public void recordLogininfor(String username, String status, String message) {
public void recordLoginInfo(String username, String status, String message) {
// 封装对象
LogininforEvent logininforEvent = new LogininforEvent();
logininforEvent.setUsername(username);
logininforEvent.setStatus(status);
logininforEvent.setMessage(message);
SpringUtils.context().publishEvent(logininforEvent);
LoginInfoEvent loginInfoEvent = new LoginInfoEvent();
loginInfoEvent.setUsername(username);
loginInfoEvent.setStatus(status);
loginInfoEvent.setMessage(message);
SpringUtils.context().publishEvent(loginInfoEvent);
}
/**
@@ -197,7 +197,7 @@ public class SysLoginService {
int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
// 锁定时间内登录 则踢出
if (errorNumber >= maxRetryCount) {
recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
recordLoginInfo(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
}
@@ -207,11 +207,11 @@ public class SysLoginService {
RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
// 达到规定错误次数 则锁定登录
if (errorNumber >= maxRetryCount) {
recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
recordLoginInfo(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
} else {
// 未达到规定错误次数
recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
recordLoginInfo(username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
throw new UserException(loginType.getRetryLimitCount(), errorNumber);
}
}

View File

@@ -72,7 +72,7 @@ public class EmailAuthStrategy implements IAuthStrategy {
private boolean validateEmailCode(String email, String emailCode) {
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
if (StringUtils.isBlank(code)) {
loginService.recordLogininfor(email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
loginService.recordLoginInfo(email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
return code.equals(emailCode);

View File

@@ -90,11 +90,11 @@ public class PasswordAuthStrategy implements IAuthStrategy {
String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey);
if (captcha == null) {
loginService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
loginService.recordLoginInfo(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
if (!StringUtils.equalsIgnoreCase(code, captcha)) {
loginService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
loginService.recordLoginInfo(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
throw new CaptchaException();
}
}

View File

@@ -72,7 +72,7 @@ public class SmsAuthStrategy implements IAuthStrategy {
private boolean validateSmsCode(String phonenumber, String smsCode) {
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber);
if (StringUtils.isBlank(code)) {
loginService.recordLogininfor(phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
loginService.recordLoginInfo(phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
return code.equals(smsCode);

View File

@@ -10,8 +10,9 @@ import lombok.NoArgsConstructor;
import org.dromara.common.core.utils.reflect.ReflectUtils;
import java.util.List;
import java.util.Objects;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -29,6 +30,23 @@ public class TreeBuildUtils extends TreeUtil {
*/
public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label");
/**
* 使用动态规划构建树形结构
*
* @param items 节点列表项
* @param parentId 父节点ID
* @param classifier 动态规划表分类函数
* @param action 回溯动作
* @param <K> 节点ID的类型
* @param <T> 输入节点的类型
* @return 构建好的树形结构列表
*/
public static <K, T> List<T> build(List<T> items, K parentId, Function<T, K> classifier, BiConsumer<T, Map<K, List<T>>> action) {
Map<K, List<T>> nodeTreeMaps = items.stream().collect(Collectors.groupingBy(classifier));
items.forEach(item -> action.accept(item, nodeTreeMaps));
return nodeTreeMaps.get(parentId);
}
/**
* 构建树形结构
*
@@ -79,17 +97,8 @@ public class TreeBuildUtils extends TreeUtil {
return CollUtil.newArrayList();
}
// 提取所有节点 ID用于后续判断哪些节点为根节点即 parentId 不在其中)
Set<K> allIds = StreamUtils.toSet(list, getId);
// 筛选出所有 parentId 不在 allIds 中的节点,这些节点的 parentId 可认为是根节点
Set<K> rootParentIds = list.stream()
.map(getParentId)
.filter(Objects::nonNull)
.filter(pid -> !allIds.contains(pid))
.collect(Collectors.toSet());
// 使用流处理,遍历每个顶级 parentId构建对应树并合并为一个列表返回
Set<K> rootParentIds = StreamUtils.toSet(list, getParentId);
rootParentIds.removeAll(StreamUtils.toSet(list, getId));
return rootParentIds.stream()
.flatMap(rootParentId -> TreeUtil.build(list, rootParentId, parser).stream())
.collect(Collectors.toList());

View File

@@ -0,0 +1,59 @@
package org.dromara.common.core.utils.reflect;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.lang.Dict;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.util.Map;
/**
* 注解工具类
*
* @author 秋辞未寒
*/
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class AnnotationUtils extends AnnotationUtil {
/**
* 获取指定注解
*
* @param annotationEle {@link AnnotatedElement}可以是Class、Method、Field、Constructor、ReflectPermission
* @param annotationTypeName 注解类型名称
* @return 注解对象
*/
@SuppressWarnings("unchecked")
public static Annotation getAnnotation(AnnotatedElement annotationEle, String annotationTypeName) {
try {
return AnnotationUtil.getAnnotation(annotationEle, (Class<? extends Annotation>) Class.forName(annotationTypeName));
} catch (final ClassNotFoundException | ClassCastException e) {
log.error("AnnotationUtils.getAnnotation(AnnotatedElement, String) error.", e);
return null;
}
}
/**
* 获取指定注解中所有属性值
*
* @param annotationEle {@link AnnotatedElement}可以是Class、Method、Field、Constructor、ReflectPermission
* @param annotationTypeName 注解类型名称
* @return 注解对象所有属性键值
* @throws UtilException 调用注解中的方法时执行异常
*/
@SuppressWarnings("unchecked")
public static Dict getAnnotationValueMap(AnnotatedElement annotationEle, String annotationTypeName) throws UtilException {
try {
Map<String, Object> annotationValueMap = AnnotationUtil.getAnnotationValueMap(annotationEle, (Class<? extends Annotation>) Class.forName(annotationTypeName));
return new Dict(annotationValueMap);
} catch (final ClassNotFoundException | ClassCastException e) {
log.error("AnnotationUtils.getAnnotationValueMap(AnnotatedElement, String) error.", e);
return null;
}
}
}

View File

@@ -1,4 +1,4 @@
package org.dromara.common.core.validate.enumd;
package org.dromara.common.core.validate.enums;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

View File

@@ -1,4 +1,4 @@
package org.dromara.common.core.validate.enumd;
package org.dromara.common.core.validate.enums;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

View File

@@ -1,7 +1,7 @@
package org.dromara.common.encrypt.annotation;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import java.lang.annotation.*;

View File

@@ -1,7 +1,7 @@
package org.dromara.common.encrypt.core;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import lombok.Data;
/**

View File

@@ -1,7 +1,7 @@
package org.dromara.common.encrypt.core;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
/**
* 加解者

View File

@@ -1,8 +1,8 @@
package org.dromara.common.encrypt.core.encryptor;
import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import org.dromara.common.encrypt.utils.EncryptUtils;
/**

View File

@@ -1,8 +1,8 @@
package org.dromara.common.encrypt.core.encryptor;
import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import org.dromara.common.encrypt.utils.EncryptUtils;
/**

View File

@@ -2,8 +2,8 @@ package org.dromara.common.encrypt.core.encryptor;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import org.dromara.common.encrypt.utils.EncryptUtils;

View File

@@ -2,8 +2,8 @@ package org.dromara.common.encrypt.core.encryptor;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import org.dromara.common.encrypt.utils.EncryptUtils;
/**

View File

@@ -1,8 +1,8 @@
package org.dromara.common.encrypt.core.encryptor;
import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import org.dromara.common.encrypt.utils.EncryptUtils;
/**

View File

@@ -1,4 +1,4 @@
package org.dromara.common.encrypt.enumd;
package org.dromara.common.encrypt.enums;
import org.dromara.common.encrypt.core.encryptor.*;
import lombok.AllArgsConstructor;

View File

@@ -1,4 +1,4 @@
package org.dromara.common.encrypt.enumd;
package org.dromara.common.encrypt.enums;
/**
* 编码类型

View File

@@ -12,8 +12,8 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.encrypt.annotation.EncryptField;
import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.core.EncryptorManager;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import org.dromara.common.encrypt.properties.EncryptorProperties;
import java.lang.reflect.Field;

View File

@@ -11,8 +11,8 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.encrypt.annotation.EncryptField;
import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.core.EncryptorManager;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import org.dromara.common.encrypt.properties.EncryptorProperties;
import java.lang.reflect.Field;

View File

@@ -1,7 +1,7 @@
package org.dromara.common.encrypt.properties;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import org.dromara.common.encrypt.enums.EncodeType;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

View File

@@ -14,7 +14,7 @@ import org.dromara.common.core.utils.ip.AddressUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.RemoteClientService;
import org.dromara.system.api.RemoteLogService;
import org.dromara.system.api.domain.bo.RemoteLogininforBo;
import org.dromara.system.api.domain.bo.RemoteLoginInfoBo;
import org.dromara.system.api.domain.bo.RemoteOperLogBo;
import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.springframework.context.event.EventListener;
@@ -47,7 +47,7 @@ public class LogEventListener {
* 保存系统访问记录
*/
@EventListener
public void saveLogininfor(LogininforEvent logininforEvent) {
public void saveLoginInfo(LoginInfoEvent loginInfoEvent) {
HttpServletRequest request = ServletUtils.getRequest();
final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
final String ip = ServletUtils.getClientIP(request);
@@ -62,34 +62,34 @@ public class LogEventListener {
StringBuilder s = new StringBuilder();
s.append(getBlock(ip));
s.append(address);
s.append(getBlock(logininforEvent.getUsername()));
s.append(getBlock(logininforEvent.getStatus()));
s.append(getBlock(logininforEvent.getMessage()));
s.append(getBlock(loginInfoEvent.getUsername()));
s.append(getBlock(loginInfoEvent.getStatus()));
s.append(getBlock(loginInfoEvent.getMessage()));
// 打印信息到日志
log.info(s.toString(), logininforEvent.getArgs());
log.info(s.toString(), loginInfoEvent.getArgs());
// 获取客户端操作系统
String os = userAgent.getOs().getName();
// 获取客户端浏览器
String browser = userAgent.getBrowser().getName();
// 封装对象
RemoteLogininforBo logininfor = new RemoteLogininforBo();
logininfor.setUserName(logininforEvent.getUsername());
RemoteLoginInfoBo loginInfo = new RemoteLoginInfoBo();
loginInfo.setUserName(loginInfoEvent.getUsername());
if (ObjectUtil.isNotNull(clientVo)) {
logininfor.setClientKey(clientVo.getClientKey());
logininfor.setDeviceType(clientVo.getDeviceType());
loginInfo.setClientKey(clientVo.getClientKey());
loginInfo.setDeviceType(clientVo.getDeviceType());
}
logininfor.setIpaddr(ip);
logininfor.setLoginLocation(address);
logininfor.setBrowser(browser);
logininfor.setOs(os);
logininfor.setMsg(logininforEvent.getMessage());
loginInfo.setIpaddr(ip);
loginInfo.setLoginLocation(address);
loginInfo.setBrowser(browser);
loginInfo.setOs(os);
loginInfo.setMsg(loginInfoEvent.getMessage());
// 日志状态
if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
logininfor.setStatus(Constants.SUCCESS);
} else if (Constants.LOGIN_FAIL.equals(logininforEvent.getStatus())) {
logininfor.setStatus(Constants.FAIL);
if (StringUtils.equalsAny(loginInfoEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
loginInfo.setStatus(Constants.SUCCESS);
} else if (Constants.LOGIN_FAIL.equals(loginInfoEvent.getStatus())) {
loginInfo.setStatus(Constants.FAIL);
}
remoteLogService.saveLogininfor(logininfor);
remoteLogService.saveLoginInfo(loginInfo);
}
private String getBlock(Object msg) {

View File

@@ -12,7 +12,7 @@ import java.io.Serializable;
*/
@Data
public class LogininforEvent implements Serializable {
public class LoginInfoEvent implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

View File

@@ -57,7 +57,7 @@ public class SseController implements DisposableBean {
// */
// @GetMapping(value = "${sse.path}/send")
// public R<Void> send(Long userId, String msg) {
// SseMessageDto dto = new SseMessageDto();
// SseMessageDTO dto = new SseMessageDTO();
// dto.setUserIds(List.of(userId));
// dto.setMessage(msg);
// sseEmitterManager.publishMessage(dto);

View File

@@ -4,7 +4,7 @@ import cn.hutool.core.map.MapUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.dto.SseMessageDTO;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
@@ -136,8 +136,8 @@ public class SseEmitterManager {
*
* @param consumer 处理SSE消息的消费者函数
*/
public void subscribeMessage(Consumer<SseMessageDto> consumer) {
RedisUtils.subscribe(SSE_TOPIC, SseMessageDto.class, consumer);
public void subscribeMessage(Consumer<SseMessageDTO> consumer) {
RedisUtils.subscribe(SSE_TOPIC, SseMessageDTO.class, consumer);
}
/**
@@ -180,15 +180,15 @@ public class SseEmitterManager {
/**
* 发布SSE订阅消息
*
* @param sseMessageDto 要发布的SSE消息对象
* @param sseMessageDTO 要发布的SSE消息对象
*/
public void publishMessage(SseMessageDto sseMessageDto) {
SseMessageDto broadcastMessage = new SseMessageDto();
broadcastMessage.setMessage(sseMessageDto.getMessage());
broadcastMessage.setUserIds(sseMessageDto.getUserIds());
public void publishMessage(SseMessageDTO sseMessageDTO) {
SseMessageDTO broadcastMessage = new SseMessageDTO();
broadcastMessage.setMessage(sseMessageDTO.getMessage());
broadcastMessage.setUserIds(sseMessageDTO.getUserIds());
RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> {
log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}",
SSE_TOPIC, sseMessageDto.getUserIds(), sseMessageDto.getMessage());
SSE_TOPIC, sseMessageDTO.getUserIds(), sseMessageDTO.getMessage());
});
}
@@ -198,7 +198,7 @@ public class SseEmitterManager {
* @param message 要发布的消息内容
*/
public void publishAll(String message) {
SseMessageDto broadcastMessage = new SseMessageDto();
SseMessageDTO broadcastMessage = new SseMessageDTO();
broadcastMessage.setMessage(message);
RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> {
log.info("SSE发送主题订阅消息topic:{} message:{}", SSE_TOPIC, message);

View File

@@ -7,12 +7,12 @@ import java.io.Serializable;
import java.util.List;
/**
* 消息的dto
* 消息的DTO
*
* @author zendwang
*/
@Data
public class SseMessageDto implements Serializable {
public class SseMessageDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

View File

@@ -5,7 +5,7 @@ import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.sse.core.SseEmitterManager;
import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.dto.SseMessageDTO;
/**
* SSE工具类
@@ -53,13 +53,13 @@ public class SseMessageUtils {
/**
* 发布SSE订阅消息
*
* @param sseMessageDto 要发布的SSE消息对象
* @param sseMessageDTO 要发布的SSE消息对象
*/
public static void publishMessage(SseMessageDto sseMessageDto) {
public static void publishMessage(SseMessageDTO sseMessageDTO) {
if (!isEnable()) {
return;
}
MANAGER.publishMessage(sseMessageDto);
MANAGER.publishMessage(sseMessageDTO);
}
/**

View File

@@ -7,12 +7,12 @@ import java.io.Serializable;
import java.util.List;
/**
* 消息的dto
* 消息的DTO
*
* @author zendwang
*/
@Data
public class WebSocketMessageDto implements Serializable {
public class WebSocketMessageDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

View File

@@ -2,7 +2,7 @@ package org.dromara.common.websocket.handler;
import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.websocket.dto.WebSocketMessageDto;
import org.dromara.common.websocket.dto.WebSocketMessageDTO;
import org.dromara.common.websocket.holder.WebSocketSessionHolder;
import org.dromara.common.websocket.utils.WebSocketUtils;
import org.dromara.system.api.model.LoginUser;
@@ -51,10 +51,10 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
// 创建WebSocket消息DTO对象
WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto();
webSocketMessageDto.setSessionKeys(List.of(loginUser.getUserId()));
webSocketMessageDto.setMessage(message.getPayload());
WebSocketUtils.publishMessage(webSocketMessageDto);
WebSocketMessageDTO messageDTO = new WebSocketMessageDTO();
messageDTO.setSessionKeys(List.of(loginUser.getUserId()));
messageDTO.setMessage(message.getPayload());
WebSocketUtils.publishMessage(messageDTO);
}
/**

View File

@@ -5,7 +5,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.websocket.dto.WebSocketMessageDto;
import org.dromara.common.websocket.dto.WebSocketMessageDTO;
import org.dromara.common.websocket.holder.WebSocketSessionHolder;
import org.springframework.web.socket.PongMessage;
import org.springframework.web.socket.TextMessage;
@@ -44,8 +44,8 @@ public class WebSocketUtils {
*
* @param consumer 处理WebSocket消息的消费者函数
*/
public static void subscribeMessage(Consumer<WebSocketMessageDto> consumer) {
RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDto.class, consumer);
public static void subscribeMessage(Consumer<WebSocketMessageDTO> consumer) {
RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDTO.class, consumer);
}
/**
@@ -53,7 +53,7 @@ public class WebSocketUtils {
*
* @param webSocketMessage 要发布的WebSocket消息对象
*/
public static void publishMessage(WebSocketMessageDto webSocketMessage) {
public static void publishMessage(WebSocketMessageDTO webSocketMessage) {
List<Long> unsentSessionKeys = new ArrayList<>();
// 当前服务内session,直接发送消息
for (Long sessionKey : webSocketMessage.getSessionKeys()) {
@@ -65,7 +65,7 @@ public class WebSocketUtils {
}
// 不在当前服务内session,发布订阅消息
if (CollUtil.isNotEmpty(unsentSessionKeys)) {
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO();
broadcastMessage.setMessage(webSocketMessage.getMessage());
broadcastMessage.setSessionKeys(unsentSessionKeys);
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
@@ -81,7 +81,7 @@ public class WebSocketUtils {
* @param message 要发布的消息内容
*/
public static void publishAll(String message) {
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
WebSocketMessageDTO broadcastMessage = new WebSocketMessageDTO();
broadcastMessage.setMessage(message);
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message);

View File

@@ -2,7 +2,7 @@ package org.dromara.demo.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import org.dromara.common.encrypt.annotation.EncryptField;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enums.AlgorithmType;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@@ -5,7 +5,7 @@ import lombok.Data;
import java.math.BigDecimal;
@Data
public class BillDto {
public class BillDTO {
/**
* 账单ID

View File

@@ -7,7 +7,7 @@ import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.job.entity.BillDto;
import org.dromara.job.entity.BillDTO;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@@ -23,20 +23,20 @@ import java.math.BigDecimal;
public class AlipayBillTask {
public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException {
BillDto billDto = new BillDto();
billDto.setBillId(23456789L);
billDto.setBillChannel("alipay");
BillDTO billDTO = new BillDTO();
billDTO.setBillId(23456789L);
billDTO.setBillChannel("alipay");
// 设置清算日期
String settlementDate = (String) jobArgs.getWfContext().get("settlementDate");
if (StrUtil.equals(settlementDate, "sysdate")) {
settlementDate = DateUtil.today();
}
billDto.setBillDate(settlementDate);
billDto.setBillAmount(new BigDecimal("2345.67"));
// 把billDto对象放入上下文进行传递
jobArgs.appendContext("alipay", JsonUtils.toJsonString(billDto));
billDTO.setBillDate(settlementDate);
billDTO.setBillAmount(new BigDecimal("2345.67"));
// 把billDTO对象放入上下文进行传递
jobArgs.appendContext("alipay", JsonUtils.toJsonString(billDTO));
SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext());
return ExecuteResult.success(billDto);
return ExecuteResult.success(billDTO);
}
}

View File

@@ -6,7 +6,7 @@ import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.job.entity.BillDto;
import org.dromara.job.entity.BillDTO;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@@ -26,15 +26,15 @@ public class SummaryBillTask {
BigDecimal wechatAmount = BigDecimal.valueOf(0);
String wechat = (String) jobArgs.getWfContext("wechat");
if (StrUtil.isNotBlank(wechat)) {
BillDto wechatBillDto = JsonUtils.parseObject(wechat, BillDto.class);
wechatAmount = wechatBillDto.getBillAmount();
BillDTO wechatBillDTO = JsonUtils.parseObject(wechat, BillDTO.class);
wechatAmount = wechatBillDTO.getBillAmount();
}
// 获得支付宝账单
BigDecimal alipayAmount = BigDecimal.valueOf(0);
String alipay = (String) jobArgs.getWfContext("alipay");
if (StrUtil.isNotBlank(alipay)) {
BillDto alipayBillDto = JsonUtils.parseObject(alipay, BillDto.class);
alipayAmount = alipayBillDto.getBillAmount();
BillDTO alipayBillDTO = JsonUtils.parseObject(alipay, BillDTO.class);
alipayAmount = alipayBillDTO.getBillAmount();
}
// 汇总账单
BigDecimal totalAmount = wechatAmount.add(alipayAmount);

View File

@@ -7,7 +7,7 @@ import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.job.entity.BillDto;
import org.dromara.job.entity.BillDTO;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@@ -23,21 +23,21 @@ import java.math.BigDecimal;
public class WechatBillTask {
public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException {
BillDto billDto = new BillDto();
billDto.setBillId(123456789L);
billDto.setBillChannel("wechat");
BillDTO billDTO = new BillDTO();
billDTO.setBillId(123456789L);
billDTO.setBillChannel("wechat");
// 从上下文中获得清算日期并设置,如果上下文中清算日期
// 是sysdate设置为当前日期否则取管理页面设置的值
String settlementDate = (String) jobArgs.getWfContext().get("settlementDate");
if (StrUtil.equals(settlementDate, "sysdate")) {
settlementDate = DateUtil.today();
}
billDto.setBillDate(settlementDate);
billDto.setBillAmount(new BigDecimal("1234.56"));
// 把billDto对象放入上下文进行传递
jobArgs.appendContext("wechat", JsonUtils.toJsonString(billDto));
billDTO.setBillDate(settlementDate);
billDTO.setBillAmount(new BigDecimal("1234.56"));
// 把billDTO对象放入上下文进行传递
jobArgs.appendContext("wechat", JsonUtils.toJsonString(billDTO));
SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext());
return ExecuteResult.success(billDto);
return ExecuteResult.success(billDTO);
}
}

View File

@@ -3,7 +3,7 @@ package org.dromara.resource.dubbo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.dto.SseMessageDTO;
import org.dromara.common.sse.utils.SseMessageUtils;
import org.dromara.resource.api.RemoteMessageService;
import org.springframework.stereotype.Service;
@@ -29,7 +29,7 @@ public class RemoteMessageServiceImpl implements RemoteMessageService {
*/
@Override
public void publishMessage(List<Long> sessionKey, String message) {
SseMessageDto dto = new SseMessageDto();
SseMessageDTO dto = new SseMessageDTO();
dto.setMessage(message);
dto.setUserIds(sessionKey);
SseMessageUtils.publishMessage(dto);

View File

@@ -14,9 +14,9 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.bo.SysLogininforBo;
import org.dromara.system.domain.vo.SysLogininforVo;
import org.dromara.system.service.ISysLogininforService;
import org.dromara.system.domain.bo.SysLoginInfoBo;
import org.dromara.system.domain.vo.SysLoginInfoVo;
import org.dromara.system.service.ISysLoginInfoService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -30,55 +30,55 @@ import java.util.List;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/logininfor")
public class SysLogininforController extends BaseController {
@RequestMapping("/loginInfo")
public class SysLoginInfoController extends BaseController {
private final ISysLogininforService logininforService;
private final ISysLoginInfoService loginInfoService;
/**
* 获取系统访问记录列表
*/
@SaCheckPermission("monitor:logininfor:list")
@SaCheckPermission("monitor:logininfo:list")
@GetMapping("/list")
public TableDataInfo<SysLogininforVo> list(SysLogininforBo logininfor, PageQuery pageQuery) {
return logininforService.selectPageLogininforList(logininfor, pageQuery);
public TableDataInfo<SysLoginInfoVo> list(SysLoginInfoBo loginInfo, PageQuery pageQuery) {
return loginInfoService.selectPageLoginInfoList(loginInfo, pageQuery);
}
/**
* 导出系统访问记录列表
*/
@Log(title = "登录日志", businessType = BusinessType.EXPORT)
@SaCheckPermission("monitor:logininfor:export")
@SaCheckPermission("monitor:logininfo:export")
@PostMapping("/export")
public void export(SysLogininforBo logininfor, HttpServletResponse response) {
List<SysLogininforVo> list = logininforService.selectLogininforList(logininfor);
ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response);
public void export(SysLoginInfoBo loginInfo, HttpServletResponse response) {
List<SysLoginInfoVo> list = loginInfoService.selectLoginInfoList(loginInfo);
ExcelUtil.exportExcel(list, "登录日志", SysLoginInfoVo.class, response);
}
/**
* 批量删除登录日志
* @param infoIds 日志ids
*/
@SaCheckPermission("monitor:logininfor:remove")
@SaCheckPermission("monitor:logininfo:remove")
@Log(title = "登录日志", businessType = BusinessType.DELETE)
@DeleteMapping("/{infoIds}")
public R<Void> remove(@PathVariable Long[] infoIds) {
return toAjax(logininforService.deleteLogininforByIds(infoIds));
return toAjax(loginInfoService.deleteLoginInfoByIds(infoIds));
}
/**
* 清理系统访问记录
*/
@SaCheckPermission("monitor:logininfor:remove")
@SaCheckPermission("monitor:logininfo:remove")
@Log(title = "登录日志", businessType = BusinessType.CLEAN)
@Lock4j
@DeleteMapping("/clean")
public R<Void> clean() {
logininforService.cleanLogininfor();
loginInfoService.cleanLoginInfo();
return R.ok();
}
@SaCheckPermission("monitor:logininfor:unlock")
@SaCheckPermission("monitor:logininfo:unlock")
@Log(title = "账户解锁", businessType = BusinessType.OTHER)
@RepeatSubmit()
@GetMapping("/unlock/{userName}")

View File

@@ -9,14 +9,14 @@ import java.io.Serializable;
import java.util.Date;
/**
* 系统访问记录表 sys_logininfor
* 系统访问记录表 sys_login_info
*
* @author Lion Li
*/
@Data
@TableName("sys_logininfor")
public class SysLogininfor implements Serializable {
@TableName("sys_login_info")
public class SysLoginInfo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

View File

@@ -2,21 +2,21 @@ package org.dromara.system.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.system.domain.SysLogininfor;
import org.dromara.system.domain.SysLoginInfo;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 系统访问记录业务对象 sys_logininfor
* 系统访问记录业务对象 sys_login_info
*
* @author Michelle.Chung
*/
@Data
@AutoMapper(target = SysLogininfor.class, reverseConvertGenerate = false)
public class SysLogininforBo {
@AutoMapper(target = SysLoginInfo.class, reverseConvertGenerate = false)
public class SysLoginInfoBo {
/**
* 访问ID

View File

@@ -1,8 +1,8 @@
package org.dromara.system.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.bo.RemoteLogininforBo;
import org.dromara.system.domain.bo.SysLogininforBo;
import org.dromara.system.api.domain.bo.RemoteLoginInfoBo;
import org.dromara.system.domain.bo.SysLoginInfoBo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
@@ -12,6 +12,6 @@ import org.mapstruct.ReportingPolicy;
* @author zhujie
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysLogininforBoConvert extends BaseMapper<RemoteLogininforBo, SysLogininforBo> {
public interface SysLoginInfoBoConvert extends BaseMapper<RemoteLoginInfoBo, SysLoginInfoBo> {
}

View File

@@ -6,7 +6,7 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.system.domain.SysLogininfor;
import org.dromara.system.domain.SysLoginInfo;
import java.io.Serial;
import java.io.Serializable;
@@ -15,15 +15,15 @@ import java.util.Date;
/**
* 系统访问记录视图对象 sys_logininfor
* 系统访问记录视图对象 sys_login_info
*
* @author Michelle.Chung
* @date 2023-02-07
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = SysLogininfor.class)
public class SysLogininforVo implements Serializable {
@AutoMapper(target = SysLoginInfo.class)
public class SysLoginInfoVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

View File

@@ -4,11 +4,11 @@ import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.system.api.RemoteLogService;
import org.dromara.system.api.domain.bo.RemoteLogininforBo;
import org.dromara.system.api.domain.bo.RemoteLoginInfoBo;
import org.dromara.system.api.domain.bo.RemoteOperLogBo;
import org.dromara.system.domain.bo.SysLogininforBo;
import org.dromara.system.domain.bo.SysLoginInfoBo;
import org.dromara.system.domain.bo.SysOperLogBo;
import org.dromara.system.service.ISysLogininforService;
import org.dromara.system.service.ISysLoginInfoService;
import org.dromara.system.service.ISysOperLogService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -24,7 +24,7 @@ import org.springframework.stereotype.Service;
public class RemoteLogServiceImpl implements RemoteLogService {
private final ISysOperLogService operLogService;
private final ISysLogininforService logininforService;
private final ISysLoginInfoService loginInfoService;
/**
* 保存系统日志
@@ -41,12 +41,12 @@ public class RemoteLogServiceImpl implements RemoteLogService {
/**
* 保存访问记录
*
* @param remoteLogininforBo 访问实体
* @param remoteLoginInfoBo 访问实体
*/
@Async
@Override
public void saveLogininfor(RemoteLogininforBo remoteLogininforBo) {
SysLogininforBo sysLogininforBo = MapstructUtils.convert(remoteLogininforBo, SysLogininforBo.class);
logininforService.insertLogininfor(sysLogininforBo);
public void saveLoginInfo(RemoteLoginInfoBo remoteLoginInfoBo) {
SysLoginInfoBo sysLoginInfoBo = MapstructUtils.convert(remoteLoginInfoBo, SysLoginInfoBo.class);
loginInfoService.insertLoginInfo(sysLoginInfoBo);
}
}

View File

@@ -0,0 +1,14 @@
package org.dromara.system.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysLoginInfo;
import org.dromara.system.domain.vo.SysLoginInfoVo;
/**
* 系统访问日志情况信息 数据层
*
* @author Lion Li
*/
public interface SysLoginInfoMapper extends BaseMapperPlus<SysLoginInfo, SysLoginInfoVo> {
}

View File

@@ -1,14 +0,0 @@
package org.dromara.system.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysLogininfor;
import org.dromara.system.domain.vo.SysLogininforVo;
/**
* 系统访问日志情况信息 数据层
*
* @author Lion Li
*/
public interface SysLogininforMapper extends BaseMapperPlus<SysLogininfor, SysLogininforVo> {
}

View File

@@ -2,8 +2,8 @@ package org.dromara.system.service;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.bo.SysLogininforBo;
import org.dromara.system.domain.vo.SysLogininforVo;
import org.dromara.system.domain.bo.SysLoginInfoBo;
import org.dromara.system.domain.vo.SysLoginInfoVo;
import java.util.List;
@@ -12,31 +12,31 @@ import java.util.List;
*
* @author Lion Li
*/
public interface ISysLogininforService {
public interface ISysLoginInfoService {
/**
* 分页查询登录日志列表
*
* @param logininfor 查询条件
* @param loginInfo 查询条件
* @param pageQuery 分页参数
* @return 登录日志分页列表
*/
TableDataInfo<SysLogininforVo> selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery);
TableDataInfo<SysLoginInfoVo> selectPageLoginInfoList(SysLoginInfoBo loginInfo, PageQuery pageQuery);
/**
* 新增系统登录日志
*
* @param bo 访问日志对象
*/
void insertLogininfor(SysLogininforBo bo);
void insertLoginInfo(SysLoginInfoBo bo);
/**
* 查询系统登录日志集合
*
* @param logininfor 访问日志对象
* @param loginInfo 访问日志对象
* @return 登录记录集合
*/
List<SysLogininforVo> selectLogininforList(SysLogininforBo logininfor);
List<SysLoginInfoVo> selectLoginInfoList(SysLoginInfoBo loginInfo);
/**
* 批量删除系统登录日志
@@ -44,10 +44,10 @@ public interface ISysLogininforService {
* @param infoIds 需要删除的登录日志ID
* @return 结果
*/
int deleteLogininforByIds(Long[] infoIds);
int deleteLoginInfoByIds(Long[] infoIds);
/**
* 清空系统登录日志
*/
void cleanLogininfor();
void cleanLoginInfo();
}

View File

@@ -0,0 +1,106 @@
package org.dromara.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.SysLoginInfo;
import org.dromara.system.domain.bo.SysLoginInfoBo;
import org.dromara.system.domain.vo.SysLoginInfoVo;
import org.dromara.system.mapper.SysLoginInfoMapper;
import org.dromara.system.service.ISysLoginInfoService;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 系统访问日志情况信息 服务层处理
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Slf4j
@Service
public class SysLoginInfoServiceImpl implements ISysLoginInfoService {
private final SysLoginInfoMapper baseMapper;
/**
* 分页查询登录日志列表
*
* @param loginInfo 查询条件
* @param pageQuery 分页参数
* @return 登录日志分页列表
*/
@Override
public TableDataInfo<SysLoginInfoVo> selectPageLoginInfoList(SysLoginInfoBo loginInfo, PageQuery pageQuery) {
Map<String, Object> params = loginInfo.getParams();
LambdaQueryWrapper<SysLoginInfo> lqw = new LambdaQueryWrapper<SysLoginInfo>()
.like(StringUtils.isNotBlank(loginInfo.getIpaddr()), SysLoginInfo::getIpaddr, loginInfo.getIpaddr())
.eq(StringUtils.isNotBlank(loginInfo.getStatus()), SysLoginInfo::getStatus, loginInfo.getStatus())
.like(StringUtils.isNotBlank(loginInfo.getUserName()), SysLoginInfo::getUserName, loginInfo.getUserName())
.between(params.get("beginTime") != null && params.get("endTime") != null,
SysLoginInfo::getLoginTime, params.get("beginTime"), params.get("endTime"));
if (StringUtils.isBlank(pageQuery.getOrderByColumn())) {
lqw.orderByDesc(SysLoginInfo::getInfoId);
}
Page<SysLoginInfoVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(page);
}
/**
* 新增系统登录日志
*
* @param bo 访问日志对象
*/
@Override
public void insertLoginInfo(SysLoginInfoBo bo) {
SysLoginInfo loginInfo = MapstructUtils.convert(bo, SysLoginInfo.class);
loginInfo.setLoginTime(new Date());
baseMapper.insert(loginInfo);
}
/**
* 查询系统登录日志集合
*
* @param loginInfo 访问日志对象
* @return 登录记录集合
*/
@Override
public List<SysLoginInfoVo> selectLoginInfoList(SysLoginInfoBo loginInfo) {
Map<String, Object> params = loginInfo.getParams();
return baseMapper.selectVoList(new LambdaQueryWrapper<SysLoginInfo>()
.like(StringUtils.isNotBlank(loginInfo.getIpaddr()), SysLoginInfo::getIpaddr, loginInfo.getIpaddr())
.eq(StringUtils.isNotBlank(loginInfo.getStatus()), SysLoginInfo::getStatus, loginInfo.getStatus())
.like(StringUtils.isNotBlank(loginInfo.getUserName()), SysLoginInfo::getUserName, loginInfo.getUserName())
.between(params.get("beginTime") != null && params.get("endTime") != null,
SysLoginInfo::getLoginTime, params.get("beginTime"), params.get("endTime"))
.orderByDesc(SysLoginInfo::getInfoId));
}
/**
* 批量删除系统登录日志
*
* @param infoIds 需要删除的登录日志ID
* @return 结果
*/
@Override
public int deleteLoginInfoByIds(Long[] infoIds) {
return baseMapper.deleteByIds(Arrays.asList(infoIds));
}
/**
* 清空系统登录日志
*/
@Override
public void cleanLoginInfo() {
baseMapper.delete(new LambdaQueryWrapper<>());
}
}

View File

@@ -1,106 +0,0 @@
package org.dromara.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.SysLogininfor;
import org.dromara.system.domain.bo.SysLogininforBo;
import org.dromara.system.domain.vo.SysLogininforVo;
import org.dromara.system.mapper.SysLogininforMapper;
import org.dromara.system.service.ISysLogininforService;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 系统访问日志情况信息 服务层处理
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Slf4j
@Service
public class SysLogininforServiceImpl implements ISysLogininforService {
private final SysLogininforMapper baseMapper;
/**
* 分页查询登录日志列表
*
* @param logininfor 查询条件
* @param pageQuery 分页参数
* @return 登录日志分页列表
*/
@Override
public TableDataInfo<SysLogininforVo> selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery) {
Map<String, Object> params = logininfor.getParams();
LambdaQueryWrapper<SysLogininfor> lqw = new LambdaQueryWrapper<SysLogininfor>()
.like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr())
.eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus())
.like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName())
.between(params.get("beginTime") != null && params.get("endTime") != null,
SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime"));
if (StringUtils.isBlank(pageQuery.getOrderByColumn())) {
lqw.orderByDesc(SysLogininfor::getInfoId);
}
Page<SysLogininforVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(page);
}
/**
* 新增系统登录日志
*
* @param bo 访问日志对象
*/
@Override
public void insertLogininfor(SysLogininforBo bo) {
SysLogininfor logininfor = MapstructUtils.convert(bo, SysLogininfor.class);
logininfor.setLoginTime(new Date());
baseMapper.insert(logininfor);
}
/**
* 查询系统登录日志集合
*
* @param logininfor 访问日志对象
* @return 登录记录集合
*/
@Override
public List<SysLogininforVo> selectLogininforList(SysLogininforBo logininfor) {
Map<String, Object> params = logininfor.getParams();
return baseMapper.selectVoList(new LambdaQueryWrapper<SysLogininfor>()
.like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr())
.eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus())
.like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName())
.between(params.get("beginTime") != null && params.get("endTime") != null,
SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime"))
.orderByDesc(SysLogininfor::getInfoId));
}
/**
* 批量删除系统登录日志
*
* @param infoIds 需要删除的登录日志ID
* @return 结果
*/
@Override
public int deleteLogininforByIds(Long[] infoIds) {
return baseMapper.deleteByIds(Arrays.asList(infoIds));
}
/**
* 清空系统登录日志
*/
@Override
public void cleanLogininfor() {
baseMapper.delete(new LambdaQueryWrapper<>());
}
}

View File

@@ -9,7 +9,6 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.TreeBuildUtils;
import org.dromara.common.satoken.utils.LoginHelper;
@@ -133,7 +132,11 @@ public class SysMenuServiceImpl implements ISysMenuService {
.orderByAsc(SysMenu::getParentId)
.orderByAsc(SysMenu::getOrderNum));
}
return getChildPerms(menus, Constants.TOP_PARENT_ID);
return TreeBuildUtils.build(menus, Constants.TOP_PARENT_ID, SysMenu::getParentId, (menu, nodeTreeMaps) -> {
Long menuParentId = menu.getMenuId();
List<SysMenu> childMenus = nodeTreeMaps.getOrDefault(menuParentId, Collections.emptyList());
menu.setChildren(childMenus);
});
}
/**
@@ -378,38 +381,4 @@ public class SysMenuServiceImpl implements ISysMenuService {
return true;
}
/**
* 根据父节点的ID获取所有子节点
*
* @param list 分类表
* @param parentId 传入的父节点ID
* @return String
*/
private List<SysMenu> getChildPerms(List<SysMenu> list, Long parentId) {
List<SysMenu> returnList = new ArrayList<>();
for (SysMenu t : list) {
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId().equals(parentId)) {
recursionFn(list, t);
returnList.add(t);
}
}
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<SysMenu> list, SysMenu t) {
// 得到子节点列表
List<SysMenu> childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId()));
t.setChildren(childList);
for (SysMenu tChild : childList) {
// 判断是否有子节点
if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getMenuId()))) {
recursionFn(list, tChild);
}
}
}
}

View File

@@ -2,6 +2,6 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.SysLogininforMapper">
<mapper namespace="org.dromara.system.mapper.SysLoginInfoMapper">
</mapper>

View File

@@ -361,7 +361,7 @@ insert into sys_menu values('117', 'Admin监控', '2', '5', 'Admin',
insert into sys_menu values('118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 103, 1, sysdate, null, null, '文件管理菜单');
-- 三级菜单
insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate, null, null, '操作日志菜单');
insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate, null, null, '登录日志菜单');
insert into sys_menu values('501', '登录日志', '108', '2', 'loginInfo', 'monitor/loginInfo/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfo:list', 'loginInfo', 103, 1, sysdate, null, null, '登录日志菜单');
-- 用户管理按钮
insert into sys_menu values('1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate, null, null, '');
@@ -414,10 +414,10 @@ insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', 1,
insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, sysdate, null, null, '');
-- 登录日志按钮
insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfo:query', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfo:remove', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfo:export', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfo:unlock', '#', 103, 1, sysdate, null, null, '');
-- 在线用户按钮
insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1, sysdate, null, null, '');
insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, sysdate, null, null, '');
@@ -911,7 +911,7 @@ insert into sys_config values(11, 'OSS预览列表资源开关', 'sys.o
-- ----------------------------
-- 14、系统访问记录
-- ----------------------------
create table sys_logininfor (
create table sys_login_info (
info_id number(20) not null,
user_name varchar2(50) default '',
client_key varchar2(32) default '',
@@ -925,22 +925,22 @@ create table sys_logininfor (
login_time date
);
alter table sys_logininfor add constraint pk_sys_logininfor primary key (info_id);
create index idx_sys_logininfor_s on sys_logininfor (status);
create index idx_sys_logininfor_lt on sys_logininfor (login_time);
alter table sys_login_info add constraint pk_sys_login_info primary key (info_id);
create index idx_sys_login_info_s on sys_login_info (status);
create index idx_sys_login_info_lt on sys_login_info (login_time);
comment on table sys_logininfor is '系统访问记录';
comment on column sys_logininfor.info_id is '访问ID';
comment on column sys_logininfor.user_name is '登录账号';
comment on column sys_logininfor.client_key is '客户端';
comment on column sys_logininfor.device_type is '设备类型';
comment on column sys_logininfor.ipaddr is '登录IP地址';
comment on column sys_logininfor.login_location is '登录地点';
comment on column sys_logininfor.browser is '浏览器类型';
comment on column sys_logininfor.os is '操作系统';
comment on column sys_logininfor.status is '登录状态0成功 1失败';
comment on column sys_logininfor.msg is '提示消息';
comment on column sys_logininfor.login_time is '访问时间';
comment on table sys_login_info is '系统访问记录';
comment on column sys_login_info.info_id is '访问ID';
comment on column sys_login_info.user_name is '登录账号';
comment on column sys_login_info.client_key is '客户端';
comment on column sys_login_info.device_type is '设备类型';
comment on column sys_login_info.ipaddr is '登录IP地址';
comment on column sys_login_info.login_location is '登录地点';
comment on column sys_login_info.browser is '浏览器类型';
comment on column sys_login_info.os is '操作系统';
comment on column sys_login_info.status is '登录状态0成功 1失败';
comment on column sys_login_info.msg is '提示消息';
comment on column sys_login_info.login_time is '访问时间';
-- ----------------------------

View File

@@ -357,7 +357,7 @@ insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-conf
insert into sys_menu values('118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', '1', '0', 'C', '0', '0', 'system:oss:list', 'upload', 103, 1, now(), null, null, '文件管理菜单');
-- 三级菜单
insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', '1', '0', 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, now(), null, null, '操作日志菜单');
insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', '1', '0', 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, now(), null, null, '登录日志菜单');
insert into sys_menu values('501', '登录日志', '108', '2', 'loginInfo', 'monitor/loginInfo/index', '', '1', '0', 'C', '0', '0', 'monitor:logininfo:list', 'loginInfo', 103, 1, now(), null, null, '登录日志菜单');
-- 用户管理按钮
insert into sys_menu values('1001', '用户查询', '100', '1', '', '', '', '1', '0', 'F', '0', '0', 'system:user:query', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1002', '用户新增', '100', '2', '', '', '', '1', '0', 'F', '0', '0', 'system:user:add', '#', 103, 1, now(), null, null, '');
@@ -410,10 +410,10 @@ insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', '1'
insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, now(), null, null, '');
-- 登录日志按钮
insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfo:query', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfo:remove', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfo:export', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:logininfo:unlock', '#', 103, 1, now(), null, null, '');
-- 在线用户按钮
insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:online:query', '#', 103, 1, now(), null, null, '');
insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', '1', '0', 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, now(), null, null, '');
@@ -909,7 +909,7 @@ insert into sys_config values(11, 'OSS预览列表资源开关', 'sys.o
-- ----------------------------
-- 14、系统访问记录
-- ----------------------------
create table if not exists sys_logininfor
create table if not exists sys_login_info
(
info_id int8,
user_name varchar(50) default ''::varchar,
@@ -922,24 +922,24 @@ create table if not exists sys_logininfor
status char default '0'::bpchar,
msg varchar(255) default ''::varchar,
login_time timestamp,
constraint sys_logininfor_pk primary key (info_id)
constraint sys_login_info_pk primary key (info_id)
);
create index idx_sys_logininfor_s ON sys_logininfor (status);
create index idx_sys_logininfor_lt ON sys_logininfor (login_time);
create index idx_sys_login_info_s ON sys_login_info (status);
create index idx_sys_login_info_lt ON sys_login_info (login_time);
comment on table sys_logininfor is '系统访问记录';
comment on column sys_logininfor.info_id is '访问ID';
comment on column sys_logininfor.user_name is '用户账号';
comment on column sys_logininfor.client_key is '客户端';
comment on column sys_logininfor.device_type is '设备类型';
comment on column sys_logininfor.ipaddr is '登录IP地址';
comment on column sys_logininfor.login_location is '登录地点';
comment on column sys_logininfor.browser is '浏览器类型';
comment on column sys_logininfor.os is '操作系统';
comment on column sys_logininfor.status is '登录状态0成功 1失败';
comment on column sys_logininfor.msg is '提示消息';
comment on column sys_logininfor.login_time is '访问时间';
comment on table sys_login_info is '系统访问记录';
comment on column sys_login_info.info_id is '访问ID';
comment on column sys_login_info.user_name is '用户账号';
comment on column sys_login_info.client_key is '客户端';
comment on column sys_login_info.device_type is '设备类型';
comment on column sys_login_info.ipaddr is '登录IP地址';
comment on column sys_login_info.login_location is '登录地点';
comment on column sys_login_info.browser is '浏览器类型';
comment on column sys_login_info.os is '操作系统';
comment on column sys_login_info.status is '登录状态0成功 1失败';
comment on column sys_login_info.msg is '提示消息';
comment on column sys_login_info.login_time is '访问时间';
-- ----------------------------
-- 17、通知公告表

View File

@@ -233,7 +233,7 @@ insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-conf
insert into sys_menu values('118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 103, 1, sysdate(), null, null, '文件管理菜单');
-- 三级菜单
insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单');
insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单');
insert into sys_menu values('501', '登录日志', '108', '2', 'loginInfo', 'monitor/loginInfo/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfo:list', 'loginInfo', 103, 1, sysdate(), null, null, '登录日志菜单');
-- 用户管理按钮
insert into sys_menu values('1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate(), null, null, '');
@@ -286,10 +286,10 @@ insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', 1,
insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, sysdate(), null, null, '');
-- 登录日志按钮
insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfo:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfo:remove', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfo:export', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfo:unlock', '#', 103, 1, sysdate(), null, null, '');
-- 在线用户按钮
insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, sysdate(), null, null, '');
@@ -703,7 +703,7 @@ insert into sys_config values(11, 'OSS预览列表资源开关', 'sys.os
-- ----------------------------
-- 14、系统访问记录
-- ----------------------------
create table sys_logininfor (
create table sys_login_info (
info_id bigint(20) not null comment '访问ID',
user_name varchar(50) default '' comment '用户账号',
client_key varchar(32) default '' comment '客户端',
@@ -716,8 +716,8 @@ create table sys_logininfor (
msg varchar(255) default '' comment '提示消息',
login_time datetime comment '访问时间',
primary key (info_id),
key idx_sys_logininfor_s (status),
key idx_sys_logininfor_lt (login_time)
key idx_sys_login_info_s (status),
key idx_sys_login_info_lt (login_time)
) engine=innodb comment = '系统访问记录';