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

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

技术栈

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开发技术分享-- 商品兑换校验(70)
上一节我们实现了可兑换商品的详情,我们能够查看到商品更多的信息,这一节我们来实现商品兑换相关的功能,在进行商品兑换之前,我们在兑换详情页面,点击立即兑换按钮之后我们需要跳转到兑换详情页,但是用户的积分可能达不到我们当前商品的兑换标准,这时候如果我们进入了下个页面,在用户点击确认的时候去校验,就让用户多操作了一步,这样的操作体验非常的不友好,所以我们在兑换前进行校验,通过校验后我们在确认页实现地址添加相关的内容
113 4
|
6月前
|
数据库
《仿盒马》app开发技术分享-- 兑换商品取消订单&取消列表展示(77)
上一节我们实现了兑换订单待发货列表的展示逻辑,成功的在列表中展示出来,我们在订单条目中新增了两个按钮,确认揽收与取消订单,这一节我们要实现的功能是订单的取消,以及订单取消后取消列表的展示
119 1
|
6月前
|
存储
《仿盒马》app开发技术分享-- 兑换订单提交(73)
上一节我们实现了兑换提交前的准备页面,向用户展示了兑换相关的所有信息,这一节我们就可以实现兑换订单的提交了
120 1
|
6月前
《仿盒马》app开发技术分享-- 兑换商品数据插入(67)
上一节我们实现了积分列表的展示,我们可以更直观的查看当前用户积分的收支情况,但是现在我们只有积分收入并没有消费的地方,所以现在我们开始着手积分兑换相关的内容。这一节我们来实现积分兑换商品的内容
99 0
|
6月前
《仿盒马》app开发技术分享-- 注销账号恢复(85)
上一节我们实现了欢迎页的逻辑,并且在欢迎页面实现了对账号状态的提示,但是如果我们的用户之前因为一些原因注销了账号,但现在又想用回我们的应用怎么办?我们这一节就要在注销账号的提示弹窗处,实现一个账号恢复功能,使我们的用户可以继续使用我们的应用
133 0
|
6月前
《仿盒马》app开发技术分享-- 逻辑优化第三弹(83)
现在我们的app功能已经趋近完善,bug和缺失的细节也越来越少了,我们继续对app进行优化,首先是我们的积分页面,我们只实现了全部的积分展示内容,对收入和支出的积分明细并没有进行展示,这里我们要实现一下,然后就是我们的优惠券,我们已过期的优惠券并没有修改状态为已过期。
120 0
|
数据库
《仿盒马》app开发技术分享-- 逻辑优化第二弹(82)
这一节我们继续对我们已有的业务逻辑进行优化,在积分兑换完商品后我们回到积分展示页面发现积分的数量并没有减少,而是重新进入才会发生变化,上一节我们实现商城订单的确认揽收之后继续在待收货页面实现确认揽收按钮的业务逻辑。
132 0
|
6月前
《仿盒马》app开发技术分享-- 逻辑优化第一弹(81)
随着上一节我们兑换商品订单相关逻辑的实现,我们的app功能已经更加的完善了,接下来我们开始对整个app缺失的小功能以及对已有的功能bug进行优化和逻辑的新增,这一节我们新增的功能是,商城订单的揽收 功能,兑换订单的取消后积分退回功能,如果不实现积分退回,就会出现用户兑换后取消订单,但是积分已经消耗的情况
120 0
|
6月前
《仿盒马》app开发技术分享-- 兑换商品收货确认&已完成列表展示(79)
上一节我们实现了兑换商品订单的确认揽收功能,实现了tabs切换时的数据刷新,实现了待收货订单的列表展示。这一节我们要实现确认收货功能,并且实现待收货的列表展示功能
122 0
|
6月前
《仿盒马》app开发技术分享-- 兑换商品确认揽收&待收货列表展示(78)
上一节我们实现了订单取消功能,实现了tabs切换时的数据刷新,实现了已取消订单的列表展示。这一节我们要实现揽收功能,并且实现待收货的列表展示功能
152 0