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)