2020-11-06 21:41:56
围观(8474)
上篇文章 安装GO并体验了一下Beego框架 简单体验了一下框架。
今天使用 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
本文地址 : bubaijun.com/page.php?id=220
版权声明 : 未经允许禁止转载!
上一篇文章: 安装GO并体验了一下Beego框架
下一篇文章: Centos编译安装Nginx