简介:
GoFrame是一款中国人开发的大而全的框架,类似于Python的Django,常用的功能和模块应有尽有。goframe.org有完善、细致、全面的中文文档,非常适合中国人使用。
目标:
目前官网文档虽细致、全面,但没有一款面向新手的详细案例教程,官网提供的一个网络聊天室的案例go-demos,但没有面向新手的从头开始一步步的详细记录和讲解。在此我尝试用goframe一个面向新手的从头开始一步步搭建个人博客WEB应用。以下是开发流程:
开发环境:
-
安装运行环境
安装go和goland,这一步随处都能找到,官网也有,难度也低,略过…… -
安装命令行工具
go get -u -v github.com/gogf/gf -
快速搭建
cd ~/go/src // 这一行看自己GOPATH设置而定
gf init blog
数据库设计:
开发项目前先理清思路,把数据结构搞清楚,我们要做的是个人博客Web应用,用来发布个人的博客。博客按标签分类展示博客标题、作者、简介、发布日期,点击博客标题后跳转到该博客的详细内容,另有后台管理功能用来添加、修改、删除文章。所以需要3张表来保存相关数据。
数据库采用mysql,以下是数据库过程:
- 建库:CREATE DATABASE blog;
- 建认证表:
CREATE TABLE `blog_auth` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(10) DEFAULT '' COMMENT '账号',
`password` varchar(10) DEFAULT '' COMMENT '密码',
`url` varchar(10) NOT NULL COMMENT 'URL名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 建标签表:
CREATE TABLE `blog_tag` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT '' COMMENT '标签名称',
`state` tinyint unsigned DEFAULT '1' COMMENT '状态 0为禁用、1为启用',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='文章标签管理';
- 建文章表:
CREATE TABLE `blog_article` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`tag_id` int unsigned DEFAULT '0' COMMENT '标签ID',
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '文章标题',
`desc` varchar(255) DEFAULT '' COMMENT '简述',
`content` text COMMENT '内容',
`author` varchar(10) COMMENT '作者',
`date` int unsigned DEFAULT '0' COMMENT '创建时间',
`deleted-state` tinyint unsigned DEFAULT '1' COMMENT '状态 0为删除、1为正常',
`deleted-date` int unsigned DEFAULT '0' COMMENT '删除时间',
PRIMARY KEY (`id`),
KEY `fktid` (`tag_id`),
CONSTRAINT `fktid` FOREIGN KEY (`tag_id`) REFERENCES `blog_tag` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='文章管理';
- 数据库dao
gf gen dao -l "mysql:你的帐号:你的密码@tcp(127.0.0.1:3306)/blog"
路由规划
我们要做的是个人博客,所以路由规划这部分内容相对较少。
- /,所有栏目列表(只有GET),即博客首页
- /:tag,指定栏目列表(只有GET),即栏目分页;tag为纯字母
- /:tag/:id,指定文章URL(只有GET),栏目名要从数据库中获得,栏目名不能为admin(和后台管理URL冲突);id为纯数字
- /admin,后台管理URL,符合REST风格的(增:POST、删:DELETE、改:PUT、查:GET)
api
- blog/app/api/home.go
package api
import "github.com/gogf/gf/net/ghttp"
func Home(r *ghttp.Request) {
r.Response.Writeln("博客首页!!!")
}
- blog/app/api/tag.go
package api
import "github.com/gogf/gf/net/ghttp"
func Tag(r *ghttp.Request) {
r.Response.Writeln("栏目是:",r.Get("tag"))
}
- blog/app/api/show.go
package api
import "github.com/gogf/gf/net/ghttp"
func Show(r *ghttp.Request) {
r.Response.Writeln("栏目是:",r.Get("tag"),"\n","文章id是:",r.Get("article"))
}
- blog/app/api/admin.go
package api
import (
"github.com/gogf/gf/net/ghttp"
)
type controller struct{}
var Admin = controller{}
// Put RESTFul - 增
func (c *controller) Put(r *ghttp.Request) {
r.Response.Write("博客后台管理!!!", "增")
}
// Delete RESTFul - 删
func (c *controller) Delete(r *ghttp.Request) {
r.Response.Write("博客后台管理!!!", "删")
}
// Post RESTFul - 改
func (c *controller) Post(r *ghttp.Request) {
r.Response.Write("博客后台管理!!!", "改")
}
// Get RESTFul - 查
func (c *controller) Get(r *ghttp.Request) {
r.Response.Write("博客后台管理!!!", "查")
}
func (c *controller) Init(r *ghttp.Request) {
r.Response.Write("\n网址解析前\n")
}
func (c *controller) Shut(r *ghttp.Request) {
r.Response.Write("\n网址解析后\n")
}
router
- blog/router/router.go
package router
import (
"blog/app/api"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
)
func init() {
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.GET("/", api.Home) // 博客首页
group.GET("/:tag/", api.Tag) // 栏目入口
group.GET("/:tag/:article", api.Show) // 文章入口
group.REST("/admin", api.Admin) // 后台管理入口
})
}
test.http
### 测试首页
GET localhost:8199
### 测试栏目分页
GET localhost:8199/go
### 测试文章
GET localhost:8199/go/1
### 测试后台管理-增
PUT localhost:8199/admin
### 测试后台管理-删
DELETE localhost:8199/admin
### 测试后台管理-改
POST localhost:8199/admin
### 测试后台管理-查
GET localhost:8199/admin
使用Goland执行测试文件,可以发现所有预设测试。
第一步的工作暂且告一段落,下一步计划先完善博客首页、栏目入口、文章入口,模板文件、添加展示数据,再下一步做后台管理。