《仿盒马》app开发技术分享-- 优惠券逻辑优化(58)

鸿蒙小林
• 阅读 3

技术栈

Appgallery connect

开发准备

我们已经实现了优惠券的领取和展示,现在已经趋近于一个完整的电商应用了,但是这时候问题又来了,我们领取完优惠券之后,我们的新用户优惠券模块依然存在,他并没有消失,既然我们是从云数据库中查询的数据,那么我们需要找到一个字段跟他对应起来,来实现新用户领券后关闭这个模块的展示,同时我们在未登录的时候他也要保持隐藏,登录后能实现优惠券的领取。然后在结算的时候得出有几张符合的券能用

功能分析

因为我们的优惠券展示是用的组件的方式,首次我们没有登录的情况下组件因为并没有被销毁,aboutToAppear已经不会再执行了,所以获取不到user信息,我们需要解决这个问题,保证user信息能及时的获取,在表创建的时候我们预留了一个字段isvip,现在我们用它来判断是否为新用户即可,去到了确认订单页面我们获取到符合最小金额的可用优惠券

代码实现

首先我们在优惠券领取之后,使用回调的方式修改isvip的状态,同时接收登陆后传递的信息,我们传user信息进组件内

 @Link user: User|null
 private  callback?: () => void
  Button('立即领取', { type: ButtonType.Normal })
        .width(240)
        .height(40)
        .backgroundColor('#FF0000')
        .fontColor(Color.White)
        .borderRadius(20)
        .margin({ bottom: 16 })
        .onClick(async ()=>{
            try {
              for (const item of this.couponList) {
                const coupon = new coupon_mall();
                coupon.id=Math.floor(Math.random() * 1000000);
                coupon.user_id=this.user!.user_id
                coupon.coupon_id=item.coupon_id
                coupon.price=Number(item.price)
                coupon.type=0
                coupon.limit_amount=item.limit_amount
                coupon.start_time=this.creatTime()
                coupon.end_time=this.endTime()
                coupon.type_str=item.type
                coupon.txt="全场商品通用"
                const databaseZone = cloudDatabase.zone('default');
                await databaseZone.upsert(coupon); // 等待当前操作完成
              }

              // 所有循环完成后执行
              showToast("优惠券领取成功");
              this.callback!()
            } catch (error) {
              hilog.error(0x0000, 'testTag', `插入失败: ${error}`);
              showToast("领取优惠券出错");
            }



        })

实现回调

CouponComponent({home_activity:this.home_new_people_coupon,couponList:this.couponList,callback: async ()=>{
                    let users=new user()
                    users.id=this.user!.id
                    users.user_id=this.user!.user_id
                    users.user_name=this.user!.user_name
                    users.psw=this.user!.psw
                    users.is_vip=false
                    users.user_code=this.user!.user_code
                    users.is_log_off=this.user!.is_vip
                    let num = await databaseZone.upsert(users);
                    StorageUtils.set("user",JSON.stringify(users))

                    if (num>0) {

                        let condition3 = new cloudDatabase.DatabaseQuery(user);
                        condition3.equalTo("user_name",this.user?.user_name).and().equalTo("psw",this.user?.psw)
                        let listData3 = await databaseZone.query(condition3);
                        let json3 = JSON.stringify(listData3)
                        let data3:User[]= JSON.parse(json3)
                        this.user=data3[0]

                    }
                  },user:this.user})
                    .visibility(this.user?.is_vip?Visibility.Visible:Visibility.None)

现在我们的显示隐藏需要用isvip来控制了,然后我们接收登陆后的用户信息

 let innerEvent2: emitter.InnerEvent = {
      eventId: 2001
    };
    let callback2: Callback<emitter.EventData> = async (eventData: emitter.EventData) => {
      console.info(`eventData: ${JSON.stringify(eventData)}`);
      const value = await StorageUtils.getAll('user');
      if (value != "") {
        this.user = JSON.parse(value)
      }else {
        this.userInfo=null
        this.user=null
      }
    }
    emitter.on(innerEvent2, callback2);

实现自后我们来到确认订单页面,先查询出可用的优惠券

let databaseZone = cloudDatabase.zone('default');
    let condition = new cloudDatabase.DatabaseQuery(coupon_mall);
    condition.equalTo("user_id", this.user?.user_id).and().equalTo("type",0)
    let listData = await databaseZone.query(condition);
    let json = JSON.stringify(listData)
    let data: CouponMall[] = JSON.parse(json)
    this.couponList = data

