这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
用户注册
需求
用户需要在注册时提供用户名与密码,并且用户名需要保证唯一。创建成功后需要返回用户 id 和权限token
-
基本流程
-
- 用户首先输入用户名与密码,点击注册按钮后,前端将用户注册http请求发送到后端。
- 后端接收请求,检验用户名与密码是否合法。当用户名或者密码中存在不合法的内容,将返回用户名或密码不合法的提示信息至前端。
- 若检验合法,则在数据库中查询该用户名是否已经存在。若存在,则返回该用户已存在的提示信息至前端。
- 若用户名未存在,将用户密码加密后,与用户名一并存入数据库中,并生成用户ID。
- 未当前注册生成用户信息 token,并进入已登录的状态。
- 返回包含用户 ID 和 token的成功响应信息至前端。
- 前端接收响应信息,并进入个人页面。
核心代码
func (s *CreateUserService) CreateUser(req *douyinuser.CreateUserRequest) error {
user, err := db.QueryUser(s.ctx, req.Username)
if err != nil {
return err
}
if len(user) != 0 {
return errno.UserAlreadyExistErr
}
h := md5.New()
if _, err = io.WriteString(h, req.Password); err != nil {
return err
}
password := fmt.Sprintf("%x", h.Sum(nil))
return db.CreateUser(s.ctx, []*db.User{{
Username: req.Username,
Password: password,
}})
}
亮点设计
使用md5算法加密用户密码,将加密后的密码存储在数据库中,避免密码在数据库中明文存储。
用户登录
需求
用户通过用户名和密码进行登录,登录成功后返回用户 id 和权限 token。
-
基本流程
-
- 用户首先输入用户名与密码,点击登录按钮后,前端将用户登录http请求发送到后端。
- 后端接收请求,检验用户名与密码是否合法。当用户名或者密码中存在不合法的内容,将返回用户名或密码不合法的提示信息至前端。
- 若检验合法,则在数据库中查询该用户名是否已经存在。若不存在,则返回该用户不存在的提示信息至前端。
- 若用户名存在,将生成用户信息 token,并进入已登录的状态。
- 返回包含用户 ID 和 token的成功响应信息至前端。
- 前端接收响应信息,并进入个人页面。
func (s *CheckUserService) CheckUser(req *douyinuser.CheckUserRequest) (int64, error) {
h := md5.New()
if _, err := io.WriteString(h, req.Password); err != nil {
return 0, err
}
passWord := fmt.Sprintf("%x", h.Sum(nil))
userName := req.Username
users, err := db.QueryUser(s.ctx, userName)
if err != nil {
return 0, err
}
if len(users) == 0 {
return 0, errno.AuthorizationFailedErr
}
u := users[0]
if u.Password != passWord {
return 0, errno.AuthorizationFailedErr
}
return int64(u.ID), nil
}
```
```