使用beego框架,建立User模型,操作数据库,执行登陆操作。
本文记录,使用beego框架,ORM来建立一个用户模型User,数据库使用MySql。通过Model(User)来获取用户信息,做一个登陆操作的demo。
本文假定beego框架已经成功安装到本地。如果不了解可以参考之前的文章,beego框架介绍
建立User模型
在beego项目目录的models目录下建立 user文件,定义User模型。如下所示
type User struct {
Id int `orm:"column(id);auto;pk" description:"用户Id"`
Name string `orm:"column(name);size(255)" description:"名字"`
Password string `orm:"column(password);size(255)" description:"密码"`
Email string `orm:"column(email);size(255)" description:"邮箱"`
Created time.Time `orm:"auto_now_add;type(datetime)"`
Status int `orm:"column(status)" description:"当前用户的状态"`
}
说明一下User定义
orm:"column(id);auto;pk" description:"用户Id"
这是使用go语言中的struct tag 来描述 User模型对应数据库表中的含义。具体到这里,- column(id)表示 Model User对象对应数据库中列明为id
- auto 表示自增长
- pk 是primary key 主键的意思
- description 数据库字段的说明
其他如Name 字段 Password 的含义和这里类似
Create 字段需要说明一个 auto_now_add 表示时间自动填充;因为我们希望知道这个用户是什么时候被新增进来的。
配置数据库驱动类型,指定数据库的连接,初始化数据库
在项目工程的conf/app.conf文件中配置数据库类型,连接参数等
#数据库的配置
[db]
dbType = mysql #数据库类型
dbUser = userName #数据库用户名自
dbPass = dbpassword #数据库密码
dbHost = your db host #数据库所在的主机
dbPort = 3306 #mysql的端口
dbName = blog #数据库的名字
app.conf 其实是一个ini文件。
不了解数据库安装的可以参考之前的博客阿里云centeros 上安装mysql 5.6
beego 框架不仅仅支持mysql,还支持其他类型的数据库。鉴于此,做一个数据库的连接接口,在项目的根目录下创建db目录,在该目录下创建db文件
type DataBase interface {
GetStr() string
GetDriverName() string
GetAliasName() string
GetDriver() orm.DriverType
}
type instance func() DataBase
var adapters = make(map[string]instance)
func NewDataBase(adapterName string) (adapter DataBase,err error){
instanceFunc,ok := adapters[adapterName]
if !ok{
err = fmt.Errorf("database unknow adapter name %q (forgot to import)",adapterName)
return
}
adapter = instanceFunc()
if err != nil{
adapter = nil
}
return
}
/*
注册操作
*/
func Register(name string,adapter instance){
if adapter ==nil{
panic("database:Register adapter is nil")
}
if _,ok := adapters[name];ok {
panic("database adapter register twice "+name)
}
adapters[name] = adapter
}
在同级目录创建mysql文件
type MySqlDataBase struct {
}
func NewMySqlDataBase() DataBase{
database := &MySqlDataBase{}
return database
}
/*
获取数据库的连接字符串
*/
func (db *MySqlDataBase) GetStr() string{
conf,err := config.NewConfig("ini","conf/app.conf")
if err != nil{
logrus.Errorf(err.Error())
}
dbUser := conf.String("db::dbUser")
dbPass := conf.String("db::dbPass")
dbHost := conf.String("db::dbHost")
dbPort := conf.String("db::dbPort")
dbName := conf.String("db::dbName")
return dbUser + ":" + dbPass + "@tcp(" + dbHost + ":" + dbPort + ")/" + dbName + "?charset=utf8&loc=Asia%2FShanghai&sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
}
func(db *MySqlDataBase) GetDriverName() string{
return "mysql"
}
func(db *MySqlDataBase)GetAliasName() string{
return "default"
}
func(db *MySqlDataBase)GetDriver() orm.DriverType{
return orm.DRMySQL
}
func init(){
Register("mysql",NewMySqlDataBase)
}
通过以上两个文件,通过数据库来操作mysql的基础连接做好了。但是需要调用才能真正连接上。
在main.go中,读取app.conf中配置的数据库配置,调用数据库接口来连接数据库。
/*
进行数据库的消息注册
*/
database,err :=db.NewDataBase(conf.String("db::dbType"))
orm.RegisterDriver(database.GetDriverName(),database.GetDriver())
orm.RegisterDataBase(database.GetAliasName(),database.GetDriverName(),database.GetStr())
到这里数据库就能正确连接上了。
编译运行,有如下报错:
register db `default`, sql: unknown driver "mysql" (forgotten import?) must have one register DataBase
从报错的情况来看,是没有安装mysql数据库驱动
执行一下命令来安装对应的驱动。
- go get github.com/Go-SQL-Driver/MySQL
- go install github.com/Go-SQL-Driver/MySQL
驱动安装成功后,同样的错误。
还需要引入:mysql驱动
在main的import中添加下面一行代码:
_ "github.com/go-sql-driver/mysql"
该代码表示将引入的mysql驱动在本文件main.go中并没有被使用,所以前面要加上 “_”
至此编译成功。
通过ORM操作数据库。
假定前台通过ajax发送dologin请求。router配置将相应的请求给loginController来处理。
func(c *LoginController)DoLogin(){
//获取ajax发送过来的用户名
userName := c.GetString("uname")
//获取密码
password := c.GetString("upwd")
//因为是ajax请求,不渲染界面直接返回json
response := make(map[string]interface{})
//验证用户名和密码是否正确
if user,ok := admin.DoLogin(userName,password);ok{
c.SetSession("User",*user)
response["code"] = 0
response["msg"] = "登陆成功"
}else {
response["code"] = 1
response["msg"] = "登陆失败"
}
c.Data["json"] = response
c.ServeJSON()
}
上面的代码是LoginController中执行的逻辑。
具体admin.DoLogin()是怎么根据前台传送过来的usrName,userPassword来判定是否能够登陆成功的。
前面已经创建了Model User 对象。增加以下代码:
func DoLogin(userName string,password string) (*User,bool){
o := orm.NewOrm()
var (
user User
err error
)
ok := false
//使用默认数据库
o.Using("default")
//查询条件
cond := orm.NewCondition()
cond = cond.And("status",1).And("Name",userName).Or("Email",userName)
//查找表
qs := o.QueryTable(&user)
qs = qs.SetCond(cond)
if err = qs.One(&user);err == nil{
if user.Password == password {
ok = true
}
}
return &user,ok
}
通过下上操作,编译运行,前端通过ajax发送post请求;如果该用户名存在user数据库表中,并且密码匹配则前端会收到json
·
{
code:0,
msg:"成功"
}
如果用户不存在或者密码错误
{
code:0,
msg:"成功"
}
至此登陆操作的后台逻辑完成。