这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
用户模块
需求分析
- 主要需要2个功能性接口:
- 注册接口, 可以让用户自定义用户名(唯一)和密码实现用户注册
- 登录接口, 提供用户登陆的功能, 登陆后解锁其他功能(返回token)
基本流程
-
用户注册:
- 用户发送注册请求
- 服务端验证登录信息是否正确, 返回状态信息
-
用户登录:
- 用户发送登陆请求
- 如果校验正确的话,服务端会返回包含已经签名的 Token 的响应, 本地将Token存入本地
- 后续其他请求在请求头中携带签名的Token, 服务端可从Token中获取相关权限信息
流程分析
使用基础的用户信息(用户名和密码)传入注册接口, 注册之后将md5加密后的密码存入数据库以减少数据库泄漏危害. 在本模块中, token被设计成用户id+权限id+jwt.StandardClaims的形式(其中权限系统在本项目中暂未涉及), 采用github.com/golang-jwt/jwt包的HS256签名加密, 密钥直接保存在代码本地并且保密. 在系统访问其他模块的接口时, 如果有未过期的token, 则可以添加到http头部发送到服务端进行解密和授权.
视频模块
主要需要3个功能性接口:
- 视频流接口, 不限制登录状态,返回按投稿时间倒序的视频列表,视频数由服务端控制,单次最多30个
- 投稿接口, 登录用户选择视频上传
- 发布列表接口, 通过id返回用户所有投稿过的视频列表
流程
- 投稿:
- 用户输入投稿的信息, 包括原始视频文件, 视频标题, 点击发布按钮
- 服务端制作封面, 将用户视频和封面存储到云对象存储服务器, 并将相关信息存入数据库
- 返回响应信息
- 视频流:
- 用户进入应用后直接按当前的时间戳返回包含时间倒序的视频列表的响应
- 视频在主页读取后循环播放, 如果用户下刷则播放列表中下一个视频
- 发布列表:
- 用户点击"自己"页面
- 客户端获取用户id, 服务端通过id查询用户发布列表并返回响应
流程分析
视频流存储和处理方案选用的是业内常用的ffmpeg和minIO对象存储. 首先使用Golang标准库bytes读取原始视频信息, 然后利用minIO配套的Goalng SDK github.com/minio/minio-go/v7配置好本地存储方案, 并将视频流存入相应的bucket. 在处理的过程中同时可以获取视频大小 时间戳等信息, 然后利用bucket等信息组装好相应的DTO存入MySQL数据库, 便于后续的查询和管理.