2020-11-06 21:41:56
围观(6842)
上篇文章 安装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