beego使用php,使用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 接口即可。

效果

留言:

watermark

首页:

watermark

源码

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

  • 1
    点赞
  • 1
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值