From bd252efd205e6a1455aab8d9ecdf65cb47864399 Mon Sep 17 00:00:00 2001 From: wangzhiwei Date: Tue, 7 Apr 2026 14:40:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(user):=20=E6=B7=BB=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=BC=93=E5=AD=98=E6=9B=B4=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在用户信息更新后判断是否为当前登录用户并更新缓存 - 实现updateUserCache方法同步Redis中的LoginUser信息 - 添加token验证确保只更新当前用户的缓存 - 避免密码信息泄露通过设置pwd为null - 添加异常处理和日志记录确保缓存更新稳定性 --- .../service/impl/SysUserServiceImpl.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) 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); + } + } }