项目结构

如果是Package源码包项目,开发者可随意定义目录结构。
如果是业务类型项目,GoFrame官方推荐的Go项目目录结构如下:

  1. /
  2. ├── app
  3. ├── api
  4. ├── dao
  5. ├── model
  6. └── service
  7. ├── boot
  8. ├── config
  9. ├── docker
  10. ├── document
  11. ├── i18n
  12. ├── library
  13. ├── packed
  14. ├── public
  15. ├── router
  16. ├── template
  17. ├── Dockerfile
  18. ├── go.mod
  19. └── 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

数据库设计

我们创建一个简单的用户表来做演示。

  1. CREATE TABLE `user` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  3. `passport` varchar(45) NOT NULL COMMENT '用户账号',
  4. `password` varchar(45) NOT NULL COMMENT '用户密码',
  5. `nickname` varchar(45) NOT NULL COMMENT '用户昵称',
  6. `create_at` datetime DEFAULT NULL COMMENT '创建时间',
  7. `update_at` datetime DEFAULT NULL COMMENT '更新时间',
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

为简化示例项目的接口实现复杂度,这里的password没有做任何加密处理,明文存放密码数据。