go系列之一:gin+gorm開發一個簡單的熱榜介面站 - IT人
文章推薦指數: 80 %
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包(上篇)
延伸文章資訊
- 1How to build a REST API with Golang using Gin and Gorm
First, let's implement the FindBooks controller. // controllers/books.go package controllers impo...
- 2使用gin封装一个web脚手架(一):控制器和路由 - 掘金
创建一个go项目,名称为myGin go.mod文件为安装gin 创建一个main.go文件创建routes文件夹和controller 项目结构为在controller下创建一个Index控制.
- 3Golang Gin Router HandlerFunc 拆分練習 - 菜鳥工程師肉豬
Go Gin 把Router處理請求的 HandlerFunc 拆分為另外的檔案。 ... DemoRoute 角色類似Java Spring Boot的Controller,用來設定API路徑...
- 4toutGin: golang gin框架个人风格版 - Gitee
package controller import ( "github.com/gin-gonic/gin" "toutGin/app/common" "toutGin/app/service"...
- 5一起幫忙解決難題,拯救IT 人的一天
Day24 Gin with Cache ... 而我們這章節主要也是在講Gin在Server Cache的實作! ... "github.com/gin-gonic/gin" "ironman...