fix: 全面修复项目问题

后端修复:
- 验证码存储与校验机制
- 订单创建事务+库存扣减
- GetStats字段名错误
- VerifyEmail改为POST
- 供应商更新字段白名单
- 文件删除安全检查
- 抽奖安全随机数
- 用户管理CRUD
- 订单取消/确认收货
- 工单回复
- Toggle返回新数据
- 移除死代码

前端修复:
- 404兜底路由
- 401软跳转
- API层统一
- 面包屑补充banners
- 国际化完善
- 购物车并行删除
- 退出清理购物车
- 供应商Dashboard数据
- 工单详情页
- 订单取消/确认收货
This commit is contained in:
2026-05-06 09:16:34 +08:00
parent 739481b59f
commit 3a898e8aa0
52 changed files with 2807 additions and 920 deletions
+26 -19
View File
@@ -1,21 +1,18 @@
<template>
<div class="orders-page">
<div class="page-header">
<h2 class="page-title">{{ $t('supplier.orderManagement') }}</h2>
</div>
<div class="table-card">
<el-table :data="orders">
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="total_amount" label="Amount" width="100"><template #default="{ row }">¥{{ row.total_amount }}</template></el-table-column>
<el-table-column prop="status" label="Status" width="120">
<el-table-column prop="total_amount" label="金额" width="100"><template #default="{ row }">¥{{ row.total_amount }}</template></el-table-column>
<el-table-column prop="status" label="状态" width="120">
<template #default="{ row }">
<el-tag :type="statusType(row.status)">{{ statusText(row.status) }}</el-tag>
</template>
</el-table-column>
<el-table-column label="Created" width="180">
<el-table-column label="创建时间" width="180">
<template #default="{ row }">{{ formatDate(row.created_at) }}</template>
</el-table-column>
<el-table-column label="Actions" width="200">
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button v-if="row.status === 'pending_confirm'" link type="primary" size="small" @click="confirmOrder(row.id)">{{ $t('supplier.confirmOrder') }}</el-button>
<el-button v-if="row.status === 'pending_ship'" link type="success" size="small" @click="openShip(row)">{{ $t('supplier.shipOrder') }}</el-button>
@@ -71,14 +68,22 @@ function formatDate(date: string) {
}
async function fetchOrders() {
const res: any = await supplierApi.getOrders()
orders.value = res.data || []
try {
const res: any = await supplierApi.getOrders()
orders.value = res.data || []
} catch {
ElMessage.error('获取订单失败')
}
}
async function confirmOrder(id: number) {
await supplierApi.confirmOrder(id)
ElMessage.success('Order confirmed')
await fetchOrders()
try {
await supplierApi.confirmOrder(id)
ElMessage.success('订单已确认')
await fetchOrders()
} catch {
ElMessage.error('确认失败')
}
}
function openShip(row: any) {
@@ -91,11 +96,15 @@ async function shipOrder() {
ElMessage.warning('请输入快递单号')
return
}
await supplierApi.shipOrder(shipOrderId.value, shipForm)
ElMessage.success('Order shipped')
showShip.value = false
Object.assign(shipForm, { tracking_number: '', shipping_photo: '', express_photo: '', customs_photo: '' })
await fetchOrders()
try {
await supplierApi.shipOrder(shipOrderId.value, shipForm)
ElMessage.success('发货成功')
showShip.value = false
Object.assign(shipForm, { tracking_number: '', shipping_photo: '', express_photo: '', customs_photo: '' })
await fetchOrders()
} catch {
ElMessage.error('发货失败')
}
}
onMounted(fetchOrders)
@@ -103,7 +112,5 @@ onMounted(fetchOrders)
<style scoped lang="scss">
.orders-page { padding: 0; }
.page-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; }
.page-title { font-size: 24px; font-weight: 600; color: #fff; }
.table-card { background: #2d2d44; border: 1px solid rgba(255, 255, 255, 0.06); border-radius: 12px; padding: 20px; }
</style>