一个计算机技术爱好者与学习者

0%

好好学Golang:beego入门篇——下

1. 前言

本文中研究学习beego的静态文件配置使用方法,请求返回值的json化处理,使用goland调试beego框架,数据库从sqlite迁移到mysql。

2. 静态文件配置

使用bee工具生成的vkbeego项目,index.tpl中包含css。实际项目中,静态文件是和模板文件分离的,下面分离出index.tpl中的css,改成引用的方式。

1、图片准备
index.tpl中的两个base64格式的图片,另存为icon.png和background.png,放到在static/img目录下。

2、在static/css目录下新建index.css文件,内容从index.tpl中拷贝,详见源码v0.0.2

3、修改views/index.tpl文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>

<html>
<head>
<title>Beego</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="icon" href="/static/img/icon.png" />
<link rel="stylesheet" href="/static/css/index.css">
</head>

<body>
<!--keep the same-->
</body>
</html>

启动beego,此时看到的首页和原首页相同。

3. json处理

当今,json已经成为了Web开发中前后端交互的标准格式。本节中修改《beego入门篇——中》一文中的增删查改接口,使返回数据变成json格式。为节省篇幅,下文中省略了文件头部。

1、修改controllers/user/add.go,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// omit the head

func (c *AddController) Get() {
var username = c.GetString("username")
fmt.Println(username)
c.Ctx.WriteString("Please add user by post request.")
}


func (c *AddController) Post() {
var username = c.GetString("username")
var password = c.GetString("password")

var o = orm.NewOrm()
o.Using("default")
exist := o.QueryTable("user").Filter("UserName", username).Exist()
if exist{
c.Data["json"] = map[string]interface{}{"code": 1, "ext": "Username has been existed!"}
c.ServeJSON()
return
}

var user = new(models.User)
user.Username = username
user.Password = password
id,err := o.Insert(user)
if err == nil {
fmt.Println(id)
c.Data["json"] = map[string]interface{}{"code": 0, "userid": id,"ext": "User has been added!"}
c.ServeJSON()
}else {
c.Data["json"] = map[string]interface{}{"code": 2, "ext": "Write to database failed!"}
c.ServeJSON()
}
//c.Ctx.WriteString("add user: " + username)

return
}

2、修改controllers/user/list.go,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// omit the head

func (c *ListController) Get() {
var o = orm.NewOrm()
o.Using("default")
var qs orm.QuerySeter
qs = o.QueryTable("user")
var users []*models.User
//num, err := qs.All(&users)
num, err := qs.All(&users,"Id", "Username")
fmt.Printf("Returned Rows Num: %d, %s \n", num, err)
fmt.Println(users[0].Username)
c.Data["users"] = users
c.TplName = "user/list.tpl"
}

func (c *ListController) Post() {
var o = orm.NewOrm()
o.Using("default")
var qs orm.QuerySeter
qs = o.QueryTable("user")
var users []*models.User
//num, err := qs.All(&users)
qs.All(&users,"Id", "Username")
c.Data["json"] = map[string]interface{}{"code": 0, "ext": "success", "userlist": users}
c.ServeJSON()
return
}

3、修改controllers/user/update.go,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// omit the head

func (c *UpdateController) Post() {
//id,_ := c.GetInt("id")
username := c.GetString("username")
password := c.GetString("password")
new_password := c.GetString("new_password")

var o = orm.NewOrm()
o.Using("default")

exist := o.QueryTable("user").Filter("UserName", username).Exist()
if !exist{
c.Data["json"] = map[string]interface{}{"code": 1, "ext": "Username doesn't exist!"}
c.ServeJSON()
return
}

var user models.User
o.QueryTable("user").Filter("Username",username).Filter("Password",password).One(&user)

if o.Read(&user) == nil {
user.Password = new_password
if num, err := o.Update(&user); err == nil {
if num != 0 {
c.Data["json"] = map[string]interface{}{"code": 0, "ext": "Password has been updated!"}
c.ServeJSON()
}
}
}else {
c.Data["json"] = map[string]interface{}{"code": 2, "ext": "Username or password is wrong!"}
c.ServeJSON()
}

return
}

4、修改controllers/user/del.go,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// omit the head

func (c *DelController) Get() {
c.Ctx.WriteString("Please use post request.")
}

func (c *DelController) Post() {
id,_ := c.GetInt("id")

var o = orm.NewOrm()
o.Using("default")

num,err := o.QueryTable("user").Filter("Id",id).Delete()
fmt.Printf("Returned Rows Num: %d, %s \n", num, err)
if num != 0 {
c.Data["json"] = map[string]interface{}{"code": 0, "ext": "User has been deleted!"}
c.ServeJSON()
}else{
c.Data["json"] = map[string]interface{}{"code": 1, "ext": "User Id doesn't exist! Can't delete!"}
c.ServeJSON()
}
return
}

修改之后,四个接口都能够返回json格式的数据,使用Postman测试通过,可供js进行调用。

4. 调试

以调试controllers/user/add.go中的Post方法为例。
1、设置调试环境
Run,Edit Configuration,Add New Configuration,Go Build。Run kind选择Directory,Directory、Output directory、Working directory都选择项目目录,OK。点击工具栏的Debug按钮,进入调试模式。

2、在Post方法中添加断点
在代码左侧,单击添加断点。

3、测试调试
使用Postman,发送Post请求到 http://localhost:8080/user/add ,请求参数包括username和password。查看Goland面板,可以看到面板中显示出了请求的参数等信息。

使用F8进入下一步,F7进入函数,Shift+F8退出函数。

5. 数据库迁移

前文中,使用sqlite数据库,而在生产环境中,大多是使用mysql。本节中研究学习数据库的迁移,把sqlite数据库中的数据移动到mysql数据库中。

5.1. 表结构迁移

1、创建数据库
使用mysql时,beego不会自动生成数据库,因此需要手动创建vkbeego数据库。

2、修改models/model.go文件,修改注册驱动和注册数据库为mysql:

1
2
3
4
5
6
import (
_ "github.com/go-sql-driver/mysql"
)

orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "root:voidking@tcp(192.168.56.104:3306)/vkbeego?charset=utf8")

3、生成表结构
运行bee run,即可在beego数据库中生成表结构。

5.2. 表结构迁移2.0

1、创建beego/database/migrations/vkbeego.sql文件,内容为:

1
2
3
4
5
CREATE TABLE IF NOT EXISTS `user` (
`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT,
`username` varchar(255) NOT NULL DEFAULT '' ,
`password` varchar(255) NOT NULL DEFAULT ''
);

2、生成表结构
创建数据库,修改models/model.go使用mysql后,执行命令:
bee migrate [-driver=mysql] [-conn="root:voidking@tcp(127.0.0.1:3306)/vkbeego"]

5.3. 数据迁移

sqlite和mysql的SQL语句不兼容,参考sqlite导入到mysql进行数据迁移,此处不再展开。

6. 后记

以上,学习了beego静态文件配置、json处理、调试和数据库迁移。beego还有好多内容值得学习,比如模块使用、进程监控、应用部署、第三方库等等,但是入门篇到这里就告一段落,see you。

源码分享:v0.0.2

7. 书签

beego官网
beego开发文档

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-beego-start-2/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~