《仿盒马》app开发技术分享--确认订单选择优惠券(59)

鸿蒙小林
• 阅读 3

技术栈

Appgallery connect

开发准备

在上一节我们实现了在确认订单页查询优惠券,但是我们并没有其他优惠券相关的逻辑,我们的目的还是在订单结算的时候去使用我们对应的优惠券,现在我们要在确认订单页去进行优惠券的选择,为了方便用户操作,我们以弹窗的形式展现

功能分析

要实现在弹窗中展示优惠券首先,我们要创建一个自定义弹窗,在弹窗中我们要查询的数据应该是全部的数据,这样我们就能实现可用优惠券跟不可用优惠券的展示,告知用户可用优惠券的金额,以及不可用优惠券差多少额度可用,点击可用优惠券修改结算金额,展示选中的优惠券金额

代码实现

首先我们创建弹窗,把优惠券金额设置为双向绑定

@Preview
@CustomDialog
export struct CouponCheckDialog {
  @State user: User | null = null
  @State couponList: CouponMall[] = []
  controller: CustomDialogController;
  @State lessThanLimit:CouponMall[]=[]
  @State greaterOrEqualLimit:CouponMall[]=[]
  @Prop price:number
  @Link couponPrice:number

在自定义弹窗组件生命周期中把我们优惠券所有的数据查询出来

async aboutToAppear(): Promise<void> {
    const value = await StorageUtils.getAll('user');
    if (value != "") {
      this.user = JSON.parse(value)
    }
    let databaseZone = cloudDatabase.zone('default');
    let condition = new cloudDatabase.DatabaseQuery(coupon_mall);
    condition.equalTo("user_id", this.user?.user_id)
    let listData = await databaseZone.query(condition);
    let json = JSON.stringify(listData)
    let data: CouponMall[] = JSON.parse(json)
    this.couponList = data

    this.splitCouponsByLimit(data,this.price)
  }

因为我们要在一个list中展示不同类型的数据所以我们要用到ListItemGroup来实现,因为要展示不同的头部说明,我们还需要创建一个头部布局

@Builder
  Header(type:number){
    Text(type==0?"可用优惠券":"不可用优惠券")
      .width('100%')
      .padding(10)
      .textAlign(TextAlign.Start)
      .fontColor(Color.Black)
      .fontSize(16)
  }
     List({ space: 10 }) {
        ListItemGroup({header:this.Header(0)}){
          ForEach(this.lessThanLimit, (item: CouponMall, index: number) => {
            ListItem() {
              this.Item(item)
            }
          })

        }
        ListItemGroup({header:this.Header(1)}){
          ForEach(this.greaterOrEqualLimit, (item: CouponMall, index: number) => {
            ListItem() {
              this.NotItem(item)
            }
          })
        }


      }
      .padding(10)

对应的item布局我们可以根据参数来修改状态也可以分开写,这里我们分开来写

 @Builder
  Item(item: CouponMall) {
    Column({ space: 10 }) {
      Row({ space: 10 }) {
        Column() {
          Text("¥" + item.price)
            .fontSize(30)
            .fontColor(Color.Red)
            .fontWeight(FontWeight.Bold)
          Text("满" + item.limit_amount + "元可用")
            .fontColor(Color.Red)
            .fontWeight(FontWeight.Bold)
            .fontSize(12)
        }

        Column({ space: 10 }) {
          Text(item.type_str)
            .fontColor(Color.Black)
            .fontWeight(FontWeight.Bold)
            .fontSize(16)

          Text(item.txt)
            .fontColor(Color.Grey)
            .fontSize(12)

        }

        Blank()
        Text("待使用")
          .width(80)
          .height(80)
          .borderRadius(40)
          .fontSize(14)
          .textAlign(TextAlign.Center)
          .fontColor(Color.White)
          .backgroundColor(Color.Red)
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)

      Divider().width('100%').height(0.8)
        .color("#e6e6e6")
      Text("有效期至" + item.start_time + "至" + item.end_time)
        .fontSize(12)
        .fontColor(Color.Grey)
    }
    .margin({top:10})
    .padding(10)
    .backgroundColor(Color.White)
    .borderRadius(10)
    .onClick(()=>{
      this.couponPrice=item.price
      this.controller.close()
    })
  }


  @Builder
  NotItem(item: CouponMall) {
    Column({ space: 10 }) {
      Row({ space: 10 }) {
        Column() {
          Text("¥" + item.price)
            .fontSize(30)
            .fontColor(Color.Grey)
            .fontWeight(FontWeight.Bold)
          Text("满" + item.limit_amount + "元可用")
            .fontColor(Color.Grey)
            .fontWeight(FontWeight.Bold)
            .fontSize(12)
        }

        Column({ space: 10 }) {
          Text(item.type_str)
            .fontColor(Color.Grey)
            .fontWeight(FontWeight.Bold)
            .fontSize(16)

          Text(item.txt)
            .fontColor(Color.Grey)
            .fontSize(12)

        }

        Blank()
        Text("不可用")
          .width(80)
          .height(80)
          .borderRadius(40)
          .fontSize(14)
          .textAlign(TextAlign.Center)
          .fontColor(Color.White)
          .backgroundColor(Color.Grey)
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)

      Divider().width('100%').height(0.8)
        .color("#e6e6e6")

      Text("有效期至" + item.start_time + "至" + item.end_time)
        .fontSize(12)
        .fontColor(Color.Grey)
      Text(){
        Span("不可用原因:")
          .fontColor(Color.Red)
          .fontSize(12)
        Span("商品结算价距使用门槛还差")
          .fontColor(Color.Gray)
          .fontSize(12)
        Span(""+(item.price-(this.couponPrice!=undefined?this.couponPrice:0)))
          .fontColor(Color.Red)
          .fontSize(12)
        Span("元")
          .fontColor(Color.Gray)
          .fontSize(12)
      }
      .backgroundColor("#fffacfcf")
      .padding(5)
      .borderRadius(5)
    }
    .margin({top:10})
    .padding(10)
    .backgroundColor(Color.White)
    .borderRadius(10)
    .onClick(()=>{
      showToast("优惠券不可用")
    })
  }

之后我们在查询出的数据中根据结算商品的金额分别筛选出两个不同的数据源

