最近学习golang也有一段时间了,基础差不多学了个大概,因为本人是java程序员,所以对web更感兴趣。根据《go web编程》中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜:
这个例子使用到了beego框架和beedb框架,如果是go新手beego和beedb得自己去google下载安装。
目录结构:
index.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 39 40 41 | package controllers import ( "fmt" "github.com/astaxie/beego" "login/models" ) type IndexController struct { beego.Controller } func (index *IndexController) Get() { sess := index.StartSession() username := sess.Get( "username" ) fmt.Println(username) if username == nil || username == "" { index.TplNames = "index.tpl" } else { index.TplNames = "success.tpl" } } func (index *IndexController) Post() { sess := index.StartSession() var user models.User inputs := index.Input() //fmt.Println(inputs) user.Username = inputs.Get( "username" ) user.Pwd = inputs.Get( "pwd" ) err := models.ValidateUser(user) if err == nil { sess.Set( "username" , user.Username) fmt.Println( "username:" , sess.Get( "username" )) index.TplNames = "success.tpl" } else { fmt.Println(err) index.TplNames = "error.tpl" } } |
regist.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 | package controllers import ( "fmt" "github.com/astaxie/beego" "login/models" ) type RegistController struct { beego.Controller } func ( this *RegistController) Get() { this .TplNames = "regist.tpl" } func ( this *RegistController) Post() { var user models.User inputs := this .Input() //fmt.Println(inputs) user.Username = inputs.Get( "username" ) user.Pwd = inputs.Get( "pwd" ) err := models.SaveUser(user) if err == nil { this .TplNames = "success.tpl" } else { fmt.Println(err) this .TplNames = "error.tpl" } } |
models.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 39 40 41 | package models import ( "database/sql" "errors" "fmt" "github.com/astaxie/beedb" _ "github.com/ziutek/mymysql/godrv" ) type User struct { Id int `PK` Username string Pwd string } func getLink() beedb.Model { db, err := sql.Open( "mysql" , "root:root@tcp(192.168.1.81:3306)/test_my?charset=utf8" ) if err != nil { panic(err) } orm := beedb.New(db) return orm } func SaveUser(user User) error { orm := getLink() fmt.Println(user) err := orm.Save(&user) return err } func ValidateUser(user User) error { orm := getLink() var u User orm.Where( "username=? and pwd=?" , user.Username, user.Pwd).Find(&u) if u.Username == "" { return errors.New( "用户名或密码错误!" ) } return nil } |
main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package main import ( //"fmt" "github.com/astaxie/beego" "login/controllers" ) type MainController struct { beego.Controller } func main() { beego.SessionOn = true beego.RegisterController( "/" , &controllers.IndexController{}) beego.RegisterController( "/regist" , &controllers.RegistController{}) beego.Run() } |
error.tpl
1 2 3 4 5 | <html> <body> error </body> </html> |
success.tpl
1 2 3 4 5 | <html> <body> successed </body> </html> |
index.tpl
1 2 3 4 5 6 7 8 9 10 11 | <html> <body> <h1>login</h1> <form action= "/" method= "post" > 用户名:<input type= "text" name= "username" ><br> 密码:<input type= "password" name= "pwd" ><br> <input type= "submit" value= "登录" ><br> <a href= "/regist" >注册</a> </form> </body> </html> |
regist.tpl
1 2 3 4 5 6 7 8 9 10 | <html> <body> <h1>regist</h1> <form action= "/regist" method= "post" > 用户名:<input type= "text" name= "username" ><br> 密码:<input type= "password" name= "pwd" ><br> <input type= "submit" value= "注册" > </form> </body> </html> |
数据库用的是mysql,建表语句
1 2 3 4 5 6 | CREATE TABLE user ( id INT , username VARCHAR (32), pwd VARCHAR (32), PRIMARY KEY (id) ); |
程序跑起来是没有问题,但是session老是取不到数据,求大神解释!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2011-06-29 量产USBCDROM后的PE无法加载外置程序的原因及解决方法(转)
2011-06-29 PE中添加外置程序(转载)
2010-06-29 vista开发注意事项及解决方案
2010-06-29 LNK2005 *** 已经在 *** lib中定义