本文最后更新于 2026年4月27日 晚上
删除userType字段并修改被这个字段所影响的类和接口
起因
我在开发前台系统中的时候在用户表中有一个 userType 字段用于区分用户类型的
但是在后台管理系统中使用了 role 和 user_role 表来管理用户类型
这一来就导致了 userType 字段和那两个表有冲突了
这必须要改
不能让这两个重复功能的东西
改呗删字段该功能
将用户和角色之间的绑定改用 SysRole 和 SysUserRole 来提供支持
代码修改
首先将 SysUser 里的 userType 字段删除
这里不贴代码了
然后给 CommentVo 和 SysUserInfoVo 添加角色字段列表(list roles)来给前端判断用户类型
CommentVo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
@Data @AllArgsConstructor @NoArgsConstructor @ApiModel(description = "评论响应对象") public class CommentVo { @ApiModelProperty(value = "评论ID") private Long id; @ApiModelProperty(value = "评论类型(0-文章评论,1-友链评论,2-留言板评论)") private String type; @ApiModelProperty(value = "文章ID") private Long articleId; @ApiModelProperty(value = "用户ID") private Long userId; @ApiModelProperty(value = "用户角色列表") private List<String> roles; @ApiModelProperty(value = "昵称") private String nickname; @ApiModelProperty(value = "头像URL") private String avatar; @ApiModelProperty(value = "评论内容") private String content; @ApiModelProperty(value = "根评论ID") private Long rootId; @ApiModelProperty(value = "回复目标评论ID") private Long replyToCommentId; @ApiModelProperty(value = "回复目标评论的用户昵称") private String replyToCommentNickname; @ApiModelProperty(value = "回复目标评论的用户角色列表") private List<String> replyToCommentRoles; @ApiModelProperty(value = "点赞数") private Integer likeCount; @ApiModelProperty(value = "创建时间") private Date createTime; @ApiModelProperty(value = "子评论列表") private List<CommentVo> children; }
|
SysUserInfoVo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @Data @Accessors(chain = true) @ApiModel(description = "前台用户信息响应对象") public class SysUserInfoVo { @ApiModelProperty(value = "用户ID") private Long id; @ApiModelProperty(value = "昵称") private String nickname; @ApiModelProperty(value = "头像URL") private String avatar; @ApiModelProperty(value = "手机号") private String phone; @ApiModelProperty(value = "性别(0-男,1-女,2-隐藏)") private String sex; @ApiModelProperty(value = "邮箱") private String email; @ApiModelProperty(value = "用户角色列表") private List<String> roles; }
|
然后在 SystemConstants 里添加一些用户类型常量
1 2 3 4 5 6 7 8 9 10 11 12 13
| public static final String MENU_TYPE_B = "B";
public static final String ROLE_IS_ADMIN = "admin";
public static final String ROLE_IS_USER = "user";
public static final String ROLE_IS_VISITOR = "visitor";
|
剩下的就有关的服务类中的接口实现方法的修改了
BlogLoginServiceImpl 里的 login 方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| @Override public ResponseResult login(LoginDto dto) { if (!StringUtils.hasText(dto.getUsername())) { throw new SystemException(AppHttpCodeEnum.REQUIRE_USERNAME); } SysUser sysUser = BeanCopyUtils.copyBean(dto, SysUser.class);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(sysUser.getUsername(), sysUser.getPassword()); Authentication authenticate = authenticationManager.authenticate(authenticationToken); if (Objects.isNull(authenticate)) { throw new RuntimeException("用户名或密码错误!"); } LoginUser loginUser = (LoginUser) authenticate.getPrincipal(); String userId = loginUser.getSysUser().getId().toString(); String jwt = JwtUtil.createJWT(userId); redisCache.setCacheObject("blogLogin:" + userId, loginUser, JwtUtil.JWT_TTL.intValue(), TimeUnit.MILLISECONDS);
SysUser sysUser1 = loginUser.getSysUser(); SysUserInfoVo sysUserInfoVo = BeanCopyUtils.copyBean(sysUser1, SysUserInfoVo.class); if (!StringUtils.hasText(sysUserInfoVo.getNickname())) { sysUserInfoVo.setNickname(sysUser1.getUsername()); } if (!StringUtils.hasText(sysUserInfoVo.getAvatar())) { sysUserInfoVo.setAvatar(GravatarUtils.getGravatarUrl(sysUser1.getEmail())); } List<String> roles = sysRoleMapper.selectRoleCodeByUserId(sysUser1.getId()); if (roles == null || roles.isEmpty()) { roles = Collections.emptyList(); } sysUserInfoVo.setRoles(roles); BlogUserLoginVo vo = new BlogUserLoginVo(jwt, sysUserInfoVo); return ResponseResult.okResult(vo); }
|
BlogLoginServiceImpl 里的 generateLoginResponse 私有方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| private ResponseResult generateLoginResponse(SysUser sysUser) { LoginUser loginUser = new LoginUser(sysUser); String userId = sysUser.getId().toString(); String jwt = JwtUtil.createJWT(userId); redisCache.setCacheObject("blogLogin:" + userId, loginUser, JwtUtil.JWT_TTL.intValue(), TimeUnit.MILLISECONDS); SysUserInfoVo sysUserInfoVo = BeanCopyUtils.copyBean(sysUser, SysUserInfoVo.class); if (!StringUtils.hasText(sysUserInfoVo.getNickname())) { sysUserInfoVo.setNickname(sysUser.getUsername()); } if (!StringUtils.hasText(sysUserInfoVo.getAvatar())) { sysUserInfoVo.setAvatar(GravatarUtils.getGravatarUrl(sysUser.getEmail())); } List<String> roles = sysRoleMapper.selectRoleCodeByUserId(sysUser.getId()); if (roles == null || roles.isEmpty()) { roles = Collections.emptyList(); } sysUserInfoVo.setRoles(roles); BlogUserLoginVo vo = new BlogUserLoginVo(jwt, sysUserInfoVo); return ResponseResult.okResult(vo); }
|
CommentServiceImpl 里的 addComment 方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| @Override public ResponseResult addComment(AddCommentDto addCommentDto) { if (!StringUtils.hasText(addCommentDto.getContent())) { return ResponseResult.errorResult(AppHttpCodeEnum.CONTENT_NOT_NULL); }
String type = addCommentDto.getType(); if (SystemConstants.COMMENT_TYPE_ARTICLE.equals(type)) { Long articleId = addCommentDto.getArticleId(); if (articleId == null) { return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), "文章ID不能为空"); } Article article = articleService.getById(articleId); if (article == null) { return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), "文章不存在"); } if (!SystemConstants.ALLOW_COMMENT.equals(article.getIsComment())) { return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), "该文章不允许评论"); } }
Comment comment = BeanCopyUtils.copyBean(addCommentDto, Comment.class); if (comment.getRootId() == null) { comment.setRootId(-1L); } if (SystemConstants.COMMENT_TYPE_ARTICLE.equals(type) || SystemConstants.COMMENT_TYPE_LINK.equals(type)) { if (!SecurityUtils.isLogin()) { return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN); } LoginUser loginUser = SecurityUtils.getLoginUser(); SysUser sysUser = loginUser.getSysUser(); comment.setUserId(sysUser.getId()); comment.setNickname(sysUser.getNickname()); comment.setEmail(sysUser.getEmail()); } else if (SystemConstants.COMMENT_TYPE_MESSAGE.equals(type)) { if (SecurityUtils.isLogin()) { LoginUser loginUser = SecurityUtils.getLoginUser(); SysUser sysUser = loginUser.getSysUser(); comment.setUserId(sysUser.getId()); comment.setNickname(sysUser.getNickname()); comment.setEmail(sysUser.getEmail()); } else { if (!StringUtils.hasText(addCommentDto.getNickname())) { return ResponseResult.errorResult(AppHttpCodeEnum.NICKNAME_NOT_NULL); } if (!StringUtils.hasText(addCommentDto.getEmail())) { return ResponseResult.errorResult(AppHttpCodeEnum.EMAIL_NOT_NULL); } } }
if (comment.getUserId() != null) { SysUser sysUser = sysUserMapper.selectById(comment.getUserId()); if (sysUser != null && StringUtils.hasText(sysUser.getAvatar())) { comment.setAvatar(sysUser.getAvatar()); } else { comment.setAvatar(GravatarUtils.getCommentPreviewAvatarUrl(comment.getEmail())); } } else { comment.setAvatar(GravatarUtils.getCommentPreviewAvatarUrl(comment.getEmail())); } comment.setLikeCount(SystemConstants.DEFAULT_COMMENT_LIKES); comment.setStatus(SystemConstants.COMMENT_STATUS_NORMAL); comment.setDelFlag(SystemConstants.DEFAULT_NUMBER_OF_COMMENTS); comment.setCreateTime(new Date());
save(comment); emailService.sendCommentNotificationByEmail(comment);
return ResponseResult.okResult(); }
|
CommentServiceImpl 里的 toCommentVoList 私有方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| private List<CommentVo> toCommentVoList(List<Comment> comments) { List<CommentVo> voList = BeanCopyUtils.copyBeanList(comments, CommentVo.class); for (int i = 0; i < voList.size(); i++) { CommentVo vo = voList.get(i); Comment original = comments.get(i); if (original.getUserId() != null) { SysUser sysUser = sysUserMapper.selectById(original.getUserId()); if (sysUser != null) { vo.setAvatar(sysUser.getAvatar()); vo.setNickname(sysUser.getNickname()); List<String> roles = sysRoleMapper.selectRoleCodeByUserId(sysUser.getId()); vo.setRoles(roles != null && !roles.isEmpty() ? roles : Collections.emptyList()); } else { vo.setAvatar(original.getAvatar()); vo.setRoles(Collections.emptyList()); } } else { vo.setAvatar(original.getAvatar()); if (StringUtils.hasText(original.getEmail()) && original.getEmail().equalsIgnoreCase(SystemConstants.BLOGGER_EMAIL)) { vo.setRoles(Collections.singletonList(SystemConstants.ROLE_IS_ADMIN)); } else { vo.setRoles(Collections.emptyList()); } } if (vo.getReplyToCommentId() != null && vo.getReplyToCommentId() > 0) { Comment replyTo = getById(vo.getReplyToCommentId()); if (replyTo != null) { if (replyTo.getUserId() != null) { SysUser replyToSysUser = sysUserMapper.selectById(replyTo.getUserId()); if (replyToSysUser != null) { vo.setReplyToCommentNickname(replyToSysUser.getNickname()); List<String> replyToRoles = sysRoleMapper.selectRoleCodeByUserId(replyToSysUser.getId()); vo.setReplyToCommentRoles(replyToRoles != null && !replyToRoles.isEmpty() ? replyToRoles : Collections.emptyList()); } else { vo.setReplyToCommentNickname(replyTo.getNickname()); vo.setReplyToCommentRoles(Collections.emptyList()); } } else { vo.setReplyToCommentNickname(replyTo.getNickname()); if (StringUtils.hasText(replyTo.getEmail()) && replyTo.getEmail().equalsIgnoreCase(SystemConstants.BLOGGER_EMAIL)) { vo.setReplyToCommentRoles(Collections.singletonList(SystemConstants.ROLE_IS_ADMIN)); } else { vo.setReplyToCommentRoles(Collections.singletonList(SystemConstants.ROLE_IS_VISITOR)); } } } } } return voList; }
|
SysUserServiceImpl 里的 userInfo 方法
这里避免方法体里有过多的代码,将查询用户信息的代码提取出来封装成一个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| @Override public ResponseResult userInfo() { Long userId = SecurityUtils.getUserId(); SysUser byId = getById(userId); SysUserInfoVo vo = BeanCopyUtils.copyBean(byId, SysUserInfoVo.class); List<String> roles = getUserRoles(userId); vo.setRoles(roles); return ResponseResult.okResult(vo); }
private List<String> getUserRoles(Long userId) { LambdaQueryWrapper<SysUserRole> userRoleWrapper = new LambdaQueryWrapper<>(); userRoleWrapper.eq(SysUserRole::getUserId, userId); List<SysUserRole> userRoles = sysUserRoleMapper.selectList(userRoleWrapper);
if (userRoles == null || userRoles.isEmpty()) { return new ArrayList<>(); }
List<Long> roleIds = userRoles.stream() .map(SysUserRole::getRoleId) .collect(Collectors.toList());
List<SysRole> sysRoles = sysRoleMapper.selectBatchIds(roleIds);
return sysRoles.stream() .map(SysRole::getRoleCode) .collect(Collectors.toList()); }
private void assignDefaultRole(Long userId) { try { LambdaQueryWrapper<SysRole> roleQueryWrapper = new LambdaQueryWrapper<>(); roleQueryWrapper.eq(SysRole::getRoleCode, SystemConstants.ROLE_IS_USER) .last("LIMIT 1"); SysRole userRole = sysRoleMapper.selectOne(roleQueryWrapper);
if (userRole != null) { SysUserRole sysUserRole = new SysUserRole(); sysUserRole.setUserId(userId); sysUserRole.setRoleId(userRole.getId()); sysUserRoleMapper.insert(sysUserRole); log.info("为用户 {} 分配默认角色 {} 成功", userId, userRole.getName()); } else { log.warn("未找到默认角色(role_code='user'),用户 {} 未分配角色", userId); } } catch (Exception e) { log.error("为用户 {} 分配默认角色失败: {}", userId, e.getMessage(), e); } }
|
SysUserServiceImpl 里的 getBloggerInfo 方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| @Override public ResponseResult getBloggerInfo() { LambdaQueryWrapper<SysRole> roleQueryWrapper = new LambdaQueryWrapper<>(); roleQueryWrapper.eq(SysRole::getRoleCode, SystemConstants.ROLE_IS_ADMIN) .last("LIMIT 1"); SysRole adminRole = sysRoleMapper.selectOne(roleQueryWrapper); if (adminRole == null) { return ResponseResult.errorResult(AppHttpCodeEnum.SELECT_ERROR, "未找到管理员角色"); } LambdaQueryWrapper<SysUserRole> userRoleQueryWrapper = new LambdaQueryWrapper<>(); userRoleQueryWrapper.eq(SysUserRole::getRoleId, adminRole.getId()) .last("LIMIT 1"); SysUserRole userRole = sysUserRoleMapper.selectOne(userRoleQueryWrapper); if (userRole == null) { return ResponseResult.errorResult(AppHttpCodeEnum.SELECT_ERROR, "未找到博主信息"); } SysUser blogger = sysUserMapper.selectById(userRole.getUserId()); if (blogger == null) { return ResponseResult.errorResult(AppHttpCodeEnum.SELECT_ERROR, "未找到博主信息"); } BloggerInfoVo vo = new BloggerInfoVo( blogger.getNickname(), blogger.getAvatar() ); return ResponseResult.okResult(vo); }
|
用户注册时也给用户设置默认的角色
这样这个问题就修好了
又是一个数据表导致的问题
PS:该系列只做为作者学习开发项目做的笔记用
不一定符合读者来学习,仅供参考
预告
后续会记录博客的开发过程
每次学习会做一份笔记来进行发表
“一花一世界,一叶一菩提”
版权所有 © 2026 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/