文件
shanghaipeiwan/pwuniapp/pages/user/withdraw-records.vue
xcbyy 87cb6a6374 fix(miniapp): 提现/财务接口不再用 1001 演示身份,修复 403
- getUserProfile/getUserWithdrawals/getUserFinanceRecords 去掉 userId=1001 默认值,改由 normalizeUserId 解析登录身份

- withdraw.vue / withdraw-records.vue / workspace.vue 调用改为 normalizeUserId(),不再硬编码 1001

- normalizeUserId 将 1001 视为演示占位符:登录态下传 0 由 token 识别,未登录才兜底 1001

- request.js 遇 403 身份校验失败时清理错配登录态并提示重新登录(其它 403 权限拒绝不受影响)

- 登录态闸门补齐用例(108 套件/714 用例全绿)
2026-10-21 11:38:26 +08:00

1122 行
29 KiB
Vue

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<template>
<view class="withdraw-records-page" :class="['theme-' + currentThemeKey]" :style="navStyle">
<!-- 顶部沉浸式自定义导航栏 -->
<view class="custom-nav-bar">
<view class="nav-content">
<view class="btn-nav-back btn-active" @click="handleBack">
<image class="nav-back-icon" :src="ICONS.chevronLeft" mode="aspectFit" />
</view>
<view class="nav-title-wrap">
<text class="nav-title">提现审批明细</text>
</view>
<!-- 胶囊右侧对称避让占位 -->
<view class="nav-capsule-placeholder"></view>
</view>
</view>
<!-- 主滚动区域 (准确避让顶部导航栏高度) -->
<scroll-view
scroll-y
class="records-scroll-view"
refresher-enabled
:refresher-triggered="isRefreshing"
@refresherrefresh="onRefresh"
>
<view class="records-content-body">
<!-- 1. 资产与提现统计总览卡片 -->
<view class="summary-stat-card">
<view class="card-bg-glow"></view>
<view class="summary-inner">
<view class="summary-title-row">
<view class="title-left">
<view class="wallet-icon-box">
<image class="wallet-icon-svg" :src="ICONS.wallet" mode="aspectFit" />
</view>
<view class="title-text-wrap">
<text class="summary-card-title">提现资产总览</text>
<text class="summary-card-sub">官方结算 · 极速直达</text>
</view>
</view>
<view class="btn-new-withdraw btn-active" @click="goToWithdraw">
<text class="btn-txt">去提现</text>
<image class="btn-arrow" :src="ICONS.chevronRight" mode="aspectFit" />
</view>
</view>
<view class="summary-numbers-grid">
<view class="stat-col">
<text class="stat-num-val green">¥{{ stats.totalSuccessAmount }}</text>
<text class="stat-num-label">累计成功到账</text>
</view>
<view class="col-divider"></view>
<view class="stat-col">
<text class="stat-num-val gold">¥{{ stats.pendingAmount }}</text>
<text class="stat-num-label">审核处理中</text>
</view>
<view class="col-divider"></view>
<view class="stat-col">
<text class="stat-num-val count">{{ allRecords.length }} 笔</text>
<text class="stat-num-label">申请总记录</text>
</view>
</view>
</view>
</view>
<!-- 2. 状态分类筛选选项卡 (Tabs) -->
<view class="filter-tabs-card">
<view class="filter-tabs-row">
<view
v-for="tab in tabList"
:key="tab.key"
class="tab-item btn-active"
:class="{ active: currentTab === tab.key }"
@click="selectTab(tab.key)"
>
<text class="tab-label">{{ tab.label }}</text>
<text class="tab-badge" v-if="tab.count > 0">{{ tab.count }}</text>
<view class="tab-indicator" v-if="currentTab === tab.key"></view>
</view>
</view>
</view>
<!-- 3. 加载骨架屏 -->
<view class="skeleton-wrap" v-if="isLoading">
<view class="skeleton-card" v-for="n in 3" :key="n"></view>
</view>
<!-- 4. 提现记录列表卡片 -->
<view class="records-list-wrap" v-else-if="filteredRecords.length > 0">
<view
v-for="item in filteredRecords"
:key="item.id || item.withdrawNo"
class="record-card card-active"
>
<!-- 卡片头部: 流水单号与状态胶囊 -->
<view class="card-head-row">
<view class="order-no-wrap" @click="handleCopyOrderNo(item.withdrawNo)">
<text class="order-no-label">单号:</text>
<text class="order-no-val">{{ item.withdrawNo }}</text>
<text class="copy-tag">复制</text>
</view>
<view
class="status-pill"
:class="{
pending: item.status === '待审核' || item.status === '处理中',
success: item.status === '已打款',
rejected: item.status === '已驳回'
}"
>
<view class="status-dot"></view>
<text class="status-text">{{ item.status }}</text>
</view>
</view>
<!-- 卡片核心: 金额与到账渠道 -->
<view class="card-main-row">
<view class="amount-col">
<text class="amount-symbol">¥</text>
<text class="amount-number">{{ item.amount }}</text>
</view>
<view class="channel-pill">
<image class="channel-icon" :src="ICONS.wechat" mode="aspectFit" />
<text class="channel-name">{{ item.channel || '微信零钱钱包' }}</text>
</view>
</view>
<!-- 卡片时间流与审核信息 -->
<view class="card-timeline-box">
<view class="timeline-row">
<text class="timeline-label">申请时间:</text>
<text class="timeline-val">{{ item.applyTime || '刚刚' }}</text>
</view>
<view class="timeline-row" v-if="item.status === '已打款'">
<text class="timeline-label">到账时间:</text>
<text class="timeline-val success">企业付款打款成功</text>
</view>
<view class="timeline-row" v-else-if="item.status === '待审核' || item.status === '处理中'">
<text class="timeline-label">预计到账:</text>
<text class="timeline-val notice">预计 1 至 24 小时内到账</text>
</view>
</view>
<!-- 驳回理由与重新发起入口 -->
<view class="card-rejected-box" v-if="item.status === '已驳回'">
<view class="reject-title-row">
<text class="reject-title">审核未通过说明:</text>
</view>
<text class="reject-reason">{{ item.reason || '收款信息不完整或账户异常,请核对后重试。' }}</text>
<button class="btn-re-withdraw btn-active" @click="goToWithdraw">重新发起申请</button>
</view>
</view>
<!-- 列表触底提示 -->
<view class="list-end-tip">
<text class="tip-line"></text>
<text class="tip-txt">已展示全部审批明细</text>
<text class="tip-line"></text>
</view>
</view>
<!-- 5. 暂无数据空状态 -->
<view class="empty-state-card" v-else>
<view class="empty-icon-wrap">
<image class="empty-icon-svg" :src="ICONS.fileText" mode="aspectFit" />
</view>
<text class="empty-title">暂无相关的提现申请记录</text>
<text class="empty-sub">接单赚取的佣金收益满额后即可随时发起零钱提现</text>
<button class="btn-empty-withdraw btn-active" @click="goToWithdraw">立即去提现</button>
</view>
<!-- 底部安全垫高 -->
<view class="bottom-spacer"></view>
</view>
</scroll-view>
</view>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue';
import { onShow } from '@dcloudio/uni-app';
import { ICONS } from '@/common/icons.js';
import { getCurrentThemeKey, applyThemeToNativeUI } from '@/common/theme.js';
import { getNavBarInfo } from '@/common/nav.js';
import { getUserWithdrawals, normalizeUserId } from '@/common/api.js';
const currentThemeKey = ref(getCurrentThemeKey());
const navInfo = ref(getNavBarInfo());
const isLoading = ref(true);
const isRefreshing = ref(false);
const allRecords = ref([]);
const currentTab = ref('ALL');
const stats = ref({
totalSuccessAmount: '0.00',
pendingAmount: '0.00'
});
// 顶部导航栏安全距离避让与胶囊对称计算
const navStyle = computed(() => {
return {
'--safe-header-gap': `${navInfo.value.totalHeaderHeight}px`,
'--capsule-right-space': `${navInfo.value.capsuleRightSpace}px`,
'--capsule-height': `${navInfo.value.capsuleHeight}px`
};
});
// 计算状态分类筛选选项及计数
const tabList = computed(() => {
const records = allRecords.value;
const pendingCount = records.filter(r => r.status === '待审核' || r.status === '处理中').length;
const successCount = records.filter(r => r.status === '已打款').length;
const rejectedCount = records.filter(r => r.status === '已驳回').length;
return [
{ key: 'ALL', label: '全部', count: records.length },
{ key: 'PENDING', label: '审核中', count: pendingCount },
{ key: 'SUCCESS', label: '已打款', count: successCount },
{ key: 'REJECTED', label: '已驳回', count: rejectedCount }
];
});
// 根据当前选中的 Tab 过滤列表
const filteredRecords = computed(() => {
const tab = currentTab.value;
if (tab === 'PENDING') {
return allRecords.value.filter(r => r.status === '待审核' || r.status === '处理中');
}
if (tab === 'SUCCESS') {
return allRecords.value.filter(r => r.status === '已打款');
}
if (tab === 'REJECTED') {
return allRecords.value.filter(r => r.status === '已驳回');
}
return allRecords.value;
});
const selectTab = (tabKey) => {
currentTab.value = tabKey;
};
const handleBack = () => {
const pages = getCurrentPages();
if (pages && pages.length > 1) {
uni.navigateBack();
} else {
uni.redirectTo({
url: '/pages/user/withdraw'
});
}
};
const goToWithdraw = () => {
const pages = getCurrentPages();
const prevPage = pages && pages.length > 1 ? pages[pages.length - 2] : null;
if (prevPage && prevPage.route && prevPage.route.includes('withdraw')) {
uni.navigateBack();
} else {
uni.navigateTo({
url: '/pages/user/withdraw'
});
}
};
const handleCopyOrderNo = (orderNo) => {
if (!orderNo) return;
uni.setClipboardData({
data: String(orderNo),
success: () => {
uni.showToast({ title: '单号已复制', icon: 'none' });
}
});
};
const loadWithdrawals = async () => {
try {
const list = await getUserWithdrawals(normalizeUserId());
if (Array.isArray(list)) {
allRecords.value = list;
let successSum = 0;
let pendingSum = 0;
list.forEach(r => {
const amt = Number(r.amount || 0);
if (r.status === '已打款') successSum += amt;
if (r.status === '待审核' || r.status === '处理中') pendingSum += amt;
});
stats.value.totalSuccessAmount = successSum.toFixed(2);
stats.value.pendingAmount = pendingSum.toFixed(2);
} else {
allRecords.value = [];
}
} catch (_) {
allRecords.value = [];
} finally {
isLoading.value = false;
isRefreshing.value = false;
}
};
const onRefresh = async () => {
isRefreshing.value = true;
await loadWithdrawals();
};
onMounted(() => {
currentThemeKey.value = getCurrentThemeKey();
applyThemeToNativeUI();
navInfo.value = getNavBarInfo();
loadWithdrawals();
});
onShow(() => {
currentThemeKey.value = getCurrentThemeKey();
applyThemeToNativeUI();
navInfo.value = getNavBarInfo();
loadWithdrawals();
});
</script>
<style lang="scss">
.withdraw-records-page {
min-height: 100vh;
background-color: #0A0F1D;
color: #F8FAFC;
box-sizing: border-box;
display: flex;
flex-direction: column;
/* 顶部沉浸式自定义导航栏 */
.custom-nav-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
height: var(--safe-header-gap);
background: rgba(10, 15, 29, 0.92);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
.nav-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: var(--capsule-height);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 24rpx;
.btn-nav-back {
width: 64rpx;
height: 64rpx;
border-radius: 32rpx;
background: rgba(255, 255, 255, 0.08);
display: flex;
align-items: center;
justify-content: center;
.nav-back-icon {
width: 38rpx;
height: 38rpx;
}
}
.nav-title-wrap {
position: absolute;
left: 50%;
transform: translateX(-50%);
text-align: center;
.nav-title {
font-size: 32rpx;
font-weight: 700;
color: #F8FAFC;
letter-spacing: 0.5rpx;
}
}
.nav-capsule-placeholder {
width: var(--capsule-right-space);
}
}
}
/* 滚动主视图 (精准规避顶部导航栏高度) */
.records-scroll-view {
flex: 1;
margin-top: var(--safe-header-gap);
box-sizing: border-box;
}
.records-content-body {
padding: 24rpx 28rpx 60rpx;
box-sizing: border-box;
}
/* 1. 总览统计流光卡片 */
.summary-stat-card {
position: relative;
border-radius: 28rpx;
padding: 30rpx 28rpx;
margin-bottom: 24rpx;
background: linear-gradient(135deg, #1E1B4B 0%, #0F172A 100%);
border: 1px solid rgba(99, 102, 241, 0.25);
box-shadow: 0 12rpx 36rpx rgba(15, 23, 42, 0.45);
overflow: hidden;
.card-bg-glow {
position: absolute;
top: -60rpx;
right: -60rpx;
width: 200rpx;
height: 200rpx;
border-radius: 50%;
background: radial-gradient(circle, rgba(99, 102, 241, 0.3) 0%, transparent 70%);
pointer-events: none;
}
.summary-inner {
position: relative;
z-index: 1;
}
.summary-title-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 28rpx;
.title-left {
display: flex;
align-items: center;
gap: 16rpx;
.wallet-icon-box {
width: 60rpx;
height: 60rpx;
border-radius: 16rpx;
background: rgba(99, 102, 241, 0.2);
display: flex;
align-items: center;
justify-content: center;
.wallet-icon-svg {
width: 34rpx;
height: 34rpx;
}
}
.title-text-wrap {
display: flex;
flex-direction: column;
gap: 4rpx;
.summary-card-title {
font-size: 30rpx;
font-weight: 700;
color: #F8FAFC;
letter-spacing: 0.5rpx;
}
.summary-card-sub {
font-size: 20rpx;
color: #818CF8;
}
}
}
.btn-new-withdraw {
display: flex;
align-items: center;
gap: 6rpx;
background: linear-gradient(135deg, rgba(99, 102, 241, 0.25), rgba(139, 92, 246, 0.25));
border: 1px solid rgba(99, 102, 241, 0.4);
padding: 10rpx 20rpx;
border-radius: 26rpx;
.btn-txt {
font-size: 22rpx;
font-weight: 600;
color: #A5B4FC;
}
.btn-arrow {
width: 22rpx;
height: 22rpx;
opacity: 0.8;
}
}
}
.summary-numbers-grid {
display: flex;
align-items: center;
justify-content: space-between;
background: rgba(15, 23, 42, 0.7);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 20rpx;
padding: 24rpx 16rpx;
.stat-col {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
gap: 8rpx;
.stat-num-val {
font-size: 32rpx;
font-weight: 800;
color: #F8FAFC;
font-family: -apple-system, BlinkMacSystemFont, 'DIN Alternate', Roboto, sans-serif;
font-variant-numeric: tabular-nums;
&.green { color: #10B981; }
&.gold { color: #F59E0B; }
&.count { color: #818CF8; }
}
.stat-num-label {
font-size: 20rpx;
color: #94A3B8;
}
}
.col-divider {
width: 1px;
height: 44rpx;
background: rgba(255, 255, 255, 0.08);
}
}
}
/* 2. 状态分类筛选选项卡 */
.filter-tabs-card {
background: #0F172A;
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 22rpx;
padding: 10rpx;
margin-bottom: 24rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.2);
.filter-tabs-row {
display: flex;
align-items: center;
.tab-item {
flex: 1;
position: relative;
display: flex;
align-items: center;
justify-content: center;
gap: 8rpx;
height: 72rpx;
border-radius: 16rpx;
transition: all 0.2s ease;
.tab-label {
font-size: 26rpx;
font-weight: 500;
color: #94A3B8;
}
.tab-badge {
font-size: 18rpx;
color: #94A3B8;
background: rgba(255, 255, 255, 0.08);
padding: 2rpx 8rpx;
border-radius: 12rpx;
line-height: 1.2;
}
&.active {
background: rgba(99, 102, 241, 0.15);
.tab-label {
color: #818CF8;
font-weight: 700;
}
.tab-badge {
background: #6366F1;
color: #FFFFFF;
font-weight: 700;
}
.tab-indicator {
position: absolute;
bottom: 6rpx;
width: 32rpx;
height: 4rpx;
background: #818CF8;
border-radius: 2rpx;
}
}
}
}
}
/* 3. 骨架屏 */
.skeleton-wrap {
display: flex;
flex-direction: column;
gap: 20rpx;
.skeleton-card {
height: 220rpx;
border-radius: 24rpx;
background: linear-gradient(90deg, #1E293B 25%, #334155 37%, #1E293B 63%);
background-size: 400% 100%;
animation: skeleton-loading 1.4s ease infinite;
}
}
@keyframes skeleton-loading {
0% { background-position: 100% 50%; }
100% { background-position: 0 50%; }
}
/* 4. 记录列表 */
.records-list-wrap {
display: flex;
flex-direction: column;
gap: 20rpx;
.record-card {
background: #0F172A;
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 24rpx;
padding: 26rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.25);
.card-head-row {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 20rpx;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
margin-bottom: 20rpx;
.order-no-wrap {
display: flex;
align-items: center;
gap: 6rpx;
.order-no-label {
font-size: 22rpx;
color: #64748B;
}
.order-no-val {
font-size: 22rpx;
color: #F8FAFC;
font-family: monospace;
}
.copy-tag {
font-size: 18rpx;
color: #818CF8;
background: rgba(99, 102, 241, 0.15);
padding: 2rpx 8rpx;
border-radius: 6rpx;
margin-left: 6rpx;
}
}
.status-pill {
display: flex;
align-items: center;
gap: 8rpx;
padding: 6rpx 16rpx;
border-radius: 20rpx;
font-size: 20rpx;
font-weight: 600;
.status-dot {
width: 10rpx;
height: 10rpx;
border-radius: 50%;
}
&.pending {
background: rgba(245, 158, 11, 0.12);
color: #F59E0B;
border: 1px solid rgba(245, 158, 11, 0.3);
.status-dot {
background: #F59E0B;
box-shadow: 0 0 8rpx #F59E0B;
}
}
&.success {
background: rgba(16, 185, 129, 0.12);
color: #10B981;
border: 1px solid rgba(16, 185, 129, 0.3);
.status-dot {
background: #10B981;
box-shadow: 0 0 8rpx #10B981;
}
}
&.rejected {
background: rgba(239, 68, 68, 0.12);
color: #EF4444;
border: 1px solid rgba(239, 68, 68, 0.3);
.status-dot {
background: #EF4444;
}
}
}
}
.card-main-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
.amount-col {
display: flex;
align-items: baseline;
gap: 4rpx;
.amount-symbol {
font-size: 32rpx;
font-weight: 700;
color: #10B981;
}
.amount-number {
font-size: 48rpx;
font-weight: 800;
color: #F8FAFC;
font-family: -apple-system, BlinkMacSystemFont, 'DIN Alternate', Roboto, sans-serif;
font-variant-numeric: tabular-nums;
}
}
.channel-pill {
display: flex;
align-items: center;
gap: 10rpx;
background: rgba(16, 185, 129, 0.1);
border: 1px solid rgba(16, 185, 129, 0.25);
border-radius: 20rpx;
padding: 8rpx 18rpx;
.channel-icon {
width: 32rpx;
height: 32rpx;
}
.channel-name {
font-size: 22rpx;
font-weight: 600;
color: #34D399;
}
}
}
.card-timeline-box {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 16rpx;
padding: 16rpx 20rpx;
display: flex;
flex-direction: column;
gap: 10rpx;
.timeline-row {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 22rpx;
.timeline-label {
color: #64748B;
}
.timeline-val {
color: #94A3B8;
&.success {
color: #10B981;
font-weight: 600;
}
&.notice {
color: #F59E0B;
}
}
}
}
.card-rejected-box {
margin-top: 16rpx;
background: rgba(239, 68, 68, 0.08);
border: 1px dashed rgba(239, 68, 68, 0.3);
border-radius: 16rpx;
padding: 16rpx 20rpx;
.reject-title-row {
margin-bottom: 6rpx;
.reject-title {
font-size: 22rpx;
font-weight: 600;
color: #EF4444;
}
}
.reject-reason {
font-size: 22rpx;
color: #FCA5A5;
line-height: 1.4;
display: block;
margin-bottom: 14rpx;
}
.btn-re-withdraw {
height: 52rpx;
line-height: 50rpx;
font-size: 22rpx;
font-weight: 600;
color: #EF4444;
background: rgba(239, 68, 68, 0.15);
border: 1px solid rgba(239, 68, 68, 0.4);
border-radius: 26rpx;
margin: 0;
}
}
}
.list-end-tip {
display: flex;
align-items: center;
justify-content: center;
gap: 16rpx;
padding: 30rpx 0 10rpx;
.tip-line {
width: 60rpx;
height: 1px;
background: rgba(255, 255, 255, 0.1);
}
.tip-txt {
font-size: 20rpx;
color: #475569;
}
}
}
/* 5. 空状态展示 */
.empty-state-card {
padding: 80rpx 40rpx;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
.empty-icon-wrap {
width: 140rpx;
height: 140rpx;
border-radius: 70rpx;
background: rgba(99, 102, 241, 0.1);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 30rpx;
.empty-icon-svg {
width: 72rpx;
height: 72rpx;
opacity: 0.8;
}
}
.empty-title {
font-size: 30rpx;
font-weight: 700;
color: #F8FAFC;
margin-bottom: 12rpx;
}
.empty-sub {
font-size: 24rpx;
color: #64748B;
line-height: 1.5;
margin-bottom: 40rpx;
max-width: 520rpx;
}
.btn-empty-withdraw {
height: 84rpx;
line-height: 84rpx;
padding: 0 60rpx;
font-size: 28rpx;
font-weight: 700;
color: #FFFFFF;
background: linear-gradient(135deg, #6366F1 0%, #4F46E5 100%);
border-radius: 42rpx;
box-shadow: 0 8rpx 28rpx rgba(99, 102, 241, 0.4);
margin: 0;
}
}
.bottom-spacer {
height: 40rpx;
}
/* 暖阳浅色模式适配 (theme-warm) */
&.theme-warm {
background-color: #FFFDF9;
color: #1C1917;
.custom-nav-bar {
background: rgba(255, 253, 249, 0.95);
border-bottom-color: rgba(234, 88, 12, 0.1);
.nav-content {
.btn-nav-back {
background: #FFF7ED;
border: 1px solid #FED7AA;
}
.nav-title-wrap .nav-title {
color: #1C1917;
}
}
}
.summary-stat-card {
background: linear-gradient(135deg, #FFF7ED 0%, #FFEDD5 100%);
border: 1px solid #FED7AA;
box-shadow: 0 8rpx 28rpx rgba(234, 88, 12, 0.08);
.summary-title-row {
.title-left {
.wallet-icon-box {
background: #FFEDD5;
}
.title-text-wrap {
.summary-card-title {
color: #9A3412;
}
.summary-card-sub {
color: #EA580C;
}
}
}
.btn-new-withdraw {
background: #FFFFFF;
border-color: #FED7AA;
box-shadow: 0 2rpx 8rpx rgba(234, 88, 12, 0.1);
.btn-txt {
color: #EA580C;
}
}
}
.summary-numbers-grid {
background: #FFFFFF;
border-color: #FED7AA;
box-shadow: 0 2rpx 10rpx rgba(234, 88, 12, 0.04);
.stat-col {
.stat-num-val {
&.green { color: #059669; }
&.gold { color: #D97706; }
&.count { color: #EA580C; }
}
.stat-num-label {
color: #78716C;
}
}
.col-divider {
background: #F5EBE1;
}
}
}
.filter-tabs-card {
background: #FFFFFF;
border-color: #FED7AA;
box-shadow: 0 4rpx 16rpx rgba(234, 88, 12, 0.04);
.filter-tabs-row .tab-item {
.tab-label {
color: #78716C;
}
.tab-badge {
color: #78716C;
background: #F5F5F4;
}
&.active {
background: #FFF7ED;
.tab-label {
color: #EA580C;
}
.tab-badge {
background: #EA580C;
color: #FFFFFF;
}
.tab-indicator {
background: #EA580C;
}
}
}
}
.records-list-wrap {
.record-card {
background: #FFFFFF;
border-color: #FED7AA;
box-shadow: 0 4rpx 20rpx rgba(234, 88, 12, 0.05);
.card-head-row {
border-bottom-color: #F5F0E8;
.order-no-wrap {
.order-no-label { color: #78716C; }
.order-no-val { color: #1C1917; }
.copy-tag {
color: #EA580C;
background: #FFF7ED;
}
}
}
.card-main-row {
.amount-col {
.amount-symbol { color: #059669; }
.amount-number { color: #1C1917; }
}
.channel-pill {
background: #ECFDF5;
border-color: #A7F3D0;
.channel-name {
color: #059669;
}
}
}
.card-timeline-box {
background: #FAFAF9;
border-color: #F5F5F4;
.timeline-row {
.timeline-label { color: #78716C; }
.timeline-val {
color: #44403C;
&.success { color: #059669; }
&.notice { color: #D97706; }
}
}
}
.card-rejected-box {
background: #FEF2F2;
border-color: #FECACA;
.reject-title-row .reject-title { color: #DC2626; }
.reject-reason { color: #B91C1C; }
.btn-re-withdraw {
background: #FEE2E2;
border-color: #FCA5A5;
color: #DC2626;
}
}
}
.list-end-tip {
.tip-line { background: #E7E2D8; }
.tip-txt { color: #A8A29E; }
}
}
.empty-state-card {
.empty-icon-wrap {
background: #FFF7ED;
border: 1px solid #FED7AA;
}
.empty-title { color: #1C1917; }
.empty-sub { color: #78716C; }
.btn-empty-withdraw {
background: linear-gradient(135deg, #F97316 0%, #EA580C 100%);
box-shadow: 0 8rpx 24rpx rgba(234, 88, 12, 0.3);
}
}
}
}
.btn-active {
transition: opacity 0.15s ease, transform 0.15s ease;
&:active {
opacity: 0.8;
transform: scale(0.98);
}
}
</style>