Golang 入门系列(十三)用Beego开发web应用

Golang 入门系列(十三)用Beego开发web应用

接着之前的内容,前面已经讲过很多Golang的基础语法,mysql的使用,redis的使用,也讲了orm框架,如何创建一个webapi 服务等等,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html

今天要来说一说,如何用beego开发web应用。

 

介绍

beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,同时也是一个关注度和使用量都比价高的开源项目。我认为它是go初学者比较容易上手的一门MVC Web框架。

它是由国内团队开发的开源框架,文档基本都是中文,简单易懂。

 

安装

  需要安装 Beego 和 Bee 的开发工具:

$ go get github.com/astaxie/beego
$ go get github.com/beego/bee

  注意:

  1. beege和bee是两个概念。beego是框架,bee是工具,是命令。
  2. 在安装Beego前,先确认是否将$GOPATH/bin写入GO环境中。

 

创建应用

  创建一个名为webDemo的应用

$ bee new webDemo     //创建一个web应用
$ bee api webDemo     //创建一个api应用

 

编译运行

  进入webDemo目录中,执行bee run,就会完成编译、运行:

$ bee run

    

  成功后,打开浏览器访问:http://localhost:8080,可以看到如图:

 

开发

  以上就beego 的安装和运行简单的介绍完了,下面我们就通过订单查询和新增的例子来学习学习如何用beego开发web应用。

  一般的 beego 项目的目录如下所示:

├── conf           //配置文件
│   └── app.conf
├── controllers    //控制器
│   └── default.go
├── main.go   
├── models         //模型   
│   └── models.go
├── routers       //路由
│   └──router.go
├── static         //静态文件
│   ├── css
│   ├── ico
│   ├── img
│   └── js
└── views          //界面
    └── index.tpl

 

conf

  在app.conf 中增加数据库连接配置

appname = webDemo
httpport = 8080
runmode = dev

DBConn="root:root@tcp(localhost:3306)/zwz_test?charset=utf8"

 

controller

  在controller目录下,增加pay.go

package controllers

import (
        "webDemo/models"
)

func (c *MainController) PayQuery() {
    AccountID, _ := c.GetInt64("AccountID1")
    payment, _ := models.GetPaymenRec(AccountID)
    c.Data["AccountID"] = payment.AccountID
    c.Data["PartnerID"] = payment.PartnerID
    c.Data["UserID"] = payment.UserID
    c.Data["CreateTime"] = payment.CreateTime
    c.Data["Amount"] = payment.Amount
    c.Data["OuterTradeNo"] = payment.OuterTradeNo
    c.Data["Remark"] = payment.Remark
    c.Data["Status"] = payment.Status
    c.Data["Msg"] = payment.Msg
    c.TplName = "query.html"
}
func (c *MainController) PayAdd() {
    var payment models.PaymentRecordStr
    c.ParseForm(&payment)
    pay, _ := models.AddPaymenRec(payment)
    c.Data["AccountID"] = pay.AccountID
    c.Data["PartnerID"] = pay.PartnerID
    c.Data["UserID"] = pay.UserID
    c.Data["CreateTime"] = pay.CreateTime
    c.Data["Amount"] = pay.Amount
    c.Data["OuterTradeNo"] = pay.OuterTradeNo
    c.Data["Remark"] = pay.Remark
    c.TplName = "query.html"
}

 

models

  1. 在models目录下,增加pay.go

package models

import (
    "database/sql"
    "errors"

    "strconv"
    "time"

    "github.com/astaxie/beego"
    _ "github.com/go-sql-driver/mysql"
)

var Db *sql.DB

