feat: 增加菜单管理
Build and Deploy Vue3 / build (push) Successful in 1m26s
Build and Deploy Vue3 / deploy (push) Successful in 1m15s

This commit is contained in:
2026-04-18 16:24:57 +08:00
parent 2916c04ba5
commit 8b2251ef97
10 changed files with 2005 additions and 200 deletions
+74 -7
View File
@@ -22,6 +22,12 @@
<el-option label="已失效" value="2" />
</el-select>
</el-form-item>
<el-form-item label="错误信息">
<el-select v-model="queryParams.error" placeholder="全部" clearable style="width: 140px">
<el-option label="有错误的订单" :value="true" />
<el-option label="无错误的订单" :value="false" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">
<el-icon><Search /></el-icon>搜索
@@ -89,11 +95,22 @@
<span>{{ row.payNum }}</span>
</template>
</el-table-column>
<el-table-column label="订单状态" width="100">
<el-table-column label="订单状态" width="120">
<template #default="{ row }">
<el-tag :type="getStatusType(row.state)">
{{ getStatusText(row.state) }}
</el-tag>
<div style="display: flex; align-items: center; gap: 4px; flex-wrap: wrap;">
<el-tag :type="getStatusType(row.state)">
{{ getStatusText(row.state) }}
</el-tag>
<el-tag v-if="row.error" type="danger" size="small">异常</el-tag>
</div>
</template>
</el-table-column>
<el-table-column label="错误信息" min-width="250">
<template #default="{ row }">
<el-tooltip v-if="row.error" :content="row.error" placement="top" :show-after="300">
<span class="error-text">{{ row.error }}</span>
</el-tooltip>
<span v-else class="text-muted">-</span>
</template>
</el-table-column>
<el-table-column label="支付方式" width="100">
@@ -111,11 +128,12 @@
<span>{{ formatDate(row.CreatedAt) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="200" fixed="right">
<el-table-column label="操作" width="250" fixed="right">
<template #default="{ row }">
<div class="action-buttons">
<el-button type="primary" link @click="handleView(row)">查看</el-button>
<el-button type="warning" link @click="handleEdit(row)">编辑</el-button>
<el-button v-if="row.error" type="danger" link @click="handleRetryOrder(row)">重试流程</el-button>
</div>
</template>
</el-table-column>
@@ -162,6 +180,10 @@
<el-descriptions-item label="创建时间">{{ formatDate(orderDetail.CreatedAt) }}</el-descriptions-item>
<el-descriptions-item label="更新时间">{{ formatDate(orderDetail.UpdatedAt) }}</el-descriptions-item>
<el-descriptions-item label="参数信息">{{ orderDetail.args || '-' }}</el-descriptions-item>
<el-descriptions-item v-if="orderDetail.error" label="错误信息" :span="2">
<el-tag type="danger" size="small" style="margin-right: 6px;">异常</el-tag>
<span style="color: #f56c6c;">{{ orderDetail.error }}</span>
</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">{{ orderDetail.note || '无' }}</el-descriptions-item>
</el-descriptions>
</el-dialog>
@@ -389,7 +411,7 @@
import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus, Delete, Search, Download, Refresh, User, ShoppingCart, Ticket, Money, Close } from '@element-plus/icons-vue'
import { getOrderList, getOrderDetail, createOrder, updateOrder, deleteOrder } from '@/api/admin/order'
import { getOrderList, getOrderDetail, createOrder, updateOrder, deleteOrder, retryOrderHook } from '@/api/admin/order'
import UserListSelector from '@/components/admin/UserListSelector.vue'
import ProductSelector from '@/components/admin/ProductSelector.vue'
import DiscountCodeSelector from '@/components/admin/DiscountCodeSelector.vue'
@@ -403,7 +425,8 @@ const queryParams = reactive({
key: '',
state: '',
user_id: '',
user_key: ''
user_key: '',
error: null
})
// 订单表单
@@ -544,6 +567,7 @@ const resetQuery = () => {
queryParams.state = ''
queryParams.user_id = ''
queryParams.user_key = ''
queryParams.error = null
queryParams.page = 1
fetchOrderList()
}
@@ -644,6 +668,32 @@ const handleEdit = (row) => {
}
}
// 重试订单流程
const handleRetryOrder = (row) => {
ElMessageBox.confirm(
`确认对订单「${row.name}」(ID: ${row.id}) 重试流程吗?`,
'重试订单流程',
{
confirmButtonText: '确认重试',
cancelButtonText: '取消',
type: 'warning'
}
).then(async () => {
try {
const res = await retryOrderHook({ order_id: row.id })
if (res.data.code === 200) {
ElMessage.success('重试流程已触发')
fetchOrderList()
} else {
ElMessage.error(res.data.message || '重试失败')
}
} catch (error) {
console.error('重试订单流程失败:', error)
ElMessage.error(error.response?.data?.message || '重试订单流程失败')
}
}).catch(() => {})
}
// 删除订单
const handleDelete = (row) => {
ElMessageBox.confirm(`确认删除订单 ${row.name} 吗?`, '警告', {
@@ -966,4 +1016,21 @@ onMounted(() => {
.unit-input-row { display: flex; align-items: center; gap: 6px; width: 100%; }
.unit-text { font-size: 13px; color: #606266; flex-shrink: 0; white-space: nowrap; }
.error-text {
color: #f56c6c;
font-size: 12px;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
cursor: pointer;
}
.text-muted {
color: #c0c4cc;
}
</style>