17.获取帖子列表

文章目录

  • 一、建立帖子表结构并插入一些测试数据
  • 二、通过SQL建立对应的数据模型
  • 三、建立路由
  • 四、开发GetPostListHandler
  • 五、编写logic
  • 六、编写dao层
  • 七、编译测试运行

在这里插入图片描述

一、建立帖子表结构并插入一些测试数据

create table post
(id           bigint auto_increment primary key,post_id      bigint                              not null comment '帖子id',title        varchar(128)                        not null comment '标题',content      varchar(8192)                       not null comment '内容',author_id    bigint                              not null comment '作者的用户id',community_id bigint                              not null comment '所属社区',status       tinyint   default 1                 not null comment '帖子状态',create_time  timestamp default CURRENT_TIMESTAMP null comment '创建时间',update_time  timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',constraint idx_post_id unique (post_id)
) collate = utf8mb4_general_ci;create index idx_author_id on post (author_id);create index idx_community_id on post (community_id);INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (1, 14283784123846656, '学习使我快乐', '只有学习才能变得更强', 28018727488323585, 1, 1, '2024-03-09 09:58:39', '2024-03-09 09:58:39');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (2, 14373128436191232, 'CSGO开箱子好上瘾', '花了钱不出金,我好气啊', 28018727488323585, 2, 1, '2024-03-09 15:53:40', '2024-03-09 15:53:40');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (3, 14373246019309568, 'IG牛逼', '打得好啊。。。', 28018727488323585, 3, 1, '2024-03-09 15:54:08', '2024-03-09 15:54:08');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (4, 19432670719119360, '投票功能真好玩', '12345', 28018727488323585, 2, 1, '2024-03-23 14:58:29', '2024-03-23 14:58:29');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (5, 19433711036534784, '投票功能真好玩2', '12345', 28018727488323585, 2, 1, '2024-03-23 15:02:37', '2024-03-23 15:02:37');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (6, 19434165682311168, '投票功能真好玩2', '12345', 28018727488323585, 2, 1, '2024-03-23 15:04:26', '2024-03-23 15:04:26');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (7, 21810561880690688, '看图说话', '4321', 28018727488323585, 2, 1, '2024-03-30 04:27:23', '2024-03-30 04:27:23');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (8, 21810685746876416, '永远不要高估自己', '做个普通人也挺难', 28018727488323585, 3, 1, '2024-03-30 04:27:52', '2024-03-30 04:27:52');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (9, 21810865955147776, '你知道泛型是什么吗?', '不知道泛型是什么却一直在问泛型什么时候出', 28018727488323585, 1, 1, '2024-03-30 04:28:35', '2024-03-30 04:28:35');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (10, 21810938202034176, '国庆假期哪里玩?', '走遍四海,还是威海。', 28018727488323585, 1, 1, '2024-03-30 04:28:52', '2024-03-30 04:28:52');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (11, 1, 'test', 'just for test', 1, 1, 1, '2024-03-12 14:03:18', '2024-03-12 14:03:18');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (12, 92636388033302528, 'test', 'just a test', 1, 1, 1, '2024-03-12 15:03:56', '2024-03-12 15:03:56');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (13, 92636388142354432, 'test', 'just a test', 1, 1, 1, '2024-03-12 15:03:56', '2024-03-12 15:03:56');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (15, 123, 'test', 'just a test', 1, 1, 1, '2024-03-13 03:31:50', '2024-03-13 03:31:50');
INSERT INTO post (id, post_id, title, content, author_id, community_id, status, create_time, update_time) VALUES (16, 10, 'test', 'just a test', 123, 1, 1, '2024-03-13 04:12:44', '2024-03-13 04:12:44');select * from post;

在这里插入图片描述

二、通过SQL建立对应的数据模型

由于返回给前端的字段不完全和DB一样了,需要返回作者名字和社区详情,所以我们还需要额外定义一个ApiPostDetail结构体(实际工作中,DB模型,路由request和response应该分别是三个结构体的)

models/post.go

