这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
需求分析
用户模块,提供用户注册、用户登录以及查看用户基本信息功能。
/douyin/user/ - 用户信息
- 获取登录用户的 id、昵称,如果实现社交部分的功能,还会返回关注数和粉丝数。
- 接口类型:GET
/douyin/user/register/ - 用户注册接口
- 新用户注册时提供用户名,密码,昵称即可,用户名需要保证唯一。创建成功后返回用户 id 和权限 token.
- 接口类型:POST
/douyin/user/login/ - 用户登录接口
- 通过用户名和密码进行登录,登录成功后返回用户 id 和权限 token.
- 接口类型:POST
接口定义
syntax = "proto3";
package user;
option go_package = "user";
message BaseResp {
int32 status_code = 1;//状态码
string status_message = 2;//状态描述
int64 service_time = 3;//服务时间
}
message User {
int64 id = 1;//用户id
string name = 2;//用户名称
int64 follow_count = 3;//关注总数
int64 follower_count = 4;//粉丝总数
bool is_follow = 5;//true-已关注,false-未关注
string avatar = 6; // 用户头像
string background_image = 7; // 用户个人页顶部大图
string signature = 8; // 个人简介
int64 total_favorited = 9; // 获赞数量
int64 work_count = 10; // 作品数量
int64 favorite_count = 11; // 点赞数量
}
message check_user_request {
string username = 1; //登录用户名
string password = 2;//登录密码
}
message check_user_response {
BaseResp base_resp = 1;
int64 user_id = 2;//用户id
}
message register_user_request {
string username = 1;//注册用户名,最长32个字符
string password = 2;//密码,最长32个字符
}
message register_user_response {
BaseResp base_resp = 1;
int64 user_id = 2;//用户id
string token = 3;//用户鉴权token
}
message user_info_request {
int64 user_id = 1;//用户id
string token = 2;//用户鉴权token
}
message user_info_response {
BaseResp base_resp = 1;
User user = 2;//用户信息
}
service UserService {
rpc CheckUser (check_user_request) returns (check_user_response) {}
rpc RegisterUser (register_user_request) returns (register_user_response) {}
rpc UserInfo (user_info_request) returns (user_info_response) {}
}
数据表定义
// UserRaw User Gorm Data structures
type UserRaw struct {
gorm.Model
Name string `gorm:"column:name;index:idx_username,unique;type:varchar(32);not null"`
Password string `gorm:"column:password;type:varchar(32);not null"`
Avatar string `gorm:"column:avatar;type:varchar(128);not null"`
BackgroundImage string `gorm:"column:backGround;type:varchar(128);not null"`
Signature string `gorm:"column:signature;type:varchar(128);not null"`
}
User 表中没有保存 follow_count、follower_count 以及 favorite_count,这三个字段在需要返回的时候通过调用关系表或点赞表来进行计数,这样避免的数据表的耦合,不需要在多个表中用事务进行处理。
微服务流程
用户信息
- 首先根据发送请求的信息进行 JWT 认证,以及检查请求的 userId;
- 接着,在 dal 层调用用户表返回相应的用户信息,注意这里同时需要调用其他的表获得相应字段的总数;
- 最后将得到的信息打包返回;
用户登录
关系表在存储密码的时候将输入的密码转化为 md5,用户登录的时候同样进行转换操作,然后与数据中的密码进行对比,来判断账号和密码输入是否正确。
用户注册
用户注册的时候,密码会用 md5 加密,然后写入到用户表中,同时也需要用 JWT 创建 Token,最后返回相应的数据,