【Go实战 | 电商平台】(10) 搜索商品

简介: 文章目录1. 搜索商品1.1 路由接口注册1.2 接口函数编写1.2.1 service层1.2.2 api层1.3 服务函数编写1.4 验证服务

文章目录

1. 搜索商品

1.1 路由接口注册

1.2 接口函数编写

1.2.1 service层

1.2.2 api层

1.3 服务函数编写

1.4 验证服务

1. 搜索商品

1.1 路由接口注册

v1.POST("products", api.SearchProducts)

1.2 接口函数编写

1.2.1 service层

定义一个搜索商品的服务结构体

结构体中的info就是传送过来的要搜索商品的信息

type SearchProductsService struct {
  Info string `form:"info" json:"info"`
  PageNum            int    `form:"pageNum"`
  PageSize           int    `form:"pageSize"`
}


定义这个结构体的搜索方法

func (service *SearchProductsService) Search() serializer.Response {
  ...
}


1.2.2 api层

定义搜索商品服务的对象

searchProductsService := service.SearchProductsService{}


绑定这个结构对象到上下文中

c.ShouldBind(&searchProductsService)


调用商品服务对象下的搜索方法

res := searchProductsService.Search()


上下文返回

c.JSON(200, res)


完整代码

func SearchProducts(c *gin.Context) {
  searchProductsService := service.SearchProductsService{}
  if err := c.ShouldBind(&searchProductsService); err == nil {
    res := searchProductsService.Search()
    c.JSON(200, res)
  } else {
    c.JSON(200, ErrorResponse(err))
    logging.Info(err)
  }
}

1.3 服务函数编写

定义商品模型对象列表

var products []model.Product
  code := e.SUCCESS

如果传送过来的是页数是0的话,就默认是15

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

LIKE对数据库进行模型搜索

err := model.DB.Where("name LIKE ?", "%"+service.Info+"%").
  Offset((service.PageNum - 1) * service.PageSize).
  Limit(service.PageSize).Find(&products).Error


返回数据

return serializer.Response{
  Status: code,
  Data:   serializer.BuildProducts(products),
  Msg:    e.GetMsg(code),
  }

1.4 验证服务

商品请求

image.png

响应返回

image.png

相关文章
|
13天前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
13天前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
28 2
|
13天前
|
JSON JavaScript 前端开发
Golang深入浅出之-Go语言JSON处理:编码与解码实战
【4月更文挑战第26天】本文探讨了Go语言中处理JSON的常见问题及解决策略。通过`json.Marshal`和`json.Unmarshal`进行编码和解码,同时指出结构体标签、时间处理、omitempty使用及数组/切片区别等易错点。建议正确使用结构体标签,自定义处理`time.Time`,明智选择omitempty,并理解数组与切片差异。文中提供基础示例及时间类型处理的实战代码,帮助读者掌握JSON操作。
24 1
Golang深入浅出之-Go语言JSON处理:编码与解码实战
|
13天前
|
前端开发 JavaScript Go
Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo
Wails 框架提供了一种简洁而强大的方式,让开发者能够利用 Go 的性能优势和 Web 前端的灵活性,从而能够使用更高效、更轻量级的方法来构建跨平台的桌面应用。本文探讨 Wails 框架的使用,从搭建环境到开发,再到最终的构建打包。
63 1
Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo
|
13天前
|
存储 安全 编译器
掌握Go语言:精通Go语言范围(range),高级应用及进销存系统实战(25)
掌握Go语言:精通Go语言范围(range),高级应用及进销存系统实战(25)
|
13天前
|
Go C语言 索引
掌握Go语言:探索Go语言中的循环奇妙世界,从基础到实战(13)
掌握Go语言:探索Go语言中的循环奇妙世界,从基础到实战(13)
|
13天前
|
设计模式 缓存 安全
一篇文章带你吃透Go语言的Atomic和Channel--实战方法
一篇文章带你吃透Go语言的Atomic和Channel--实战方法
34 0
|
Go
Go实战(一)-概述
Go实战(一)-概述
90 0
Go实战(一)-概述
|
5天前
|
存储 算法 Go
go语言中的延迟执行函数
【5月更文挑战第13天】`defer`是Go语言中用于延迟执行函数的关键字,尤其适用于资源管理,如文件关闭和锁的释放。它在函数返回前按照LIFO顺序执行,确保资源在任何返回路径下都能正确释放。`defer`可以拦截`panic`并在函数返回前执行,但无法阻止某些致命的`panic`。此外,`defer`可用于修改返回值、输出调试信息和还原变量值。尽管在某些场景下可能影响性能,但Go的优化使得其在多数情况下性能表现良好,特别是在资源清理方面。在Go 1.20及以后的版本,`defer`的性能已显著提升,尤其是在高计算量的场景下。
231 2
|
1天前
|
编译器 Go
Go 语言基础语法
Go 语言基础语法
9 1