ByteDay 3《Go工程实践—简单项目实践》 | 青训营笔记

104 阅读3分钟

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

项目实战—— 社区页面话题页面

1.1 需求描述

主要展示内容有 话题回帖,以文件存储。 技术点涉及文件读写。

image.png

抽取实体

image.png

1.2 ER 图

有了模型实体,就要寻找实体联系。 image.png

1.3 分层结构

大部分web应用总体分为三层:

Repository 数据层

数据 Model 外部数据的增删改查

我们的数据以 JSON 的形式存储在本地文件,通过文件操作拉取话题,帖子数据

与 Service 逻辑层的关系:数据层面向逻辑层,对service层透明,屏蔽下游数据差异,不管是下游文件,还是数据库,还是微服务,对 service 接口模型都是不变的

Service 逻辑层

业务 Entity 处理核心业务逻辑输出

计算打包业务实体 entity,对应我们的需求,就是话题页面,包括话题和回帖列表,并发送给视图层;

Controller 视图层

数据 Model 外部数据的增删改查

负责处理和外部的交互逻辑,以 view 视图的形式返回给客户端

image.png

Repository 数据层

2.1 创建 Model

Step 1:先查看文件中的 Topic 和 Post 以 JSON 格式存储

image.png

Step 2:对应写出数据模型Model的struct

其中 Id 字段首字母大写代表对包外访问,id 代表数据真实以JSON格式存储的字段

image.png

image.png

2.2 考虑我们应该如何实现查询?建立全局索引

我们可以看到每一个Post都对应着一个Topic,因此有着 parent_id 字段的存在

因此 一个 Topic 对应着多个 Post,二者存在着一对多的关系,因此我们要查询的时候,由一个 topicId 就可以知道一个Topic和多个Post。

同时,我们查询数据的时候,不可能要去一一遍历,而是要事先建立全局索引,实现 O(1)查找操作。

image.png

image.png image.png

image.png

2.3 对数据及其索引进行 Init 初始化

首先是由文件参数来打开文件,基于File初始化Scanner,通过迭代器的方式遍历文件数据的每一行,通过 JSON 反序列化 转为结构体 存储至 内存Map。

对 Topic 索引进行初始化

image.png

对 Post 索引进行初始化

image.png

再次封装成一个总 Init 方法

image.png

2.4 有了索引,我们的查询就变得方便

创建 DAO

对于每个model都有各自的查询实体 Dao

单例模式 sync.Once

sync.once 主要适用于高并发的场景下,只执行一次的场景,这里基于 once 的实现模式就是我们平常说的单例模式,减少多余存储的空间浪费

image.png

image.png

Service 业务层

3.1 建立具体业务实体类

PageInfo 最终结果类

image.png

QueryPageInfoFlow 结果封装类

image.png

3.2 业务流程

image.png

image.png

并行处理准备数据:

image.png

Controller 页面控制层

4.1 页面数据响应类

Msg 打包业务状态信息

image.png

4.2 页面响应逻辑

image.png

Router 层

5.1 数据 Init

初始化数据索引

image.png

image.png

5.2 构建 Router 启动服务

初始化引擎配置 并 构建 Router 启动服务

image.png