forked from natuka/web.puabadge.com
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.0 KiB
156 lines
4.0 KiB
<template> |
|
<div class="my-order"> |
|
<div class="header" @click="goBack"> |
|
<span class="back-icon"><van-icon name="arrow-left" size="16px" color="#333" /> {{ toValueWithout(config.myOrder.messages.title) }}</span> |
|
</div> |
|
<div class="order-list" v-if="orders.length > 0"> |
|
<div class="order-item" @click="OrderDetail(item.id)" v-for="item in orders" :key="item.id"> |
|
<img class="order-img" :src="item.path" alt="order1" /> |
|
<span class="order-status status-finished">{{ getStatus(item.status) }}</span> |
|
</div> |
|
</div> |
|
<div v-else class="record-image-item-null"> |
|
<img :src="nullDataImage" :alt="toValueWithout(config.myOrder.messages.noData)"> |
|
</div> |
|
</div> |
|
</template> |
|
|
|
<script setup lang="ts"> |
|
import { useRouter } from 'vue-router' |
|
import * as badgeApi from '@/api/badge' |
|
import { onMounted, ref } from 'vue' |
|
import { toValueWithout } from '@/lang/utils' |
|
import { cartoonConfig as config } from '@/config/cartoon' |
|
import nullDataImage from '@/assets/badge/null-data.png' |
|
|
|
const router = useRouter() |
|
const page = ref(config.myOrder.pagination.initialPage) |
|
const loading = ref(false) |
|
const finished = ref(false) |
|
const orders = ref([]) |
|
|
|
onMounted(() => { |
|
getOrder() |
|
}) |
|
|
|
function getOrder() { |
|
if(loading.value) return |
|
loading.value = true |
|
badgeApi.getMyOrder({ |
|
page: page.value, |
|
size: config.myOrder.pagination.pageSize, |
|
status: config.myOrder.pagination.defaultStatus, |
|
}).then((res: any) => { |
|
if(page.value === config.myOrder.pagination.initialPage) { |
|
orders.value = res.list |
|
} else { |
|
orders.value.push(...res.list) |
|
} |
|
if(res.total <= orders.value.length) { |
|
finished.value = true |
|
} else { |
|
page.value++ |
|
} |
|
}).finally(() => { |
|
loading.value = false |
|
}) |
|
} |
|
|
|
function goBack() { |
|
router.push(config.routes.home) |
|
} |
|
|
|
function OrderDetail(id: number) { |
|
router.push({ |
|
path: config.routes.orderDetail, |
|
query: { |
|
id: id, |
|
}, |
|
}) |
|
} |
|
|
|
function getStatus(status: number) { |
|
const statusText = config.myOrder.statusText[status] |
|
if (statusText) { |
|
return toValueWithout(statusText) |
|
} |
|
return '' |
|
} |
|
</script> |
|
|
|
<style scoped> |
|
.header { |
|
display: flex; |
|
align-items: center; |
|
height: 40px; |
|
font-size: 14px; |
|
color: #999; |
|
padding: 16px 16px 0 16px; |
|
} |
|
|
|
.back-icon { |
|
margin-right: 8px; |
|
color: #222; |
|
font-size: 16px; |
|
cursor: pointer; |
|
} |
|
|
|
.order-list { |
|
display: flex; |
|
flex-wrap: wrap; |
|
gap: v-bind('config.myOrder.styles.gap + "px"'); |
|
padding: v-bind('config.myOrder.styles.padding.vertical + "px"') v-bind('config.myOrder.styles.padding.horizontal + "px"'); |
|
} |
|
|
|
.order-item { |
|
position: relative; |
|
width: v-bind('config.myOrder.styles.itemWidth'); |
|
height: v-bind('config.myOrder.styles.itemHeight'); |
|
box-shadow: v-bind('config.myOrder.styles.shadow'); |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
flex-direction: column; |
|
} |
|
|
|
.order-img { |
|
width: 100%; |
|
height: 100%; |
|
object-fit: cover; |
|
border-radius: v-bind('config.myOrder.styles.borderRadius + "px"'); |
|
} |
|
|
|
.order-status { |
|
position: absolute; |
|
bottom: v-bind('config.myOrder.styles.status.bottom + "px"'); |
|
right: v-bind('config.myOrder.styles.status.right + "px"'); |
|
padding: v-bind('config.myOrder.styles.status.padding.vertical + "px"') v-bind('config.myOrder.styles.status.padding.horizontal + "px"'); |
|
border-radius: v-bind('config.myOrder.styles.status.borderRadius + "px"'); |
|
font-size: v-bind('config.myOrder.styles.status.fontSize + "px"'); |
|
color: v-bind('config.myOrder.statusStyles.default.color'); |
|
background: v-bind('config.myOrder.statusStyles.default.background'); |
|
opacity: v-bind('config.myOrder.statusStyles.default.opacity'); |
|
pointer-events: none; |
|
} |
|
|
|
.status-processing { |
|
background: v-bind('config.myOrder.statusStyles.processing.background'); |
|
} |
|
|
|
.status-finished { |
|
background: v-bind('config.myOrder.statusStyles.finished.background'); |
|
} |
|
|
|
.record-image-item-null { |
|
height: 50vh; |
|
display: flex; |
|
justify-content: center; |
|
align-items: center; |
|
} |
|
|
|
.record-image-item-null img { |
|
width: 80vw; |
|
height: 200px; |
|
} |
|
</style> |
|
|
|
|