青训营后端项目总结| 青训营笔记

160 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。

课程总结

本次字节后端青训营的课程知识面很广,讲了正常企业开发中许多功能模块,不过受限于时间安排,很多内容没能够深入讲解,有一点遗憾,后面还是需要自己去学习。

项目

技术选型

本次的项目主要根据提供的接口进行实现,使用了Gin+Jwt+Gorm+Mysql+Ffmpeg开发,从项目的实际需求看来,Redis和分库分表等技术对于目前体量的项目在实际运行上不会有大的优势,在技术引入方面有作用,故没有加入。

负责的部分

这次主要做了user/publish/中间件和一些整合工作。

代码的风格

在Java中MVC分层后,因为有Springboot这样的工具提供IOC和AOP,对象交给了容器进行管理。但在Gin中,需要自己考虑分层之间的关系,在github也看了一些开源的项目的写法,似乎并不是很统一,这次大概就分享一下我自己的一些写法。

model

model层对于entity层,本次项目这一部分主要按照大分类分文件,例如common.go、user.go,每个文件包含多个对应表或封装的实体类。

dao

dao层主要封装对数据库底层的操作,首先按照大类划分,然后每一个行为都单独封装一个文件。

image.png

因为dao层的实体不涉及什么特有的属性,因此可以复用,所以在这里借助sync.Once把这一层设为了单例模式。

var (
   authOnce sync.Once
   authDao  *AuthDao
)

type AuthDao struct {
}

func NewAuthDaoInstance() *AuthDao {
   authOnce.Do(func() {
      authDao = &AuthDao{}
   })
   return authDao
}

service

service层与dao层采用的文件结构类似,每一个service中会生成一个flow结尾的结构体,封装service层可能接收和返回的一切数据以及需要使用的dao,控制流程。在Do中分解完成操作。

// LoginFlow 控制登录流程
type LoginFlow struct {
   authDao     *userdao.AuthDao
   logUsername string
   logPassword string
   userAuth *model.UserAuth
}

// Login controller通过调用Login
// 将具体实现交由service处理
func Login(username string, password string) (uint32, error) {
   return NewLoginFlow(username, password).DoLogin()
}

func NewLoginFlow(logUsername string, logPassword string) *LoginFlow {
   return &LoginFlow{
      authDao:     userdao.NewAuthDaoInstance(),
      logUsername: logUsername,
      logPassword: logPassword,
   }
}

func (f *LoginFlow) DoLogin() (uint32, error) {
   //操作函数1
   
   //操作函数2
   
   //操作函数3
}

controller

controller取参并调用service层的方法,然后返回统一的格式,其中有设置token校验和登录验证的中间件。

中间件

Jwt token校验一开始使用旧版本后来做了一次升级,调整了继承的类。然后账号密码校验实际上应该前后端协同校验,这次只有后端,所以后端用正则简单实现了一个校验,提示性上不够明确。

文件上传和Ffmpeg

文件上传方面,示例中Gin将这一个操作放在controller层,从业务方面将,这里将这一步修改放在service层,更加合适。Ffmpeg文件存储在本地相对来说比较容易,简单截取每个视频的第一帧作为封面保存。远端传输使用SSH和SFTP进行文件传输,对于Ffmpeg而言,这样没找到合适的方法直接生成到远端服务器,于是采用临时保存、传输、删除的方式。

团队协作

这次小组内大家在做项目时都挺积极的,有比较好的交流沟通。

总结

相对来说课程上很多内容并没有完全采用,整体上更像是对Go语言的一种实践,后续一些写法和功能添加可能还需要更专业的指导。