detail.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <div>
  3. <Navbar class="mb-3" />
  4. <div class="default-width pb-5">
  5. <v-banner color="primary" :text="formatOrderStatusDescription(order)" style="background-color: #00897B; color: #fff;"></v-banner>
  6. <v-row no-gutters class="mt-3">
  7. <v-col span="6">
  8. <!-- 订单信息 -->
  9. <v-card class="pa-5">
  10. <h3>订单信息</h3>
  11. <v-divider class="my-3"></v-divider>
  12. <div class="font-size-15 color-666">
  13. <p>订单编号:{{ order.no }}</p>
  14. <p class="my-3">下单时间:{{ timesTampChange(order.createTime) }}</p>
  15. <p>支付时间:{{ timesTampChange(order.payTime) }}</p>
  16. <p class="mt-3">支付方式:{{ order.payChannelName }}</p>
  17. <p class="mt-3">订单备注:{{ order.userRemark }}</p>
  18. </div>
  19. </v-card>
  20. </v-col>
  21. <v-col span="6" class="ml-3">
  22. <!-- 物流信息 -->
  23. <v-card class="pa-5" style="height: 100%">
  24. <h3>物流信息</h3>
  25. <v-divider class="my-3"></v-divider>
  26. <div class="font-size-15 color-666">
  27. <p>收货地址:{{ order.receiverName }},{{ order.receiverMobile }},{{ order.receiverAreaName }} {{ order.receiverDetailAddress }}</p>
  28. <p class="my-3">物流公司:{{ order.logisticsName }}</p>
  29. <p>运单号:{{ order.logisticsNo }}</p>
  30. </div>
  31. </v-card>
  32. </v-col>
  33. </v-row>
  34. <!-- 商品列表 -->
  35. <v-card class="my-3 pa-5">
  36. <h3 class="mb-3">商品列表</h3>
  37. <v-divider></v-divider>
  38. <CtTable
  39. class="mt-3"
  40. :items="order.items"
  41. :headers="headers"
  42. :loading="false"
  43. :elevation="0"
  44. :isTools="false"
  45. :showPage="false"
  46. itemKey="id"
  47. >
  48. <template #picUrl="{ item }">
  49. <v-img :src="item.picUrl" width="90" height="90"></v-img>
  50. </template>
  51. <template #spuName="{ item }">
  52. <span class="color-primary cursor-pointer" @click="handleToGoodsDetail(item)">{{ item.spuName }}</span>
  53. </template>
  54. </CtTable>
  55. <div class="text-end color-primary mr-3 mt-5 font-size-20">
  56. 共{{ order.productCount }}件商品,合计:¥{{ fen2yuan(order.payPrice) }}
  57. </div>
  58. </v-card>
  59. </div>
  60. </div>
  61. </template>
  62. <script setup>
  63. defineOptions({ name: 'mall-user-order-detail'})
  64. import { ref, onMounted } from 'vue'
  65. import { useRouter } from 'vue-router'
  66. import { getMallOrderDetail } from '@/api/mall/user'
  67. import Snackbar from '@/plugins/snackbar'
  68. import Navbar from '../../components/navbar.vue'
  69. import { timesTampChange } from '@/utils/date'
  70. import { fen2yuan, formatOrderStatusDescription } from '@/hooks/web/useGoods'
  71. const router = useRouter()
  72. const { id } = router.currentRoute.value.params
  73. const order = ref({})
  74. const headers = [
  75. { title: '', key: 'picUrl', sortable: false },
  76. { title: '商品名称', key: 'spuName', sortable: false },
  77. { title: '规格', key: 'contactAddress', sortable: false, value: item => item.properties.map((property) => property.valueName).join(' ') },
  78. { title: '单价', key: 'price', sortable: false, value: item => '¥' + fen2yuan(item.price) },
  79. { title: '数量', key: 'count', sortable: false }
  80. ]
  81. onMounted(async () =>{
  82. if (!id) return Snackbar.error('订单不存在')
  83. const data = await getMallOrderDetail(id)
  84. order.value = data
  85. })
  86. // 跳转商品详情
  87. const handleToGoodsDetail = (item) => {
  88. window.open(`/mall/goodsDetail/${item.spuId}`)
  89. }
  90. </script>
  91. <style scoped lang="scss">
  92. </style>