package model import "github.com/codinl/go-logger" // gen:qs // //go:generate goqueryset -in mall_cart.go type MallCart struct { Model Uid uint64 `json:"uid" gorm:"index"` GoodsId uint32 `json:"goods_id"` // 商品id Count uint32 `json:"count"` // 数量 GoodsInfo Goods `json:"goods_info" gorm:"-"` } type MallCartAddReq struct { GoodsId uint32 `json:"goods_id"` AddType uint32 `json:"add_type"` // 1-加 2-减 } type MallCartListReq struct { PageNum int `json:"page_num"` PageSize int `json:"page_size"` } type MallCartListResp struct { List []MallCart `json:"list"` Total int `json:"total"` PageNum int `json:"page_num"` } type MallCartDel struct { MallCartIds []uint32 `json:"mall_cart_ids"` } // MallCartList 封装商城购物车列表查询 func MallCartList(uid uint32, pageNum, pageSize int) (*MallCartListResp, error) { resp := &MallCartListResp{ PageNum: pageNum, List: []MallCart{}, // 初始化为空列表,避免返回 nil } // 默认分页参数 page := pageNum - 1 if page < 0 { page = 0 } if pageSize <= 0 { pageSize = 10 } qs := NewMallCartQuerySet(DB).UidEq(uint64(uid)) // 获取总数 count, err := qs.Count() if err != nil { logger.Error("err:", err) return resp, err } if count == 0 { resp.Total = 0 return resp, nil } // 计算总页数 resp.Total = (count + pageSize - 1) / pageSize // 向上取整 // 分页查询 var mallCarts []MallCart err = qs.OrderDescByID().Offset(page * pageSize).Limit(pageSize).All(&mallCarts) if err != nil && err != RecordNotFound { logger.Error("err:", err) return resp, err } if len(mallCarts) == 0 { return resp, nil } // 收集商品 ID ids := make([]uint32, 0, len(mallCarts)) for _, v := range mallCarts { ids = append(ids, v.GoodsId) } // 查询商品信息(避免 ids 为空) if len(ids) > 0 { var goodsList []Goods err = NewGoodsQuerySet(DB).GoodsIdIn(ids...).All(&goodsList) if err != nil && err != RecordNotFound { logger.Error("err:", err) return resp, err } // 建立 map goodsMap := make(map[uint32]Goods, len(goodsList)) for _, g := range goodsList { goodsMap[g.GoodsId] = g } // 绑定商品信息 for i := range mallCarts { if g, ok := goodsMap[mallCarts[i].GoodsId]; ok { mallCarts[i].GoodsInfo = g } } } resp.List = mallCarts return resp, nil }