项目笔记(1) | 青训营

46 阅读6分钟

项目构思和学习笔记(1)

 omitempty 

在一个地址有 suite 号码的时候输出,不存在 suite 的时候就不输出,幸运的是,我们可以在 Golang 的结构体定义中添加omitempty关键字,来表示这条信息如果没有提供,在序列化成 json 的时候就不要包含其默认值

service的处理流程

1.创建一个处理流的结构体

里面包含你要传入的参数,你要操作的结构体,你要操作的街头提里面的字段

2.通过NewxxxxFlow().Do()来返回你要的数据

3.NewxxxFlow()这个方法返回的是处理流的对象

4.Do()是处理流结构体的个人方法

1. 参数校验
2. 数据准备prepareData
3. 打包数据packData

总结:上面的三个方法每个都要封装

handler层

和service层类似,这里时设置的一个Proxyxxx结构体来做封装

问题

视频存储在oos中,如何获取到视频或图片的地址

获取请求中的参数问题

gin.Context.Get方法可以用于获取任何类型的和格式的请求参数,包括:

查询字符串参数:对于GET和POST请求中的
查询字符串参数,可以使用Get方法来获取参数的值。例如,对于请求example.com?username=john&age=25,可以使用以下代码获取username和age参数的值:
go
复制
username := c.Get("username")
age, _ := strconv.Atoi(c.Get("age"))

表单参数:对于POST请求中的表单参数,可以使用Get方法来获取参数的值。例如,对于请求example.com,其中包含一个名为username的表单参数,可以使用以下代码获取其值:
go
复制
username := c.Get("username")
JSON参数:对于请求中包含的JSON参数,可以使用Get方法来获取参数的值。例如,对于请求example.com,其中包含一个名为user的JSON参数,可以使用以下代码获取其值:
go
复制
var user struct {
Username string json:"username"
Age      int    json:"age"
}
err := c.BindJSON(&user)
if err != nil {
// 处理错误
}
username := user.Username
age        user.Age

总之,gin.Context.Get方法可以用于获取任何类型的和格式的请求参数,但需要注意在获取非字符串类型的参数时需要进行类型转换,并处理可能发生的错误。

将视频传送到云服务器原理

1.利用ffmepg工具来将视频的第一帧截图保存,视频的存储位置信息直接持久化到数据库中

2.再将服务器中的视频文件上传到阿里云oos对象存储器上

 上传的方式:

1.通过web端上传到服务器上,再上传到云存储器上,这样的小路比较低

2.通过表单接上PostObject接口完成直传,这样的传输效率较高

具体代码参考官方文档

feed接口处理逻辑

1.获取两个参数

2.没有登录
直接获取视频流
3.已经登录
需要更新视频是否被点赞

时间通过unix时间戳来处理,这样比较好比较大小

投稿接口处理逻辑

首先,我们接收到前端的视频文件,将视频文件做截图之后存储到服务器上的固定位置下面,后面服务器上面存储的路径需要时可以通过发起请求访问到的,然后存储完成之后,将视频文件的路径信息和图片的路径信息存储到数据库中,下面ffmpeg截图的工具使用来自于
如何使用ffmpeg截图

c.get可以从上下文中获取到值,c.set也可以设置

uint则是不带符号的,表示范围是:2^32即0到4294967295

确定数据库中的存储地址式网络中访问的地址还是项目中的相对地址

在数据库中存储视频对象路径时,建议使用相对路径。
相对路径是相对于当前工作目录的路径,而绝对路径是指从根目录开始的完整路径。在大多数情况下,使用相对路径更为灵活,因为当文件结构或位置发生变化时,相对路径可以自动适应。
例如,如果你有一个名为“videos”的文件夹,其中包含子文件夹“category1”和“category2”,每个文件夹中都有一些视频文件。在数据库中,你可以使用相对路径来引用这些视频文件,如“category1/video1.mp4”和“category2/video2.mp4”。这样,无论当前工作目录在哪里,只要数据库和文件结构保持相对位置,都可以正确地引用这些视频文件。
然而,如果你使用绝对路径,如果文件结构或位置发生变化,例如如果“videos”文件夹被移动到不同的位置,或者在不同的操作系统上运行程序,绝对路径可能会失效。
因此,为了确保在数据库中存储的视频对象路径的灵活性和可移植性,建议使用相对路径。

接下来视频数据持久化

type Category struct {
Id          uint    //默认字段名是id
Title       string  //默认字段名是title
Description string  //默认字段名是description
Content     string  //默认字段名是content
ParentId    uint    //默认字段名是parent_id
Status      uint    //默认字段名是status
CreatedTime int64   //默认字段名是created_time
UpdatedTime int64   //默认字段名是updated_time
DeletedTime int64   //默认字段名是deleted_time
}
写入struct可以不用 指明字段名

问题

使用postman发起请求的时候,请求路径一定要对,要和router对上,特别是路径最后不能多加?,否则参数传不进去

明天早上把用户分支接过来,继续写pulish接口

api中如果需要返回对象数据,那么handler中就有必要写一个代理类

类似于如果参数为gin.context的方法写在router中,这样也需要调用handler中的方法,代理相当于这种情况下的handler中的方法,只不过我们的gin.context的方法和hangdler写在一起的而已

时间处理

将前端传过来的时间先化为整数再化为时间类型的目的是为了方便后续的时间计算和比较。
在前端中,时间通常是以不同的格式和精度传递的,例如秒、毫秒、日期字符串等。这些时间格式可能包含小数部分或时间信息(例如时区、夏令时等)。为了方便后续的时间计算和比较,通常需要将前端传递的时间先转化为整数类型,以去除时间中的额外信息,并统一时间单位的精度。
将时间化为整数类型后,可以将其转换为时间类型,例如datetime或timestamp等,以便在数据库或代码中进行处理。这样做的好处是,可以将时间统一表示为一种类型,方便进行时间相关的操作和比较。
另外,将时间化为整数类型还可以减少内存占用和计算开销。因为整数类型的存储和计算相对于浮点数或字符串类型更加高效。
总之,将前端传递的时间先化为整数再化为时间类型的目的是为了方便后续的时间计算和比较,并提高内存和计算效率。

接下来测试没登陆的feed接口

现在feed接口的无登录状态已经完成,接下来就是等待他们把 点赞列表获取到