前言 本文中研究学习beego的静态文件配置使用方法,请求返回值的json化处理,使用goland调试beego框架,数据库从sqlite迁移到mysql。
静态文件配置 使用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 > </body > </html >
启动beego,此时看到的首页和原首页相同。
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 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 () } 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 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,"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 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 func (c *UpdateController) Post() { 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 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进行调用。
调试 以调试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退出函数。
数据库迁移 前文中,使用sqlite数据库,而在生产环境中,大多是使用mysql。本节中研究学习数据库的迁移,把sqlite数据库中的数据移动到mysql数据库中。
表结构迁移 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数据库中生成表结构。
表结构迁移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"]
数据迁移 sqlite和mysql的SQL语句不兼容,参考sqlite导入到mysql 进行数据迁移,此处不再展开。
后记 以上,学习了beego静态文件配置、json处理、调试和数据库迁移。beego还有好多内容值得学习,比如模块使用、进程监控、应用部署、第三方库等等,但是入门篇到这里就告一段落,see you。
源码分享:v0.0.2
书签 beego官网 beego开发文档