mirror of
https://github.com/Megghy/vtsuru.live.git
synced 2025-12-06 18:36:55 +08:00
allow delete order, add question box pagination
This commit is contained in:
@@ -16,6 +16,7 @@ import {
|
|||||||
NButton,
|
NButton,
|
||||||
NDataTable,
|
NDataTable,
|
||||||
NDivider,
|
NDivider,
|
||||||
|
NEmpty,
|
||||||
NFlex,
|
NFlex,
|
||||||
NIcon,
|
NIcon,
|
||||||
NInput,
|
NInput,
|
||||||
@@ -60,6 +61,8 @@ const orderAsOwner = computed(() => {
|
|||||||
})
|
})
|
||||||
const selectedItem = ref<DataTableRowKey[]>()
|
const selectedItem = ref<DataTableRowKey[]>()
|
||||||
|
|
||||||
|
const emit = defineEmits(['selectedItem'])
|
||||||
|
|
||||||
const showDetailModal = ref(false)
|
const showDetailModal = ref(false)
|
||||||
const orderDetail = ref<ResponsePointOrder2UserModel | ResponsePointOrder2OwnerModel>()
|
const orderDetail = ref<ResponsePointOrder2UserModel | ResponsePointOrder2OwnerModel>()
|
||||||
const currentGoods = computed(() => {
|
const currentGoods = computed(() => {
|
||||||
@@ -350,6 +353,11 @@ onMounted(() => {
|
|||||||
:data="order"
|
:data="order"
|
||||||
:pagination="{ showSizePicker: true, pageSizes: [10, 25, 50, 100], defaultPageSize: 10, size: 'small' }"
|
:pagination="{ showSizePicker: true, pageSizes: [10, 25, 50, 100], defaultPageSize: 10, size: 'small' }"
|
||||||
size="small"
|
size="small"
|
||||||
|
@update:checked-row-keys="keys => emit('selectedItem', keys)"
|
||||||
|
>
|
||||||
|
<template #empty>
|
||||||
|
<NEmpty description="暂无订单" />
|
||||||
|
</template>
|
||||||
>
|
>
|
||||||
</NDataTable>
|
</NDataTable>
|
||||||
<NModal
|
<NModal
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import {
|
|||||||
NList,
|
NList,
|
||||||
NListItem,
|
NListItem,
|
||||||
NModal,
|
NModal,
|
||||||
|
NPagination,
|
||||||
NPopconfirm,
|
NPopconfirm,
|
||||||
NScrollbar,
|
NScrollbar,
|
||||||
NSelect,
|
NSelect,
|
||||||
@@ -44,7 +45,7 @@ import QrcodeVue from 'qrcode.vue'
|
|||||||
import { computed, onMounted, ref } from 'vue'
|
import { computed, onMounted, ref } from 'vue'
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router'
|
||||||
import QuestionItem from '@/components/QuestionItems.vue'
|
import QuestionItem from '@/components/QuestionItems.vue'
|
||||||
import { Delete24Filled, Delete24Regular, Eye24Filled, EyeOff24Filled, Info24Filled, } from '@vicons/fluent'
|
import { Delete24Filled, Delete24Regular, Eye24Filled, EyeOff24Filled, Info24Filled } from '@vicons/fluent'
|
||||||
import { useQuestionBox } from '@/store/useQuestionBox'
|
import { useQuestionBox } from '@/store/useQuestionBox'
|
||||||
|
|
||||||
const accountInfo = useAccount()
|
const accountInfo = useAccount()
|
||||||
@@ -65,6 +66,12 @@ const showSettingCard = ref(true)
|
|||||||
const shareCardRef = ref()
|
const shareCardRef = ref()
|
||||||
const shareUrl = computed(() => 'https://vtsuru.live/@' + accountInfo.value?.name + '/question-box')
|
const shareUrl = computed(() => 'https://vtsuru.live/@' + accountInfo.value?.name + '/question-box')
|
||||||
|
|
||||||
|
const ps = ref(20)
|
||||||
|
const pn = ref(1)
|
||||||
|
const pagedQuestions = computed(() =>
|
||||||
|
useQB.recieveQuestionsFiltered.slice((pn.value - 1) * ps.value, pn.value * ps.value),
|
||||||
|
)
|
||||||
|
|
||||||
let isRevieveGetted = false
|
let isRevieveGetted = false
|
||||||
let isSendGetted = false
|
let isSendGetted = false
|
||||||
async function onTabChange(value: string) {
|
async function onTabChange(value: string) {
|
||||||
@@ -186,7 +193,6 @@ onMounted(() => {
|
|||||||
<NSpin v-if="useQB.isLoading" show />
|
<NSpin v-if="useQB.isLoading" show />
|
||||||
<NTabs v-else animated @update:value="onTabChange" v-model:value="selectedTabItem">
|
<NTabs v-else animated @update:value="onTabChange" v-model:value="selectedTabItem">
|
||||||
<NTabPane tab="我收到的" name="0" display-directive="show:lazy">
|
<NTabPane tab="我收到的" name="0" display-directive="show:lazy">
|
||||||
<NDivider vertical />
|
|
||||||
<NFlex align="center">
|
<NFlex align="center">
|
||||||
<NButton @click="$router.push({ name: 'question-display' })" type="primary"> 打开展示页 </NButton>
|
<NButton @click="$router.push({ name: 'question-display' })" type="primary"> 打开展示页 </NButton>
|
||||||
<NSelect
|
<NSelect
|
||||||
@@ -205,45 +211,68 @@ onMounted(() => {
|
|||||||
</NFlex>
|
</NFlex>
|
||||||
<NDivider style="margin: 10px 0 10px 0" />
|
<NDivider style="margin: 10px 0 10px 0" />
|
||||||
<NEmpty v-if="useQB.recieveQuestionsFiltered.length == 0" description="暂无收到的提问" />
|
<NEmpty v-if="useQB.recieveQuestionsFiltered.length == 0" description="暂无收到的提问" />
|
||||||
<QuestionItem v-else :questions="useQB.recieveQuestionsFiltered">
|
<div v-else>
|
||||||
<template #footer="{ item }">
|
<NPagination
|
||||||
<NSpace>
|
v-model:page="pn"
|
||||||
<NButton v-if="!item.isReaded" size="small" @click="useQB.read(item, true)" type="success">
|
v-model:page-size="ps"
|
||||||
设为已读
|
:item-count="useQB.recieveQuestionsFiltered.length"
|
||||||
</NButton>
|
show-quick-jumper
|
||||||
<NButton v-else size="small" @click="useQB.read(item, false)" type="warning">重设为未读</NButton>
|
show-size-picker
|
||||||
<NButton size="small" @click="useQB.favorite(item, !item.isFavorite)">
|
:page-sizes="[20, 50, 100]"
|
||||||
<template #icon>
|
/>
|
||||||
<NIcon :component="item.isFavorite ? Heart : HeartOutline" :color="item.isFavorite ? '#dd484f' : ''" />
|
<NDivider style="margin: 10px 0 10px 0" />
|
||||||
</template>
|
<QuestionItem :questions="pagedQuestions">
|
||||||
收藏
|
<template #footer="{ item }">
|
||||||
</NButton>
|
<NSpace>
|
||||||
<NPopconfirm @positive-click="useQB.DelQA(item.id)">
|
<NButton v-if="!item.isReaded" size="small" @click="useQB.read(item, true)" type="success">
|
||||||
<template #trigger>
|
设为已读
|
||||||
<NButton size="small" type="error">
|
</NButton>
|
||||||
<template #icon>
|
<NButton v-else size="small" @click="useQB.read(item, false)" type="warning">重设为未读</NButton>
|
||||||
<NIcon :component="Delete24Filled"/>
|
<NButton size="small" @click="useQB.favorite(item, !item.isFavorite)">
|
||||||
</template>
|
<template #icon>
|
||||||
删除
|
<NIcon
|
||||||
</NButton>
|
:component="item.isFavorite ? Heart : HeartOutline"
|
||||||
</template>
|
:color="item.isFavorite ? '#dd484f' : ''"
|
||||||
确认删除这条提问?
|
/>
|
||||||
</NPopconfirm>
|
</template>
|
||||||
<!-- <NTooltip>
|
收藏
|
||||||
|
</NButton>
|
||||||
|
<NPopconfirm @positive-click="useQB.DelQA(item.id)">
|
||||||
|
<template #trigger>
|
||||||
|
<NButton size="small" type="error">
|
||||||
|
<template #icon>
|
||||||
|
<NIcon :component="Delete24Filled" />
|
||||||
|
</template>
|
||||||
|
删除
|
||||||
|
</NButton>
|
||||||
|
</template>
|
||||||
|
确认删除这条提问?
|
||||||
|
</NPopconfirm>
|
||||||
|
<!-- <NTooltip>
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<NButton size="small"> 举报 </NButton>
|
<NButton size="small"> 举报 </NButton>
|
||||||
</template>
|
</template>
|
||||||
暂时还没写
|
暂时还没写
|
||||||
</NTooltip> -->
|
</NTooltip> -->
|
||||||
<NButton size="small" @click="useQB.blacklist(item)" type="warning"> 拉黑 </NButton>
|
<NButton size="small" @click="useQB.blacklist(item)" type="warning"> 拉黑 </NButton>
|
||||||
</NSpace>
|
</NSpace>
|
||||||
</template>
|
</template>
|
||||||
<template #header-extra="{ item }">
|
<template #header-extra="{ item }">
|
||||||
<NButton @click="onOpenModal(item)" :type="item.isReaded ? 'default' : 'info'" :secondary="item.isReaded">
|
<NButton @click="onOpenModal(item)" :type="item.isReaded ? 'default' : 'info'" :secondary="item.isReaded">
|
||||||
{{ item.answer ? '查看回复' : '回复' }}
|
{{ item.answer ? '查看回复' : '回复' }}
|
||||||
</NButton>
|
</NButton>
|
||||||
</template>
|
</template>
|
||||||
</QuestionItem>
|
</QuestionItem>
|
||||||
|
<NDivider style="margin: 10px 0 10px 0" />
|
||||||
|
<NPagination
|
||||||
|
v-model:page="pn"
|
||||||
|
v-model:page-size="ps"
|
||||||
|
:item-count="useQB.recieveQuestionsFiltered.length"
|
||||||
|
show-quick-jumper
|
||||||
|
show-size-picker
|
||||||
|
:page-sizes="[20, 50, 100]"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</NTabPane>
|
</NTabPane>
|
||||||
<NTabPane ref="parentRef" tab="我发送的" name="1" display-directive="show:lazy">
|
<NTabPane ref="parentRef" tab="我发送的" name="1" display-directive="show:lazy">
|
||||||
<NEmpty v-if="useQB.sendQuestions.length == 0" description="暂无发送的提问" />
|
<NEmpty v-if="useQB.sendQuestions.length == 0" description="暂无发送的提问" />
|
||||||
@@ -362,6 +391,7 @@ onMounted(() => {
|
|||||||
</NSpin>
|
</NSpin>
|
||||||
</NTabPane>
|
</NTabPane>
|
||||||
</NTabs>
|
</NTabs>
|
||||||
|
<NDivider />
|
||||||
<NModal preset="card" v-model:show="replyModalVisiable" style="max-width: 90vw; width: 500px">
|
<NModal preset="card" v-model:show="replyModalVisiable" style="max-width: 90vw; width: 500px">
|
||||||
<template #header> 回复 </template>
|
<template #header> 回复 </template>
|
||||||
<NSpace vertical>
|
<NSpace vertical>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useAccount } from '@/api/account'
|
import { useAccount } from '@/api/account'
|
||||||
import { GoodsTypes, PointOrderStatus, ResponsePointGoodModel, ResponsePointOrder2OwnerModel } from '@/api/api-models'
|
import { GoodsTypes, PointOrderStatus, ResponsePointGoodModel, ResponsePointOrder2OwnerModel } from '@/api/api-models'
|
||||||
import { QueryGetAPI } from '@/api/query'
|
import { QueryGetAPI, QueryPostAPI } from '@/api/query'
|
||||||
import PointOrderCard from '@/components/manage/PointOrderCard.vue'
|
import PointOrderCard from '@/components/manage/PointOrderCard.vue'
|
||||||
import { POINT_API_URL } from '@/data/constants'
|
import { POINT_API_URL } from '@/data/constants'
|
||||||
import { objectsToCSV } from '@/Utils'
|
import { objectsToCSV } from '@/Utils'
|
||||||
@@ -9,7 +9,19 @@ import { useStorage } from '@vueuse/core'
|
|||||||
import { format } from 'date-fns'
|
import { format } from 'date-fns'
|
||||||
import { saveAs } from 'file-saver'
|
import { saveAs } from 'file-saver'
|
||||||
import { List } from 'linqts'
|
import { List } from 'linqts'
|
||||||
import { NButton, NCard, NCheckbox, NDivider, NEmpty, NFlex, NSelect, NSpin, useMessage } from 'naive-ui'
|
import {
|
||||||
|
DataTableRowKey,
|
||||||
|
NButton,
|
||||||
|
NCard,
|
||||||
|
NCheckbox,
|
||||||
|
NDivider,
|
||||||
|
NEmpty,
|
||||||
|
NFlex,
|
||||||
|
NPopconfirm,
|
||||||
|
NSelect,
|
||||||
|
NSpin,
|
||||||
|
useMessage,
|
||||||
|
} from 'naive-ui'
|
||||||
import { computed, onMounted, ref } from 'vue'
|
import { computed, onMounted, ref } from 'vue'
|
||||||
|
|
||||||
type OrderFilterSettings = {
|
type OrderFilterSettings = {
|
||||||
@@ -41,6 +53,7 @@ const filteredOrders = computed(() => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
const isLoading = ref(false)
|
const isLoading = ref(false)
|
||||||
|
const selectedItem = ref<DataTableRowKey[]>()
|
||||||
|
|
||||||
async function getOrders() {
|
async function getOrders() {
|
||||||
try {
|
try {
|
||||||
@@ -59,6 +72,21 @@ async function getOrders() {
|
|||||||
}
|
}
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
async function deleteOrder() {
|
||||||
|
try {
|
||||||
|
const data = await QueryPostAPI(POINT_API_URL + 'delete-orders', selectedItem.value)
|
||||||
|
if (data.code == 200) {
|
||||||
|
message.success('删除成功')
|
||||||
|
orders.value = orders.value.filter((o) => !selectedItem.value?.includes(o.id))
|
||||||
|
selectedItem.value = undefined
|
||||||
|
} else {
|
||||||
|
message.error('删除失败: ' + data.message)
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
message.error('删除失败: ' + err)
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
const statusText = {
|
const statusText = {
|
||||||
[PointOrderStatus.Completed]: '已完成',
|
[PointOrderStatus.Completed]: '已完成',
|
||||||
[PointOrderStatus.Pending]: '等待发货',
|
[PointOrderStatus.Pending]: '等待发货',
|
||||||
@@ -161,8 +189,16 @@ onMounted(async () => {
|
|||||||
<NCheckbox v-model:checked="filterSettings.onlyRequireShippingInfo" label="仅包含未填写快递单号的订单" />
|
<NCheckbox v-model:checked="filterSettings.onlyRequireShippingInfo" label="仅包含未填写快递单号的订单" />
|
||||||
</NFlex>
|
</NFlex>
|
||||||
</NCard>
|
</NCard>
|
||||||
<NDivider />
|
<NDivider v-if="(selectedItem?.length ?? 0) == 0" title-placement="left" />
|
||||||
<PointOrderCard :order="filteredOrders" :goods="goods" type="owner" />
|
<NDivider v-else title-placement="left">
|
||||||
|
<NPopconfirm @positive-click="deleteOrder">
|
||||||
|
<template #trigger>
|
||||||
|
<NButton size="tiny" type="error"> 删除选中的订单 | {{ selectedItem?.length }} </NButton>
|
||||||
|
</template>
|
||||||
|
确定删除吗?
|
||||||
|
</NPopconfirm>
|
||||||
|
</NDivider>
|
||||||
|
<PointOrderCard @selected-item="items => selectedItem = items" :order="filteredOrders" :goods="goods" type="owner" />
|
||||||
</template>
|
</template>
|
||||||
</NSpin>
|
</NSpin>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user