本文介绍: 先分析需求,在sql中建立数据库,成功后目前有四个表:建立数据库,可以使用网上的sql转gorm网站,把建表语句直接转换成结构体,放在model下的model.go文件下,作为全部数据库存放处建立完成,可以先测试是否成功。
投票系统
数据库的建立
先分析需求,在sql中建立数据库,关于项目数据库如何建立可以在“goweb项目创建流程分析中看如何去建表”
成功后目前有四个表:
vote,user,vote_opt,vote_opt_user
建立数据库,可以使用网上的sql转gorm网站,把建表语句直接转换成结构体,
放在model下的model.go文件下,作为全部数据库存放处
package model
import "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 model
import "fmt"
func GetVotes() []Vote { //该方法会输出Vote切片类型的值
//封装查询方法,查询投票项目的详情
ret := make([]Vote, 0) //定义ret为切片类型,0表示长度为0,内部存放具体值为vote类型
err := Conn.Table("vote").Find(&ret).Error
if err != nil {
fmt.Printf("err:%s", err.Error())
}
return ret
}
(后边没截完)
因为ret是切片类型,所以能同时查多条记录,测试完成,可以写逻辑层和router层代码啦!!!
将所有表名展示到网页上
写模板文件
<!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数据
效果展示:
原文地址:https://blog.csdn.net/qq_63728673/article/details/134597009
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_13281.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。