这是我参与「第三届青训营 -后端场」笔记创作活动的的第 3 篇笔记
项目实战—— 社区页面话题页面
1.1 需求描述
主要展示内容有 话题 和 回帖,以文件存储。 技术点涉及文件读写。
抽取实体
1.2 ER 图
有了模型实体,就要寻找实体联系。
1.3 分层结构
大部分web应用总体分为三层:
Repository 数据层
数据 Model 外部数据的增删改查
我们的数据以 JSON 的形式存储在本地文件,通过文件操作拉取话题,帖子数据
与 Service 逻辑层的关系:数据层面向逻辑层,对service层透明,屏蔽下游数据差异,不管是下游文件,还是数据库,还是微服务,对 service 接口模型都是不变的
Service 逻辑层
业务 Entity 处理核心业务逻辑输出
计算打包业务实体 entity,对应我们的需求,就是话题页面,包括话题和回帖列表,并发送给视图层;
Controller 视图层
数据 Model 外部数据的增删改查
负责处理和外部的交互逻辑,以 view 视图的形式返回给客户端
Repository 数据层
2.1 创建 Model
Step 1:先查看文件中的 Topic 和 Post 以 JSON 格式存储
Step 2:对应写出数据模型Model的struct
其中 Id 字段首字母大写代表对包外访问,id 代表数据真实以JSON格式存储的字段
2.2 考虑我们应该如何实现查询?建立全局索引
我们可以看到每一个Post都对应着一个Topic,因此有着 parent_id 字段的存在
因此 一个 Topic 对应着多个 Post,二者存在着一对多的关系,因此我们要查询的时候,由一个 topicId 就可以知道一个Topic和多个Post。
同时,我们查询数据的时候,不可能要去一一遍历,而是要事先建立全局索引,实现 O(1)查找操作。
2.3 对数据及其索引进行 Init 初始化
首先是由文件参数来打开文件,基于File初始化Scanner,通过迭代器的方式遍历文件数据的每一行,通过 JSON 反序列化 转为结构体 存储至 内存Map。
对 Topic 索引进行初始化
对 Post 索引进行初始化
再次封装成一个总 Init 方法
2.4 有了索引,我们的查询就变得方便
创建 DAO
对于每个model都有各自的查询实体 Dao
单例模式 sync.Once
sync.once 主要适用于高并发的场景下,只执行一次的场景,这里基于 once 的实现模式就是我们平常说的单例模式,减少多余存储的空间浪费
Service 业务层
3.1 建立具体业务实体类
PageInfo 最终结果类
QueryPageInfoFlow 结果封装类
3.2 业务流程
并行处理准备数据:
Controller 页面控制层
4.1 页面数据响应类
Msg 打包业务状态信息
4.2 页面响应逻辑
Router 层
5.1 数据 Init
初始化数据索引
5.2 构建 Router 启动服务
初始化引擎配置 并 构建 Router 启动服务