达人探店
发布探店笔记
探店笔记包括图片和文本两部分内容,分开上传。
- 用户发送上传图片的请求,请求体中携带笔记的图片数据。
- 将用户上传的图片保存到Nginx服务器相应目录下。
- 用户发送发布探店笔记的请求,请求体中携带笔记的文本内容。
- 将用户上传的文本保存到数据库的tb_blog表中。
查看所有探店笔记
分页查询的实现及优化
有两个参数:
- currentPage:查看哪一页的数据
- pageSize:每页记录数
limit
分页:
- 先计算
start
(结果集从第几条记录开始) - 然后查询从第start条记录开始的pageSize条记录:
select * from tb_blog limit {start}, {pageSize};
分页查询优化:
腾讯云:如果谁再问你“如何优化mysql分页查询”,请把这篇文章甩给他
CSDN:分页查询原理
CSDN:面试官:Mysql千万级大表如何进行深度分页优化
查看特定探店笔记
用户查看探店笔记需要查询两部分内容:探店笔记和发布探店笔记的用户。
在实体类Blog中,增加三个与笔记作者相关的属性:userId、icon、name,由于这三个属性不是tb_blog中的字段,所以需要加上@tableField(exist = false)
注解,并且需要手动赋值。
- 用户提交要查看的探店笔记的id。
- 根据id在tb_blog表中查询探店笔记,如果笔记不存在,则直接返回错误信息。
- 根据查询到的探店笔记的userId字段,在tb_user表中查询发布探店笔记的用户的信息,对Blog对象的userId、icon、name赋值。
- 将Blog对象返回给客户端。
点赞
tb_blog表中的liked字段记录每篇探店笔记的点赞数量。
需求:
同一个用户只能点赞一次,再次点赞则取消点赞。
如果当前用户已经点赞,则点赞按钮高亮显示。
在Redis中使用set数据类型缓存给每一篇博客点过赞的用户id,以博客id作为key。
在Blog类中增加一个isLike字段,表示当前用户是否给这篇探店笔记点过赞,需要加上@tableField(exist = false)
注解。
在查看所有探店笔记和查看特定探店笔记的代码逻辑中:
- 后端通过查询Redis判断当前用户是否给该博文点过赞从而设置isLike字段的值。
- 前端根据返回数据中isLike字段的值来决定是否高亮显示点赞按钮。
点赞的代码逻辑中:
3. 用户提交要点赞的探店笔记的id。
4. 查询Redis,通过SISMEMBER
命令判断当前用户是否已经对该笔记点过赞。
5. 如果没有点过赞,就将数据库中该笔记的liked字段值加1,并将当前用户id加入到该笔记对应的set集合中。
6. 如果已经点多赞了,就将数据库中该笔记的liked字段值减1,并将当前用户id从该笔记对应的set集合中删除。
点赞排行榜
需求:在探店笔记的详情页面,展示给该笔记最早点赞的TOP5用户。
改用zset数据类型存给每一篇博客点过赞的用户id,以博客id作为key,以点赞时间作为每一个用户id的score值。
在判断当前用户是否给该笔记点过赞时,使用zscore key userid
来查询,如果返回元素的score值则说明存在,如果返回null则说明不存在。
在查询最早点赞的TOP5用户时,先通过zrange key 0 4
查出最早点赞的TOP5用户的用户id,然后去数据库中通过select ... where id in (...)
查出这几个用户的其他信息,注意要通过order by field (id, ...)
自定义排序顺序,从而保证查询结果的顺序与原顺序一样。