大项目技术选型 |青训营笔记

103 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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对数据进行存储。建立四张数据库表,设计如下:

image.png

  • 使用many2many + Automigrate对多对多的关系模型进行数据库表的创建
  • 使用AssociationPreload进行联表查询
  • 使用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示例 image.png

    image.png

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
  • oss获取视频文件第一帧做封面:
    • 视频地址+?x-oss-process=video/snapshot,t_1000,m_fast

下一篇文章写一写架构方面的事情以及没来得及使用的技术ovo(比如微服务/redis,以及感受和收获与总结

参考资料

  1. gorm.io/docs/associ…
  2. help.aliyun.com/document_de…
  3. help.aliyun.com/document_de…
  4. blog.csdn.net/qq_27295403…
  5. github.com/dgrijalva/j…