mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	增加 yudao-core-service 模块,提供共享逻辑
This commit is contained in:
		| @@ -3,7 +3,8 @@ package cn.iocoder.yudao.adminserver; | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
|  | ||||
| @SpringBootApplication | ||||
| @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} 和 ${yudao.core-service.base-package} | ||||
| @SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}", "${yudao.core-service.base-package}"}) | ||||
| public class AdminServerApplication { | ||||
|  | ||||
|     public static void main(String[] args) { | ||||
|   | ||||
| @@ -1,11 +1,12 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.controller.auth; | ||||
|  | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysUserSessionConvert; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; | ||||
| @@ -35,6 +36,8 @@ public class SysUserSessionController { | ||||
|     @Resource | ||||
|     private SysUserSessionService userSessionService; | ||||
|     @Resource | ||||
|     private SysUserSessionCoreService userSessionCoreService; | ||||
|     @Resource | ||||
|     private SysUserService userService; | ||||
|     @Resource | ||||
|     private SysDeptService deptService; | ||||
| @@ -72,7 +75,7 @@ public class SysUserSessionController { | ||||
|             example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") | ||||
|     @PreAuthorize("@ss.hasPermission('system:user-session:delete')") | ||||
|     public CommonResult<Boolean> deleteUserSession(@RequestParam("id") String id) { | ||||
|         userSessionService.deleteUserSession(id); | ||||
|         userSessionCoreService.deleteUserSession(id); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.Sys | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum; | ||||
| import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.framework.security.core.LoginUser; | ||||
| import me.zhyd.oauth.model.AuthCallback; | ||||
| @@ -27,7 +28,12 @@ public interface SysAuthConvert { | ||||
|  | ||||
|     @Mapping(source = "updateTime", target = "updateTime", ignore = true) | ||||
|         // 字段相同,但是含义不同,忽略 | ||||
|     LoginUser convert(SysUserDO bean); | ||||
|     LoginUser convert0(SysUserDO bean); | ||||
|  | ||||
|     default LoginUser convert(SysUserDO bean) { | ||||
|         // 目的,为了设置 UserTypeEnum.ADMIN.getValue() | ||||
|         return convert0(bean).setUserType(UserTypeEnum.ADMIN.getValue()); | ||||
|     } | ||||
|  | ||||
|     default SysAuthPermissionInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) { | ||||
|         return SysAuthPermissionInfoRespVO.builder() | ||||
| @@ -39,10 +45,6 @@ public interface SysAuthConvert { | ||||
|  | ||||
|     SysAuthMenuRespVO convertTreeNode(SysMenuDO menu); | ||||
|  | ||||
|     LoginUser convert(SysUserProfileUpdateReqVO reqVO); | ||||
|  | ||||
|     LoginUser convert(SysUserProfileUpdatePasswordReqVO reqVO); | ||||
|  | ||||
|     /** | ||||
|      * 将菜单列表,构建成菜单树 | ||||
|      * | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.convert.auth; | ||||
|  | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import org.mapstruct.Mapper; | ||||
| import org.mapstruct.factory.Mappers; | ||||
|  | ||||
|   | ||||
| @@ -1,68 +0,0 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||||
| import cn.iocoder.yudao.framework.security.core.LoginUser; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; | ||||
| import com.baomidou.mybatisplus.annotation.IdType; | ||||
| import com.baomidou.mybatisplus.annotation.TableId; | ||||
| import com.baomidou.mybatisplus.annotation.TableName; | ||||
| import lombok.Builder; | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
|  | ||||
| import java.util.Date; | ||||
|  | ||||
| /** | ||||
|  * 在线用户表 | ||||
|  * | ||||
|  * 我们已经将 {@link LoginUser} 缓存在 Redis 当中。 | ||||
|  * 这里额外存储在线用户到 MySQL 中,目的是为了方便管理界面可以灵活查询。 | ||||
|  * 同时,通过定时轮询 SysUserSessionDO 表,可以主动删除 Redis 的缓存,因为 Redis 的过期删除是延迟的。 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @TableName(value = "sys_user_session", autoResultMap = true) | ||||
| @Data | ||||
| @Builder | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| public class SysUserSessionDO extends BaseDO { | ||||
|  | ||||
|     /** | ||||
|      * 会话编号, 即 sessionId | ||||
|      */ | ||||
|     @TableId(type = IdType.INPUT) | ||||
|     private String id; | ||||
|     /** | ||||
|      * 用户编号 | ||||
|      * | ||||
|      * 关联 {@link SysUserDO#getId()} | ||||
|      */ | ||||
|     private Long userId; | ||||
|     /** | ||||
|      * 用户类型 | ||||
|      * | ||||
|      * 枚举 {@link UserTypeEnum} | ||||
|      */ | ||||
|     private Integer userType; | ||||
|  | ||||
|     /** | ||||
|      * 用户账号 | ||||
|      * | ||||
|      * 冗余,因为账号可以变更 | ||||
|      */ | ||||
|     private String username; | ||||
|  | ||||
|     /** | ||||
|      * 用户 IP | ||||
|      */ | ||||
|     private String userIp; | ||||
|     /** | ||||
|      * 浏览器 UA | ||||
|      */ | ||||
|     private String userAgent; | ||||
|     /** | ||||
|      * 会话超时时间 | ||||
|      */ | ||||
|     private Date sessionTimeout; | ||||
|  | ||||
| } | ||||
| @@ -1,10 +1,10 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth; | ||||
|  | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
|  | ||||
| import java.util.Collection; | ||||
| @@ -23,4 +23,5 @@ public interface SysUserSessionMapper extends BaseMapperX<SysUserSessionDO> { | ||||
|     default List<SysUserSessionDO> selectListBySessionTimoutLt() { | ||||
|         return selectList(new QueryWrapperX<SysUserSessionDO>().lt("session_timeout",new Date())); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -15,10 +15,6 @@ import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.S | ||||
|  */ | ||||
| public interface SysRedisKeyConstants { | ||||
|  | ||||
|     RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登录用户的缓存", | ||||
|             "login_user:%s", // 参数为 sessionId | ||||
|             STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); | ||||
|  | ||||
|     RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存", | ||||
|             "captcha_code:%s", // 参数为 uuid | ||||
|             STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); | ||||
|   | ||||
| @@ -1,47 +0,0 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.dal.redis.auth; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.security.core.LoginUser; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; | ||||
| import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||||
| import org.springframework.data.redis.core.StringRedisTemplate; | ||||
| import org.springframework.stereotype.Repository; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import java.time.Duration; | ||||
|  | ||||
| import static cn.iocoder.yudao.adminserver.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER; | ||||
|  | ||||
| /** | ||||
|  * {@link LoginUser} 的 RedisDAO | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Repository | ||||
| public class SysLoginUserRedisDAO { | ||||
|  | ||||
|     @Resource | ||||
|     private StringRedisTemplate stringRedisTemplate; | ||||
|     @Resource | ||||
|     private SysUserSessionService sysUserSessionService; // TODO 芋艿:得看看怎么拿出去 | ||||
|  | ||||
|     public LoginUser get(String sessionId) { | ||||
|         String redisKey = formatKey(sessionId); | ||||
|         return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), LoginUser.class); | ||||
|     } | ||||
|  | ||||
|     public void set(String sessionId, LoginUser loginUser) { | ||||
|         String redisKey = formatKey(sessionId); | ||||
|         stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(loginUser), | ||||
|                 Duration.ofMillis(sysUserSessionService.getSessionTimeoutMillis())); | ||||
|     } | ||||
|  | ||||
|     public void delete(String sessionId) { | ||||
|         String redisKey = formatKey(sessionId); | ||||
|         stringRedisTemplate.delete(redisKey); | ||||
|     } | ||||
|  | ||||
|     private static String formatKey(String sessionId) { | ||||
|         return String.format(LOGIN_USER.getKeyTemplate(), sessionId); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,9 +1,8 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.service.auth; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.security.core.LoginUser; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
|  | ||||
| /** | ||||
|  * 在线用户 Session Service 接口 | ||||
| @@ -12,46 +11,6 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSe | ||||
|  */ | ||||
| public interface SysUserSessionService { | ||||
|  | ||||
|     /** | ||||
|      * 创建在线用户 Session | ||||
|      * | ||||
|      * @param loginUser 登录用户 | ||||
|      * @param userIp 用户 IP | ||||
|      * @param userAgent 用户 UA | ||||
|      * @return Session 编号 | ||||
|      */ | ||||
|     String createUserSession(LoginUser loginUser, String userIp, String userAgent); | ||||
|  | ||||
|     /** | ||||
|      * 刷新在线用户 Session 的更新时间 | ||||
|      * | ||||
|      * @param sessionId Session 编号 | ||||
|      * @param loginUser 登录用户 | ||||
|      */ | ||||
|     void refreshUserSession(String sessionId, LoginUser loginUser); | ||||
|  | ||||
|     /** | ||||
|      * 删除在线用户 Session | ||||
|      * | ||||
|      * @param sessionId Session 编号 | ||||
|      */ | ||||
|     void deleteUserSession(String sessionId); | ||||
|  | ||||
|     /** | ||||
|      * 获得 Session 编号对应的在线用户 | ||||
|      * | ||||
|      * @param sessionId Session 编号 | ||||
|      * @return 在线用户 | ||||
|      */ | ||||
|     LoginUser getLoginUser(String sessionId); | ||||
|  | ||||
|     /** | ||||
|      * 获得 Session 超时时间,单位:毫秒 | ||||
|      * | ||||
|      * @return 超时时间 | ||||
|      */ | ||||
|     Long getSessionTimeoutMillis(); | ||||
|  | ||||
|     /** | ||||
|      * 获得在线用户分页列表 | ||||
|      * | ||||
| @@ -66,4 +25,5 @@ public interface SysUserSessionService { | ||||
|      * @return {@link Long } 移出的超时用户数量 | ||||
|      **/ | ||||
|     long clearSessionTimeout(); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -11,13 +11,13 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO | ||||
| import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||||
| @@ -67,7 +67,7 @@ public class SysAuthServiceImpl implements SysAuthService { | ||||
|     @Resource | ||||
|     private SysLoginLogService loginLogService; | ||||
|     @Resource | ||||
|     private SysUserSessionService userSessionService; | ||||
|     private SysUserSessionCoreService userSessionCoreService; | ||||
|     @Resource | ||||
|     private SysSocialService socialService; | ||||
|  | ||||
| @@ -107,7 +107,7 @@ public class SysAuthServiceImpl implements SysAuthService { | ||||
|         loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表 | ||||
|  | ||||
|         // 缓存登录用户到 Redis 中,返回 sessionId 编号 | ||||
|         return userSessionService.createUserSession(loginUser, userIp, userAgent); | ||||
|         return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); | ||||
|     } | ||||
|  | ||||
|     private void verifyCaptcha(String username, String captchaUUID, String captchaCode) { | ||||
| @@ -214,7 +214,7 @@ public class SysAuthServiceImpl implements SysAuthService { | ||||
|         socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser); | ||||
|  | ||||
|         // 缓存登录用户到 Redis 中,返回 sessionId 编号 | ||||
|         return userSessionService.createUserSession(loginUser, userIp, userAgent); | ||||
|         return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -231,7 +231,7 @@ public class SysAuthServiceImpl implements SysAuthService { | ||||
|         socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser); | ||||
|  | ||||
|         // 缓存登录用户到 Redis 中,返回 sessionId 编号 | ||||
|         return userSessionService.createUserSession(loginUser, userIp, userAgent); | ||||
|         return userSessionCoreService.createUserSession(loginUser, userIp, userAgent); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -247,12 +247,12 @@ public class SysAuthServiceImpl implements SysAuthService { | ||||
|     @Override | ||||
|     public void logout(String token) { | ||||
|         // 查询用户信息 | ||||
|         LoginUser loginUser = userSessionService.getLoginUser(token); | ||||
|         LoginUser loginUser = userSessionCoreService.getLoginUser(token); | ||||
|         if (loginUser == null) { | ||||
|             return; | ||||
|         } | ||||
|         // 删除 session | ||||
|         userSessionService.deleteUserSession(token); | ||||
|         userSessionCoreService.deleteUserSession(token); | ||||
|         // 记录登出日子和 | ||||
|         this.createLogoutLog(loginUser.getUsername()); | ||||
|     } | ||||
| @@ -271,7 +271,7 @@ public class SysAuthServiceImpl implements SysAuthService { | ||||
|     @Override | ||||
|     public LoginUser verifyTokenAndRefresh(String token) { | ||||
|         // 获得 LoginUser | ||||
|         LoginUser loginUser = userSessionService.getLoginUser(token); | ||||
|         LoginUser loginUser = userSessionCoreService.getLoginUser(token); | ||||
|         if (loginUser == null) { | ||||
|             return null; | ||||
|         } | ||||
| @@ -283,7 +283,7 @@ public class SysAuthServiceImpl implements SysAuthService { | ||||
|     private void refreshLoginUserCache(String token, LoginUser loginUser) { | ||||
|         // 每 1/3 的 Session 超时时间,刷新 LoginUser 缓存 | ||||
|         if (System.currentTimeMillis() - loginUser.getUpdateTime().getTime() < | ||||
|                 userSessionService.getSessionTimeoutMillis() / 3) { | ||||
|                 userSessionCoreService.getSessionTimeoutMillis() / 3) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
| @@ -296,7 +296,7 @@ public class SysAuthServiceImpl implements SysAuthService { | ||||
|         // 刷新 LoginUser 缓存 | ||||
|         loginUser.setDeptId(user.getDeptId()); | ||||
|         loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); | ||||
|         userSessionService.refreshUserSession(token, loginUser); | ||||
|         userSessionCoreService.refreshUserSession(token, loginUser); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,35 +1,32 @@ | ||||
| package cn.iocoder.yudao.adminserver.modules.system.service.auth.impl; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.IdUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.dal.redis.auth.SysLoginUserRedisDAO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; | ||||
| import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; | ||||
| import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; | ||||
| import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; | ||||
| import cn.iocoder.yudao.framework.security.config.SecurityProperties; | ||||
| import cn.iocoder.yudao.framework.security.core.LoginUser; | ||||
| import com.google.common.collect.Lists; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import java.time.Duration; | ||||
| import java.util.*; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | ||||
| import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; | ||||
|  | ||||
| /** | ||||
|  * 在线用户 Session Service 实现类 | ||||
| @@ -40,10 +37,6 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; | ||||
| @Service | ||||
| public class SysUserSessionServiceImpl implements SysUserSessionService { | ||||
|  | ||||
|     @Resource | ||||
|     private SecurityProperties securityProperties; | ||||
|     @Resource | ||||
|     private SysLoginUserRedisDAO loginUserRedisDAO; | ||||
|     @Resource | ||||
|     private SysUserSessionMapper userSessionMapper; | ||||
|     @Resource | ||||
| @@ -51,54 +44,8 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { | ||||
|     @Resource | ||||
|     private SysLoginLogService loginLogService; | ||||
|  | ||||
|     @Override | ||||
|     public String createUserSession(LoginUser loginUser, String userIp, String userAgent) { | ||||
|         // 生成 Session 编号 | ||||
|         String sessionId = generateSessionId(); | ||||
|         // 写入 Redis 缓存 | ||||
|         loginUser.setUpdateTime(new Date()); | ||||
|         loginUserRedisDAO.set(sessionId, loginUser); | ||||
|         // 写入 DB 中 | ||||
|         SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId) | ||||
|                 .userId(loginUser.getId()).userType(UserTypeEnum.ADMIN.getValue()) | ||||
|                 .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername()) | ||||
|                 .sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))) | ||||
|                 .build(); | ||||
|         userSessionMapper.insert(userSession); | ||||
|         // 返回 Session 编号 | ||||
|         return sessionId; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void refreshUserSession(String sessionId, LoginUser loginUser) { | ||||
|         // 写入 Redis 缓存 | ||||
|         loginUser.setUpdateTime(new Date()); | ||||
|         loginUserRedisDAO.set(sessionId, loginUser); | ||||
|         // 更新 DB 中 | ||||
|         SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build(); | ||||
|         updateObj.setUsername(loginUser.getUsername()); | ||||
|         updateObj.setUpdateTime(new Date()); | ||||
|         updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis()))); | ||||
|         userSessionMapper.updateById(updateObj); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void deleteUserSession(String sessionId) { | ||||
|         // 删除 Redis 缓存 | ||||
|         loginUserRedisDAO.delete(sessionId); | ||||
|         // 删除 DB 记录 | ||||
|         userSessionMapper.deleteById(sessionId); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public LoginUser getLoginUser(String sessionId) { | ||||
|         return loginUserRedisDAO.get(sessionId); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Long getSessionTimeoutMillis() { | ||||
|         return securityProperties.getSessionTimeout().toMillis(); | ||||
|     } | ||||
|     @Resource | ||||
|     private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO; | ||||
|  | ||||
|     @Override | ||||
|     public PageResult<SysUserSessionDO> getUserSessionPage(SysUserSessionPageReqVO reqVO) { | ||||
| @@ -113,18 +60,20 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { | ||||
|         return userSessionMapper.selectPage(reqVO, userIds); | ||||
|     } | ||||
|  | ||||
|     // TODO @芋艿:优化下该方法 | ||||
|     @Override | ||||
|     public long clearSessionTimeout() { | ||||
|         // 获取db里已经超时的用户列表 | ||||
|         List<SysUserSessionDO> sessionTimeoutDOS = userSessionMapper.selectListBySessionTimoutLt(); | ||||
|         Map<String, SysUserSessionDO> timeoutSessionDOMap = sessionTimeoutDOS | ||||
|                 .stream() | ||||
|                 .filter(sessionDO -> loginUserRedisDAO.get(sessionDO.getId()) == null) | ||||
|                 .filter(sessionDO -> loginUserCoreRedisDAO.get(sessionDO.getId()) == null) | ||||
|                 .collect(Collectors.toMap(SysUserSessionDO::getId, o -> o)); | ||||
|         // 确认已经超时,按批次移出在线用户列表 | ||||
|         if (CollUtil.isNotEmpty(timeoutSessionDOMap)) { | ||||
|             Lists.partition(new ArrayList<>(timeoutSessionDOMap.keySet()), 100).forEach(userSessionMapper::deleteBatchIds); | ||||
|             //记录用户超时退出日志 | ||||
|             Lists.partition(new ArrayList<>(timeoutSessionDOMap.keySet()), 100) | ||||
|                     .forEach(userSessionMapper::deleteBatchIds); | ||||
|             // 记录用户超时退出日志 | ||||
|             createTimeoutLogoutLog(timeoutSessionDOMap.values()); | ||||
|         } | ||||
|         return timeoutSessionDOMap.size(); | ||||
| @@ -143,13 +92,4 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 生成 Session 编号,目前采用 UUID 算法 | ||||
|      * | ||||
|      * @return Session 编号 | ||||
|      */ | ||||
|     private static String generateSessionId() { | ||||
|         return IdUtil.fastSimpleUUID(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -31,7 +31,7 @@ mybatis-plus: | ||||
|       logic-delete-value: 1 # 逻辑已删除值(默认为 1) | ||||
|       logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) | ||||
|   mapper-locations: classpath*:mapper/*.xml | ||||
|   type-aliases-package: ${yudao.info.base-package}.modules.*.dal.dataobject | ||||
|   type-aliases-package: ${yudao.info.base-package}.modules.*.dal.dataobject, ${yudao.core-service.base-package}.modules.*.dal.dataobject | ||||
|  | ||||
| --- #################### 芋道相关配置 #################### | ||||
|  | ||||
| @@ -39,6 +39,8 @@ yudao: | ||||
|   info: | ||||
|     version: 1.0.0 | ||||
|     base-package: cn.iocoder.yudao.adminserver | ||||
|   core-service: | ||||
|     base-package: cn.iocoder.yudao.coreservice | ||||
|   web: | ||||
|     api-prefix: /api | ||||
|     controller-package: ${yudao.info.base-package} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV