gin投票系统3

对应视频v1版本

1.优化登陆接口

image-20231121202753325

将同步改为异步

原login前端代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>香香编程-投票项目</title>
</head>
<body>
<main class="main">
    <form method="post" action="/login">
        <input type="text" name="name" placeholder="Your name">
        <input type="password" name="password" placeholder="Password">
        <button type="submit">Sign in</button>
    </form>
</main>
</body>
</html>

现代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>香香编程-投票项目</title>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<main class="main">
    <input type="text" name="name" id="name" placeholder="Your name">
    <input type="password" name="password" id="password" placeholder="Password">
    <button type="submit" id="login_sub">Sign in</button>
</main>
<script>
    $(document).ready(function(){//确保在页面完全加载后才执行内部的代码。
        $("#login_sub").on("click",function () {//事件监听器,它绑定了一个点击事件到sign in按钮
            $.ajax({//ajax函数内部,用于异步发送请求参数
                //请求资源路径
                url:"/login",
                //请求参数
                data:{
                    name:$("#name").val(),
                    password:$("#password").val()
                },
                //请求方式
                type:"post",
                //数据形式
                dataType:"json",
                //请求成功后调用的回调函数
                success:function (data) {
                    console.log(data)

                    if (data.code !== 0){
                        alert(data.message)
                    }else{
                        alert("已登录")
                       setTimeout("pageRedirect()", 3000);
                        //三秒后调转
                    }
                },
                //请求失败后调用的回调函数
                error:function () {
                    alert("请求失败!")
                }
            });
        });
    });
    //实现跳转的函数
    function pageRedirect() {
        window.location.replace("/index");
    }
</script>
</body>
</html>

用Session代替Cookie*

这两个知识点非常重要!!!在工作中肯定会被问到

2.统一返回结构

httpcode
  1. 1xx(Informational):信息性状态码
    • 代表意义: 表示请求已经被接收,继续处理。
    • 常见代码:
      • 100 Continue:服务器已经收到请求的首部,并且客户端应该继续发送请求的其余部分。
  2. 2xx(Successful):成功状态码
    • 代表意义: 表示请求已成功被服务器接收、理解、并接受。
    • 常见代码:
      • 200 OK:请求成功。
      • 201 Created:请求已经被实现,新的资源已经被创建。
      • 204 No Content:服务器成功处理了请求,但没有返回任何内容。
  3. 3xx(Redirection):重定向状态码
    • 代表意义: 需要客户端进行附加操作以完成请求。
    • 常见代码:
      • 301 Moved Permanently:永久性重定向。
      • 302 Found:临时性重定向。
      • 304 Not Modified:资源未被修改,可以使用缓存的版本。
  4. 4xx(Client Error):客户端错误状态码
    • 代表意义: 客户端看起来可能发生了错误,妨碍了服务器的处理。
    • 常见代码:
      • 400 Bad Request:请求无效,服务器无法理解请求的语法。
      • 401 Unauthorized:请求要求身份验证。
      • 403 Forbidden:服务器拒绝请求。
  5. 5xx(Server Error):服务器错误状态码
    • 代表意义: 服务器在处理请求的过程中发生了错误。
    • 常见代码:
      • 500 Internal Server Error:服务器内部错误。
      • 502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效响应。
      • 503 Service Unavailable:服务器暂时过载或维护,无法处理请求。

客户端 网络 服务器 找资源

服务器 网络 客户端

自己定义的业务code

image-20231122174058788

注意:使用不同状态码,浏览器也会有不同相应,有些错误码不能乱用

注意:image-20231123154330090