type PaymentRecord struct {
    Id           int64
    AccountID    int64
    PartnerID    string UserID string CreateTime string Amount float64 OuterTradeNo string Remark string Status int Msg string } type PaymentRecordStr struct { AccountID string PartnerID string UserID string CreateTime string Amount string OuterTradeNo string Remark string } func init() { dbconn := beego.AppConfig.String("DBConn") db, err := sql.Open("mysql", dbconn) if err != nil { return } db.SetMaxOpenConns(2000) db.SetMaxIdleConns(0) db.Ping() Db = db } func Close() { if Db != nil { Db.Close() } } func AddPaymenRec(rec PaymentRecordStr) (PaymentRecord, error) { var isql = "INSERT pay_demo SET account_id=?,partner_id=?,user_id=?,amount=?,outer_tradeno=?,remark=?" AccountID, _ := strconv.ParseInt(rec.AccountID, 10, 64) Amount, _ := strconv.ParseFloat(rec.Amount, 64) response := PaymentRecord{0, AccountID, rec.PartnerID, rec.UserID, rec.CreateTime, Amount, rec.OuterTradeNo, rec.Remark, 0, ""} if Db == nil { return response, errors.New("AddPaymenRec connect mysql failed") } stmt, _ := Db.Prepare(isql) defer stmt.Close() beego.Informational("AddPaymenRec rec=%#v", rec) res, err := stmt.Exec(AccountID, rec.PartnerID, rec.UserID, Amount, rec.OuterTradeNo, rec.Remark) if err == nil { response.Id, _ = res.LastInsertId() response.Status = 1 response.Msg = "已生效" return response, nil } return response, nil } func GetPaymenRec(AccountID int64) (PaymentRecord, error) { var qsql = "SELECT * FROM pay_demo WHERE account_id=?" var response PaymentRecord response.Msg = "失败" if AccountID != 0 { if Db == nil { return response, errors.New("GetPaymenRec connect mysql failed") } stmt, _ := Db.Prepare(qsql) rows, err := stmt.Query(AccountID) defer rows.Close() if err != nil { return response, err } var timedate string for rows.Next() { err = rows.Scan(&response.Id, &response.AccountID, &response.PartnerID, &response.UserID, &timedate, &response.Amount, &response.OuterTradeNo, &response.Remark) if err != nil { return response, err } DefaultTimeLoc := time.Local loginTime, err := time.ParseInLocation("2006-01-02 15:04:05", timedate, DefaultTimeLoc) if err == nil { unix_time := loginTime.Unix() //time to int64 response.CreateTime = time.Unix(unix_time, 0).Format("2006-01-02 15:04:05") response.Status = 2 response.Msg = "成功" return response, err } else { return response, err } } return response, nil } return response, errors.New("GetPaymenRec Requset is non porinter") }

   2. 在数据库中,增加pay_demo表

CREATE TABLE `pay_demo` (
  `id` int(64) NOT NULL AUTO_INCREMENT,
  `account_id` int(64) NOT NULL,
  `partner_id` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `user_id` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `amount` double DEFAULT '0',
  `outer_tradeno` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5024 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

 

views

  将原有的index.tpl 删除,增加新的index.html 和query.html

index.html

<!DOCTYPE html>

<html>
<head>
    <title>webDemo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>
<div>
    <form action="/query" method="Post">
        <div>
            GetPaymentBy AccountID:<input  type="text" name="AccountID1" />
        </div>

        <div>
            <input type= "submit" name="n" />
        </div>
    </form>
    <br/>
    <br/>
    <form action="/add" method="Post">
        <div>
            AccountID:<input  type="text" name="AccountID" />
        </div>
        <div>
            PartnerID:<input  type="text" name="PartnerID" />
        </div>
        <div>
            UserID   :<input  type="text" name="UserID" />
        </div>
        <div>
            CreateTime:<input  type="text" name="CreateTime" />
        </div>
        <div>
            Amount:<input  type="text" name="Amount" />
        </div>
        <div>
            OuterTradeNo:<input  type="text" name="OuterTradeNo" />
        </div>
        <div>
            Remark:<input  type="text" name="Remark" />
        </div>

        <div>
            <input type= "submit" name="add" value="添加"/>
        </div>
    </form>

</div>
</body>
</html>

 

query.html

<!DOCTYPE html>

<html>
<head>
  <title>BeegoDemo</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
</head>

<body>
  <div>        
        <div>
            Payment:
        </div>
        <div>
        AccountID:{{.AccountID}}
        </div>
        <div>
        PartnerID:{{.PartnerID}}
        </div>
        <div>
        UserID:{{.UserID}}
        </div>
        <div>
        CreateTime:{{.CreateTime}}
        </div>
        <div>
        Amount:{{.Amount}}
        </div>
        <div>        
        OuterTradeNo:{{.OuterTradeNo}}
        </div>
            <div>
        Remark:{{.Remark}}
        </div>
            

  </div>
</body>
</html>

 

routers

  在router.go 中增加以上新增的2个路由

package routers

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

func init() {
    beego.Router("/query", &controllers.MainController{}, "Post:PayQuery")        // 新增PayQuery路由
    beego.Router("/add", &controllers.MainController{}, "Post:PayAdd")       // 新增PayAdd路由
    beego.Router("/", &controllers.MainController{})
}

 

 重新运行

   增加完以上代码之后,重新运行webDemo应用,就可以看到我们新增加的订单查询和新增订单的功能。

 

 最后

   1. 以上就把beego 的安装给介绍完了。同时也通过简单的订单支付的例子,介绍如何使用beego 开发web应用。

·  2. 这里只是对beego 做一个最基本的介绍,想要详细了解beego 的各种功能,可以去它的官网:https://beego.me 

   3. 完整例子下载:webDemo

 

posted @ 2019-05-28 18:58 章为忠 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架。beego 的架构beego 的整体设计架构如下所示:       beego 是基于八大独立的模块构建的,是一个高度解耦的框架。当初设计 beego 的时候就是考虑功能模块化,用户即使不使用 beego 的 HTTP 逻辑,也依旧可以使用这些独立模块,例如:你可以使用 cache 模块来做你的缓存逻辑;使用日志模块来记录你的操作信息;使用 config 模块来解析你各种格式的文件。所以 beego 不仅可以用于 HTTP 类的应用开发,在你的 socket 游戏开发中也是很有用的模块,这也是 beego 为什么受欢迎的一个原因。大家如果玩过乐高的话,应该知道很多高级的东西都是一块一块的积木搭建出来的,而设计 beego 的时候,这些模块就是积木,高级机器人就是 beego。至于这些模块的功能以及如何使用会在后面的文档会逐一介绍。beego 的执行逻辑      既然 beego 是基于这些模块构建的,那么他的执行逻辑是怎么样的呢?beego 是一个典型的 MVC 架构,他的执行逻辑如下图所示:beego 项目结构一般的 beego 项目的目录如下所示:从上面的目录结构我们可以看出来 M(models 目录)、V(views 目录)和 C(controllers 目录)的结构, main.go 是入口文件。你可以通过 bee 工具来新建项目。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章为忠学架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值