
2.2 项目设计
在完成初步的示例演示后,下面进入具体的预备开发阶段。一般在正式进入业务开发前,需要对本次需求的迭代内容进行多类的设计和评审,即无设计不开发。但是目前还有很多初始化的东西没有做,因此在本节中,我们主要对项目的目录结构、接口方案、路由注册、数据库等内容进行设计和开发。
2.2.1 目录结构
创建项目的标准目录结构,以便后续的开发,最终的目录结构如下所示:

● configs:配置文件。
● docs:文档集合。
● global:全局变量。
● internal:内部模块。
■ dao:数据访问层(Database Access Object),所有与数据相关的操作都会在dao层进行,例如 MySQL、Elasticsearch等。
■ middleware:HTTP中间件。
■ model:模型层,用于存放model对象。
■ routers:路由相关的逻辑。
■ service:项目核心业务逻辑。
● pkg:项目相关的模块包。
● storage:项目生成的临时文件。
● scripts:各类构建、安装、分析等操作的脚本。
● third_party:第三方的资源工具,如Swagger UI。
2.2.2 数据库
在本次的项目开发中,我们主要实现两个基础业务功能,功能点如下:
● 标签管理:文章所归属的分类,也就是标签。通常我们会给文章打好几个标签,用于标识文章内容的要点和要素,以便读者的识别和SEO的收录等。
● 文章管理:对整个文章内容的管理,并且需要把文章和标签进行关联。
要想做业务开发,首先就要设计数据库。因此我们将根据业务模块进行 MySQL 数据库的创建和表设计,如图2-2所示。

图2-2
1.创建数据库
准备一个MySQL数据库,5.7版本即可。在MySQL中执行如下SQL语句:

通过上述 SQL 语句,数据库会创建本项目的数据库 blog_service,并将它的默认编码设置为utf8mb4。另外,在每个数据表中,都包含同样的公共字段:

在创建数据表时,注意将其同时包含写入就可以了。
2.创建标签表

创建标签表,表字段主要为标签的名称、状态和公共字段。
3.创建文章表

创建文章表,表字段主要为文章的标题、封面图、内容概述和公共字段。
4.创建文章标签关联表


创建文章标签关联表,这个表主要用于记录文章和标签之间的1∶N的关联关系。
2.2.3 创建model
在创建完成数据库的表之后,到internal/model目录中创建对应的model对象,以便后续使用应用程序。
1.创建公共model
在internal/model目录下创建model.go文件,写入如下代码:

2.创建标签model
在internal/model目录下创建tag.go文件,写入如下代码:

3.创建文章model
在internal/model目录下创建article.go文件,写入如下代码:


4.创建文章标签model
在internal/model目录下创建article_tag.go文件,写入如下代码:

2.2.4 路由
在完成数据库的设计之后,我们需要对业务模块的管理接口进行设计。在这部分内容中,最核心的就是设计和编写增删改查的RESTful API。在RESTful API中,HTTP方法对应的行为和动作如下:
● GET:读取和检索动作。
● POST:新增和新建动作。
● PUT:更新动作,用于更新一个完整的资源,要求为幂等。
● PATCH:更新动作,用于更新某一个资源的一个组成部分。也就是说,当只需更新该资源的某一项时,应该使用PATCH而不是PUT,可以不幂等。
● DELETE:删除动作。
下面就我们根据RESTful API的基本规范,对业务模块设计路由规则,从业务角度划分多个管理接口。
1.标签管理
标签管理如表2-1所示。
表2-1

续表

2.文章管理
文章管理如表2-2所示。
表2-2

3.路由管理
在确定了业务接口设计后,需要对业务接口进行基础编码,以确定其方法原型。把当前工作区切换到项目目录的internal/routers下,新建router.go文件,写入如下代码:

2.2.5 处理程序
下面编写对应路由的处理方法。在目录internal/routers/api下新建v1文件夹,在v1文件夹中新建tag.go(标签)和article.go(文章)文件,写入如下代码。
1.标签方法

2.文章方法

3.路由管理
在编写好路由的 Handler 方法后,只需将其注册到对应的路由规则上即可。打开项目目录internal/routers下的router.go文件,修改代码如下:


2.2.6 启动接入
在编写完模型、路由的代码后,即可修改前面章节编写的 main.go 文件,把它改造为这个项目的启动文件,修改代码如下:

通过自定义http.Server,可以设置监听的TCP Endpoint、处理的程序、允许读取/写入的最大时间、请求头的最大字节数等基础参数,最后调用ListenAndServe方法即可开始监听。
2.2.7 验证
在项目根目录下,执行go run main.go将服务运行起来,然后查看服务是否可以正常运行,代码如下:

启动信息表示路由注册正常,再实际调用一下接口,如果能够正常返回,就大功告成了。
2.2.8 小结
本节我们完成了一个项目的第一步,即项目的标准目录创建、数据库设计、数据模型编写、接口方法的设计和接口处理方法及启动接入。