feat(订单模块): 添加微信openid查询支持并优化用户详情页订单展示

- 在订单查询接口中添加微信openid字段,支持通过openid查询订单
- 重构用户详情页,使用el-descriptions组件优化基本信息展示
- 添加订单列表展示功能,支持分页、加载状态及订单详情查看
This commit is contained in:
dzq 2025-05-13 15:34:05 +08:00
parent 4146851ac2
commit 5eb7ae6f00
2 changed files with 104 additions and 55 deletions

View File

@ -3,6 +3,10 @@ import { http } from "@/utils/http";
export interface OrderQuery extends BasePageQuery { export interface OrderQuery extends BasePageQuery {
/** 订单编号 */ /** 订单编号 */
orderId?: number; orderId?: number;
/**
* openid
*/
openid?: string;
/** 柜机id */ /** 柜机id */
cabinetId?: number; cabinetId?: number;
/** 格口id */ /** 格口id */

View File

@ -1,7 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from "vue"; import { ref, onMounted, watch } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { Ab98UserDetailDTO, type Ab98UserDTO, getAb98UserDetailApi } from "@/api/ab98/user"; import { type Ab98UserDetailDTO, getAb98UserDetailApi } from "@/api/ab98/user";
import { getOrderListApi, type OrderDTO } from "@/api/shop/order";
defineOptions({ defineOptions({
name: "Ab98UserDetail" name: "Ab98UserDetail"
@ -19,14 +20,37 @@ const basicInfo = ref({
device: "iPhone 13" device: "iPhone 13"
}); });
// //
const orderRecords = ref([ const orderRecords = ref<OrderDTO[]>([]);
]); const pagination = ref({
pageSize: 5,
currentPage: 1,
total: 0
});
const orderLoading = ref(false);
const activeTab = ref('basic'); const activeTab = ref('basic');
async function fetchOrders() {
try {
orderLoading.value = true;
const { data } = await getOrderListApi({
openid: userInfo.value.openid,
pageSize: pagination.value.pageSize,
pageNum: pagination.value.currentPage
});
orderRecords.value = data.rows;
pagination.value.total = data.total;
} finally {
orderLoading.value = false;
}
}
watch(activeTab, (newVal) => {
if (newVal === 'orders') {
fetchOrders();
}
});
async function fetchUserDetail() { async function fetchUserDetail() {
try { try {
loading.value = true; loading.value = true;
@ -60,24 +84,12 @@ onMounted(() => {
<el-divider /> <el-divider />
<div class="user-details"> <el-descriptions class="user-details" :column="1" border>
<div class="detail-item"> <el-descriptions-item label="性别">{{ userInfo.sex }}</el-descriptions-item>
<span class="label">性别&emsp;&emsp;</span> <el-descriptions-item label="手机号">{{ userInfo.tel }}</el-descriptions-item>
<span class="value">{{ userInfo.sex }}</span> <el-descriptions-item label="身份证号">{{ userInfo.idnum }}</el-descriptions-item>
</div> <el-descriptions-item label="住址">{{ userInfo.address }}</el-descriptions-item>
<div class="detail-item"> </el-descriptions>
<span class="label">手机号&emsp;</span>
<span class="value">{{ userInfo.tel }}</span>
</div>
<div class="detail-item">
<span class="label">身份证号</span>
<span class="value">{{ userInfo.idnum }}</span>
</div>
<div class="detail-item">
<span class="label">住址&emsp;&emsp;</span>
<span class="value">{{ userInfo.address }}</span>
</div>
</div>
</el-card> </el-card>
<el-card class="info-card"> <el-card class="info-card">
<div class="tab-header"> <div class="tab-header">
@ -88,40 +100,73 @@ onMounted(() => {
</el-tabs> </el-tabs>
</div> </div>
<div class="info-details" v-if="activeTab === 'basic'"> <el-descriptions class="info-details" v-if="activeTab === 'basic'" :column="2" border>
<div class="detail-item"> <el-descriptions-item label="会员ID">{{ userInfo.ab98UserId }}</el-descriptions-item>
<span class="label">微信openid</span> <el-descriptions-item label="微信openid">{{ userInfo.openid }}</el-descriptions-item>
<span class="value">{{ userInfo.openid }}</span> <el-descriptions-item label="注册时间">{{ userInfo.createTime }}</el-descriptions-item>
</div> <el-descriptions-item label="最后登录">{{ basicInfo.lastLogin }}</el-descriptions-item>
<div class="detail-item"> <el-descriptions-item label="登录次数">{{ basicInfo.loginCount }}</el-descriptions-item>
<span class="label">注册时间</span> <el-descriptions-item label="常用设备">{{ basicInfo.device }}</el-descriptions-item>
<span class="value">{{ userInfo.createTime }}</span> </el-descriptions>
</div>
<div class="detail-item">
<span class="label">最后登录</span>
<span class="value">{{ basicInfo.lastLogin }}</span>
</div>
<div class="detail-item">
<span class="label">登录次数</span>
<span class="value">{{ basicInfo.loginCount }}</span>
</div>
<div class="detail-item">
<span class="label">常用设备</span>
<span class="value">{{ basicInfo.device }}</span>
</div>
</div>
<div class="info-details" v-if="activeTab === 'orders'"> <div class="info-details" v-if="activeTab === 'orders'">
<div class="order-item" v-for="order in orderRecords" :key="order.id"> <PureTableBar title="订单列表" @refresh="fetchOrders">
<div class="order-id">订单号{{ order.id }}</div> <el-table ref="tableRef" v-loading="orderLoading" :data="orderRecords" row-key="orderId" border>
<div class="order-detail"> <el-table-column label="订单ID" prop="orderId" width="120" />
<span>日期{{ order.date }}</span> <el-table-column label="商品名称" prop="goodsNames" width="180">
<span>金额¥{{ order.amount.toFixed(2) }}</span> <template #default="{ row }">
<span>状态{{ order.status }}</span> <span v-if="row.goodsNames">
</div> {{ row.goodsNames.split(',').join(', ') }}
</div> </span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="商品封面" prop="coverImgs" width="100">
<template #default="{ row }">
<div v-if="row.coverImgs" class="flex gap-2">
<el-image v-for="(img, index) in row.coverImgs.split(',')" :key="index" :src="img"
:preview-src-list="row.coverImgs.split(',')" :z-index="9999" :preview-teleported="true"
:hide-on-click-modal="true" fit="cover" class="rounded" width="60" height="60" />
</div>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name" width="120" />
<el-table-column label="手机号" prop="mobile" width="120" />
<el-table-column label="订单金额" prop="totalAmount" width="120">
<template #default="{ row }">{{ row.totalAmount }}</template>
</el-table-column>
<el-table-column label="订单状态" prop="status" width="120">
<template #default="{ row }">
<el-tag :type="row.status === 2 ? 'success' : row.status === 5 ? 'danger' : 'info'">
{{ { 1: '待付款', 2: '已付款', 3: '已发货', 4: '已完成', 5: '已取消' }[row.status] }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="支付状态" prop="payStatus" width="120">
<template #default="{ row }">
<el-tag :type="row.payStatus === 2 ? 'success' : 'info'">
{{ { 1: '未支付', 2: '已支付', 3: '退款中', 4: '已退款' }[row.payStatus] }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="支付方式" prop="paymentMethod" width="120">
<template #default="{ row }">
{{ { wechat: '微信支付', balance: '余额支付' }[row.paymentMethod] || row.paymentMethod }}
</template>
</el-table-column>
<el-table-column label="支付时间" prop="payTime" width="180">
<template #default="{ row }">
{{ row.payTime ? new Date(row.payTime).toLocaleString() : '-' }}
</template>
</el-table-column>
</el-table>
<el-pagination v-model:current-page="pagination.currentPage" v-model:page-size="pagination.pageSize"
:page-sizes="[5, 10, 20, 50]" layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"
@size-change="fetchOrders" @current-change="fetchOrders" />
</PureTableBar>
</div> </div>
</el-card> </el-card>
</div> </div>