Gin投票系统(2)

投票系统

数据库的建立

先分析需求,在sql中建立数据库,关于项目数据库如何建立可以在“goweb项目创建流程分析中看如何去建表”

成功后目前有四个表:

vote,user,vote_opt,vote_opt_user

image-20231120163637699

建立数据库,可以使用网上的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"
}

建立完成,可以先测试是否成功

image-20231120164752983

测试:

在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
}

当在vote中加入数据:

image-20231120165210734

再在test方法中测试:输出

image-20231120165335067

(后边没截完)

因为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数据

效果展示:

数据库

image-20231120174403074

一个简单的投票表名展示就做好了,

按照这个思路,我们可以设置点击表名,查看每个表的具体数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/199509.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web学习笔记

Web学习笔记 flask库前端基础超链接&#xff1a;空连接&#xff1a;图片&#xff1a;视频&#xff08;音频&#xff09;&#xff1a;嵌套使用列表表格格式化表格input表单系列 网络请求GET方式POST请求通过GET方式获取输入参数通过POST方式获取输入参数注册页面 CSS三种使用方式…

超卓航科聚国内外专家学者,共推冷喷涂技术的发展与应用

11月24日——26日&#xff0c;冷喷涂技术及其在增材制造中的应用专题会在襄阳召开&#xff0c;来自国内外200多名科技工作者齐聚一堂&#xff0c;共同交流冷喷涂技术的研究与应用。 本次专题研讨会由中国机械工程学会表面工程分会主办&#xff0c;湖北超卓航空科技股份有限公司…

C语言第三十六弹--实现转移表的多种方法

使用C语言通过多种方法实现转移表 方法一、普通法 思路&#xff1a;如图实现多种操作&#xff0c;首先创建菜单&#xff0c;需要运行一次再判断条件&#xff0c;所以通过do{}while(); 循环来实现多次。有多种选择&#xff0c;使用switch case选择语句&#xff0c;再在对应case…

Spark---SparkCore(五)

五、Spark Shuffle文件寻址 1、Shuffle文件寻址 1&#xff09;、MapOutputTracker MapOutputTracker是Spark架构中的一个模块&#xff0c;是一个主从架构。管理磁盘小文件的地址。 MapOutputTrackerMaster是主对象&#xff0c;存在于Driver中。MapOutputTrackerWorker是从对…

Leetcode—2336.无限集中的最小数字【中等】

2023每日刷题&#xff08;四十四&#xff09; Leetcode—2336.无限集中的最小数字 实现代码 class SmallestInfiniteSet {set<int> s; public:SmallestInfiniteSet() {for(int i 1; i < 1000; i) {s.insert(i);}}int popSmallest() {int res *s.begin();s.erase(s…

【区块链】产品经理的NFT初探

常见的FT如比特币&#xff08;BTC&#xff09;&#xff0c;以太币&#xff08;ETH&#xff09;等&#xff0c;两个代币之间是完全可替换的。而NFT具有唯一性&#xff0c;不可以互相替换。本文作者对NET的发展现状、相关协议、应用场景等方面进行了分析&#xff0c;一起来看一下…

深度解读:为什么要做数据合规?如何做到数据合规?

数据资源“入表”在即&#xff0c;企业更需筑牢数据合规防线。但企业主企业购买数据、获取数据到底是否合法合规&#xff0c;入表如何防范合规风险&#xff1f;上周三&#xff0c;亿信华辰邀请到北京鑫诺律师事务所高级合伙人、管委会副主任武婕将和大家分享《数据入表法律合规…

ReactDomServer 将react组件转化成html静态标签(SSR服务器渲染)

前言&#xff1a; 因为使用图表里面的formatter函数需要原生的html标签&#xff0c;但是本身技术栈是react&#xff0c;所以为了方便&#xff0c;便使用了ReactDomServer api将react组件转化成html原生标签引入&#xff1a; import ReactDomServer from react-dom/server; 使…

Debian10安装VMware Tools

一、原系统 首先我在界面按CTRLALTT和CTRLSiftT都没有反应&#xff0c;没关系&#xff0c;我有办法 系统版本 管理员用户 步骤一&#xff1a;打开VMware Tools文件 步骤二、将文件复制到自己熟悉的文件内 步骤三、命令行查看文件是否复制成功存在 步骤四、解压VMware-tools…

