fix: 右侧记录栏添加已购商品
Build and Deploy Vue3 / build (push) Successful in 2m21s
Build and Deploy Vue3 / deploy (push) Successful in 1m12s

This commit is contained in:
2026-04-20 11:32:14 +08:00
parent 8b2251ef97
commit d72a4f804e
5 changed files with 26006 additions and 7 deletions
+9
View File
@@ -245,3 +245,12 @@ export const updateProductGroupTag = (data) => {
export const deleteProductGroupTag = (params) => { export const deleteProductGroupTag = (params) => {
return http2.delete('/api/v1/admin/good/group_tag/delete', {params: params}) return http2.delete('/api/v1/admin/good/group_tag/delete', {params: params})
} }
/**---------------------------------- */
/**已购商品管理 */
/**获取用户已购商品列表 */
export const getUserGoodsList = (params) => {
return http2.get('/api/v1/admin/good/user_goods/list', {params: params})
}
-4
View File
@@ -18,10 +18,6 @@ export const addUserConsumption = (data) => {
}) })
} }
/**查询用户余额 */
export const getUserBalance = (data) => {
return http2.get('/api/v1/admin/user/balance/select?user_id='+data.user_id)
}
/**获取用户余额记录 */ /**获取用户余额记录 */
export const getUserBalanceRecord = (data) => { export const getUserBalanceRecord = (data) => {
+1 -1
View File
@@ -205,7 +205,7 @@ import { ref, reactive, onMounted, computed, watch } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { Refresh } from '@element-plus/icons-vue' import { Refresh } from '@element-plus/icons-vue'
import { getUserBalance, getUserBalanceRecord, editUserBalance, addUserConsumption, getUserBalanceCount, getUserList, refundBalance } from '@/api/admin/user' import { getUserBalanceRecord, editUserBalance, addUserConsumption, getUserBalanceCount, getUserList, refundBalance } from '@/api/admin/user'
const route = useRoute() const route = useRoute()
+91 -1
View File
@@ -98,7 +98,7 @@
<el-descriptions :column="1" border size="small"> <el-descriptions :column="1" border size="small">
<el-descriptions-item label="手机号">{{ userInfo.Phone || '-' }}</el-descriptions-item> <el-descriptions-item label="手机号">{{ userInfo.Phone || '-' }}</el-descriptions-item>
<el-descriptions-item label="邮箱">{{ userInfo.Email || '-' }}</el-descriptions-item> <el-descriptions-item label="邮箱">{{ userInfo.Email || '-' }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ userInfo.Sex || '-' }}</el-descriptions-item> <el-descriptions-item label="性别">{{ formatSex(userInfo.Sex) || '-' }}</el-descriptions-item>
<el-descriptions-item label="年龄">{{ userInfo.Age || '-' }}</el-descriptions-item> <el-descriptions-item label="年龄">{{ userInfo.Age || '-' }}</el-descriptions-item>
<el-descriptions-item label="最后更新">{{ formatDate(userInfo.UpdatedAt) }}</el-descriptions-item> <el-descriptions-item label="最后更新">{{ formatDate(userInfo.UpdatedAt) }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
@@ -244,6 +244,38 @@
</div> </div>
<el-empty v-else description="暂无工单记录" :image-size="100" /> <el-empty v-else description="暂无工单记录" :image-size="100" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="已购商品" name="5">
<el-table :data="userGoodsList" v-loading="goodsListLoading" stripe style="width: 100%" table-layout="auto">
<el-table-column prop="id" label="ID" width="70" />
<el-table-column label="商品名称" min-width="120" show-overflow-tooltip>
<template #default="{row}">{{ row.good?.name || '-' }}</template>
</el-table-column>
<el-table-column label="标签" min-width="90">
<template #default="{row}">
<el-tag v-if="row.tag" size="small">{{ row.tag }}</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="到期时间" min-width="140">
<template #default="{row}">{{ formatDate(row.expireTime) }}</template>
</el-table-column>
<el-table-column label="购买时间" min-width="140">
<template #default="{row}">{{ formatDate(row.CreatedAt) }}</template>
</el-table-column>
</el-table>
<div class="pagination-wrapper" v-if="goodsListTotal > 0">
<el-pagination
v-model:current-page="goodsListPage"
v-model:page-size="goodsListPageSize"
:total="goodsListTotal"
:page-sizes="[10, 20, 50]"
layout="total, prev, pager, next"
@size-change="handleGoodsListSizeChange"
@current-change="handleGoodsListPageChange"
/>
</div>
<el-empty v-else description="暂无已购商品" :image-size="100" />
</el-tab-pane>
</el-tabs> </el-tabs>
</el-card> </el-card>
</div> </div>
@@ -498,6 +530,7 @@ import {
import { getAdminGroupList } from '@/api/admin/group' import { getAdminGroupList } from '@/api/admin/group'
import { getOrderList } from '@/api/admin/order' import { getOrderList } from '@/api/admin/order'
import { getTickerList } from '@/api/ticket' import { getTickerList } from '@/api/ticket'
import { getUserGoodsList } from '@/api/admin/product'
const Edit = EditIcon const Edit = EditIcon
const route = useRoute() const route = useRoute()
@@ -542,6 +575,13 @@ const ticketListTotal = ref(0)
const ticketListPage = ref(1) const ticketListPage = ref(1)
const ticketListPageSize = ref(10) const ticketListPageSize = ref(10)
// 已购商品列表相关
const userGoodsList = ref([])
const goodsListLoading = ref(false)
const goodsListTotal = ref(0)
const goodsListPage = ref(1)
const goodsListPageSize = ref(10)
// 用户余额相关 // 用户余额相关
const userBalance = ref({ const userBalance = ref({
balance: 0, balance: 0,
@@ -664,9 +704,21 @@ const handleTabClick = (tab) => {
fetchUserOrderList() fetchUserOrderList()
} else if (tab.props.name === '4') { } else if (tab.props.name === '4') {
fetchUserTicketList() fetchUserTicketList()
} else if (tab.props.name === '5') {
fetchUserGoodsList()
} }
}; };
// 格式化性别
const formatSex = (sex) => {
if (sex === true) {
return '男'
} else if (sex === false) {
return '女'
} else {
return '-'
}
}
// 获取用户信息 // 获取用户信息
const fetchUserInfo = async () => { const fetchUserInfo = async () => {
const userId = route.query.user_id const userId = route.query.user_id
@@ -1019,6 +1071,38 @@ const handleTicketListPageChange = (page) => {
fetchUserTicketList() fetchUserTicketList()
} }
// 获取用户已购商品列表
const fetchUserGoodsList = async () => {
if (!route.query.user_id) return
goodsListLoading.value = true
try {
const res = await getUserGoodsList({
user_id: route.query.user_id,
page: goodsListPage.value,
count: goodsListPageSize.value
})
if (res.data.code === 200) {
userGoodsList.value = res.data.data.data || res.data.data.list || []
goodsListTotal.value = res.data.data.all_count || res.data.data.total || 0
}
} catch (error) {
ElMessage.error('获取已购商品列表失败')
} finally {
goodsListLoading.value = false
}
}
const handleGoodsListSizeChange = (size) => {
goodsListPageSize.value = size
goodsListPage.value = 1
fetchUserGoodsList()
}
const handleGoodsListPageChange = (page) => {
goodsListPage.value = page
fetchUserGoodsList()
}
// 获取用户余额信息 // 获取用户余额信息
const fetchUserBalance = async () => { const fetchUserBalance = async () => {
if (!route.query.user_id) return if (!route.query.user_id) return
@@ -1337,6 +1421,7 @@ const loadUserData = async () => {
await fetchOperationHistory(); await fetchOperationHistory();
await fetchUserOrderList(); await fetchUserOrderList();
await fetchUserTicketList(); await fetchUserTicketList();
await fetchUserGoodsList();
} }
// 初始化 // 初始化
@@ -1537,6 +1622,11 @@ onActivated(() => {
color: #303133; color: #303133;
} }
.right-column {
overflow: hidden;
min-width: 0;
}
.tabs-card { .tabs-card {
border-radius: 12px; border-radius: 12px;
border: none; border: none;
+25905 -1
View File
File diff suppressed because it is too large Load Diff