隐藏页面特效

个人博客项目笔记_06

1|0Bug修正


之前Article中的commentCounts,viewCounts,weight 字段为int,会造成更新阅读次数的时候,将其余两个字段设为初始值0。

处理办法:将int改为Integer

package com.cherriesovo.blog.dao.pojo; import lombok.Data; @Data public class Article { public static final int Article_TOP = 1; public static final int Article_Common = 0; private Long id; private String title; private String summary; private Integer commentCounts; private Integer viewCounts; /** * 作者id */ private Long authorId; /** * 内容id */ private Long bodyId; /** *类别id */ private Long categoryId; /** * 置顶 */ private Integer weight; /** * 创建时间 */ private Long createDate; }
package com.cherriesovo.blog.vo; import lombok.Data; import java.util.List; @Data public class ArticleVo { private Long id; private String title; private String summary; private Integer commentCounts; private Integer viewCounts; private Integer weight; /** * 创建时间 */ private String createDate; private String author; private ArticleBodyVo body; private List<TagVo> tags; private CategoryVo category; }

2|01. 评论列表


CREATE TABLE `blog`.`ms_comment` ( `id` bigint(0) NOT NULL AUTO_INCREMENT, `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `create_date` bigint(0) NOT NULL, `article_id` int(0) NOT NULL, `author_id` bigint(0) NOT NULL, `parent_id` bigint(0) NOT NULL, `to_uid` bigint(0) NOT NULL, #给谁评论 `level` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, #第几层评论 PRIMARY KEY (`id`) USING BTREE, INDEX `article_id`(`article_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
package com.cherriesovo.blog.dao.pojo; import lombok.Data; //评论 @Data public class Comment { private Long id; private String content; private Long createDate; private Long articleId; private Long authorId; private Long parentId; private Long toUid; private Integer level; }

2|11.1 接口说明


接口url:/comments/article/{id}

请求方式:GET

请求参数:

参数名称 参数类型 说明
id long 文章id(路径参数)

返回数据:

{ "success": true, "code": 200, "msg": "success", "data": [ { "id": 53, "author": { "nickname": "李四", "avatar": "http://localhost:8080/static/img/logo.b3a48c0.png", "id": 1 }, "content": "写的好", "childrens": [ { "id": 54, "author": { "nickname": "李四", "avatar": "http://localhost:8080/static/img/logo.b3a48c0.png", "id": 1 }, "content": "111", "childrens": [], "createDate": "1973-11-26 08:52", "level": 2, "toUser": { "nickname": "李四", "avatar": "http://localhost:8080/static/img/logo.b3a48c0.png", "id": 1 } } ], "createDate": "1973-11-27 09:53", "level": 1, "toUser": null } ] }

2|21.2 Controller


package com.cherriesovo.blog.controller; import com.cherriesovo.blog.service.CommentsService; import com.cherriesovo.blog.vo.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("comments") public class CommentsController { @Autowired private CommentsService commentsService; @GetMapping("article/{id}") public Result comments(@PathVariable("id") Long articleId){ return commentsService.commentsByArticleId(articleId); } }

2|31.3 Service


package com.cherriesovo.blog.service; import com.cherriesovo.blog.vo.Result; public interface CommentsService { //根据文章id查询所有的评论列表 Result commentsByArticleId(Long articleId); }

private UserVo author; //作者信息

private List<CommentVo> childrens; //子评论 private String createDate; //时间 private UserVo toUser; //给谁评论 copy()中除了使用BeanUtils.copyProperties(comment,commentVo)之外,以上四个属性需要手动编写代码设置
package com.cherriesovo.blog.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cherriesovo.blog.dao.mapper.CommentMapper; import com.cherriesovo.blog.dao.pojo.Comment; import com.cherriesovo.blog.service.CommentsService; import com.cherriesovo.blog.service.SysUserService; import com.cherriesovo.blog.vo.CommentVo; import com.cherriesovo.blog.vo.Result; import com.cherriesovo.blog.vo.UserVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.joda.time.DateTime; import java.util.ArrayList; import java.util.List; @Service public class CommentsServiceImpl implements CommentsService { @Autowired private CommentMapper commentMapper; @Autowired private SysUserService sysUserService; public CommentVo copy(Comment comment){ CommentVo commentVo = new CommentVo(); BeanUtils.copyProperties(comment,commentVo); //1、时间格式化 commentVo.setCreateDate(new DateTime(comment.getCreateDate()).toString("yyyy-MM-dd HH:mm")); //2、作者信息 Long authorId = comment.getAuthorId(); UserVo userVo = this.sysUserService.findUserVoById(authorId); commentVo.setAuthor(userVo); //3、评论的评论(子评论) Integer level = comment.getLevel(); if(1 == level){ Long id = comment.getId(); List<CommentVo> commentVoList = findCommentsByParentId(id); commentVo.setChildrens(commentVoList); } //4、给谁评论 if (level > 1) { Long toUid = comment.getToUid(); UserVo toUserVo = this.sysUserService.findUserVoById(toUid); commentVo.setToUser(toUserVo); } return commentVo; } public List<CommentVo> copyList(List<Comment> commentList){ List<CommentVo> commentVoList = new ArrayList<>(); for (Comment comment : commentList) { commentVoList.add(copy(comment)); } return commentVoList; } //通过父id查询评论列表 private List<CommentVo> findCommentsByParentId(Long id) { LambdaQueryWrapper<Comment> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Comment::getParentId,id); queryWrapper.eq(Comment::getLevel,2); //SELECT * FROM comment WHERE parent_id = ? AND level = 2 List<Comment> comments = this.commentMapper.selectList(queryWrapper); return copyList(comments); } @Override public Result commentsByArticleId(Long articleId) { /* * 1、根据文章id查询评论列表 从coment表中查 * 2、根据作者的id查询作者的信息 * 3、判断如果 level=1 要去查询他有没有子评论 * 4、如果有,根据评论父id进行查询(parent_id) * */ LambdaQueryWrapper<Comment> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Comment::getArticleId,articleId); queryWrapper.eq(Comment::getLevel,1); //SELECT * FROM comment WHERE article_id = 'articleId' AND level = 1; List<Comment> comments = commentMapper.selectList(queryWrapper); return Result.success(copyList(comments)); } }

返回的数据:

package com.cherriesovo.blog.vo; import lombok.Data; import java.util.List; @Data public class CommentVo { private Long id; private UserVo author; private String content; private List<CommentVo> childrens; private String createDate; private Integer level; private UserVo toUser; }
package com.cherriesovo.blog.vo; import lombok.Data; @Data public class UserVo { private String nickname; private String avatar; private Long id; }

在SysUserService中提供 查询用户信息的服务:

UserVo findUserVoById(Long authorId);
@Override public UserVo findUserVoById(Long authorId) { SysUser sysUser = sysUserMapper.selectById(authorId); if (sysUser == null){ sysUser = new SysUser(); sysUser.setId(1L); sysUser.setAvatar("/static/img/logo.b3a48c0.png"); sysUser.setNickname("码神之路"); } UserVo userVo = new UserVo(); BeanUtils.copyProperties(sysUser,userVo); return userVo; }

3|02. 评论


3|12.1 接口说明


接口url:/comments/create/change

请求方式:POST

请求参数:

参数名称 参数类型 说明
articleId long 文章id
content string 评论内容
parent long 父评论id
toUserId long 被评论的用户id

返回数据:

{ "success": true, "code": 200, "msg": "success", "data": null }

3|22.2 加入到登录拦截器中


确保评论的时候用户已经登录。

WebMVCConfig:

@Override public void addInterceptors(InterceptorRegistry registry) { //当请求路径匹配到 /test 或 /comments/create/change 时,会触发 loginInterceptor 拦截器的拦截操作。 registry.addInterceptor(loginInterceptor) .addPathPatterns("/test") .addPathPatterns("/comments/create/change"); }

3|32.3 Controller


将评论请求的参数封装为一个类:

package com.cherriesovo.blog.vo.params; import lombok.Data; @Data public class CommentParam { private Long articleId; private String content; private Long parent; private Long toUserId; }

CommentsController:

@PostMapping("create/change") public Result comment(@RequestBody CommentParam commentParam){ return commentsService.comment(commentParam); }

3|42.4 Service


CommentsServiceImpl只干两件事:

  1. 获取以上字段
  2. 存储到数据库
public interface CommentsService { Result comment(CommentParam commentParam); }
@Service public class CommentsServiceImpl implements CommentsService { @Override public Result comment(CommentParam commentParam) { //UserThreadLocal 是一个基于 ThreadLocal 实现的工具类,用于在当前线程中存储和获取用户信息 SysUser sysUser = UserThreadLocal.get(); //拿到登录用户 Comment comment = new Comment(); //1、设置文章id comment.setArticleId(commentParam.getArticleId()); //2、设置作者id comment.setAuthorId(sysUser.getId()); //3、设置评论内容 comment.setContent(commentParam.getContent()); //4、设置评论时间 comment.setCreateDate(System.currentTimeMillis()); Long parent = commentParam.getParent(); //5、设置评论等级 if (parent == null || parent == 0) { comment.setLevel(1); }else{ comment.setLevel(2); } //6、设置父id,如果 parent 是 null,则将父级ID设置为 0,否则将其设置为 parent 的值 comment.setParentId(parent == null ? 0 : parent); //7、设置给谁评论 Long toUserId = commentParam.getToUserId(); comment.setToUid(toUserId == null ? 0 : toUserId); //最后把comment存储到数据库 this.commentMapper.insert(comment); return Result.success(null); } }

处理由于用户id过长导致前端无法解析造成跟评失败的bug

@Data public class CommentVo { //防止前端 精度损失 把id转为string // 分布式id 比较长,传到前端 会有精度损失,必须转为string类型 进行传输,就不会有问题了 @JsonSerialize(using = ToStringSerializer.class) private Long id; private UserVo author; private String content; private List<CommentVo> childrens; private String createDate; private Integer level; private UserVo toUser; }

Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'article_id' at row 1

解决方法:将数据库中的ms_comment表中的article_id类型修改为bigint


__EOF__

本文作者CherriesOvO
本文链接https://www.cnblogs.com/zyj3955/p/18129630.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   CherriesOvO  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2022-04-11 操作系统——第四章课后习题答案02
2021-04-11 《人月神话》读后感(第三四章)
2021-04-11 学习日报
点击右上角即可分享
微信分享提示