package modelsimport "time"type Post struct {ID          int64     `gorm:"column:id" db:"id" json:"id" form:"id"`PostId      int64     `gorm:"column:post_id" db:"post_id" json:"post_id" form:"post_id"`                     //  帖子idTitle       string    `gorm:"column:title" db:"title" json:"title" form:"title"`                             //  标题Content     string    `gorm:"column:content" db:"content" json:"content" form:"content"`                     //  内容AuthorId    int64     `gorm:"column:author_id" db:"author_id" json:"author_id" form:"author_id"`             //  作者的用户idCommunityId int64     `gorm:"column:community_id" db:"community_id" json:"community_id" form:"community_id"` //  所属社区Status      int64     `gorm:"column:status" db:"status" json:"status" form:"status"`                         //  帖子状态CreateTime  time.Time `gorm:"column:create_time" db:"create_time" json:"create_time" form:"create_time"`     //  创建时间UpdateTime  time.Time `gorm:"column:update_time" db:"update_time" json:"update_time" form:"update_time"`     //  更新时间
}func (Post) TableName() string {return "post"
}// 这里将帖子路由需要相关request和response也定义一下
// 因为Post结构中只有社区id和作者id,但是需要展示为作者名字和社区详情
// ApiPostDetail 帖子详情接口的结构体
type ApiPostDetail struct {AuthorName string             `json:"author_name"` // 作者VoteNum    int64              `json:"vote_num"`    // 投票数*Post                         // 嵌入帖子结构体*Community `json:"community"` // 嵌入社区信息
}

三、建立路由

router/route.go

	v1.GET("/posts", controller.GetPostListHandler)

四、开发GetPostListHandler

controller/post.go