   splitCouponsByLimit(coupons: CouponMall[], price: number) {
  const lessThanLimit = coupons.filter(coupon =>
  coupon.limit_amount < price
  );
     this.lessThanLimit=lessThanLimit

  const greaterOrEqualLimit = coupons.filter(coupon =>
  coupon.limit_amount >= price
  );
     this.greaterOrEqualLimit=greaterOrEqualLimit

}

在确认订单页引用弹窗

  couponController: CustomDialogController| null = new CustomDialogController({
    builder: CouponCheckDialog({
      couponPrice:this.couponPrice,
      price:this.price()
    }),
    alignment: DialogAlignment.Bottom,
    customStyle:true
  });

修改优惠券展示组件的逻辑

  Row(){
            Text("优惠券")
              .fontSize(14)
              .fontColor(Color.Black)

            if (this.getCoupon()>0){
              if (this.couponPrice>0){
                Text("已选:-¥"+this.couponPrice+" >")
                  .fontSize(14)
                  .fontColor(Color.Red)
                  .onClick(()=>{
                    this.couponController?.open()
                  })
              }else {
                Text("可用"+this.getCoupon()+"张 >")
                  .fontSize(14)
                  .fontColor(Color.Red)
                  .onClick(()=>{
                    this.couponController?.open()
                  })

              }

            }else {
              Text("无可用优惠券")
                .fontSize(14)
                .fontColor(Color.Black)
            }

          }
          .padding(10)
          .width('100%')
          .justifyContent(FlexAlign.SpaceBetween)
点赞
收藏
评论区
推荐文章
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 确认订单页(业务逻辑)(30)
技术栈Appgalleryconnect开发准备上一节我们实现了确认订单页的页面绘制和价格计算优惠计算,订单列表展示等功能,这一节我们来实现确认订单页的整个业务逻辑。首先我们要实现的就是地址的选择,然后把我们计算的价格,商品列表等数据保存起来,然后我们开始
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 订单详情页(32)
技术栈Appgalleryconnect开发准备在之前的章节中我们实现了订单的提交,以及提交之后跳转到确认订单页面,在确认订单页面我们添加了一个入口,这个入口是查询订单,当我们点击入口时,我们需要跳转到一个新的界面,这个界面通过接收上个界面的订单id或者订
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 订单列表页(33)
技术栈Appgalleryconnect开发准备上一节我们实现了订单详情的展示,但是我们的确认订单页面只在下单成功后才会出现供用户查看,现在我们要有一个常驻的入口让用户去随时查看自己的订单以及订单状态,订单状态分为多个,还需要给用户提供切换的功能功能分析要
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 优惠券展示页(57)
技术栈Appgalleryconnect开发准备上一节我们实现了优惠券的领取功能,并且在云端已经成功查询出优惠券信息,那么我们需要来实现一个优惠券展示的页面来向用户展示当前账号下的优惠券信息,辅助用户更好的去购买需要的商品,因为优惠券会有多种状态,在展示时
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 优惠券逻辑优化(58)
技术栈Appgalleryconnect开发准备我们已经实现了优惠券的领取和展示,现在已经趋近于一个完整的电商应用了,但是这时候问题又来了,我们领取完优惠券之后,我们的新用户优惠券模块依然存在,他并没有消失,既然我们是从云数据库中查询的数据,那么我们需要找
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 订单结合优惠券结算(60)
技术栈Appgalleryconnect开发准备上一节我们已经实现了优惠券的选择,并且成功的把券后的价格也展示给用户,不能使用的优惠券我们也用友好的方式告知用户,这一节我们来实现优惠券内容的下一步,优惠券内容结合订单进行结算提交功能分析因为我们之前的订单列
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享--未完成订单列表展示逻辑优化(61)
技术栈Appgalleryconnect前言:上一节我们实现订单与优惠券的联合提交时,我去到订单列表页面查看生成的订单信息,发现现在的订单从信息展示到价格计算全都是有问题的。所以紧急的把对应的问题修改一下。问题来源:cssasyncaboutToAppea
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 兑换订单列表框架(75)
技术栈Appgalleryconnect开发准备上一节我们针对订单兑换的业务逻辑进行了完善,成功的在兑换物品之后修改了用户信息的修改,新增了积分消费的记录。这一节我们实现订单创建之后进入的列表展示页框架。功能分析兑换商品的订单列表框架我们选择使用tabs,
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 兑换商品取消订单&取消列表展示(77)
技术栈Appgalleryconnect开发准备上一节我们实现了兑换订单待发货列表的展示逻辑,成功的在列表中展示出来,我们在订单条目中新增了两个按钮,确认揽收与取消订单,这一节我们要实现的功能是订单的取消,以及订单取消后取消列表的展示功能分析要实现订单取消
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 兑换商品收货确认&已完成列表展示(79)
技术栈Appgalleryconnect开发准备上一节我们实现了兑换商品订单的确认揽收功能,实现了tabs切换时的数据刷新,实现了待收货订单的列表展示。这一节我们要实现确认收货功能,并且实现待收货的列表展示功能功能分析当我们点击确认揽收的时候,修改订单状态