go系列之一:gin+gorm開發一個簡單的熱榜介面站 - IT人

文章推薦指數: 80 %
投票人數:10人

controller: 控制器,負責接收引數、驗證引數,呼叫service,統一輸出 ... package controller import ( "fmt" "github.com/gin-gonic/gin" ... Togglenavigation IT人 IT人 go系列之一:gin+gorm開發一個簡單的熱榜介面站 老劉你真牛發表於 2020-11-20 Go 一,熱榜的例子: 以抽屜新熱榜為例,只儲存資訊的連結和提示, 使用者點選時會跳轉到外部的網站閱讀 我們在這裡只實現了顯示單條內容和多條內容的功能, 主要是把它做為後續功能整合演示的一個基礎 後續的整合包括: 統一報錯資訊 統一rest輸出 validator 日誌功能 安全 介面文件 統一讀取配置檔案 ... 其他想到再補充吧 說明:劉巨集締的go森林是一個專注golang的部落格,      地址:https://blog.csdn.net/weixin_43881017 說明:作者:劉巨集締郵箱:[email protected]   二,演示專案的相關資訊 1,專案地址: https://github.com/liuhongdi/digv01 2,專案功能:輸出一條資訊的資訊、輸出多條資訊的資訊 3,專案結構:     4, 專案各資料夾的說明:   controller: 控制器,負責接收引數、驗證引數,呼叫service,統一輸出   dao:     到資料庫的訪問   doc:     文件   global:   全域性用到的變數,主要是配置、資料庫連線、日誌功能等   model:  資料模型   router:  路由   service:  主要的業務邏輯   三,sql相關說明:    CREATETABLE`article`( `articleId`bigintunsignedNOTNULLAUTO_INCREMENTCOMMENT'id', `type`tinyintunsignedNOTNULLDEFAULT'0'COMMENT'型別', `subject`varchar(500)NOTNULLDEFAULT''COMMENT'標題', `addTime`datetimeNOTNULLDEFAULT'2020-11-1900:00:00'COMMENT'新增時間', `isHot`tinyintunsignedNOTNULLDEFAULT'0'COMMENT'是否熱榜,0:非熱,1,熱', `url`varchar(500)NOTNULLDEFAULT''COMMENT'連結地址', `domain`varchar(100)NOTNULLDEFAULT''COMMENT'域', `userId`bigintunsignedNOTNULLDEFAULT'0'COMMENT'推薦使用者', `approvalStaffId`intunsignedNOTNULLDEFAULT'0'COMMENT'批准員工', `digSum`intunsignedNOTNULLDEFAULT'0'COMMENT'被頂的次數', `commentSum`intunsignedNOTNULLDEFAULT'0'COMMENT'被評論的次數', `isPublish`tinyintNOTNULLDEFAULT'0'COMMENT'0,未釋出,1,已釋出', PRIMARYKEY(`articleId`), KEY`isPublish`(`isPublish`) )ENGINE=InnoDBAUTO_INCREMENT=0DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ciCOMMENT='文章表'   插入6條演示資料: INSERTINTO`article`(`articleId`,`type`,`subject`,`addTime`,`isHot`,`url`,`domain`,`userId`,`approvalStaffId`,`digSum`,`commentSum`,`isPublish`)VALUES (1,0,'【最近,南非發現一座大油田】石油和天然氣兩種重要資源是南非儲量的最短板,“貧油”的帽子也一直扣在南非的頭上摘不下來。

可就在最近,在南非海域進行油氣勘探已久的道達爾透露了其新的勘探成果:在距離南非南部海岸約175公里的奧特尼誇盆地的11B/12B地區,再次發現了重要的凝析氣,可能蘊藏著大量天然氣及原油。

','2020-11-1900:00:00',1,'https://mp.weixin.qq.com/s/1btbmouH-2KuIHUMoucq2w','',1,1,0,0,1), (2,1,'讓喵喵來開啟週五的早晨吧!','2020-11-1900:00:00',0,'https://m.weibo.cn/status/4573112073720433?','m.weibo.cn',0,0,0,0,1), (3,0,'湯姆·赫蘭德、黛茜·雷德利、麥斯·米科爾森、尼克·喬納斯主演的《混沌漫步》公開預告。

影片由《明日邊緣》導演道格·裡曼執導,暫時定檔明年1月22日上映。

','2020-11-1900:00:00',1,'http://news.mtime.com/2020/11/19/1604795.html','news.mtime.com',0,0,0,0,1), (4,1,'掃地機器人這個東西確實方便,大多數時候把房間掃的比較乾淨,但還有很多邊邊角角清掃不上,希望廠家能夠在app上顯示出機器人的路線圖,明確告知哪些路段沒有照顧到,要不然就再開發一個專案經理機器人,跟在掃地機器人屁股後面監督。

//@大窯兒:可以弄個步數排行榜,讓機器人們互相點贊,揣摩,攀比,內卷,無意義競爭。

','2020-11-1900:00:00',0,'','',0,0,0,0,1), (5,0,'【世衛組織建議醫生不要使用瑞德西韋治療新冠】世衛組織指導小組表示,證據顯示,瑞德西韋對提高新冠肺炎患者的存活率沒有顯著影響。

這項建議發表在上週五的《英國醫學雜誌》中。

','2020-11-1900:00:00',0,'https://www.thepaper.cn/newsDetail_forward_10067542','thepaper.cn',0,0,0,0,1), (6,0,'11月19日0—24時,31個省(自治區、直轄市)和新疆生產建設兵團報告新增確診病例17例,均為境外輸入病例(福建6例,上海4例,陝西3例,廣東2例,北京1例,四川1例);無新增死亡病例;新增疑似病例1例,為本土病例(在天津)。

','2020-11-1900:00:00',0,'http://m.news.cctv.com/2020/11/20/ARTIIR9o72TuDF80s6hY2IvD201120.shtml','m.news.cctv.com',0,0,0,0,1); 四,go程式碼說明 1,main.go packagemain import( _"github.com/jinzhu/gorm/dialects/mysql" "github.com/liuhongdi/digv01/global" "github.com/liuhongdi/digv01/router" "log" ) funcinit(){ err:=global.SetupDBLink() iferr!=nil{ log.Fatalf("init.setupDBEngineerr:%v",err) } } funcmain(){ //引入路由 r:=router.Router() //run r.Run(":8080") } 2,router/router.go packagerouter import( "github.com/gin-gonic/gin" "github.com/liuhongdi/digv01/controller" ) funcRouter()*gin.Engine{ router:=gin.Default() //路徑對映 router.GET("/article/getone/:id",controller.NewArticleController().GetOne); router.GET("/article/list",controller.NewArticleController().GetList); returnrouter } 3,controller/articleController.go packagecontroller import( "fmt" "github.com/gin-gonic/gin" "github.com/liuhongdi/digv01/service" "net/http" "strconv" ) typeArticleControllerstruct{} funcNewArticleController()ArticleController{ returnArticleController{} } //得到一篇文章的詳情 func(aArticleController)GetOne(c*gin.Context){ id:=c.Params.ByName("id") fmt.Println("id:"+id); articleId,err:=strconv.ParseInt(id,10,64); if(err!=nil){ c.AbortWithStatus(400) fmt.Println(err.Error()) } articleOne,err:=service.GetOneArticle(articleId); iferr!=nil{ c.AbortWithStatus(404) fmt.Println(err.Error()) }else{ c.JSON(http.StatusOK,&articleOne) } return } //得到多篇文章,按分頁返回 func(aArticleController)GetList(c*gin.Context){ page:=c.DefaultQuery("page","0") pageInt,err:=strconv.Atoi(page) if(err!=nil){ c.AbortWithStatus(400) fmt.Println(err.Error()) } pageSize:=2; pageOffset:=pageInt*pageSize articles,err:=service.GetArticleList(pageOffset,pageSize) iferr!=nil{ c.AbortWithStatus(404) fmt.Println(err.Error()) }else{ c.JSON(http.StatusOK,&articles) } return } 4,service/article.go packageservice import( "fmt" "github.com/liuhongdi/digv01/dao" "github.com/liuhongdi/digv01/model" ) //得到一篇文章的詳情 funcGetOneArticle(articleIdint64)(*model.Article,error){ returndao.SelectOneArticle(articleId) } //得到多篇文章,按分頁返回 funcGetArticleList(pageint,pageSizeint)([]*model.Article,error){ articles,err:=dao.SelectAllArticle(page,pageSize) iferr!=nil{ fmt.Println("iserror") returnnil,err }else{ fmt.Println("notiserror") returnarticles,nil } } 5,dao/article.go packagedao import( "fmt" "github.com/liuhongdi/digv01/global" "github.com/liuhongdi/digv01/model" ) //查詢一條資料 funcSelectOneArticle(articleIdint64)(*model.Article,error){ fields:=[]string{"articleId","subject","url"} articleOne:=&model.Article{} err:=global.DBLink.Select(fields).Where("articleId=?",articleId).First(&articleOne).Error if(err!=nil){ returnnil,err }else{ returnarticleOne,nil } } //查詢總數 funcSelectcountAll()(int,error){ varcountint err:=global.DBLink.Where("isPublish=?",1).Count(&count).Error iferr!=nil{ return0,err } returncount,nil } //查詢多條資料 funcSelectAllArticle(pageOffsetint,pageSizeint)([]*model.Article,error){ fields:=[]string{"articleId","subject","url"} rows,err:=global.DBLink.Select(fields).Table(model.Article{}.TableName()).Where("isPublish=?",1).Offset(pageOffset).Limit(pageSize).Rows() iferr!=nil{ fmt.Println("sqliserror:") fmt.Println(err) returnnil,err } deferrows.Close() vararticles[]*model.Article forrows.Next(){ fmt.Println("rows.next:") r:=&model.Article{} iferr:=rows.Scan(&r.ArticleId,&r.Subject,&r.Url);err!=nil{ fmt.Println("rows.next:") fmt.Println(err) returnnil,err } articles=append(articles,r) } returnarticles,nil } 6,model/article.go packagemodel typeArticlestruct{ ArticleId int64`gorm:"column:articleId",json:"articleId"`//自增 Subjectstring`gorm:"column:subject",json:"title"`// Urlstring`gorm:"column:url",json:"url"` ImgUrlstring`json:"imgurl"` HeadUrlstring`json:"headurl"` } //返回表名 func(Article)TableName()string{ return"article" } 7,global/db.go packageglobal import"github.com/jinzhu/gorm" var( DBLink*gorm.DB ) //連線到資料庫 funcSetupDBLink()error{ varerrerror DBLink,err=gorm.Open("mysql","root:[email protected](127.0.0.1:3306)/dig?charset=utf8&parseTime=True&loc=Local") iferr==nil{ //全域性禁用表名複數 DBLink.SingularTable(true) //開啟sql日誌 DBLink.LogMode(true) returnnil }else{ returnerr } }   五,測試效果 1,一條資料:訪問: http://127.0.0.1:8080/article/getone/1 返回: 2,多條資料:訪問: http://127.0.0.1:8080/article/list?page=2 返回: 六,檢視庫的版本: modulegithub.com/liuhongdi/digv01 go1.15 require( github.com/gin-gonic/ginv1.6.3 github.com/jinzhu/gormv1.9.16 )   相關文章 farmskins官網最好的國外CSGO開箱網站 2020-11-21 Go SwiftUI如何在介面中print列印日誌log(EmptyView教程含原始碼) 2020-11-21 golangcount單字元字串統計函式 2020-11-21 統計Go mongodb核心原始碼實現、效能調優系列-為何要對開源mongodb資料庫核心做二次開發 2020-11-25 資料庫MongoDB 介面測試之json中的key獲取 2020-11-21 介面測試之json中的key獲取 2020-11-21 Go踩坑筆記(十九) 2020-11-21 Go 2020.11.21Set介面 2020-11-21 基於GoogleearthenginepythonAPI做基於影像的定量反演——步驟及問題總結 2020-11-21 Python 解決Ubuntu配置nginx出現的問題 2020-11-21 tp5Nginx隱藏index.php的配置方法 2020-11-21 PHP multi-parentgeneticalgorithms 2020-11-21 演算法Go golanggopsutil程式系統硬體資訊獲取 2020-11-21 Go 13、nginx服務叢集搭建以及優化 2020-11-21 遠控介紹及介面編寫 2020-11-22 Java語言搭建介面自動化框架學習一(單介面請求和響應) 2020-11-22 Java框架 編譯googletest 2020-11-22 Golang控制iOS裝置實現自動化操作 2020-11-22 iOSGo 基於Java的Socket類Tcp網路程式設計實現實時聊天互動程式(一):QQ聊天介面的搭建 2020-11-22 Java 最新文章 火線安全:Log4j2史詩級漏洞波及全球6萬+開源軟體 企業級日誌平臺新秀!比ELK更輕量、更高效 技術管理進階——悟了,還是防禦機制的應激反應? kuberneteslist/watch設計原理 ZooKeeper06-ZooKeeper的常用命令 可落地的DDD程式碼實踐 collection庫更新1.4.0版本 並行Louvain社群檢測演算法 pytest_BDD+allure自動化測試框架 利用Windbg分析Magicodes.IE一次錯誤編寫導致記憶體劇增 PostgreSQL編寫自定義extension 從一次解決Nancy引數繫結“bug”開始釋出自己的第一個nuget包(上篇)



請為這篇文章評分?