UniappDay06

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…