func GetPostListHandler(c *gin.Context) {// 获取分页参数,由于其他handler可能也有获取分页参数的诉求,故封装为函数page, size := getPageInfo(c)// 从DB获取数据data, err := logic.GetPostList(page, size)if err != nil {zap.L().Error("logic.GetPostList() failed", zap.Error(err))ResponseError(c, CodeServerBusy)return}ResponseSuccess(c, data)}

由于其他handler可能也有获取分页参数的诉求,故封装为函数

controller/request.go

// 获取分页参数
func getPageInfo(c *gin.Context) (int64, int64) {pageStr := c.Query("page")sizeStr := c.Query("size")var (page int64size int64err  error)page, err = strconv.ParseInt(pageStr, 10, 64)if err != nil {page = 1 // 默认第一页}size, err = strconv.ParseInt(sizeStr, 10, 64)if err != nil {size = 10 // 默认一页10条}return page, size
}

五、编写logic

logic/post.go

package logicimport ("bluebell/dao/mysql""bluebell/models""go.uber.org/zap"
)// GetPostList 获取帖子列表
func GetPostList(page, size int64) (data []*models.ApiPostDetail, err error) {posts, err := mysql.GetPostList(page, size)if err != nil {zap.L().Error("get post list failed", zap.Error(err))return nil, err}data = make([]*models.ApiPostDetail, 0, len(posts))for _, post := range posts {// 根据作者id查询作者名字user, err := mysql.GetUserById(post.AuthorId)if err != nil {zap.L().Error("mysql.GetUserById(post.AuthorID) failed",zap.Int64("author_id", post.AuthorId),zap.Error(err))continue}// 根据社区id查询社区信息community, err := mysql.GetCommunityDetailByID(post.CommunityId)if err != nil {zap.L().Error("mysql.GetCommunityDetailByID(post.CommunityId) failed",zap.Int64("community_id", post.CommunityId),zap.Error(err))continue}postDetail := &models.ApiPostDetail{AuthorName: user.Username,VoteNum:    0,Post:       post,Community:  community,}data = append(data, postDetail)}return data, nil
}

六、编写dao层

mysql/post.go:增加获取帖子列表函数

package mysqlimport "bluebell/models"func GetPostList(page, size int64) ([]*models.Post, error) {posts := make([]*models.Post, 0)err := db.Model(models.Post{}).Offset(int((page - 1) * size)).Limit(int(size)).Find(&posts).Errorif err != nil {return nil, err}return posts, nil
}

mysql/user.go:增加通过作者ID获取作者详情函数

func GetUserById(id int64) (*models.User, error) {user := &models.User{}err := db.Where("user_id = ?", id).Find(&user).Errorreturn user, err}

七、编译测试运行

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/537266.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql 死锁案例4-delete 相邻记录导致死锁

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10),(15,15,15) 事务1事…

easyrecovery破解版百度云(含Mac/Win版)以及EasyRecovery可以恢复哪些设备

软件介绍 当不小心将回收站的文件删除了怎么办?想找回但是不知道怎么找回需要的数据文件?别担心今天小编就为大家介绍一款非常专业的电脑数据文件恢复工具,easyrecovery14是由Ontrack专为电脑用户推出的一款专业的数据恢复软件&…

Go——数组

Golang Array和以往认知的数组有很大的。 数组是同一种数据类型的固定长度的序列。数组定义:var a[len] int,比如:var a [5]int,数组长度必须是常量,且类型的组成部分。一旦定义,长度不能变。长度是数组类…

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播 SV-704XT是深圳锐科达电子有限公司的一款壁挂式网络有源号角,具有10/100M以太网接口,可将网络音源通过自带的功放和号角喇叭输出播放,可达到功率50W。SV-704XT内置有…

机器学习模型—随机森林

机器学习模型—随机森林 随机森林(Random Forest)是由斯坦福大学教授Tin Kam Ho在1995年提出的一种组合学习模型。它可以用于分类和回归任务,并在很多现实世界的问题中表现出优异的性能。 随机森林本质上是通过构建多颗决策树,然后将单个树的预测结果进行组合,从而获得更加准…

Cesium--基于材质旋转图片

材质部分的代码如下 // 自定义材质const customMaterial new Cesium.Material({translucent: true,fabric: {uniforms: {image:circle_img,speed:30.0,},source: czm_material czm_getMaterial(czm_materialInput materialInput){czm_material material czm_getDefaultMateri…

【软考高项】四、信息化发展之数字中国

1、数字经济 定义:从本质上看,数字经济是一种新的技术经济范式,它建立在信息与通信技术的重大突破的基础上,以数字技术与实体经济融合驱动的产业梯次转型和经济创新发展的主引擎,在基础设施、生产要素、产业结构和治理…

opencv-python连通域分割connectedComponents

文章目录 连通域简介绘图代码函数说明 连通域简介 所谓连通域,即Connected Component,是一组彼此相连的像素点的集合,这些像素点彼此之间可以假设一条互相链接的路径,路径上所有像素的灰度一致,或者符合某个特定的条件…

HCIP —— BGP 路径属性 (上)

目录 BGP 路径属性 1.优选Preferred-Value属性值最大的路由 2.优选Local-preference 属性数值大的路由 3.本地始发的BGP路由优先于其他对等体处学习到的路由。 4..优选AS_PATH属性值最短的路由 BGP 路径属性 BGP的路由选路是存在优选规则的,下图为华为官网提供…

腾讯云服务器“地域”这么选就对了!

腾讯云服务器地域怎么选择?不同地域之间有什么区别?腾讯云哪个地域好?地域选择遵循就近原则,访客距离地域越近网络延迟越低,速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素,地域节点选择…

【django framework】ModelSerializer+GenericAPIView,如何在提交前修改某些字段值

【django framework】ModelSerializerGenericAPIView,如何在提交前修改某些字段值 我们经常会遇到下面这种情况: 序列化器用的是ModelSerializer,写视图的时候继承的是generics.CreateAPIView。现在我想在正式提交到数据库(perform_create)之…

Python算法(列表排序)

一。冒泡排序: 列表每两个相邻的数,如果前面比后面大,则交换这两个数 一趟排序完成后,则无序区减少一个数,有序区增加一个数 时间复杂度:O(n*n) 优化后:已经排序好后立马停止,加快…