1.声明变量类型接收请求参数,然后绑定参数到结构体中c.ShouldBind(&ps)
func GetMaterialCard(c *gin.Context) {
// - 声明一个 ResourceFilter 类型的变量,用于接收HTTP请求参数
var ps pto.ResourceFilter
// - c.ShouldBind(&ps): 将HTTP请求中的参数自动绑定到 ps 结构体中
if err := c.ShouldBind(&ps); err != nil {
util.RspErr(c, def.ParamErrMsg)
return
}
}
2. gin.H的了解
// gin.H是map[string]interface{} 的类型别名
util.RspData(c, gin.H{
"split": map[string]interface{}{
"page": ps.PageNum,
"size": ps.ResNum,
"total": 0,
},
"list": []struct{}{},
})
3. 创建空的指针切片,用于存储最终的结果数据
cardList := make([]*MaterialCard, 0)
4. 数据转换循环
for _, v := range list {
item := new(MaterialCard)
err = json.Unmarshal([]byte(v.Info), item)
if err != nil {
util.LogrusBiz().WithFields(logrus.Fields{"id": v.ID, "info": v.Info, "err": err}).Error("UnmarshalErr")
return nil, 0, err
}
// 设置备注信息
item.Remark = resMap[v.ID].Remark
// 检查是否满足筛选条件
if isMaterialCardSatisfied(ps, item) {
// 添加到结果列表
cardList = append(cardList, item)
}
}
- for _, v := range list: 遍历基础数据列表
- item := new(MaterialCard): 创建新的 MaterialCard 实例
- json.Unmarshal([]byte(v.Info), item):
- 这是将 JSON 字符串 v.Info 解析为 MaterialCard 结构体
- 这是数据库将存储的 JSON 格式数据转换为 GO 结构体
- 错误处理,如果JSON解析失败,记录错误日志并返回