使用beego框架,建立User模型,操作数据库,执行登陆操作。

本文记录,使用beego框架,ORM来建立一个用户模型User,数据库使用MySql。通过Model(User)来获取用户信息,做一个登陆操作的demo。

本文假定beego框架已经成功安装到本地。如果不了解可以参考之前的文章,beego框架介绍

建立User模型

在beego项目目录的models目录下建立 user文件,定义User模型。如下所示

  1. type User struct {
  2. Id int `orm:"column(id);auto;pk" description:"用户Id"`
  3. Name string `orm:"column(name);size(255)" description:"名字"`
  4. Password string `orm:"column(password);size(255)" description:"密码"`
  5. Email string `orm:"column(email);size(255)" description:"邮箱"`
  6. Created time.Time `orm:"auto_now_add;type(datetime)"`
  7. Status int `orm:"column(status)" description:"当前用户的状态"`
  8. }

说明一下User定义

  • orm:"column(id);auto;pk" description:"用户Id" 这是使用go语言中的struct tag 来描述 User模型对应数据库表中的含义。具体到这里,
    1. - column(id)表示 Model User对象对应数据库中列明为id
    2. - auto 表示自增长
    3. - pk primary key 主键的意思
    4. - description 数据库字段的说明
  • 其他如Name 字段 Password 的含义和这里类似

  • Create 字段需要说明一个 auto_now_add 表示时间自动填充;因为我们希望知道这个用户是什么时候被新增进来的。

配置数据库驱动类型,指定数据库的连接,初始化数据库


在项目工程的conf/app.conf文件中配置数据库类型,连接参数等

  1. #数据库的配置
  2. [db]
  3. dbType = mysql #数据库类型
  4. dbUser = userName #数据库用户名自
  5. dbPass = dbpassword #数据库密码
  6. dbHost = your db host #数据库所在的主机
  7. dbPort = 3306 #mysql的端口
  8. dbName = blog #数据库的名字

app.conf 其实是一个ini文件。

不了解数据库安装的可以参考之前的博客阿里云centeros 上安装mysql 5.6


beego 框架不仅仅支持mysql,还支持其他类型的数据库。鉴于此,做一个数据库的连接接口,在项目的根目录下创建db目录,在该目录下创建db文件

  1. type DataBase interface {
  2. GetStr() string
  3. GetDriverName() string
  4. GetAliasName() string
  5. GetDriver() orm.DriverType
  6. }
  7. type instance func() DataBase
  8. var adapters = make(map[string]instance)
  9. func NewDataBase(adapterName string) (adapter DataBase,err error){
  10. instanceFunc,ok := adapters[adapterName]
  11. if !ok{
  12. err = fmt.Errorf("database unknow adapter name %q (forgot to import)",adapterName)
  13. return
  14. }
  15. adapter = instanceFunc()
  16. if err != nil{
  17. adapter = nil
  18. }
  19. return
  20. }
  21. /*
  22. 注册操作
  23. */
  24. func Register(name string,adapter instance){
  25. if adapter ==nil{
  26. panic("database:Register adapter is nil")
  27. }
  28. if _,ok := adapters[name];ok {
  29. panic("database adapter register twice "+name)
  30. }
  31. adapters[name] = adapter
  32. }

在同级目录创建mysql文件

  1. type MySqlDataBase struct {
  2. }
  3. func NewMySqlDataBase() DataBase{
  4. database := &MySqlDataBase{}
  5. return database
  6. }
  7. /*
  8. 获取数据库的连接字符串
  9. */
  10. func (db *MySqlDataBase) GetStr() string{
  11. conf,err := config.NewConfig("ini","conf/app.conf")
  12. if err != nil{
  13. logrus.Errorf(err.Error())
  14. }
  15. dbUser := conf.String("db::dbUser")
  16. dbPass := conf.String("db::dbPass")
  17. dbHost := conf.String("db::dbHost")
  18. dbPort := conf.String("db::dbPort")
  19. dbName := conf.String("db::dbName")
  20. return dbUser + ":" + dbPass + "@tcp(" + dbHost + ":" + dbPort + ")/" + dbName + "?charset=utf8&loc=Asia%2FShanghai&sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
  21. }
  22. func(db *MySqlDataBase) GetDriverName() string{
  23. return "mysql"
  24. }
  25. func(db *MySqlDataBase)GetAliasName() string{
  26. return "default"
  27. }
  28. func(db *MySqlDataBase)GetDriver() orm.DriverType{
  29. return orm.DRMySQL
  30. }
  31. func init(){
  32. Register("mysql",NewMySqlDataBase)
  33. }

