青训营课程 Lesson2 作业记录 | 青训营笔记

152 阅读4分钟

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

1.课程实战项目

做作业前先把课上的实战项目再研究一下,听课的时候感觉没有完全懂 (听课的时候写的笔记没了,所以在这里重新记录。。。)

  • 需求分析、用例模型、ER图都先略了

  • 分层结构:课上使用的是数据层(repository接口层?)-逻辑层(service服务层?)-视图层(control控制层?)

    • 数据层(repository):关联底层数据模型(model),封装外部数据的增删改查,我们的数据存储在本地文件,通过文件操作拉取话题、帖子数据。该层对service层透明,屏蔽下游数据差异,也就是不管下游是文件,还是数据库,还是微服务等,对service层的接口模型是不变的。
    • 逻辑层(service):该层处理核心业务逻辑,计算打包业务实体entiy,对应我们的需求,就是话题页面,包括话题和回帖列表,并上送给视图层
    • 视图层(control):负责处理和外部的交互逻辑,以view视图的形式返回给客户端,对于我们的需求,我们封装json格式化的请求结果,api形式访问就好
    • 个人理解:发送数据-处理数据-显示结果
  • 下一步是通过go mod来管理配置文件(go mod init XXX),然后用go get下载gin依赖,这里老师给的命令我这里好像下载失败,后来用了同学给的go get github.com/gin-gonic/gin@v1.3.0成功了

  • 接下来一层层分析(这里就看着代码,把没见过的知识点记录一下)

数据层/repository层

    • db_init.go里面,应该是在数据库初始化,把data文件里的数据一行行读入索引,方便后续查找(打开文件,用迭代器遍历,反序列化成结构体,存储到索引里)
    • sync.Once:sync是一个同步原语库,用来实现并发同步(waitGroup,加锁什么的),sync.Once是用来让函数方法只执行一次(具体见zhuanlan.zhihu.com/p/400481805 )像这里,就是让topicOnce.Do里面的函数只执行一次,适合在高并发场景下只执行一次的情况,就是我们常说的单例模式?可以减少存储的浪费
var (
	topicDao  *TopicDao
	topicOnce sync.Once
)
func NewTopicDaoInstance() *TopicDao {
	topicOnce.Do(
		func() {
			topicDao = &TopicDao{}
		})
	return topicDao
}
    • post.go和topic.go类似,都是用map,来很方便的get到要查询的内容,这里完成了两个查询的函数,就可以上送给逻辑层,来完成实体entity的封装
    • 关于为什么要搞一个空的结构体TopicDao,PostDao,说是一种设计规范,就是说编程习惯?Dao-->data access object,用来绑定调用数据库的方法

逻辑层/service层

    • 先是定义一个页面信息的实体/结构体PageInfo
    • 流程:参数校验-准备数据-组装实体,然后分别实现这三个函数,其中,准备数据部分用了并行来执行,提高效率
    • 这里有个地方是有点懵的,然后仔细读了下代码感觉理顺了点,在这里记录下,就是这类函数: func (f *QueryPageInfoFlow) Do() (*PageInfo, error),里面的f *QueryPageInfoFlow,表示这个函数是这个QueryPageInfoFlow指针的函数,只有这个指针能调用,别的类都不行,具体的理解注释也是写在代码里了

视图层/control层

    • 先构建业务对象PageData,然后处理一些业务错误码,这层相对来说比较简单

server.go

    • 三层都完成,最后就是通过gin来搭建整个web框架
    • 初始化数据索引 --> 初始化引擎配置 --> 构建路由 --> 启动服务

2.课后作业

  • 支持发布帖子
  • 本地id生成保证不重复
  • append文件,更新索引,注意Map的并发安全问题
    • repository层与数据文件交互,在该层写一个AddPost的函数用来发帖,Append函数用来写入数据文件
    • service层按照参数校验-->准备数据-->组装实体的模式,变成参数校验-->发布数据-->组装实体,来完成一个publish_post.go
    • control层应该就跟之前的control类似,最后返回code,msg,data,来完成一个publish_post.go
    • 最后完成server.go,就可以在POSTMAN里测试,post了半天老报错。。最后发现是要选body里的x-www-form-urlencoded才行。。 (本人很菜,课后作业参考的这位佬juejin.cn/post/709575…