《仿盒马》app开发技术分享-- 订单列表页(33)

鸿蒙小林
• 阅读 5

技术栈

Appgallery connect

开发准备

上一节我们实现了订单详情的展示,但是我们的确认订单页面只在下单成功后才会出现供用户查看,现在我们要有一个常驻的入口让用户去随时查看自己的订单以及订单状态,订单状态分为多个,还需要给用户提供切换的功能

功能分析

要实现这么一个功能我们首先就需要实现页面的切换功能,这里我们使用tabs组件,之后我们在tabcontent中添加对应的页面组件,对应当前展示的订单状态,分别有待发货、待收货、已完成这些状态,我们需要在切换到对应页面的时候进行订单的查询,注意tabcontent加载后再次切换时不会再执行生命周期方法,我们还需要进行切换时的请求处理,保证订单列表的实时性。同时要注意查询出的订单要是当前用户对应的订单,在列表展示的时候因为我们还需要展示订单的部分内容,所以还需要根据对应的product_id 查询出订单商品列表的图片,让我们的数据更丰富

代码实现

首先实现一个切换的页面,并且添加对应的组件,这里我们暂时实现一个,其他的我们如法炮制即可,我们来实现待发货页面

首先创建tabs以及对应的内容

import { OrderOver } from '../component/OrderOver';
import { OrderWaitingGetShop } from '../component/OrderWaitingGetShop';
import {  OrderWaitingShop } from '../component/OrderWaitingShop';
import { CommonTopBar } from '../widget/CommonTopBar';

@Entry
@Component
struct MyOrderListPage {

  @State currentIndex: number = 0

  @State fontColor: string = '#182431';
  @State selectedFontColor: string = '#007DFF';
  @State selectedIndex: number = 0;
  private controller: TabsController = new TabsController();

  @Builder tabBuilder(index: number, name: string) {
    Column() {
      Text(name)
        .fontColor(this.selectedIndex === index ? this.selectedFontColor : this.fontColor)
        .fontSize(16)
        .fontWeight(this.selectedIndex === index ? 500 : 400)
        .lineHeight(22)
        .margin({ top: 17, bottom: 7 })
      Divider()
        .strokeWidth(2)
        .width(40)
        .color('#007DFF')
        .opacity(this.selectedIndex === index ? 1 : 0)
    }.width('100%')
  }

  build() {
    Column() {
      CommonTopBar({ title: "我的订单", alpha: 0, titleAlignment: TextAlign.Center ,backButton:true})
      Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {
        TabContent() {
          Column(){
            OrderWaitingShop({currentIndex:this.currentIndex})
          }.width('100%').height('100%')
        }.tabBar(this.tabBuilder(0, '待发货'))

        TabContent() {
          Column(){

          }.width('100%').height('100%')
        }.tabBar(this.tabBuilder(1, '待收货'))

        TabContent() {
          Column(){

          }.width('100%').height('100%')
        }.tabBar(this.tabBuilder(2, '已完成'))
      }
      .vertical(false)
      .barMode(BarMode.Fixed)
      .barWidth('100%')
      .barHeight(56)
      .animationDuration(0)
      .onChange((index: number) => {
        this.currentIndex = index;
        this.selectedIndex = index;
      })
      .onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {
        if (index === targetIndex) {
          return;
        }
        this.selectedIndex = targetIndex;
      })
      .width('100%')
      .height('100%')
      .backgroundColor('#F1F3F5')
    }.width('100%')
  }
}

之后我们来到对应的待发货组件页面内,实现数据的请求,因为tabs我们默认选中了第一个,这时候并不会触发切换的方法,第一次因为触发了生命周期方法我们在aboutToAppear中先执行查询

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



      let condition1 = new cloudDatabase.DatabaseQuery(order_product_list);
      condition1.equalTo("order_product_id",data1[0].order_product_id)
      let listData1 = await databaseZone.query(condition1);
      let json1 = JSON.stringify(listData1)
      this.productList=JSON.parse(json1)

      this.flag=true
    }
  }

然后实现切换后的查询代码

async onRefresh(): Promise<void> {
    if (this.currentIndexCheck==this.currentIndex) {
      let databaseZone = cloudDatabase.zone('default');
      let condition = new cloudDatabase.DatabaseQuery(order_list);
      condition.equalTo("user_id",this.user?.user_id)
      let listData = await databaseZone.query(condition);
      let json = JSON.stringify(listData)
      let data1:OrderList[]= JSON.parse(json)
      this.orderInfo=data1



      let condition1 = new cloudDatabase.DatabaseQuery(order_product_list);
      condition1.equalTo("order_product_id",data1[0].order_product_id)
      let listData1 = await databaseZone.query(condition1);
      let json1 = JSON.stringify(listData1)
      this.productList=JSON.parse(json1)

      this.flag=true
    }
  }

之后我们进行数据的填充和展示即可,我们订单展示列表页面是一个垂直的列表,列表内部又是一个图片的展示列表,所以我们在list中嵌套list即可实现想要的效果

