diff --git a/common/common-generator/src/main/java/cn/bunny/common/generator/generator/WebGeneratorCode.java b/common/common-generator/src/main/java/cn/bunny/common/generator/generator/WebGeneratorCode.java
index 4af12f9..9337d4e 100644
--- a/common/common-generator/src/main/java/cn/bunny/common/generator/generator/WebGeneratorCode.java
+++ b/common/common-generator/src/main/java/cn/bunny/common/generator/generator/WebGeneratorCode.java
@@ -3,11 +3,7 @@ package cn.bunny.common.generator.generator;
import cn.bunny.common.generator.entity.BaseField;
import cn.bunny.common.generator.entity.BaseResultMap;
import cn.bunny.common.generator.utils.GeneratorCodeUtils;
-import cn.bunny.dao.dto.log.UserLoginLogAddDto;
-import cn.bunny.dao.dto.log.UserLoginLogDto;
-import cn.bunny.dao.dto.log.UserLoginLogUpdateDto;
import cn.bunny.dao.entity.log.UserLoginLog;
-import cn.bunny.dao.vo.log.UserLoginLogVo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.common.base.CaseFormat;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -52,10 +48,10 @@ public class WebGeneratorCode {
public static void main(String[] args) throws Exception {
Class> originalClass = UserLoginLog.class;
- Class> dtoClass = UserLoginLogDto.class;
- Class> addDtoClass = UserLoginLogAddDto.class;
- Class> updateDtoClass = UserLoginLogUpdateDto.class;
- Class> voClass = UserLoginLogVo.class;
+ Class> dtoClass = UserLoginLog.class;
+ Class> addDtoClass = UserLoginLog.class;
+ Class> updateDtoClass = UserLoginLog.class;
+ Class> voClass = UserLoginLog.class;
// 设置velocity资源加载器
Properties prop = new Properties();
diff --git a/common/common-generator/src/main/resources/vms/web/index.vm b/common/common-generator/src/main/resources/vms/web/index.vm
index 307c4fc..b2565a5 100644
--- a/common/common-generator/src/main/resources/vms/web/index.vm
+++ b/common/common-generator/src/main/resources/vms/web/index.vm
@@ -62,6 +62,8 @@ onMounted(() => {
#foreach($item in $formList)
+
+
diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpEntity.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpEntity.java
index 0b09e8b..44e3afa 100644
--- a/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpEntity.java
+++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpEntity.java
@@ -14,7 +14,7 @@ import lombok.NoArgsConstructor;
@ApiModel(value = "IpEntity对象", description = "用户IP相关信息")
public class IpEntity {
@ApiModelProperty("原始地址")
- private String remoteAddr;
+ private String ipAddr;
@ApiModelProperty("IP归属地")
private String ipRegion;
diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpUtil.java
index 3658a2f..5feb6f6 100644
--- a/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpUtil.java
+++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpUtil.java
@@ -92,7 +92,7 @@ public class IpUtil {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String remoteAddr = requestAttributes != null ? getIpAddr(requestAttributes.getRequest()) : "0:0:0:0:0:0:0:1";
String ipRegion = IpUtil.getIpRegion(remoteAddr);
- return IpEntity.builder().remoteAddr(remoteAddr).ipRegion(ipRegion).build();
+ return IpEntity.builder().ipAddr(remoteAddr).ipRegion(ipRegion).build();
}
/**
diff --git a/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogAddDto.java b/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogAddDto.java
deleted file mode 100644
index 6f7c03e..0000000
--- a/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogAddDto.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package cn.bunny.dao.dto.log;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@Schema(name = "UserLoginLogDto对象", title = "用户登录日志分页查询", description = "用户登录日志分页查询")
-public class UserLoginLogAddDto {
-
- @Schema(name = "userId", title = "用户Id")
- private Long userId;
-
- @Schema(name = "username", title = "用户名")
- private String username;
-
- @Schema(name = "token", title = "登录token")
- private String token;
-
- @Schema(name = "ip", title = "登录Ip")
- private String ip;
-
- @Schema(name = "ipAddress", title = "登录Ip地点")
- private String ipAddress;
-
- @Schema(name = "userAgent", title = "登录时代理")
- private String userAgent;
-
-}
diff --git a/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogDto.java b/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogDto.java
index aa65beb..d1126f8 100644
--- a/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogDto.java
+++ b/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogDto.java
@@ -22,14 +22,17 @@ public class UserLoginLogDto {
@Schema(name = "token", title = "登录token")
private String token;
- @Schema(name = "ip", title = "登录Ip")
- private String ip;
-
@Schema(name = "ipAddress", title = "登录Ip地点")
private String ipAddress;
+ @Schema(name = "ipRegion", title = "登录Ip")
+ private String ipRegion;
+
@Schema(name = "userAgent", title = "登录时代理")
private String userAgent;
+ @Schema(name = "type", title = "操作类型")
+ private String type;
+
}
diff --git a/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogUpdateDto.java b/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogUpdateDto.java
index 6f3998c..2db78f2 100644
--- a/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogUpdateDto.java
+++ b/dao/src/main/java/cn/bunny/dao/dto/log/UserLoginLogUpdateDto.java
@@ -22,13 +22,16 @@ public class UserLoginLogUpdateDto {
@Schema(name = "token", title = "登录token")
private String token;
- @Schema(name = "ip", title = "登录Ip")
- private String ip;
-
@Schema(name = "ipAddress", title = "登录Ip地点")
private String ipAddress;
+ @Schema(name = "ipRegion", title = "登录Ip")
+ private String ipRegion;
+
@Schema(name = "userAgent", title = "登录时代理")
private String userAgent;
+ @Schema(name = "type", title = "操作类型")
+ private String type;
+
}
\ No newline at end of file
diff --git a/dao/src/main/java/cn/bunny/dao/entity/log/UserLoginLog.java b/dao/src/main/java/cn/bunny/dao/entity/log/UserLoginLog.java
index b58c80a..f3440b5 100644
--- a/dao/src/main/java/cn/bunny/dao/entity/log/UserLoginLog.java
+++ b/dao/src/main/java/cn/bunny/dao/entity/log/UserLoginLog.java
@@ -31,13 +31,16 @@ public class UserLoginLog extends BaseEntity {
@Schema(name = "token", title = "登录token")
private String token;
- @Schema(name = "ip", title = "登录Ip")
- private String ip;
-
- @Schema(name = "ipAddress", title = "登录Ip地点")
+ @Schema(name = "ipAddress", title = "登录Ip")
private String ipAddress;
+ @Schema(name = "ipRegion", title = "登录Ip归属地")
+ private String ipRegion;
+
@Schema(name = "userAgent", title = "登录时代理")
private String userAgent;
+ @Schema(name = "type", title = "操作类型")
+ private String type;
+
}
diff --git a/dao/src/main/java/cn/bunny/dao/vo/log/UserLoginLogVo.java b/dao/src/main/java/cn/bunny/dao/vo/log/UserLoginLogVo.java
index 8b509f1..7ad9190 100644
--- a/dao/src/main/java/cn/bunny/dao/vo/log/UserLoginLogVo.java
+++ b/dao/src/main/java/cn/bunny/dao/vo/log/UserLoginLogVo.java
@@ -21,13 +21,16 @@ public class UserLoginLogVo extends BaseVo {
@Schema(name = "token", title = "登录token")
private String token;
- @Schema(name = "ip", title = "登录Ip")
- private String ip;
-
@Schema(name = "ipAddress", title = "登录Ip地点")
private String ipAddress;
+ @Schema(name = "ipRegion", title = "登录Ip")
+ private String ipRegion;
+
@Schema(name = "userAgent", title = "登录时代理")
private String userAgent;
+ @Schema(name = "type", title = "操作类型")
+ private String type;
+
}
\ No newline at end of file
diff --git a/service/src/main/java/cn/bunny/services/controller/UserDeptController.java b/service/src/main/java/cn/bunny/services/controller/UserDeptController.java
deleted file mode 100644
index 078dde3..0000000
--- a/service/src/main/java/cn/bunny/services/controller/UserDeptController.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cn.bunny.services.controller;
-
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- *
- * 部门用户关系 前端控制器
- *
- *
- * @author Bunny
- * @since 2024-10-04
- */
-@Tag(name = "用户和部门", description = "用户和部门相关接口")
-@RestController
-@RequestMapping("admin/userDept")
-public class UserDeptController {
-
-}
diff --git a/service/src/main/java/cn/bunny/services/controller/UserLoginLogController.java b/service/src/main/java/cn/bunny/services/controller/UserLoginLogController.java
index f11dddc..0f46f4c 100644
--- a/service/src/main/java/cn/bunny/services/controller/UserLoginLogController.java
+++ b/service/src/main/java/cn/bunny/services/controller/UserLoginLogController.java
@@ -1,6 +1,5 @@
package cn.bunny.services.controller;
-import cn.bunny.dao.dto.log.UserLoginLogAddDto;
import cn.bunny.dao.dto.log.UserLoginLogDto;
import cn.bunny.dao.dto.log.UserLoginLogUpdateDto;
import cn.bunny.dao.entity.log.UserLoginLog;
@@ -49,13 +48,6 @@ public class UserLoginLogController {
return Mono.just(Result.success(pageResult));
}
- @Operation(summary = "添加用户登录日志", description = "添加用户登录日志")
- @PostMapping("addUserLoginLog")
- public Mono> addUserLoginLog(@Valid @RequestBody UserLoginLogAddDto dto) {
- userLoginLogService.addUserLoginLog(dto);
- return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS));
- }
-
@Operation(summary = "更新用户登录日志", description = "更新用户登录日志")
@PutMapping("updateUserLoginLog")
public Mono> updateUserLoginLog(@Valid @RequestBody UserLoginLogUpdateDto dto) {
diff --git a/service/src/main/java/cn/bunny/services/factory/UserFactory.java b/service/src/main/java/cn/bunny/services/factory/UserFactory.java
index 9e9ad74..44d2a3e 100644
--- a/service/src/main/java/cn/bunny/services/factory/UserFactory.java
+++ b/service/src/main/java/cn/bunny/services/factory/UserFactory.java
@@ -3,6 +3,7 @@ package cn.bunny.services.factory;
import cn.bunny.common.service.utils.JwtHelper;
import cn.bunny.common.service.utils.ip.IpUtil;
import cn.bunny.common.service.utils.minio.MinioUtil;
+import cn.bunny.dao.entity.log.UserLoginLog;
import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.entity.system.Power;
import cn.bunny.dao.entity.system.Role;
@@ -12,14 +13,18 @@ import cn.bunny.dao.pojo.constant.UserConstant;
import cn.bunny.dao.vo.system.user.LoginVo;
import cn.bunny.services.mapper.PowerMapper;
import cn.bunny.services.mapper.RoleMapper;
+import cn.bunny.services.mapper.UserLoginLogMapper;
import cn.bunny.services.mapper.UserMapper;
import cn.bunny.services.security.custom.CustomCheckIsAdmin;
+import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -36,13 +41,18 @@ public class UserFactory {
@Autowired
private RoleMapper roleMapper;
+ @Autowired
+ private UserMapper userMapper;
+
+ @Autowired
+ private UserLoginLogMapper userLoginLogMapper;
+
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private MinioUtil minioUtil;
- @Autowired
- private UserMapper userMapper;
+
public LoginVo buildUserVo(AdminUser user, long readMeDay) {
// 创建token
@@ -50,16 +60,21 @@ public class UserFactory {
String email = user.getEmail();
String token = JwtHelper.createToken(userId, email, (int) readMeDay);
String avatar = user.getAvatar();
- String remoteAddr = IpUtil.getCurrentUserIpAddress().getRemoteAddr();
+
+ // 获取IP地址
+ String ipAddr = IpUtil.getCurrentUserIpAddress().getIpAddr();
String ipRegion = IpUtil.getCurrentUserIpAddress().getIpRegion();
+ // 当前请求request
+ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+
// 判断用户是否有头像,如果没有头像设置默认头像
avatar = StringUtils.hasText(avatar) ? minioUtil.getObjectNameFullPath(avatar) : UserConstant.USER_AVATAR;
// 设置用户IP地址,并更新用户信息
AdminUser updateUser = new AdminUser();
updateUser.setId(userId);
- updateUser.setLastLoginIp(remoteAddr);
+ updateUser.setLastLoginIp(ipAddr);
updateUser.setLastLoginIpAddress(ipRegion);
userMapper.updateById(updateUser);
@@ -86,13 +101,28 @@ public class UserFactory {
loginVo.setAvatar(avatar);
loginVo.setToken(token);
loginVo.setRefreshToken(token);
- loginVo.setLastLoginIp(remoteAddr);
+ loginVo.setLastLoginIp(ipAddr);
loginVo.setLastLoginIpAddress(ipRegion);
loginVo.setRoles(roles);
loginVo.setPermissions(permissions);
loginVo.setUpdateUser(userId);
loginVo.setExpires(expires);
+ // 将用户登录保存在用户登录日志表中
+ UserLoginLog userLoginLog = new UserLoginLog();
+ BeanUtils.copyProperties(user, userLoginLog);
+ userLoginLog.setUserId(userId);
+ userLoginLog.setIpAddress(ipAddr);
+ userLoginLog.setIpRegion(ipRegion);
+ userLoginLog.setToken(token);
+ userLoginLog.setType("login");
+ if (requestAttributes != null) {
+ HttpServletRequest request = requestAttributes.getRequest();
+ String userAgent = request.getHeader("User-Agent");
+ userLoginLog.setUserAgent(userAgent);
+ }
+ userLoginLogMapper.insert(userLoginLog);
+
// 将信息保存在Redis中
redisTemplate.opsForValue().set(RedisUserConstant.getAdminLoginInfoPrefix(email), loginVo, readMeDay, TimeUnit.DAYS);
diff --git a/service/src/main/java/cn/bunny/services/service/UserLoginLogService.java b/service/src/main/java/cn/bunny/services/service/UserLoginLogService.java
index 7278774..bfecdfa 100644
--- a/service/src/main/java/cn/bunny/services/service/UserLoginLogService.java
+++ b/service/src/main/java/cn/bunny/services/service/UserLoginLogService.java
@@ -1,6 +1,5 @@
package cn.bunny.services.service;
-import cn.bunny.dao.dto.log.UserLoginLogAddDto;
import cn.bunny.dao.dto.log.UserLoginLogDto;
import cn.bunny.dao.dto.log.UserLoginLogUpdateDto;
import cn.bunny.dao.entity.log.UserLoginLog;
@@ -29,13 +28,6 @@ public interface UserLoginLogService extends IService {
*/
PageResult getUserLoginLogList(Page pageParams, UserLoginLogDto dto);
- /**
- * * 添加用户登录日志
- *
- * @param dto 添加表单
- */
- void addUserLoginLog(@Valid UserLoginLogAddDto dto);
-
/**
* * 更新用户登录日志
*
diff --git a/service/src/main/java/cn/bunny/services/service/impl/UserLoginLogServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/UserLoginLogServiceImpl.java
index c984587..a5f49bb 100644
--- a/service/src/main/java/cn/bunny/services/service/impl/UserLoginLogServiceImpl.java
+++ b/service/src/main/java/cn/bunny/services/service/impl/UserLoginLogServiceImpl.java
@@ -1,6 +1,5 @@
package cn.bunny.services.service.impl;
-import cn.bunny.dao.dto.log.UserLoginLogAddDto;
import cn.bunny.dao.dto.log.UserLoginLogDto;
import cn.bunny.dao.dto.log.UserLoginLogUpdateDto;
import cn.bunny.dao.entity.log.UserLoginLog;
@@ -54,19 +53,6 @@ public class UserLoginLogServiceImpl extends ServiceImpl implemen
@Autowired
private UserRoleMapper userRoleMapper;
+ @Autowired
+ private UserLoginLogMapper userLoginLogMapper;
+
/**
* 登录发送邮件验证码
*
@@ -204,6 +211,9 @@ public class UserServiceImpl extends ServiceImpl implemen
*/
@Override
public void forcedOffline(Long id) {
+ // 当前请求request
+ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+
if (id == null) throw new BunnyException(ResultCodeEnum.REQUEST_IS_EMPTY);
// 根据id查询用户登录前缀
@@ -211,6 +221,16 @@ public class UserServiceImpl extends ServiceImpl implemen
String email = adminUser.getEmail();
String adminLoginInfoPrefix = RedisUserConstant.getAdminLoginInfoPrefix(email);
+ // 将用户登录保存在用户登录日志表中
+ UserLoginLog userLoginLog = new UserLoginLog();
+ BeanUtils.copyProperties(adminUser, userLoginLog);
+ userLoginLog.setUserId(adminUser.getId());
+ userLoginLog.setIpAddress(adminUser.getLastLoginIp());
+ userLoginLog.setIpRegion(adminUser.getLastLoginIpAddress());
+ userLoginLog.setToken(null);
+ userLoginLog.setType("forcedOffline");
+ userLoginLogMapper.insert(userLoginLog);
+
redisTemplate.delete(adminLoginInfoPrefix);
}
diff --git a/service/src/main/resources/mapper/UserLoginLogMapper.xml b/service/src/main/resources/mapper/UserLoginLogMapper.xml
index 70e6903..e4b452b 100644
--- a/service/src/main/resources/mapper/UserLoginLogMapper.xml
+++ b/service/src/main/resources/mapper/UserLoginLogMapper.xml
@@ -4,23 +4,23 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
- id, create_time, update_time, create_user, update_user, is_deleted, user_id, username, token, ip, ip_address, user_agent
+ id, create_time, update_time, create_user, update_user, is_deleted, user_id, username, token, ip_region, ip_address, user_agent
@@ -29,24 +29,24 @@
from log_user_login
-
- and user_id like CONCAT('%',#{dto.userId},'%')
-
-
- and username like CONCAT('%',#{dto.username},'%')
-
-
- and token like CONCAT('%',#{dto.token},'%')
-
-
- and ip like CONCAT('%',#{dto.ip},'%')
-
-
- and ip_address like CONCAT('%',#{dto.ipAddress},'%')
-
-
- and user_agent like CONCAT('%',#{dto.userAgent},'%')
-
+
+ and user_id like CONCAT('%',#{dto.userId},'%')
+
+
+ and username like CONCAT('%',#{dto.username},'%')
+
+
+ and token like CONCAT('%',#{dto.token},'%')
+
+
+ and ip_region like CONCAT('%',#{dto.ipRegion},'%')
+
+
+ and ip_address like CONCAT('%',#{dto.ipAddress},'%')
+
+
+ and user_agent like CONCAT('%',#{dto.userAgent},'%')
+
order by update_time desc