不败君

前端萌新&初级后端攻城狮

使用GO语言Beego框架开发一个简易留言板

使用GO语言Beego框架开发一个简易留言板

2020-11-06 21:41:56

围观(4801)

上篇文章 安装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 接口即可。


效果

留言:

1.png


首页:

2.png


源码

百度云: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

评论:我要评论

zh 沙发

兄弟这前端玩得贼6啊,博客使用markdown吗?另外代码块的这部分前端代码可以分享一下吗

评论时间:2021-08-04 14:02:47

回复

不败君 板凳

@zh 前端用的是 Layui 的一个模板,名字是 闲言 - 轻博客模版 官网是 https://www.layui.com/template/xianyan/ 但是好像打开报 404 了,你用搜索引擎搜一下这个前端模板看看吧。

评论时间:2021-08-07 08:22:14

回复

发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语