投票系統
數據庫的建立
先分析需求,在sql中建立數據庫,關于項目數據庫如何建立可以在“goweb項目創建流程分析中看如何去建表”
成功后目前有四個表:
vote,user,vote_opt,vote_opt_user
建立數據庫,可以使用網上的sql轉gorm網站,把建表語句直接轉換成結構體,
放在model下的model.go文件下,作為全部數據庫存放處
package modelimport "database/sql"//這里存放各種gorm建表語句type VoteOptUser struct {Id sql.NullInt64 `gorm:"column:id;primary_key;AUTO_INCREMENT"`UserId sql.NullInt64 `gorm:"column:user_id"`VoteId sql.NullInt64 `gorm:"column:vote_id"`VoteOptId sql.NullInt64 `gorm:"column:vote_opt_id"`CreateTime sql.NullString `gorm:"column:create_time"`UpdateTime sql.NullString `gorm:"column:update_time"`
}func (v *VoteOptUser) TableName() string {return "vote_opt_user"
}type VoteOpt struct {Id sql.NullInt64 `gorm:"column:id;primary_key;AUTO_INCREMENT"`Name sql.NullString `gorm:"column:name"`VoteId sql.NullInt64 `gorm:"column:vote_id"`Count sql.NullInt32 `gorm:"column:count"`CreatedTime sql.NullString `gorm:"column:created_time"`UpdateTime sql.NullString `gorm:"column:update_time"`
}func (v *VoteOpt) TableName() string {return "vote_opt"
}type Vote struct {Id sql.NullInt64 `gorm:"column:id;primary_key;AUTO_INCREMENT"`Title sql.NullString `gorm:"column:title"`Type sql.NullInt32 `gorm:"column:type;comment:'0是單選1是多選'"`Status sql.NullInt32 `gorm:"column:status;comment:'0開放1超時'"`Time sql.NullInt64 `gorm:"column:time;comment:'有效時長'"`UserId sql.NullInt64 `gorm:"column:user_id;comment:'創建人是誰'"`CreatedTime sql.NullString `gorm:"column:created_time;comment:'創建時間'"`UpdatedTime sql.NullString `gorm:"column:updated_time;comment:'更新時間'"`
}func (v *Vote) TableName() string {return "vote"
}type User struct {Id sql.NullInt64 `gorm:"column:id;primary_key;AUTO_INCREMENT"`Name sql.NullString `gorm:"column:name"`Password sql.NullString `gorm:"column:password"`CreatedTime sql.NullString `gorm:"column:created_time"`UpdateTime sql.NullString `gorm:"column:update_time"`
}func (u *User) TableName() string {return "user"
}
建立完成,可以先測試是否成功
測試:
在model中建立:vote,model_test文件,測試數據庫是否連接成功,能否查出數據
//model_text測試文件:
package model
import ("fmt""testing"
)
func TestGetVotes(t *testing.T) { //該方法測試vote是否生效NewMysql() //連接數據庫//測試用例r := GetVotes() //查詢方法fmt.Printf("ret:%+v", r)//%+v 是一個格式化占位符,表示以“擴展”格式輸出變量的值。對于結構體(struct)類型的變量,%+v 會輸出字段名和字段值。//和%v區別:通用的格式化占位符,根據變量的實際類型進行格式化輸出。對于結構體,它會輸出字段的值,但不會包括字段名。Close()
}
//vote文件:其實和user文件中方法基本一致,都是封裝查表方法
package modelimport "fmt"func GetVotes() []Vote { //該方法會輸出Vote切片類型的值//封裝查詢方法,查詢投票項目的詳情ret := make([]Vote, 0) //定義ret為切片類型,0表示長度為0,內部存放具體值為vote類型err := Conn.Table("vote").Find(&ret).Errorif err != nil {fmt.Printf("err:%s", err.Error())}return ret
}
當在vote中加入數據:
再在test方法中測試:輸出
(后邊沒截完)
因為ret是切片類型,所以能同時查多條記錄,測試完成,可以寫邏輯層和router層代碼啦!!!
將所有表名展示到網頁上
首先先試試把vote的Title展示到頁面上:
將index.tmpl代碼改為:
寫模板文件
<!doctype html>
<html lang="en">
<head><title>香香編程-投票項目</title>
</head>
<body>
<main>{{range $key,$value := .vote}}<h2>{{$value.Title}}</h2>{{/* 用模板寫出只要所有ret的title*/}}{{end}}
</main>
</body>
</html>
邏輯層下
func Index(context *gin.Context) {ret := model.GetVotes()context.HTML(http.StatusOK, "index.tmpl", gin.H{"vote": ret})
}
加載模板文件,傳入的.表示ret,即整個查到的vote數據
效果展示:
數據庫
一個簡單的投票表名展示就做好了,
按照這個思路,我們可以設置點擊表名,查看每個表的具體數據