项目结构
如果是Package
源码包项目,开发者可随意定义目录结构。
如果是业务类型项目,GoFrame
官方推荐的Go
项目目录结构如下:
/
├── app
│ ├── api
│ ├── dao
│ ├── model
│ └── service
├── boot
├── config
├── docker
├── document
├── i18n
├── library
├── packed
├── public
├── router
├── template
├── Dockerfile
├── go.mod
└── main.go
目录/文件名称 | 说明 | 描述 |
---|---|---|
app |
业务逻辑层 | 所有的业务逻辑存放目录。 |
- api |
业务接口 | 接收/解析用户输入参数的入口/接口层。 |
- dao |
数据访问 | 数据库的访问操作,仅包含最基础的数据库CURD 方法 |
- model |
数据模型 | 数据管理层,仅用于操作管理数据,如数据库操作。 |
- service |
逻辑封装 | 业务逻辑封装层,实现特定的业务需求,可供不同的包调用。 |
boot |
初始化包 | 用于项目初始化参数设置,往往作为main.go 中第一个被 import 的包。 |
config |
配置管理 | 所有的配置文件存放目录。 |
docker |
镜像文件 | Docker 镜像相关依赖文件,脚本文件等等。 |
document |
项目文档 | Documentation项目文档,如: 设计文档、帮助文档等等。 |
i18n |
I18N国际化 | I18N国际化配置文件目录。 |
library |
公共库包 | 公共的功能封装包,往往不包含业务需求实现。 |
packed |
打包目录 | 将资源文件打包的Go 文件存放在这里, boot 包初始化时会自动调用。 |
public |
静态目录 | 仅有该目录下的文件才能对外提供静态服务访问。 |
router |
路由注册 | 用于路由统一的注册管理。 |
template |
模板文件 | MVC 模板文件存放的目录。 |
Dockerfile |
镜像描述 | 云原生时代用于编译生成Docker镜像的描述文件。 |
go.mod |
依赖管理 | 使用Go Module 包管理的依赖描述文件。 |
main.go |
入口文件 | 程序入口文件。 |
在实践中,小伙伴们可以根据实际情况增删目录。
注意:如果需要提供静态服务,那么所有静态文件都需要存放到public
目录下,仅有该目录下的静态文件才能被外部直接访问。不推荐将程序当前运行目录加入到静态服务中。
分层设计
控制器
控制器负责接收并响应客户端的输入与输出,包括对输入参数的过滤、转换、校验,对输出数据结构的维护,并调用service
实现业务逻辑处理。
控制器代码位于/app/api
。
业务逻辑
业务逻辑是需要封装的,特别是一些可复用的业务逻辑,并被控制器调用实现业务逻辑处理。
逻辑封装的代码位于/app/service
。
数据访问
数据访问代码层负责所有的数据集合(数据表)访问收口,将数据集合按照面向对象的方式进行封装。
数据访问的代码位于/app/dao
。
模型定义
模型定义代码层负责维护所有的数据结构定义,包括所有的输入输出数据结构定义。
模型定义代码层中仅包含数据结构定义,不包含任何的方法定义。
模型定义的代码位于/app/model
。
模板解析
模板解析是可选的,在实践中往往可以采用MVVM
的模式,例如使用vue
/react
等框架实现模板解析。
模板文件的存放于/template
。
数据库设计
我们创建一个简单的用户表来做演示。
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`passport` varchar(45) NOT NULL COMMENT '用户账号',
`password` varchar(45) NOT NULL COMMENT '用户密码',
`nickname` varchar(45) NOT NULL COMMENT '用户昵称',
`create_at` datetime DEFAULT NULL COMMENT '创建时间',
`update_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
为简化示例项目的接口实现复杂度,这里的password
没有做任何加密处理,明文存放密码数据。