当前位置: 首页 > 工具软件 > Beego > 使用案例 >

golang beego

楚志强
2023-12-01

安装

go 1.13
环境设置:
GO111MODULE=on
GOPROXY=https://goproxy.cn,direct

安装:
go get github.com/astaxie/beego
go get github.com/beego/bee

beego其他相关包
go get github.com/dgrijalva/jwt-go   // jwt
go get github.com/astaxie/beego/orm  // orm
go get github.com/go-sql-driver/mysql  // 数据库驱动

beego项目创建

bee new demo

目录结构

demo
├─conf  // 配置文件
│ └── app.conf
├─controllers  // 类似django view.py
│ └── default.go
├─models  // 数据库 对象关系映射
│ └── models.go
├─routers  // 路由
│ └── router.go
├─static  // 静态资源
│  ├─css
│  ├─img
│  └─js
├─views  // html文件
│ └── index.tpl
├─tests
│ └── default_test.go
├─go.mod
├─go.sum
└─main.go

配置文件 app.conf

基础配置

appname = myapp1

# 开发模式
runmode = dev
[dev]
httpport=8080
[prod]
httpport=8081
[test]
httpport = 8082

# mysql配置
mysqladdr="127.0.0.1
mysqlport=9090
mysqluser=root
mysqlpassword=123456

# 处理json数据
copyrequestbody=true

更多配置: beego配置文件 - 林台山人 - 博客园

Controller

type MainController struct {
	beego.Controller
}

func (c *MainController) Get() {
	c.Data["Website"] = "beego.me"
	c.Data["Email"] = "astaxie@gmail.com"
	c.TplName = "index.html"
}

func (c *MainController) Post() {
	c.Data["name"] = "xiongda"
	c.TplName = "test.html"
}

c.Data 将数据渲染到html模板
c.TplName 渲染的html

Controller函数要有返回值response
c.ServeJSON()  // 返回json
c.Ctx.WriteString("hello")  // 返回string
c.TplName  // 返回html

模板语法

<h1>{{.Website}}</h1>
<h1>{{.Email}}</h1>

接收json数据

app.conf 配置文件中添加

copyrequestbody = true
package controllers

import (
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
)

type User struct {
	Name string
	Pwd string
}

func (u *UserController) Post() {
	var user User
	data := u.Ctx.Input.RequestBody
	err := json.Unmarshal(data, &user)
	if err != nil {
		fmt.Println("json.Unmarshal is err:", err.Error())
	}
	u.Ctx.WriteString(user.Name)  // 返回数据
}

返回json数据

type DataController struct {
	beego.Controller
}

type LIKE struct {
	Food string
	Watch string
	Listen string
}

type JSONS struct {
	//必须的大写开头
	Code string
	Msg  string
	User []string `json:"user_info"`//key重命名,最外面是反引号
	Like LIKE
}

func (c *DataController) Get() {
	data := &JSONS{"100", "获取成功",
		[]string{"maple","18"},LIKE{"蛋糕","电影","音乐"}}

	c.Data["json"] = data  // 这里必须是 "json"
	c.ServeJSON()
}
{
    "Code": "100",
    "Msg": "获取成功",
    "user_info": [
        "maple",
        "18"
    ],
    "Like": {
        "Food": "蛋糕",
        "Watch": "电影",
        "Listen": "音乐"
    }
}

beego中获取url以及参数

获取当前请求的referer
fmt.Println(this.Ctx.Request.Referer())
输出:http://localhost:8080/swagger/

获取当前uri,
fmt.Println(this.Ctx.Request.RequestURI)
输出: /v1/weather/?longitude=1&latitude=2

获取query参数,形如 /?longitude=1&latitude=2
fmt.Println(this.Ctx.Input.Query("longitude"))
fmt.Println(this.Ctx.Input.Query("latitude"))

ps:正常情况下,Query的key不应当以:开头,以免和Param里的key冲突

获取path参数, 形如http://localhost:8080/userinfo/{uid}这种
fmt.Println(u.GetString(":uid"))
或者this.Ctx.Input.Param(":uid")

