(一) beego开发web应用 – 尝试

源码: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 已经拥有了 GetPostDeletePut 等方法,这些方法是分别用来对应用户请求的 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 不知道具体干嘛的,看名字注册Driver
  • RegisterDataBase ORM 必须注册一个别名为 default 的数据库,作为默认使用。

创建好文件后,再去main.go中初始化

utils.InitSql()

运行查看,

一切正常

创建一个简单的Model

添加Model方法

UserModel里面添加下面的方法 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功能

首先,修改userModel

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会自动创建没有的字段。

下一篇:https://www.zklighting.ltd/?p=1179

暂无评论

发表评论

您的电子邮件地址不会被公开,必填项已用*标注。

相关推荐