1,需求
通过命令行参数初始化,自动创建表,并且提供一个初始化的密码,用户名为Admin
main函数#
main函数中我们定义orm的初始化信息,定义在init函数中
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.Debug = true
maxIdle := 30
maxConn := 30
orm.RegisterDataBase("default", "mysql", "todolist_no1:todolist_no1@tcp(172.25.50.250:3306)/todolista?charset=utf8", maxIdle, maxConn)
}
其他如下:
package main
import (
"flag"
"fmt"
"todolist/models"
"todolist/utils"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
//"github.com/astaxie/beego"
)
func main() {
init := flag.Bool("init", false, "init admin")
force := flag.Bool("force", false, "force clear database")
flag.Parse()
if *init {
orm.RunSyncdb("default", *force, true)
user := models.User{Name: "admin", IsSuper: true}
password := utils.RandomString(6)
user.SetPassword(password)
if err := models.AddUser(&user); err != nil {
fmt.Println(err)
} else {
fmt.Printf("Admin Password:%s\n", password)
}
} else {
fmt.Println("Run todolist App")
}
}
如上所示,其中有init和forece参数,如果指定-init后,会进行orm.RunSyncdb同步。这里调用了models和utils目录下的两个函数
models#
在models中,定义数据结构体,和SetPassword方法,和AddUser函数
package models
import (
"time"
"todolist/utils"
"github.com/astaxie/beego/orm"
)
type User struct {
Id int
Name string `orm:"type(varchar);size(32);default();"`
Password string `orm:"type(varchar);size(1024);default();"`
Birthday *time.Time `orm:"type(date);null;"`
Sex bool `orm:"default(false)"`
Tel string `orm:"type(varchar);size(16);default();"`
Addr string `orm:"type(varchar);size(512);default();"`
Desc string `orm:"type(text);default();"`
IsSuper bool `orm:"default(false)"`
CreateTime *time.Time `orm:"type(datetime);auto_now_add;"`
}
func (u *User) SetPassword(plain string) {
u.Password = utils.Md5string(plain)
}
func AddUser(user *User) error {
o := orm.NewOrm()
_, err := o.Insert(user)
return err
}
func init() {
orm.RegisterModel(&User{})
}
其中,SetPassword会调用utils中的Md5string函数做md5效验,在AddUser函数中要多orm.Neworm进行Insert
最后使用 orm.RegisterModel(new(&User{})注册定义models
utils#
在utils中,我们要计算一个随机的密码,并进行md5加密,并用了时间作为基数
package utils
import (
"crypto/md5"
"fmt"
"math/rand"
"time"
)
func RandomString(length int) string {
letters := "dasdacxzMKLDKJSOAJMXCMXLA;ZKMCOQK[OXCZ1654163"
len := len(letters)
chars := make([]byte, length)
for i := 0; i < length; i++ {
chars[i] = letters[rand.Int()%len]
}
return string(chars)
}
func Md5string(plain string) string {
return fmt.Sprintf("%x", md5.Sum([]byte(plain)))
}
func init() {
rand.Seed(time.Now().Unix())
}
而后进行go build
run测试#
如下:
PS E:\golangNode\project\16day\todolist> .\todolist.exe -init -force
drop table `user`
DROP TABLE IF EXISTS `user`
create table `user`
-- --------------------------------------------------
-- Table Structure for `todolist/models.User`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `user` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(32) NOT NULL DEFAULT '' ,
`password` varchar(1024) NOT NULL DEFAULT '' ,
`birthday` date,
`sex` bool NOT NULL DEFAULT false ,
`tel` varchar(16) NOT NULL DEFAULT '' ,
`addr` varchar(512) NOT NULL DEFAULT '' ,
`desc` longtext NOT NULL,
`is_super` bool NOT NULL DEFAULT false ,
`create_time` datetime NOT NULL
) ENGINE=InnoDB;
[ORM]2019/11/11 14:24:55 -[Queries/default] - [ OK / db.Exec / 9.9ms] - [INSERT INTO `user` (`name`, `password`, `birthday`, `sex`, `tel`, `addr`, `desc`, `is_super`, `create_time`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)] - `admin`, `97497b8dbfa19accae1c3f73c53044b1`, `<nil>`, `false`, ``, ``, ``, `true`, `2019-11-11 14:24:55.3671742 +0800 CST`
Admin Password:33sZ6L
数据库中已经创建完成
MariaDB [todolista]> select * from user;
+----+-------+----------------------------------+----------+-----+-----+------+------+----------+---------------------+
| id | name | password | birthday | sex | tel | addr | desc | is_super | create_time |
+----+-------+----------------------------------+----------+-----+-----+------+------+----------+---------------------+
| 1 | admin | 97497b8dbfa19accae1c3f73c53044b1 | NULL | 0 | | | | 1 | 2019-11-11 06:24:55 |
+----+-------+----------------------------------+----------+-----+-----+------+------+----------+---------------------+
1 row in set (0.00 sec)