1.填写订单-渲染基本信息

  1. 静态结构(分包)
  2. 封装请求API
import { http } from '@/utils/http'
import { OrderPreResult } from '@/types/order'export const getmemberOrderPreAPI = () => {return http<OrderPreResult>({method: 'GET',url: '/member/order/pre',})
}
  1. 初始化调用
// 获取订单信息
const orderPre = ref<OrderPreResult>()
const getmemberOrderPreData = async () => {const res = await getmemberOrderPreAPI()orderPre.value = res.result
}
// 初始化调用
onLoad(() => {getmemberOrderPreData()
})
  1. 类型声明
  2. 界面渲染
 <!-- 商品信息 --><view class="goods"><navigatorv-for="item in orderPre?.goods":key="item.skuId":url="`/pages/goods/goods?id=${item.id}`"class="item"hover-class="none"><image class="picture" :src="item.picture" /><view class="meta"><view class="name ellipsis"> {{ item.name }} </view><view class="attrs">{{ item.attrsText }} </view><view class="prices"><view class="pay-price symbol">{{ item.payPrice }}</view><view class="price symbol">{{ item.price }}</view></view><view class="count">x{{ item.count }}</view></view></navigator></view><!-- 吸底工具栏 --><view class="toolbar" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }"><view class="total-pay symbol"><text class="number">{{ orderPre?.summary.totalPayPrice.toFixed(2) }}</text></view><view class="button" :class="{ disabled: true }"> 提交订单 </view></view>

2. 收货地址

  1. 计算默认收货地址
const selectedAddress = computed(() => {// 查找默认收货地址return orderPre.value?.userAddresses.find((v) => v.isDefault)
})
  1. 地址列表页
  2. 修改收货地址
<view class="item-content" @tap="onChangeAddress(item)">
  1. 收货地址Store
import { AddressItem } from '@/types/address'
import { defineStore } from 'pinia'
import { ref } from 'vue'export const useAddressStore = defineStore('address', () => {const selectedAddress = ref<AddressItem>()const changeSelectedAddress = (val: AddressItem) => {selectedAddress.value = val}return {selectedAddress,changeSelectedAddress,}
})
  1. 选中收货地址
// 单纯的阻止冒泡,否则修改页面没法跳转@tap.stop="() => {}"// 修改收货地址
const onChangeAddress = (item: AddressItem) => {//修改地址const addressStore = useAddressStore()addressStore.changeSelectedAddress(item)// 返回上一页uni.navigateBack()
}

3.立即购买

在这里插入图片描述

  1. 封装
export const getmemberOrderPreNowAPI = (data: {skuId: stringcount: stringaddressId?: string
}) => {return http<OrderPreResult>({method: 'GET',url: '/member/order/pre/now',data,})
}
  1. 立即购买事件,跳转页面传参
 @buy-now="onBuyNow"// 立即购买
const onBuyNow = (ev: SkuPopupEvent) => {// 跳转并传参uni.navigateTo({ url: `/pagesOrder/create/create?skuId=${ev._id}&count=${ev.buy_num}` })
}
  1. 立即购买
// 页面参数
const query = defineProps<{// 可有可无skuId?: stringcount?: string
}>()// 获取订单信息
const orderPre = ref<OrderPreResult>()
const getmemberOrderPreData = async () => {if (query.count && query.skuId) {const res = await getmemberOrderPreNowAPI({skuId: query.skuId,count: query.count,})orderPre.value = res.result} else {const res = await getmemberOrderPreAPI()orderPre.value = res.result}
}

4.提交订单

  1. 封装请求API
// /member/order
export const postMemberOrderAPI = (data: OrderCreateParams) => {return http<{ id: string }>({method: 'POST',url: '/member/order',data,})
}
  1. 类型声明文件
  2. 提交按钮事件
  3. 调用接口成功
  4. 跳转订单详情
// 提交订单
const onOrderSubmit = async () => {if (!selectedAddress.value?.id) {uni.showToast({ title: '请选择收货地址' })}const res = await postMemberOrderAPI({addressId: selectedAddress.value!.id,buyerMessage: buyerMessage.value,deliveryTimeType: activeDelivery.value.type,goods: orderPre.value!.goods.map((v) => ({ count: v.count, skuId: v.skuId })),payChannel: 2,payType: 1,})// 关闭当前页面,再跳转uni.redirectTo({ url: `/pagesOrder/detail/detail?id=${res.result.id}` })
}
  1. 无收货地址交互

