《仿盒马》app开发技术分享-- 购物车基础功能实现(13)

简介: 上一节我们实现了加入购物车和购物车列表的简单展示。对一个电商类的应用来说,这很显然是不够的,我们的购物车内容应该更加的丰富,他需要用户能自主的去选择想要结算的商品,删除一些不需要的商品,或者取消掉一些本次不结算的商品,同时根据选择的不同,我们需要把相对应的价格和选择的数量等信息传递给用户,帮助用户节省更多的时间。

技术栈

Appgallery connect

开发准备

上一节我们实现了加入购物车和购物车列表的简单展示。对一个电商类的应用来说,这很显然是不够的,我们的购物车内容应该更加的丰富,他需要用户能自主的去选择想要结算的商品,删除一些不需要的商品,或者取消掉一些本次不结算的商品,同时根据选择的不同,我们需要把相对应的价格和选择的数量等信息传递给用户,帮助用户节省更多的时间。

功能分析

1.商品选中
在表中我们定义了多个参数来帮助我们更好的去实现功能,这里我们需要用到这些参数来进行条件判断,当商品选中和未选中时候我们需要修改数据源中isNeedPay的状态的,然后渲染列表,以这样的方式去实现。

2.商品加减
商品的新增和减少我们也需要针对数据源进行操作,增减我们会控制事先预留的buyAmount字段进行加减,同时要对数据做好判断,不要出现减为负数的情况,同时增减都要刷新列表对应条目的状态

3.商品删除
商品删除我们使用ListItem的swipeAction 去实现,我们只需要定义好删除的ui样式,把相关逻辑写到点击事件中即可

4.价格计算
计算选中商品的价格和数量,并且在选中和增减的事件里调用,只要状态变化价格就要有对应的变化。

代码实现

import { CartProductList } from "../entity/CartProductList"
import { cloudDatabase } from "@kit.CloudFoundationKit";
import { cart_product_list } from "../clouddb/cart_product_list";
import { hilog } from "@kit.PerformanceAnalysisKit";
import showToast from "../utils/ToastUtils";

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

