源码:https://github.com/Nicolana/hello-bee/tree/main
开始搞后台了,记录一下
介绍
beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,同时也是一个关注度和使用量都比价高的开源项目。我认为它是go初学者比较容易上手的一门MVC Web框架。
它是由国内团队开发的开源框架,文档基本都是中文,简单易懂。
安装
go get -u github.com/beego/beego/v2
go get -u github.com/beego/bee/v2
- beege和bee是两个概念。beego是框架,bee是工具,是命令。
- 还得确认是否将
$GOPATH/bin写入
到系统环境变量里面去了
没用代理可能不能安装成功,还好我有代理 hhh
创建应用
利用bee
工具快速创建应用
Windows平台
cd %GOPATH%/src
bee new hello
cd hello
bee run
一旦程序开始运行,您就可以在浏览器中打开 http://localhost:8080/ 进行访问。
项目结构
beego项目结构
├── conf //配置文件
│ └── app.conf
├── controllers //控制器
│ └── default.go
├── main.go
├── models //模型
│ └── models.go
├── routers //路由
│ └──router.go
├── static //静态文件
│ ├── css
│ ├── ico
│ ├── img
│ └── js
└── views //界面
└── index.tpl
编写一个简单的Controller,并展示到前端
按照惯例,先写一个Hello World
程序
第一步,创建controller
在hello/controllers
里面新建一个helloworld.go
hello/controllers/helloworld.go
package controllers
import beego "github.com/beego/beego/v2/server/web"
type HelloController struct {
beego.Controller
}
func (this *HelloController) Get() {
this.Ctx.WriteString("Hello World")
}
第二部,添加到路由 /hello
真方便,直接添加一行就可以用了
访问: http://localhost:8080/hello
即可获得输出
- 定义 RESTful 方法,通过匿名组合之后,其实目前的
MainController
已经拥有了Get
、Post
、Delete
、Put
等方法,这些方法是分别用来对应用户请求的 Method 函数,如果用户发起的是 POST 请求,那么就执行Post
函数。所以这里我们定义了MainController
的Get
方法用来重写继承的Get
函数,这样当用户发起 GET 请求的时候就会执行该函数。
路由如何携带参数?
写到router.go
里面
基本的路由
GET请求
beego.Get("/alice", func(ctx *context.Context) {
ctx.Output.Body([]byte("Bob!"))
})
接通过 c := []byte(s)
来获取一个字节的切片 c
POST请求
beego.Post("/alice", func(ctx *context.Context) {
ctx.Output.Body([]byte("POST Bob!"))
})
响应任何请求的路由
web.Any("/foo",func(ctx *context.Context){
ctx.Output.Body([]byte("bar"))
})
RESTful Controller 路由
固定路由
固定路由也就是全匹配路由
web.Router("/", &controllers.MainController{})
web.Router("/admin", &admin.UserController{})
web.Router("/admin/index", &admin.ArticleController{})
web.Router("/admin/addpkg", &admin.AddController{})
正则路由(可以携带参数了)
- 默认匹配
web.Router(“/api/?:id”, &controllers.RController{})
Controller中的获取方式:
this.Ctx.Input.Param(":id")
- 正则字符串匹配
web.Router(“/user/:username([\\w]+)“, &controllers.RController{})
Controller中的获取方式
this.Ctx.Input.Param(":username")
等等,还有其他的,以后用到再看看咯
自定义方法及 RESTful 规则
以下是一个 RESTful 的设计示例:
web.Router("/api/food",&RestController{},"get:ListFood")
web.Router("/api/food",&RestController{},"post:CreateFood")
web.Router("/api/food",&RestController{},"put:UpdateFood")
web.Router("/api/food",&RestController{},"delete:DeleteFood")
连接到MySQL数据库
先连接到数据库,然后写一个简单的Model
安装数据库驱动和ORM驱动
go get -u github.com/go-sql-driver/mysql
go get github.com/beego/beego/v2/client/orm
数据库配置
conf/app.conf
文件中配置
db.host = 127.0.0.1
db.port = 3306
db.user = root
db.password = 123456
db.name = hello
db.charset = utf8mb4
创建SQL入口文件
utils/sql.go
package utils
import (
"fmt"
"github.com/beego/beego/v2/client/orm"
beego "github.com/beego/beego/v2/server/web"
)
func InitSql() {
dbuser, _ := beego.AppConfig.String("db.user")
dbpassword, _ := beego.AppConfig.String("db.password")
dbhost, _ := beego.AppConfig.String("db.host")
dbport, _ := beego.AppConfig.String("db.port")
dbname, _ := beego.AppConfig.String("db.name")
dbcharset, _ := beego.AppConfig.String("db.charset")
runmode, _ := beego.AppConfig.String("runmode")
if runmode == "dev" {
orm.Debug = true
}
dsn := dbuser + ":" + dbpassword + "@tcp(" + dbhost + ":" + dbport + ")/" + dbname + "?charset=" + dbcharset
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", dsn)
if err := orm.RunSyncdb("default", false, true); err != nil {
fmt.Println(err)
}
orm.RunCommand()
}
- 从
conf/app.conf
中读取数据库相关配置 RegisterDriver
不知道具体干嘛的,看名字注册DriverRegisterDataBase
ORM 必须注册一个别名为default
的数据库,作为默认使用。
创建好文件后,再去main.go
中初始化
utils.InitSql()
运行查看,
一切正常
创建一个简单的Model
添加Model方法
在User
的Model
里面添加下面的方法 models/user.go
func GetUserById(id int) (v *User, err error) {
o := orm.NewOrm()
v = &User{Id: id}
if err = o.QueryTable(new(User)).Filter("Id", id).RelatedSel().One(v); err == nil {
return v, nil
}
return nil, err
}
添加Controller
controllers/user.lgo
package controllers
import (
beego "github.com/beego/beego/v2/server/web"
"hello/models"
"strconv"
)
type UserController struct {
beego.Controller
}
func (this *UserController) GetOne() {
idStr := this.Ctx.Input.Param(":id")
id, _ := strconv.Atoi(idStr)
v, err := models.GetUserById(id)
if v == nil {
this.Data["json"] = err.Error()
} else {
this.Data["json"] = v
}
this.ServeJSON()
}
然后将路由指向Controller
beego.Router("/api/user/:id", &controllers.UserController{}, "get:GetOne")
随后,访问 http://localhost:8080/api/user/1
即可获得输出
{ "id": 1, "username": "nicolana" }
实现一个简单的登录功能
TODO 用户表增加更多属性,开发登录获取Token功能
首先,修改user
的Model
type User struct {
Id int `json:"id" orm:"column(id);pk;unique;auto_increment;int(11)"`
Username string `json:"username" orm:"column(username);unique;size(32)"`
Password string `json:"password" orm:"column(password);size(128)"`
Avatar string `json:"avatar" orm:"column(avatar);varbinary"`
Salt string `json:"salt" orm:"column(salt);size(128)"`
Token string `json:"token" orm:"column(token);size(256)"`
LastLogin int64 `json:"last_login" orm:"column(last_login);size(11)"`
Status int `json:"status" orm:"column(status);size(1)"`
CreatedAt int64 `json:"created_at" orm:"column(created_at);size(11)"`
UpdatedAt int64 `json:"updated_at" orm:"column(updated_at);size(11)"`
}
然后,beego会自动创建没有的字段。
暂无评论