通过以上两个文件,通过数据库来操作mysql的基础连接做好了。但是需要调用才能真正连接上。


在main.go中,读取app.conf中配置的数据库配置,调用数据库接口来连接数据库。

  1. /*
  2. 进行数据库的消息注册
  3. */
  4. database,err :=db.NewDataBase(conf.String("db::dbType"))
  5. orm.RegisterDriver(database.GetDriverName(),database.GetDriver())
  6. orm.RegisterDataBase(database.GetAliasName(),database.GetDriverName(),database.GetStr())

到这里数据库就能正确连接上了。

编译运行,有如下报错:

  1. register db `default`, sql: unknown driver "mysql" (forgotten import?) must have one register DataBase

从报错的情况来看,是没有安装mysql数据库驱动
执行一下命令来安装对应的驱动。

  1. go get github.com/Go-SQL-Driver/MySQL
  2. go install github.com/Go-SQL-Driver/MySQL

驱动安装成功后,同样的错误。
还需要引入:mysql驱动
在main的import中添加下面一行代码:

  1. _ "github.com/go-sql-driver/mysql"

该代码表示将引入的mysql驱动在本文件main.go中并没有被使用,所以前面要加上 “_”

至此编译成功。

通过ORM操作数据库。

假定前台通过ajax发送dologin请求。router配置将相应的请求给loginController来处理。

  1. func(c *LoginController)DoLogin(){
  2. //获取ajax发送过来的用户名
  3. userName := c.GetString("uname")
  4. //获取密码
  5. password := c.GetString("upwd")
  6. //因为是ajax请求,不渲染界面直接返回json
  7. response := make(map[string]interface{})
  8. //验证用户名和密码是否正确
  9. if user,ok := admin.DoLogin(userName,password);ok{
  10. c.SetSession("User",*user)
  11. response["code"] = 0
  12. response["msg"] = "登陆成功"
  13. }else {
  14. response["code"] = 1
  15. response["msg"] = "登陆失败"
  16. }
  17. c.Data["json"] = response
  18. c.ServeJSON()
  19. }

上面的代码是LoginController中执行的逻辑。

具体admin.DoLogin()是怎么根据前台传送过来的usrName,userPassword来判定是否能够登陆成功的。

前面已经创建了Model User 对象。增加以下代码:

  1. func DoLogin(userName string,password string) (*User,bool){
  2. o := orm.NewOrm()
  3. var (
  4. user User
  5. err error
  6. )
  7. ok := false
  8. //使用默认数据库
  9. o.Using("default")
  10. //查询条件
  11. cond := orm.NewCondition()
  12. cond = cond.And("status",1).And("Name",userName).Or("Email",userName)
  13. //查找表
  14. qs := o.QueryTable(&user)
  15. qs = qs.SetCond(cond)
  16. if err = qs.One(&user);err == nil{
  17. if user.Password == password {
  18. ok = true
  19. }
  20. }
  21. return &user,ok
  22. }

通过下上操作,编译运行,前端通过ajax发送post请求;如果该用户名存在user数据库表中,并且密码匹配则前端会收到json
·

  1. {
  2. code:0,
  3. msg:"成功"
  4. }

如果用户不存在或者密码错误

  1. {
  2. code:0,
  3. msg:"成功"
  4. }

至此登陆操作的后台逻辑完成。

2021-08-05 21:53:57  user 阅读(162) 评论(0) 标签:beego,orm,beego mysql数据库操作 分类:go web