1,先看下model文件夹下的g.go文件,这是链接数据库文件,这里导入了gorm,如果没有这个可以用
go get github.com/jinzhu/gorm获取一下
package model
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
var db *gorm.DB
func SetDB(database *gorm.DB) {
db = database
}
func ConnectToDB() *gorm.DB{
db, err := gorm.Open("mysql", "root:@/fenlei?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic("Failed to connect database")
}
db.SingularTable(true)
return db
}
ConnectToDB函数就是连接了数据库,如果不太清楚gorm的用法可以看一下官方文档。
2,然后看一下model文件夹下的user.go文件
package model
import "fmt"
type User struct {
ID int `gorm:"primary_key"`
Username string `gorm:"type:varchar(64)"`
Email string `gorm:"type:varchar(120)"`
PasswordHash string `gorm:"type:varchar(128)"`
Posts []Post
Followers []*User `gorm:"many2many:follower;association_jointable_foreignkey:follower_id"`
}
func (u *User) SetPassword(password string) {
u.PasswordHash = GeneratePassword(password)
}
func GetUserByUsername(username string) User{
var user User
fmt.Println(db)
db.Where("username=?", username).Find(&user)
return user
}
这里定义user结构体,写了两个函数,通过用户名获取用户和设置用户密码
3.medel/utils.go的GeneratePassword函数
package model
import (
"crypto/md5"
"encoding/hex"
)
func GeneratePassword(pwd string) string{
hasher :=md5.New()
hasher.Write([]byte(pwd))
pwdHash :=hex.EncodeToString(hasher.Sum(nil))
return pwdHash
}
生成密码
4.model/post.go帖子的文件
package model
import "time"
type Post struct {
ID int `gorm:"primary_key"`
UserID int
User User
Body string `gorm:"type:varchar(180)"`
Timestamp *time.Time `sql:"DEFAULT:current_timestamp"`
}
func GetPostsByUserID(id int) (*[]Post, error) {
var posts []Post
if err := db.Preload("User").Where("user_id=?", id).Find(&posts).Error; err != nil {
return nil, err
}
return &posts, nil
}
GetPostsByUserID通过用户id获取到用户发的帖,这样model文件夹的文件建立好了,基本是定义了一些数据文件结构和通用查询方法。
5,改造一下vm/index.go文件
import (
"model"
)
type IndexViewModel struct {
BaseViewModel
model.User
Posts []model.Post
}
// IndexViewModelOp struct
type IndexViewModelOp struct{}
// GetVM func
func (IndexViewModelOp) GetVM() IndexViewModel {
u1:=model.GetUserByUsername("rene")
posts,_:=model.GetPostsByUserID(u1.ID)
v := IndexViewModel{BaseViewModel{Title: "Homepage"}, u1,*posts}
return v
}
GetVM方法之前是写死的数据,现在调用数据库的数据。
这样运行index.go,打开浏览器,就可以看到运行效果了。
来源:php程序媛