根据结算金额来筛选出有多少张优惠券能够使用

 getCoupon():number{
    let eligibleCoupons = this.couponList.filter(coupon =>
    coupon.limit_amount <= this.price()
    ).length;
    return eligibleCoupons
  }

修改ui

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

            if (this.getCoupon()>0){
              Text("可用"+this.getCoupon()+"张")
                .fontSize(14)
                .fontColor(Color.Red)
            }else {
              Text("无可用优惠券")
                .fontSize(14)
                .fontColor(Color.Black)
            }

          }
          .padding(10)
          .width('100%')
          .justifyContent(FlexAlign.SpaceBetween)

到这里我们的优惠券逻辑已经开始逐渐完善了

点赞
收藏
评论区
推荐文章
鸿蒙小林 鸿蒙小林
13小时前
《仿盒马》app开发技术分享-- 金刚区(3)
技术栈Appgalleryconnect开发准备上一篇文章中我们实现了项目端云一体化新人专享券活动模块,数据也成功的从云端获取,现在我们开始继续向下,实现金刚区模块功能分析金刚区的实现我们之前已经完成了,但是数据的获取都是本地的静态数据,现在我们要获取云端
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 个人中心页or静态头像选择(业务逻辑)(22)
技术栈Appgalleryconnect开发准备上一节我们实现了登录页面的业务逻辑,并且成功的实现了数据的查询,同时我们新增了用户首选项的工具类,现在主界面往登录页面跳转,登录成功后我们关闭登录页面,这时候我们就会回到个人中心页面,那么现在我们的业务逻辑是
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 订单地址修改(31)
技术栈Appgalleryconnect开发准备上一节我们实现了订单备注弹窗,订单商品列表的提交,订单列表的提交,提交之后的业务逻辑我们并没有去处理,那么订单提交之后我们需要进入到什么页面呢?这时候我们需要一个过渡页面,它能给我们提供更多的订单相关的入口,
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 购物车业务逻辑完善(34)
技术栈Appgalleryconnect开发准备之前我们已经实现了购物车相关的内容,实现了购物车数据列表的展示,但是我们结算订单之后我们的购物车列表并没有刷新,而且底部的状态栏并没有明显的数据展示来提醒用户,而且当我们在商品详情页添加新商品,底部也没有同步
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 领取优惠券(56)
技术栈Appgalleryconnect开发准备在之前的功能开发中,我们有些功能只有展示的能力并没有与云端产生任何的交互,后续经过我们的迭代,更多的能力有了交互能力,这一节我们就要开始着手给那些静态展示的模块添加业务逻辑,我们现在要实现的是首页的新人优惠券
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 优惠券展示页(57)
技术栈Appgalleryconnect开发准备上一节我们实现了优惠券的领取功能,并且在云端已经成功查询出优惠券信息,那么我们需要来实现一个优惠券展示的页面来向用户展示当前账号下的优惠券信息,辅助用户更好的去购买需要的商品,因为优惠券会有多种状态,在展示时
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享--确认订单选择优惠券(59)
技术栈Appgalleryconnect开发准备在上一节我们实现了在确认订单页查询优惠券,但是我们并没有其他优惠券相关的逻辑,我们的目的还是在订单结算的时候去使用我们对应的优惠券,现在我们要在确认订单页去进行优惠券的选择,为了方便用户操作,我们以弹窗的形式
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 订单结合优惠券结算(60)
技术栈Appgalleryconnect开发准备上一节我们已经实现了优惠券的选择,并且成功的把券后的价格也展示给用户,不能使用的优惠券我们也用友好的方式告知用户,这一节我们来实现优惠券内容的下一步,优惠券内容结合订单进行结算提交功能分析因为我们之前的订单列
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 个人中心页优化(62)
技术栈Appgalleryconnect开发准备上一节我们实现了订单逻辑的优化,现在我们的app功能更加的完善了,并且随着我们的迭代逻辑疏漏越来越少,现在我们继续进行优化,在之前的业务逻辑中我们的个人中心页面展示了用户的余额以及积分商城入口,这里我们要展示
鸿蒙小林 鸿蒙小林
6小时前
《仿盒马》app开发技术分享-- 逻辑优化第三弹(83)
技术栈Appgalleryconnect开发准备现在我们的app功能已经趋近完善,bug和缺失的细节也越来越少了,我们继续对app进行优化,首先是我们的积分页面,我们只实现了全部的积分展示内容,对收入和支出的积分明细并没有进行展示,这里我们要实现一下,然后