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 Voteerr := 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)).Errorif 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).Errorif 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>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214539.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開關量防抖濾波器(梯形圖和SCL源代碼)

模擬量防抖超限報警功能塊請查看下面文章鏈接: https://rxxw-control.blog.csdn.net/article/details/133969425https://rxxw-control.blog.csdn.net/article/details/133969425 1、開關量防抖濾波器 2、防抖濾波 3、梯形圖代碼

useMemo和useCallback

useMemo和useCallback是React中的兩個優化性能的鉤子&#xff08;Hooks&#xff09;。它們都可以用來緩存計算結果&#xff0c;避免在每次渲染時都重新執行耗時的操作。然而&#xff0c;它們的主要區別在于緩存的內容和使用場景。 useMemo useMemo用于緩存那些計算成本較高的值…

2.Feign使用、上下文隔離及源碼閱讀

目錄 概述使用配置pom.xmlfeign 接口編寫controller 測試降級處理pom.xmlapplication.yml代碼 Feign如何初始化及調用源碼閱讀初始化調用 feign的上下文隔離機制源碼 結束 概述 閱讀此文&#xff0c;可以知曉 feign 使用、上下文隔離及源碼閱讀。源碼涉及兩方面&#xff1a;fe…

課后作業7.3.1:構造一個自己的小操作系統

構造一個自己的 mini 操作系統 任務描述 請實現如下功能&#xff1a; 1.寫一個命令解釋器程序 mysh.c &#xff0c;其功能是接收用戶輸入的命令并給出反饋。要求該程序既支持內部命令 cd、sync、exit &#xff1b;也支持外部命令&#xff0c;即可以接收 cat、ls 等命令&#x…

數據結構與算法-Rust 版讀書筆記-2線性數據結構-雙端隊列

數據結構與算法-Rust 版讀書筆記-2線性數據結構-雙端隊列 1、雙端隊列 deque又稱為雙端隊列&#xff0c;雙端隊列是與隊列類似的項的有序集合。deque有兩個端部&#xff1a;首端和尾端。deque不同于隊列的地方就在于項的添加和刪除是不受限制的&#xff0c;既可以從首尾兩端添…

vue3封裝接口

在src下面創建一個文件夾任意名稱 我拿這個名字舉例子了apiService 相當于創建一個新的文件 // 封裝接口 // apiService.js import axios from axios;// 接口前綴 const API_BASE_URL 前綴;接口后綴export const registerUser async (fileData) > {try {const response …

數據分析 | 頻率編碼和標簽編碼 | Python代碼

數據集見GitHub鏈接&#xff1a;https://github.com/ChuanTaoLai/Frequency-Encoding-And-Label-Encoding 標簽編碼&#xff1a; import pandas as pd from sklearn.preprocessing import LabelEncoderdata1 pd.read_excel(rD:\0文獻整理\網絡入侵檢測\KDD99\KDDTrain.xlsx) …

透析跳躍游戲

關卡名 理解與貪心有關的高頻問題 我會了?? 內容 1.理解跳躍游戲問題如何判斷是否能到達終點 ?? 2.如果能到終點&#xff0c;如何確定最少跳躍次數 ?? 1. 跳躍游戲 leetCode 55 給定一個非負整數數組&#xff0c;你最初位于數組的第一個位置。數組中的每個元素代表…

微信商家收款碼扣多少手續費

很多人想申請低手續費率的收款碼不知從何下手&#xff0c;在參考了大量博客教學之后&#xff0c;終于搞懂了詳細流程以及注意事項。在此記錄一下。我申請的是一個只需要0.2%費率的微信收款碼&#xff0c;申請時間是2022年2月12日。申請之前只需要準備營業執照和法人身份z&#…

JSON在線解析

JSON在線解析及格式化驗證 - JSON.cn JSON在線視圖查看器(Online JSON Viewer)

java中list的addAll用法詳細實例?

List 的 addAll() 方法用于將一個集合中的所有元素添加到另一個 List 中。下面是一個詳細的實例&#xff0c;展示了 addAll() 方法的使用&#xff1a; java Copy code import java.util.ArrayList; import java.util.List; public class AddAllExample { public static v…

設計模式: 關于編程范式的聲明式和命令式編程及應用框架的開發和設計原則

編程范式 命令式編程聲明式編程 上述兩種范式是相對來說的 命令式編程 詳細描述做事過程的方式就可以叫做 命令式例子: 張三媽媽讓張三買食鹽 拿錢&#xff0c;開門&#xff0c;下樓&#xff0c;到商店&#xff0c;付款&#xff0c;帶著食鹽回家 例子&#xff1a;在指定div…

驗證二叉搜索樹[中等]

優質博文&#xff1a;IT-BLOG-CN 一、題目 給你一個二叉樹的根節點root&#xff0c;判斷其是否是一個有效的二叉搜索樹。有效 二叉搜索樹定義如下&#xff1a; 【1】節點的左子樹只包含 小于 當前節點的數。 【2】節點的右子樹只包含 大于 當前節點的數。 【3】所有左子樹和右…

Leetcode 40 組合總和 II

題意理解&#xff1a; 每個數字在每個組合中只能使用 一次 數字可以重復——>難點&#xff08;如何去重&#xff09; 每個組合和target 求組合&#xff0c;對合限制&#xff0c;考慮回溯的方法。——將其抽象為樹結構。 樹的寬度——分支大小 樹的深度——最…

Spring IoC和DI

目錄 一. Spring是什么 IoC DI 二. IoC&DI的使用 IoC 1.Controller&#xff08;控制器存儲&#xff09; 2.Service&#xff08;服務存儲&#xff09; 3.Repository&#xff08;倉庫存儲&#xff09; 4.Componemt&#xff08;組件存儲&#xff09; 5.Configuratio…

解決Could not establish connection to : XHR failed

解決Could not establish connection to : XHR failed 問題描述 用vscode用遠程連接服務器時總報上面的錯誤&#xff0c;用xshell和Xftp和vscode終端都可以連上&#xff0c;但是用vscode的ssh連接缺總報錯&#xff0c;導致無法連接服務器進行代碼調試 一、原因 原因可能是在…

【MATLAB】 數據、矩陣、行、列翻轉

1.MATLAB函數fliplr 用法&#xff1a;fliplr(X) 功能&#xff1a;matlab中的fliplr函數實現矩陣的左右翻轉。 fliplr(X)使矩陣X沿垂直軸左右翻轉。 相關函數&#xff1a;flipud函數可以實現矩陣的上下翻轉。 備注&#xff1a;matlab中提供了許多對矩陣操作的函數&#xff0c;可…

Go json 差異比較 json-diff(RFC6902)

Go json 差異比較 json-diff(RFC 6902) 畢業設計中過程中為了比較矢量圖的差異而依據 RFC 6902 編寫的一個包&#xff0c;現已開源&#xff1a; Json-diff 使用 go get -u github.com/520MianXiangDuiXiang520/json-diff序列化與反序列化 與官方 json 包的序列化和反序列化不…

后端開發面試題

這是一波今年7月份的大廠面試題&#xff0c;分享下&#xff5e;&#xff5e; Mybatis三級緩存 Mybatis懶加載 分布式事務 transaction gradle和maven區別 抽象類、多態 Springboot啟動 ConcurrentHashMap 樂觀鎖、悲觀鎖 docker k8s常用命令 電商業務從什么維度分庫分…

AcWing 95. 費解的開關(遞推)

題目鏈接 活動 - AcWing 本活動組織刷《算法競賽進階指南》&#xff0c;系統學習各種編程算法。主要面向有一定編程基礎的同學。https://www.acwing.com/problem/content/97/ 題解 只要第一行開關的狀態確定&#xff0c;則所有開關的狀態都可以被推出來。第一行開關總共有種操…