feat: 用户商品状态筛选与统计对接
Build and Deploy Vue3 / build (push) Successful in 1m46s
Build and Deploy Vue3 / deploy (push) Successful in 39s

- 新增 getUserGoodsCount 接口对接,列表页/虚拟机列表页增加状态筛选与统计卡片

- 已删除/已到期商品适配及相关页面更新

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shiran
2026-06-24 22:12:50 +08:00
parent a8954bd85d
commit 6f82e5e79d
17 changed files with 1637 additions and 371 deletions
+15 -9
View File
@@ -130,7 +130,10 @@
<el-icon :size="18"><Box /></el-icon>
</div>
<div class="result-info">
<span class="result-title" v-html="highlight(item.good?.name || item.tag || ('商品#' + item.id))"></span>
<span class="result-title">
<span v-html="highlight(item.good?.name || item.tag || ('商品#' + item.id))"></span>
<el-tag v-if="isGoodsDeleted(item)" size="small" type="danger" class="deleted-flag">已删除</el-tag>
</span>
<span class="result-desc">用户: {{ item.user?.UserName || item.userId }} · 到期: {{ formatTime(item.expireTime) }}</span>
</div>
<el-icon class="result-arrow"><ArrowRight /></el-icon>
@@ -225,7 +228,7 @@ const searchOrders = async (key) => {
results.order.loading = true
results.order.list = []
try {
const res = await getOrderList({ page: results.order.page, count: pageSize, keyword: key })
const res = await getOrderList({ page: results.order.page, count: pageSize, key })
if (res.data?.code === 200) {
results.order.list = res.data.data?.list || []
results.order.total = res.data.data?.all_count || results.order.list.length
@@ -251,7 +254,7 @@ const searchGoods = async (key) => {
results.goods.loading = true
results.goods.list = []
try {
const res = await getUserGoodsList({ page: results.goods.page, count: pageSize, keyword: key })
const res = await getUserGoodsList({ page: results.goods.page, count: pageSize, key })
if (res.data?.code === 200) {
results.goods.list = res.data.data?.data || []
results.goods.total = res.data.data?.all_count || results.goods.list.length
@@ -260,6 +263,9 @@ const searchGoods = async (key) => {
results.goods.loading = false
}
// 判断用户商品是否已删除(后端返回 deleteAt 字段,有值即已删除)
const isGoodsDeleted = (item) => !!(item?.deleteAt || item?.DeleteAt || item?.deleted_at)
const highlight = (text) => {
if (!text || !keyword.value) return text
const key = keyword.value.trim()
@@ -292,12 +298,7 @@ const goToTicket = (item) => {
const goToGoods = (item) => {
visible.value = false
const tag = (item.tag || item.good?.tag || '').toLowerCase()
if (tag === '云服务器') {
router.push({ path: '/user-goods/vm-detail', query: { id: item.id } })
} else {
router.push({ name: 'UserGoodsDetail', params: { id: item.id } })
}
router.push({ name: 'UserGoodsDetail', params: { id: item.id } })
}
const orderStatusText = (status) => {
@@ -528,6 +529,11 @@ onUnmounted(() => {
border-radius: 2px;
}
.result-title .deleted-flag {
margin-left: 6px;
vertical-align: middle;
}
.result-desc {
font-size: 12px;
color: #909399;