环境:mysql8.0 springboot2 mybatis-plus
功能分析
收藏模块是许多网站都有的一个模块,大概思路如下
前端用户发起收藏操作时,调用api接口判断是否已经收藏?弹出消息提示已收藏
:向数据库写入一条收藏记录并提示收藏成功
;
前端发送的数据要包括用户id
,被收藏资源的id
建表
CREATE TABLE `collect` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL COMMENT '用户id',
`owner_id` INT NOT NULL COMMENT '被收藏资源的id',
`gmt_create` DATETIME NULL DEFAULT current_timestamp COMMENT '阿里的mysql规范',
PRIMARY KEY (`id`)
)
COMMENT = '用户收藏表';
后端
偷懒使用mp的代码生成器一键生成相应模块
// 实体类部分代码
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Collect implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
private Integer userId;
private Integer ownerId;
private Date gmtCreate;
}
简单写个接口测试下
@RestController
@Api("用户基本功能接口")
public class CollectController {
@Autowired
ICollectService service;
@ApiOperation("收藏一篇文章,需要用户id,文章id")
@RequestMapping("/collect")
public String collect(Integer uid, Integer pid) {
Collect c = new Collect();
c.setUserId(uid);
c.setOwnerId(pid);
boolean save = service.save(c);
return save + "";
}
}
功能完善
避免重复收藏
一个用户id和一个文章id确定一条唯一的记录,不能重复
有一种是收藏前,先根据用户id和文章id去查询一次,麻烦还得写个方法还多一次数据库读写
所以这次采用mysql的设置多列为唯一约束,将用户id和文章id设置为唯一约束,当插入的一条记录存在完全相同用户id和文章id则会报错
使用下列sql语句添加唯一约束
ALTER TABLE `collect` ADD UNIQUE `unique_index`(`user_id`, `owner_id`);
取消收藏功能
方法一
@DeleteMapping("/collect")
public String cancelCollect(String cid) {
boolean b = service.removeById(cid);
return b + "";
}
方法二:取消收藏需要用户id和文章id,避免别人调用接口乱取消收藏,其中用户id可以从token中获取
@ApiOperation("取消收藏,需要收藏文章的id和token")
@DeleteMapping("/collect")
public String cancelCollect(HttpServletRequest req, Integer pid) {
Integer uid = Integer.parseInt(JwtUtil.getId(req)); //从token中获取用户id
Map map =new HashMap<>();
map.put("user_id",uid);
map.put("owner_id",pid);
boolean b = service.removeByMap(map);
return b + "";
}
根据用户收藏选择性的展示用户收藏的文章集合
涉及到多表查询大致语句如下:
select * from post a,collect c where a.id=c.owner_id and c.user_id= 用户id
在CollectMapper里使用@Select注解写动态sql
@Select("select * from le_post a,collect c where a.id=c.owner_id and c.user_id= #{uid}")
List getUserCollection(Integer uid);
然后service层,controller随便写下,就能获取uid下所有收藏的文章的具体内容了
用户登陆时,首页文章根据用户收藏记录来渲染已经收藏的文章
@ApiOperation("根据用户id获取收藏记录,用于渲染前端文章列表的收藏按钮")
@GetMapping("/collect/{uid}")
public String getUserCollectionRecord(@PathVariable String uid) throws JsonProcessingException {
Map map = new HashMap();
map.put("user_id", uid);
List list = service.listByMap(map);
return ToJsonUtil.reJson(list, 200, "ok");
}
To Be Continue→
[1]MyBatis-Plus 代码生成器
[3]mysql创建多列组合唯一索引,unique index