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 models

import "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"`                     //  帖子id
	Title       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"`             //  作者的用户id
	CommunityId 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 int64
		size int64
		err  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 logic

import (
	"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 mysql

import "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).Error
	if 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).Error
	return user, err

}

七、编译测试运行

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈如何自我实现一个消息队列服务器(2)——细节详解

文章目录 一、实现 broker server 服务器1.1 创建一个SpringBoot项目1.2 创建Java类 二、硬盘持久化存储 broker server 里的数据2.1 数据库存储2.1.1 浅谈SQLiteMyBatis 2.1.2 如何使用SQLite 2.2 文件存储 三、将broker server 里的数据存储在内存上四、使用DataBaseManager类…

机器视觉引导的多材料3D打印

3D打印机使用机器视觉来解决困扰3D喷墨打印机的问题,增加了可以使用的材料范围,并实现了机器人手等复杂物体的快速生产。 增材制造(也称为 3D 打印)的进步已经产生了越来越强大的能力,可以生产使用传统制造工艺无法制…

IT系统可观测性

什么是可观测性 可观测性(Observability)是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域,它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

QT----基于QT的人脸考勤系统

目录 1 编译opencv库1.1 下载源代码1.2 qt编译opencv1.3 执行Cmake一直卡着data: Download: face_landmark_model.dat 2 编译SeetaFace2代码2.1 遇到报错By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has2.2遇到报错Model missing 3 测试…

Git——GitHub远端协作详解

目录 Git&GitHub1、将内容Push到GitHub上1.1、在GitHub上创建新项目1.2、upstream1.3、如果不想要相同的分支名称 2、Pull下载更新2.1、Fetch指令2.2、Fetch原理2.3、Pull指令2.4、PullRebase 3、为什么有时候推不上去3.1、问题复现3.2、解决方案一:先拉再推3.3…

kerberos验证协议安装配置使用

一、kerberos是什么 Kerberos 是一个网络身份验证协议,用于在计算机网络中进行身份验证和授权。它提供了一种安全的方式,允许用户在不安全的网络上进行身份验证,并获取访问网络资源的权限。 二、安装配置kerberos服务端 1、安装kerberos #检…

行尾检测论文汇总

文章目录 2023GNSS-Free End-of-Row Detection and Headland Maneuvering for Orchard Navigation Using a Depth Camera 2023 GNSS-Free End-of-Row Detection and Headland Maneuvering for Orchard Navigation Using a Depth Camera 摘要: 果园中基于GPS的导航…

Vue3学习日记 Day1

一、简介 1、简介 Vue3是新的默认版本,拥有更快的速度,更好的语法 二、使用create-vue搭建Vue3项目 1、创建项目 1、介绍 create-vue是Vue官方新的脚手架工具,底层切换为了vite,为开发提供极速响应 2、使用 2.1、确定环境条件 2…

共谋企业出海新篇章纷享销客荣获数字中国企业峰会“卓越成果奖”

3月9日,2024数字中国企业峰会在杭州西湖中维香溢大酒店成功举办,众多数字化领域专家、知名企业 CIO 代表到场。峰会旨在推动数字化转型与创新发展,为企业出海和国际合作搭建交流与合作的平台。本次峰会的颁奖环节,纷享销客凭借其卓…

阿里云服务器centos安装msf教程

msf官方命令行一键安装 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && chmod 755 msfinstall && ./msfinstall 稍微等待几分钟即可安装成功&am…

Django生命周期

Django请求的生命周期是指:当用户在浏览器上输入url到用户看到网页的这个时间段内,Django后台所发生的事情。 一、生命周期流程图 首先,用户在浏览器中输入url,发送一个GET/POST方法的request请求。Django中封装了socket的WSGi服务器,监听端口接受这个request 请求再进行初…

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

文章作者:ajun 随着文档处理需求的增加,格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性,将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件,提供了这样的转换功…

主键约束

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 主键约束可以看成是非空约束再加上唯一约束 也就是说设置为主键列,不能为空,不能重复 像一般用户编号是不可能重复的,也不可能为空的 …

07|链(下):想学“育花”还是“插花”用RouterChain确定客户意图

任务设定 鲜花养护(保持花的健康、如何浇水、施肥等)鲜花装饰(如何搭配花、如何装饰场地等) 如果接到的是第一类问题,你要给ChatBot A指示;如果接到第二类的问题,你要给ChatBot B指示。 整体…

U盘变身“本地磁盘”?数据恢复与防范策略大揭秘

一、突发状况:U盘秒变“本地磁盘” 在日常工作生活中,U盘凭借其便携性和大容量,成为我们存储和传输数据的重要工具。然而,有时我们会遇到这样一个棘手的问题:原本应显示为可移动磁盘的U盘,在插入电脑后却突…

Linux之shell变量

华子目录 什么是变量?变量的名称示例 变量的类型变量的定义示例 自定义变量查看变量(自定义变量和全局变量) 环境变量定义环境变量(全局变量)法一法二法三env,printenv,export注意 C语言与shell…

苹果谷歌,要联手反攻了

一则消息,让苹果、谷歌的夜盘股价一度分别暴拉1.5、3.5%,谷歌盘前甚至飙升超过5.5%,引发市场一阵轰动。 据知情人士透露,苹果公司正在谈判将谷歌的Gemini人工智能引擎植入iPhone,希望获得Gemini的授权,为今…

蓝桥杯练习题——贡献法(隔板法)

1.孤独的照片 思路 孤独的区间一定有一头孤独的牛&#xff0c;考虑每头牛对区间的贡献是多少 #include<iostream> using namespace std; const int N 5e5 10; int n; string s;int main(){cin>>n>>s;long long res 0;for(int i 0; i < n; i){int l…

吴恩达深度学习环境本地化构建wsl+docker+tensorflow+cuda

Tensorflow2 on wsl using cuda 动机环境选择安装步骤1. WSL安装2. docker安装2.1 配置Docker Desktop2.2 WSL上的docker使用2.3 Docker Destop的登陆2.4 测试一下 3. 在WSL上安装CUDA3.1 Software list needed3.2 [CUDA Support for WSL 2](https://docs.nvidia.com/cuda/wsl-…

聊聊AI时代学习这件事本身应该发生什么样的变化

随着 AI 大模型 的爆发&#xff0c;我们身处这个时代&#xff0c;应该怎么样去学习去了解这些前言的技术&#xff1f;可能很多人会说我英文不好&#xff0c;我算法不行&#xff0c;无法深入去了解 AI 大模型相关的知识吧&#xff1f; 没关系&#xff0c;其实博主也跟大家一样&…