1.导言
本来在go语言的基础语法学习结束的时候,打算学gee框架。但是偶然听朋友提到了beego,发现beego和前端的Vu e.js,python的dJungle还有flask都好像。这对于有php、python或者web基础的开发者来说是一个很棒的入门优势。所以左右框架什么的都不太了解,所以最终敲定先从相对可能会有些熟悉的beego看看。(据说beego的开发者谢孟军自己也承认这个框架是东抄抄西写写凑出来的,让人简直淡定不能)
2.Beego框架概述
beego是提供给go语言进行网站开发的web后台框架,其官网是:https://beego.me/。目前使用beego框架公司相对比较多,类似于今日头条,百度云盘,腾讯,阿里这些公司。学习beego框架其实从某种意义上来讲也能说是为了去区块链开发做准备的一个内容,毕竟区块链本质上也不过是一个后台存储的技术(当然里面具体有啥咱还不知道),而既然是数据存储,那么用户必然看不到。那么如果需要一个能够管理数据的平台之类的,beego就可以提供相当的便利。
beego采用了非常经典的传统MVC架构设计模式(别提MVW,MV啥都是从MVC来的),即
【用户请求】->【c层控制器截获,并分析需求】
->【去M层获取数据】->【返回c层】
->【去V层渲染视图】->【返回c层】
->【返回给用户视图】。
3.Beego框架环境搭建
可以说从学习编程这行开始到现在,beego的安装是本人最曲折的一次。虽然beego框架在安装完毕后来看堪称是简单到可怜,但是网上找到的教程众说纷纭,让我着实踩了不少的坑。本文的前提是我们已经安装了go语言环境,Homebrew工具,并且成功配置了GOPATH、GOROOT和GOBIN以及环境变量PATH。
··go dmg下载地址:https://golang.google.cn/dl/
··go终端测试安装成功指令 ~$ go version查看go语言当前版本
··Homebrew官网地址(官网内附安装教程):https://brew.sh/,或者也可以参考我的博客:homebrew安装实战
··go 环境变量配置,可以参考我的博客:mac环境下go环境变量配置
执行指令~$ go get -u -v github.com/astaxie/beego下载beego的框架源码,其中-u是检查版本并下载,-v是显示下载过程。
执行指令~$ go get -u -v github.com/beego/bee下载beego的框架工具包
具体下载到了哪呢?框架工具下载到了goRoot内,而框架源码下载到了goPath中
如果上述两个步骤能够成功安装,那么在你的GOPATH中的bin、pkg和src文件夹中想必已经出现了一大堆看起来奇奇怪怪得东西。没关系,虽然还不认识他们,但是这能够确认的一点就是我们已经把beego环境安装完毕了,下面就是简单动手创建一个beego项目来测试一下。
执行指令 【~$ bee new 项目名称】,例如:~$ bee new project01,这条指令会在goPath路径下的src文件夹中创建go环境的初始配置。这里说明下虽然这条指令在根目录下执行指令也没啥问题,beego会自动寻找goPath去创建工程项目。但是我们最好在终端中先进入goPath再创建,这是考虑到可能会路径出错之类的问题
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
2018/12/03 09:57:29 WARN ▶ 0001 You current workdir is not inside $GOPATH/src.
2018/12/03 09:57:29 INFO ▶ 0002 Creating application...
create /Users/***/Desktop/goLearn/src/project01/
create /Users/***/Desktop/goLearn/src/project01/conf/
create /Users/***/Desktop/goLearn/src/project01/controllers/
create /Users/***/Desktop/goLearn/src/project01/models/
create /Users/***/Desktop/goLearn/src/project01/routers/
create /Users/***/Desktop/goLearn/src/project01/tests/
create /Users/***/Desktop/goLearn/src/project01/static/
create /Users/***/Desktop/goLearn/src/project01/static/js/
create /Users/***/Desktop/goLearn/src/project01/static/css/
create /Users/***/Desktop/goLearn/src/project01/static/img/
create /Users/***/Desktop/goLearn/src/project01/views/
create /Users/***/Desktop/goLearn/src/project01/conf/app.conf
create /Users/***/Desktop/goLearn/src/project01/controllers/default.go
create /Users/***/Desktop/goLearn/src/project01/views/index.tpl
create /Users/***/Desktop/goLearn/src/project01/routers/router.go
create /Users/***/Desktop/goLearn/src/project01/tests/default_test.go
create /Users/***/Desktop/goLearn/src/project01/main.go
2018/12/03 09:57:29 SUCCESS ▶ 0003 New application successfully created!
看到上面的输出后,表示项目创建完成。
然后在工程路径下调用运行指令(工程路径就是刚刚创建的那个工程project01。能够证明你查找成功的标志就是ls的时候能够看到一个名为main.go的文件)然后执行指令【~$ bee run】。此时终端会打印日志并提示服务器已经开启
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
2018/12/03 10:05:26 INFO ▶ 0001 Using 'project01' as 'appname'
2018/12/03 10:05:26 INFO ▶ 0002 Initializing watcher...
project01/controllers
project01/routers
project01
2018/12/03 10:05:30 SUCCESS ▶ 0003 Built Successfully!
2018/12/03 10:05:30 INFO ▶ 0004 Restarting 'project01'...
2018/12/03 10:05:30 SUCCESS ▶ 0005 './project01' is running...
2018/12/03 10:05:30.676 [I] [asm_amd64.s:1333] http server Running on http://:8080
这时去浏览器中,输入localhost:8080/或者127.0.0.1:8080/ 会看到welcome to Beego标志,这就测试完成了。此时如果想要关闭服务器,那么直接在终端里按下^C就可以了。
打开goland,然后进入我们刚才创建的工程project01,然后能够看到一系列刚才bee new出来的初始文件。其中
conf 文件夹中放的是项目的配置文件
controllers 文件夹存放主要的业务逻辑模块
modules 文件夹存放主要的数据库业务模块
routers 路由文件夹存放【不同的请求,查找不同的内容】
static 文件夹存放静态资源,例如css,js,img等(通常不和数据库打交道的部分)
tests 文件夹存放测试文件,开发一般不动这个
view 文件夹存放视图显示html文件
project01 这是bee run编译出来的.a文件
main.go 程序主入口文件
4.简单Beego上手
打开controllers控制器文件夹中的default.go文件。然后找到
c.TplName = "index.tpl"
这条指令的意思是打开指定view文件。将其修改为:
c.TplName = “test.html”//test.html是随便写的,此时还没有创建这个文件
打开views文件夹,在内部创建刚刚controllers文件内编辑的对应名称的文件test.html。然后随便在html中写点什么比如helloworld之类的东西。最后在goland编辑器下方的的terminal中执行指令 ~$ bee run。当服务器开启后去浏览器输入localhost:8080,完成!
·在controllers文件夹的default.go文件中,使用c.Data[“xxx”] = yyy 来对页面提供数据,然后在views文件夹的页面中使用{{.xxx}}来获取提供的数据。
·我们每次对go文件编辑后的保存之后,服务器会自动进行热更新!类似vue的热更新功能。
路由是用来协调【用户请求】与【controller文件函数】之间工作的。在beego框架中路由处理请求的方式通常有下列四种表现形式:
/*
1.默认方法,即get请求调用get方法,post请求调用post方法。一般不用这种
*/
/*
2.一个请求对应一个方法
Beego路由一旦指定了访问请求,那么除了指定的请求之外,其余的请求全部都不会自动寻址。
下列指令的含义是:
(1)接受用户发送到【localhost:8080/index】Url地址的get请求,
并交给IndexController下的ShowIndex方法来处理
(2)接受用户发送到【localhost:8080/index】Url地址的post请求,
并交给IndexController下的Post方法来处理
*/
beego.Router("/index", &controllers.IndexController{},"get:ShowIndex;post:Post")
/*
3.多个请求对应一个方法
下列指令的含义是:
(1)接受用户发送到【localhost:8080/index】Url地址的get和post请求,
并将他们均交给IndexController下的ShowIndex方法来处理
*/
beego.Router("/index", &controllers.IndexController{},"get,post:ShowIndex")
/*
4.所有请求对应一个方法
下列指令的含义是:
(1)接受用户发送到【localhost:8080/index】Url地址的所有类型请求,
并将他们均交给IndexController下的ShowIndex方法来处理
*/
beego.Router("/index", &controllers.IndexController{},”*:ShowIndex")
/*
4.1当请求设置冲突时,小范围生效(就近原则)
下列指令的含义是:
(1)接受用户发送到【localhost:8080/index】Url地址的所有类型请求,
并将他们均交给IndexController下的ShowIndex方法来处理
(2)但是如果用户发送来的请求类型是post类型的请求,那么将请求交给
IndexController下的Post方法来处理
*/
beego.Router("/index",&controllers.IndexController{},”*:ShowIndex;post:Post”)
5.配置MySQL数据库
虽然我们说beego是一个用来处理go语言web端的后端框架,但是毕竟beego还是用来为go语言服务的,因此操作数据库的情况必然存在。在实际开发过程中使用的数据库种类各种各样,像什么mysql、oracle、redis之类的不胜枚举。而在学习阶段我选择了一个最容易上手,坑也相对较少的数据库,也就是mysql。
事实上我小看了mysql环境配置时候坑的数量!千万不要盲目相信网络上面的任何一款所谓的XXX安装教程!包括我这个!因为别人的工程环境和自己的未必相同,产生的bug简直五花八门让人欲仙欲死。我在配置mysql环境的时候至少参考了5种不同类型的所谓mac版本的mysql环境配置教程,当然得到的结果就是一肚子闷气。最后逼的我没有办法,果断用最暴力直接的模式homebrew搞起,结果...两句指令下去,搞定了(我真的懵逼了好一会)。事实证明,你得有相信自己的勇气。废话不多说了,直接上说明。
本篇章还是以你已经安装好了homebrew的前提来介绍的,如果你还没有安装homebrew,那么请先安装homebrew之后再回来看就好。
开启终端,输入指令【~/$ brew install mysql】。安装的时候会要求你输入一大堆内容,目前我还没发现他们的作用,已知唯一有用的就是要求输入的数据库管理员密码。这个东西西药在安装的时候特殊保存一下就行。
安装完成后终端继续输入指令【~/$ mysql.server start】启动数据库,得到启动成功的信息就证明安装成功了。
登录本地数据库:【mysql -uroot -p】,而后需要输入管理员密码(就是刚才安装的时候要你记的那玩意)
创建本地数据库:【create database 数据库名 charset=utf8;】
查看本地数据库:【show databases;】
查看本地数据表:【show tables;】
查看本地数据表结构:【 desc 表名;】
查看本地数据表信息:【 select * from 表名;】
使用本地数据库:【 use 数据库名;】
删除本地数据库:【 drop database 数据库名;】
删除本地数据表:【 drop table 表名;】
6.Beego原生链接数据库操作
在main.go中添加 _”project01/models”,让项目启动的时候直接自动执行models中的init函数。不然模块不回自动加载。
在init函数内添加语句:Open("数据库名","链接字符串(用户名:用户密码@tcp(127.0.0.1:3306)/数据库名称?charset=utf8)")。本条指令能够在没有【数据库名】的数据库时创建一个数据库,而后直接创建对应的数据库连接。而如果已经存在这个数据库的话,就会直接创建对应的数据库连接。
con,err:=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
然后不要忘记在开启数据库后添加关闭指令与判断指令
defer con.Close()
if err!=nil{
beego.Error("数据库链接失败");
}
res,err := con.Exec("create table user(name VARCHAR(40), pwd VARCHAR(40))")
if err!=nil{
beego.Error("数据库中的表创建失败");
}
count,_ := res.RowsAffected()
beego.Info("受影响行数",count);
插入表信息
res, err := con.Exec("insert into user(name,pwd) values(?,?)","frank","112233")
if err!=nil{
beego.Error("beego插入数据失败",err);
}
count,_ := res.RowsAffected()
beego.Info("受影响的行数",count);
删除表信息
res, err := con.Exec("delete from user where name=?","lulu")
if err!=nil{
beego.Error("beego删除数据失败",err);
}
count,_ := res.RowsAffected()
beego.Info("受影响的行数",count);
修改表信息
res,err := con.Exec("update user set name=?,pwd=? where name=?","franky","123321","frank")
if err!=nil{
beego.Error("数据库更新信息失败");
}
count,_ := res.RowsAffected()
beego.Info("受影响行数",count);
查询表信息
res,err := con.Query("select name from user where 1")
if err!=nil{
beego.Error("查询错误",err);
}
var name string
for res.Next(){
res.Scan(&name)
beego.Info(name);
}
7.Beego ORM的数据库操作概述
ORM,即对象关系映射(ormobject-relationship-mapping)。在go语言中o指的是struct结构体对象、r指的是relationship关系型数据库、m指的是【结构体对象内容】与【关系型数据库字段】之间的映射关系。ORM是beego框架在操作数据库时经常会用到的一个非常优秀的管理工具,它能够把繁琐的数据库操作变得像go的面向对象编程一样清晰简单。ORM中最核心的两个功能分别是:
·orm能够通过结构体对象操作相同结构的数据库表
·orm能够通过结构体对象创建相同结构的数据库表
使用ORM定义结构体字段的时候,如果结构体字段的首位字母大写,在数据库生成表的时候,会自动将表中对应字段的字母变为小写。而如果命名采用驼峰命名去处理结构体字段,数据库字段会将对应字段的字母变为小写,并且用_下划线链接。
使用ORM在定义结构体字段的时候,习惯性使用Id作为表的primaryKey。如果不使用可能会出现warning警告。
type Class struct {
Id int //primary key
Name string
Num int
}
func init(){
//orm注册数据库(链接数据库),首个参数位对数据库注册别名,方便后面orm操作使用
orm.RegisterDataBase("default","mysql","root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
//orm注册数据库表
orm.RegisterModel(new(Class)/*,new(Class),...可以一次创建多个表*/);
//运行,第一个参数位注册的别名,第二个参数是否强制更新一般都写false(true是每次启动初始化表),第三个参数位初始化过程可见
orm.RunSyncdb("default",false,true);
}
感谢go语言优秀的包倒入系统,我们在使用任何一个包中对应的模块的时候不需要像传统语言一样先引入头文件或者导入包名,而是伴随着你使用对应的包中的模块,go语言会自动帮你倒入任何一个你所使用到的模块所依赖的包。
8.Beego ORM链接数据库操作
使用beego框架中提供的orm包进行数据库操作的时候,必须先通过orm与数据库建立链接,也就是上面我们init函数中写的三条语句。
插入表信息
//(1)获取orm对象
o := orm.NewOrm()
//(2)获取要插入的对象
var cl Class
//(3)给插入的对象赋值
cl.Name = "frank自学教室"
cl.Num = 100
cl.Girl = "陈豆豆"//此时orm智能的地方就体现出来了,对数据表添加原本不存在的字段信息的时候,orm会帮你自动插入一条字段,而不是报错。
//(4)执行插入操作
o.Insert(&cl)
删除表信息
//(1)获取orm对象
o := orm.NewOrm()
//(2)获取删除对象
var cl Class
//(3)指定删除对象的值
cl.Id = 1
//(4)直接删除,orm
count,err := o.Delete(&cl)
if err!=nil{
beego.Error("删除失败")//beego.Error是beego提供的后台终端的输出命令,红色字样
}
beego.Info("删除条目",count)//beego.Info是beego提供的后台终端的输出命令,绿色字样
修改数据
//(1)获取orm对象
o := orm.NewOrm()
//(2)获取更新对象
var cl Class
//(3)先查询更新对象,如果db中不存在则不更新
cl.Id = 1
err := o.Read(&cl)//如果查询条件是primarykey,则可以不指定
if err!=nil{
beego.Error("修改数据时,查询失败,该条数据不存在,更新失败");
}
//(4)给指定字段更新赋值
cl.Girl = "被插入的girl是陈静涵"
//(5)更新操作
o.Update(&cl)
//查询数据
//(1)获取orm对象
o := orm.NewOrm()
//(2)获取查询结果存放对象
var cl Class
//(3)赋值查询条件
cl.Id = 2
//(4)查询数据orm中查询不再使用select,而是read
o.Read(&cl,"Id")
beego.Info(cl)