这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
技术选型
| 密码存储 | 使用golang.org/x/crypto/bcryp进行密码加密存储 |
|---|---|
| 视频存储 | 采用阿里云OSS进行视频存储 |
| 封面提取 | 采用阿里云OSS的snapshot截取封面 |
| 登录校验 | 使用了go的github.com/dgrijalva/jwt-go |
| 开发框架 | 使用gin和gorm开发,避免SQL注入的风险 |
本篇笔记用来记录大项目的技术选型,包括jwt鉴权,gorm及数据库表,OSS存储,以及自己学习当中的一些体会
技术选型
本小组项目地址:github.com/v3nividiv1c… 由于其他队员全员零基础 + 我(组长)开学考试时间完美撞上大项目时间,故完成的非常有限,只完成了基础部分 + 点赞,评论模块还在完善中
jwt鉴权
采用github.com/dgrijalva/jwt-go 的接口进行jwt鉴权。
数据库
使用MySQL对数据进行存储。建立四张数据库表,设计如下:
- 使用
many2many+Automigrate对多对多的关系模型进行数据库表的创建 - 使用
Association与Preload进行联表查询 - 使用Association查找示例:
// Start Association Mode
var user User db.Model(&user).Association("Languages")
// `user` is the source model, it must contains primary key
// `Languages` is a relationship's field name
// If the above two requirements matched, the AssociationMode should be started successfully, or it should return error
db.Model(&user).Association("Languages").Error
// Find matched associations
db.Model(&user).Association("Languages").Find(&languages)
- 使用Preload示例:
// Preload Orders with conditions
db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
// SELECT * FROM users;
// SELECT * FROM orders WHERE user_id IN (1,2,3,4) AND state NOT IN ('cancelled');
db.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
// SELECT * FROM users WHERE state = 'active';
// SELECT * FROM orders WHERE user_id IN (1,2) AND state NOT IN ('cancelled');
-
Association示例
OSS存储视频
数据以对象(Object)的形式存储在OSS的存储空间(Bucket )中。如果要使用OSS存储数据,您需要先创建Bucket,并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后,您可以将数据以Object的形式上传到Bucket,并指定Object的文件名(Key)作为其唯一标识。
OSS以HTTP RESTful API的形式对外提供服务,访问不同地域需要不同的访问域名(Endpoint)。当您请求访问OSS时,OSS通过使用访问密钥(AccessKey ID和AccessKey Secret)对称加密的方法来验证某个请求的发送者身份。
Object操作在OSS上具有原子性和强一致性。
- 在线播放视频获取文件URL:
- 公共读Object:
如果文件的读写权限ACL为公共读,即该文件允许匿名访问,则文件URL的格式为
https://BucketName.Endpoint/ObjectName
- 公共读Object:
如果文件的读写权限ACL为公共读,即该文件允许匿名访问,则文件URL的格式为
- oss获取视频文件第一帧做封面:
- 视频地址+?x-oss-process=video/snapshot,t_1000,m_fast
下一篇文章写一写架构方面的事情以及没来得及使用的技术ovo(比如微服务/redis,以及感受和收获与总结