diff --git a/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java b/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java index 22d298e..2eb466a 100644 --- a/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java +++ b/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java @@ -235,6 +235,12 @@ public class SysUserServiceImpl implements SysUserService { // 执行更新 sysUserMapper.update(sysUser); + + // 判断更新的用户是否是当前登录用户,如果是则更新用户缓存 + Long currentUserId = loginUserCacheUtil.getCurrentUserId(); + if (currentUserId != null && currentUserId.equals(sysUserUpdateDto.getUserId())) { + updateUserCache(currentUserId, sysUser); + } }else { // 如果没有用户ID,创建新用户 SysUser sysUser = new SysUser(); @@ -1032,4 +1038,48 @@ public class SysUserServiceImpl implements SysUserService { return sessionDto; } + + /** + * 更新用户缓存(参照 currentUser 方法的逻辑) + * + * @param userId 用户ID + * @param updatedUser 更新后的用户信息 + */ + private void updateUserCache(Long userId, SysUser updatedUser) { + try { + // 获取当前登录用户的 token + String token = loginUserCacheUtil.getTokenFromRequest(); + if (token == null || token.isEmpty()) { + log.warn("无法获取当前用户的 token,跳过缓存更新"); + return; + } + + // 从 Redis 中获取 LoginUser 对象 + String loginUserJson = (String) redissonClient.getBucket("loginUser:" + token).get(); + if (loginUserJson == null || loginUserJson.isEmpty()) { + log.warn("Redis 中未找到 LoginUser 缓存,token: {}", token); + return; + } + + // 解析 JSON 字符串为 LoginUser 对象 + LoginUser loginUser = cn.hutool.json.JSONUtil.toBean(loginUserJson, LoginUser.class); + + // 验证是否是当前用户 + if (loginUser != null && loginUser.getUserInfo() != null && + loginUser.getUserInfo().getUserId().equals(userId)) { + + // 更新用户信息(密码设置为 null,不暴露给前端) + updatedUser.setPwd(null); + loginUser.setUserInfo(updatedUser); + + // 将更新后的 LoginUser 写回 Redis + redissonClient.getBucket("loginUser:" + token) + .set(cn.hutool.json.JSONUtil.toJsonStr(loginUser)); + + log.info("已更新用户 {} 的缓存信息", userId); + } + } catch (Exception e) { + log.error("更新用户缓存失败:{}", e.getMessage(), e); + } + } }