1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > go语言web开发系列之一:gin+gorm开发一个简单的热榜接口站

go语言web开发系列之一:gin+gorm开发一个简单的热榜接口站

时间:2024-04-04 06:31:28

相关推荐

go语言web开发系列之一:gin+gorm开发一个简单的热榜接口站

一,热榜的例子:

以抽屉新热榜为例,只存储资讯的链接和提示,

用户点击时会跳转到外部的网站阅读

我们在这里只实现了显示单条内容和多条内容的功能,

主要是把它做为后续功能集成演示的一个基础

后续的集成包括:

统一报错信息统一rest输出validator日志功能安全接口文档统一读取配置文件...其他想到再补充吧

说明:刘宏缔的go森林是一个专注golang的博客,

网站:

原文:go语言web开发系列之一:gin+gorm开发一个简单的热榜接口站 – 架构森林

说明:作者:刘宏缔 邮箱: 371125307@

二,演示项目的相关信息

1,项目地址:

GitHub - liuhongdi/digv01: gin+gorm实现一个简单的热榜接口站

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 '-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地区,再次发现了重要的凝析气,可能蕴藏着大量天然气及原油。', '-11-19 00:00:00', 1, 'https://mp./s/1btbmouH-2KuIHUMoucq2w', '', 1, 1, 0, 0, 1),(2, 1, '让喵喵来开启周五的早晨吧!', '-11-19 00:00:00', 0, '/status/4573112073720433?', '', 0, 0, 0, 0, 1),(3, 0, '汤姆·赫兰德、黛茜·雷德利、麦斯·米科尔森、尼克·乔纳斯主演的《混沌漫步》公开预告。影片由《明日边缘》导演道格·里曼执导,暂时定档明年1月22日上映。', '-11-19 00:00:00', 1, '//11/19/1604795.html', '', 0, 0, 0, 0, 1),(4, 1, '扫地机器人这个东西确实方便,大多数时候把房间扫的比较干净,但还有很多边边角角清扫不上,希望厂家能够在app上显示出机器人的路线图,明确告知哪些路段没有照顾到,要不然就再开发一个项目经理机器人,跟在扫地机器人屁股后面监督。//@大窑儿:可以弄个步数排行榜,让机器人们互相点赞,揣摩,攀比,内卷,无意义竞争。', '-11-19 00:00:00', 0, '', '', 0, 0, 0, 0, 1),(5, 0, '【世卫组织建议医生不要使用瑞德西韦治疗新冠】世卫组织指导小组表示,证据显示,瑞德西韦对提高新冠肺炎患者的存活率没有显著影响。这项建议发表在上周五的《英国医学杂志》中。', '-11-19 00:00:00', 0, '/newsDetail_forward_10067542', '', 0, 0, 0, 0, 1),(6, 0, '11月19日0—24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增确诊病例17例,均为境外输入病例(福建6例,上海4例,陕西3例,广东2例,北京1例,四川1例);无新增死亡病例;新增疑似病例1例,为本土病例(在天津)。', '-11-19 00:00:00', 0, '//11/20/ARTIIR9o72TuDF80s6hY2IvD20.shtml', '', 0, 0, 0, 0, 1);

四,go代码说明

1,main.go

package mainimport (_ "/jinzhu/gorm/dialects/mysql""/liuhongdi/digv01/global""/liuhongdi/digv01/router""log")func init() {err := global.SetupDBLink()if err != nil {log.Fatalf("init.setupDBEngine err: %v", err)}}func main() {//引入路由r := router.Router()//runr.Run(":8080")}

2,router/router.go

package routerimport ("/gin-gonic/gin""/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 controllerimport ("fmt""/gin-gonic/gin""/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 * pageSizearticles,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 serviceimport ("fmt""/liuhongdi/digv01/dao""/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 daoimport ("fmt""/liuhongdi/digv01/global""/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).Errorif (err != nil) {return nil,err} else {return articleOne,nil}}//查询总数func SelectcountAll() (int, error) {var count interr := global.DBLink.Where("isPublish=?",1).Count(&count).Errorif 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.Articlefor 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 modeltype Article struct {ArticleIdint64 `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 globalimport "/jinzhu/gorm"var (DBLink *gorm.DB)//连接到数据库func SetupDBLink() error {var err errorDBLink, 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 /liuhongdi/digv01go 1.15require (/gin-gonic/gin v1./jinzhu/gorm v1.9.16)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。