Column() {
        List(){
          ForEach(this.orderInfo,(item:OrderList,index:number)=>{
            ListItem(){
              Column(){
                Row(){
                  Text(item.order_create_time)
                    .fontSize(14)
                    .fontColor(Color.Black)
                  Text("买家已付款")
                    .fontSize(14)
                    .fontColor(Color.Black)
                }
                .padding(10)
                .width('100%')
                .justifyContent(FlexAlign.SpaceBetween)
                Divider().width('100%').height(0.8)
                  .color("#e6e6e6")
                List({space:10}){
                  ForEach(this.productList,(item:OrderProductList,pos:number)=>{
                    ListItem(){
                      Column(){
                        Image(item.img)
                          .height(60)
                          .width(60)
                          .borderRadius(5)
                      }
                    }
                  })
                }
                .padding({left:10})
                .width('100%')
                .listDirection(Axis.Horizontal)
                .height(80)
                Row(){
                  Text()
                  Blank()
                  Text() {
                    Span("合计:")
                      .fontSize(16)
                      .fontColor(Color.Black)
                    Span("¥ ")
                      .fontSize(10)
                      .fontColor(Color.Red)
                    Span(this.price()+"")
                      .fontSize(16)
                      .fontColor(Color.Red)
                  }
                }
                .padding(10)
                .width('100%')
                .justifyContent(FlexAlign.SpaceBetween)
              }
              .margin({top:15})
              .backgroundColor(Color.White)
              .borderRadius(10)
              .padding(10)
              .width('100%')

            }
          })
        }


      }.padding(10)
      .width('100%')
      .height('100%')
      .backgroundColor('#F1F3F5')
 price():number{

    let  number=0
    for (let i = 0; i <this.productList.length ; i++) {
      number+=this.productList[i].buyAmount*this.productList[i].price
    }
    return  number
  }

到这里待发货页面已经实现了想要的效果,剩下两个页面根据order_status 以及user_id 去做对应数据的查询即可

点赞
收藏
评论区
推荐文章
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 旧物回收订单列表(43)
技术栈Appgalleryconnect开发准备上一节我们实现了订单的创建,并且成功吧数据提交到云数据库中,这一节我们实现的内容是展示我们提交的订单列表功能分析要实现订单列表的展示,首先我们要查询对应用户下的订单列表,查询出对应的订单列表后,展示出对应的数
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 回收订单状态修改与展示(44)
技术栈Appgalleryconnect开发准备上一节我们实现了订单列表页,但是我们的订单列表又分为很多的订单状态,我们在订单列表页取出的数据是所有的数据,订单的状态我们还需要进行一些操作,如果都在一起,对用户来说非常的不友好,所以我们需要把它修改为不同状
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 回收订单页功能完善(45)
技术栈Appgalleryconnect开发准备上一节我们实现了订单的待取件、已取消状态展示,并且成功实现了修改订单状态后的列表刷新,实现了云端数据的修改,这一节我们来实现订单页剩下的两个板块的业务逻辑,分别是运输中、已完成状态下的列表展示以及订单状态的修
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 回收订单详情页(46)
技术栈Appgalleryconnect开发准备上一节我们实现了订单列表的所有功能,展示了待取件、已取消、运输中、已完成等订单列表的数据展示,并且在对应的订单中点击功能按钮实现了订单的状态切换,这一节我们就要通过点击对应列表内的订单进入相应的订单详情页,展
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 回收记录页(47)
技术栈Appgalleryconnect开发准备上一节我们实现了在订单列表中查看订单详情,但是我们的回收相关的营收就必须要进入到商品详情页才能够进行查看,如果我们在订单较多的情况下,一个一个的查看订单的详情就会变得非常的麻烦了,现在我们需要实现一个订单记录
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 待发货兑换订单列表(76)
技术栈Appgalleryconnect开发准备上一节我们实现了兑换订单展示页面的框架,这一节我们要进行兑换订单的展示,在兑换订单提交后,默认的状态是待发货状态,我们用列表的方式展示出来功能分析进入页面时我们就要通过用户的userid去查询对应的订单,获取
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 兑换商品取消订单&取消列表展示(77)
技术栈Appgalleryconnect开发准备上一节我们实现了兑换订单待发货列表的展示逻辑,成功的在列表中展示出来,我们在订单条目中新增了两个按钮,确认揽收与取消订单,这一节我们要实现的功能是订单的取消,以及订单取消后取消列表的展示功能分析要实现订单取消
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 兑换商品确认揽收&待收货列表展示(78)
技术栈Appgalleryconnect开发准备上一节我们实现了订单取消功能,实现了tabs切换时的数据刷新,实现了已取消订单的列表展示。这一节我们要实现揽收功能,并且实现待收货的列表展示功能功能分析当我们点击确认揽收的时候,修改订单状态ordertype
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 兑换商品收货确认&已完成列表展示(79)
技术栈Appgalleryconnect开发准备上一节我们实现了兑换商品订单的确认揽收功能,实现了tabs切换时的数据刷新,实现了待收货订单的列表展示。这一节我们要实现确认收货功能,并且实现待收货的列表展示功能功能分析当我们点击确认揽收的时候,修改订单状态
鸿蒙小林 鸿蒙小林
10小时前
《仿盒马》app开发技术分享-- 兑换商品订单详情页(80)
技术栈Appgalleryconnect开发准备我们的兑换商品列表相关的功能都已经实现的差不多了,现在我们还缺少一个订单详情查看的功能,为了ui一致性,我们的订单详情页样式要保持一致性,外观要跟订单、回收单的详情页相似。功能分析要实现订单详情首先我们需要拿