1 changed files with 686 additions and 0 deletions
@ -0,0 +1,686 @@ |
|||
<template> |
|||
<!-- 自定义导航栏: 默认透明不可见, scroll-view 滚动到 50 时展示 --> |
|||
<view class="navbar" :style="{ paddingTop: safeAreaInsets?.top + 'px' }"> |
|||
<view class="wrap"> |
|||
<navigator |
|||
v-if="pages.length > 1" |
|||
open-type="navigateBack" |
|||
class="back icon-left" |
|||
></navigator> |
|||
<navigator v-else url="/pages/index/index" open-type="switchTab" class="back icon-home"> |
|||
</navigator> |
|||
<view class="title">订单详情</view> |
|||
</view> |
|||
</view> |
|||
<scroll-view |
|||
enable-back-to-top |
|||
scroll-y |
|||
class="viewport" |
|||
id="scroller" |
|||
@scrolltolower="onScrolltolower" |
|||
> |
|||
<template v-if="true"> |
|||
<!-- 订单状态 --> |
|||
<view class="overview" :style="{ paddingTop: safeAreaInsets!.top + 20 + 'px' }"> |
|||
<!-- 待付款状态:展示去支付按钮和倒计时 --> |
|||
<template v-if="true"> |
|||
<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"> 待付款 </view> |
|||
<view class="button-group"> |
|||
<navigator |
|||
class="button" |
|||
:url="`/pagesOrder/create/create?orderId=${query.id}`" |
|||
hover-class="none" |
|||
> |
|||
再次购买 |
|||
</navigator> |
|||
<!-- 待发货状态:模拟发货,开发期间使用,用于修改订单状态为已发货 --> |
|||
<view v-if="false" class="button"> 模拟发货 </view> |
|||
</view> |
|||
</template> |
|||
</view> |
|||
<!-- 配送状态 --> |
|||
<view class="shipment"> |
|||
<!-- 订单物流信息 --> |
|||
<view v-for="item in 1" :key="item" class="item"> |
|||
<view class="message"> |
|||
您已在广州市天河区黑马程序员完成取件,感谢使用菜鸟驿站,期待再次为您服务。 |
|||
</view> |
|||
<view class="date"> 2023-04-14 13:14:20 </view> |
|||
</view> |
|||
<!-- 用户收货地址 --> |
|||
<view class="locate"> |
|||
<view class="user"> 张三 13333333333 </view> |
|||
<view class="address"> 广东省 广州市 天河区 黑马程序员 </view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 商品信息 --> |
|||
<view class="goods"> |
|||
<view class="item"> |
|||
<navigator |
|||
class="navigator" |
|||
v-for="item in 2" |
|||
:key="item" |
|||
:url="`/pages/goods/goods?id=${item}`" |
|||
hover-class="none" |
|||
> |
|||
<image |
|||
class="cover" |
|||
src="https://yanxuan-item.nosdn.127.net/c07edde1047fa1bd0b795bed136c2bb2.jpg" |
|||
></image> |
|||
<view class="meta"> |
|||
<view class="name ellipsis">ins风小碎花泡泡袖衬110-160cm</view> |
|||
<view class="type">藏青小花, 130</view> |
|||
<view class="price"> |
|||
<view class="actual"> |
|||
<text class="symbol">¥</text> |
|||
<text>99.00</text> |
|||
</view> |
|||
</view> |
|||
<view class="quantity">x1</view> |
|||
</view> |
|||
</navigator> |
|||
<!-- 待评价状态:展示按钮 --> |
|||
<view class="action" v-if="true"> |
|||
<view class="button primary">申请售后</view> |
|||
<navigator url="" class="button"> 去评价 </navigator> |
|||
</view> |
|||
</view> |
|||
<!-- 合计 --> |
|||
<view class="total"> |
|||
<view class="row"> |
|||
<view class="text">商品总价: </view> |
|||
<view class="symbol">99.00</view> |
|||
</view> |
|||
<view class="row"> |
|||
<view class="text">运费: </view> |
|||
<view class="symbol">10.00</view> |
|||
</view> |
|||
<view class="row"> |
|||
<view class="text">应付金额: </view> |
|||
<view class="symbol primary">109.00</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 订单信息 --> |
|||
<view class="detail"> |
|||
<view class="title">订单信息</view> |
|||
<view class="row"> |
|||
<view class="item"> |
|||
订单编号: {{ query.id }} <text class="copy" @tap="onCopy(query.id)">复制</text> |
|||
</view> |
|||
<view class="item">下单时间: 2023-04-14 13:14:20</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<!-- 猜你喜欢 --> |
|||
<XtxGuess ref="guessRef" /> |
|||
|
|||
<!-- 底部操作栏 --> |
|||
<view class="toolbar-height" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }"></view> |
|||
<view class="toolbar" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }"> |
|||
<!-- 待付款状态:展示支付按钮 --> |
|||
<template v-if="true"> |
|||
<view class="button primary"> 去支付 </view> |
|||
<view class="button" @tap="popup?.open?.()"> 取消订单 </view> |
|||
</template> |
|||
<!-- 其他订单状态:按需展示按钮 --> |
|||
<template v-else> |
|||
<navigator |
|||
class="button secondary" |
|||
:url="`/pagesOrder/create/create?orderId=${query.id}`" |
|||
hover-class="none" |
|||
> |
|||
再次购买 |
|||
</navigator> |
|||
<!-- 待收货状态: 展示确认收货 --> |
|||
<view class="button primary"> 确认收货 </view> |
|||
<!-- 待评价状态: 展示去评价 --> |
|||
<view class="button"> 去评价 </view> |
|||
<!-- 待评价/已完成/已取消 状态: 展示删除订单 --> |
|||
<view class="button delete"> 删除订单 </view> |
|||
</template> |
|||
</view> |
|||
</template> |
|||
<template v-else> |
|||
<!-- 骨架屏组件 --> |
|||
<PageSkeleton /> |
|||
</template> |
|||
</scroll-view> |
|||
<!-- 取消订单弹窗 --> |
|||
<uni-popup ref="popup" type="bottom" background-color="#fff"> |
|||
<view class="popup-root"> |
|||
<view class="title">订单取消</view> |
|||
<view class="description"> |
|||
<view class="tips">请选择取消订单的原因:</view> |
|||
<view class="cell" v-for="item in reasonList" :key="item" @tap="reason = item"> |
|||
<text class="text">{{ item }}</text> |
|||
<text class="icon" :class="{ checked: item === reason }"></text> |
|||
</view> |
|||
</view> |
|||
<view class="footer"> |
|||
<view class="button" @tap="popup?.close?.()">取消</view> |
|||
<view class="button primary">确认</view> |
|||
</view> |
|||
</view> |
|||
</uni-popup> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
import { onReady } from '@dcloudio/uni-app' |
|||
import { useGuessList } from '@/composables' |
|||
import { ref } from 'vue' |
|||
|
|||
// 获取屏幕边界到安全区域距离 |
|||
const { safeAreaInsets } = uni.getSystemInfoSync() |
|||
// 猜你喜欢 |
|||
const { guessRef, onScrolltolower } = useGuessList() |
|||
// 弹出层组件 |
|||
const popup = ref<UniHelper.UniPopupInstance>() |
|||
// 取消原因列表 |
|||
const reasonList = ref([ |
|||
'商品无货', |
|||
'不想要了', |
|||
'商品信息填错了', |
|||
'地址信息填写错误', |
|||
'商品降价', |
|||
'其它', |
|||
]) |
|||
// 订单取消原因 |
|||
const reason = ref('') |
|||
// 复制内容 |
|||
const onCopy = (id: string) => { |
|||
// 设置系统剪贴板的内容 |
|||
uni.setClipboardData({ data: id }) |
|||
} |
|||
// 获取页面参数 |
|||
const query = defineProps<{ |
|||
id: string |
|||
}>() |
|||
|
|||
// 获取页面栈 |
|||
const pages = getCurrentPages() |
|||
|
|||
// 获取当前页面实例,数组最后一项 |
|||
const pageInstance = pages.at(-1) as any |
|||
|
|||
// 页面渲染完毕,绑定动画效果 |
|||
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, |
|||
}) |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
page { |
|||
display: flex; |
|||
flex-direction: column; |
|||
height: 100%; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
.navbar { |
|||
width: 750rpx; |
|||
color: #000; |
|||
position: fixed; |
|||
top: 0; |
|||
left: 0; |
|||
z-index: 9; |
|||
/* background-color: #f8f8f8; */ |
|||
background-color: transparent; |
|||
|
|||
.wrap { |
|||
position: relative; |
|||
|
|||
.title { |
|||
height: 44px; |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
font-size: 32rpx; |
|||
/* color: #000; */ |
|||
color: transparent; |
|||
} |
|||
|
|||
.back { |
|||
position: absolute; |
|||
left: 0; |
|||
height: 44px; |
|||
width: 44px; |
|||
font-size: 44rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
/* color: #000; */ |
|||
color: #fff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.viewport { |
|||
background-color: #f7f7f8; |
|||
} |
|||
|
|||
.overview { |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
|
|||
line-height: 1; |
|||
padding-bottom: 30rpx; |
|||
color: #fff; |
|||
background-image: url(https://pcapi-xiaotuxian-front-devtest.itheima.net/miniapp/images/order_bg.png); |
|||
background-size: cover; |
|||
|
|||
.status { |
|||
font-size: 36rpx; |
|||
} |
|||
|
|||
.status::before { |
|||
margin-right: 6rpx; |
|||
font-weight: 500; |
|||
} |
|||
|
|||
.tips { |
|||
margin: 30rpx 0; |
|||
display: flex; |
|||
font-size: 14px; |
|||
align-items: center; |
|||
|
|||
.money { |
|||
margin-right: 30rpx; |
|||
} |
|||
} |
|||
|
|||
.button-group { |
|||
margin-top: 30rpx; |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
|
|||
.button { |
|||
width: 260rpx; |
|||
height: 64rpx; |
|||
margin: 0 10rpx; |
|||
text-align: center; |
|||
line-height: 64rpx; |
|||
font-size: 28rpx; |
|||
color: #27ba9b; |
|||
border-radius: 68rpx; |
|||
background-color: #fff; |
|||
} |
|||
} |
|||
|
|||
.shipment { |
|||
line-height: 1.4; |
|||
padding: 0 20rpx; |
|||
margin: 20rpx 20rpx 0; |
|||
border-radius: 10rpx; |
|||
background-color: #fff; |
|||
|
|||
.locate, |
|||
.item { |
|||
min-height: 120rpx; |
|||
padding: 30rpx 30rpx 25rpx 75rpx; |
|||
background-size: 50rpx; |
|||
background-repeat: no-repeat; |
|||
background-position: 6rpx center; |
|||
} |
|||
|
|||
.locate { |
|||
background-image: url(https://pcapi-xiaotuxian-front-devtest.itheima.net/miniapp/images/locate.png); |
|||
|
|||
.user { |
|||
font-size: 26rpx; |
|||
color: #444; |
|||
} |
|||
|
|||
.address { |
|||
font-size: 24rpx; |
|||
color: #666; |
|||
} |
|||
} |
|||
|
|||
.item { |
|||
background-image: url(https://pcapi-xiaotuxian-front-devtest.itheima.net/miniapp/images/car.png); |
|||
border-bottom: 1rpx solid #eee; |
|||
position: relative; |
|||
|
|||
.message { |
|||
font-size: 26rpx; |
|||
color: #444; |
|||
} |
|||
|
|||
.date { |
|||
font-size: 24rpx; |
|||
color: #666; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.goods { |
|||
margin: 20rpx 20rpx 0; |
|||
padding: 0 20rpx; |
|||
border-radius: 10rpx; |
|||
background-color: #fff; |
|||
|
|||
.item { |
|||
padding: 30rpx 0; |
|||
border-bottom: 1rpx solid #eee; |
|||
|
|||
.navigator { |
|||
display: flex; |
|||
margin: 20rpx 0; |
|||
} |
|||
|
|||
.cover { |
|||
width: 170rpx; |
|||
height: 170rpx; |
|||
border-radius: 10rpx; |
|||
margin-right: 20rpx; |
|||
} |
|||
|
|||
.meta { |
|||
flex: 1; |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
position: relative; |
|||
} |
|||
|
|||
.name { |
|||
height: 80rpx; |
|||
font-size: 26rpx; |
|||
color: #444; |
|||
} |
|||
|
|||
.type { |
|||
line-height: 1.8; |
|||
padding: 0 15rpx; |
|||
margin-top: 6rpx; |
|||
font-size: 24rpx; |
|||
align-self: flex-start; |
|||
border-radius: 4rpx; |
|||
color: #888; |
|||
background-color: #f7f7f8; |
|||
} |
|||
|
|||
.price { |
|||
display: flex; |
|||
margin-top: 6rpx; |
|||
font-size: 24rpx; |
|||
} |
|||
|
|||
.symbol { |
|||
font-size: 20rpx; |
|||
} |
|||
|
|||
.original { |
|||
color: #999; |
|||
text-decoration: line-through; |
|||
} |
|||
|
|||
.actual { |
|||
margin-left: 10rpx; |
|||
color: #444; |
|||
} |
|||
|
|||
.text { |
|||
font-size: 22rpx; |
|||
} |
|||
|
|||
.quantity { |
|||
position: absolute; |
|||
bottom: 0; |
|||
right: 0; |
|||
font-size: 24rpx; |
|||
color: #444; |
|||
} |
|||
|
|||
.action { |
|||
display: flex; |
|||
flex-direction: row-reverse; |
|||
justify-content: flex-start; |
|||
padding: 30rpx 0 0; |
|||
|
|||
.button { |
|||
width: 200rpx; |
|||
height: 60rpx; |
|||
text-align: center; |
|||
justify-content: center; |
|||
line-height: 60rpx; |
|||
margin-left: 20rpx; |
|||
border-radius: 60rpx; |
|||
border: 1rpx solid #ccc; |
|||
font-size: 26rpx; |
|||
color: #444; |
|||
} |
|||
|
|||
.primary { |
|||
color: #27ba9b; |
|||
border-color: #27ba9b; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.total { |
|||
line-height: 1; |
|||
font-size: 26rpx; |
|||
padding: 20rpx 0; |
|||
color: #666; |
|||
|
|||
.row { |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: space-between; |
|||
padding: 10rpx 0; |
|||
} |
|||
|
|||
.symbol::before { |
|||
content: '¥'; |
|||
font-size: 80%; |
|||
margin-right: 3rpx; |
|||
} |
|||
|
|||
.primary { |
|||
color: #cf4444; |
|||
font-size: 36rpx; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.detail { |
|||
line-height: 1; |
|||
padding: 30rpx 20rpx 0; |
|||
margin: 20rpx 20rpx 0; |
|||
font-size: 26rpx; |
|||
color: #666; |
|||
border-radius: 10rpx; |
|||
background-color: #fff; |
|||
|
|||
.title { |
|||
font-size: 30rpx; |
|||
color: #444; |
|||
} |
|||
|
|||
.row { |
|||
padding: 20rpx 0; |
|||
|
|||
.item { |
|||
padding: 10rpx 0; |
|||
display: flex; |
|||
align-items: center; |
|||
} |
|||
|
|||
.copy { |
|||
border-radius: 20rpx; |
|||
font-size: 20rpx; |
|||
border: 1px solid #ccc; |
|||
padding: 5rpx 10rpx; |
|||
margin-left: 10rpx; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.toolbar-height { |
|||
height: 100rpx; |
|||
box-sizing: content-box; |
|||
} |
|||
|
|||
.toolbar { |
|||
position: fixed; |
|||
left: 0; |
|||
right: 0; |
|||
bottom: calc(var(--window-bottom)); |
|||
z-index: 1; |
|||
|
|||
height: 100rpx; |
|||
padding: 0 20rpx; |
|||
display: flex; |
|||
align-items: center; |
|||
flex-direction: row-reverse; |
|||
border-top: 1rpx solid #ededed; |
|||
border-bottom: 1rpx solid #ededed; |
|||
background-color: #fff; |
|||
box-sizing: content-box; |
|||
|
|||
.button { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
|
|||
width: 200rpx; |
|||
height: 72rpx; |
|||
margin-left: 15rpx; |
|||
font-size: 26rpx; |
|||
border-radius: 72rpx; |
|||
border: 1rpx solid #ccc; |
|||
color: #444; |
|||
} |
|||
|
|||
.delete { |
|||
order: 4; |
|||
} |
|||
|
|||
.button { |
|||
order: 3; |
|||
} |
|||
|
|||
.secondary { |
|||
order: 2; |
|||
color: #27ba9b; |
|||
border-color: #27ba9b; |
|||
} |
|||
|
|||
.primary { |
|||
order: 1; |
|||
color: #fff; |
|||
background-color: #27ba9b; |
|||
} |
|||
} |
|||
|
|||
.popup-root { |
|||
padding: 30rpx 30rpx 0; |
|||
border-radius: 10rpx 10rpx 0 0; |
|||
overflow: hidden; |
|||
|
|||
.title { |
|||
font-size: 30rpx; |
|||
text-align: center; |
|||
margin-bottom: 30rpx; |
|||
} |
|||
|
|||
.description { |
|||
font-size: 28rpx; |
|||
padding: 0 20rpx; |
|||
|
|||
.tips { |
|||
color: #444; |
|||
margin-bottom: 12rpx; |
|||
} |
|||
|
|||
.cell { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
padding: 15rpx 0; |
|||
color: #666; |
|||
} |
|||
|
|||
.icon::before { |
|||
content: '\e6cd'; |
|||
font-family: 'erabbit' !important; |
|||
font-size: 38rpx; |
|||
color: #999; |
|||
} |
|||
|
|||
.icon.checked::before { |
|||
content: '\e6cc'; |
|||
font-size: 38rpx; |
|||
color: #27ba9b; |
|||
} |
|||
} |
|||
|
|||
.footer { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
padding: 30rpx 0 40rpx; |
|||
font-size: 28rpx; |
|||
color: #444; |
|||
|
|||
.button { |
|||
flex: 1; |
|||
height: 72rpx; |
|||
text-align: center; |
|||
line-height: 72rpx; |
|||
margin: 0 20rpx; |
|||
color: #444; |
|||
border-radius: 72rpx; |
|||
border: 1rpx solid #ccc; |
|||
} |
|||
|
|||
.primary { |
|||
color: #fff; |
|||
background-color: #27ba9b; |
|||
border: none; |
|||
} |
|||
} |
|||
} |
|||
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue