You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

351 lines
7.3 KiB

<template>
<view class="gold-detail-container">
<!-- 顶部导航栏 -->
<view class="top-bar">
<view class="title">金币明细</view>
</view>
<!-- 总金币数 -->
<view class="total-gold">
<view class="total-label">总金币数</
view>
<view class="total-value">{{ totalGold }}</view>
</view>
<!-- 列表容器 -->
<view class="list-container">
<!-- 错误提示 -->
<view class="error" v-if="errorMsg">
<text>{{ errorMsg }}</text>
<button @click="fetchData">重新加载</button>
</view>
<!-- 列表为空 -->
<view class="empty" v-if="!loading && !errorMsg && goldList.length === 0">
<text>暂无金币明细数据</text>
</view>
<!-- 金币明细列表 -->
<view class="gold-item" v-for="(item, index) in goldList" :key="index">
<view class="item-header">
<view class="user-info">
<view class="name">{{ item.name }}</view>
<view class="jwcode">ID: {{ item.jwcode }}</view>
</view>
<view class="gold-amount">
<text class="amount">+{{ item.sumGold }}</text>
<text class="unit">金币</text>
</view>
</view>
<view class="item-body">
<view class="detail-item">
<text class="label">市场</text>
<text class="value">{{ item.market }}</text>
</view>
<view class="detail-item">
<text class="label">平台</text>
<text class="value">{{ item.payPlatform }}</text>
</view>
<view class="detail-item">
<text class="label">商品</text>
<text class="value">{{ item.goodsName }}</text>
</view>
<view class="detail-item">
<text class="label">时间</text>
<text class="value">{{ item.auditTime }}</text>
</view>
<view class="detail-item" v-if="item.orderCode">
<text class="label">订单号</text>
<text class="value">{{ item.orderCode }}</text>
</view>
</view>
<view class="item-footer">
<view class="gold-breakdown">
<text>永久金币{{ item.permanentGold }}</text>
<text>免费金币{{ item.freeGold }}</text>
</view>
</view>
</view>
</view>
<!-- 下拉加载更多提示 -->
<view class="load-more" v-if="hasMore && !loading">
<text>上拉加载更多</text>
</view>
</view>
</template>
<script setup>
// 修正生命周期导入来源(uni-app的生命周期需从@dcloudio/uni-app导入)
import { ref } from 'vue'
import { onLoad, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app'
// 数据状态
const goldList = ref([])
const totalGold = ref(0)
const loading = ref(false)
const errorMsg = ref('')
const page = ref(1)
const pageSize = ref(10)
const hasMore = ref(true)
// 接口地址
const API_URL = 'https://hwjb.homilychart.com/dev/admin/goldDetail/getGoldDetail'
// 获取数据
const fetchData = async (isLoadMore = false) => {
// 如果是加载更多且没有更多数据,直接返回
if (isLoadMore && !hasMore.value) return
// 如果正在加载,直接返回
if (loading.value) return
// 显示加载状态(使用uni-app内置API)
loading.value = true
uni.showLoading({
title: '加载中...',
mask: true
})
errorMsg.value = ''
try {
// 发起请求
const res = await uni.request({
url: API_URL,
method: 'GET',
data: {
page: page.value,
pageSize: pageSize.value
}
})
// 处理响应
if (res[1].code === 200) {
const result = res[1].data
if (result.code === 200) {
// 更新总金币数
totalGold.value = result.data.total
// 如果是加载更多,追加数据,否则替换数据
if (isLoadMore) {
goldList.value = [...goldList.value, ...result.data.list]
} else {
goldList.value = result.data.list
}
// 判断是否还有更多数据
hasMore.value = result.data.list.length >= pageSize.value
// 加载更多时页码加1
if (isLoadMore) {
page.value++
}
} else {
errorMsg.value = `获取数据失败: ${result.msg}`
}
} else {
errorMsg.value = `请求失败: ${res[1].statusCode}`
}
} catch (err) {
errorMsg.value = `网络错误: ${err.message}`
} finally {
// 隐藏加载状态
loading.value = false
uni.hideLoading() // 关闭内置加载提示
}
}
// 页面加载时获取数据
onLoad(() => {
fetchData()
})
// 下拉加载更多
onReachBottom(() => {
if (!loading.value && hasMore.value) {
fetchData(true)
}
})
// 下拉刷新
onPullDownRefresh(() => {
// 重置页码和数据
page.value = 1
hasMore.value = true
fetchData().then(() => {
uni.stopPullDownRefresh()
})
})
</script>
<style scoped>
.gold-detail-container {
background-color: #f5f5f5;
min-height: 100vh;
}
/* 顶部导航 */
.top-bar {
display: flex;
align-items: center;
justify-content: center;
padding: 30rpx 20rpx;
background-color: #fff;
border-bottom: 1px solid #eee;
}
.title {
font-size: 34rpx;
font-weight: bold;
color: #333;
}
/* 总金币数 */
.total-gold {
background-color: #fff;
padding: 40rpx 30rpx;
margin-bottom: 20rpx;
text-align: center;
}
.total-label {
font-size: 28rpx;
color: #666;
margin-bottom: 15rpx;
}
.total-value {
font-size: 48rpx;
font-weight: bold;
color: #ff7d00;
}
/* 列表容器 */
.list-container {
padding: 0 20rpx;
}
/* 错误提示 */
.error {
display: flex;
flex-direction: column;
align-items: center;
padding: 60rpx 0;
}
.error text {
font-size: 28rpx;
color: #f5222d;
margin-bottom: 20rpx;
}
.error button {
background-color: #36bffa;
color: #fff;
border-radius: 30rpx;
padding: 10rpx 30rpx;
font-size: 26rpx;
}
/* 空状态 */
.empty {
display: flex;
justify-content: center;
padding: 100rpx 0;
color: #999;
font-size: 28rpx;
}
/* 列表项 */
.gold-item {
background-color: #fff;
border-radius: 16rpx;
padding: 25rpx;
margin-bottom: 20rpx;
box-shadow: 0 5rpx 15rpx rgba(0, 0, 0, 0.05);
}
.item-header {
display: flex;
justify-content: space-between;
margin-bottom: 20rpx;
padding-bottom: 20rpx;
border-bottom: 1px solid #f5f5f5;
}
.user-info .name {
font-size: 30rpx;
font-weight: bold;
color: #333;
margin-bottom: 5rpx;
}
.user-info .jwcode {
font-size: 24rpx;
color: #999;
}
.gold-amount {
text-align: right;
}
.gold-amount .amount {
font-size: 32rpx;
font-weight: bold;
color: #00b42a;
}
.gold-amount .unit {
font-size: 26rpx;
color: #00b42a;
margin-left: 5rpx;
}
.item-body {
margin-bottom: 20rpx;
}
.detail-item {
display: flex;
margin-bottom: 15rpx;
font-size: 26rpx;
}
.detail-item:last-child {
margin-bottom: 0;
}
.detail-item .label {
color: #666;
width: 120rpx;
}
.detail-item .value {
flex: 1;
color: #333;
word-break: break-all;
}
.item-footer {
padding-top: 15rpx;
border-top: 1px dashed #f5f5f5;
}
.gold-breakdown {
display: flex;
justify-content: space-between;
font-size: 24rpx;
color: #999;
}
/* 加载更多 */
.load-more {
text-align: center;
padding: 30rpx 0;
color: #999;
font-size: 26rpx;
}
</style>