接着之前的内容,前面已经讲过很多golang的基础语法,mysql的使用,redis的使用,也讲了orm框架,如何创建一个webapi 服务等等,感兴趣的可以看看以前的文章。今天要来说一说,如何用beego开发web应用。
介绍它是由国内团队开发的开源框架,文档基本都是中文,简单易懂。
安装需要安装 beego 和 bee 的开发工具:
$ gogetgithub.com/astaxie/beego$ gogetgithub.com/beego/bee注意:
beege和bee是两个概念。beego是框架,bee是工具,是命令。在安装beego前,先确认是否将$gopath/bin写入go环境中。创建应用创建一个名为webdemo的应用
$ beenewwebdemo//创建一个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.tpl1、conf
beego 默认会创建配置文件目录,里面放置系统的配置文件,这里我们先创建app.conf ,增加数据库连接配置。
appname= webdemohttpport =8080runmode = devdbconn=root:root@tcp(localhost:3306)/zwz_test?charset=utf82、controller
controllers目录主要是控制器相关的,我们在controllers中增加pay.go
package controllersimport (webdemo/models)func(c*maincontroller)payquery() {accountid,_:=c.getint64(accountid1) payment,_:= models.getpaymenrec(accountid)c.data[accountid] = payment.accountidc.data[partnerid] = payment.partneridc.data[userid] = payment.useridc.data[createtime] = payment.createtimec.data[amount] = payment.amountc.data[outertradeno] = payment.outertradenoc.data[remark] = payment.remarkc.data[status] = payment.statusc.data[msg] = payment.msgc.tplname=query.html}func(c*maincontroller)payadd() {varpayment models.paymentrecordstrc.parseform(&payment) pay,_:= models.addpaymenrec(payment)c.data[accountid] = pay.accountidc.data[partnerid] = pay.partneridc.data[userid] = pay.useridc.data[createtime] = pay.createtimec.data[amount] = pay.amountc.data[outertradeno] = pay.outertradenoc.data[remark] = pay.remarkc.tplname=query.html}3、models
models是存放实体类文件,属于模型层,负责定义实体类和数据增删改查的操作。在models目录下增加pay.go 。
packagemodelsimport (database/sqlerrorsstrconvtimegithub.com/astaxie/beego_github.com/go-sql-driver/mysql)vardb *sql.dbtype paymentrecordstruct{ idint64accountidint64partneridstringuseridstringcreatetimestringamountfloat64outertradenostringremarkstringstatusintmsgstring}typepaymentrecordstrstruct{ accountidstringpartneridstringuseridstringcreatetimestringamountstringoutertradenostringremarkstring}funcinit(){ dbconn := beego.appconfig.string(dbconn) db, err := sql.open(mysql, dbconn)iferr !=nil{return} db.setmaxopenconns(2000) db.setmaxidleconns(0) db.ping() db = db}funcclose(){ifdb !=nil{ db.close() }}funcaddpaymenrec(rec paymentrecordstr)(paymentrecord, error){varisql =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,}ifdb ==nil{returnresponse, errors.new(addpaymenrec connect mysql failed) } stmt, _ := db.prepare(isql)deferstmt.close() beego.informational(addpaymenrec rec=%v, rec) res, err := stmt.exec(accountid, rec.partnerid, rec.userid, amount, rec.outertradeno, rec.remark)iferr ==nil{ response.id, _ = res.lastinsertid() response.status =1response.msg =已生效returnresponse,nil}returnresponse,nil}funcgetpaymenrec(accountidint64)(paymentrecord, error){varqsql =select * from pay_demo where account_id=?varresponse paymentrecord response.msg =失败ifaccountid !=0{ifdb ==nil{returnresponse, errors.new(getpaymenrec connect mysql failed) } stmt, _ := db.prepare(qsql) rows, err := stmt.query(accountid)deferrows.close()iferr !=nil{returnresponse, err }vartimedatestringforrows.next() { err = rows.scan(&response.id, &response.accountid, &response.partnerid, &response.userid, &timedate, &response.amount, &response.outertradeno, &response.remark)iferr !=nil{returnresponse, err } defaulttimeloc := time.local logintime, err := time.parseinlocation(2006-01-02 15:04:05, timedate, defaulttimeloc)iferr ==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)}和实体对应的还有数据库中的表结构,这里我们手动在数据库中增加pay_demo表,实际上beego封装了orm,可自动创建对应的表。
createtable`pay_demo`(`id`int(64)notnullauto_increment,`account_id`int(64)notnull,`partner_id`varchar(50)charactersetutf8defaultnull,`user_id`varchar(50)charactersetutf8defaultnull,`create_time`datetimedefaultcurrent_timestamp,`amount`doubledefault0,`outer_tradeno`varchar(50)charactersetutf8defaultnull,`remark`varchar(255)charactersetutf8defaultnull, primarykey(`id`))engine=innodbauto_increment=5024defaultcharset=utf8collate=utf8_bin;4、views
views目录负责存放前端模板文件。beego支持t4模板,功能非常强大。我们将原有的index.tpl 删除,增加新的index.html 和query.html
index.html页面:
html><html><head><title>webdemo
首页不被百度收录这是什么原因造成的?深圳建站公司哪家好?开发网站:市面上网站类型有哪些网页设计的小方法选择友情链接要注意什么?如何学习SEO优化?企业信息化网站+电子商务模式竞价客服人员如何提高咨询转化率