声明:
本项目由b站程序员老罗所创,此学习心得不分享代码,只分享学习感受。如果想具体学习的请到b站去搜索程序员老罗。
1.项目所用技术栈,功能图,架构图
整个项目是可以做集群部署的,我们先从单机服务开始,项目使用了SpringBoot、MySQL、Redis、Netty。其中传统服务基于客户端向服务端发送请求,然后服务端给出响应,利用Reis做缓存,使用MySQL做数据库,Netty用于消息的分发
我相信学项目的人应该都会基础的项目结构,所以我就省略了,直接看图吧。项目结构创建好之后,导入项目依赖,同时在resource目录中创建application.properties配置文件,导入项目配置。想要配置和依赖的直接去找老罗要资料。但看看我的应该也行+_+。导入好配置文件之后就可以愉快的写项目了。
2.登陆模块
2.1.1.获取验证码
1.请求路径:
2.所需依赖:
3.具体操作:
上图为我自己理解的过程思路,因为第一次画图有点丑陋,不会的话可以评论问我。注意:Base64码必需返回整个图形验证码,而不是图中的字母和数字!!!!。
2.1.2.用户注册
补充表信息(用户表,靓号表)
1.基本信息
2.具体操作:
(1):用户端发送请求,将携带的参数传给服务端。
(2):然后服务端通过checkcodekey向redis发送请求获取checkcode,然后再与用户端传过来的checkcode对比。
(3):通过email对数据库的用户信息进行查询,如果查到了则表示该email已被注册。
(4):生成该账号的UID,如果注册该账号的email在靓号库中存在且没有被使用,将靓号赋值给该账号的UID,如果不存在于靓号库中则通过11位随机数自动生成UID。
(5):把密码进行md5加密,然后把其他的信息进行复制,比如账号状态,创建时间,加好友方式等等。
(6):最后将新创建的用户信息存入到数据库中,并返回给前端注册成功的消息。
补充:用户注册往后会自动与easychat助手成为好友,要在关系库中添加他们成为好友的数据。
2.1.3.用户登陆
1.基本信息
接口:http://localhost:5050/api/account/login
参数:
2.基本思路:
3.具体思路:
- 第一步:根据邮箱查询用户信息
使用传入的email
参数,从数据持久层查询对应的用户信息userInfo
。这一步是为了获取用户在数据库中的记录,以便后续进行密码和状态验证。 - 第二步:校验账号密码
通过条件null == userInfo ||!userInfo.getPassword().equals(password)
检查查询到的用户信息是否为空,以及用户输入的密码与数据库中存储的密码是否匹配。如果不满足条件,抛出BusinessException
异常,提示 “账号或者密码不存在”。这一步确保只有拥有正确账号和密码的用户才能继续操作。 - 第三步:校验用户状态
使用if (userInfo.getStatus().equals(0))
检查用户账号状态是否为禁用(这里假设状态值0
表示禁用)。如果账号被禁用,抛出BusinessException
异常,提示 “账号已禁用”。这是为了防止被禁用的用户登录系统。 - 第四步:检查是否在别处登录
通过redisTemplate.opsForValue().get("HeartBeat"+userInfo.getUserId())
从 Redis 中获取该用户的心跳信息(lastHeartBeat)。如果心跳信息不为空,说明此账号已经在别处登录,抛出BusinessException
异常,提示 “此账号已经在别处登录,请退出后再登录”。这一步实现了账号单点登录的控制。 - 第五步:构建 TokenUserInfoDto 对象
- 第一步:初始化对象
创建一个TokenUserInfoDto
实例tokenUserInfoDto
,用于封装用户信息。 - 第二步:设置基本用户信息
将UserInfo
对象中的userId
和nickName
分别设置到tokenUserInfoDto
对象中,即tokenUserInfoDto.setUserId(userInfo.getUserId());
和tokenUserInfoDto.setNickName(userInfo.getNickName());
。 - 第三步:判断是否为管理员
从配置中获取管理员邮箱列表 ,然后检查当前用户的email
是否在管理员邮箱列表中。如果在列表中,将tokenUserInfoDto
的admin
属性设为true
,表示该用户是管理员;否则设为false
。 - 第四步:返回结果
返回封装好用户信息的tokenUserInfoDto
对象。
- 第一步:初始化对象
- 第六步:生成并保存登录信息到 Redis
- 生成一个 32 位的随机字符串作为
token
:String token = RandomStringUtils.random(32, true, true);
- 将生成的
token
设置到tokenUserInfoDto
对象中:tokenUserInfoDto.setToken(token);
- 将
token
与tokenUserInfoDto
的对应关系、userInfo.getUserId()
与token
的对应关系以及用户的心跳信息(当前时间戳)分别存储到 Redis 中,并设置不同的过期时间。例如,redisTemplate.opsForValue().set(userInfo.getUserId()+"Token",token,1,TimeUnit.DAYS);
表示将用户 ID 与token
的对应关系保存 1 天。
- 生成一个 32 位的随机字符串作为
- 第七步:返回结果
返回构建好的tokenUserInfoDto
对象,其中包含了用户信息和生成的token
,供后续业务流程使用,比如前端进行身份验证和访问受保护资源等。
ok, ok这就是登录模块的所有内容,有和我一样学习老罗的这个项目的可以和我一起交流。以前没怎么写过博客,现在才发现这么累,本来准备是把每个模块的都写下来的,但是真的太费时间了,而且有些功能本来就很简单,所以我会只挑困难的来续写了。