@Preview
@Component
export struct CartList {

@State productList:CartProductList[]=[]

@State flag:boolean=false

@State checkCount:number=0
@State allPrice:number=0
@State allOriginalPrice:number=0

private scroller: ListScroller = new ListScroller();
async aboutToAppear(): Promise {

let condition = new cloudDatabase.DatabaseQuery(cart_product_list);
let listData = await databaseZone.query(condition);
let json = JSON.stringify(listData)
this.productList= JSON.parse(json)
hilog.info(0x0000, 'testTag', `Succeeded in upserting data, result: ${listData}`);
this.getCountPrice()
this.flag=true

}
@Builder itemEnd(item:CartProductList) {
Row() {
Button('删除').margin(4)
.onClick(()=>{
let index = this.productList.indexOf(item);
this.productList.splice(index, 1);
})
}.padding(10).justifyContent(FlexAlign.SpaceEvenly)
}
build() {
Column(){
if (this.flag){
List({scroller:this.scroller}){
ForEach(this.productList,(item:CartProductList,index:number)=>{
ListItem(){
Row(){
Image(item.isNeedPay?$r('app.media.cart_check'):$r('app.media.cart_no_check'))
.height(20)
.width(20)
.objectFit(ImageFit.Contain)
.onClick(()=>{
if (item.isNeedPay) {
item.isNeedPay=false
this.productList[index] = new CartProductList(item.id, item.productId, item.productSpecId, item.productName, item.productSpecName,
item.buyAmount, item.isNeedPay,item.activityType,item.productImgAddress,
item.productOriginalPrice, item.productPrice, item.couponPrice)
}else {
item.isNeedPay=true
this.productList[index] = new CartProductList(item.id, item.productId, item.productSpecId, item.productName, item.productSpecName,
item.buyAmount, item.isNeedPay,item.activityType,item.productImgAddress,
item.productOriginalPrice, item.productPrice, item.couponPrice)
this.getCountPrice()
}

               })
             Image(item.productImgAddress)
               .height(120)
               .width(120)
               .margin({left:10})
             Column(){
               Text(item.productName)
                 .fontColor(Color.Black)
                 .fontSize(16)

               Text(item.productSpecName)
                 .fontColor(Color.Grey)
                 .fontSize(14)

               Text(){
                 Span("¥ ")
                   .fontSize(14)
                   .fontColor(Color.Red)
                 Span(item.productPrice+"")
                   .fontSize(22)
                   .fontColor(Color.Red)
               }

               Text("¥"+item.productOriginalPrice+"")
                 .fontColor('#999')
                 .decoration({
                   type: TextDecorationType.LineThrough,
                   color: Color.Gray
                 })
                 .fontSize(16)
                 .margin({left:10})
             }

             Row(){
               Text(" - ")
                 .textAlign(TextAlign.Center)
                 .border({width:0.5,color:Color.Gray})
                 .fontSize(14)
                 .height(20)
                 .padding({left:7,right:7})
                 .fontColor(Color.Black)
                 .onClick(()=>{
                   if (item.buyAmount==1) {
                     showToast("已经是最小数量了")
                   }else {
                     item.buyAmount--
                     this.productList[index] = new CartProductList(item.id, item.productId, item.productSpecId, item.productName, item.productSpecName,
                       item.buyAmount, item.isNeedPay,item.activityType,item.productImgAddress,
                       item.productOriginalPrice, item.productPrice, item.couponPrice)
                     this.getCountPrice()

                   }
                 })
                 .borderRadius({topLeft:5,bottomLeft:5})

               Text(item.buyAmount+"")
                 .textAlign(TextAlign.Center)
                 .fontColor(Color.Black)
                 .fontSize(14)
                 .height(20)
                 .padding({left:20,right:20})
                 .border({width:0.5,color:Color.Gray})


               Text(" + ")
                 .textAlign(TextAlign.Center)
                 .fontColor(Color.Black)
                 .fontSize(14)
                 .height(20)
                 .padding({left:7,right:7})
                 .onClick(()=>{
                   item.buyAmount++
                   this.productList[index] = new CartProductList(item.id, item.productId, item.productSpecId, item.productName, item.productSpecName,
                     item.buyAmount, item.isNeedPay,item.activityType,item.productImgAddress,
                     item.productOriginalPrice, item.productPrice, item.couponPrice)
                   this.getCountPrice()
                 })
                 .border({width:0.5,color:Color.Gray})
                 .borderRadius({topRight:5,bottomRight:5})

             }
             .justifyContent(FlexAlign.SpaceBetween)
         }
         .padding(10)
         .alignItems(VerticalAlign.Center)
        }
        .swipeAction({
          end: {
            builder: () => { this.itemEnd(item) },
            actionAreaDistance: 56
          }
        })

      })

    }

    .height('auto')
    .layoutWeight(1)
  }
  Row(){

    Text("合计:")
      .fontColor(Color.Black)

    Text(){
      Span("¥ ")
        .fontSize(14)
        .fontColor(Color.Red)
      Span(this.allPrice.toFixed(2))
        .fontSize(22)
        .fontColor(Color.Red)
    }

    Blank()


    Text("去结算"+"("+this.checkCount+")")
      .fontColor(Color.White)
      .padding(10)
      .borderRadius(20)
      .backgroundColor('#ccfa1818')
  }
  .justifyContent(FlexAlign.SpaceBetween)
  .padding(10)
}

}

getCountPrice(){
this.allPrice=0
this.allOriginalPrice=0
this.checkCount=0
for (let i = 0; i < this.productList.length; i++) {
if (this.productList[i].isNeedPay) {
this.checkCount+=this.productList[i].buyAmount
this.allPrice+=this.productList[i].productPricethis.productList[i].buyAmount
this.allOriginalPrice+=this.productList[i].productOriginalPrice
this.productList[i].buyAmount
}

}

}

}

到这里列表的展示价格的计算都已经实现了

