首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >《仿盒马》app开发技术分享-- 首页商品流(7)

《仿盒马》app开发技术分享-- 首页商品流(7)

原创
作者头像
用户10696402
发布于 2025-06-23 10:25:48
发布于 2025-06-23 10:25:48
2710
举报

## 技术栈

Appgallery connect

## 开发准备

上一节我们实现了首页banner模块的功能,现在我们的首页还需要添加商品列表,作为一个购物类应用,商品列表是非常重要的一个模块,所以我们尽量把它设计的足够完善,参数能更好的支持我们后期复杂的逻辑,它需要有图片的展示,适配的优惠券列表,限购,立减,划线价等,但他实际的参数还要更多,因为我们的列表是比较紧凑的,更多的数据需要从点击后的商品详情页展示出来。

**代码实现**

创建商品表

{

"objectTypeName": "home_product_list",

"fields": [

{"fieldName": "id", "fieldType": "Integer", "notNull": true, "belongPrimaryKey": true},

{"fieldName": "goods_list_id", "fieldType": "Integer", "notNull": true, "defaultValue": 0},

{"fieldName": "url", "fieldType": "String"},

{"fieldName": "name", "fieldType": "Text"},

{"fieldName": "price", "fieldType": "Double"},

{"fieldName": "original_price", "fieldType": "Double"},

{"fieldName": "amount", "fieldType": "Integer"},

{"fieldName": "text_message", "fieldType": "String"},

{"fieldName": "parameter", "fieldType": "String"},

{"fieldName": "delivery_time", "fieldType": "String"},

{"fieldName": "endTime", "fieldType": "String"},

{"fieldName": "sales_volume", "fieldType": "Integer"},

{"fieldName": "space_id", "fieldType": "Integer"},

{"fieldName": "max_loop_amount", "fieldType": "Integer"},

{"fieldName": "promotion_spread_price", "fieldType": "Double"},

{"fieldName": "coupon_id", "fieldType": "Integer"}

],

"indexes": [

{"indexName": "field1IndexId", "indexList": [{"fieldName":"id","sortType":"ASC"}]}

],

"permissions": [

{"role": "World", "rights": ["Read"]},

{"role": "Authenticated", "rights": ["Read", "Upsert"]},

{"role": "Creator", "rights": ["Read", "Upsert", "Delete"]},

{"role": "Administrator", "rights": ["Read", "Upsert", "Delete"]}

]

}

填充数据

{

"cloudDBZoneName": "default",

"objectTypeName": "home_product_list",

"objects": [

{

"id": 10,

"goods_list_id": 1,

"url": "在线图片链接",

"name": "红颜草莓",

"price": 10.5,

"original_price": 18.5,

"amount": 10,

"text_message": "特价",

"parameter": "冷藏",

"delivery_time": "付款后24小时内发货",

"endTime": "直降 | 结束时间2025年5月18日 10:00",

"sales_volume": 9812,

"space_id": 10,

"max_loop_amount": 10,

"promotion_spread_price": 5,

"coupon_id": 10

},

{

"id": 20,

"goods_list_id": 1,

"url": "在线图片链接",

"name": "麒麟瓜",

"price": 2.8,

"original_price": 5.9,

"amount": 1,

"text_message": "当季新品",

"parameter": "冷藏",

"delivery_time": "付款后24小时内发货",

"endTime": "直降 | 结束时间2025年5月18日 10:00",

"sales_volume": 9812,

"space_id": 11,

"max_loop_amount": 10,

"promotion_spread_price": 0,

"coupon_id": 10

}

]

}

我们接下来进行数据的查询

@State homeProduct:HomeProductList[]=[]//商品流数据

let databaseZone = cloudDatabase.zone('default');

let home_product=new cloudDatabase.DatabaseQuery(home_product_list);

let list7 = await databaseZone.query(home_product);

let json7 = JSON.stringify(list7)

let data7:HomeProductList[]= JSON.parse(json7)

this.homeProduct=data7

数据查出完成后,完善商品流的页面

import { HomeProductList } from "../entity/home_product_list"

@Component

@Preview

export struct WaterFlowGoods {

@Link goodsList: Array<HomeProductList>

@State columns: number = 2

build() {

WaterFlow() {

ForEach(this.goodsList, (item:HomeProductList, index) => {

FlowItem() {

Column() {

Image(item.url)

.width('100%')

.aspectRatio(1)

.objectFit(ImageFit.Cover)

.borderRadius({topLeft:10,topRight:10})

Column() {

Text(item.name)

.fontSize(16)

.fontColor('#333')

.margin({ bottom: 4 })

Text(item.text_message)

.fontSize(12)

.fontColor('#666')

.margin({ bottom: 8 })

Text("最高立减"+item.promotion_spread_price)

.fontSize(12)

.fontColor('#ffffff')

.visibility(item.promotion_spread_price>0?Visibility.Visible:Visibility.None)

.margin({ bottom: 8 })

.padding({left:5,right:5,top:2,bottom:2})

.linearGradient({

angle:90,

colors: [[0xff0000, 0], [0xff6666, 0.2], [0xff6666, 1]]

})

Row(){

Text("限购")

.width(40)

.fontSize(12)

.borderRadius(20)

.backgroundColor("#FB424C")

.padding(3)

.textAlign(TextAlign.Center)

Text("每人限购"+item.max_loop_amount+"件")

.margin({left:5})

.fontSize(12)

.fontColor("#FB424C")

}

.borderRadius(20)

.padding({top:2,bottom:2,right:10})

.backgroundColor("#FEE3E3")

.visibility(item.amount>0?Visibility.Visible:Visibility.None)

Row() {

Text(){

Span("¥")

.fontColor(Color.Red)

.fontSize(14)

Span(String(item.price))

.fontSize(16)

.fontColor(Color.Red)

}

Text(String(item.original_price))

.fontSize(12)

.fontColor('#999')

.decoration({

type: TextDecorationType.LineThrough,

color: Color.Gray

})

.margin({left:10})

Blank()

Column() {

Image($r('app.media.cart'))

.width(20)

.height(20)

}

.justifyContent(FlexAlign.Center)

.width(36)

.height(36)

.backgroundColor("#ff2bd2fa")

.borderRadius(18)

}

.margin({top:10})

.width('100%')

.justifyContent(FlexAlign.SpaceBetween)

}

.alignItems(HorizontalAlign.Start)

.padding(12)

}

.backgroundColor(Color.White)

.borderRadius(12)

.onClick(() => {

})

}

.margin({ bottom: 12 })

})

}

.padding(10)

.columnsTemplate('1fr 1fr')

.columnsGap(12)

.onAreaChange((oldVal, newVal) => {

this.columns = newVal.width > 600 ? 2 : 1

})

}

}

然后在首页调用,传入参数

WaterFlowGoods({goodsList:this.homeProduct})

到这里我们就实现了首页商品列表的内容

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档