5.自定义导航栏交互

在这里插入图片描述

  1. 导航栏左上角按钮,返回首页
// 获取页面栈
// pages是一个数组
const pages = getCurrentPages()
// 获取当前页面实例,数组最后一项
const pageInstance = pages.at(-1) as any<navigatorv-if="pages.length > 1"open-type="navigateBack"class="back icon-left"></navigator>
  1. 滚动驱动的动画

// 页面渲染完毕,绑定动画效果d
onReady(() => {// 动画效果,导航栏背景色pageInstance.animate('.navbar', // 选择器[{ backgroundColor: 'transparent' }, { backgroundColor: '#f8f8f8' }], // 关键帧信息1000, // 动画持续时长{scrollSource: '#scroller', // scroll-view 的选择器startScrollOffset: 0, // 开始滚动偏移量endScrollOffset: 50, // 停止滚动偏移量timeRange: 1000, // 时间长度},)// 动画效果,导航栏标题pageInstance.animate('.navbar .title', [{ color: 'transparent' }, { color: '#000' }], 1000, {scrollSource: '#scroller',timeRange: 1000,startScrollOffset: 0,endScrollOffset: 50,})// 动画效果,导航栏返回按钮pageInstance.animate('.navbar .back', [{ color: '#fff' }, { color: '#000' }], 1000, {scrollSource: '#scroller',timeRange: 1000,startScrollOffset: 0,endScrollOffset: 50,})
})

6.订单状态渲染

在这里插入图片描述

  1. 渲染订单状态
 <template v-if="order"><!-- 订单状态 --><view class="overview" :style="{ paddingTop: safeAreaInsets!.top + 20 + 'px' }"><!-- 待付款状态:展示去支付按钮和倒计时 --><template v-if="order.orderState === OrderState.DaiFuKuan"><view class="status icon-clock">等待付款</view><view class="tips"><text class="money">应付金额: ¥ 99.00</text><text class="time">支付剩余</text>00 时 29 分 59 秒</view><view class="button">去支付</view></template><!-- 其他订单状态:展示再次购买按钮 --><template v-else><!-- 订单状态文字 --><view class="status"> {{ orderStateList[order.orderState].text }} </view><view class="button-group"><navigatorclass="button":url="`/pagesOrder/create/create?orderId=${query.id}`"hover-class="none">再次购买</navigator><!-- 待发货状态:模拟发货,开发期间使用,用于修改订单状态为已发货 --><view v-if="false" class="button"> 模拟发货 </view></view></template></view>
  1. 订单状态常量
/** 订单状态枚举 */
export enum OrderState {/** 待付款 */DaiFuKuan = 1,/** 待发货 */DaiFaHuo = 2,/** 待收货 */DaiShouHuo = 3,/** 待评价 */DaiPingJia = 4,/** 已完成 */YiWanCheng = 5,/** 已取消 */YiQuXiao = 6,
}/** 订单状态列表 */
export const orderStateList = [{ id: 0, text: '' },{ id: 1, text: '待付款' },{ id: 2, text: '待发货' },{ id: 3, text: '待收货' },{ id: 4, text: '待评价' },{ id: 5, text: '已完成' },{ id: 6, text: '已取消' },
]

7.待支付倒计时

在这里插入图片描述

//倒计时
const onTimeUp = () => {// 修改订单状态为已取消order.value!.orderState = OrderState.YiQuXiao
}<uni-countdowncolor="#fff":show-colon="false":show-day="false"splitor-color="#fff":second="order.countdown"@timeup="onTimeUp"/>

8. 代付款-订单支付

在这里插入图片描述

