学习GoFrame框架,从头开始一步步搭建个人博客WEB应用(上)

简介:

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执行测试文件,可以发现所有预设测试。

第一步的工作暂且告一段落,下一步计划先完善博客首页、栏目入口、文章入口,模板文件、添加展示数据,再下一步做后台管理。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值