Code和上边的状态码不是一个东西,不要弄混了,下边的是自定义码,针对HTTP状态码和自定义的错误码通常起不同的作用:

  1. HTTP状态码:
    • 表示请求状态: HTTP状态码用于表示服务器对请求的处理结果。常见的状态码有 200 OK 表示成功,404 Not Found 表示资源未找到,500 Internal Server Error 表示服务器内部错误等。
    • 影响浏览器行为: 不同的HTTP状态码会触发浏览器和客户端的不同行为。例如,浏览器可能展示不同的错误页面或者执行不同的重定向。
  2. 自定义错误码:
    • 提供更多信息: 自定义错误码通常用于在请求成功时传递一些额外的信息,比如错误消息、错误代码等。这样,即使HTTP状态码为200,开发者仍然可以通过解析JSON数据获取更多关于请求状态的信息。
    • 统一错误格式: 使用自定义错误码可以帮助建立统一的错误格式,便于前后端协作。例如,可以在所有的错误响应中都包含一个 codemessage 字段,使得前端可以更容易地处理错误情况。
    • 区分不同错误类型: 自定义错误码可以帮助区分不同类型的错误。通过查看错误码,开发者可以快速了解问题的性质,从而采取适当的措施。

3.优化投票接口

使用事务优化接口
func DoVote(userId, voteId int64, optIds []int64) bool { //太复杂,//gorm中最常用的事务处理方法
    tx := Conn.Begin() //创建一个数据库事务,Begin() 方法开始一个新的事务并返回对应的 *gorm.DB 对象 tx。

    var ret Vote
    err := tx.Table("vote").Where("id=?", voteId).First(&ret).Error
    //在事务中执行一个查询操作,根据给定的 voteId 查询 vote 表中的数据,并将结果存储在 ret 变量中。
    if err != nil { //出现错误,打印出来并回滚;
       fmt.Printf("err:%s", err.Error())
       tx.Rollback()
    }
    for _, value := range optIds { // 遍历选项ID列表
       err := tx.Table("vote_opt").Where("id=?", value).Update("count", gorm.Expr("count+?", 1)).Error
       if err != nil {
          //更新数据库中的选项计数
          fmt.Printf("err:%s", err.Error())
          tx.Rollback()
       }
       user := VoteOptUser{ //创建一个新的VoteOptUser结构体实例对应数据库的vote_opt_user表
          VoteId:     voteId,
          UserId:     userId,
          VoteOptId:  value,
          CreateTime: time.Now(),
          UpdateTime: time.Now(),
       }
       err = tx.Create(&user).Error
       if err != nil {
          fmt.Printf("err:%s", err.Error())
          tx.Rollback()
       }
       //使用Create方法将新的VoteOptUser记录创建到数据库中
    }
    tx.Commit()
    return true
}
了解gorm事务的其他用法

4.把接口都换成异步

为什么要全部做成ajax形式?

  1. 为后端的前后端分离做准备,正产公司里,前后端一定是分离的!

  2. 为后续编写接口文档做准备。

    设计——>-开发------>前后端联调

5.增加功能

新增投票接口
修改投票接口
删除投票接口

这些操作统称为CURD,很多程序员,在公司中做的都是CURD。

在写这些操作时候要想到

  1. 这个业务,能不能挣钱,怎么挣钱,是否提高了工作效率。
  2. 当前的业务是否能进一步优化和提高效率(1减少后期维护的人工,2减少后期操作时间)
  3. 业务中有没有典型的问题,或者复杂场景,要学会写笔记,多记录典型问题,并反问自己是否真正掌握,若没有掌握,是因为之前完全不了解这种业务逻辑(这是需要前两个打好基础见得多),还是知道有这个场景但并没有较好的解决办法(技术不够向同事和老板或其他人请教)。

如果自己已经完全精通了这个领域的业务,那么就可以跳槽或者升职加薪换岗。

技术是一方面,业务经验也是一方面。在公司时就要考虑你做的业务对公司的重要性,如果可有可无甚至对产品来说是负优化,呢就不能在一棵树上吊死,提早考虑跑路,没准哪天就被炒鱿鱼了

6.投票结束,看到投票结果

设计一个新的返回结构

返回图表

使用Echarts画图

ECharts(Enterprise Charts)是百度开发的一套基于 JavaScript 的开源可视化图表库。它提供了丰富的图表类型和交互能力,可以用于创建各种数据可视化图表,如折线图、柱状图、饼图、散点图等。ECharts的设计目标是简单易用、灵活可扩展,使得开发者能够轻松地在网页上展示数据。

