beego是一个快速开发Go应用的HTTP框架,他可以用来快速开发API、Web及后端服务等各种应用,是一个经典的MVC框架
Beego官网
beego.me
目录结构入下:mian.go是入口文件,controllers是逻辑控制模块,models是模型模块,views是视图模块。
├── conf
│ └── app.conf
├── controllers
│ ├── admin
│ └── default.go
├── main.go
├── models
│ └── models.go
├── static
│ ├── css
│ ├── ico
│ ├── img
│ └── js
└── views
├── admin
└── index.tpl
go get github.com/beego/beego/[email protected]
beego还有一个工具bee用于协助快速开发beego项目,通过bee可以很 容易的进行构建、热编译、开发、测试和部署。 bee工具可以使用go指令直接下载安装:
go get github.com/beego/bee
最后执行,出现版本信息
bee version
bee new filename 创建新的文件
cd filename 切换到了文件
bee run 运行
浏览器输入 localhost:8080
1、首先我们引入了包github.com/astaxie/beego,我们知道Go语言里面引入包会深度优先的去执行引入包的初始化(变量和init函数),beego包中会初始化一个BeeAPP的应用,初始化一些参数。
2、定义Controller,这里我们定义了一个struct为MainController,充分利用了Go语言的组合的概念,匿名包含了beego.Controller,这样我们的MainController就拥有了beego.Controller的所有方法。
3、定义main函数,所有的Go应用程序和C语言一样都是Main函数作为入口,所以我们这里定义了我们应用的入口。
4、Router注册路由,路由就是告诉beego,当用户来请求的时候,该如何去调用相应的Controller,这里我们注册了请求/的时候,请求到MainController。这里我们需要知道,Router函数的两个参数函数,第一个是路径,第二个是Controller的指针。
5、Run应用,最后一步就是把在1中初始化的BeeApp开启起来,其实就是内部监听了8080端口
new命令是新建一-个Web项目,我们在命令行下执行bee new <项目名>就可以创建一一个新的项目。但是注 意该命令必须在$GOPATH/src下执行。
bee api myapi
bee run 命令是监控 beego 的项目,通过 fsnotify监控文件系统。但是注意该命令必须在 $GOPATH/src/projectName 下执行。这样当我们在开发过程中,beego可以实时监测我们的代码文件发生变化,这样我们就不用重新编译运行,非常方便我们调试。
version Prints the current Bee version
migrate Runs database migrations
api Creates a Beego API application
bale Transforms non-Go files to Go source files
fix Fixes your application by making it compatible with newer versions of Beego
dlv Start a debugging session using Delve
dockerize Generates a Dockerfile for your Beego application
generate Source code generator
hprose Creates an RPC application based on Hprose and Beego frameworks
new Creates a Beego application
pack Compresses a Beego application into a single file
rs Run customized scripts
run Run the application by starting a local development server
server serving static content over HTTP on port
controller就是处理具体的逻辑的,router将请求分发到指定的controlller,controller处理请求,然后返回,基于beego的Controller 设计,只需要匿名组合beego.Controller
type xxxController struct {
beego.Controller
}
beego.Controller拥有很多方法,其中包括Init、Prepare、 Post、 Get、Delete、 Head等方法。我们可以通过重写的方式来实现这些方法。
首先我们来看看Controller结构体,以及定义的方法
type Controller struct {
// context data
Ctx *context.Context
Data map[interface{}]interface{}
// route controller info
controllerName string
actionName string
methodMapping map[string]func() //method:routertree
gotofunc string
AppController interface{}
// template data
TplName string
ViewPath string
Layout string
LayoutSections map[string]string // the key is the section name and the value is the template name
TplPrefix string
TplExt string
EnableRender bool
// xsrf data
_xsrfToken string
XSRFExpire int
EnableXSRF bool
// session
CruSession session.Store
}
从controller的结构体我们可以看到,一共有5大块:
1.上下文数据
2.路由控制信息
3.模板数据
4.xsrf数据
5.session
从ControllerInterface 我们可以看到Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。
1.Http是无状态的协议,服务器不能记录浏览器的访问状态,也就是服务器不能区分两次请求是否是来自同一个客户端。
2.Cookie实际上是服务器保存在浏览器上的一段信息,浏览器有了Cookie之后,每次向服务器发送请求都会带着该信息进行访问,服务器在收到请求之后,就可以通过该信息进行处理。
3.Cookie由服务器创建,并发给浏览器,最终由浏览器保存。
Cookie一般用于保持用户登陆状态,电商网站的购物车等
Beego操作Cookie,无非就是两个方法,一个是设置,一个是获取:
c.Ctx.SetCookie(key,value,有效时长...)
c.Ctx.GetCookie(key)
c.Ctx.SetCookie("username",u.Username,100,"/")
SetCookie的第三个参数是时间,单位是秒 ,如果不设置时间,Cookie只在本次回话有效,默认存活时间为3600秒。第四个参数是Cookie设置路径。
func (c *TestLoginController) Login() {
//获取cookie
username := c.Ctx.GetCookie("username")
password := c.Ctx.GetCookie("password")
fmt.Println("Login()方法中:username:",username,",password:",password)
//验证用户名和密码:
if username != "" {
c.Ctx.WriteString("Username:" + username + ",Password:" + password)
} else {
c.Ctx.WriteString(``)
}
}
然后我们输入用户名和密码,点击按钮进行提交,接下类,我们再次重新输入地址:http://127.0.0.1:9527/testlogin。发现还是登录成功页面,因为经过get请求,执行Login()方法时,可以获取到cookie,会直接显示登录信息,而无需用户再次登录了
SQL概念 | MongoDB概念 | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
// 查看当前数据库用户
show users
//登录认证
db.auth("admin", "123456")
//创建用户密码
db.createUser({
user:"admin", // 用户名
pwd:"123456", // 密码
roles:["root"] // 角色
})
//修改用户密码
db.updateUser( "admin", {
pwd: "abc666"
})
//删除用户
db.dropUser("admin") // admin 是要删除的用户名
//默认端口和绑定地址
port: 27017
bindIp: 127.0.0.1
//本机数据库存储地址目录
dbPath: D:\Program Files (x86)\DB\data
//数据库日志目录
path: D:\Program Files (x86)\DB\log\mongod.log
sql创建表:
create table people (
id mediumint not null
auto_increment,
user_id varchar(30),
age number,
status char(1),
primary key (id)
)
mongodb不用创建表,如果你插入的数据指定的文档没有,那么会自动创建一个相应的文档,并保存。但是也可以显示的创建一个文档然后在向里面插入数据的。
db.people.insertOne( {
user_id: "abc123",
age: 55,
status: "A"
} )
sql插入数据
insert into people(user_id,age,status) values ("bcd001",45,"a")
mysql:
select * from table
mongodb
db.table.find()
select id,user_id,status from people
db.people.find(
{},
{ user_id: 1, status: 1 }
)
第一个 {},
不能去掉,表示筛选条件,例如sql
中的where
。后面这个大括号中的字段表示是否显示,如果为 1
显示,0
不显示。但是 _id
默认是显示的
SELECT *
FROM people
WHERE status = "A"
db.people.find(
{ status: "A" }
)
SELECT user_id, status
FROM people where status="A"
db.people.find(
{ status:"A" },
{ user_id: 1, status: 1, _id: 0 }
)
status!=“A”
SELECT *
FROM people
WHERE status != "A"
db.people.find(
{ status: { $ne: "A" } }
)
status = “A” or age = 50 返回所有字段
SELECT *
FROM people
WHERE status = "A"
OR age = 50
db.people.find(
{ $or: [ { status: "A" } , { age: 50 } ] }
)
age >25 and age<25
SELECT *
FROM people
WHERE age > 25
AND age <= 50
db.people.find(
{ age: { $gt: 25, $lte: 50 } }
)
SELECT *
FROM people
WHERE user_id like "%bc%"
db.people.find( { user_id: /bc/ } )
db.people.find( { user_id: { $regex: /bc/ } } )
SELECT *
FROM people
WHERE user_id like "bc%"
db.people.find( { user_id: /^bc/ } )
或者
db.people.find( { user_id: { $regex: /^bc/ } } )
根据user_id升序排序,并且status = “A”
SELECT *
FROM people
WHERE status = "A"
ORDER BY user_id ASC
db.people.find( { status: "A" } ).sort( { user_id: 1 } )
排序的时候,sort()
方法是在 find()
方法之外了。*最后面这个1表示升序排序,-1表示降序排序*。
SELECT *
FROM people
LIMIT 5,10
db.people.find().limit(5).skip(10)
db.users.save({name: ‘zhangsan’, age: 25, sex: true});
添加的数据的数据列,没有固定,根据添加的数据为准
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
相当于:update users set name = ‘changeName’ where age = 25;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
update set name =“hoho”,age=age+50 from users where name=“lisi”
db.users.remove({age: 132});
db.users.findAndModify({
query:{age:{$gte:25}},
sort:{age:-1},
update:{$set:{name:"lisi"},$inc:{age:2},
remove: true
});
查询users里面年龄大于25的人数进行降序排序,把他们的名字修改为lisi并且年龄加上2岁
参数 | 详情 | 默认值 |
---|---|---|
query | 查询过滤条件 | {} |
sort | 如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作 | {} |
remove | 若为true,被选中对象将在返回前被删除 | N/A |
update | 一个修改器对象 | N/A |
new | 若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。 | false |
fields | all | |
upsert | 创建新对象若查询结果为空。 | false |
printf("Hello world")
这种写法调用了print函数,和直接写入”Hello World!”的效果是一样的;
tojson(new Object("a"))
for(int i=0;i<30;i++){
db.users.save({name:"u_" + i,age:22 + i,sex: i % 2});
};
db.users.find().forEach(printjson);
5.5 将find游标转换为数组
var cursor = db.users.find();
cursor[4];
取得下标索引为4的那条数据
既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者cursor.count();
那样我们也可以用循环显示数据
for(int i=0;i<cursor.length();i++){
printjson(cursor[i]);
};
db.users.find({},{userid:false}}.forEach(printjson)
排除非主键的userid
111