// 去支付
const onOrderPay = async () => {if (import.meta.env.DEV) {// 开发环境模拟支付await getPayMockAPI({ orderId: query.id })} else {// 正式微信支付const res = await getPayWxPayMiniPayAPI({ orderId: query.id })wx.requestPayment(res.result)}// 关闭当前页,再跳转uni.redirectTo({ url: `/pagesOrder/Payment/Payment?id=${query.id}` })
}
主要测试,开发环境模拟支付,即可

9.待发货-模拟发货

在这里插入图片描述

  1. dev环境
// 是否为开发环境
const isDev = import.meta.env.DEV<view@tap="onOrderSend"v-if="isDev && order.orderState === OrderState.DaiFaHuo"class="button">模拟发货</view>
  1. 模拟发货,并更新订单状态
// 模拟发货
const onOrderSend = async () => {if (isDev) {await getMemberOrderConsignmentByIdAPI(query.id)// 轻提示uni.showToast({ icon: 'success', title: '模拟成功' })// 主动更新订单状态order.value!.orderState = OrderState.DaiFaHuo}
}

打包时这里的代码会被自动剔除,优化掉

10.待收货-确认收货

仅在订单状态为待收货时,可确认收货
在这里插入图片描述

// 待收货=>确认收货
const onOrderConfirm = () => {// 二次确认弹窗uni.showModal({content: '为保障你的权益,请收到货并确认无误后,再确认收货',success: async (success) => {if (success.confirm) {const res = await putMemberOrderReceiptByIdAPI(query.id)// 主动更新order.value = res.result}},})
}<!-- 待收货状态: 展示确认收货按钮 --><viewv-if="order.orderState === OrderState.DaiShouHuo"@tap="onOrderConfirm"class="button">确认收货</view>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91383.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91383.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91383.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文略读:GINGER: Grounded Information Nugget-Based Generation of Responses

SIGIR 2025用户日益依赖对话助手&#xff08;如 ChatGPT&#xff09;来满足多种信息需求&#xff0c;这些需求包括开放式问题、需要推理的间接回答&#xff0c;以及答案分布在多个段落中的复杂查询RAG试图通过在生成过程中引入检索到的信息来解决这些问题但如何确保回应的透明性…

从内部保护你的网络

想象一下&#xff0c;你是一家高端俱乐部的老板&#xff0c;商务贵宾们聚集在这里分享信息、放松身心。然后假设你雇佣了最顶尖的安保人员——“保镖”——站在门口&#xff0c;确保你准确掌握所有进出的人员&#xff0c;并确保所有人的安全。不妨想象一下丹尼尔克雷格和杜安约…

Redis 中 ZipList 的级联更新问题

ZipList 的结构ZipList 是 Redis 中用于实现 ZSet 的压缩数据结构&#xff0c;其元素采用连续存储方式&#xff0c;具有很高的内存紧凑性。ZipList 结构组成如下&#xff1a;zlbytes&#xff1a;4字节&#xff0c;记录整个ziplist的字节数zltail&#xff1a;4字节&#xff0c;记…

【苍穹外卖项目】Day05

&#x1f4d8;博客主页&#xff1a;程序员葵安 &#x1faf6;感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 一、Redis入门 Redis简介 Redis是一个基于内存的 key-value 结构数据库 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热…

语音识别dolphin 学习笔记

目录 Dolphin简介 Dolphin 中共有 4 个模型&#xff0c;其中 2 个现在可用。 使用demo Dolphin简介 Dolphin 是由 Dataocean AI 和清华大学合作开发的多语言、多任务语音识别模型。它支持东亚、南亚、东南亚和中东的 40 种东方语言&#xff0c;同时支持 22 种汉语方言。该模…

视频生成中如何选择GPU或NPU?

在视频生成中选择GPU还是NPU&#xff0c;核心是根据场景需求、技术约束和成本目标来匹配两者的特性。以下是具体的决策框架和场景化建议&#xff1a; 核心决策依据&#xff1a;先明确你的“视频生成需求” 选择前需回答3个关键问题&#xff1a; 生成目标&#xff1a;视频分辨率…

从豆瓣小组到深度洞察:一个基于Python的舆情分析爬虫实践

文章目录 从豆瓣小组到深度洞察:一个基于Python的舆情分析爬虫实践 摘要 1. 背景 2. 需求分析 3. 技术选型与实现 3.1 总体架构 3.2 核心代码解析 4. 难点分析与解决方案 5. 总结与展望 对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学:https://blog.csdn.net/weixin_…

RustDesk 使用教程

说明&#xff1a; 使用RustDesk 需要在不同的电脑安装对应系统型号的客户端&#xff0c;然后再去云服务器安装一个服务端即可。 1、到网站下载客户端&#xff1a;https://rustdesk.com/zh-cn/ 两台电脑安装客户端。 2、在云服务器安装服务端 1&#xff09;官网教程&#xff1a;…

【C语言网络编程基础】TCP 服务器详解

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种可靠、面向连接的协议。一个 TCP 服务器正是基于这种协议&#xff0c;为客户端提供稳定的网络服务。本文将详细介绍 TCP 服务器的基本原理和工作流程。 一、什…

一篇就够!Windows上Docker Desktop安装 + 汉化完整指南(包含解决wsl更新失败方案)

前言 在现代软件开发和人工智能应用中&#xff0c;环境的稳定性和可移植性至关重要。Docker 作为一种轻量级的容器化技术&#xff0c;为开发者提供一致的运行环境&#xff0c;使得软件可以在不同平台上无缝运行&#xff0c;极大地提升了开发和部署的效率。无论是本地开发、测试…

设计模式(二十四)行为型:访问者模式详解

设计模式&#xff08;二十四&#xff09;行为型&#xff1a;访问者模式详解访问者模式&#xff08;Visitor Pattern&#xff09;是 GoF 23 种设计模式中最具争议性但也最强大的行为型模式之一&#xff0c;其核心价值在于将作用于某种数据结构中的各元素的操作分离出来&#xff…

USRP X440 和USRP X410 直接RF采样架构的优势

USRP X440 和USRP X410 直接RF采样架构的优势概述什么是直接RF采样&#xff1f;如何实现直接采样&#xff1f;什么情况下应考虑使用直接RF采样架构&#xff1f;概述 转换器技术每年都在发展。主要半导体公司的模数转换器(ADC)和数模转换器(DAC)的采样速率比十年前的产品快了好…

P4568 [JLOI2011] 飞行路线

P4568 [JLOI2011] 飞行路线 题目描述 Alice 和 Bob 现在要乘飞机旅行&#xff0c;他们选择了一家相对便宜的航空公司。该航空公司一共在 nnn 个城市设有业务&#xff0c;设这些城市分别标记为 000 到 n−1n-1n−1&#xff0c;一共有 mmm 种航线&#xff0c;每种航线连接两个城市…

MySQL 中的聚簇索引和非聚簇索引的区别

MySQL 中的聚簇索引和非聚簇索引的区别 总结性回答 聚簇索引和非聚簇索引的主要区别在于索引的组织方式和数据存储位置。聚簇索引决定了表中数据的物理存储顺序&#xff0c;一个表只能有一个聚簇索引&#xff1b;而非聚簇索引是独立于数据存储的额外结构&#xff0c;一个表可以…

全局异常处理,可以捕捉到过滤器中的异常吗?

全局异常处理,可以捕捉到过滤器中的异常吗? 全局异常处理器(如Spring的@ControllerAdvice+@ExceptionHandler)默认无法直接捕获过滤器(Filter)中抛出的异常,这是由过滤器和Spring MVC的执行顺序及职责边界决定的。具体原因和解决方案如下: 一、为什么全局异常处理器默…

市政道路积水监测系统:守护城市雨天出行安全的 “智慧防线”

市政道路积水监测系统&#xff1a;守护城市雨天出行安全的 “智慧防线”柏峰【BF-DMJS】每逢汛期&#xff0c;强降雨引发的城市道路积水问题&#xff0c;不仅会造成交通拥堵&#xff0c;更可能危及行人和车辆安全&#xff0c;成为困扰城市管理的一大难题。传统的积水监测主要依…

搭建HAProxy高可用负载均衡系统

一、HAProxy简介Haproxy 是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。haproxy优点 1. Haproxy支持两种代理模式 TCP&#xff08;四层&#xff09;和HTTP&#xff08;七层&#xff09;&#x…

GO语言 go get 下载 下来的包存放在哪里

在 Go 中&#xff0c;通过 go get&#xff08;或 Go Modules 下的自动下载&#xff09;获取的第三方包&#xff0c;具体存储位置取决于你是否启用了 Go Modules&#xff08;推荐方式&#xff09;。✅ 1. 如果你使用了 Go Modules&#xff08;Go 1.11 默认开启&#xff09;当前 …

PostgreSQL 14.4 ARM64 架构源码编译安装指南

PostgreSQL 14.4 ARM64 架构源码编译安装指南文章目录PostgreSQL 14.4 ARM64 架构源码编译安装指南说明环境要求操作系统1. 系统环境准备1.1 更新系统包1.2 创建 PostgreSQL 用户2. 解压 PostgreSQL 14.4 源码包3. 配置编译选项4. 编译源代码5. 安装 PostgreSQL6. 初始化数据库…

【科普】在STM32中有哪些定时器?

在 STM32 单片机中&#xff0c;定时器种类丰富&#xff0c;不同系列&#xff08;如 F1、F4、H7 等&#xff09;略有差异&#xff0c;以下是常见的定时器类型及核心特点&#xff1a;1. 基本定时器&#xff08;TIM6、TIM7&#xff09;功能&#xff1a;仅具备定时计数功能&#xf…