文章目录
- 一、建立路由
 - 二、开发GetPostDetailHandler
 - 三、编写logic
 - 四、编写dao层
 - 五、编译测试运行
 
 
 
一、建立路由
router/route.go
	v1.GET("/post/:id", controller.GetPostDetailHandler)
 
二、开发GetPostDetailHandler
controller/post.go
func GetPostDetailHandler(c *gin.Context) {
	postIdStr := c.Param("id")
	postId, err := strconv.ParseInt(postIdStr, 10, 64)
	if err != nil {
		zap.L().Error("get post detail with invalid param", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	data, err := logic.GetPostById(postId)
	if err != nil {
		zap.L().Error("logic.GetPostById() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	ResponseSuccess(c, data)
 
三、编写logic
logic/post.go
package logic
import (
	"bluebell/dao/mysql"
	"bluebell/models"
	"go.uber.org/zap"
)
// GetPostById 根据帖子id查询帖子详情数据
func GetPostById(pid int64) (data *models.ApiPostDetail, err error) {
	// 查询并组合我们接口想用的数据
	post, err := mysql.GetPostById(pid)
	if err != nil {
		zap.L().Error("mysql.GetPostById(pid) failed",
			zap.Int64("pid", pid),
			zap.Error(err))
		return
	}
	// 根据作者id查询作者信息
	user, err := mysql.GetUserById(post.AuthorId)
	fmt.Println(user.UserId, user.Username, *user)
	if err != nil {
		zap.L().Error("mysql.GetUserById(post.AuthorID) failed",
			zap.Int64("author_id", post.AuthorId),
			zap.Error(err))
		return
	}
	// 根据社区id查询社区详细信息
	community, err := mysql.GetCommunityDetailByID(post.CommunityId)
	if err != nil {
		zap.L().Error("mysql.GetUserById(post.AuthorID) failed",
			zap.Int64("community_id", post.CommunityId),
			zap.Error(err))
		return
	}
	// 接口数据拼接
	data = &models.ApiPostDetail{
		AuthorName: user.Username,
		Post:       post,
		Community:  community,
	}
	return
}
 
四、编写dao层
mysql/post.go:增加获取帖子详情函数
func GetPostById(id int64) (*models.Post, error) {
	post := &models.Post{}
	err := db.Where("id = ?", id).Find(&post).Error
	return post, err
}
 
五、编译测试运行




















