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 // 数据库驱动
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
基础配置
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配置文件 - 林台山人 - 博客园
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>
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) // 返回数据
}
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": "音乐"
}
}
获取当前请求的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)
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
}
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
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"
}
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语言中文文档