做任何事情都需要做好规划,那么我们在开发博客系统之前,同样需要做好项目的规划,如何设置目录结构,如何理解整个项目的流程图,当我们理解了应用的执行过程,那么接下来的设计编码就会变得相对容易了
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/13.1.md#gopath以及项目设置)gopath以及项目设置
假设指定gopath是文件系统的普通目录名,当然我们可以随便设置一个目录名,然后将其路径存入GOPATH。前面介绍过GOPATH可以是多个目录:在window系统设置环境变量;在linux/MacOS系统只要输入终端命令`export gopath=/home/astaxie/gopath`,但是必须保证gopath这个代码目录下面有三个目录pkg、bin、src。新建项目的源码放在src目录下面,现在暂定我们的博客目录叫做beeblog,下面是在window下的环境变量和目录结构的截图:
[![](https://github.com/astaxie/build-web-application-with-golang/raw/master/zh/images/13.1.gopath.png?raw=true)](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/images/13.1.gopath.png?raw=true)
图13.1 环境变量GOPATH设置
[![](https://github.com/astaxie/build-web-application-with-golang/raw/master/zh/images/13.1.gopath2.png?raw=true)](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/images/13.1.gopath2.png?raw=true)
图13.2 工作目录在$gopath/src下
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/13.1.md#应用程序流程图)应用程序流程图
博客系统是基于模型-视图-控制器这一设计模式的。MVC是一种将应用程序的逻辑层和表现层进行分离的结构方式。在实践中,由于表现层从Go中分离了出来,所以它允许你的网页中只包含很少的脚本。
* 模型 (Model) 代表数据结构。通常来说,模型类将包含取出、插入、更新数据库资料等这些功能。
* 视图 (View) 是展示给用户的信息的结构及样式。一个视图通常是一个网页,但是在Go中,一个视图也可以是一个页面片段,如页头、页尾。它还可以是一个 RSS 页面,或其它类型的“页面”,Go实现的template包已经很好的实现了View层中的部分功能。
* 控制器 (Controller) 是模型、视图以及其他任何处理HTTP请求所必须的资源之间的中介,并生成网页。
下图显示了项目设计中框架的数据流是如何贯穿整个系统:
[![](https://github.com/astaxie/build-web-application-with-golang/raw/master/zh/images/13.1.flow.png?raw=true)](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/images/13.1.flow.png?raw=true)
图13.3 框架的数据流
1. main.go作为应用入口,初始化一些运行博客所需要的基本资源,配置信息,监听端口。
2. 路由功能检查HTTP请求,根据URL以及method来确定谁(控制层)来处理请求的转发资源。
3. 如果缓存文件存在,它将绕过通常的流程执行,被直接发送给浏览器。
4. 安全检测:应用程序控制器调用之前,HTTP请求和任一用户提交的数据将被过滤。
5. 控制器装载模型、核心库、辅助函数,以及任何处理特定请求所需的其它资源,控制器主要负责处理业务逻辑。
6. 输出视图层中渲染好的即将发送到Web浏览器中的内容。如果开启缓存,视图首先被缓存,将用于以后的常规请求。
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/13.1.md#目录结构)目录结构
根据上面的应用程序流程设计,博客的目录结构设计如下:
~~~
|——main.go 入口文件
|——conf 配置文件和处理模块
|——controllers 控制器入口
|——models 数据库处理模块
|——utils 辅助函数库
|——static 静态文件目录
|——views 视图库
~~~
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/13.1.md#框架设计)框架设计
为了实现博客的快速搭建,打算基于上面的流程设计开发一个最小化的框架,框架包括路由功能、支持REST的控制器、自动化的模板渲染,日志系统、配置管理等。
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/13.1.md#总结)总结
本小节介绍了博客系统从设置GOPATH到目录建立这样的基础信息,也简单介绍了框架结构采用的MVC模式,博客系统中数据流的执行流程,最后通过这些流程设计了博客系统的目录结构,至此,我们基本完成一个框架的搭建,接下来的几个小节我们将会逐个实现。
- 第一章 Go环境配置
- 1.1 Go安装
- 1.2 GOPATH 与工作空间
- 1.3 Go 命令
- 1.4 Go开发工具
- 1.5 小结
- 第二章 Go语言基础
- 2.1 你好,Go
- 2.2 Go基础
- 2.3 流程和函数
- 2.4 struct类型
- 2.5 面向对象
- 2.6 interface
- 2.7 并发
- 2.8 总结
- 第三章 Web基础
- 3.1 Web工作方式
- 3.2 Go搭建一个Web服务器
- 3.3 Go如何使得Web工作
- 3.4 Go的http包详解
- 3.5 小结
- 第四章 表单
- 4.1 处理表单的输入
- 4.2 验证表单的输入
- 4.3 预防跨站脚本
- 4.4 防止多次递交表单
- 4.5 处理文件上传
- 4.6 小结
- 第五章 访问数据库
- 5.1 database/sql接口
- 5.2 使用MySQL数据库
- 5.3 使用SQLite数据库
- 5.4 使用PostgreSQL数据库
- 5.5 使用beedb库进行ORM开发
- 5.6 NOSQL数据库操作
- 5.7 小结
- 第六章 session和数据存储
- 6.1 session和cookie
- 6.2 Go如何使用session
- 6.3 session存储
- 6.4 预防session劫持
- 6.5 小结
- 第七章 文本处理
- 7.1 XML处理
- 7.2 JSON处理
- 7.3 正则处理
- 7.4 模板处理
- 7.5 文件操作
- 7.6 字符串处理
- 7.7 小结
- 第八章 Web服务
- 8.1 Socket编程
- 8.2 WebSocket
- 8.3 REST
- 8.4 RPC
- 8.5 小结
- 第九章 安全与加密
- 9.1 预防CSRF攻击
- 9.2 确保输入过滤
- 9.3 避免XSS攻击
- 9.4 避免SQL注入
- 9.5 存储密码
- 9.6 加密和解密数据
- 9.7 小结
- 第十章 国际化和本地化
- 10.1 设置默认地区
- 10.2 本地化资源
- 10.3 国际化站点
- 10.4 小结
- 第十一章 错误处理,调试和测试
- 11.1 错误处理
- 11.2 使用GDB调试
- 11.3 Go怎么写测试用例
- 11.4 小结
- 第十二章 部署与维护
- 12.1 应用日志
- 12.2 网站错误处理
- 12.3 应用部署
- 12.4 备份和恢复
- 12.5 小结
- 第十三章 如何设计一个Web框架
- 13.1 项目规划
- 13.2 自定义路由器设计
- 13.3 controller设计
- 13.4 日志和配置设计
- 13.5 实现博客的增删改
- 13.6 小结
- 第十四章 扩展Web框架
- 14.1 静态文件支持
- 14.2 Session支持
- 14.3 表单及验证支持
- 14.4 用户认证
- 14.5 多语言支持
- 14.6 pprof支持
- 14.7 小结
- 附录A 参考资料