粉丝关注和被关注的功能如何实现呢?
API
- 关注
- 取消关注
- 检查两个账号是否有关注
- 获取关注列表
- 获取被关注列表
- 获取推荐关注列表
表的设计
关注表,和被关注都是一样的表,只是查询的条件不一样,还有相互关注。
tb_fans:
- id - 主键,id确保唯一
- selfe_id 自己的id
- follow_id 关注的id
- create_time 创建时间
- update_time 更新时间
查询某用户的关注列表
select * from `tb_fans` where `selfe_id` = '用户ID' order by `update_time` desc;
查询某用户的粉丝列表
也就是谁关注了这个用户,follow_id是这个用户。
select * from `tb_fans` where `follow_id` = '用户ID' order by `update_time` desc;
查询A用户与B用户的关系
select * from `tb_fans` where (`selfe_id` = A.userId and `follow_id` = B.userId) or (`selfe_id` = B.userId and `follow_id` = A.userId);
如果没有结果,那么就是谁也没看上谁,相互没关注。
如果结果为2条记录,那么则是相互关注。
如果只有一条记录,就判断follow_id是谁,或者判断selfe_id是谁。
如果是selfe_id是自己的id,则是自己关注对方。如果follow_id是自己,那么就是对方关注自己。
实际开发查询
以上只是理论,想法,但是要查询起来,不是这样子的。比如我们只能查询到关注和被关注的id,根本就没有用户名呀,头像之类的。而这些在UI上是很常用的。
创建相关的表
# 创建user表,其他字段同学们自己补充
CREATE TABLE `tb_test`.`tb_user` (
`id` VARBINARY (20) NOT NULL COMMENT 'ID',
`user_name` VARBINARY (64) COMMENT '用户名',
PRIMARY KEY (`id`)
);
# 创建粉丝关系表,这是简版的,同学们要考虑创建时间,更新时间,特别关注,偷偷关注这些字段
CREATE TABLE `tb_test`.`tb_fans` (
`id` VARBINARY (20) NOT NULL COMMENT 'ID',
`user_id` VARBINARY (64) COMMENT '粉丝ID',
`follow_id` VARBINARY (64) COMMENT '关注ID',
PRIMARY KEY (`id`)
);
所以我们以UI驱动进行设计:
- 内容页面,需要知道你与作者的关系:已关注,对方关注你(回粉),互粉(相互关注)
- 用户中心页面,查看某个用户关注列表
- 用户中心页面,查看某个用户的粉丝列表
- 动态里获取关注人的动态
- 发起关注
- 取消关注
知道自己与作者的用户关系
如果没有登录,那么不需要查询与作者的关系。
如果已经登录了,拿着自己的用户id和作者的用户id去后台查询。
后台查询:
# 获取与A与B的关系
SELECT f.* FROM `tb_fans` f WHERE (f.`follow_id` = '1' AND f.`user_id` = '2') OR (f.`follow_id`='2' AND f.`user_id` = '1');
两条记录,互粉
# 获取与A与B的关系
SELECT f.* FROM `tb_fans` f WHERE (f.`follow_id` = '1' AND f.`user_id` = '7') OR (f.`follow_id`='7' AND f.`user_id` = '1');
1条记录,follow_id关注user_id。
前端根据此来判断即可。
# 获取与A与B的关系
SELECT f.* FROM `tb_fans` f WHERE (f.`follow_id` = '1' AND f.`user_id` = '8') OR (f.`follow_id`='8' AND f.`user_id` = '1');
没有结果,所以相互没有关系,前端显示关注即可。
查询1号男嘉宾的粉丝列表
## 获取1号男嘉宾的粉丝列表
SELECT f.*,u.`user_name` FROM `tb_fans` f LEFT JOIN `tb_user` u ON f.`user_id` = u.`id` WHERE f.`follow_id` = '1';
当然啦,我这里没有进行分页。
获取1号男嘉宾的关注列表
# 获取1号男嘉宾的关注列表,关注数量有限制,不得超过N
SELECT f.*,u.`user_name` FROM `tb_fans` f LEFT JOIN `tb_user` u ON f.`user_id` = u.`id` WHERE f.`user_id` = '1';
如何知道自己与列表中的用户关系呢?
其实是单独查询的!
如果没有登录,那么不进行查询,如果登录了,那么一条一条查询。
我们可以去看看别人的样例,比如说B站的:
关注和取消关注
关注就是添加实体类,删除就是删除实体类
要注意唯一性。
为什么要限制关注数量
当我们获取某个人关注的人的动态时,假设你关注了1万人,那么,你得去拉取这些人的动态,当然啦,也有推送的策略,也有动态判断用户状态来智能推送,或者拉取的方式解决。
如果要对in进行计算,那会很耗资源。
所以我们要限制关注的数量,微博的应该是2000人。
那我们阳光沙滩就限制最多关注200人吧。