相关文章
|
4月前
|
小程序 视频直播 数据安全/隐私保护
如何在1v1视频直播交友APP中实现防录屏防截屏功能?
婚恋交友市场快速增长,1v1社交应用海外投放增86.49%,中东、东南亚及北美需求旺盛。用户偏好私密高效交流,国内“云相亲”兴起。开发需合规备案、实名认证,并防范诈骗。本文详解原生APP防录屏技术:Android通过MediaProjection检测,iOS监听UIScreen状态,结合动态水印、远程销毁等增强防护,平衡体验与安全。
|
4月前
|
JavaScript API 开发工具
如何在原生App中调用Uniapp的原生功能?
如何在原生App中调用Uniapp的原生功能?
756 139
|
5月前
|
移动开发 小程序 Android开发
基于 uni-app 开发的废品回收类多端应用功能与界面说明
本文将对一款基于 uni-app 开发的废品回收类多端应用,从多端支持范围、核心功能模块及部分界面展示进行客观说明,相关资源信息也将一并呈现。
196 0
|
8月前
《仿盒马》app开发技术分享-- 确认订单页(数据展示)(29)
上一节我们实现了地址的添加,那么有了地址之后我们接下来的重点就可以放到订单生成上了,我们在购物车页面,点击结算会跳转到一个 订单确认页面,在这个页面我们需要有地址选择、加购列表展示、价格计算、优惠计算、商品数量展示等信息。
216 3
|
4月前
|
存储 自然语言处理 算法
参照Yalla、Hawa等主流APP核心功能,开发一款受欢迎的海外语聊需要从哪些方面入手
海外语聊APP开发需结合Yalla、Hawa等主流产品,聚焦多语言支持、实时音视频、社交互动与安全合规。兼顾技术架构、本地化运营与法律风险,避免劣质成品代码,平衡创新与成本,打造差异化出海产品。(239字)
|
6月前
|
存储 Java PHP
轻量化短视频电商直播带货APP源码全解析:核心功能与设计流程​
在电商直播热潮下,开发专属直播带货APP成为抢占市场关键。本文详解原生开发轻量化APP的核心功能与全流程设计,涵盖用户登录、商品浏览、直播互动、购物车、订单及售后功能,并介绍安卓端Java、苹果端Object-C、后台PHP的技术实现,助力打造高效优质的直播电商平台。
|
8月前
|
定位技术
《仿盒马》app开发技术分享-- 地图选点(27)
上一节我们实现了地图的简单展示,这一节我们要实现的内容是,根据展示的地图,实现当前定位功能,当前位置的poi地址功能,以及列表的展示,给地图添加标记,展示自己的当前定位
149 4
|
8月前
|
数据库
《仿盒马》app开发技术分享-- 确认订单页(业务逻辑)(30)
上一节我们实现了确认订单页的页面绘制和价格计算优惠计算,订单列表展示等功能,这一节我们来实现确认订单页的整个业务逻辑。首先我们要实现的就是地址的选择,然后把我们计算的价格,商品列表等数据保存起来,然后我们开始创建订单表实体类等,把这些数据提交到订单表中
220 3
|
8月前
|
存储 定位技术 数据库
《仿盒马》app开发技术分享-- 新增地址(28)
上一节我们实现了地图选点,获取当前位置,在地图上添加标记,根据当前的定位获取poi地址列表等功能,这些全部都为了我们这一节而铺垫,这一节我们要实现的是新增地址,把我们的用户信息,填写收件人、门牌号、手机号、经纬度、详细地址等信息添加到我们的云数据库中,然后在地址查询列表里展示出来。
187 2
|
8月前
|
数据库
《仿盒马》app开发技术分享-- 回收订单页功能完善(45)
上一节我们实现了订单的待取件、已取消状态展示,并且成功实现了修改订单状态后的列表刷新,实现了云端数据的修改,这一节我们来实现订单页剩下的两个板块的业务逻辑,分别是运输中、已完成状态下的列表展示以及订单状态的修改
160 1

热门文章

最新文章