这里是字符串,如果是其他类型参考
GetString(key string) string
GetStrings(key string) []string
GetInt(key string) (int64, error)
GetBool(key string) (bool, error)
GetFloat(key string) (float64, error)

beego获取header中数据

type HeaderController struct {
	beego.Controller
}

func (c *HeaderController) Get()  {
	h:= c.Ctx.Request.Header
	fmt.Println(h)
	/*
	map[Accept:[*] Accept-Encoding:[gzip, deflate, br] Cache-Control:[no-cache] Connection:[keep-alive] Content-Length:[62] Content-Type:[application/json] Postman-Token:[98275d21-0730-412a-90af-a2c74bbfb369] User
	-Agent:[PostmanRuntime/7.26.8] Usertoken:[11122233]]
	*/
	token := c.Ctx.Request.Header["Usertoken"]
	fmt.Println(token)  // 11122233
}

routers 

beego路由配置 - 简书

package routers

import (
	"beedemo/controllers"
	"github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{})
    beego.Router("/user", &controllers.UserController{})
    beego.Router("/data/:id", &controllers.DataController{})
}

对应的url:
127.0.0.1:8080
127.0.0.1:8080/user
127.0.0.1:8080/data/81

Models

安装orm及数据库驱动

go get github.com/astaxie/beego/orm  // orm
go get github.com/go-sql-driver/mysql  // MySQL 数据库驱动
go get github.com/lib/pq               // PostgreSQL 数据库驱动
go get github.com/mattn/go-sqlite3     // Sqlite3 数据库驱动

连接数据库及创建表

mysql, sqlite, 等数据库链接方法beego中各类数据库连接方式 - 天文学 - 博客园

package models
import (
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)
type User struct {
	Id int
	Name string
	Pwd	 string
}

func init() {
	// 连接数据库
	orm.RegisterDataBase(
		"default",  // 数据库别名, 默认default
		"mysql",	// 使用的数据库引擎, beego可使用 mysql, sqlite, PostgreSQL
		"root:pwd@tcp(127.0.0.1:3306)/beego-db?charset=utf8",
		// 数据库用户名:数据库密码@tcp(数据库IP:POST)/数据库名?使用的字符集
		)
	// 映射表
	orm.RegisterModel(
		new(User),
		//new(TableName),
		)
	// 生成表
	orm.RunSyncdb(
		"default",
		false,  // 强制修改表结构,如修改字段 false:不强制
		true,	// 显示创建过程 true:显示
		)
}
package main

import (
	_ "demo/routers"
	"github.com/astaxie/beego"
	_ "demo/models"  # 引入models包,执行model中的init,创建表
)

func main() {
	beego.Run()
}

字段类型及约束条件

type User struct {
    Id   int `orm:"pk;auto;column(user_id)"` //表示设置为主键并且自增,列名为user_id
    Name string `orm:"size(100)"column(user_name)`
    Sex  int `orm:"size(2);column(gender)"`
    CreateDate time.Time `orm:"type(date);column(create_date)"`
    Age int `orm:size(10);column(age)`
}
//注意:以上的字段名必须大写,否则无法识别

关于字段属性的设置:例如字段大小,字段的为空不为空等设置

多组设置间使用 ; 分隔,每组内设置的值如果是多个,使用 , 分隔。

在设置属性时都是以orm:"你的设置"开头

设置int类型通常为id字段自增并且为主键:orm:"pk;auto"

为空设置:数据库表默认为 NOT NULL,设置 null 代表 ALLOW NULL

Name string orm:"null" 表示name字段可以为空