MIT线性代数笔记-第17讲-正交矩阵,Schmidt正交化

目录 17.正交矩阵&#xff0c; S c h m i d t Schmidt Schmidt正交化打赏 17.正交矩阵&#xff0c; S c h m i d t Schmidt Schmidt正交化 “标准”经常表示单位长度 标准正交基&#xff1a;由两两正交的单位向量组成的基 将标准正交基中的元素记作 q ⃗ 1 , q ⃗ 2 , ⋯ , q …

Redis学习文档

目录 一、概念1、特征2、关系型数据库和非关系型数据库的区别3、键的结构4、Redis的Java客户端5、缓存更新策略5.1、概念5.2、代码 6、缓存穿透6.1、含义6.2、解决办法6.3、缓存空值代码举例6.4、布隆过滤器代码举例 7、缓存击穿7.1、概念7.2、解决办法7.3、互斥锁代码举例7.4、…

DBT踩坑第二弹

总结下dbt-spark踩到的坑&#xff0c;连接方式采用的是thrift连接 Kerberos认证。考虑到开源组件Kyuubi也是基于Hiveserver2&#xff0c;使用的thrift协议&#xff0c;所以采用Kyuubi执行SparkSQL。 官方文档给出的Thrift方式连接示例真的是简单&#xff0c;但是真是用起来真是…

vue3 + element-plus + ts el-table封装

vue3 element-plus ts el-table封装 博客参考https://blog.csdn.net/weixin_45291937/article/details/125523244 1. 文件位置&#xff08;根据自己的需求&#xff09; 2. 在 custom 文件夹下面 创建 mytable 文件夹 3. 直接上代码 // index.vue<template><div …

西工大网络空间安全学院计算机系统基础实验一(123)

在实验零中&#xff0c;我们拿到了lab1-handout.zip压缩文件&#xff0c;接着&#xff0c;我们使用unzip ./lab1-handout.zip命令&#xff0c;解压缩该压缩文件。解压缩成功后&#xff0c;使用"ls"命令查看当前工作目录下的文件和文件夹&#xff0c;发现得到了"…

Day41 使用listwidget制作简易图片播放器

1.简介 使用QlistWidget实现简易图片播放器&#xff0c;可以打开一个图片序列&#xff0c;通过item的单击事件实现图片的切换&#xff0c;通过设置list的各种属性实现图片预览的显示&#xff0c;美化滚动条即可实现一个简易图片播放器。 2.效果 3.实现步骤&#xff1a; 1.初始…

如何使用 Python(NumPy 和 OpenCV)对图像进行 Funkify

如何使用 Python&#xff08;NumPy 和 OpenCV&#xff09;对图像进行 Funkify 作者|Luke Tambakis 编译|Flin 来源|medium 在这篇博客中&#xff0c;我将解释如何制作一个 Python 脚本来使用 Python 代码“funkify”图像。该程序速度足够快&#xff0c;甚至可以处理实时视频&am…

【Java Spring】Spring MVC基础

文章目录 1、Spring MVC 简介2、Spring MVC 功能1.1 Spring MVC 连接功能2.2 Spring MVC 获取参数2.2.1 获取变量2.2.2 获取对象2.2.3 RequestParam重命名后端参数2.2.4 RequestBody 接收Json对象2.2.5 PathVariable从URL中获取参数 1、Spring MVC 简介 Spring Web MVC是构建于…

低压三相无刷直流驱动芯片GC5958,无感,正弦,低压,PWM调速可替代APX9358/茂达

GC5958提供了无传感器的三相无刷直流电机的速度控制的所有电路。正弦波驱动器的方法将是更好的低噪声。控制器功能包括启动电路、反电动势换向控制、脉宽调制 (PWM) 速度控制锁定保护和热关断电路GC5958适用于需要静音驱动程序的游戏机和CPU散热器。它以DFN3x3-10封装形式展现。…

深入理解虚拟 DOM:提升前端性能的关键技术

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Maven 介绍

文章目录 什么是 maven为什么要选择mavenmaven 仓库什么是maven中央仓库什么是maven本地仓库 idea如何创建出maven项目如何引入第三方库依赖配置国内源 下载 Maven Helper 插件查看各个项目之间的依赖关系 什么是 maven Maven是 Apache 下的一个纯 Java 开发的开源项目&#x…