本项目采用CLD分层结构实现了博客论坛后端系统的五个业务:注册业务、登录业务、社区业务、帖子业务、投票业务。
- 1、首先客户端向服务端发送一个POST请求,POST请求中带有用户名和密码,并进行参数校验
- 2、然后通过用户名判断用户是否已经存在,若已存在则返回用户已存在错误
- 3、如果没问题的话则通过snowFlake库生成分布式ID,通过md5库对密码进行加密,然后将用户名、加密后的密码、分布式ID组成用户记录
- 4、将用户记录插入数据库
- 1、客户端向服务端发送POST请求,请求中带有用户名和密码,并进行参数校验
- 2、通过查询数据库,判断数据库中是否存在用户且用户名和密码是否匹配
- 3、若查询到且匹配,则进行jwt的Token生成,否则,返回错误
- 4、将生成的Token返回给客户端,用于后续的鉴权
在生成了AccessToken和RefreshToken并发送给客户端之后,现在客户端访问路由时需要带上Token来完成服务端的认证。
整个会话的流程如下:
- 客户端访问需要认证的接口时,携带AccessToken
- 如果AccessToken没有过期,则服务端鉴权后返回给客户端需要的数据
- 如果AccessToken过期,则客户端使用RefreshToken向服务端的刷新接口申请新的AccessToken
- 如果RefreshToken没有过期,则下发新的AccessToken
- 如果RefreshToken过期,则需要用户重新登录来获取新的AccessToken和RefreshToken
- 向"/community"路由发送GET请求来调用查询功能
- 通过sql的select语句查询community表中的community_id(社区ID), community_name(社区名)两个字段来获取所有社区的简要信息。
- 向"/community/:id"路由发送GET请求,其中通过获取id值来查询指定社区的信息
- 通过sql的select语句查询community表中指定ID的community_id, community_name, introduction, create_time 字段来获取指定社区的详细信息。
对于投票业务,我们首先介绍其中用到的三种命名空间下的zset,以及其中的成员和分数对应信息
- KeyPostTimeZSet = "bluebell:post:time:" //zset;命名空间为帖子创建时间,帖子ID->时间
- KeyPostScoreZSet = "bluebell:post:score:" //zset;命名空间为帖子分数,帖子ID->时间
- KeyPostVotedPrefix = "bluebell:post:voted:" //zset;命名空间为PostID(使用时加上),用户ID->投票票数
- 通过发送POST请求,服务端在参数校验后可以获得当前投票用户ID,当前投票帖子ID,以及该用户现在对于帖子的投票记录
- 首先,我们通过查询TimeZset来获取帖子的查询时间,并与当前的系统时间进行比较,如果超过了一星期,我们判断用户超过了投票时间段,投票无效
- 然后我们使用用户ID和帖子ID在VoteZset里获取用户之前的投票记录
- 在于现在的投票记录进行比较后,我们得到了具体的投票数修改方案,并对VoteZset进行修改。