为单个字段添加索引或者唯一索引:Name strig orm:"index" 或者`Name string orm:"unique"

为字段设置对应的列名: Name string orm:"column(user_name)"

设置字段的大写设置 size 以后,db type 将使用 varchar(size)Name string orm:"size(10)"

为字段设置浮点数精度:Money float64 orm:"digits(12);decimals(4)" 结果显示9999.9999

时间类型的设置

设置为 date 时,time.Time 字段的对应 db 类型使用 date

Created time.Time `orm:"auto_now_add;type(date)"`

设置为 datetime 时,time.Time 字段的对应 db 类型使用 datetime

Created time.Time `orm:"auto_now_add;type(datetime)"`

设置为字段添加注释:注释中禁止包含引号

Status int orm:"default(1)" description:"这是状态字段"

自定义表名

默认是生成以结构名小写并且加上s结尾的表名,也可以自行设置表名

func (u *模型结构名) TableName() string {
    return "你设置的表名"
}

自定义索引

可以为单个字段或多个字段添加索引

// 多字段索引
func (u *模型结构名) TableIndex() [][]string {
	return [][]string{
		[]string{"字段1", "字段2"},
	}
}

// 多字段唯一键
func (u *模型结构名) TableUnique() [][]string {
	return [][]string{
		[]string{"字段1", "字段2"},
	}
}

自定义数据库引擎

对mysql可以支持自定义引擎

// 设置引擎为 INNODB  mysql默认使用INNODB
func (u *模型结构名) TableEngine() string {
    return "INNODB"
}

CURD

package controllers

import (
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"demo/models"
	"github.com/astaxie/beego/orm"
	"strconv"
)

func (c *DataController)Post(){
	data := c.Ctx.Input.RequestBody

	// 1. 实例化orm对象
	o := orm.NewOrm()
	// 2. 实例化表结构体对象
	user := models.User{}
	err := json.Unmarshal(data, &user)
	if err != nil {
		fmt.Println("json.Unmarshal is err:", err.Error())
	}
	// 3. 操作表
	// 3.1 Insert 插入数据
	id, err := o.Insert(&user)
	if err != nil{
		beego.Info("插入失败", err)
		return
	}
	res := make(map[string]interface{})
	res["code"] = 2000
	res["msg"] = fmt.Sprintf("创建成功, id: %s", strconv.Itoa(int(id)))
	c.Data["json"] = res
	c.ServeJSON()

    // 3.2 ReadOrCreate 查询插入
    res := make(map[string]interface{})
	res["code"] = 2000
	if created, id, err := o.ReadOrCreate(&user, "Name"); err == nil {
		// o.ReadOrCreate(&user, "Name") 类似 User.object.filter(name=request.data.get('Name')).first()
		// 这里的(&user, "Name") 是按照 user对象里的Name字段的 值查询
		if created {
			res["msg"] = fmt.Sprintf("创建成功, id: %s", strconv.Itoa(int(id)))
		} else {
			res["msg"] = fmt.Sprintf("已存在, id: %s", strconv.Itoa(int(id)))
		}
	}else {
		res["code"] = 4001
		res["msg"] = fmt.Sprintf("创建失败, err", err)
	}
	c.Data["json"] = res
	c.ServeJSON()

    // 3.3 Read 查询
    res := make(map[string]interface{})
	res["code"] = 2000
	err = o.Read(&user, "Name")
	if err == orm.ErrNoRows {
		res["msg"] = "不存在"
	} else if err == orm.ErrMissPK {
		res["msg"] = "找不到主键"
	} else {
		res["Id"] = user.Id
		res["Name"] = user.Name
	}
	c.Data["json"] = res
	c.ServeJSON()

    u := User{}
	_ = json.Unmarshal(data, &u)
	res := make(map[string]interface{})
	res["code"] = 2000
	// 3.3 Read
	err = o.Read(&user, "Name")
	if err == orm.ErrNoRows {
		res["msg"] = "不存在"
	} else if err == orm.ErrMissPK {
		res["msg"] = "找不到主键"
	} else {
		// 3.4 Update 修改
		user.Pwd = u.Pwd
		if num, err := o.Update(&user, "Pwd"); err == nil {
			fmt.Println(num)
			res["msg"] = "修改成功"
		}
	}
	c.Data["json"] = res
	c.ServeJSON()
}

更多操作 model设计 · Go语言中文文档

 类似资料:

相关阅读

相关文章

相关问答