1、发布探店笔记
发布代码已写好,图片接口路径
目前项目是发布到本地的,修改上传文件地址,发布保存的是图片的地址了,上传图片的接口,好多地方再用,下面是发布成功的页面,会跳转到个人主页
返回首页也可以看到,因为没人点赞,所以它是排到最后的
实现查询探店笔记详情
点击图片查看详情,返回的应该包含笔记信息+用户信息,如果对某个用户感兴趣,可以去关注该用户
那如何在Blog类 返回用户信息呢?要么将用户对象封装,要么手动维护单个字段,
在Blog类里新添加两个字段,添加@TableField注解,表示该字段不属于t_blog表
/**
* 用户图标
*/
@TableField(exist = false)
private String icon;
/**
* 用户姓名
*/
@TableField(exist = false)
private String name;
BlogController类新添加接口,
- 因为是可变参数,利用@PahtVariable来接收
- 对象用:@RequestBody
- 如:
@PostMapping public Result saveBlog(@RequestBody Blog blog) { return blogService.saveBlog(blog); }
- 如:
- 普通参数用:@RequestParam
- 如:
@GetMapping("/of/user") public Result queryBlogByUserId( @RequestParam(value = "current", defaultValue = "1") Integer current, @RequestParam("id") Long id) {
- 如:
理论上将controller里不应该有业务,都是封装的才好
// 查询多条 热点探店
@GetMapping("/hot")
public Result queryHotBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
return blogService.queryHotBlog(current);
}
// 查询一条探店
@GetMapping("/{id}")
public Result queryBlogById(@PathVariable("id") Long id) {
return blogService.queryBlogById(id);
}
实现类 BlogServiceImpl 创建
点击Ctrl+Alt+M快捷键后,在出现的界面中输入方法的名字,然后点击Refactor按钮。
点击Refactor按钮后,就会将一段代码提取成方法。
mac:option+command+m
// 查多个
@Override
public Result queryHotBlog(Integer current) {
// 根据用户查询
Page<Blog> page = query()
.orderByDesc("liked")
.page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));
// 获取当前页数据
List<Blog> records = page.getRecords();
// 查询用户, 如下代码的意思就是遍历每一个list,然后维护用户的两个字段的值
/*records.forEach(blog -> {
queryBlogUser(blog);
});*/
// 上边注释代码就可以改成
records.forEach(this::queryBlogUser);
return Result.ok(records);
}
// 查一个
@Override
public Result queryBlogById(Long id) {
// 1.查询blog
Blog blog = getById(id);
if (blog == null) {
return Result.fail("笔记不存在!");
}
this.queryBlogUser(blog);
return Result.ok(blog);
}
ctrl + alt + m 快捷封装一段代码为方法
private void queryBlogUser(Blog blog) {
Long userId = blog.getUserId();
User user = userService.getById(userId);
blog.setName(user.getNickName());
blog.setIcon(user.getIcon());
}
以上代码即可实现点击笔记查看详情功能
二、点赞功能
实现一人一赞,此外,在查询界面的时候或者一进来就该实现获取是否点赞,并高亮显示
修改代码,Blog类新添加字段isLike
/**
* 是否点赞过了
*/
@TableField(exist = false)
private Boolean isLike;
修改BlogController代码
/**
* 点赞功能
* @param id
* @return
*/
@PutMapping("/like/{id}")
public Result likeBlog(@PathVariable("id") Long id) {
// 修改点赞数量,不能直接操作数据库修改,必须实现一人一赞要有校验功能
return blogService.likeBlog(id);
}
修改实现类,点赞或取消点赞后 修改库表并更新redis
@Override
public Result likeBlog(Long id) {
// 1.获取登录用户
Long userId = UserHolder.getUser().getId();
// 2.判断当前登录用户是否已经点赞
String key = BLOG_LIKED_KEY + id;
Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId);
if (BooleanUtil.isFalse(isMember)) {
// 3.如果未点赞,可以点赞
// 3.1.数据库点赞数 + 1
boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();
// 3.2.保存用户到Redis的set集合 zadd key value score
if (isSuccess) {
stringRedisTemplate.opsForSet().add(key, userId.toString());