【go項目01_學習記錄11】

操作數據庫

  • 1 文章列表
  • 2 刪除文章

1 文章列表

(1)先保證文章已經有多篇,可以直接在數據庫中添加,或者訪問鏈接: localhost:3000/articles/create,增加幾篇文章。
在這里插入圖片描述
(2)之前設置好了articles.index 路由,訪問 localhost:3000/articles 顯示文章列表
在這里插入圖片描述
(3)完善articlesIndexHandler()使之能夠顯示數據庫中的數據

.
.
.
func articlesIndexHandler(w http.ResponseWriter, r *http.Request) {// 1. 執行查詢語句,返回一個結果集rows, err := db.Query("SELECT * from articles")checkError(err)defer rows.Close()var articles []Article//2. 循環讀取結果for rows.Next() {var article Article// 2.1 掃描每一行的結果并賦值到一個 article 對象中err := rows.Scan(&article.ID, &article.Title, &article.Body)checkError(err)// 2.2 將 article 追加到 articles 的這個數組中articles = append(articles, article)}// 2.3 檢測遍歷時是否發生錯誤err = rows.Err()checkError(err)// 3. 加載模板tmpl, err := template.ParseFiles("resources/views/articles/index.gohtml")checkError(err)// 4. 渲染模板,將所有文章的數據傳輸進去err = tmpl.Execute(w, articles)checkError(err)
}
.
.
.

添加模板
resources/views/articles/index.gohtml

<!DOCTYPE html>
<html lang="en">
<head><title>所有文章 —— 我的技術博客</title><style type="text/css">.error {color: red;}</style>
</head>
<body><h1>所有文章</h1><ul>{{ range $key, $article := . }}<li><a href=""><strong>{{ $article.ID }}</strong>: {{ $article.Title }}</a></li>{{ end }}</ul>
</body>
</html>

訪問 localhost:3000/articles
在這里插入圖片描述
為列表里的文章加上鏈接

.
.
'
// Article  對應一條文章數據
type Article struct {...
}// Link 方法用來生成文章鏈接
func (a Article) Link() string {showURL, err := router.Get("articles.show").URL("id", strconv.FormatInt(a.ID, 10))if err != nil {checkError(err)return ""}return showURL.String()
}
.
.
.

保存后刷新頁面并查看頁面源碼:

在這里插入圖片描述

2 刪除文章

先開發后臺的刪除邏輯,然后在文章詳情頁里顯示刪除按鈕
(1)注冊articles.delete 路由
在這里插入圖片描述
(2)添加articlesDeleteHandler()函數

.
.
.
func articlesDeleteHandler(w http.ResponseWriter, r *http.Request) {// 1. 獲取 URL 參數id := getRouteVariable("id", r)// 2. 讀取對應的文章數據article, err := getArticleByID(id)// 3. 如果出現錯誤if err != nil {if err == sql.ErrNoRows {// 3.1 數據未找到w.WriteHeader(http.StatusNotFound)fmt.Fprint(w, "404 文章未找到")} else {// 3.2 數據庫錯誤checkError(err)w.WriteHeader(http.StatusInternalServerError)fmt.Fprint(w, "500 服務器內部錯誤")}} else {// 4. 未出現錯誤,執行刪除操作rowsAffected, err := article.Delete()// 4.1 發生錯誤if err != nil {// 應該是 SQL 報錯了checkError(err)w.WriteHeader(http.StatusInternalServerError)fmt.Fprint(w, "500 服務器內部錯誤")} else {// 4.2 未發生錯誤if rowsAffected > 0 {// 重定向到文章列表頁indexURL, _ := router.Get("articles.index").URL()http.Redirect(w, r, indexURL.String(), http.StatusFound)} else {// Edge casew.WriteHeader(http.StatusNotFound)fmt.Fprint(w, "404 文章未找到")}}}
}

添加Article 的 Delete() 方法 ,上面代碼塊用到了Delete方法


// // 為 Article 添加一個 Delete 方法,刪除文章
func (a Article) Delete() (rowsAffected int64, err error) {rs, err := db.Exec("DELETE FROM articles WHERE id = " + strconv.FormatInt(a.ID, 10))if err != nil {return 0, err}// √ 刪除成功if n, _ := rs.RowsAffected(); n > 0 {return n, nil}return 0, nil
}

(3)文章詳情頁面添加刪除按鈕

.
.
.
func  articlesShowHandler(w http.ResponseWriter, r *http.Request) {...// 3. 如果出現錯誤if err !=  nil {...} else {// 4. 讀取成功,顯示文章tmpl, err := template.New("show.gohtml").Funcs(template.FuncMap{"RouteName2URL": RouteName2URL,"Int64ToString": Int64ToString,}).ParseFiles("resources/views/articles/show.gohtml")checkError(err)err = tmpl.Execute(w, article)checkError(err)}
}

