资讯详情

【项目】【在线判题系统】c端:个人中心

📅 2026/10/17 6:21:08 | 华诺云谱 👁 阅读
【项目】【在线判题系统】c端:个人中心
目录一、功能分析二、controller三、service四、缓存工具类五、拦截器修改六、tokenService修改一、功能分析个人中心我们要支持当前登录用户的信息展示以及对信息的编辑。并且展示获得用户信息详情的时候还需要加入redis缓存。二、controlleroj-modules/oj-friend/src/main/java/com/yj/friend/controller/user/UserController.java接口/** * 获取当前用户详情 * return */GetMapping(/detail)publicRUserVOdetail(){returnR.success(userService.detail());}/** * 编辑当前用户信息 * param userUpdateDTO * return */PutMapping(/edit)publicRVoidedit(RequestBodyUserUpdateDTOuserUpdateDTO){returntoR(userService.edit(userUpdateDTO));}oj-modules/oj-friend/src/main/java/com/yj/friend/domain/user/dto/UserUpdateDTO.java接收参数类packagecom.yj.friend.domain.user.dto;importlombok.Getter;importlombok.Setter;GetterSetterpublicclassUserUpdateDTO{privateStringheadImage;privateStringnickName;privateIntegersex;privateStringschoolName;privateStringmajorName;privateStringphone;privateStringemail;privateStringwechat;privateStringintroduce;}oj-modules/oj-friend/src/main/java/com/yj/friend/domain/user/vo/UserVO.java返回类packagecom.yj.friend.domain.user.vo;importcom.fasterxml.jackson.databind.annotation.JsonSerialize;importcom.fasterxml.jackson.databind.ser.std.ToStringSerializer;importlombok.Getter;importlombok.Setter;GetterSetterpublicclassUserVO{JsonSerialize(usingToStringSerializer.class)privateLonguserId;privateStringnickName;privateStringheadImage;privateIntegersex;privateStringphone;privateStringcode;privateStringemail;privateStringwechat;privateStringschoolName;privateStringmajorName;privateStringintroduce;privateIntegerstatus;}三、serviceoj-modules/oj-friend/src/main/java/com/yj/friend/service/user/IUserService.java接口方法UserVOdetail();intedit(UserUpdateDTOuserUpdateDTO);oj-modules/oj-friend/src/main/java/com/yj/friend/service/user/impl/UserService.java实现类。获取用户详情的时候先从redis缓存中获取如果没有从mysql获取并存入缓存。更新用户信息的时候也是缓存与数据库都更新。OverridepublicUserVOdetail(){//从threadLocal中获取用户idLonguserIdThreadLocalUtil.get(Constants.USER_ID,Long.class);//校验用户id是否存在if(userIdnull){thrownewServiceException(ResultCodeEnum.FAILED_USER_NOT_EXISTS);}UserVOuserVOuserCacheManager.getUserById(userId);if(userVOnull){thrownewServiceException(ResultCodeEnum.FAILED_USER_NOT_EXISTS);}if(StrUtil.isNotEmpty(userVO.getHeadImage())){userVO.setHeadImage(downloadUrluserVO.getHeadImage());}returnuserVO;}Overridepublicintedit(UserUpdateDTOuserUpdateDTO){//从threadLocal中获取用户idLonguserIdThreadLocalUtil.get(Constants.USER_ID,Long.class);//校验用户id是否存在if(userIdnull){thrownewServiceException(ResultCodeEnum.FAILED_USER_NOT_EXISTS);}UserDOuserDOuserMapper.selectById(userId);if(userDOnull){thrownewServiceException(ResultCodeEnum.FAILED_USER_NOT_EXISTS);}//更新用户信息userDO.setNickName(userUpdateDTO.getNickName());userDO.setHeadImage(userUpdateDTO.getHeadImage());userDO.setSex(userUpdateDTO.getSex());userDO.setPhone(userUpdateDTO.getPhone());userDO.setWechat(userUpdateDTO.getWechat());userDO.setSchoolName(userUpdateDTO.getSchoolName());userDO.setMajorName(userUpdateDTO.getMajorName());userDO.setIntroduce(userUpdateDTO.getIntroduce());userMapper.updateById(userDO);//更新缓存userCacheManager.refreshUser(userDO);//更新tokentokenService.refreshLoginUser(userDO.getNickName(),userDO.getHeadImage(),ThreadLocalUtil.get(Constants.USER_KEY,String.class));//更新数据库returnuserMapper.updateById(userDO);}四、缓存工具类oj-modules/oj-friend/src/main/java/com/yj/friend/manage/UserCacheManager.java提供获取缓存与更新缓存的方法。packagecom.yj.friend.manage;importcn.hutool.core.bean.BeanUtil;importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.yj.common.core.constants.CacheConstants;importcom.yj.common.redis.service.RedisService;importcom.yj.friend.domain.user.UserDO;importcom.yj.friend.domain.user.vo.UserVO;importcom.yj.friend.mapper.user.UserMapper;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjava.util.concurrent.TimeUnit;ComponentpublicclassUserCacheManager{AutowiredprivateRedisServiceredisService;AutowiredprivateUserMapperuserMapper;publicUserVOgetUserById(LonguserId){//从缓存中获取用户信息StringuserKeygetUserKey(userId);UserVOuserVOredisService.getCacheObject(userKey,UserVO.class);if(userVO!null){//将缓存延长10minredisService.expire(userKey,CacheConstants.USER_EXP,TimeUnit.MINUTES);returnuserVO;}//缓存中不存在用户信息从数据库中查询UserDOuseruserMapper.selectOne(newLambdaQueryWrapperUserDO().select(UserDO::getUserId,UserDO::getNickName,UserDO::getHeadImage,UserDO::getSex,UserDO::getEmail,UserDO::getPhone,UserDO::getWechat,UserDO::getIntroduce,UserDO::getSchoolName,UserDO::getMajorName,UserDO::getStatus).eq(UserDO::getUserId,userId));//数据库中不存在用户信息if(usernull){returnnull;}//数据库中存在用户信息刷新用户缓存refreshUser(user);//将用户信息转换为用户VOuserVOnewUserVO();BeanUtil.copyProperties(user,userVO);returnuserVO;}//刷新用户缓存publicvoidrefreshUser(UserDOuser){//刷新用户缓存StringuserKeygetUserKey(user.getUserId());redisService.setCacheObject(userKey,user);//设置用户缓存有效期为10分钟redisService.expire(userKey,CacheConstants.USER_EXP,TimeUnit.MINUTES);}//获取用户缓存key//u:d:用户idprivateStringgetUserKey(LonguserId){returnCacheConstants.USER_DETAILuserId;}}五、拦截器修改oj-common/oj-common-security/src/main/java/com/yj/common/security/interceptor/TokenInterceptor.java加上userkeyOverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{StringtokengetToken(request);ClaimsclaimstokenService.getClaims(token,jwtSecret);LonguserIdtokenService.getUserId(claims);StringuserKeytokenService.getUserKey(token,jwtSecret);ThreadLocalUtil.set(Constants.USER_ID,userId);ThreadLocalUtil.set(Constants.USER_KEY,userKey);tokenService.extendToken(token,jwtSecret);returntrue;}六、tokenService修改oj-common/oj-common-security/src/main/java/com/yj/common/security/service/TokenService.javapublicvoidrefreshLoginUser(StringnickName,StringheadImage,StringuserKey){StringtokenKeygetTokenKey(userKey);LoginUserloginUserredisService.getCacheObject(tokenKey,LoginUser.class);loginUser.setNickName(nickName);loginUser.setHeadImage(headImage);redisService.setCacheObject(tokenKey,loginUser);}
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