【Go实战 | 电商平台】(9) 展示商品

简介: 1. 展示商品1.1 路由接口注册GET请求获取商品列表

1. 展示商品

1.1 路由接口注册

GET请求获取商品列表

v1.GET("products", api.ListProducts)


1.2 接口函数编写

1.2.1 service层

创建一个展示商品的结构体

type ListProductsService struct {
  PageNum            int    `form:"pageNum"`
  PageSize           int    `form:"pageSize"`
  CategoryID    uint `form:"category_id" json:"category_id"`
}


创建该结构体下的列表方法

func (service *ListProductsService) List() serializer.Response {
  ...
}


1.2.2 api层

创建一个展示列表服务对象

listProductsService := service.ListProductsService{}


绑定数据

c.ShouldBind(&listProductsService)


调用展示商品列表对象下的展示方法

res := listProductsService.List()


返回上下文

c.JSON(200, res)


api层完整代码

func ListProducts(c *gin.Context) {
  listProductsService := service.ListProductsService{}
  if err := c.ShouldBind(&listProductsService); err == nil {
  res := listProductsService.List()
  c.JSON(200, res)
  } else {
  c.JSON(200, ErrorResponse(err))
  logging.Info(err)
  }
}

1.3 服务函数编写

创建一个商品列表模型对象

var products []model.Product


设置分页

if service.PageSize == 0 {
  service.PageSize = 15
}


如果分类传过来是0的话就返回所有的商品

if service.CategoryID == 0 {
  if err := model.DB.Model(model.Product{}).
    Count(&total).Error; err != nil {
    logging.Info(err)
    code = e.ErrorDatabase
    return serializer.Response{
    Status: code,
    Msg:    e.GetMsg(code),
    Error:  err.Error(),
    }
  }
  if err := model.DB.Offset((service.PageNum - 1) * service.PageSize).
    Limit(service.PageSize).Find(&products).
    Error; err != nil {
    logging.Info(err)
    code = e.ErrorDatabase
    return serializer.Response{
    Status: code,
    Msg:    e.GetMsg(code),
    Error:  err.Error(),
    }
  }


不为0的话,就返回对应分类的商品

if err := model.DB.Model(model.Product{}).Preload("Category").
    Where("category_id = ?", service.CategoryID).
    Count(&total).Error; err != nil {
    logging.Info(err)
    code = e.ErrorDatabase
    return serializer.Response{
    Status: code,
    Msg:    e.GetMsg(code),
    Error:  err.Error(),
    }
  }


序列化返回所有的商品,注意要返回所有商品的总数

for _, item := range products {
  products := serializer.BuildProduct(item)
  productList = append(productList, products)
  }
return serializer.BuildListResponse(serializer.BuildProducts(products), uint(total))

1.4 验证服务

发送请求

image.png


获取响应

image.png


相关文章
|
15天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
1天前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
25天前
|
消息中间件 缓存 Kafka
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
|
24天前
|
消息中间件 SQL 关系型数据库
go-zero微服务实战系列(十、分布式事务如何实现)
go-zero微服务实战系列(十、分布式事务如何实现)
|
24天前
|
消息中间件 NoSQL Kafka
go-zero微服务实战系列(九、极致优化秒杀性能)
go-zero微服务实战系列(九、极致优化秒杀性能)
|
API Go 数据库
【Go实战 | 电商平台】(11) 更新商品
文章目录 1. 更新商品 1.1 路由接口注册 1.2 接口函数编写 1.2.1 service层 1.2.2 api层 1.3 服务函数编写 1.4 验证服务
124 0
【Go实战 | 电商平台】(11) 更新商品
|
10天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
40 10
|
9天前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
10天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
34 10
|
10天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。