go系列之一:gin+gorm開發一個簡單的熱榜介面站
一,熱榜的例子:
以抽屜新熱榜為例,只儲存資訊的連結和提示,
使用者點選時會跳轉到外部的網站閱讀
我們在這裡只實現了顯示單條內容和多條內容的功能,
主要是把它做為後續功能整合演示的一個基礎
後續的整合包括:
統一報錯資訊
統一rest輸出
validator
日誌功能
安全
介面文件
統一讀取配置檔案
...
其他想到再補充吧
說明:劉巨集締的go森林是一個專注golang的部落格,
地址:https://blog.csdn.net/weixin_43881017
說明:作者:劉巨集締 郵箱: 371125307@qq.com
二,演示專案的相關資訊
1,專案地址:
https://github.com/liuhongdi/digv01
2,專案功能:輸出一條資訊的資訊、輸出多條資訊的資訊
3,專案結構:
4, 專案各資料夾的說明:
controller: 控制器,負責接收引數、驗證引數,呼叫service,統一輸出
dao: 到資料庫的訪問
doc: 文件
global: 全域性用到的變數,主要是配置、資料庫連線、日誌功能等
model: 資料模型
router: 路由
service: 主要的業務邏輯
三,sql相關說明:
CREATE TABLE `article` (
`articleId` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '型別',
`subject` varchar(500) NOT NULL DEFAULT '' COMMENT '標題',
`addTime` datetime NOT NULL DEFAULT '2020-11-19 00:00:00' COMMENT '新增時間',
`isHot` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否熱榜,0:非熱,1,熱',
`url` varchar(500) NOT NULL DEFAULT '' COMMENT '連結地址',
`domain` varchar(100) NOT NULL DEFAULT '' COMMENT '域',
`userId` bigint unsigned NOT NULL DEFAULT '0' COMMENT '推薦使用者',
`approvalStaffId` int unsigned NOT NULL DEFAULT '0' COMMENT '批准員工',
`digSum` int unsigned NOT NULL DEFAULT '0' COMMENT '被頂的次數',
`commentSum` int unsigned NOT NULL DEFAULT '0' COMMENT '被評論的次數',
`isPublish` tinyint NOT NULL DEFAULT '0' COMMENT '0,未釋出,1,已釋出',
PRIMARY KEY (`articleId`),
KEY `isPublish` (`isPublish`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文章表'
插入6條演示資料:
INSERT INTO `article` (`articleId`, `type`, `subject`, `addTime`, `isHot`, `url`, `domain`, `userId`, `approvalStaffId`, `digSum`, `commentSum`, `isPublish`) VALUES
(1, 0, '【最近,南非發現一座大油田】石油和天然氣兩種重要資源是南非儲量的最短板,“貧油”的帽子也一直扣在南非的頭上摘不下來。可就在最近,在南非海域進行油氣勘探已久的道達爾透露了其新的勘探成果:在距離南非南部海岸約175公里的奧特尼誇盆地的11B/12B地區,再次發現了重要的凝析氣,可能蘊藏著大量天然氣及原油。', '2020-11-19 00:00:00', 1, 'https://mp.weixin.qq.com/s/1btbmouH-2KuIHUMoucq2w', '', 1, 1, 0, 0, 1),
(2, 1, '讓喵喵來開啟週五的早晨吧!', '2020-11-19 00:00:00', 0, 'https://m.weibo.cn/status/4573112073720433?', 'm.weibo.cn', 0, 0, 0, 0, 1),
(3, 0, '湯姆·赫蘭德、黛茜·雷德利、麥斯·米科爾森、尼克·喬納斯主演的《混沌漫步》公開預告。影片由《明日邊緣》導演道格·裡曼執導,暫時定檔明年1月22日上映。', '2020-11-19 00: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-19 00:00:00', 0, '', '', 0, 0, 0, 0, 1),
(5, 0, '【世衛組織建議醫生不要使用瑞德西韋治療新冠】世衛組織指導小組表示,證據顯示,瑞德西韋對提高新冠肺炎患者的存活率沒有顯著影響。這項建議發表在上週五的《英國醫學雜誌》中。', '2020-11-19 00: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-19 00: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
package main
import (
_ "github.com/jinzhu/gorm/dialects/mysql"
"github.com/liuhongdi/digv01/global"
"github.com/liuhongdi/digv01/router"
"log"
)
func init() {
err := global.SetupDBLink()
if err != nil {
log.Fatalf("init.setupDBEngine err: %v", err)
}
}
func main() {
//引入路由
r := router.Router()
//run
r.Run(":8080")
}
2,router/router.go
package router
import (
"github.com/gin-gonic/gin"
"github.com/liuhongdi/digv01/controller"
)
func Router() *gin.Engine {
router := gin.Default()
// 路徑對映
router.GET("/article/getone/:id", controller.NewArticleController().GetOne);
router.GET("/article/list", controller.NewArticleController().GetList);
return router
}
3,controller/articleController.go
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/liuhongdi/digv01/service"
"net/http"
"strconv"
)
type ArticleController struct{}
func NewArticleController() ArticleController {
return ArticleController{}
}
//得到一篇文章的詳情
func (a ArticleController) 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);
if err != nil {
c.AbortWithStatus(404)
fmt.Println(err.Error())
} else {
c.JSON(http.StatusOK, &articleOne)
}
return
}
//得到多篇文章,按分頁返回
func (a ArticleController) 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)
if err != nil {
c.AbortWithStatus(404)
fmt.Println(err.Error())
} else {
c.JSON(http.StatusOK, &articles)
}
return
}
4,service/article.go
package service
import (
"fmt"
"github.com/liuhongdi/digv01/dao"
"github.com/liuhongdi/digv01/model"
)
//得到一篇文章的詳情
func GetOneArticle(articleId int64) (*model.Article, error) {
return dao.SelectOneArticle(articleId)
}
//得到多篇文章,按分頁返回
func GetArticleList(page int ,pageSize int) ([]*model.Article,error) {
articles, err := dao.SelectAllArticle(page,pageSize)
if err != nil {
fmt.Println("is error")
return nil,err
} else {
fmt.Println("not is error")
return articles,nil
}
}
5,dao/article.go
package dao
import (
"fmt"
"github.com/liuhongdi/digv01/global"
"github.com/liuhongdi/digv01/model"
)
//查詢一條資料
func SelectOneArticle(articleId int64) (*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) {
return nil,err
} else {
return articleOne,nil
}
}
//查詢總數
func SelectcountAll() (int, error) {
var count int
err := global.DBLink.Where("isPublish=?",1).Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
//查詢多條資料
func SelectAllArticle(pageOffset int,pageSize int) ([]*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()
if err != nil {
fmt.Println("sql is error:")
fmt.Println(err)
return nil, err
}
defer rows.Close()
var articles []*model.Article
for rows.Next() {
fmt.Println("rows.next:")
r := &model.Article{}
if err := rows.Scan(&r.ArticleId, &r.Subject, &r.Url); err != nil {
fmt.Println("rows.next:")
fmt.Println(err)
return nil, err
}
articles = append(articles, r)
}
return articles, nil
}
6,model/article.go
package model
type Article struct {
ArticleId int64 `gorm:"column:articleId",json:"articleId"` // 自增
Subject string `gorm:"column:subject",json:"title"` //
Url string `gorm:"column:url",json:"url"`
ImgUrl string `json:"imgurl"`
HeadUrl string `json:"headurl"`
}
//返回表名
func (Article) TableName() string {
return "article"
}
7,global/db.go
package global
import "github.com/jinzhu/gorm"
var (
DBLink *gorm.DB
)
//連線到資料庫
func SetupDBLink() error {
var err error
DBLink, err = gorm.Open("mysql", "root:password@tcp(127.0.0.1:3306)/dig?charset=utf8&parseTime=True&loc=Local")
if err == nil {
// 全域性禁用表名複數
DBLink.SingularTable(true)
//開啟sql日誌
DBLink.LogMode(true)
return nil
} else {
return err
}
}
五,測試效果
1,一條資料:訪問:
http://127.0.0.1:8080/article/getone/1
返回:
2,多條資料:訪問:
http://127.0.0.1:8080/article/list?page=2
返回:
六,檢視庫的版本:
module github.com/liuhongdi/digv01
go 1.15
require (
github.com/gin-gonic/gin v1.6.3
github.com/jinzhu/gorm v1.9.16
)
相關文章
- 一個簡單的開源DIRECTUI介面框架UI框架
- go微服務系列之一Go微服務
- Flutter系列:2.實現一個簡單的登入介面Flutter
- 開發小細節系列之一
- 設計模式系列之一:簡單工廠模式設計模式
- 最簡單的 Go Dockerfile 編寫姿勢,沒有之一!GoDocker
- 最簡單的Go Dockerfile編寫姿勢,沒有之一!GoDocker
- Go的第一個Hello程式 簡簡單單 - 快快樂樂Go
- GO語言一個簡單的工程Go
- 使用Flask開發簡單介面Flask
- golang開發一個簡單的grpcGolangRPC
- PLSQL簡單的程式之一SQL
- Spring-Context之一:一個簡單的例子SpringContext
- 一個超級簡單的 go Web 框架GoWeb框架
- 用 go 實現一個簡單的 mvcGoMVC
- xLua熱更開發之一:初見xlua,你好
- Nginx簡介–nginx系列之一Nginx
- 一個簡單的介面測試框架 demo框架
- 微信開發系列之一 - 微信公眾號開發的開發環境搭建開發環境
- JAVA學習系列之一-搭建開發環境Java開發環境
- DB2開發系列之一——基本語法DB2
- 爬蟲學習之一個簡單的網路爬蟲爬蟲
- Python之介面自動化初級:開始一個簡單的介面測試Python
- 開發一個簡單的 HTTP 伺服器應用HTTP伺服器
- 開發和部署一個簡單的Clojure Web應用Web
- 一個簡單的基於Debian的開發環境。開發環境
- 軟體開發中的矛盾——一個簡單的例子 (轉)
- 簡單介紹python中的mock介面開發PythonMock
- VC開發多語言介面支援的簡單方法
- 使用Node.js寫一個簡單的api介面Node.jsAPI
- Express簡單起一個本地服務介面Express
- 一個WPF開發的、介面簡潔漂亮的音訊播放器音訊播放器
- SQL*Plus的簡單使用之一(轉)SQL
- AV Foundation簡單入門之一
- 一個簡單的 Laravel 站點設定實現Laravel
- 用 Go 編寫一個簡單的 WebSocket 推送服務GoWeb
- Go-chassis 微服務開發框架系列(一)Go微服務框架
- JavaScript-開發一個簡單的貪吃蛇小遊戲JavaScript遊戲