beego入门到实战

2021-03-14 19:46 go 1256 0
一、安装beego和bee工具使用官网最新的v2版本gogetgithub.com/beego/beego/v2gogetgithub.com/beego/bee/v2或者,使用的是v1版本gogetgithub.com/astaxie/beegogogetgithub.com/beego/bee二、使用bee工具构建项目框架beenewbeego_project(项目名)将会创建一个典型的MVC框架应用或者beeapibeego_project(项目名)将构建一个纯后端项目直接运行bee查看更多命令这里使用beenew来构建MVC项目三、启动项目开始愉快的coding1.进入项目目录使用beerun启动或者gorun启动建议使用beerun,这样会监听代码是否修改,自动重启2.开始coding四、路由详解1.固定路由1.响应所有类型的请求beego.Router("/",&controllers.MainController{})对应的Controller如下packagecontrollersimport("github.com/astaxie/beego")typeMainControllerstruct{beego.Controller}func(c*MainController)Get(){c.Ctx.WriteString("Get")}func(c*MainController)Post(){c.Ctx.WriteString("Post")}func(c*MainController)Put(){c.Ctx.WriteString("Put")}func(c*MainController)Delete(){c.Ctx.WriteString("Delete")}我们在调用get方法时,会执行对应控制器的get方法,同理post则会执行post方法,其他方法同样如此2.响应基本路由即将Router改为对应的方法类型,比如get和postpackageroutersimport("github.com/astaxie/beego""github.com/astaxie/beego/context")funcinit(){beego.Get("/",func(ctx*context.Context){ctx.Output.Body([]byte("get"))})beego.Post("/",func(ctx*context.Context){ctx.Output.Body([]byte("post"))})}支持以下所有类型beego.Get(router,beego.FilterFunc)beego.Post(router,beego.FilterFunc)beego.Put(router,beego.FilterFunc)beego.Patch(router,beego.FilterFunc)beego.Head(router,beego.FilterFunc)beego.Options(router,beego.FilterFunc)beego.Delete(router,beego.FilterFunc)beego.Any(router,beego.FilterFunc)3.更改对应的响应方法beego.Router("/",&controllers.MainController{},"get:MyGet;post:MyPost")beego.Router("/",&controllers.MainController{},"get,post:MyPost")beego.Router("/",&controllers.MainController{},"*:MyPost")如果同时存在*和对应的请求方法,那么优先执行对应请求的方法,例如同时注册了以下路由:beego.Router("/",&controllers.MainController{},"*:AllFunc;post:MyPost")那么执行POST请求的时候,执行MyPost而不执行AllFunc2.正则路由beego.Router("/?:id",&controllers.MainController{})匹配"/"或者"/123",此时变量":id"值为即为"/"后面的参数,及123beego.Router("/:id",&controllers.MainController{})匹配"/123","/"后必须要参数,此时变量":id"值为即为"/"后面的参数,及123beego.Router("/:id([0-9]+)",&controllers.MainController{})自定义正则匹配,只能匹配数字0-9,例如对于"/123"可以匹配成功,此时id值为123beego.Router("/*.*",&controllers.MainController{})对于"/123.png"可以匹配成功,此时变量":path"值为"123",":ext"值为"png"beego.Router("/*",&controllers.MainController{})全匹配,对于"/123"可以匹配成功,此时变量":splat"值为"123beego.Router("/:id:int",&controllers.MainController{})int类型设置方式,匹配:id为int类型,也可其他类型,如string类型,”/:id:string“,匹配:id为string类型beego.Router("/:id.html",&controllers.MainController{})带有前缀的匹配,例如对于"/123.html"可以匹配成功,此时:id为123可以在Controller中通过如下方式获取上面的变量id:=c.Ctx.Input.Param(":id")id:=c.Ctx.Input.Param(":splat")id:=c.Ctx.Input.Param(":path")id:=c.Ctx.Input.Param(":ext")3.自动路由注册路由的时候不需要指定url,只需要注册控制器即可beego.AutoRouter(&controllers.MainController{})/main/api调用MainController中的api方法/main/api2调用MainController中的api2方法除了前缀两个/:controller/:method的匹配之外,剩下的参数beego会帮解析为参数保存在Ctx.Input.Params当中:/main/api/1/2/3调用MainController中的api方法,参数如下map[0:11:22:3]4.注解路由//CMSAPItypeCMSControllerstruct{web.Controller}//@router/staticblock/:key[get]func(this*CMSController)StaticBlock(){}//@router/all/:key[get]func(this*CMSController)AllBlock(){}web.Include(&CMSController{})5.命名空间//初始化namespacens:=web.NewNamespace("/v1",web.NSCond(func(ctx*context.Context)bool{ifctx.Input.Domain()=="api.beego.me"{returntrue}returnfalse}),web.NSBefore(auth),web.NSGet("/notallowed",func(ctx*context.Context){ctx.Output.Body([]byte("notAllowed"))}),web.NSRouter("/version",&AdminController{},"get:ShowAPIVersion"),web.NSRouter("/changepassword",&UserController{}),web.NSNamespace("/shop",web.NSBefore(sentry),web.NSGet("/:id",func(ctx*context.Context){ctx.Output.Body([]byte("notAllowed"))}),),web.NSNamespace("/cms",web.NSInclude(&controllers.MainController{},&controllers.CMSController{},&controllers.BlockController{},),),)//注册namespaceweb.AddNamespace(ns)五、解析参数1.获取url上的参数,?后面的GetString获取数据:路由:beego.Router("/",&controllers.MainController{})访问路径:http://127.0.0.1:8080/?id=111获取数据:id:=c.GetString("id")id2:=c.Input().Get("id")这种方式不行:id3:=c.Ctx.Input.Param(":id")2.获取url上的参数,/:id类型的路由:beego.Router("/?:id:int",&controllers.MainController{})访问路径:http://127.0.0.1:8080/111获取数据:id:=c.GetString(":id")id2:=c.Ctx.Input.Param(":id")这种方式不行:id3:=c.Input().Get(":id")3.获取form表单数据1.直接获取GetString(keystring)stringGetStrings(keystring)[]stringGetInt(keystring)(int64,error)--返回两个值GetBool(keystring)(bool,error)--返回两个值GetFloat(keystring)(float64,error)--返回两个值举例:前端form表单:姓名1:<inputtype="text"name="name">姓名2:<inputtype="text"name="name">年龄:<inputtype="text"name="age">是:<inputtype="radio"name="is_true"value="true">价格:<inputtype="text"name="price">获取数据:name:=c.Input().Get("name")获取的是第一个name的值names:=c.GetStrings("name")获取所有的name的值,是个数组age,err:=c.GetInt("age")is_true,err:=c.GetBool("is_true")price,err:=c.GetFloat("price")2..解析到结构体typeStudentstruct{IdintNamestring`form:"user_name"`Passwordstring`form:"password"`}func(s*StudentController)Post(){student:=Student{}iferr:=s.ParseForm(&student);err!=nil{return}fmt.Println(student)fmt.Println(student.Name)fmt.Println(student.Age)fmt.Println(student.Addr)}4.获取json数据在app.conf配置文件中设置copyrequestbody=true在controller中使用Golang标准库json包来解析json数据封装到stuct结构体packagecontrollersimport("encoding/json""fmt"beego"github.com/beego/beego/v2/server/web")typeMainControllerstruct{beego.Controller}typeLoginDatastruct{UsernamestringPasswdstring`json:"password"`}func(c*MainController)Post(){varloginDataLoginDatadata:=c.Ctx.Input.RequestBodyiferr:=json.Unmarshal(data,&loginData);err!=nil{fmt.Println("json.Unmarshaliserr:",err.Error())}fmt.Println(loginData)c.Ctx.WriteString(loginData.Username)}5.获取文件f,h,_:=c.GetFile("file")deferf.Close()c.SaveToFile("file","static/down/"+h.Filename)//保存位置在static/upload,没有文件夹要先创建6.表单校验安装gogetgithub.com/beego/beego/v2/core/validation使用typeUserValidstruct{Idint`form:"-"`Namestring`form:"username"valid:"Required"`Passwdstring}func(cParamsController)Required(){varuserUserValidc.ParseForm(&user)valid:=validation.Validation{}varmessage=map[string]string{"Required":"不能为空",}validation.SetDefaultMessage(message)b,err:=valid.Valid(&user)valid.Required(user.Passwd,"passwd")valid.Required(user.Passwd,"密码").Message("不能为空!!!")err:=valid.HasErrors()iferr{//如果有错误信息,证明验证没通过//打印错误信息for_,err:=rangevalid.Errors{fmt.Println(err.Key,err.Message)}}}7.过滤器funcFilterUStatic(c*context.Context){fmt.Println("BeforeStatic",c.Request.RequestURI)}funcFilterRouter(c*context.Context){data:=map[string]interface{}{"ErrCode":0,"ErrMsg":"ok","data":123}c.Output.JSON(data,false,false)}beego.InsertFilter("/*",beego.BeforeStatic,FilterUStatic)beego.InsertFilter("/*",beego.BeforeRouter,FilterRouter)//能拿到session六、返回数据1.返回json数据packagecontrollersimport(beego"github.com/beego/beego/v2/server/web")typeMainControllerstruct{beego.Controller}typeSendMsgstruct{ErrCodestringErrMsgstringData[]string`json:"data_info"`//key重命名,最外面是反引号}func(c*MainController)Post(){data:=&SendMsg{"0","ok",[]string{"passerma","com"}}c.Data["json"]=datac.ServeJSON()}返回结果七、操作session和数据库1.操作session1).直接使用sessionsession主要是和cookie一起使用的在app.conf配置文件中设置sessionOn=true或者使用beego.BConfig.WebConfig.Session.SessionOn=truesession有几个方便的方法:SetSession(namestring,valueinterface{})GetSession(namestring)interface{}DelSession(namestring)SessionRegenerateID()DestroySession()session操作主要有设置session、获取session、删除session。关于Session模块和cookie模块使用中的一些参数设置:设置Session过期的时间beego.BConfig.WebConfig.Session.SessionGCMaxLifetime默认值是3600秒设置cookie的过期时间beego.BConfig.WebConfig.Session.SessionCookieLifeTime设置sessionid加密算法beego.BConfig.WebConfig.Session.SessionHashFunc默认值为sha1修改sessionkeybeego.BConfig.WebConfig.Session.SessionHashKey默认的key是beegoserversessionkey修改该参数设置cookies的名字beego.BConfig.WebConfig.Session.SessionNameSession默认是保存在用户的浏览器cookies里面的,默认名是beegosessionID以上也可通过配置文件修改2).session链接redis从beego1.1.3版本开始移除了第三方依赖库,因此需要安装redis包goget-ugithub.com/beego/beego/v2/session/redis或者goget-ugithub.com/astaxie/beego/session/redis引入库import_"github.com/beego/beego/v2/session/redis"或者import_"github.com/astaxie/beego/session/redis"链接到redisfuncmain(){beego.BConfig.WebConfig.Session.SessionProvider="redis"//"127.0.0.1:6379,1000,$password"//其中127.0.0.1:6379为ip和端口,1000为连接池,最后一个为redis密码beego.BConfig.WebConfig.Session.SessionProviderConfig="127.0.0.1:6379"beego.Run()}2.操作数据库(MySQL)1.连接数据库1).安装orm和MySQL驱动orm安装gogetgithub.com/beego/beego/v2/client/orm或者gogetgithub.com/astaxie/beego/ormMySQL驱动安装gogetgithub.com/go-sql-driver/mysql2).连接数据库(必须注册一个别名为default的数据库)orm.RegisterDriver("mysql",orm.DRMySQL)orm.RegisterDataBase("default","mysql","用户名:密码@tcp(IP:端口号)/数据库?charset=utf8",30,30)参数一:数据库的别名,用来在ORM中切换数据库使用参数二:驱动名称参数三:对应的链接字符串参数四(可选):设置最大空闲连接或根据数据库别名设置:orm.SetMaxIdleConns(“default”,30)参数五(可选):设置最大数据库连接或根据数据库别名设置:orm.SetMaxOpenConns(“default”,30)3).注册模型orm.RegisterModel(new(Users))4).操作数据库例子先在main.go里连接数据库packagemainimport(_"beegoV2/routers"beego"github.com/beego/beego/v2/server/web""github.com/beego/beego/v2/orm"_"github.com/go-sql-driver/mysql")funcinit(){orm.RegisterDriver("mysql",orm.DRMySQL)orm.RegisterDataBase("default","mysql","root:admin_123@tcp(127.0.0.1:3306)/go_test?charset=utf8")}funcmain(){beego.Run()}在models里注册模型packagemodelsimport"github.com/beego/beego/v2/orm"typeUsersstruct{Idint`orm:"pk;auto"`UsernamestringPasswordstring`orm:"column(passwd)"`}funcinit(){orm.RegisterModel(new(Users))}在controllers里操作数据func(c*UserController)Post(){varuseDatamodels.Users//查询到的用户o:=orm.NewOrm()qs:=o.QueryTable(new(models.Users))passwd:=utils.GetMd5(123456)//得到加密后的密码userErr:=qs.Filter("Username","passerma").Filter("Password",passwd).One(&useData)ifuserErr!=nil{fmt.Println(useData)}else{fmt.Println(err.Error())}}2.自动建表前提:数据库已注册:orm.RegisterDataBase模型已注册:orm.RegisterModelfuncinit(){orm.RegisterDriver("mysql",orm.DRMySQL)orm.RegisterDataBase("default","mysql","root:admin_123@tcp(127.0.0.1:3306)/go_test?charset=utf8")name:="default"//指定数据库别名,默认使用别名为defaultforce:=false//删除表后再创建,默认为trueverbose:=true//可以查看执行的sql语句err:=orm.RunSyncdb(name,force,verbose)iferr!=nil{panic(err)}}funcmain(){orm.RunCommand()beego.Run()}八、日志模块1.输出到文件logs.SetLogger(logs.AdapterFile,{"filename":"test.log"})参数:filename保存的文件名maxlines每个文件保存的最大行数,默认值1000000maxsize每个文件保存的最大尺寸,默认值是1<<28,//256MB2^281<<32^3daily是否按照每天logrotate,默认是truemaxdays文件最多保存多少天,默认保存7天rotate是否开启logrotate,默认是truelevel日志保存的时候的级别,默认是Trace级别perm日志文件权限4(读权限)2(写权限)1(执行权限)multifile多文件日志写入,对号入座写入,比如test.error.log,err.debug.loglogs.SetLogger(logs.AdapterMultiFile,{"filename":"test.log","separate":["emergency","alert","critical","error","warning","notice","info","debug"]})2.邮件发送logs.SetLogger(logs.AdapterMail,{"username":"xxx@qq.com","password":"认证密码","host":"smtp.qq.com:587","fromAddress":"xxx@qq.com","sendTos":["xxx@qq.com"]})九、部署1.独立部署beepack-beGOOS=linux(打包到linux上部署命令)beepack-beGOOS=window(打包到windows上部署命令)会生成tar.gz包复制到服务器解压tarzxvftar.gz增加解压后的二进制文件的可执行权限chmod+xgo_pkg启动nohup./go_pkg&2.Supervisor部署[program:beepkg]directory=/opt/app/beepkgcommand=/opt/app/beepkg/beepkgautostart=truestartsecs=5user=rootredirect_stderr=truestdout_logfile=/var/log/supervisord/beepkg.log启动进程supervisorctlstartbeepkg
暂无评论,我会出手
说点什么
登录用户可以修改和删除评论,可以收到回复的邮件提醒点击登录/注册
最多上传8张图片,仅支持jpg,png格式图片,单张大小5MB以内!
用户名: