Gin投票系统(2)
投票系统
数据库的建立
先分析需求,在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数据
效果展示:
数据库


一个简单的投票表名展示就做好了,
按照这个思路,我们可以设置点击表名,查看每个表的具体数据
相关文章:
Gin投票系统(2)
投票系统 数据库的建立 先分析需求,在sql中建立数据库,关于项目数据库如何建立可以在“goweb项目创建流程分析中看如何去建表” 成功后目前有四个表: vote,user,vote_opt,vote_opt_user 建立数据库,可以…...
docker (简介、dcoker详细安装步骤、容器常用命令)一站打包- day01
一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应…...
请简要说明 Mysql 中 MyISAM 和 InnoDB 引擎的区别
“请简要说明 Mysql 中 MyISAM 和 InnoDB 引擎的区别”。 屏幕前有多少同学在面试过程与遇到过类似问题, 可以在评论区留言:遇到过。 考察目的 对于 xxxx 技术的区别,在面试中是很常见的一个问题 一般情况下,面试官会通过这类…...
Nginx漏洞复现与分析
Nginx如何处理PHP请求 Nginx本身不支持直接解析和执行PHP代码,但可以通过与PHP解释器的集成来处理PHP请求。一种常见的方法是使用PHP-FPM(FastCGI Process Manager)作为PHP解释器。 原理图: Step 1 Step 2 +---------------------+ …...
Go 中切片(Slice)的长度与容量
切片长度与容量在 Go 中很常见。切片长度是切片中可用元素的数量,而切片容量是从切片中第一个元素开始计算的底层数组中的元素数量。 Go 中的开发者经常混淆切片长度和容量,或者对它们不够了解。理解这两个概念对于高效处理切片的核心操作,比…...
顶级大厂Quora如何优化数据库性能?
Quora 的流量涉及大量阅读而非写入,一直致力于优化读和数据量而非写。 0 数据库负载的主要部分 读取数据量写入 1 优化读取 1.1 不同类型的读需要不同优化 ① 复杂查询,如连接、聚合等 在查询计数已成为问题的情况下,它们在另一个表中构…...
Java第二十章多线程
一、线程简介 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程可以并发执行。线程拥有自己的栈和局部变量,但是它们共享进程的其他资源,如…...
家庭教育,培养娃什么最重要?
家庭教育,培养娃什么最重要? 培养能力最重要 (我这么认为的) 时代巨变,技术变革的非常快,所以总的来说 年轻一代接触的新东西慢慢比老一代的要多,年轻一代的工作会比老一代的多而且多很多&…...
Linux 进程(一)
1 操作系统 概念:任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括 内核(进程管理,内存管理,文件管理,驱动管理) 其他程序(例…...
vue中的keep-alive详解与应用场景
🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-keep-alive 目录 一、Keep-alive 是什么 二、使用场景 三、原理分析 四、案例实现 activa…...
软件设计师——程序设计语言基础(一)
📑前言 本文主要是【程序设计语言基础】——程序设计语言基础的相关题目,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#…...
Apache简介与安装
先导概念: 静态网站: 最早的建站方式,每个页面都是一个独立的文件,需要手动上传或编辑。网页内容固定不变。例如,个人博客、静态企业官网等。 动态网站: 网站内容可根据不同情况动态变更,一般通过数据库进行架构。包含服务器端脚本,可以实现更丰富的功能。例如,社…...
set与map
set与map 一、序列式容器与关联式容器二、pair1、键值对2、作用3、构造函数4、make_pair(1)构造函数(2)作用 5、代码6、运行结果 三、set1、概念2、代码3、运行结果4、说明 四、multiset1、与set的关系2、代码3、运行结果 五、map…...
基于单片机智能液位水位监测控制系统
**单片机设计介绍, 基于单片机智能液位水位监测控制系统 文章目录 一 概要特点应用场景工作原理实现方式 系统功能实时监测控制调节报警功能数据记录与分析 总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 ## 系统介绍 基于单片机…...
C#,《小白学程序》第十七课:随机数(Random)第四,移动平均值(Moving Average)的计算方法与代码
1 文本格式 /// <summary> /// 《小白学程序》第十七课:随机数(Random)第四,移动平均值的计算方法与代码 /// 继续学习数据统计,移动平均值的计算方法 /// 移动平均值就是一定步长内数值的平均值,用…...
行情分析——加密货币市场大盘走势(11.29)
大饼已经形成了底背离,即MACD往下走,而价格还在往上走,这种后续往往会大跌。继续把空单拿好,已经持仓的无需加仓。多次上涨却一直不能突破,说明多空和空军力量都很强,等待后续出方向。在笔者看来࿰…...
C++——string的字符串比较,字符存取,插入和删除和子串
一. string字符串比较 功能描述:字符串之间的比较 比较方式:字符串比较是按字符的ASCII码进行对比 返回 0 > 返回 1 < 返回 -1 函数原型: *int compare(const string &s) const; //与字符串s比较 *int compare(const char *s) const; //…...
字节10年经验之谈 —— 从0到1开发自动化测试框架!
一、序言 随着项目版本的快速迭代、APP测试有以下几个特点: 首先,功能点多且细,测试工作量大,容易遗漏;其次,代码模块常改动,回归测试很频繁,测试重复低效;最后&#x…...
Mysql(基本介绍+下载安装+服务器+基本使用+建库建表+navicat/mybitas工具+外键及实例)
一、Mysql基本介绍 当谈论MySQL时,通常指的是一个流行的开源关系型数据库管理系统(RDBMS)。MySQL是由瑞典的开发者在1995年创建的,后来被Sun Microsystems收购,最终成为Oracle Corporation的一部分。以下是关于MySQL的…...
Python+requests+Jenkins接口自动化测试实例
在做功能测试的基础上,我平时也会用postman测试接口,不过postman只能测试一个一个接口,不能连贯起来,特别是我们公司的接口很多都是要用到token的,导致我每次测个需要登录的接口都要去获取到token,做了很多…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
