为方便小伙伴们快速使用GoFrame框架创建一个基本的项目,我们这里以简单的开发示例,使用GoFrame框架来创建一个简单的API服务项目,该项目实现以下几个示例接口:

  1. 用户注册
  2. 用户登录
  3. 用户注销
  4. 登录状态判断
  5. 账号/昵称唯一性校验

并包含以下中间件特性:

  1. 允许跨域访问
  2. 包含权限校验

    源码仓库

    该示例项目的源代码仓库位于: https://github.com/gogf/gf-demos
    由于文档的粘贴的代码可能会滞后于仓库代码,建议通过下载该仓库代码查看示例。后续章节主要对其中的主要代码做介绍。
    各位可以通过 开始运行 章节末尾示例的curl命令行方式进行测试,也可以通过/document/postman目录的postman配置进行测试。

    项目结构

    如果是Package源码包项目,开发者可随意定义目录结构。
    如果是业务类型项目,GoFrame官方推荐的Go项目目录结构如下: ```go / ├── app │ ├── api │ ├── dao │ ├── model │ └── service ├── boot ├── config ├── docker ├── document ├── i18n ├── library ├── packed ├── public ├── router ├── template ├── Dockerfile ├── go.mod └── main.go
  1. | **目录/文件名称** | **说明** | ** |
  2. | --- | --- | --- |
  3. | app | 业务逻辑层 | 所有的业务逻辑存放目录。 |
  4. | - api | 业务接口 | 接收/解析用户输入参数的入口/接口层。 |
  5. | - dao | 数据访问 | 数据库的访问操作,仅包含最基础的数据库CURD方法 |
  6. | - model | 结构模型 | 数据结构管理模块,管理数据实体对象,以及输入与输出数据结构定义 |
  7. | - service | 逻辑封装 | 业务逻辑封装层,实现特定的业务需求,可供不同的包调用。 |
  8. | boot | 初始化包 | 用于项目初始化参数设置,往往作为main.go中第一个被import的包。 |
  9. | config | 配置管理 | 所有的配置文件存放目录。 |
  10. | docker | 镜像文件 | Docker镜像相关依赖文件,脚本文件等等。 |
  11. | document | 项目文档 | Documentation项目文档,如: 设计文档、帮助文档等等。 |
  12. | i18n | I18N国际化 | I18N国际化配置文件目录。 |
  13. | library | 公共库包 | 公共的功能封装包,往往不包含业务需求实现。 |
  14. | packed | 打包目录 | 将资源文件打包的Go文件存放在这里,boot包初始化时会自动调用。 |
  15. | public | 静态目录 | 仅有该目录下的文件才能对外提供静态服务访问。 |
  16. | router | 路由注册 | 用于路由统一的注册管理。 |
  17. | template | 模板文件 | MVC模板文件存放的目录。 |
  18. | Dockerfile | 镜像描述 | 云原生时代用于编译生成Docker镜像的描述文件。 |
  19. | go.mod | 依赖管理 | 使用Go Module包管理的依赖描述文件。 |
  20. | main.go | 入口文件 | 程序入口文件。 |
  21. 在实践中,小伙伴们可以根据实际情况增删目录。<br />注意:如果需要提供静态服务,那么所有静态文件都需要存放到public目录下,仅有该目录下的静态文件才能被外部直接访问。不推荐将程序当前运行目录加入到静态服务中。
  22. > 项目创建推荐使用GF工具链gf init命令,具体请参考 开发工具 章节。
  23. <a name="zdq1i"></a>
  24. ## 分层设计
  25. GoFrame官方推荐的代码分层设计。
  26. <a name="FLLQa"></a>
  27. ### 控制器
  28. 控制器负责接收并响应客户端的输入与输出,包括对输入参数的过滤、转换、校验,对输出数据结构的维护,并调用service实现业务逻辑处理。<br />控制器代码位于/app/api
  29. <a name="nclPM"></a>
  30. ### 业务逻辑
  31. 业务逻辑是需要封装的,特别是一些可复用的业务逻辑,并被控制器调用实现业务逻辑处理。<br />逻辑封装的代码位于/app/service
  32. <a name="DJa2a"></a>
  33. ### 数据访问
  34. 数据访问代码层负责所有的数据集合(数据表)访问收口,将数据集合按照面向对象的方式进行封装。<br />数据访问的代码位于/app/dao
  35. <a name="PUv4V"></a>
  36. ### 模型定义
  37. 模型定义代码层负责维护所有的数据结构定义,包括所有的输入输出数据结构定义。<br />模型定义代码层中仅包含数据结构定义,不包含任何的方法定义。<br />模型定义的代码位于/app/model
  38. <a name="xjg84"></a>
  39. ### 模板解析
  40. 模板解析是可选的,在实践中往往可以采用MVVM的模式,例如使用vue/react等框架实现模板解析。如果使用经典的模板解析,可以通过GoFrame框架强大的模板引擎实现模板解析。<br />模板文件的存放于/template
  41. <a name="lOsf2"></a>
  42. ## 数据库设计
  43. 我们创建一个简单的用户表来做演示。<br />[https://github.com/gogf/gf-demos/blob/master/document/sql/create.sql](https://github.com/gogf/gf-demos/blob/master/document/sql/create.sql)
  44. ```sql
  45. CREATE TABLE `user` (
  46. `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  47. `passport` varchar(45) NOT NULL COMMENT '用户账号',
  48. `password` varchar(45) NOT NULL COMMENT '用户密码',
  49. `nickname` varchar(45) NOT NULL COMMENT '用户昵称',
  50. `create_at` datetime DEFAULT NULL COMMENT '创建时间',
  51. `update_at` datetime DEFAULT NULL COMMENT '更新时间',
  52. PRIMARY KEY (`id`)
  53. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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