今天使用 Beego 尝试做了一个超级简单的留言板(留言板是非常经典的练手项目 本文是接着上篇文章继续的 如果没看上篇文章或者不懂 GO 和 Beego 可能就看不懂了)
前端代码
要实现一个留言板首先就需要一个前端静态 HTML 和 CSS 及 JS 的代码,博主懒得写前端,所以直接用这个开源的前端:闲言 - 轻博客模版 https://www.layui.com/template/xianyan/
先将源代码解压,并将 JS 和 CSS 还有 Images 文件都放入到项目的 static 目录,将 HTML 文件放入 views 目录(典型的 MVC 架构)
安装 Beego 的 ORM
除了 Beego 的 ORM 还可以选择使用 GORM,本文就直接使用 Beego 的 ORM。
执行命令安装:go get github.com/astaxie/beego/orm
这些安装相关的可以在文档看到:https://beego.me/docs/mvc/model/overview.md
一般情况下是安装 Beego 的时候会直接安装了。
创建数据库和表
创建一个数据库和一个 post 表,表字段:+------------+----------+------+--------------+
| 字段名 | 类型 | 长度 | 备注 |
+------------+----------+------+--------------+
| id | int | 11 | 自增 ID 主键 |
| title | varchar | 128 | |
| content | text | | |
| created_at | datetime | | |
+------------+----------+------+--------------+
如果想要快速体验一下 Beego 的 CRUD 可以使用 Bee 工具进行生成代码:bee generate appcode [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-level=3]
将命令修改一下,执行自己的命令,如:bee generate appcode -tables="post" -driver=mysql -conn="root:root@tcp(127.0.0.1:3306)/liuyan"
过程中可能会询问是否生成 控制器 / 模型 / 路由 文件.(本文并不使用代码生成)
数据库配置
打开 conf 目录下的 app.conf 文件,添加几行配置信息(务必修改成自己的数据库信息):mysqluser = "root"
mysqlpass = "root"
mysqlhost = "127.0.0.1"
mysqldb = "liuyan"
mysqlport = 3306
在 main.go 导入 MySql 驱动包和 ORM 包,并写入一个 init 方法:package main
import (
_ "blog/routers"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"// 驱动
)
// 初始化应用设置, 通过 init 函数初始化数据库连接,go语言中这个函数会优先执行
func init() {
username := beego.AppConfig.String("mysqluser")
password := beego.AppConfig.String("mysqlpass")
host := beego.AppConfig.String("mysqlhost")
database := beego.AppConfig.String("mysqldb")
port := beego.AppConfig.String("mysqlport")
dsn := username + ":" + password + "@tcp(" + host + ":" + port + ")/" + database + "?charset=utf8&loc=Local"
orm.RegisterDataBase("default", "mysql", dsn)
}
func main() {
beego.Run()
}
写入路由
打开 routers/router.go 文件,往 init 方法写入三个路由:beego.Router("/", &controllers.IndexController{}, "get:Index")
beego.Router("/message", &controllers.IndexController{}, "get:Message")
beego.Router("/save", &controllers.IndexController{}, "post:Save")
创建模型
在 models 目录下创建一个与数据表名称一致的 go 文件,如博主写的 post.go 并定义模型结构以及向 ORM 注册模型:package models
import (
"github.com/astaxie/beego/orm"
"time"
)
// 定义 Post 模型,绑定 post 表结构
// 务必保证字段首字母大写 否则外部无法读取
type Post struct {
Id int `orm:"pk;auto"`// 自增主键
Title string `orm:"size(128)"`
Content string
Created_at time.Time
}
// 初始化函数,用来向 orm 注册 model
func init() {
// 向 orm 注册 Post 模型
orm.RegisterModel(&Post{})
}
控制器
最后就剩下编写控制器了,为了以后方便扩展,可以先编写一个基础控制器:package controllers
import (
"github.com/astaxie/beego"
)
type BaseController struct{
beego.Controller
}
// 定义返回结构
type ResultJson struct {
Code int
Msg string
Count int
Data interface{}
}
func (this *BaseController) responseSuccess(code int, msg string, data ...string) {
this.Data["json"] = &ResultJson{
Code: 0,
Msg: msg,
Data: data,
}
this.ServeJSON()
this.StopRun()
}
继续创建一个控制器并写入上面三个路由对应的方法,例如博主创建的 index.go :package controllers
import (
"blog/models"
"github.com/astaxie/beego/orm"
"time"
)
type IndexController struct{
BaseController
}
func (this *IndexController) Index() {
page, err := this.GetInt("page", 1)
if err != nil {
this.responseSuccess(301, "发生错误:" + err.Error())
}
var limit int
if page <= 1 {
limit = 0
}
if page > 1 {
limit = (page * 10) - 9
}
// 分页查询留言内容
o := orm.NewOrm()
Post := models.Post{}
var Posts []models.Post
num, err := o.QueryTable(Post).OrderBy("-id").Limit(10, limit).All(&Posts)
if num == 0 {
this.Abort("404")
}
if err != nil {
this.responseSuccess(502, "发生错误:" + err.Error())
}
this.Data["post_list"] = Posts// 留言内容
// 获取留言总数
total, err := o.QueryTable(Post).Count()
if err != nil {
this.responseSuccess(500, "发生错误:" + err.Error())
}
// 根据总数获取最后一页的页码
last_page := total / 10
last_page_float := total % 10
if last_page_float != 0 {
last_page++
}
this.Data["total"] = total
this.Data["last_page"] = last_page
this.Data["page"] = page
this.Data["next_page"] = page + 1
this.Data["pre_page"] = page - 1
this.TplName = "index.html"
}
func (this *IndexController) Message() {
this.TplName = "message.html"
}
func (this *IndexController) Save() {
title := this.GetString("title")
content := this.GetString("content")
if len(title) == 0 {
this.responseSuccess(301, "请输入标题")
}
if len(content) == 0 {
this.responseSuccess(301, "请输入内容")
}
o := orm.NewOrm()
Post := models.Post{}
Post.Title = title
Post.Content = content
Post.Created_at = time.Now()
if _, err := o.Insert(&Post); err != nil {
this.responseSuccess(501, "留言失败" + err.Error())
}
this.responseSuccess(0, "留言成功")
}
最后在 message.html 文件中请求 /save 接口即可。
效果
留言:
首页:
源码
百度云:https://pan.baidu.com/s/1xeTB4aVJWIKw8IRgVAEsGA
提取码:2ki2
如果不会 GO + Beego 或者懒得安装环境又想体验一下效果,可以尝试在 MySql 导入 database.sql 然后直接运行目录下的 blog.exe
如果运行 blog.exe 后返回:2020/11/06 21:34:22.308 [I] [asm_amd64.s:1374] http server Running on http://:8080
即可尝试在浏览器打开:localhost:8080