template.New() 先初始化,然后使用 Funcs() 注冊函數,再使用 ParseFiles (),需要注意的是 New() 的參數是模板名稱,需要對應 ParseFiles() 中的文件名,否則會無法正確讀取到模板,最終顯示空白頁面。

創建上面代碼中的兩個函數RouteName2URL 和 Int64ToString

.
.
.
// RouteName2URL 通過路由名稱來獲取 URL
func RouteName2URL(routeName string, pairs ...string) string {url, err := router.Get(routeName).URL(pairs...)if err != nil {checkError(err)return ""}return url.String()
}// Int64ToString 將 int64 轉換為 string
func Int64ToString(num int64) string {return strconv.FormatInt(num, 10)
}func (a Article) Delete() (rowsAffected int64, err error) {
.
.
.

修改模板 show.gohtml

<!DOCTYPE html>
<html lang="en"><head><title>{{ .Title }} —— 我的技術博客</title><style type="text/css">.error {color: red;}</style>
</head><body><p>ID: {{ .ID }}</p><p>標題: {{ .Title }}</p><p>內容:{{ .Body }}</p>{{/* 構建刪除按鈕  */}}{{ $idString := Int64ToString .ID  }}<form action="{{ RouteName2URL "articles.delete" "id" $idString }}" method="post"><button type="submit" onclick="return confirm('刪除動作不可逆,請確定是否繼續')">刪除</button></form></body></html>

在這里插入圖片描述
打開articles.show文章詳情頁localhost:3000/articles/4
在這里插入圖片描述
在這里插入圖片描述
點擊刪除,確定刪除
在這里插入圖片描述


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

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

相關文章

【Web后端】監聽器Listener

1、簡介 用來監聽Servlet組件對象狀態發生變化的組件可以監聽的源包括:ServetRequest、HttpSession、ServletContext當監聽到事件源狀態發生變化時&#xff0c;會有對應的響應行為 2、使用方法 在web.xml文件中配置 <listener> <listener-class>com.coder.util.…

【DevOps】詳解 Linux 用戶和權限管理:添加用戶、分組及文件權限設置

目錄 1. 用戶管理 用戶分類 用戶相關文件 常用命令 2. 組管理 組相關文件 常用命令 3. 權限管理 文件權限 權限表示 修改權限 修改所有者和所屬組 特殊權限 4. 示例 命令的詳細解釋 權限解釋 示例&#xff1a;文件權限 -rw-r--r-- 的含義 在 Linux 中&#xf…

棧隊列經典OJ題(詳細過程)

1. 有效的括號 - 力扣&#xff08;LeetCode&#xff09; 第一題判斷有效的括號&#xff0c;這道題我們會用到棧的知識&#xff0c;棧是后進先出的&#xff0c;可以根據這個來解這道題&#xff0c;先看一下題目和示例。 1.1整體思路 我們通過示例可以看出括號匹配就返回true&am…

【JAVA】BOSS系統發版藝術:構建高效、優雅的微服務部署策略

在現代軟件開發領域&#xff0c;微服務架構與容器化部署已迅速成為行業新趨勢。微服務架構通過將應用拆分成多個小型、自治的服務單元&#xff0c;每個服務承擔某項特定的業務功能。而容器化部署則以其輕量級和高度可移植的特性&#xff0c;為這些微服務的有效打包、分發和運行…

機器學習 - 不同分類模型的比較

一、模型訓練 本案例中&#xff0c;我們將通過四種不同的模型來預測泰坦尼克號乘客的生存情況。 一下是訓練的具體步驟。 加載數據 從seaborn庫中加載目標數據。該數據集包括多個特征&#xff0c;如 PassengerId, Pclass, Name, Sex, Age, SibSp, Parch, Ticket, Fare, Cabi…

科技查新中的工法查新點如何確立與提煉?案例講解!

按《工程建設工法管理辦法》( 建 質&#xff3b;2014&#xff3d;103 號) &#xff0c;工法&#xff0c;是指以工程為對象&#xff0c;以工藝為核心&#xff0c;運用系 統工程原理&#xff0c;把先進技術和科學管理結合起來&#xff0c;經過一定工程實踐形成的綜合配套的施工方…

探索美國動態IP池:技術賦能下的網絡安全新篇章

在數字化飛速發展的今天&#xff0c;網絡安全成為了各行各業關注的焦點。特別是在跨國業務中&#xff0c;如何保障數據的安全傳輸和合規性成為了企業面臨的重要挑戰。美國動態IP池作為一種新興的網絡技術&#xff0c;正逐漸走進人們的視野&#xff0c;為網絡安全提供新的解決方…

黑馬甄選離線數倉項目day02(數據采集)

datax介紹 官網&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.md DataX 是阿里云 DataWorks數據集成 的開源版本&#xff0c;在阿里巴巴集團內被廣泛使用的離線數據同步工具/平臺。 DataX 實現了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre…

Java中List接口中方法的使用(初學者指南)

Java中List接口中方法的使用&#xff08;初學者指南&#xff09; 在Java中&#xff0c;List接口是Collection接口的子接口&#xff0c;它表示一個有序的集合&#xff0c;其中的元素都可以重復。List接口提供了許多額外的方法&#xff0c;用于對元素進行插入、刪除、查詢等操作…

計算機Java項目|Springboot學生讀書筆記共享

作者主頁&#xff1a;編程指南針 作者簡介&#xff1a;Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、騰訊課堂常駐講師 主要內容&#xff1a;Java項目、Python項目、前端項目、人工智能與大數據、簡…

C++通過json文件配置參數

一、安裝nlohmann json nlohmann json&#xff1a;安裝_nlohmann安裝-CSDN博客 依次執行下面指令&#xff1a; git clone https://gitee.com/cuihongxi/mov_from_github.gitcd json-developmkdir buildcd buildcmake ..makesudo make install 二、安裝完成后使用 #include…

華為設備display查看命令

display version //查看版本信息 display current-configuration //查看配置詳情 display this //查看當前視圖有效配置 display ip routing-table //查看路由表 display ip routing-table 192.168.3.1 //查看去往3.1的路由 display ip interface brief //查看接口下ip信息 dis…

想跨境出海?云手機提供了一種可能性

全球化時代&#xff0c;越來越多的中國電商開始將目光投向了海外市場。這并不是偶然&#xff0c;而是他們在長期的市場運營中&#xff0c;看到了出海的必要性和潛在的機會。 中國的電商市場無疑是全球最大也最發達的之一。然而&#xff0c;隨著市場的不斷發展和競爭的日益加劇…

visual studio2022 JNI極簡開發流程

文章目錄 1 創建java類2 生成JNI頭文件3 使用visual studio2022創建DLL項目3.1 選擇模板中&#xff08;Windows桌面向導&#xff09;3.2 為項目命名3.3 選擇應用程序類型為動態鏈接庫3.4 項目概覽 4 導入需要的頭文件4.1 導入需要的頭文件4.2 修改頭文件 5 編寫C實現6 生成dll文…

服務器3389端口,服務器3389端口風險提示的應對措施

3389端口是Windows操作系統中遠程桌面協議&#xff08;RDP&#xff09;的默認端口。一旦該端口被惡意攻擊者利用&#xff0c;可能會導致未經授權的遠程訪問和數據泄露等嚴重安全問題。 針對此風險&#xff0c;強烈建議您采取以下措施&#xff1a; 1. 修改默認端口&#xff1a;…

Java面試之抽象類和接口

Java的一個重要特性就是抽象&#xff0c;抽象是指將具體的事物抽象成更一般化、更抽象化的概念或模型。在Java中&#xff0c;抽象可以通過抽象類和接口來實現&#xff0c;它們讓你能夠定義一些方法但不提供具體實現&#xff0c;從而讓子類去實現具體細節。 一、抽象類&#xf…

springboot3 集成spring-authorization-server (一 基礎篇)

官方文檔 Spring Authorization Server 環境介紹 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 引入maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

識別AI論文生成內容,降低論文高AI率

AI寫作工具能幫我們在短時間內高效生成一篇畢業論文、開通報告、文獻綜述、任務書、調研報告、期刊論文、課程論文等等&#xff0c;導致許多人開始使用AI寫作工具作為撰寫學術論文的輔助手段。而學術界為了杜絕此行為&#xff0c;開始使用AIGC檢測系統來判斷文章是由AI生成還是…

解鎖商業AI,賦能新質生產力發展——思愛普中國峰會探展全紀錄

ITValue 鈦媒體獨家探秘思愛普中國峰會&#xff0c;帶你深刻感受SAP助力企業利用以商業AI為代表的數字化技術&#xff0c;實現質的飛躍&#xff0c;通過全數據、全球化、全綠色賦能新型中國企業發展新質生產力。 首發&#xff5c;鈦媒體APP ITValue 5月10日&#xff0c;一年一度…

基于NTP服務器獲取網絡時間的實現

文章目錄 1 NTP1.1 簡介1.2 包結構1.3 UNIX 時間戳和NTP時間戳 2 代碼實現2.1 實現步驟2.2 完整代碼 3 結果 在某些場景下&#xff0c;單片機需要通過網絡獲取準確的時間進行數據同步&#xff0c;例如日志記錄、定時任務等。然而&#xff0c;單片機本身無法直接獲得準確的標準時…