一些主要的特点和功能包括:

  1. 丰富的图表类型: ECharts支持多种图表类型,包括但不限于折线图、柱状图、饼图、散点图、雷达图、地图等,满足不同数据展示的需求。
  2. 交互性: ECharts提供了丰富的交互功能,例如数据区域缩放、数据视图、动画效果、多图联动等,用户可以通过交互更好地理解数据。
  3. 可定制性: 用户可以通过配置选项和自定义主题,灵活地定制图表的外观和行为,以适应不同的设计需求。
  4. 跨平台兼容: ECharts支持主流的浏览器,并提供了移动端的适配,可以在不同平台上展示相同的图表效果。
  5. 大数据量展示: ECharts对大数据量的展示也有良好的支持,通过数据的动态加载和异步更新,可以有效地处理大规模数据。
  6. 开源免费: ECharts是一个开源项目,采用 MIT 许可证,允许用户在满足许可证条件的情况下自由使用和修改。

ECharts的使用非常广泛,特别是在Web开发领域。通过在网页中嵌入 ECharts 图表,开发者可以直观地展示和分析数据,为用户提供更好的数据可视化体验。

示例:

为投票增加总数字段
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>香香编程-投票项目</title>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<main class="main">
    <input type="text" name="name" id="name" placeholder="Your name">
    <input type="password" name="password" id="password" placeholder="Password">
    <button type="submit" id="login_sub">Sign in</button>
</main>
<script>
    $(document).ready(function(){//确保在页面完全加载后才执行内部的代码。
        $("#login_sub").on("click",function () {//事件监听器,它绑定了一个点击事件到sign in按钮
            $.ajax({//ajax函数内部,用于异步发送请求参数
                //请求资源路径
                url:"/login",
                //请求参数
                data:{
                    name:$("#name").val(),
                    password:$("#password").val()
                },
                //请求方式
                type:"post",
                //数据形式
                dataType:"json",
                //请求成功后调用的回调函数
                success:function (data) {
                    console.log(data)

                    if (data.code !== 0){
                        alert(data.message)
                    }else{
                        alert("已登录")
                       // setTimeout("pageRedirect()", 3000);
                        //三秒后调转
                    }
                },
                //请求失败后调用的回调函数
                error:function () {
                    alert("请求失败!")
                }
            });
        });
    });
    //实现跳转的函数
    function pageRedirect() {
        window.location.replace("/index");
    }
</script>
</body>
</html>

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

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

相关文章

[GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练

前言 OpenAI的创始人之一,大神Andrej Karpthy刚在微软Build 2023开发者大会上做了专题演讲:State of GPT(GPT的现状)。 他详细介绍了如何从GPT基础模型一直训练出ChatGPT这样的助手模型(assistant model)。作者不曾在其他公开视频里看过类似的内容,这或许是OpenAI官方…

在javaweb项目中resource目录和webapp目录的区别

resource存放的是一些配置文件&#xff0c;这些文件一般都是与java代码相关的配置文件&#xff0c;比如这里的jdbc配置文件,在java中可以使用这个目录下的文件&#xff0c;不用写全路径 webapp存放的是web的资源文件&#xff0c;如jsp,html,css&#xff0c;js文件,在网页请求会…

〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

基于Java Swing泡泡龙游戏(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

javaSwing酒店管理

一、介绍 在这篇博客中&#xff0c;我们将介绍一个基于MySQL数据库、Java编程语言和Swing图形用户界面的简单酒店管理系统。该系统包括了查询房客信息、查询房客状态、修改房客信息、添加房间信息、添加住户、退房管理、预定管理、退订管理、入账管理、出账管理、修改资料等多…

微信小程序制作-背单词的小程序制作

微信小程序–背单词的 好久没有发过文章了&#xff0c;但是不代表着我不去学习了喽&#xff0c;以下是我最近做的东西&#xff0c;前端的UI由朋友设计的&#xff0c;目前这个是前端使用的是微信小程序后端是Python的一个轻量型框架&#xff0c;FastApi&#xff0c;嗯&#xff…

fv悬浮球自定义任务正在编辑的文件操作失误丢失找回方法_fv悬浮球自定义任务推荐

场景&#xff1a;自定义任务时不小心点击了取消按钮或者删除按钮导致重要丢失 原因&#xff1a;因为fv悬浮球自定义任务没有撤回按钮 解决方案&#xff1a;使用系统的应用设置把悬浮球强制停止运行&#xff0c;默认&#xff08;开启全部权限&#xff09;然后它会自动重启&…

IBM Qiskit量子机器学习速成(六)

量子卷积神经网络 卷积和池化&#xff1a;卷积神经网络的必备成分 卷积神经网络被广泛应用于图像和音频的识别当中&#xff0c;关键在于“卷积”操作赋予神经网络统筹学习数据的能力。 执行卷积操作需要输入数据与卷积核&#xff0c;卷积核首先与输入数据左上角对齐&#xf…

【Scala】Scala中的一些基本数据类型的特性 列表、元组、构造器、单例对象、伴生类、伴生对象、抽象类与特质

列表 使用List(“”,“”,“”)去声明 sliding 和 groued表示迭代器 val iter List("Hadoop", "Spark", "Scala") sliding 2// sliding 和 groued 是有区别的while (iter.hasNext){println(iter.next())}for (elem <- iter){println(elem)}…

高项备考葵花宝典-项目进度管理核心概念加强记忆

项目进度管理的核心目标是使项目按时完成。 目录 一、待办事项列表 二、看板方法 三、在制品 四、进度计划模型 五、活动清单 六、里程碑清单 七、前导图法 八、资源日历 九、活动历时估算方法 一、待办事项列表 如上图所示&#xff0c;实际工作中需求往往不是一次性全…

【SpringBoot教程】SpringBoot 创建定时任务(配合数据库动态执行)

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

Leetcode1466. 重新规划路线

Every day a Leetcode 题目来源&#xff1a;1466. 重新规划路线 解法1&#xff1a;深度优先搜索 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。 因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗…

计算机毕业设计 SpringBoot的乐乐农产品销售系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

OSPF路由协议

随着Internet技术在全球范围的飞速发展&#xff0c;OSPF已成为目前应用最广泛的路由协议之一。OSPF&#xff08;Open Shortest Path First&#xff09;路由协议是由IETF&#xff08;Internet Engineering Task Force&#xff09;IGP工作组提出的&#xff0c;是一种基于SPF算法的…

通过生成模拟释放无限数据以实现机器人自动化学习

该工作推出RoboGen&#xff0c;这是一种生成机器人代理&#xff0c;可以通过生成模拟自动大规模学习各种机器人技能。 RoboGen 利用基础模型和生成模型的最新进展。该工作不直接使用或调整这些模型来产生策略或低级动作&#xff0c;而是提倡一种生成方案&#xff0c;该方案使用…

利用Microsoft Visual Studio Installer Projects打包安装包

利用Microsoft Visual Studio Installer Projects打包安装包 具体步骤步骤1&#xff1a;安装扩展步骤2&#xff1a;创建 Setup 项目步骤3&#xff1a;设置属性步骤4&#xff1a;添加输出步骤5&#xff1a;添加文件步骤6&#xff1a;添加桌面快捷方式步骤7&#xff1a;添加菜单快…

初识人工智能,一文读懂人工智能概论(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

C语言——从键盘输入两个字串,判断它们是否相同。

代码实现&#xff1a; #include <stdio.h> #include <string.h>int main() {char str1[100], str2[100];printf("请输入第一个字串&#xff1a;");scanf("%s", str1);printf("请输入第二个字串&#xff1a;");scanf("%s"…

uc_16_UDP协议_HTTP协议

1 UDP协议 适合游戏、视频等情景&#xff0c;安全性要求不高&#xff0c;效率要求高。 1&#xff09;UDP不提供客户机与服务器的链接&#xff1a; UDP的客户机与服务器不必存在长期关系。一个UDP的客户机在通过一个套接字向一个UDP服务器发送了一个数据报之后&#xff0c;马上…

C语言----文件操作(一)

一&#xff1a;C语言中文件的概念 对于文件想必大家都很熟悉&#xff0c;无论在windows上还是Linux中&#xff0c;我们用文件去存储资料&#xff0c;记录笔记&#xff0c;常见的如txt文件&#xff0c;word文档&#xff0c;log文件等。那么&#xff0c;在C语言中文件是什么样的存…