feat: 星之界打手端UI与提现/充值/排行榜等页面同步更新

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQueandCursor committed 2026-07-08 22:56:08 +08:00
1 parent 40bc391f76
commit 2ea2860791
103 files changed
+7856 -6814

No files matched your search

+6 -2
View File
@@ -87,7 +87,11 @@
}, },
{ {
"root": "pages/fighter-recharge", "root": "pages/fighter-recharge",
"pages": ["fighter-recharge"] "pages": ["fighter-recharge", "fighter-deposit"]
},
{
"root": "pages/fighter-ledger",
"pages": ["fighter-ledger"]
}, },
{ {
"root": "pages/fighter-msg", "root": "pages/fighter-msg",
@@ -99,7 +103,7 @@
}, },
{ {
"root": "pages/withdraw", "root": "pages/withdraw",
"pages": ["withdraw", "components/mode1/mode1", "components/mode2/mode2"] "pages": ["withdraw", "withdraw-records", "components/mode1/mode1", "components/mode2/mode2"]
}, },
{ {
"root": "pages/invite-fighter", "root": "pages/invite-fighter",
+21
View File
@@ -1,5 +1,18 @@
import { openCustomerServiceChat, resolveKefuIconUrl } from '../../utils/kefu-nav.js'; import { openCustomerServiceChat, resolveKefuIconUrl } from '../../utils/kefu-nav.js';
const CS_HOUR_START = 8;
const CS_HOUR_END = 23;
function getCsOnlineStatus() {
const hour = new Date().getHours();
const online = hour >= CS_HOUR_START && hour < CS_HOUR_END;
return {
csOnline: online,
csHoursText: '8:00-23:00',
csStatusText: online ? '在线' : '在线时间',
};
}
Component({ Component({
properties: { properties: {
bottom: { type: String, value: '200rpx' }, bottom: { type: String, value: '200rpx' },
@@ -11,6 +24,9 @@ Component({
csUnread: 0, csUnread: 0,
floatY: 520, floatY: 520,
iconUrl: '', iconUrl: '',
csOnline: false,
csHoursText: '8:00-23:00',
csStatusText: '在线时间',
}, },
lifetimes: { lifetimes: {
@@ -27,6 +43,7 @@ Component({
app.on('configApplied', this._configHandler); app.on('configApplied', this._configHandler);
} }
this.syncCsUnread(); this.syncCsUnread();
this._syncOnlineStatus();
}, },
detached() { detached() {
const app = getApp(); const app = getApp();
@@ -47,10 +64,14 @@ Component({
this._syncIcon(); this._syncIcon();
this._syncFromGlobal(); this._syncFromGlobal();
this.syncCsUnread(); this.syncCsUnread();
this._syncOnlineStatus();
}, },
}, },
methods: { methods: {
_syncOnlineStatus() {
this.setData(getCsOnlineStatus());
},
_syncIcon() { _syncIcon() {
const url = resolveKefuIconUrl(getApp()); const url = resolveKefuIconUrl(getApp());
if (url && url !== this.data.iconUrl) { if (url && url !== this.data.iconUrl) {
+2 -1
View File
@@ -15,7 +15,8 @@
<image class="kefu-float-icon-img" src="{{iconUrl}}" mode="aspectFit" binderror="onIconError"/> <image class="kefu-float-icon-img" src="{{iconUrl}}" mode="aspectFit" binderror="onIconError"/>
<view class="kefu-text-col"> <view class="kefu-text-col">
<text class="kefu-float-text">联系客服</text> <text class="kefu-float-text">联系客服</text>
<text class="kefu-float-sub" wx:if="{{csUnread > 0}}">有新消息</text> <text class="kefu-float-sub kefu-float-sub--warn" wx:if="{{csUnread > 0}}">有新消息</text>
<text class="kefu-float-sub {{csOnline ? 'kefu-float-sub--online' : ''}}" wx:else>{{csStatusText}} {{csHoursText}}</text>
</view> </view>
</view> </view>
<view class="kefu-float-close" catchtap="onHideTap"> <view class="kefu-float-close" catchtap="onHideTap">
+58 -36
View File
@@ -31,27 +31,34 @@
.kefu-float--full { .kefu-float--full {
display: flex; display: flex;
align-items: stretch; align-items: stretch;
background: #fff; background: linear-gradient(135deg, #07c160 0%, #06ad56 100%);
border-radius: 16rpx; border-radius: 999rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.1); box-shadow: 0 8rpx 28rpx rgba(7, 193, 96, 0.45);
border: 1rpx solid rgba(124, 58, 237, 0.18); border: 2rpx solid rgba(255, 255, 255, 0.85);
overflow: visible; overflow: visible;
animation: kefu-pulse 2.4s ease-in-out infinite;
}
@keyframes kefu-pulse {
0%, 100% { box-shadow: 0 8rpx 28rpx rgba(7, 193, 96, 0.45); }
50% { box-shadow: 0 8rpx 36rpx rgba(7, 193, 96, 0.65), 0 0 0 8rpx rgba(7, 193, 96, 0.12); }
} }
.kefu-unread-badge { .kefu-unread-badge {
position: absolute; position: absolute;
top: -10rpx; top: -10rpx;
right: -6rpx; right: -6rpx;
min-width: 32rpx; min-width: 36rpx;
height: 32rpx; height: 36rpx;
line-height: 32rpx; line-height: 36rpx;
padding: 0 6rpx; padding: 0 8rpx;
background: #fa5151; background: #fa5151;
color: #fff; color: #fff;
font-size: 18rpx; font-size: 20rpx;
font-weight: 700;
text-align: center; text-align: center;
border-radius: 16rpx; border-radius: 18rpx;
border: 2rpx solid #fff; border: 3rpx solid #fff;
z-index: 2; z-index: 2;
} }
@@ -63,7 +70,7 @@
.kefu-float-main { .kefu-float-main {
display: flex; display: flex;
align-items: center; align-items: center;
padding: 14rpx 16rpx; padding: 18rpx 24rpx;
flex: 1; flex: 1;
} }
@@ -72,11 +79,13 @@
} }
.kefu-float-icon-img { .kefu-float-icon-img {
width: 36rpx; width: 44rpx;
height: 36rpx; height: 44rpx;
margin-right: 10rpx; margin-right: 12rpx;
flex-shrink: 0; flex-shrink: 0;
border-radius: 8rpx; border-radius: 50%;
background: rgba(255, 255, 255, 0.95);
padding: 4rpx;
} }
.kefu-text-col { .kefu-text-col {
@@ -86,32 +95,42 @@
} }
.kefu-float-text { .kefu-float-text {
font-size: 24rpx; font-size: 28rpx;
color: #333; color: #fff;
font-weight: 600; font-weight: 700;
white-space: nowrap; white-space: nowrap;
} }
.kefu-float-sub { .kefu-float-sub {
font-size: 18rpx; font-size: 20rpx;
color: #fa5151; color: rgba(255, 255, 255, 0.92);
margin-top: 2rpx; margin-top: 2rpx;
font-weight: 600;
}
.kefu-float-sub--online {
color: #e8ffe8;
}
.kefu-float-sub--warn {
color: #fff3e0;
} }
.kefu-float-close { .kefu-float-close {
width: 48rpx; width: 52rpx;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: #f5f3ff; background: rgba(0, 0, 0, 0.12);
color: #999; color: rgba(255, 255, 255, 0.9);
font-size: 32rpx; font-size: 34rpx;
line-height: 1; line-height: 1;
border-left: 1rpx solid rgba(124, 58, 237, 0.1); border-left: 1rpx solid rgba(255, 255, 255, 0.25);
border-radius: 0 999rpx 999rpx 0;
} }
.kefu-float-close:active { .kefu-float-close:active {
background: #ede9fe; background: rgba(0, 0, 0, 0.2);
} }
.kefu-permanent-row { .kefu-permanent-row {
@@ -133,7 +152,7 @@
.kefu-permanent-label { .kefu-permanent-label {
font-size: 20rpx; font-size: 20rpx;
color: #aaa; color: #888;
} }
.kefu-wrap--mini { .kefu-wrap--mini {
@@ -141,16 +160,17 @@
} }
.kefu-float--mini { .kefu-float--mini {
width: 72rpx; width: 96rpx;
height: 72rpx; height: 96rpx;
padding: 0; padding: 0;
border-radius: 50%; border-radius: 50%;
background: #fff; background: linear-gradient(135deg, #07c160 0%, #06ad56 100%);
box-shadow: 0 4rpx 14rpx rgba(0, 0, 0, 0.1); box-shadow: 0 8rpx 24rpx rgba(7, 193, 96, 0.45);
border: 1rpx solid rgba(124, 58, 237, 0.2); border: 3rpx solid #fff;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
animation: kefu-pulse 2.4s ease-in-out infinite;
} }
.kefu-float--mini:active { .kefu-float--mini:active {
@@ -158,7 +178,9 @@
} }
.kefu-float-mini-icon-img { .kefu-float-mini-icon-img {
width: 40rpx; width: 48rpx;
height: 40rpx; height: 48rpx;
border-radius: 8rpx; border-radius: 50%;
background: rgba(255, 255, 255, 0.95);
padding: 4rpx;
} }
+3 -3
View File
@@ -3,9 +3,9 @@
* 星阙 = xq;星之界 = xzj;与 club 表 club_id 一致。 * 星阙 = xq;星之界 = xzj;与 club 表 club_id 一致。
* 不要依赖后端猜测:前端必须明确所属 club。 * 不要依赖后端猜测:前端必须明确所属 club。
*/ */
export const CLUB_ID = 'xq'; export const CLUB_ID = 'xzj';
/** 与 club 表 wx_appid 一致,登录时可传给后端反查 club */ /** 与 club 表 wx_appid 一致,登录时可传给后端反查 club */
export const WX_APP_ID = 'wx0e4be86faac4a8d1'; export const WX_APP_ID = 'wxdefa454152e78a03';
export const CLUB_NAME = '星阙电竞'; export const CLUB_NAME = '星之界电竞';
+17 -5
View File
@@ -443,6 +443,11 @@ Page({
if (res.data.code === 200 || res.data.code === 0) { if (res.data.code === 200 || res.data.code === 0) {
const newList = res.data.data.list || []; const newList = res.data.data.list || [];
const hasMore = res.data.data.has_more || false; const hasMore = res.data.data.has_more || false;
const serverClumber = res.data.data.clumber;
if (Array.isArray(serverClumber) && serverClumber.length) {
app.globalData.clumber = serverClumber;
this.setData({ huiyuanList: serverClumber });
}
// 🆕 处理每条订单,增加 hasRequiredMember 字段 // 🆕 处理每条订单,增加 hasRequiredMember 字段
const processedList = newList.map(item => this.processDingdanItem(item)); const processedList = newList.map(item => this.processDingdanItem(item));
@@ -506,9 +511,13 @@ Page({
} }
const zhidingNicheng = item.zhiding_nicheng || ''; const zhidingNicheng = item.zhiding_nicheng || '';
// 订单要求指定会员时,核对用户是否持有该会员类型 // 订单要求指定会员时,核对用户是否持有该会员类型(优先后端字段)
let hasRequiredMember = true; let hasRequiredMember = true;
if (item.yaoqiuleixing == 1 && item.huiyuan_id) { if (item.hasRequiredMember !== undefined) {
hasRequiredMember = !!item.hasRequiredMember;
} else if (item.has_required_member !== undefined) {
hasRequiredMember = !!item.has_required_member;
} else if (item.yaoqiuleixing == 1 && item.huiyuan_id) {
hasRequiredMember = userHasHuiyuan(this.data.huiyuanList, item.huiyuan_id); hasRequiredMember = userHasHuiyuan(this.data.huiyuanList, item.huiyuan_id);
} }
@@ -549,13 +558,16 @@ Page({
switch (failureType) { switch (failureType) {
case 'huiyuan': case 'huiyuan':
params = { needScroll: '0', scrollTo: 'member' }; url = '/pages/fighter-recharge/fighter-recharge';
params = { scrollTo: 'member' };
break; break;
case 'yajin': case 'yajin':
params = { needScroll: '1', scrollTo: 'bottom', requiredYajin: requiredYajin }; url = '/pages/fighter-recharge/fighter-deposit';
params = { requiredYajin: requiredYajin };
break; break;
case 'jifen': case 'jifen':
params = { needScroll: '1', scrollTo: 'bottom' }; url = '/pages/fighter-recharge/fighter-recharge';
params = { scrollTo: 'jifen' };
break; break;
} }
+5 -4
View File
@@ -1,10 +1,11 @@
{ {
"navigationBarTitleText": "抢单大厅", "navigationBarTitleText": "抢单列表",
"navigationBarBackgroundColor": "#0b0f1a", "navigationBarBackgroundColor": "#f7dc51",
"navigationBarTextStyle": "white", "backgroundColorTop": "#f7dc51",
"navigationBarTextStyle": "black",
"enablePullDownRefresh": false, "enablePullDownRefresh": false,
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"backgroundColor": "#0b0f1a", "backgroundColor": "#fff8e1",
"usingComponents": { "usingComponents": {
"chenghao-tag": "/components/chenghao-tag/chenghao-tag", "chenghao-tag": "/components/chenghao-tag/chenghao-tag",
"global-notification": "/components/global-notification/global-notification", "global-notification": "/components/global-notification/global-notification",
+4 -4
View File
@@ -18,7 +18,7 @@
refresher-default-style="black" refresher-default-style="black"
refresher-background="#0b0f1a" refresher-background="#fff8e1"
refresher-triggered="{{scrollViewRefreshing}}" refresher-triggered="{{scrollViewRefreshing}}"
@@ -40,7 +40,7 @@
<!-- 公告置顶 --> <!-- 公告置顶 -->
<view class="xym-gonggao-bar" wx:if="{{gonggao}}"> <view class="xym-gonggao-bar" wx:if="{{gonggao}}">
<image class="xym-gonggao-ico" src="/images/notice.png" mode="aspectFit"/> <image class="xym-gonggao-ico" src="https://bintao.xmxym88.com/xcx/bintao/38.png" mode="aspectFit"/>
<text class="xym-gonggao-txt">{{gonggao}}</text> <text class="xym-gonggao-txt">{{gonggao}}</text>
</view> </view>
@@ -82,7 +82,7 @@
indicator-color="rgba(255,255,255,0.6)" indicator-color="rgba(255,255,255,0.6)"
indicator-active-color="#00c8ff" indicator-active-color="#ffd061"
autoplay="{{lunboList.length > 1}}" autoplay="{{lunboList.length > 1}}"
@@ -110,7 +110,7 @@
<!-- 商品类型选择 --> <!-- 商品类型选择 -->
<view class="leixing-quyu"> <view class="leixing-quyu dingdanxiang1 filter-card mx20">
<scroll-view class="leixing-scroll" scroll-x enhanced show-scrollbar="{{false}}"> <scroll-view class="leixing-scroll" scroll-x enhanced show-scrollbar="{{false}}">
+13 -13
View File
@@ -1,9 +1,9 @@
/* pages/qiangdan/qiangdan.wxss - 机甲风格抢单页 */ /* pages/qiangdan/qiangdan.wxss - 逍遥梦抢单页 */
@import '../../styles/dashou-xym-theme.wxss'; @import '../../styles/dashou-xym-theme.wxss';
@import '../../styles/dashou-xym-order-card.wxss'; @import '../../styles/dashou-xym-order-card.wxss';
page { page {
background-color: #0b0f1a; background-color: #f7dc51;
} }
.qiangdan-page { .qiangdan-page {
@@ -33,7 +33,7 @@ page {
/* ====== 1. 商品类型区域 ====== */ /* ====== 1. 商品类型区域 ====== */
.leixing-quyu { .leixing-quyu {
padding: 24rpx 0 16rpx; padding: 30rpx 0 20rpx;
background: rgba(18, 22, 38, 0.9); background: rgba(18, 22, 38, 0.9);
backdrop-filter: blur(20rpx); backdrop-filter: blur(20rpx);
border-bottom: 1rpx solid rgba(255, 255, 255, 0.05); border-bottom: 1rpx solid rgba(255, 255, 255, 0.05);
@@ -46,26 +46,26 @@ page {
.leixing-scroll { .leixing-scroll {
width: 100%; width: 100%;
white-space: nowrap; white-space: nowrap;
height: 158rpx; height: 180rpx;
} }
.leixing-container { .leixing-container {
display: inline-flex; display: inline-flex;
padding: 0 30rpx; padding: 0 30rpx;
gap: 16rpx; gap: 20rpx;
} }
.leixing-item { .leixing-item {
display: inline-flex; display: inline-flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
width: 132rpx; width: 160rpx;
position: relative; position: relative;
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
} }
.leixing-active { .leixing-active {
transform: translateY(-6rpx); transform: translateY(-8rpx);
} }
.guangyun-effect { .guangyun-effect {
@@ -86,9 +86,9 @@ page {
} }
.leixing-tupian { .leixing-tupian {
width: 100rpx; width: 120rpx;
height: 100rpx; height: 120rpx;
border-radius: 28rpx; border-radius: 32rpx;
z-index: 1; z-index: 1;
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.6); box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.6);
transition: all 0.3s ease; transition: all 0.3s ease;
@@ -101,8 +101,8 @@ page {
} }
.leixing-jieshao { .leixing-jieshao {
margin-top: 12rpx; margin-top: 16rpx;
font-size: 22rpx; font-size: 24rpx;
color: #b0c0e0; color: #b0c0e0;
max-width: 100%; max-width: 100%;
overflow: hidden; overflow: hidden;
@@ -771,7 +771,7 @@ page {
max-width: 50%; max-width: 50%;
} }
/* 被指定订单(功能样式,不影响订单卡片原 UI) */ /* 被指定订单(星阙功能保留,不影响星之界卡片 UI) */
.my-zhiding-banner { .my-zhiding-banner {
margin: 16rpx 24rpx 0; margin: 16rpx 24rpx 0;
padding: 22rpx; padding: 22rpx;
+1 -1
View File
@@ -4,7 +4,7 @@
"chenghao-tag": "/components/chenghao-tag/chenghao-tag" "chenghao-tag": "/components/chenghao-tag/chenghao-tag"
}, },
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"navigationBarBackgroundColor": "#f5f3ff", "navigationBarBackgroundColor": "#f7dc51",
"navigationBarTitleText": "常规发单", "navigationBarTitleText": "常规发单",
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"backgroundColor": "#f5f5f5", "backgroundColor": "#f5f5f5",
+7 -7
View File
@@ -290,7 +290,7 @@ page {
.filter-switch.active { .filter-switch.active {
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
} }
.link-list { .link-list {
@@ -324,7 +324,7 @@ page {
.copy-link-btn { .copy-link-btn {
padding: 8rpx 20rpx; padding: 8rpx 20rpx;
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
border-radius: 15rpx; border-radius: 15rpx;
font-size: 22rpx; font-size: 22rpx;
} }
@@ -339,7 +339,7 @@ page {
padding: 15rpx 40rpx; padding: 15rpx 40rpx;
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
border-radius: 30rpx; border-radius: 30rpx;
color: #6d28d9; color: #492f00;
font-size: 26rpx; font-size: 26rpx;
} }
@@ -374,7 +374,7 @@ page {
.copy-modal-grid-btn, .copy-modal-grid-btn,
.edit-modal-grid-btn { .edit-modal-grid-btn {
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
} }
.delete-modal-grid-btn { .delete-modal-grid-btn {
@@ -485,7 +485,7 @@ page {
.confirm-add-grid-btn { .confirm-add-grid-btn {
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
} }
.confirm-content { .confirm-content {
@@ -539,7 +539,7 @@ page {
.confirm-new-link-grid-btn { .confirm-new-link-grid-btn {
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
} }
.loading-mask { .loading-mask {
@@ -569,7 +569,7 @@ page {
width: 90rpx; width: 90rpx;
height: 90rpx; height: 90rpx;
border: 8rpx solid #eee; border: 8rpx solid #eee;
border-top: 8rpx solid #9333ea; border-top: 8rpx solid #ffd061;
border-radius: 50%; border-radius: 50%;
animation: spin 1.2s linear infinite; animation: spin 1.2s linear infinite;
margin-bottom: 35rpx; margin-bottom: 35rpx;
+139
View File
@@ -0,0 +1,139 @@
import request from '../../utils/request.js';
import { getOrderStatusText } from '../../utils/api-helper.js';
const PAGE_SIZE = 15;
const TYPE_CONFIG = {
commission: { title: '佣金记录', statuses: [3, 8] },
settle: { title: '结算记录', statuses: [3] },
withdraw: { title: '提现记录', api: 'withdraw' },
deduct: { title: '扣款记录', api: 'deduct' },
};
Page({
data: {
pageTitle: '交易明细',
type: 'commission',
statusBar: 20,
list: [],
page: 1,
hasMore: true,
loading: false,
refreshing: false,
},
onLoad(options) {
const sys = wx.getSystemInfoSync();
const type = (options.type || 'commission').trim();
const cfg = TYPE_CONFIG[type] || TYPE_CONFIG.commission;
this.setData({
type,
pageTitle: cfg.title,
statusBar: sys.statusBarHeight || 20,
});
this.loadList(true);
},
goBack() {
wx.navigateBack({ fail: () => wx.switchTab({ url: '/pages/fighter/fighter' }) });
},
onRefresh() {
this.setData({ refreshing: true });
this.loadList(true).finally(() => this.setData({ refreshing: false }));
},
onLoadMore() {
if (this.data.hasMore && !this.data.loading) {
this.loadList(false);
}
},
async loadList(refresh) {
const { type, loading } = this.data;
if (loading) return;
const page = refresh ? 1 : this.data.page;
this.setData({ loading: true });
try {
let rows = [];
let hasMore = false;
if (type === 'withdraw') {
const res = await request({
url: '/yonghu/tixianjiluhq',
method: 'POST',
data: { page, limit: PAGE_SIZE },
});
const body = res?.data;
if (body && (body.code === 200 || body.code === 0)) {
const raw = body.data?.list || [];
rows = raw.map((item, idx) => ({
id: item.id || item.jilu_id || `${page}-${idx}`,
title: item.beizhu || item.status_text || item.zhuangtai_text || '提现',
time: item.creat_time || item.create_time || item.tijiao_shijian || '',
amount: `-¥${item.jine || item.amount || item.tixian_jine || '0.00'}`,
minus: true,
}));
hasMore = raw.length >= PAGE_SIZE;
}
} else if (type === 'deduct') {
const res = await request({
url: '/yonghu/dsfklbhq',
method: 'POST',
data: { page, page_size: PAGE_SIZE, zhuangtai: 0 },
});
const body = res?.data;
if (body && (body.code === 200 || body.code === 0)) {
const raw = body.data?.list || [];
rows = raw.map((item, idx) => ({
id: item.fadan_id || item.id || `${page}-${idx}`,
title: item.yuanyin || item.beizhu || item.fakuan_yuanyin || '扣款',
time: item.creat_time || item.create_time || '',
amount: `-¥${item.jine || item.fakuan_jine || item.fakuanjine || '0.00'}`,
minus: true,
}));
hasMore = raw.length >= PAGE_SIZE;
}
} else {
const cfg = TYPE_CONFIG[type] || TYPE_CONFIG.commission;
const res = await request({
url: '/dingdan/dshqdingdan',
method: 'POST',
data: {
zhuangtai_list: cfg.statuses,
page,
page_size: PAGE_SIZE,
},
});
const body = res?.data;
if (body && (body.code === 200 || body.code === 0)) {
const raw = body.data?.list || [];
rows = raw.map((item) => {
const amt = item.jine || item.dashou_fencheng || '0.00';
const brief = (item.jieshao || '').trim();
const title = brief
? (brief.length > 18 ? `${brief.slice(0, 18)}…` : brief)
: `订单 ${item.dingdan_id || ''}`;
return {
id: item.dingdan_id,
title,
time: item.wancheng_shijian || item.jiesuan_shijian || item.creat_time || getOrderStatusText(item.zhuangtai),
amount: `+¥${amt}`,
minus: false,
};
});
hasMore = body.data?.has_more ?? raw.length >= PAGE_SIZE;
}
}
const list = refresh ? rows : [...this.data.list, ...rows];
this.setData({
list,
page: refresh ? 2 : page + 1,
hasMore,
});
} catch (e) {
console.error('ledger load fail', e);
} finally {
this.setData({ loading: false });
}
},
});
+4
View File
@@ -0,0 +1,4 @@
{
"navigationStyle": "custom",
"usingComponents": {}
}
+20
View File
@@ -0,0 +1,20 @@
<view class="ledger-page safe-area">
<view class="status-bar" style="height:{{statusBar}}px"></view>
<view class="nav-bar flexb">
<text class="back" bindtap="goBack">‹</text>
<text class="nav-title">{{pageTitle}}</text>
<text class="back placeholder"></text>
</view>
<scroll-view scroll-y class="ledger-scroll" refresher-enabled refresher-triggered="{{refreshing}}" bindrefresherrefresh="onRefresh" bindscrolltolower="onLoadMore">
<view wx:if="{{loading && list.length === 0}}" class="empty-box">加载中...</view>
<view wx:elif="{{list.length === 0}}" class="empty-box">暂无记录</view>
<view wx:for="{{list}}" wx:key="id" class="list-item flexb">
<view class="item-main">
<view class="row-t">{{item.title}}</view>
<view class="row-d">{{item.time}}</view>
</view>
<text class="row-r {{item.minus ? 'minus' : ''}}">{{item.amount}}</text>
</view>
<view wx:if="{{list.length > 0 && !hasMore}}" class="load-tip">— 已加载全部 —</view>
</scroll-view>
</view>
+75
View File
@@ -0,0 +1,75 @@
@import '../../styles/xym-layout.wxss';
.ledger-page {
min-height: 100vh;
background: #f5f5f5;
display: flex;
flex-direction: column;
}
.nav-bar {
padding: 0 24rpx 16rpx;
}
.back {
width: 60rpx;
font-size: 48rpx;
color: #333;
line-height: 1;
}
.back.placeholder {
visibility: hidden;
}
.nav-title {
font-size: 34rpx;
font-weight: 700;
color: #222;
}
.ledger-scroll {
flex: 1;
height: 0;
padding: 0 24rpx;
box-sizing: border-box;
}
.list-item {
background: #fff;
border-radius: 16rpx;
padding: 24rpx;
margin-bottom: 16rpx;
}
.row-t {
font-size: 28rpx;
color: #222;
font-weight: 600;
}
.row-d {
font-size: 24rpx;
color: #999;
margin-top: 8rpx;
}
.row-r {
font-size: 30rpx;
font-weight: 700;
color: #492f00;
flex-shrink: 0;
margin-left: 16rpx;
}
.row-r.minus {
color: #ff4c45;
}
.empty-box,
.load-tip {
text-align: center;
color: #999;
font-size: 26rpx;
padding: 80rpx 0;
}
+11
View File
@@ -62,6 +62,17 @@ Page(createPage({
onShow() { onShow() {
this.registerNotificationComponent(); this.registerNotificationComponent();
const app = getApp();
const filterKey = app.globalData._fighterOrdersStatusKey;
if (filterKey) {
app.globalData._fighterOrdersStatusKey = null;
if (this.data.statusList.some((s) => s.key === filterKey)) {
this.setData({ currentStatusKey: filterKey });
}
if (this.data.xuanzhongLeixingId) {
this.loadCurrentStatusOrders(true);
}
}
if (wx.getStorageSync('uid')) { if (wx.getStorageSync('uid')) {
reconnectForRole('dashou'); reconnectForRole('dashou');
if (app.startImWhenReady) app.startImWhenReady(); if (app.startImWhenReady) app.startImWhenReady();
+2 -1
View File
@@ -346,4 +346,5 @@ page {
color: #999; color: #999;
} }
@import '../../styles/dashou-xym-orders-theme.wxss'; @import '../../styles/dashou-xym-orders-theme.wxss';
@import '../../styles/dashou-xym-orders-page.wxss';
+5 -5
View File
@@ -2,10 +2,10 @@
"usingComponents": { "usingComponents": {
"global-notification": "/components/global-notification/global-notification" "global-notification": "/components/global-notification/global-notification"
}, },
"navigationBarTitleText": "排行榜", "navigationBarTitleText": "总排行榜",
"navigationBarBackgroundColor": "#0d1117", "navigationBarBackgroundColor": "#FFE566",
"navigationBarTextStyle": "white", "navigationBarTextStyle": "black",
"enablePullDownRefresh": true, "enablePullDownRefresh": true,
"backgroundColor": "#0d1117", "backgroundColor": "#FFE566",
"backgroundTextStyle": "light" "backgroundTextStyle": "dark"
} }
+60 -83
View File
@@ -1,35 +1,36 @@
<view class="rank-page"> <view class="rank-page">
<image class="page-bg" src="{{imgUrls.pageBg}}" mode="aspectFill" /> <!-- 顶区:黄底 + 白 Tab + 时间筛选 -->
<view class="header-zone">
<view class="top-bar"> <view class="role-tabs">
<view class="top-row"> <view
<text class="page-title">{{roleMeta.title}}</text> wx:for="{{roleList}}" wx:key="key"
<view class="refresh-wrap" bindtap="onRefreshTap"> class="role-tab {{currentRole === item.key ? 'active' : ''}}"
<image class="refresh-ico" src="{{imgUrls.refreshIcon}}" mode="aspectFit" /> data-role="{{item.key}}" bindtap="onRoleTap"
>
<text class="role-tab-text">{{item.label}}</text>
<view class="role-tab-line" wx:if="{{currentRole === item.key}}"></view>
</view> </view>
</view> </view>
<scroll-view scroll-x class="role-scroll" enhanced show-scrollbar="{{false}}">
<view class="role-line"> <scroll-view scroll-x class="date-scroll" enhanced show-scrollbar="{{false}}">
<view class="date-line">
<view <view
wx:for="{{roleList}}" wx:key="key" wx:for="{{dateList}}" wx:key="key"
class="role-chip {{currentRole === item.key ? 'on' : ''}}" class="date-tab {{currentDate === item.key ? 'active' : ''}}"
data-role="{{item.key}}" bindtap="onRoleTap" data-date="{{item.key}}" bindtap="onDateTap"
>{{item.label}}</view> >{{item.label}}</view>
</view> </view>
</scroll-view> </scroll-view>
<view class="date-grid">
<view
wx:for="{{dateList}}" wx:key="key"
class="date-chip {{currentDate === item.key ? 'on' : ''}}"
data-date="{{item.key}}" bindtap="onDateTap"
>{{item.label}}</view>
</view>
<text class="sort-tip">{{currentDate}} · 按{{sortLabel}} · TOP50</text>
<view class="scope-row"> <view class="scope-row">
<view class="scope-chip {{fanwei === 'jituan' ? 'on' : ''}}" data-fanwei="jituan" bindtap="onScopeTap">集团总榜</view> <!-- 临时隐藏集团总榜,恢复时取消 wx:if 注释 -->
<view class="scope-chip {{fanwei === 'club' ? 'on' : ''}}" data-fanwei="club" bindtap="onScopeTap">本俱乐部榜</view> <view wx:if="{{showJituanScope}}" class="scope-tab {{fanwei === 'jituan' ? 'active' : ''}}" data-fanwei="jituan" bindtap="onScopeTap">集团总榜</view>
<view class="scope-tab {{fanwei === 'club' ? 'active' : ''}}" data-fanwei="club" bindtap="onScopeTap">本俱乐部榜</view>
<view class="refresh-btn" bindtap="onRefreshTap">
<image class="refresh-ico" src="{{imgUrls.refreshIcon}}" mode="aspectFit" />
</view>
</view> </view>
<text class="sort-tip">{{currentDate}} · 按{{sortLabel}} · TOP50</text>
<view class="reward-banner" wx:if="{{rewardInfo && rewardInfo.scheme_enabled}}" bindtap="onShowRules"> <view class="reward-banner" wx:if="{{rewardInfo && rewardInfo.scheme_enabled}}" bindtap="onShowRules">
<view class="reward-banner-main"> <view class="reward-banner-main">
@@ -54,95 +55,71 @@
</view> </view>
<scroll-view wx:else scroll-y class="body-scroll" enhanced show-scrollbar="{{false}}"> <scroll-view wx:else scroll-y class="body-scroll" enhanced show-scrollbar="{{false}}">
<!-- 前三名领奖台 -->
<view class="podium-zone" wx:if="{{topThree.length > 0}}">
<view class="podium-row">
<!-- 前三名 · 纯 CSS 领奖台 --> <view class="podium-col col-2" wx:if="{{topThree[1]}}">
<view class="podium-panel" wx:if="{{topThree.length > 0}}"> <view class="crown crown-silver">👑</view>
<view class="podium-cols"> <view class="avatar-ring ring-silver">
<!-- 榜二 -->
<view class="p-col p-second" wx:if="{{topThree[1]}}">
<view class="p-badge badge-silver"><text>2</text></view>
<view class="p-avatar-wrap wrap-silver">
<image class="p-avatar" src="{{topThree[1].avatar || defaultAvatar}}" mode="aspectFill" data-zone="top" data-index="1" binderror="onAvatarError" /> <image class="p-avatar" src="{{topThree[1].avatar || defaultAvatar}}" mode="aspectFill" data-zone="top" data-index="1" binderror="onAvatarError" />
</view> </view>
<text class="p-name">{{topThree[1].nicheng}}</text> <text class="p-name">{{topThree[1].nicheng}}</text>
<text class="p-uid">ID {{topThree[1].uid}}</text> <text class="p-label">{{topThree[1].mainLabel}}</text>
<view class="p-amount"> <text class="p-amount">{{topThree[1].mainPrefix}}{{topThree[1].mainValue}}</text>
<text class="p-money">{{topThree[1].mainPrefix}}{{topThree[1].mainValue}}</text>
<text class="p-label">{{topThree[1].mainLabel}}</text>
<text class="p-reward" wx:if="{{topThree[1].rewardAmount > 0}}">奖 ¥{{topThree[1].rewardAmount}}</text>
</view>
<view class="p-metrics"> <view class="p-metrics">
<text class="p-metric" wx:for="{{topThree[1].metrics}}" wx:key="label" wx:for-item="m">{{m.label}} {{m.value}}</text> <text class="p-metric" wx:for="{{topThree[1].metrics}}" wx:key="label" wx:for-item="m">{{m.label}} {{m.value}}</text>
</view> </view>
<view class="p-pedestal pedestal-silver"></view> <text class="p-reward" wx:if="{{topThree[1].rewardAmount > 0}}">奖 ¥{{topThree[1].rewardAmount}}</text>
<view class="pedestal pedestal-2"></view>
</view> </view>
<!-- 榜一 --> <view class="podium-col col-1" wx:if="{{topThree[0]}}">
<view class="p-col p-first" wx:if="{{topThree[0]}}"> <view class="crown crown-gold">👑</view>
<view class="p-badge badge-first"><text>1</text></view> <view class="avatar-ring ring-gold">
<view class="p-avatar-wrap wrap-first">
<image class="p-avatar p-avatar-lg" src="{{topThree[0].avatar || defaultAvatar}}" mode="aspectFill" data-zone="top" data-index="0" binderror="onAvatarError" /> <image class="p-avatar p-avatar-lg" src="{{topThree[0].avatar || defaultAvatar}}" mode="aspectFill" data-zone="top" data-index="0" binderror="onAvatarError" />
</view> </view>
<text class="p-name p-name-first">{{topThree[0].nicheng}}</text> <text class="p-name p-name-lg">{{topThree[0].nicheng}}</text>
<text class="p-uid">ID {{topThree[0].uid}}</text> <text class="p-label">{{topThree[0].mainLabel}}</text>
<view class="p-amount"> <text class="p-amount p-amount-lg">{{topThree[0].mainPrefix}}{{topThree[0].mainValue}}</text>
<text class="p-money p-money-first">{{topThree[0].mainPrefix}}{{topThree[0].mainValue}}</text>
<text class="p-label">{{topThree[0].mainLabel}}</text>
<text class="p-reward" wx:if="{{topThree[0].rewardAmount > 0}}">奖 ¥{{topThree[0].rewardAmount}}</text>
</view>
<view class="p-metrics"> <view class="p-metrics">
<text class="p-metric" wx:for="{{topThree[0].metrics}}" wx:key="label" wx:for-item="m">{{m.label}} {{m.value}}</text> <text class="p-metric" wx:for="{{topThree[0].metrics}}" wx:key="label" wx:for-item="m">{{m.label}} {{m.value}}</text>
</view> </view>
<view class="p-pedestal pedestal-first"></view> <text class="p-reward" wx:if="{{topThree[0].rewardAmount > 0}}">奖 ¥{{topThree[0].rewardAmount}}</text>
<view class="pedestal pedestal-1"></view>
</view> </view>
<!-- 榜三 --> <view class="podium-col col-3" wx:if="{{topThree[2]}}">
<view class="p-col p-third" wx:if="{{topThree[2]}}"> <view class="crown crown-bronze">👑</view>
<view class="p-badge badge-bronze"><text>3</text></view> <view class="avatar-ring ring-bronze">
<view class="p-avatar-wrap wrap-bronze">
<image class="p-avatar" src="{{topThree[2].avatar || defaultAvatar}}" mode="aspectFill" data-zone="top" data-index="2" binderror="onAvatarError" /> <image class="p-avatar" src="{{topThree[2].avatar || defaultAvatar}}" mode="aspectFill" data-zone="top" data-index="2" binderror="onAvatarError" />
</view> </view>
<text class="p-name">{{topThree[2].nicheng}}</text> <text class="p-name">{{topThree[2].nicheng}}</text>
<text class="p-uid">ID {{topThree[2].uid}}</text> <text class="p-label">{{topThree[2].mainLabel}}</text>
<view class="p-amount"> <text class="p-amount">{{topThree[2].mainPrefix}}{{topThree[2].mainValue}}</text>
<text class="p-money">{{topThree[2].mainPrefix}}{{topThree[2].mainValue}}</text>
<text class="p-label">{{topThree[2].mainLabel}}</text>
<text class="p-reward" wx:if="{{topThree[2].rewardAmount > 0}}">奖 ¥{{topThree[2].rewardAmount}}</text>
</view>
<view class="p-metrics"> <view class="p-metrics">
<text class="p-metric" wx:for="{{topThree[2].metrics}}" wx:key="label" wx:for-item="m">{{m.label}} {{m.value}}</text> <text class="p-metric" wx:for="{{topThree[2].metrics}}" wx:key="label" wx:for-item="m">{{m.label}} {{m.value}}</text>
</view> </view>
<view class="p-pedestal pedestal-bronze"></view> <text class="p-reward" wx:if="{{topThree[2].rewardAmount > 0}}">奖 ¥{{topThree[2].rewardAmount}}</text>
<view class="pedestal pedestal-3"></view>
</view> </view>
</view> </view>
</view> </view>
<!-- 4-50 名 --> <!-- 4 名以后列表 -->
<view class="list-wrap" wx:if="{{restList.length > 0}}"> <view class="list-panel" wx:if="{{restList.length > 0}}">
<view class="list-title-row"> <view class="list-row" wx:for="{{restList}}" wx:key="mingci">
<text class="list-title">完整榜单</text> <text class="li-rank">{{item.mingci}}</text>
<text class="list-range">第 4 - {{rankList.length}} 名</text> <image class="li-avatar" src="{{item.avatar || defaultAvatar}}" mode="aspectFill" data-zone="rest" data-index="{{index}}" binderror="onAvatarError" />
</view> <text class="li-name">{{item.nicheng}}</text>
<view class="li-right">
<view class="list-card" wx:for="{{restList}}" wx:key="mingci"> <text class="li-amount">{{item.mainPrefix}}{{item.mainValue}}</text>
<image class="list-card-bg" src="{{imgUrls.cardBg}}" mode="aspectFill" /> <text class="li-label">{{item.mainLabel}}</text>
<view class="list-card-body"> <view class="li-tags">
<view class="lc-rank"><text>{{item.mingci}}</text></view> <text class="li-tag" wx:for="{{item.metrics}}" wx:key="label" wx:for-item="m">{{m.label}} {{m.value}}</text>
<image class="lc-avatar" src="{{item.avatar || defaultAvatar}}" mode="aspectFill" data-zone="rest" data-index="{{index}}" binderror="onAvatarError" />
<view class="lc-info">
<text class="lc-name">{{item.nicheng}}</text>
<text class="lc-uid">ID {{item.uid}}<text wx:if="{{item.clubName && fanwei === 'jituan'}}"> · {{item.clubName}}</text></text>
<view class="lc-tags">
<text class="lc-tag" wx:for="{{item.metrics}}" wx:key="label" wx:for-item="m">{{m.label}} {{m.value}}</text>
</view>
</view>
<view class="lc-score">
<text class="lc-money">{{item.mainPrefix}}{{item.mainValue}}</text>
<text class="lc-label">{{item.mainLabel}}</text>
<text class="lc-reward" wx:if="{{item.rewardAmount > 0}}">奖¥{{item.rewardAmount}}</text>
</view> </view>
<text class="li-reward" wx:if="{{item.rewardAmount > 0}}">奖¥{{item.rewardAmount}}</text>
</view> </view>
</view> </view>
</view> </view>
+374 -412
View File
@@ -1,145 +1,147 @@
page { page {
background: #0d1117; background: #ffe566;
color: #fff; color: #333;
font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', sans-serif; font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Helvetica Neue', sans-serif;
} }
/* 主题色 */
/* 选中/金额: #6BA3F7 浅蓝: #8EB8FF 银: #A8B4C4 铜: #C4A882 */
.rank-page { .rank-page {
min-height: 100vh; min-height: 100vh;
position: relative; background: linear-gradient(180deg, #ffe566 0%, #ffe566 420rpx, #fff8dc 520rpx, #ffffff 620rpx);
} }
.page-bg { /* ========== 顶区 ========== */
position: fixed; .header-zone {
top: 0; left: 0;
width: 100%; height: 100%;
z-index: 0;
}
/* ========== 顶栏 ========== */
.top-bar {
position: relative; position: relative;
z-index: 10; z-index: 10;
padding: 16rpx 28rpx 20rpx; padding-bottom: 8rpx;
} }
.top-row { .role-tabs {
display: flex;
align-items: stretch;
background: #ffffff;
margin: 0 0 0;
padding: 0 8rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.role-tab {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 24rpx 0 18rpx;
position: relative;
}
.role-tab-text {
font-size: 28rpx;
color: #666666;
line-height: 1.2;
}
.role-tab.active .role-tab-text {
color: #1a1a1a;
font-weight: 700;
font-size: 30rpx;
}
.role-tab-line {
position: absolute;
bottom: 8rpx;
left: 50%;
transform: translateX(-50%);
width: 48rpx;
height: 6rpx;
border-radius: 6rpx;
background: #3d2914;
}
.date-scroll {
width: 100%;
white-space: nowrap;
padding: 20rpx 0 8rpx;
}
.date-line {
display: inline-flex;
padding: 0 20rpx;
gap: 8rpx;
}
.date-tab {
display: inline-block;
padding: 10rpx 22rpx;
font-size: 26rpx;
color: rgba(0, 0, 0, 0.45);
border-radius: 8rpx;
}
.date-tab.active {
color: #1a1a1a;
font-weight: 700;
position: relative;
}
.date-tab.active::after {
content: '';
position: absolute;
left: 50%;
bottom: 0;
transform: translateX(-50%);
width: 36rpx;
height: 4rpx;
border-radius: 4rpx;
background: #3d2914;
}
.scope-row {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; gap: 12rpx;
margin-bottom: 20rpx; padding: 8rpx 24rpx 12rpx;
} }
.page-title { .scope-tab {
font-size: 38rpx; padding: 8rpx 20rpx;
font-weight: 700; border-radius: 999rpx;
color: #fff; font-size: 22rpx;
color: rgba(0, 0, 0, 0.55);
background: rgba(255, 255, 255, 0.55);
border: 1rpx solid rgba(0, 0, 0, 0.06);
} }
.refresh-wrap { .scope-tab.active {
width: 60rpx; height: 60rpx; color: #1a1a1a;
font-weight: 600;
background: #ffffff;
border-color: rgba(0, 0, 0, 0.12);
}
.refresh-btn {
margin-left: auto;
width: 56rpx;
height: 56rpx;
border-radius: 50%; border-radius: 50%;
background: rgba(255,255,255,0.14); background: rgba(255, 255, 255, 0.7);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.refresh-ico { .refresh-ico {
width: 32rpx; height: 32rpx; width: 28rpx;
opacity: 0.8; height: 28rpx;
} opacity: 0.65;
.role-scroll {
width: 100%;
white-space: nowrap;
margin-bottom: 16rpx;
}
.role-line {
display: inline-flex;
gap: 12rpx;
}
.role-chip {
display: inline-block;
padding: 12rpx 28rpx;
border-radius: 999rpx;
font-size: 26rpx;
color: rgba(255,255,255,0.65);
background: rgba(20, 26, 40, 0.75);
border: 1rpx solid rgba(255,255,255,0.12);
}
.role-chip.on {
color: #fff;
font-weight: 600;
background: rgba(107, 163, 247, 0.45);
border-color: rgba(107, 163, 247, 0.65);
box-shadow: 0 0 20rpx rgba(107, 163, 247, 0.2);
}
.date-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10rpx;
margin-bottom: 12rpx;
}
.date-chip {
text-align: center;
padding: 14rpx 0;
border-radius: 14rpx;
font-size: 24rpx;
color: rgba(255,255,255,0.65);
background: rgba(20, 26, 40, 0.72);
border: 1rpx solid rgba(255,255,255,0.08);
}
.date-chip.on {
color: #A8CCFF;
font-weight: 600;
background: rgba(107, 163, 247, 0.35);
border-color: rgba(107, 163, 247, 0.55);
}
.sort-tip {
display: block;
font-size: 22rpx;
color: rgba(255,255,255,0.45);
margin-top: 8rpx;
}
.scope-row {
display: flex;
gap: 12rpx;
margin-top: 16rpx;
}
.scope-chip {
padding: 10rpx 24rpx;
border-radius: 999rpx;
font-size: 24rpx;
color: rgba(255,255,255,0.65);
background: rgba(20, 26, 40, 0.75);
border: 1rpx solid rgba(255,255,255,0.12);
}
.scope-chip.on {
color: #fff;
background: rgba(255, 193, 7, 0.35);
border-color: rgba(255, 193, 7, 0.5);
} }
.reward-banner { .reward-banner {
margin-top: 16rpx; margin: 0 24rpx 12rpx;
padding: 20rpx 24rpx; padding: 18rpx 22rpx;
border-radius: 16rpx; border-radius: 16rpx;
background: linear-gradient(135deg, rgba(255,193,7,0.2), rgba(107,163,247,0.15)); background: rgba(255, 255, 255, 0.85);
border: 1rpx solid rgba(255,193,7,0.35); border: 1rpx solid rgba(255, 193, 7, 0.35);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
@@ -148,237 +150,285 @@ page {
.reward-banner-main { .reward-banner-main {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 6rpx; gap: 4rpx;
} }
.reward-tag { font-size: 28rpx; font-weight: 600; color: #ffd666; } .reward-tag { font-size: 26rpx; font-weight: 600; color: #d48806; }
.reward-club { font-size: 22rpx; color: rgba(255,255,255,0.7); } .reward-club { font-size: 22rpx; color: #666; }
.reward-status { font-size: 22rpx; color: rgba(255,255,255,0.55); } .reward-status { font-size: 22rpx; color: #999; }
.reward-status.pending { color: #52c41a; font-weight: 600; } .reward-status.pending { color: #52c41a; font-weight: 600; }
.reward-status.claimed { color: #8c8c8c; } .reward-status.claimed { color: #8c8c8c; }
.reward-link { font-size: 24rpx; color: #8EB8FF; } .reward-link { font-size: 24rpx; color: #d48806; }
.p-reward {
display: block;
margin-top: 6rpx;
font-size: 22rpx;
color: #ffd666;
font-weight: 600;
}
.lc-reward {
display: block;
margin-top: 4rpx;
font-size: 22rpx;
color: #ffd666;
}
.claim-bar {
position: fixed;
left: 0; right: 0; bottom: 0;
z-index: 100;
padding: 20rpx 28rpx calc(20rpx + env(safe-area-inset-bottom));
background: linear-gradient(180deg, rgba(13,17,23,0.2), rgba(13,17,23,0.95));
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1rpx solid rgba(255,193,7,0.3);
}
.claim-text { display: flex; flex-direction: column; }
.claim-title { font-size: 26rpx; color: #fff; }
.claim-amount { font-size: 36rpx; font-weight: 700; color: #ffd666; }
.claim-btn {
margin: 0;
padding: 0 40rpx;
height: 72rpx;
line-height: 72rpx;
font-size: 28rpx;
background: linear-gradient(135deg, #ffc107, #ff9800);
color: #1a1a1a;
border-radius: 999rpx;
border: none;
}
.bottom-gap {
height: 160rpx;
}
/* ========== 状态 ========== */ /* ========== 状态 ========== */
.state-wrap { .state-wrap {
position: relative;
z-index: 5;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
padding: 140rpx 0; padding: 120rpx 0;
color: rgba(255,255,255,0.45); color: rgba(0, 0, 0, 0.45);
font-size: 28rpx; font-size: 28rpx;
} }
.loader { .loader {
width: 48rpx; height: 48rpx; width: 48rpx;
border: 3rpx solid rgba(255,255,255,0.12); height: 48rpx;
border-top-color: #6BA3F7; border: 3rpx solid rgba(0, 0, 0, 0.08);
border-top-color: #ffb800;
border-radius: 50%; border-radius: 50%;
animation: spin 0.7s linear infinite; animation: spin 0.7s linear infinite;
margin-bottom: 20rpx; margin-bottom: 20rpx;
} }
@keyframes spin {
to { transform: rotate(360deg); }
}
.state-img { .state-img {
width: 160rpx; height: 160rpx; width: 160rpx;
height: 160rpx;
margin-bottom: 20rpx; margin-bottom: 20rpx;
opacity: 0.65; opacity: 0.5;
} }
/* ========== 滚动 ========== */ /* ========== 滚动区 ========== */
.body-scroll { .body-scroll {
position: relative; height: calc(100vh - 280rpx);
z-index: 5;
height: calc(100vh - 300rpx);
} }
/* ========== 领奖台(纯 CSS) ========== */ /* ========== 领奖台 ========== */
.podium-panel { .podium-zone {
margin: 8rpx 24rpx 24rpx; padding: 16rpx 16rpx 0;
padding: 28rpx 12rpx 0;
border-radius: 28rpx;
background: rgba(14, 18, 30, 0.88);
border: 1rpx solid rgba(255, 255, 255, 0.1);
} }
.podium-cols { .podium-row {
display: flex; display: flex;
align-items: flex-end; align-items: flex-end;
justify-content: center; justify-content: center;
gap: 10rpx; gap: 6rpx;
} }
.p-col { .podium-col {
flex: 1; flex: 1;
max-width: 220rpx; max-width: 230rpx;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
position: relative;
} }
.p-first { .col-1 {
max-width: 250rpx; max-width: 260rpx;
margin-bottom: 16rpx; margin-bottom: 10rpx;
} }
.p-badge { .crown {
width: 44rpx; height: 44rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 14rpx;
font-size: 24rpx;
font-weight: 800;
}
.p-first .p-badge {
width: 52rpx; height: 52rpx;
font-size: 28rpx; font-size: 28rpx;
line-height: 1;
margin-bottom: 6rpx;
filter: drop-shadow(0 2rpx 4rpx rgba(0, 0, 0, 0.15));
} }
.badge-first { .col-1 .crown {
color: #fff; font-size: 34rpx;
background: linear-gradient(145deg, #6BA3F7, #4A7FD4);
box-shadow: 0 4rpx 16rpx rgba(107, 163, 247, 0.4);
} }
.badge-silver { .avatar-ring {
color: #fff;
background: linear-gradient(145deg, #A8B4C4, #7A8899);
box-shadow: 0 4rpx 12rpx rgba(168, 180, 196, 0.25);
}
.badge-bronze {
color: #fff;
background: linear-gradient(145deg, #C4A882, #9A7858);
box-shadow: 0 4rpx 12rpx rgba(196, 168, 130, 0.25);
}
.p-avatar-wrap {
border-radius: 50%; border-radius: 50%;
padding: 4rpx; padding: 6rpx;
margin-bottom: 12rpx; margin-bottom: 10rpx;
background: #ffffff;
} }
.wrap-first { .ring-gold {
padding: 5rpx; padding: 8rpx;
background: linear-gradient(145deg, #8EB8FF, #5B8FD8); box-shadow: 0 0 0 4rpx #ffd700, 0 8rpx 20rpx rgba(255, 183, 0, 0.35);
box-shadow: 0 6rpx 24rpx rgba(107, 163, 247, 0.3);
} }
.wrap-silver { .ring-silver {
background: linear-gradient(145deg, #C8D0DA, #909AA8); box-shadow: 0 0 0 4rpx #b8c4d4, 0 6rpx 16rpx rgba(120, 140, 180, 0.25);
} }
.wrap-bronze { .ring-bronze {
background: linear-gradient(145deg, #D4B896, #A88860); box-shadow: 0 0 0 4rpx #cd9a5a, 0 6rpx 16rpx rgba(205, 127, 50, 0.25);
} }
.p-avatar { .p-avatar {
width: 100rpx; height: 100rpx; width: 96rpx;
height: 96rpx;
border-radius: 50%; border-radius: 50%;
display: block; display: block;
background: #1a2030; background: #f0f0f0;
} }
.p-avatar-lg { .p-avatar-lg {
width: 120rpx; height: 120rpx; width: 116rpx;
height: 116rpx;
} }
.p-name { .p-name {
font-size: 26rpx; font-size: 26rpx;
font-weight: 600; font-weight: 600;
color: rgba(255,255,255,0.92); color: #1a1a1a;
max-width: 100%; max-width: 100%;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
text-align: center; text-align: center;
margin-bottom: 8rpx;
} }
.p-name-first { .p-name-lg {
font-size: 28rpx; font-size: 28rpx;
color: #fff;
}
.p-uid {
margin-top: 4rpx;
font-size: 20rpx;
color: rgba(255,255,255,0.35);
}
.p-amount {
margin: 12rpx 0 10rpx;
text-align: center;
}
.p-money {
display: block;
font-size: 30rpx;
font-weight: 700;
color: #8EB8FF;
letter-spacing: -0.5rpx;
}
.p-money-first {
font-size: 34rpx;
color: #A8CCFF;
} }
.p-label { .p-label {
display: block; font-size: 22rpx;
color: #999999;
line-height: 1.2;
}
.p-amount {
font-size: 34rpx;
font-weight: 800;
color: #ffb800;
line-height: 1.3;
margin-top: 2rpx; margin-top: 2rpx;
}
.p-amount-lg {
font-size: 40rpx;
}
.p-sub-label {
font-size: 22rpx;
color: #999999;
margin-top: 6rpx;
}
.p-sub-value {
font-size: 28rpx;
font-weight: 700;
color: #ffb800;
line-height: 1.2;
}
.p-sub-value-lg {
font-size: 32rpx;
}
.p-reward {
margin-top: 4rpx;
font-size: 20rpx; font-size: 20rpx;
color: rgba(255,255,255,0.35); color: #d48806;
font-weight: 600;
}
.pedestal {
width: 92%;
margin-top: 14rpx;
border-radius: 16rpx 16rpx 0 0;
background: linear-gradient(180deg, #ffe08a 0%, #ffd04d 100%);
box-shadow: inset 0 2rpx 0 rgba(255, 255, 255, 0.5);
}
.pedestal-1 {
height: 88rpx;
background: linear-gradient(180deg, #ffe08a 0%, #ffc933 100%);
}
.pedestal-2 {
height: 64rpx;
background: linear-gradient(180deg, #ffe08a 0%, #ffd04d 100%);
}
.pedestal-3 {
height: 48rpx;
background: linear-gradient(180deg, #ffe08a 0%, #ffd04d 100%);
}
/* ========== 列表区(白底) ========== */
.list-panel {
margin-top: 8rpx;
background: #ffffff;
border-radius: 32rpx 32rpx 0 0;
padding: 24rpx 28rpx 0;
min-height: 400rpx;
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.04);
}
.list-row {
display: flex;
align-items: center;
padding: 24rpx 0;
border-bottom: 1rpx solid #f3f3f3;
}
.list-row:last-child {
border-bottom: none;
}
.li-rank {
width: 44rpx;
flex-shrink: 0;
font-size: 32rpx;
font-weight: 700;
color: #333333;
text-align: center;
}
.li-avatar {
width: 72rpx;
height: 72rpx;
border-radius: 50%;
flex-shrink: 0;
margin: 0 16rpx 0 8rpx;
background: #f0f0f0;
}
.li-name {
flex: 1;
min-width: 0;
font-size: 28rpx;
font-weight: 500;
color: #1a1a1a;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.li-right {
flex-shrink: 0;
text-align: right;
margin-left: 12rpx;
}
.li-amount {
display: block;
font-size: 30rpx;
font-weight: 700;
color: #1a1a1a;
line-height: 1.3;
}
.li-orders {
display: block;
margin-top: 4rpx;
font-size: 24rpx;
color: #999999;
}
.li-reward {
display: block;
margin-top: 4rpx;
font-size: 20rpx;
color: #d48806;
}
.sort-tip {
display: block;
padding: 0 24rpx 8rpx;
font-size: 22rpx;
color: rgba(0, 0, 0, 0.45);
} }
.p-metrics { .p-metrics {
@@ -386,174 +436,86 @@ page {
flex-wrap: wrap; flex-wrap: wrap;
gap: 6rpx; gap: 6rpx;
justify-content: center; justify-content: center;
margin-bottom: 16rpx; margin: 8rpx 0 10rpx;
min-height: 36rpx; max-width: 100%;
} }
.p-metric { .p-metric {
font-size: 18rpx; font-size: 20rpx;
color: rgba(255,255,255,0.55); color: #888;
background: rgba(255,255,255,0.1); background: rgba(255, 255, 255, 0.65);
padding: 4rpx 10rpx; padding: 4rpx 10rpx;
border-radius: 8rpx; border-radius: 8rpx;
} }
/* 底座 · 圆角柱体,非方块 */ .li-label {
.p-pedestal {
width: 88%;
border-radius: 20rpx 20rpx 0 0;
position: relative;
}
.p-pedestal::before {
content: '';
position: absolute;
top: 0; left: 10%; right: 10%;
height: 2rpx;
background: rgba(255,255,255,0.15);
border-radius: 2rpx;
}
.pedestal-first {
height: 100rpx;
background: linear-gradient(180deg, rgba(107,163,247,0.55) 0%, rgba(107,163,247,0.22) 100%);
border: 1rpx solid rgba(107,163,247,0.35);
border-bottom: none;
}
.pedestal-silver {
height: 72rpx;
background: linear-gradient(180deg, rgba(168,180,196,0.45) 0%, rgba(168,180,196,0.18) 100%);
border: 1rpx solid rgba(168,180,196,0.28);
border-bottom: none;
}
.pedestal-bronze {
height: 56rpx;
background: linear-gradient(180deg, rgba(196,168,130,0.45) 0%, rgba(196,168,130,0.18) 100%);
border: 1rpx solid rgba(196,168,130,0.28);
border-bottom: none;
}
/* ========== 列表 ========== */
.list-wrap {
padding: 0 24rpx;
}
.list-title-row {
display: flex;
align-items: baseline;
justify-content: space-between;
padding: 8rpx 8rpx 20rpx;
}
.list-title {
font-size: 30rpx;
font-weight: 700;
color: rgba(255,255,255,0.85);
}
.list-range {
font-size: 22rpx;
color: rgba(255,255,255,0.3);
}
.list-card {
position: relative;
margin-bottom: 14rpx;
border-radius: 18rpx;
overflow: hidden;
border: 1rpx solid rgba(255,255,255,0.05);
}
.list-card-bg {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
z-index: 0;
}
.list-card-body {
position: relative;
z-index: 1;
display: flex;
align-items: center;
padding: 20rpx 22rpx;
background: rgba(12, 16, 28, 0.92);
backdrop-filter: blur(8px);
}
.lc-rank {
width: 48rpx;
flex-shrink: 0;
text-align: center;
}
.lc-rank text {
font-size: 32rpx;
font-weight: 700;
color: rgba(255,255,255,0.18);
}
.lc-avatar {
width: 80rpx; height: 80rpx;
border-radius: 50%;
flex-shrink: 0;
margin: 0 16rpx 0 6rpx;
border: 2rpx solid rgba(107, 163, 247, 0.2);
background: #1a2030;
}
.lc-info { flex: 1; min-width: 0; }
.lc-name {
display: block; display: block;
font-size: 28rpx; margin-top: 2rpx;
font-weight: 600;
color: rgba(255,255,255,0.92);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.lc-uid {
display: block;
margin-top: 4rpx;
font-size: 22rpx; font-size: 22rpx;
color: rgba(255,255,255,0.32); color: #999;
} }
.lc-tags { .li-tags {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 8rpx; gap: 6rpx;
margin-top: 8rpx; justify-content: flex-end;
margin-top: 6rpx;
max-width: 280rpx;
} }
.lc-tag { .li-tag {
font-size: 20rpx; font-size: 20rpx;
color: rgba(255,255,255,0.5); color: #888;
background: rgba(255,255,255,0.1); background: #f5f5f5;
padding: 2rpx 10rpx; padding: 2rpx 8rpx;
border-radius: 6rpx; border-radius: 6rpx;
} }
.lc-score { .bottom-gap {
flex-shrink: 0; height: 160rpx;
text-align: right;
margin-left: 10rpx;
} }
.lc-money { /* ========== 领取栏 ========== */
display: block; .claim-bar {
font-size: 28rpx; position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 100;
padding: 20rpx 28rpx calc(20rpx + env(safe-area-inset-bottom));
background: #ffffff;
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1rpx solid #f0f0f0;
box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.06);
}
.claim-text {
display: flex;
flex-direction: column;
}
.claim-title {
font-size: 26rpx;
color: #333;
}
.claim-amount {
font-size: 36rpx;
font-weight: 700; font-weight: 700;
color: #8EB8FF; color: #ffb800;
} }
.lc-label { .claim-btn {
display: block; margin: 0;
margin-top: 2rpx; padding: 0 40rpx;
font-size: 20rpx; height: 72rpx;
color: rgba(255,255,255,0.32); line-height: 72rpx;
font-size: 28rpx;
background: linear-gradient(135deg, #ffc107, #ffb300);
color: #1a1a1a;
border-radius: 999rpx;
border: none;
} }
+368
View File
@@ -0,0 +1,368 @@
// pages/fighter-recharge/fighter-deposit.js — 平台履约金/保证金独立页
import request from '../../utils/request';
import PopupService from '../../services/popupService.js';
import { ensurePhoneAuth } from '../../utils/phone-auth.js';
import { ICON_KEYS, resolveConfiguredIcon, resolveMiniappIcon, ICON_FOLDER, refreshPindaoConfig } from '../../utils/miniapp-icons.js';
import { resolveAvatarFromStorage, onAvatarImageError } from '../../utils/avatar.js';
const app = getApp();
const DEFAULT_RULES = [
'履约金有效期为永久有效',
'超过15天未接单,可联系客服申请退还',
'缴纳后可优先接锁单/平台单等待遇',
];
const DEFAULT_BENEFITS = [
{ label: '平台订单优先', key: ICON_KEYS.FIGHTER_DEPOSIT_BENEFIT_1 },
{ label: '快人一步', key: ICON_KEYS.FIGHTER_DEPOSIT_BENEFIT_2 },
{ label: '优质接单', key: ICON_KEYS.FIGHTER_DEPOSIT_BENEFIT_3 },
{ label: '解锁平台单', key: ICON_KEYS.FIGHTER_DEPOSIT_BENEFIT_4 },
];
Page({
data: {
imgUrls: { pageBg: '', hero: '' },
avatarUrl: '',
nickname: '',
uid: '',
yajin: 0,
yajinDisplay: '0.00',
yajinActive: false,
depositRules: DEFAULT_RULES,
depositBenefits: DEFAULT_BENEFITS,
agreed: false,
payAmountLabel: '',
yajinAmount: '100',
quickAmounts: ['100', '500', '1000', '5000'],
showAmountModal: false,
showPayMethodModal: false,
showBalanceModal: false,
showConfirmModal: false,
balanceOptions: [],
selectedBalanceId: null,
selectedBalanceInfo: null,
currentYajinAmount: null,
currentDingdanid: '',
payLoading: false,
loadingText: '处理中...',
},
onLoad(options) {
this._jumpParams = options || {};
this.initImages();
this.loadUserInfo();
},
onHide() {
this.selectComponent('#popupNotice')?.cleanup?.();
},
async onShow() {
const phoneOk = await ensurePhoneAuth({ redirect: true, role: 'dashou' });
if (!phoneOk) return;
this.registerNotification();
this.loadYajin();
this.refreshConfiguredIcons();
PopupService.checkAndShow(this, 'dashouchongzhi');
const preset = this._jumpParams?.presetAmount || this._jumpParams?.requiredYajin;
if (preset && parseFloat(preset) > 0) {
this.setData({ yajinAmount: String(parseInt(preset, 10)) });
}
},
registerNotification() {
const comp = this.selectComponent('#global-notification');
if (comp?.showNotification) {
app.globalData.globalNotification = {
show: (data) => comp.showNotification(data),
hide: () => comp.hideNotification(),
};
}
},
initImages() {
const fb = (key) => `${ICON_FOLDER}/${key}.png`;
const depositBenefits = DEFAULT_BENEFITS.map((item) => ({
label: item.label,
iconUrl: resolveMiniappIcon(app, item.key, fb(item.key)),
}));
this.setData({
imgUrls: {
pageBg: resolveConfiguredIcon(app, ICON_KEYS.FIGHTER_DEPOSIT_BG),
hero: resolveConfiguredIcon(app, ICON_KEYS.FIGHTER_DEPOSIT_HERO),
},
depositBenefits,
});
},
async refreshConfiguredIcons() {
try {
await refreshPindaoConfig(app);
} catch (e) {
console.warn('refreshConfiguredIcons failed', e);
}
this.initImages();
this.loadUserInfo();
},
loadUserInfo() {
const gd = app.globalData || {};
this.setData({
avatarUrl: resolveAvatarFromStorage(app),
nickname: gd.dashouNicheng || gd.nicheng || '打手',
uid: wx.getStorageSync('uid') || gd.uid || '',
});
},
onAvatarError() {
onAvatarImageError(this, 'avatarUrl', app);
},
loadYajin() {
const yajin = parseFloat(app.globalData.yajin || 0) || 0;
this.setData({
yajin,
yajinDisplay: yajin.toFixed(2),
yajinActive: yajin > 0,
});
},
toggleAgree() {
this.setData({ agreed: !this.data.agreed });
},
onTapPay() {
if (!this.data.agreed) {
wx.showToast({ title: '请先阅读并同意缴纳规则', icon: 'none' });
return;
}
this.setData({ showAmountModal: true });
},
hideAmountModal() {
this.setData({ showAmountModal: false });
},
onYajinInput(e) {
let v = (e.detail.value || '').replace(/[^\d]/g, '');
if (v) {
const n = parseInt(v, 10);
if (n > 10000) v = '10000';
if (n < 1) v = '1';
}
this.setData({ yajinAmount: v });
},
setQuickAmount(e) {
this.setData({ yajinAmount: e.currentTarget.dataset.amount });
},
onConfirmAmount() {
const amount = this.data.yajinAmount;
if (!amount || amount < 1 || amount > 10000) {
wx.showToast({ title: '请输入1-10000元', icon: 'none' });
return;
}
this.hideAmountModal();
this.setData({
currentYajinAmount: amount,
payAmountLabel: `(¥ ${amount})`,
showPayMethodModal: true,
});
},
hidePayMethodModal() {
this.setData({ showPayMethodModal: false });
},
onPayMethodSelect(e) {
const method = e.currentTarget.dataset.method;
this.hidePayMethodModal();
if (method === 'wx') {
this.setData({ yajinAmount: this.data.currentYajinAmount }, () => this.handleYajinPay());
} else {
this.fetchBalanceOptions();
}
},
async fetchBalanceOptions() {
this.showLoading('获取抵扣信息...');
try {
const res = await request({
url: '/shangpin/czhqdy',
method: 'POST',
data: {
leixing: 2,
yajin_jine: parseInt(this.data.currentYajinAmount, 10),
},
});
if (res.data.code === 200) {
this.setData({ balanceOptions: res.data.data || [], showBalanceModal: true });
} else {
wx.showToast({ title: res.data.message || '获取失败', icon: 'none' });
}
} catch (err) {
wx.showToast({ title: '网络错误', icon: 'none' });
} finally {
this.hideLoading();
}
},
hideBalanceModal() {
this.setData({ showBalanceModal: false });
},
onBalanceSelect(e) {
const id = e.currentTarget.dataset.id;
const selected = this.data.balanceOptions.find((o) => o.id === id);
if (!selected) return;
this.setData({
selectedBalanceId: id,
selectedBalanceInfo: selected,
showConfirmModal: true,
showBalanceModal: false,
});
},
hideConfirmModal() {
this.setData({ showConfirmModal: false });
},
async confirmBalancePay() {
const { selectedBalanceId, currentYajinAmount } = this.data;
if (!selectedBalanceId) return;
this.hideConfirmModal();
this.showLoading('抵扣支付中...');
try {
const res = await request({
url: '/shangpin/dsqrgmdh',
method: 'POST',
data: {
leixing: 2,
shenfen_id: selectedBalanceId,
yajin_jine: parseInt(currentYajinAmount, 10),
},
});
if (res.data.code === 200) {
const data = res.data.data || {};
if (data.yajin !== undefined) app.globalData.yajin = data.yajin;
this.loadYajin();
wx.showToast({ title: '缴纳成功', icon: 'success' });
} else {
wx.showToast({ title: res.data.message || '购买失败', icon: 'none' });
}
} catch (err) {
wx.showToast({ title: '网络错误', icon: 'none' });
} finally {
this.hideLoading();
}
},
confirmWechatPurchase() {
return new Promise((resolve) => {
wx.showModal({
title: '确认微信支付',
content: '您即将通过微信支付缴纳履约金。购买成功后不可随意退款,请确认无误后再继续。',
confirmText: '确认购买',
cancelText: '再想想',
success: (res) => resolve(!!res.confirm),
fail: () => resolve(false),
});
});
},
async handleYajinPay() {
const amount = this.data.yajinAmount;
if (!amount || amount < 1 || amount > 10000) {
wx.showToast({ title: '请输入1-10000元', icon: 'none' });
return;
}
if (!(await this.confirmWechatPurchase())) return;
this.showLoading('发起支付中...');
try {
const res = await request({
url: '/shangpin/yajingoumai',
method: 'POST',
data: { jine: parseInt(amount, 10) },
});
if (res.data.code === 200) {
this.setData({ currentDingdanid: res.data.dingdanid });
await this.wechatPay(res.data.payParams);
} else {
wx.showToast({ title: res.data.message || '支付发起失败', icon: 'none' });
}
} catch (err) {
wx.showToast({ title: '支付失败', icon: 'none' });
} finally {
this.hideLoading();
}
},
wechatPay(payParams) {
return new Promise((resolve, reject) => {
wx.requestPayment({
timeStamp: payParams.timeStamp,
nonceStr: payParams.nonceStr,
package: payParams.package,
signType: payParams.signType || 'MD5',
paySign: payParams.paySign,
success: async () => {
wx.showToast({ title: '支付成功!确认中...', icon: 'none' });
try {
await this.startPolling();
resolve();
} catch (e) {
reject(e);
}
},
fail: async (res) => {
wx.showToast({ title: res.errMsg?.includes('cancel') ? '已取消支付' : '支付失败', icon: 'none' });
try {
await request({
url: '/shangpin/yajinshibai',
method: 'POST',
data: { dingdanid: this.data.currentDingdanid },
});
} catch (e) { /* ignore */ }
reject(new Error(res.errMsg));
},
});
});
},
async startPolling() {
const dingdanid = this.data.currentDingdanid;
if (!dingdanid) return;
this.showLoading('确认支付结果...');
for (let i = 0; i < 10; i++) {
try {
const res = await request({
url: '/shangpin/yajinlunxun',
method: 'POST',
data: { dingdanid },
});
if (res.data.code === 200) {
if (res.data.yajin !== undefined) app.globalData.yajin = res.data.yajin;
this.loadYajin();
this.hideLoading();
wx.showToast({ title: '履约金缴纳成功', icon: 'success' });
return;
}
} catch (e) { /* retry */ }
await new Promise((r) => setTimeout(r, 2000));
}
this.hideLoading();
wx.showToast({ title: '确认超时,请稍后查看余额', icon: 'none' });
},
showLoading(text) {
this.setData({ payLoading: true, loadingText: text || '处理中...' });
},
hideLoading() {
this.setData({ payLoading: false });
},
stopPropagation() {},
});
@@ -0,0 +1,10 @@
{
"usingComponents": {
"global-notification": "/components/global-notification/global-notification",
"popup-notice": "/components/popup-notice/popup-notice"
},
"navigationBarTitleText": "平台履约金",
"navigationBarBackgroundColor": "#FFF9F0",
"navigationBarTextStyle": "black",
"backgroundColor": "#FFF9F0"
}
+133
View File
@@ -0,0 +1,133 @@
<!-- 平台履约金 / 保证金充值页 -->
<view class="deposit-page">
<image wx:if="{{imgUrls.pageBg}}" class="page-bg" src="{{imgUrls.pageBg}}" mode="widthFix" />
<view class="page-bg-fallback" wx:else></view>
<view class="page-body">
<view class="user-row">
<image class="user-avatar" src="{{avatarUrl}}" mode="aspectFill" binderror="onAvatarError" />
<view class="user-info">
<text class="user-name">{{nickname || '打手'}}</text>
<text class="user-id">会员ID: {{uid || '--'}}</text>
</view>
</view>
<view class="deposit-card">
<view class="deposit-card-left">
<text class="deposit-card-title">平台接单履约金</text>
<view class="deposit-price-row">
<text class="deposit-currency">¥</text>
<text class="deposit-price">{{yajinDisplay}}</text>
</view>
<text class="deposit-validity">有效期:永久有效</text>
</view>
<view class="deposit-card-right">
<view class="icon-clip icon-clip-deposit" wx:if="{{imgUrls.hero}}">
<image class="icon-clip-img" src="{{imgUrls.hero}}" mode="aspectFill" />
</view>
<view class="deposit-status">{{yajinActive ? '已缴纳' : '未激活'}}</view>
</view>
<view class="deposit-shimmer"></view>
</view>
<view class="section-card">
<text class="section-title">履约金规则</text>
<view class="rule-list">
<view wx:for="{{depositRules}}" wx:key="index" class="rule-item">
<text class="rule-num">{{index + 1}}.</text>
<text class="rule-text">{{item}}</text>
</view>
</view>
</view>
<view class="section-card">
<text class="section-title">平台履约金权益</text>
<view class="benefit-grid">
<view wx:for="{{depositBenefits}}" wx:key="label" class="benefit-item">
<view wx:if="{{item.iconUrl}}" class="icon-clip icon-clip-deposit-benefit">
<image class="icon-clip-img" src="{{item.iconUrl}}" mode="aspectFill" />
</view>
<text>{{item.label}}</text>
</view>
</view>
</view>
</view>
<view class="footer-bar">
<view class="agree-row" bindtap="toggleAgree">
<view class="agree-check {{agreed ? 'agree-check--on' : ''}}">{{agreed ? '✓' : ''}}</view>
<text class="agree-text">已阅读并同意</text>
<text class="agree-link">《平台履约金缴纳规则》</text>
</view>
<view class="pay-btn {{agreed ? '' : 'pay-btn--disabled'}}" bindtap="onTapPay">
<text>缴纳履约金{{payAmountLabel}}</text>
<view class="pay-btn-shimmer"></view>
</view>
</view>
</view>
<!-- 金额输入弹窗 -->
<view class="modal-mask" wx:if="{{showAmountModal}}" bindtap="hideAmountModal">
<view class="modal-panel" catchtap="stopPropagation">
<text class="modal-title">缴纳履约金</text>
<text class="modal-sub">支持 1-10000 元整数</text>
<view class="amount-input-wrap">
<text class="amount-prefix">¥</text>
<input class="amount-input" type="digit" value="{{yajinAmount}}" bindinput="onYajinInput" focus="{{showAmountModal}}" />
</view>
<view class="quick-row">
<view wx:for="{{quickAmounts}}" wx:key="*this" class="quick-chip {{yajinAmount == item ? 'active' : ''}}" bindtap="setQuickAmount" data-amount="{{item}}">{{item}}元</view>
</view>
<view class="modal-actions">
<view class="modal-btn cancel" bindtap="hideAmountModal">取消</view>
<view class="modal-btn confirm" bindtap="onConfirmAmount">下一步</view>
</view>
</view>
</view>
<!-- 支付方式 -->
<view class="modal-mask" wx:if="{{showPayMethodModal}}" bindtap="hidePayMethodModal">
<view class="modal-panel" catchtap="stopPropagation">
<text class="modal-title">选择支付方式</text>
<view class="pay-method-item" bindtap="onPayMethodSelect" data-method="wx">
<text class="pay-method-name">微信支付</text>
<text class="pay-method-desc">安全快捷</text>
</view>
<view class="pay-method-item" bindtap="onPayMethodSelect" data-method="balance">
<text class="pay-method-name">余额抵扣</text>
<text class="pay-method-desc">使用佣金或分红</text>
</view>
</view>
</view>
<view class="modal-mask" wx:if="{{showBalanceModal}}" bindtap="hideBalanceModal">
<view class="modal-panel" catchtap="stopPropagation">
<text class="modal-title">选择抵扣身份</text>
<view wx:for="{{balanceOptions}}" wx:key="id" class="balance-item" bindtap="onBalanceSelect" data-id="{{item.id}}">
<text>{{item.jieshao}}</text>
<text class="balance-need">需¥{{item.xuyao}}</text>
</view>
</view>
</view>
<view class="modal-mask" wx:if="{{showConfirmModal}}" bindtap="hideConfirmModal">
<view class="modal-panel" catchtap="stopPropagation">
<text class="modal-title">确认抵扣</text>
<view class="confirm-row"><text>身份</text><text>{{selectedBalanceInfo.jieshao}}</text></view>
<view class="confirm-row"><text>金额</text><text>¥{{selectedBalanceInfo.xuyao}}</text></view>
<view class="modal-actions">
<view class="modal-btn cancel" bindtap="hideConfirmModal">取消</view>
<view class="modal-btn confirm" bindtap="confirmBalancePay">确认支付</view>
</view>
</view>
</view>
<view class="loading-mask" wx:if="{{payLoading}}">
<view class="loading-box">
<view class="loading-spinner"></view>
<text>{{loadingText}}</text>
</view>
</view>
<global-notification id="global-notification" />
<popup-notice id="popupNotice" />
+279
View File
@@ -0,0 +1,279 @@
@import '../../styles/xym-recharge-shared.wxss';
.deposit-page {
min-height: 100vh;
background: #fff9f0;
padding-bottom: calc(220rpx + env(safe-area-inset-bottom));
position: relative;
}
.page-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
z-index: 0;
}
.page-bg-fallback {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 360rpx;
background: linear-gradient(180deg, #ffe082 0%, #fff9f0 100%);
z-index: 0;
}
.page-body {
position: relative;
z-index: 1;
padding: 24rpx 30rpx 0;
}
.user-row {
display: flex;
align-items: center;
margin-bottom: 24rpx;
}
.user-avatar {
width: 88rpx;
height: 88rpx;
border-radius: 50%;
margin-right: 20rpx;
background: #eee;
}
.user-name {
display: block;
font-size: 32rpx;
font-weight: 700;
color: #222;
}
.user-id {
display: block;
margin-top: 6rpx;
font-size: 24rpx;
color: #999;
}
.deposit-card {
position: relative;
overflow: hidden;
border-radius: 24rpx;
padding: 32rpx 28rpx;
background: linear-gradient(135deg, #fff8e1 0%, #ffe0b2 100%);
display: flex;
justify-content: space-between;
align-items: stretch;
margin-bottom: 24rpx;
box-shadow: 0 8rpx 24rpx rgba(255, 183, 77, 0.25);
}
.deposit-card-left {
flex: 1;
min-width: 0;
}
.deposit-card-title {
font-size: 30rpx;
font-weight: 700;
color: #492f00;
}
.deposit-price-row {
display: flex;
align-items: baseline;
margin: 16rpx 0 8rpx;
}
.deposit-currency {
font-size: 36rpx;
font-weight: 700;
color: #222;
margin-right: 4rpx;
}
.deposit-price {
font-size: 64rpx;
font-weight: 800;
color: #222;
line-height: 1;
}
.deposit-validity {
font-size: 24rpx;
color: #947641;
}
.deposit-card-right {
position: relative;
width: 200rpx;
display: flex;
align-items: center;
justify-content: center;
}
.icon-clip {
overflow: hidden;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.5);
}
.icon-clip-img {
width: 100%;
height: 100%;
display: block;
}
.icon-clip-deposit {
width: 180rpx;
height: 180rpx;
border-radius: 40rpx;
}
.icon-clip-deposit-benefit {
width: 36rpx;
height: 36rpx;
border-radius: 14rpx;
}
.deposit-status {
position: absolute;
right: 0;
bottom: 0;
padding: 6rpx 16rpx;
border-radius: 8rpx;
background: rgba(0, 0, 0, 0.08);
font-size: 22rpx;
color: #666;
}
.deposit-shimmer {
position: absolute;
inset: 0;
background: linear-gradient(105deg, transparent 40%, rgba(255, 255, 255, 0.45) 50%, transparent 60%);
animation: card-shimmer 3s infinite;
pointer-events: none;
}
.section-card {
background: #fff;
border-radius: 20rpx;
padding: 28rpx;
margin-bottom: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
}
.section-title {
display: block;
text-align: center;
font-size: 30rpx;
font-weight: 700;
color: #333;
margin-bottom: 20rpx;
}
.rule-item {
display: flex;
gap: 8rpx;
margin-bottom: 12rpx;
font-size: 26rpx;
color: #666;
line-height: 1.6;
}
.benefit-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20rpx 16rpx;
}
.benefit-item {
display: flex;
align-items: center;
gap: 10rpx;
font-size: 26rpx;
color: #555;
}
.footer-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
padding: 20rpx 30rpx calc(20rpx + env(safe-area-inset-bottom));
background: rgba(255, 249, 240, 0.96);
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.06);
z-index: 10;
}
.agree-row {
display: flex;
align-items: center;
flex-wrap: wrap;
margin-bottom: 16rpx;
font-size: 24rpx;
color: #666;
}
.agree-check {
width: 32rpx;
height: 32rpx;
border-radius: 50%;
border: 2rpx solid #ccc;
margin-right: 10rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 20rpx;
color: #fff;
}
.agree-check--on {
background: #f5a623;
border-color: #f5a623;
}
.agree-link {
color: #e6a23c;
}
.pay-btn {
position: relative;
overflow: hidden;
height: 96rpx;
border-radius: 48rpx;
background: linear-gradient(90deg, #fae04d, #ffc0a3);
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
font-weight: 700;
color: #492f00;
box-shadow: 0 8rpx 20rpx rgba(245, 166, 35, 0.35);
}
.pay-btn--disabled {
opacity: 0.55;
}
.pay-btn-shimmer {
position: absolute;
inset: 0;
background: linear-gradient(105deg, transparent 40%, rgba(255, 255, 255, 0.5) 50%, transparent 60%);
animation: btn-shimmer 2.5s infinite;
pointer-events: none;
}
@keyframes card-shimmer {
0% { transform: translateX(-120%); }
100% { transform: translateX(120%); }
}
@keyframes btn-shimmer {
0% { transform: translateX(-120%); }
100% { transform: translateX(120%); }
}
+204 -269
View File
@@ -1,72 +1,57 @@
// pages/dashou-chongzhi/index.js // pages/fighter-recharge/fighter-recharge.js
import request from '../../utils/request'; import request from '../../utils/request';
import PopupService from '../../services/popupService.js'; import PopupService from '../../services/popupService.js';
import { ensurePhoneAuth } from '../../utils/phone-auth.js'; import { ensurePhoneAuth } from '../../utils/phone-auth.js';
import { ICON_KEYS, resolveConfiguredIcon, resolveMiniappIcon, ICON_FOLDER, refreshPindaoConfig } from '../../utils/miniapp-icons.js';
import { resolveAvatarFromStorage, onAvatarImageError } from '../../utils/avatar.js';
const app = getApp();
const PLATFORM_ADVANTAGE_META = [
{ key: ICON_KEYS.FIGHTER_RECHARGE_ADVANTAGE_1, title: '订单丰富', desc: '平台单、商家单多种类型' },
{ key: ICON_KEYS.FIGHTER_RECHARGE_ADVANTAGE_2, title: '俱乐部专属', desc: '按俱乐部独立配置权益' },
{ key: ICON_KEYS.FIGHTER_RECHARGE_ADVANTAGE_3, title: '客服支持', desc: '遇到问题随时联系客服' },
{ key: ICON_KEYS.FIGHTER_RECHARGE_ADVANTAGE_4, title: '安全可靠', desc: '资金与订单平台保障' },
];
Page({ Page({
data: { data: {
// ========== 全局数据 ========== imgUrls: { pageBg: '' },
clubmber: [], // 会员列表(注意:全局变量中是 clumber,这里保持原样) avatarUrl: '',
yajin: 0, // 押金 nickname: '',
jifen: 0, // 积分(注意:全局变量中是 jinfen) uid: '',
jifenProgress: 0, // 积分进度条角度 memberBadge: '会员',
agreed: false,
// ========== 会员商品列表 ========== memberBenefits: [],
huiyuanList: [], // 从后端获取的会员列表 platformAdvantages: [],
currentHuiyuanIndex: 0, // 当前选中的会员索引 clubmber: [],
currentHuiyuan: {}, // 当前选中的会员详情 jifen: 0,
huiyuanList: [],
// ========== 押金充值相关 ========== currentHuiyuanIndex: 0,
showYajinModal: false, // 显示押金弹窗 currentHuiyuan: {},
yajinAmount: '100', // 押金金额 payLoading: false,
// ========== 支付相关 ==========
payLoading: false, // 支付加载状态
loadingText: '支付中...', loadingText: '支付中...',
currentDingdanid: '',
// ========== 订单ID记录 ==========
currentDingdanid: '', // 当前操作的订单ID
// ========== 计算高度 ==========
huiyuanListHeight: 120,
// ========== 会员详情规则 ==========
detailRules: [], detailRules: [],
// ========== 新增:跳转参数处理 ==========
// 用于接收从其他页面跳转过来的参数,决定是否自动滚动
jumpParams: {}, jumpParams: {},
showPayMethodModal: false,
// ========== 新增:支付方式选择 ========== currentBuyType: null,
showPayMethodModal: false, // 支付方式选择弹窗 currentHuiyuanId: null,
currentBuyType: null, // 当前购买类型:1会员 2押金 3积分 currentBuyIsTrial: false,
currentHuiyuanId: null, // 当前选中的会员ID(用于会员购买) showBalanceModal: false,
currentBuyIsTrial: false, // 正式/体验:仅体验禁余额抵扣 balanceOptions: [],
currentYajinAmount: null, // 当前押金金额(用于押金购买) selectedBalanceId: null,
showConfirmModal: false,
// ========== 新增:余额抵扣身份选择 ========== selectedBalanceInfo: null,
showBalanceModal: false, // 余额抵扣身份选择弹窗
balanceOptions: [], // 后端返回的身份列表
selectedBalanceId: null, // 选中的身份ID
// ========== 新增:余额抵扣确认弹窗 ==========
showConfirmModal: false, // 余额抵扣确认弹窗
selectedBalanceInfo: null, // 选中的身份详情(用于确认弹窗)
// ========== 新增:会员详情弹窗 ==========
showMemberModal: false, showMemberModal: false,
currentMemberDetail: null, currentMemberDetail: null,
}, },
// ========== 生命周期函数 ========== // ========== 生命周期函数 ==========
onLoad(options) { onLoad(options) {
//console.log('页面加载,跳转参数:', options); this.setData({ jumpParams: options || {} });
this.initImages();
// ✅ 新增:保存跳转参数 this.loadUserInfo();
this.setData({
jumpParams: options || {}
});
this.initPage(); this.initPage();
}, },
@@ -86,6 +71,7 @@ onHide() {
this.registerNotificationComponent(); this.registerNotificationComponent();
this.loadFromGlobalData(); this.loadFromGlobalData();
this.checkAndRefreshData(); this.checkAndRefreshData();
this.refreshConfiguredIcons();
// 调用统一弹窗组件检查并展示公告 // 调用统一弹窗组件检查并展示公告
PopupService.checkAndShow(this, 'dashouchongzhi'); PopupService.checkAndShow(this, 'dashouchongzhi');
@@ -112,16 +98,139 @@ onHide() {
// ========== 初始化页面 ========== // ========== 初始化页面 ==========
async initPage() { async initPage() {
// 从全局数据加载
this.loadFromGlobalData(); this.loadFromGlobalData();
// 获取会员商品列表
await this.fetchHuiyuanList(); await this.fetchHuiyuanList();
// 计算会员列表高度
this.calculateHuiyuanHeight();
}, },
initImages() {
this.setData({
imgUrls: {
pageBg: resolveConfiguredIcon(app, ICON_KEYS.FIGHTER_RECHARGE_VIP_BG),
},
platformAdvantages: this.buildPlatformAdvantages(),
});
},
async refreshConfiguredIcons() {
try {
await refreshPindaoConfig(app);
} catch (e) {
console.warn('refreshConfiguredIcons failed', e);
}
this.initImages();
const list = this.data.huiyuanList || [];
const idx = this.data.currentHuiyuanIndex || 0;
if (list.length) {
this.applyCurrentHuiyuan(list[idx] || {}, idx);
}
this.loadUserInfo();
},
_icon(key, fallbackRel) {
return resolveMiniappIcon(app, key, fallbackRel);
},
buildPlatformAdvantages() {
const fb = (name) => `${ICON_FOLDER}/${name}.png`;
const keys = [
ICON_KEYS.FIGHTER_RECHARGE_ADVANTAGE_1,
ICON_KEYS.FIGHTER_RECHARGE_ADVANTAGE_2,
ICON_KEYS.FIGHTER_RECHARGE_ADVANTAGE_3,
ICON_KEYS.FIGHTER_RECHARGE_ADVANTAGE_4,
];
return PLATFORM_ADVANTAGE_META.map((item, i) => ({
title: item.title,
desc: item.desc,
iconUrl: this._icon(keys[i], fb(keys[i])),
}));
},
loadUserInfo() {
const gd = app.globalData || {};
this.setData({
avatarUrl: resolveAvatarFromStorage(app),
nickname: gd.dashouNicheng || gd.nicheng || '打手',
uid: wx.getStorageSync('uid') || gd.uid || '',
});
},
onAvatarError() {
onAvatarImageError(this, 'avatarUrl', app);
},
resolveOssUrl(path) {
if (!path) return '';
if (path.startsWith('http')) return path;
return (app.globalData.ossImageUrl || '') + path;
},
buildMemberBenefits(huiyuan = {}) {
const name = huiyuan.mingzi || '会员';
const formalPrice = huiyuan.jiage || '0';
const trialPrice = huiyuan.trial_price || '0';
const fb = (name) => `${ICON_FOLDER}/${name}.png`;
const meta = [
{
key: ICON_KEYS.FIGHTER_RECHARGE_BENEFIT_1,
title: '充值立得',
desc: `开通${name}正式版 ¥${formalPrice},享优先接单`,
},
{
key: ICON_KEYS.FIGHTER_RECHARGE_BENEFIT_2,
title: '体验尝鲜',
desc: huiyuan.can_buy_trial
? `体验版 ¥${trialPrice}/${huiyuan.trial_days || 0}天,终身1次`
: '正式会员支持余额抵扣',
},
{
key: ICON_KEYS.FIGHTER_RECHARGE_BENEFIT_3,
title: '专属特权',
desc: '解锁平台单、优质接单等待遇',
},
];
return meta.map((item) => ({
title: item.title,
desc: item.desc,
iconUrl: this._icon(item.key, fb(item.key)),
}));
},
applyCurrentHuiyuan(huiyuan, index) {
this.setData({
currentHuiyuanIndex: index,
currentHuiyuan: huiyuan,
detailRules: this.buildDetailRules(huiyuan),
memberBenefits: this.buildMemberBenefits(huiyuan),
memberBadge: huiyuan.mingzi || '会员',
});
},
toggleAgree() {
this.setData({ agreed: !this.data.agreed });
},
goToDeposit() {
wx.navigateTo({ url: '/pages/fighter-recharge/fighter-deposit' });
},
onTapTrial(e) {
if (!this.data.agreed) {
wx.showToast({ title: '请先阅读并同意会员协议', icon: 'none' });
return;
}
this.onBuyHuiyuanClick(e);
},
onTapFormal(e) {
if (!this.data.agreed) {
wx.showToast({ title: '请先阅读并同意会员协议', icon: 'none' });
return;
}
this.onBuyHuiyuanClick(e);
},
stopPropagation() {},
// ========== 从全局变量加载数据 ========== // ========== 从全局变量加载数据 ==========
loadFromGlobalData() { loadFromGlobalData() {
const app = getApp(); const app = getApp();
@@ -135,35 +244,7 @@ onHide() {
this.setData({ this.setData({
clubmber: clubmber, clubmber: clubmber,
yajin: globalData.yajin || 0, jifen: globalData.jinfen || 0,
jifen: globalData.jinfen || 0 // ✅ 注意:这里从 jinfen 读取
});
// 计算积分进度条
this.calculateJifenProgress();
},
// ========== 计算积分进度条角度 ==========
calculateJifenProgress() {
const jifen = this.data.jifen || 0;
const progress = (jifen / 10) * 360; // 满分10分
this.setData({
jifenProgress: progress
});
},
// ========== 计算会员列表高度 ==========
calculateHuiyuanHeight() {
const clubmber = this.data.clubmber || [];
const itemHeight = 100; // 每个会员标签高度
const maxHeight = 300; // 最大高度(3个会员)
let height = clubmber.length * itemHeight;
height = Math.min(height, maxHeight);
this.setData({
huiyuanListHeight: height
}); });
}, },
@@ -177,17 +258,15 @@ onHide() {
}); });
if (res.data.code === 200) { if (res.data.code === 200) {
const huiyuanList = res.data.data || []; const huiyuanList = this.processHuiyuanList(res.data.data || []);
let index = 0;
// 处理数据,标记已购买的会员 const targetId = this.data.jumpParams.huiyuanId;
const processedList = this.processHuiyuanList(huiyuanList); if (targetId) {
const found = huiyuanList.findIndex((h) => String(h.id) === String(targetId));
const currentHuiyuan = processedList[0] || {}; if (found >= 0) index = found;
this.setData({ }
huiyuanList: processedList, this.applyCurrentHuiyuan(huiyuanList[index] || {}, index);
currentHuiyuan, this.setData({ huiyuanList });
detailRules: this.buildDetailRules(currentHuiyuan)
});
} else { } else {
wx.showToast({ wx.showToast({
title: res.data.message || '获取会员列表失败', title: res.data.message || '获取会员列表失败',
@@ -214,7 +293,9 @@ onHide() {
return { return {
...item, ...item,
isBought: !!boughtItem, isBought: !!boughtItem,
buyInfo: boughtItem || null buyInfo: boughtItem || null,
cardImageUrl: this.resolveOssUrl(item.card_image),
cardBgUrl: this.resolveOssUrl(item.card_bg),
}; };
}); });
}, },
@@ -223,43 +304,27 @@ onHide() {
onSwiperChange(e) { onSwiperChange(e) {
const current = e.detail.current; const current = e.detail.current;
const huiyuanList = this.data.huiyuanList || []; const huiyuanList = this.data.huiyuanList || [];
const currentHuiyuan = huiyuanList[current] || {}; this.applyCurrentHuiyuan(huiyuanList[current] || {}, current);
this.setData({
currentHuiyuanIndex: current,
currentHuiyuan,
detailRules: this.buildDetailRules(currentHuiyuan)
});
}, },
// ========== 手动选择会员 ==========
selectHuiyuan(e) { selectHuiyuan(e) {
const index = e.currentTarget.dataset.index; const index = e.currentTarget.dataset.index;
const huiyuanList = this.data.huiyuanList || []; const huiyuanList = this.data.huiyuanList || [];
this.applyCurrentHuiyuan(huiyuanList[index] || {}, index);
const currentHuiyuan = huiyuanList[index] || {};
this.setData({
currentHuiyuanIndex: index,
currentHuiyuan,
detailRules: this.buildDetailRules(currentHuiyuan)
});
}, },
buildDetailRules(huiyuan = {}) { buildDetailRules(huiyuan = {}) {
const formalDays = huiyuan.formal_days || 30; const formalDays = huiyuan.formal_days || 30;
const rules = [ const rules = [
`正式会员有效期为${formalDays}天,从购买当天开始计算`, `有效期${formalDays}天`,
'会员期间享受优先接单特权', '可接多种订单类型',
'支持随时续费,未过期续费天数叠加,已过期从今天重新计算' '支持续费,天数叠加',
'正式会员支持余额抵扣',
]; ];
if (huiyuan.can_buy_trial) { if (huiyuan.can_buy_trial) {
rules.push(`体验会员终身仅可购买1次(${huiyuan.trial_days || 0}天),体验期仅限制佣金提现`); rules[3] = `体验版¥${huiyuan.trial_price}/${huiyuan.trial_days}天`;
} }
if (huiyuan.trial_enabled && !huiyuan.can_buy_trial) { return rules.slice(0, 4);
rules.push('您已使用过该会员的体验资格');
}
rules.push('体验会员仅支持微信支付;正式会员可使用佣金、分红或押金抵扣');
return rules;
}, },
// ========== 格式化到期时间 ========== // ========== 格式化到期时间 ==========
@@ -313,112 +378,10 @@ onHide() {
// ========== 处理自动滚动 ========== // ========== 处理自动滚动 ==========
handleAutoScroll() { handleAutoScroll() {
const { jumpParams } = this.data; const { jumpParams } = this.data;
if (!jumpParams || jumpParams.scrollTo !== 'jifen') return;
if (!jumpParams || !jumpParams.needScroll) return;
setTimeout(() => { setTimeout(() => {
let scrollTop = 0; wx.pageScrollTo({ selector: '#jifen-section', duration: 300 });
}, 600);
if (jumpParams.scrollTo === 'bottom') {
scrollTop = 2000;
} else if (jumpParams.scrollTo === 'member') {
return;
}
if (scrollTop > 0) {
wx.pageScrollTo({
scrollTop: scrollTop,
duration: 300
});
}
}, 800);
},
// ========== 押金充值相关 ==========
showYajinModal() {
this.setData({
showYajinModal: true,
yajinAmount: '100'
});
},
hideYajinModal() {
this.setData({
showYajinModal: false
});
},
onYajinInput(e) {
let value = e.detail.value;
value = value.replace(/[^\d]/g, '');
if (value) {
const num = parseInt(value);
if (num < 1) value = '1';
if (num > 10000) value = '10000';
}
this.setData({
yajinAmount: value
});
},
setYajinAmount(e) {
const amount = e.currentTarget.dataset.amount;
this.setData({
yajinAmount: amount
});
},
async handleYajinPay() {
const amount = this.data.yajinAmount;
if (!amount || amount < 1 || amount > 10000) {
wx.showToast({
title: '请输入1-10000元的金额',
icon: 'none'
});
return;
}
const confirmed = await this.confirmWechatPurchase('yajin');
if (!confirmed) return;
this.showLoading('发起支付中...');
try {
const res = await request({
url: '/shangpin/yajingoumai',
method: 'POST',
data: {
jine: parseInt(amount)
}
});
if (res.data.code === 200) {
const payParams = res.data.payParams;
const dingdanid = res.data.dingdanid;
this.setData({
currentDingdanid: dingdanid
});
await this.wechatPay(payParams, 'yajin');
} else {
wx.showToast({
title: res.data.message || '支付发起失败',
icon: 'none'
});
}
} catch (error) {
console.error('押金支付失败:', error);
wx.showToast({
title: '支付失败,请重试',
icon: 'none'
});
} finally {
this.hideLoading();
}
}, },
// ========== 积分充值相关 ========== // ========== 积分充值相关 ==========
@@ -858,6 +821,7 @@ onHide() {
const isTrial = e.currentTarget.dataset.trial === true || e.currentTarget.dataset.trial === 'true'; const isTrial = e.currentTarget.dataset.trial === true || e.currentTarget.dataset.trial === 'true';
if (isTrial) { if (isTrial) {
this.setData({ currentBuyIsTrial: true });
this.handleHuiyuanBuy(e); this.handleHuiyuanBuy(e);
return; return;
} }
@@ -866,25 +830,7 @@ onHide() {
currentBuyType: 1, currentBuyType: 1,
currentHuiyuanId: huiyuanId, currentHuiyuanId: huiyuanId,
currentBuyIsTrial: false, currentBuyIsTrial: false,
showPayMethodModal: true showPayMethodModal: true,
});
},
onYajinClick() {
this.showYajinModal();
},
onYajinConfirm() {
const amount = this.data.yajinAmount;
if (!amount || amount < 1 || amount > 10000) {
wx.showToast({ title: '请输入1-10000元的金额', icon: 'none' });
return;
}
this.hideYajinModal();
this.setData({
currentBuyType: 2,
currentYajinAmount: amount,
showPayMethodModal: true
}); });
}, },
@@ -895,29 +841,20 @@ onHide() {
// 🔥 修改点2:选择支付方式时再次校验积分状态(防止异步过程中积分变化) // 🔥 修改点2:选择支付方式时再次校验积分状态(防止异步过程中积分变化)
onPayMethodSelect(e) { onPayMethodSelect(e) {
const method = e.currentTarget.dataset.method; const method = e.currentTarget.dataset.method;
const { currentBuyType, currentHuiyuanId, currentYajinAmount, jifen } = this.data; const { currentBuyType, currentHuiyuanId, jifen } = this.data;
this.hidePayMethodModal(); this.hidePayMethodModal();
// 如果是积分购买,且积分已满,直接拒绝
if (currentBuyType === 3 && jifen >= 10) { if (currentBuyType === 3 && jifen >= 10) {
wx.showToast({ wx.showToast({ title: '积分已满,无需补充', icon: 'none' });
title: '积分已满,无需补充',
icon: 'none'
});
return; return;
} }
if (method === 'wx') { if (method === 'wx') {
if (currentBuyType === 1) { if (currentBuyType === 1) {
this.handleHuiyuanBuy({ this.handleHuiyuanBuy({
currentTarget: { dataset: { id: currentHuiyuanId, trial: 'false' } } currentTarget: { dataset: { id: currentHuiyuanId, trial: this.data.currentBuyIsTrial ? 'true' : 'false' } },
});
} else if (currentBuyType === 2) {
this.setData({ yajinAmount: currentYajinAmount }, () => {
this.handleYajinPay();
}); });
} else if (currentBuyType === 3) { } else if (currentBuyType === 3) {
// ✅ 调用已修正的积分支付函数
this.handleJifenBuy({ currentTarget: { dataset: { disabled: 'false' } } }); this.handleJifenBuy({ currentTarget: { dataset: { disabled: 'false' } } });
} }
} else if (method === 'balance') { } else if (method === 'balance') {
@@ -927,7 +864,7 @@ onHide() {
// 🔥 修改点3:请求余额抵扣选项前校验积分状态 // 🔥 修改点3:请求余额抵扣选项前校验积分状态
async fetchBalanceOptions() { async fetchBalanceOptions() {
const { currentBuyType, currentHuiyuanId, currentYajinAmount, currentBuyIsTrial, jifen } = this.data; const { currentBuyType, currentHuiyuanId, currentBuyIsTrial, jifen } = this.data;
if (currentBuyType === 1 && currentBuyIsTrial) { if (currentBuyType === 1 && currentBuyIsTrial) {
wx.showToast({ title: '体验会员仅支持微信支付', icon: 'none' }); wx.showToast({ title: '体验会员仅支持微信支付', icon: 'none' });
@@ -952,9 +889,8 @@ onHide() {
data: { data: {
leixing: currentBuyType, leixing: currentBuyType,
huiyuan_id: currentBuyType === 1 ? currentHuiyuanId : undefined, huiyuan_id: currentBuyType === 1 ? currentHuiyuanId : undefined,
is_trial: currentBuyType === 1 ? false : undefined, is_trial: currentBuyType === 1 ? currentBuyIsTrial : undefined,
yajin_jine: currentBuyType === 2 ? parseInt(currentYajinAmount) : undefined, },
}
}); });
if (res.data.code === 200) { if (res.data.code === 200) {
const options = res.data.data || []; const options = res.data.data || [];
@@ -995,7 +931,7 @@ onHide() {
}, },
async confirmBalancePay() { async confirmBalancePay() {
const { selectedBalanceId, currentBuyType, currentHuiyuanId, currentYajinAmount, currentBuyIsTrial } = this.data; const { selectedBalanceId, currentBuyType, currentHuiyuanId, currentBuyIsTrial } = this.data;
if (!selectedBalanceId) return; if (!selectedBalanceId) return;
this.hideConfirmModal(); this.hideConfirmModal();
@@ -1010,14 +946,13 @@ onHide() {
shenfen_id: selectedBalanceId, shenfen_id: selectedBalanceId,
huiyuan_id: currentBuyType === 1 ? currentHuiyuanId : undefined, huiyuan_id: currentBuyType === 1 ? currentHuiyuanId : undefined,
is_trial: currentBuyType === 1 ? currentBuyIsTrial : undefined, is_trial: currentBuyType === 1 ? currentBuyIsTrial : undefined,
yajin_jine: currentBuyType === 2 ? parseInt(currentYajinAmount) : undefined, },
}
}); });
if (res.data.code === 200) { if (res.data.code === 200) {
const responseData = res.data.data || {}; const responseData = res.data.data || {};
await this.updateAfterPayment( await this.updateAfterPayment(
currentBuyType === 1 ? 'huiyuan' : (currentBuyType === 2 ? 'yajin' : 'jifen'), currentBuyType === 1 ? 'huiyuan' : 'jifen',
currentBuyType === 1 ? currentHuiyuanId : null, currentBuyType === 1 ? currentHuiyuanId : null,
responseData responseData
); );
+9 -11
View File
@@ -1,12 +1,10 @@
{ {
"usingComponents": { "usingComponents": {
"global-notification": "/components/global-notification/global-notification" "global-notification": "/components/global-notification/global-notification",
}, "popup-notice": "/components/popup-notice/popup-notice"
"navigationBarTitleText": "充值中心", },
"navigationBarBackgroundColor": "#0a0e2a", "navigationBarTitleText": "VIP",
"navigationBarTextStyle": "white", "navigationBarBackgroundColor": "#FFF9F0",
"backgroundColor": "#0a0e2a", "navigationBarTextStyle": "black",
"backgroundTextStyle": "light", "backgroundColor": "#FFF9F0"
"enablePullDownRefresh": false, }
"onReachBottomDistance": 50
}
+180 -511
View File
@@ -1,541 +1,210 @@
<!--pages/dashou-chongzhi/index.wxml--> <!-- VIP 会员 + 积分充值页 -->
<view class="page-container"> <view class="vip-page">
<!-- ❌ 删除自定义导航栏区块 --> <image wx:if="{{imgUrls.pageBg}}" class="page-bg" src="{{imgUrls.pageBg}}" mode="widthFix" />
<view class="page-bg-fallback" wx:else></view>
<!-- ======================= --> <view class="page-body">
<!-- VIP会员区域 - 放在上面 --> <view class="user-row">
<!-- ======================= --> <image class="user-avatar" src="{{avatarUrl}}" mode="aspectFill" binderror="onAvatarError" />
<view class="vip-section"> <view class="user-info">
<view class="section-header"> <text class="user-name">{{nickname || '打手'}}</text>
<view class="header-decoration"> <text class="user-id">会员ID: {{uid || '--'}}</text>
<view class="dec-line"></view>
<view class="dec-diamond"></view>
<text class="dec-text">VIP会员充值</text>
<view class="dec-diamond"></view>
<view class="dec-line"></view>
</view> </view>
<text class="section-subtitle">选择你的会员</text> <view class="member-badge">{{memberBadge}}</view>
</view> </view>
<!-- 会员卡片滑动区域 --> <swiper
<swiper class="vip-swiper"
class="vip-swiper" current="{{currentHuiyuanIndex}}"
current="{{currentHuiyuanIndex}}" circular="{{huiyuanList.length > 1}}"
circular="{{true}}" previous-margin="40rpx"
previous-margin="120rpx" next-margin="40rpx"
next-margin="120rpx" duration="400"
duration="500"
easing-function="easeOutCubic"
bindchange="onSwiperChange"> bindchange="onSwiperChange">
<swiper-item wx:for="{{huiyuanList}}" wx:key="id"> <swiper-item wx:for="{{huiyuanList}}" wx:key="id">
<view class="vip-card {{index === currentHuiyuanIndex ? 'active' : ''}}" <view class="vip-card {{index === currentHuiyuanIndex ? 'vip-card--active' : ''}}" data-index="{{index}}" bindtap="selectHuiyuan">
data-index="{{index}}" bindtap="selectHuiyuan"> <image wx:if="{{item.cardBgUrl}}" class="vip-card-bg-img" src="{{item.cardBgUrl}}" mode="aspectFill" />
<!-- 机甲风格边框 --> <view class="vip-card-bg" wx:else></view>
<view class="card-frame"> <view class="vip-card-inner">
<view class="frame-corner tl"></view> <view class="vip-card-left">
<view class="frame-corner tr"></view> <view class="vip-title-row">
<view class="frame-corner bl"></view> <text class="vip-name">{{item.mingzi}}</text>
<view class="frame-corner br"></view> <view class="vip-status">{{item.isBought ? '已激活' : '未激活'}}</view>
<view class="frame-line top"></view> </view>
<view class="frame-line right"></view> <view class="vip-price-row">
<view class="frame-line bottom"></view> <text class="vip-currency">¥</text>
<view class="frame-line left"></view> <text class="vip-price">{{item.jiage}}</text>
</view> </view>
<text class="vip-validity">有效期 {{item.formal_days || 30}} 天</text>
<!-- 卡片内容 -->
<view class="card-content">
<view class="vip-badge" wx:if="{{item.isBought}}">
<text class="badge-text">已拥有</text>
</view> </view>
<view class="vip-badge trial-badge" wx:if="{{item.can_buy_trial}}"> <view class="vip-card-right">
<text class="badge-text">可购体验</text> <view class="icon-clip icon-clip-vip" wx:if="{{item.cardImageUrl}}">
</view> <image class="icon-clip-img" src="{{item.cardImageUrl}}" mode="aspectFill" />
<view class="vip-badge trial-off-badge" wx:elif="{{item.trial_enabled}}"> </view>
<text class="badge-text">体验已用/不可购</text> <view class="vip-logo-fallback" wx:else>
</view> <text class="vip-logo-text">VIP</text>
<view class="vip-title">
<text class="title-text">{{item.mingzi}}</text>
<view class="title-underline"></view>
</view>
<view class="vip-price">
<text class="price-symbol">¥</text>
<text class="price-number">{{item.jiage}}</text>
<text class="price-unit">/{{item.formal_days || 30}}天</text>
</view>
<view class="vip-trial-price" wx:if="{{item.trial_enabled || item.can_buy_trial}}">
<text class="trial-price-label">体验</text>
<text class="trial-price-value">¥{{item.trial_price}}/{{item.trial_days}}天</text>
</view>
<view class="vip-features">
<view class="feature-item" wx:for="{{item.features || ['特权功能', '专属标识', '优先接单']}}"
wx:key="index">
<image class="feature-icon" src="/static/images/check-tech.png"></image>
<text class="feature-text">{{item}}</text>
</view> </view>
</view> </view>
</view> </view>
<view class="vip-shimmer"></view>
<!-- 选中状态指示器 -->
<view class="card-indicator" wx:if="{{index === currentHuiyuanIndex}}">
<view class="indicator-triangle"></view>
<view class="indicator-glow"></view>
</view>
</view> </view>
</swiper-item> </swiper-item>
</swiper> </swiper>
<!-- 会员详细介绍 --> <view class="section-head">
<view class="vip-detail"> <view class="section-bar"></view>
<view class="detail-header"> <text class="section-title">{{currentHuiyuan.mingzi || '会员'}}规则</text>
<view class="detail-title"> </view>
<image class="detail-icon" src="/static/images/info-tech.png"></image> <scroll-view class="rules-scroll" scroll-x enable-flex>
<text class="title-text">{{currentHuiyuan.mingzi}} - 会员详情</text> <view class="rules-row">
<view wx:for="{{detailRules}}" wx:key="index" class="rule-card">
<view class="rule-num">{{index + 1}}</view>
<text class="rule-text">{{item}}</text>
</view> </view>
<view class="detail-tech"></view>
</view> </view>
</scroll-view>
<view class="detail-content">
<scroll-view class="detail-scroll" scroll-y> <view class="section-head">
<text class="detail-text">{{currentHuiyuan.jieshao || '加载中...'}}</text> <view class="section-bar"></view>
<text class="section-title">{{currentHuiyuan.mingzi || '会员'}}专属权益</text>
<view class="detail-rules"> </view>
<view class="rule-item" wx:for="{{detailRules}}" wx:key="index"> <view class="benefits-row">
<view class="rule-number">{{index + 1}}</view> <view wx:for="{{memberBenefits}}" wx:key="title" class="benefit-card">
<text class="rule-text">{{item}}</text> <view wx:if="{{item.iconUrl}}" class="icon-clip icon-clip-benefit">
</view> <image class="icon-clip-img" src="{{item.iconUrl}}" mode="aspectFill" />
</view> </view>
</scroll-view> <text class="benefit-title">{{item.title}}</text>
<text class="benefit-desc">{{item.desc}}</text>
</view> </view>
</view>
<!-- 购买区域 - 点击按钮先弹出支付方式选择 -->
<view class="buy-section"> <view class="section-head">
<view class="buy-info"> <view class="section-bar"></view>
<view class="price-display"> <text class="section-title">平台优势</text>
<!-- 🔥 将“机甲能源”改为“价格” --> </view>
<text class="price-label">价格:</text> <view class="advantage-grid">
<text class="price-value">¥{{currentHuiyuan.jiage}}</text> <view wx:for="{{platformAdvantages}}" wx:key="title" class="advantage-item">
<text class="price-days">/{{currentHuiyuan.formal_days || 30}}天</text> <view wx:if="{{item.iconUrl}}" class="icon-clip icon-clip-advantage">
</view> <image class="icon-clip-img" src="{{item.iconUrl}}" mode="aspectFill" />
<text class="buy-desc" wx:if="{{currentHuiyuan.isBought && currentHuiyuan.buyInfo}}">
已激活,<text class="expire-date">{{currentHuiyuan.buyInfo.daoqi}}</text>后到期
</text>
<text class="buy-desc" wx:else>正式会员支持微信或余额抵扣</text>
<text class="buy-desc trial-hint" wx:if="{{currentHuiyuan.can_buy_trial}}">
体验版仅微信支付 ¥{{currentHuiyuan.trial_price}}/{{currentHuiyuan.trial_days}}天,终身1次
</text>
<text class="buy-desc trial-warn" wx:elif="{{!currentHuiyuan.trial_enabled}}">
本俱乐部尚未为该会员开启体验版,请联系管理员在后台配置
</text>
</view> </view>
<text class="advantage-title">{{item.title}}</text>
<view class="buy-action"> <text class="advantage-desc">{{item.desc}}</text>
<view class="tech-buy-btn {{currentHuiyuan.isBought ? 'renew' : ''}}" </view>
bindtap="onBuyHuiyuanClick" data-id="{{currentHuiyuan.id}}" data-trial="false"> </view>
<view class="buy-btn-bg"></view>
<view class="buy-btn-glow"></view> <view id="jifen-section" class="jifen-section">
<text class="buy-btn-text"> <view class="section-head">
{{currentHuiyuan.isBought ? '正式续费' : '购买正式版'}} <view class="section-bar"></view>
</text> <text class="section-title">积分充值</text>
<view class="buy-btn-energy"> </view>
<view class="energy-dot"></view> <view class="jifen-card">
<view class="energy-dot"></view> <view class="jifen-left">
<view class="energy-dot"></view> <text class="jifen-label">当前积分</text>
</view> <text class="jifen-value">{{jifen}}</text>
</view> <text class="jifen-tip" wx:if="{{jifen < 10}}">积分不足将影响接单与提现</text>
<view <text class="jifen-tip jifen-tip--ok" wx:else>积分充足</text>
wx:if="{{currentHuiyuan.can_buy_trial}}"
class="tech-buy-btn trial-buy-btn"
bindtap="onBuyHuiyuanClick"
data-id="{{currentHuiyuan.id}}"
data-trial="true"
>
<view class="buy-btn-bg"></view>
<text class="buy-btn-text">购买体验版</text>
</view>
</view> </view>
<view class="jifen-btn {{jifen >= 10 ? 'jifen-btn--disabled' : ''}}" bindtap="onJifenClick" data-disabled="{{jifen >= 10}}">
{{jifen >= 10 ? '已满' : '补充积分'}}
</view>
</view>
</view>
<view class="owned-section" wx:if="{{clubmber.length > 0}}">
<view class="section-head">
<view class="section-bar"></view>
<text class="section-title">我的会员</text>
</view>
<view wx:for="{{clubmber}}" wx:key="huiyuanid" class="owned-item" data-item="{{item}}" bindtap="showMemberDetail">
<text class="owned-name">{{item.huiyuanming}}</text>
<text class="owned-expire">到期 {{formatDaoqiTime(item.daoqi)}}</text>
</view> </view>
</view> </view>
</view> </view>
<!-- ======================= --> <view class="footer-bar">
<!-- 三卡片区域 - 放在下面 --> <view class="deposit-banner" bindtap="goToDeposit">
<!-- ======================= --> <text class="deposit-banner-text">缴纳履约金,快人一步</text>
<view class="tech-grid"> <text class="deposit-banner-link">去缴纳 ></text>
<!-- 会员区域 - 高度限制最多3个,超出可滚动 --> </view>
<view class="tech-card huiyuan-card"> <view class="agree-row" bindtap="toggleAgree">
<view class="card-header"> <view class="agree-check {{agreed ? 'agree-check--on' : ''}}">{{agreed ? '✓' : ''}}</view>
<view class="card-title"> <text class="agree-text">已阅读并同意</text>
<text class="title-text">我的会员</text> <text class="agree-link">《{{currentHuiyuan.mingzi || '会员'}}协议》</text>
<view class="title-text">👑</view> </view>
</view> <view class="buy-row">
<view class="card-badge">{{clubmber.length}}</view> <view
wx:if="{{currentHuiyuan.can_buy_trial}}"
class="buy-btn buy-btn--outline"
bindtap="onTapTrial"
data-id="{{currentHuiyuan.id}}"
data-trial="true">
体验会员 (¥{{currentHuiyuan.trial_price}})
</view> </view>
<view
<scroll-view class="buy-btn buy-btn--primary {{currentHuiyuan.can_buy_trial ? '' : 'buy-btn--full'}}"
class="huiyuan-scroll" bindtap="onTapFormal"
scroll-y data-id="{{currentHuiyuan.id}}"
enable-flex data-trial="false">
style="height: {{huiyuanListHeight}}rpx"> {{currentHuiyuan.isBought ? '续费正式会员' : '升级正式会员'}} (¥{{currentHuiyuan.jiage}})
<view wx:for="{{clubmber}}" wx:key="huiyuanid" class="huiyuan-item" data-item="{{item}}" bindtap="showMemberDetail"> <view class="buy-btn-shimmer"></view>
<view class="huiyuan-tag tech-tag">
<view class="tag-triangle"></view>
<text class="tag-name">{{item.huiyuanming}}</text>
<text class="tag-time">到期: {{formatDaoqiTime(item.daoqi)}}</text>
<view class="tag-glow"></view>
</view>
</view>
<view wx:if="{{clubmber.length === 0}}" class="empty-huiyuan">
<image class="empty-icon" src="/static/images/empty-member.png"></image>
<text class="empty-text">暂无会员</text>
</view>
</scroll-view>
<view class="card-footer">
<text class="footer-text">共{{clubmber.length}}个会员</text>
<view class="footer-line"></view>
</view> </view>
</view> </view>
<!-- 押金区域 - 点击充值按钮弹出押金输入弹窗 -->
<view class="tech-card yajin-card">
<view class="card-header">
<view class="card-title">
<text class="title-text">我的押金</text>
<view class="title-text">💰</view>
</view>
<view class="card-corner"></view>
</view>
<view class="yajin-display">
<view class="amount-container">
<text class="amount-symbol">¥</text>
<text class="amount-number">{{yajin}}</text>
</view>
<text class="amount-unit">可用余额</text>
</view>
<view class="tech-line"></view>
<view class="action-container">
<view class="tech-btn yajin-btn" bindtap="onYajinClick">
<view class="btn-bg"></view>
<text class="btn-text">立即充值</text>
<view class="btn-arrow" style="display:none;">➤</view>
<view class="btn-glow"></view>
</view>
</view>
<view class="card-corner corner-bottom"></view>
</view>
<!-- 积分区域 - 点击补充按钮弹出支付方式选择 -->
<view class="tech-card jifen-card">
<view class="card-header">
<view class="card-title">
<text class="title-text">我的积分</text>
<view class="title-text">⭐</view>
</view>
</view>
<view class="jifen-display">
<view class="circle-progress">
<view class="circle-bg"></view>
<view class="circle-mask" style="transform: rotate({{jifenProgress}}deg);"></view>
<view class="circle-fill" style="transform: rotate({{jifenProgress}}deg);"></view>
<view class="circle-center">
<text class="jifen-value">{{jifen}}</text>
<text class="jifen-label">积分</text>
</view>
<view class="circle-dots">
<view class="circle-dot" wx:for="{{10}}" wx:key="index"
style="transform: rotate({{index * 36}}deg);"></view>
</view>
</view>
<view class="jifen-status">
<text class="status-text" wx:if="{{jifen < 10}}">积分不足,影响接单,提现权限</text>
<text class="status-text full" wx:else>积分充足,无需补充</text>
</view>
</view>
<view class="action-container">
<view class="tech-btn jifen-btn" bindtap="onJifenClick" data-disabled="{{jifen >= 10}}">
<view class="btn-bg"></view>
<text class="btn-text">{{jifen >= 10 ? '积分已满' : '立即补充'}}</text>
<view class="btn-energy" wx:if="{{jifen < 10}}"></view>
<view class="btn-glow" wx:if="{{jifen < 10}}"></view>
</view>
</view>
</view>
</view>
<!-- ======================= -->
<!-- 押金充值弹窗(原有,确认事件改为 onYajinConfirm) -->
<!-- ======================= -->
<view class="tech-modal" wx:if="{{showYajinModal}}">
<view class="modal-backdrop" bindtap="hideYajinModal"></view>
<view class="modal-container">
<view class="modal-corner tl"></view>
<view class="modal-corner tr"></view>
<view class="modal-corner bl"></view>
<view class="modal-corner br"></view>
<view class="modal-header">
<text class="modal-title">押金充值</text>
<text class="modal-subtitle">充值保证金</text>
<view class="modal-close" bindtap="hideYajinModal">
<text class="close-text">✕</text>
</view>
</view>
<view class="modal-body">
<view class="input-section">
<view class="input-label">
<image class="label-icon" src="/static/images/money-tech.png"></image>
<text class="label-text">充值金额 (1-10000元)</text>
</view>
<view class="input-container">
<view class="input-prefix">¥</view>
<input
class="yajin-input"
type="digit"
placeholder="输入充值金额"
placeholder-class="input-placeholder"
value="{{yajinAmount}}"
bindinput="onYajinInput"
maxlength="5"
focus="{{showYajinModal}}"/>
<view class="input-underline"></view>
</view>
<text class="input-tip">支持1-10000元整数充值</text>
</view>
<view class="quick-section">
<text class="quick-title">快速选择</text>
<view class="quick-buttons">
<view
class="quick-btn {{yajinAmount == '100' ? 'active' : ''}}"
bindtap="setYajinAmount"
data-amount="100">
<text class="quick-text">100元</text>
</view>
<view
class="quick-btn {{yajinAmount == '500' ? 'active' : ''}}"
bindtap="setYajinAmount"
data-amount="500">
<text class="quick-text">500元</text>
</view>
<view
class="quick-btn {{yajinAmount == '1000' ? 'active' : ''}}"
bindtap="setYajinAmount"
data-amount="1000">
<text class="quick-text">1000元</text>
</view>
<view
class="quick-btn {{yajinAmount == '5000' ? 'active' : ''}}"
bindtap="setYajinAmount"
data-amount="5000">
<text class="quick-text">5000元</text>
</view>
</view>
</view>
</view>
<view class="modal-footer">
<view class="modal-btn cancel-btn" bindtap="hideYajinModal">
<text class="btn-text">取消</text>
</view>
<view class="modal-divider"></view>
<view class="modal-btn confirm-btn" bindtap="onYajinConfirm">
<text class="btn-text">确认支付</text>
<view class="btn-sparkle"></view>
</view>
</view>
</view>
</view>
<!-- ====== 支付方式选择弹窗 ====== -->
<view class="tech-modal" wx:if="{{showPayMethodModal}}">
<view class="modal-backdrop" bindtap="hidePayMethodModal"></view>
<view class="modal-container small">
<view class="modal-corner tl"></view>
<view class="modal-corner tr"></view>
<view class="modal-corner bl"></view>
<view class="modal-corner br"></view>
<view class="modal-header">
<text class="modal-title">选择支付方式</text>
<view class="modal-close" bindtap="hidePayMethodModal">
<text class="close-text">✕</text>
</view>
</view>
<view class="modal-body">
<view class="pay-method-list">
<view class="pay-method-item" bindtap="onPayMethodSelect" data-method="wx">
<image class="method-icon" src="/static/images/wechat-pay.png"></image>
<text class="method-name">微信支付</text>
<text class="method-desc">安全快捷</text>
</view>
<view class="pay-method-item" bindtap="onPayMethodSelect" data-method="balance">
<image class="method-icon" src="/static/images/balance-pay.png"></image>
<text class="method-name">余额抵扣</text>
<text class="method-desc">使用佣金或分红</text>
</view>
</view>
</view>
</view>
</view>
<!-- ====== 余额抵扣身份选择弹窗 ====== -->
<view class="tech-modal" wx:if="{{showBalanceModal}}">
<view class="modal-backdrop" bindtap="hideBalanceModal"></view>
<view class="modal-container">
<view class="modal-corner tl"></view>
<view class="modal-corner tr"></view>
<view class="modal-corner bl"></view>
<view class="modal-corner br"></view>
<view class="modal-header">
<text class="modal-title">选择抵扣身份</text>
<view class="modal-close" bindtap="hideBalanceModal">
<text class="close-text">✕</text>
</view>
</view>
<view class="modal-body">
<view class="balance-list">
<view wx:for="{{balanceOptions}}" wx:key="id" class="balance-item"
data-id="{{item.id}}" bindtap="onBalanceSelect">
<view class="balance-info">
<text class="balance-name">{{item.jieshao}}</text>
<text class="balance-amount">需¥{{item.xuyao}}</text>
</view>
<view class="balance-arrow">➤</view>
</view>
</view>
</view>
</view>
</view>
<!-- ====== 余额抵扣确认弹窗 ====== -->
<view class="tech-modal" wx:if="{{showConfirmModal}}">
<view class="modal-backdrop" bindtap="hideConfirmModal"></view>
<view class="modal-container">
<view class="modal-corner tl"></view>
<view class="modal-corner tr"></view>
<view class="modal-corner bl"></view>
<view class="modal-corner br"></view>
<view class="modal-header">
<text class="modal-title">确认抵扣</text>
<view class="modal-close" bindtap="hideConfirmModal">
<text class="close-text">✕</text>
</view>
</view>
<view class="modal-body">
<view class="confirm-detail">
<view class="detail-row">
<text class="detail-label">抵扣身份:</text>
<text class="detail-value">{{selectedBalanceInfo && selectedBalanceInfo.jieshao}}</text>
</view>
<view class="detail-row">
<text class="detail-label">所需金额:</text>
<text class="detail-value">¥{{selectedBalanceInfo && selectedBalanceInfo.xuyao}}</text>
</view>
<view class="detail-row">
<text class="detail-label">实际扣除:</text>
<text class="detail-value">¥{{selectedBalanceInfo && selectedBalanceInfo.xuyao}}</text>
</view>
<view class="detail-tip">确认后将从您的余额中扣除</view>
</view>
</view>
<view class="modal-footer">
<view class="modal-btn cancel-btn" bindtap="hideConfirmModal">
<text class="btn-text">取消</text>
</view>
<view class="modal-divider"></view>
<view class="modal-btn confirm-btn" bindtap="confirmBalancePay">
<text class="btn-text">确认支付</text>
<view class="btn-sparkle"></view>
</view>
</view>
</view>
</view>
<!-- ====== 会员详情弹窗 ====== -->
<view class="tech-modal" wx:if="{{showMemberModal}}">
<view class="modal-backdrop" bindtap="hideMemberModal"></view>
<view class="modal-container">
<view class="modal-corner tl"></view>
<view class="modal-corner tr"></view>
<view class="modal-corner bl"></view>
<view class="modal-corner br"></view>
<view class="modal-header">
<text class="modal-title">会员详情</text>
<view class="modal-close" bindtap="hideMemberModal">
<text class="close-text">✕</text>
</view>
</view>
<view class="modal-body">
<view class="member-detail">
<view class="detail-row">
<text class="detail-label">会员名称:</text>
<text class="detail-value">{{currentMemberDetail && currentMemberDetail.huiyuanming}}</text>
</view>
<view class="detail-row">
<text class="detail-label">到期时间:</text>
<text class="detail-value">{{currentMemberDetail && currentMemberDetail.daoqi}}</text>
</view>
<view class="detail-row">
<text class="detail-label">剩余天数:</text>
<text class="detail-value">{{formatRemainTime(currentMemberDetail && currentMemberDetail.daoqi)}}</text>
</view>
</view>
</view>
</view>
</view>
<!-- ❌ 删除“进入提示弹窗”整个区块 -->
<!-- ======================= -->
<!-- 支付加载动画(原有) -->
<!-- ======================= -->
<view class="tech-loading" wx:if="{{payLoading}}">
<view class="loading-backdrop"></view>
<view class="loading-content">
<view class="loading-spinner">
<view class="spinner-ring ring-1"></view>
<view class="spinner-ring ring-2"></view>
<view class="spinner-ring ring-3"></view>
<view class="spinner-core"></view>
<view class="spinner-energy"></view>
</view>
<text class="loading-text">{{loadingText}}</text>
<text class="loading-subtext">正在连接支付系统...</text>
</view>
</view>
<!-- ======================= -->
<!-- 底部机甲装饰 -->
<!-- ======================= -->
<view class="tech-footer">
<view class="footer-line"></view>
<view class="footer-text">星阙网络 © 科技</view>
</view> </view>
</view> </view>
<!-- 通知组件 --> <!-- 支付方式 -->
<global-notification id="global-notification" /> <view class="modal-mask" wx:if="{{showPayMethodModal}}" bindtap="hidePayMethodModal">
<view class="modal-panel" catchtap="stopPropagation">
<text class="modal-title">选择支付方式</text>
<view class="pay-method-item" bindtap="onPayMethodSelect" data-method="wx">
<text class="pay-method-name">微信支付</text>
<text class="pay-method-desc">安全快捷</text>
</view>
<view class="pay-method-item" bindtap="onPayMethodSelect" data-method="balance">
<text class="pay-method-name">余额抵扣</text>
<text class="pay-method-desc">使用佣金或分红</text>
</view>
</view>
</view>
<!-- 🆕 统一弹窗组件 --> <view class="modal-mask" wx:if="{{showBalanceModal}}" bindtap="hideBalanceModal">
<popup-notice id="popupNotice" /> <view class="modal-panel" catchtap="stopPropagation">
<text class="modal-title">选择抵扣身份</text>
<view wx:for="{{balanceOptions}}" wx:key="id" class="balance-item" bindtap="onBalanceSelect" data-id="{{item.id}}">
<text>{{item.jieshao}}</text>
<text class="balance-need">需¥{{item.xuyao}}</text>
</view>
</view>
</view>
<view class="modal-mask" wx:if="{{showConfirmModal}}" bindtap="hideConfirmModal">
<view class="modal-panel" catchtap="stopPropagation">
<text class="modal-title">确认抵扣</text>
<view class="confirm-row"><text>身份</text><text>{{selectedBalanceInfo.jieshao}}</text></view>
<view class="confirm-row"><text>金额</text><text>¥{{selectedBalanceInfo.xuyao}}</text></view>
<view class="modal-actions">
<view class="modal-btn cancel" bindtap="hideConfirmModal">取消</view>
<view class="modal-btn confirm" bindtap="confirmBalancePay">确认支付</view>
</view>
</view>
</view>
<view class="modal-mask" wx:if="{{showMemberModal}}" bindtap="hideMemberModal">
<view class="modal-panel" catchtap="stopPropagation">
<text class="modal-title">会员详情</text>
<view class="confirm-row"><text>名称</text><text>{{currentMemberDetail.huiyuanming}}</text></view>
<view class="confirm-row"><text>到期</text><text>{{currentMemberDetail.daoqi}}</text></view>
<view class="confirm-row"><text>剩余</text><text>{{formatRemainTime(currentMemberDetail.daoqi)}}</text></view>
</view>
</view>
<view class="loading-mask" wx:if="{{payLoading}}">
<view class="loading-box">
<view class="loading-spinner"></view>
<text>{{loadingText}}</text>
</view>
</view>
<global-notification id="global-notification" />
<popup-notice id="popupNotice" />
File diff suppressed because it is too large. Load diff
+254 -153
View File
@@ -1,6 +1,6 @@
// pages/dashouzhongxin/dashouzhongxin.js // pages/dashouzhongxin/dashouzhongxin.js
import { createPage, request, isRoleStatusActive, isCenterPageActive, syncRoleStatuses, syncProfileFields, syncGroupFields, ensureRoleOnCenterPage, clearCacheAndEnterNormal, lockPrimaryRole, migrateLegacyCenterRole, enterLockedRole, parseSceneOptions } from '../../utils/base-page.js' import { createPage, request, isRoleStatusActive, isCenterPageActive, syncRoleStatuses, syncProfileFields, syncGroupFields, ensureRoleOnCenterPage, clearCacheAndEnterNormal, lockPrimaryRole, migrateLegacyCenterRole, enterLockedRole, parseSceneOptions } from '../../utils/base-page.js'
import { resolveAvatarUrl, getDefaultAvatarUrl } from '../../utils/avatar.js' import { resolveAvatarUrl } from '../../utils/avatar.js'
import { fetchMyZhidingOrders, processZhidingList, filterZhidingBannerList } from '../../utils/zhiding-order.js' import { fetchMyZhidingOrders, processZhidingList, filterZhidingBannerList } from '../../utils/zhiding-order.js'
import { openPrivateChat, buildInviterPeerId } from '../../utils/im-user.js' import { openPrivateChat, buildInviterPeerId } from '../../utils/im-user.js'
import { isStaffMode, getStaffContext } from '../../utils/staff-api.js' import { isStaffMode, getStaffContext } from '../../utils/staff-api.js'
@@ -8,19 +8,18 @@ import { ensurePhoneAuth } from '../../utils/phone-auth.js'
import { import {
ICON_KEYS, ICON_KEYS,
resolveMiniappIcon, resolveMiniappIcon,
resolveConfiguredIcon,
refreshPindaoConfig, refreshPindaoConfig,
getPindaoConfig, getPindaoConfig,
resolvePindaoImages, resolvePindaoImages,
warmupPindaoConfig, warmupPindaoConfig,
PINDAO_ICON_FALLBACK, PINDAO_ICON_FALLBACK,
defaultIconRel,
ICON_FOLDER,
} from '../../utils/miniapp-icons.js' } from '../../utils/miniapp-icons.js'
import { getDefaultAvatarUrl } from '../../utils/avatar.js'
const PLATFORM_INVITE_CODE = '0000008RffVgKHMj7kQC' const PLATFORM_INVITE_CODE = '0000008RffVgKHMj7kQC'
const app = getApp()
/** 会员/保证金横幅 COS 兜底(后台未上传时仍显示) */
const FIGHTER_BANNER_VIP_FALLBACK = 'https://bintao-1308403501.cos.ap-guangzhou.myqcloud.com/uploads/images/20260512123427531240452.png'
const FIGHTER_BANNER_DEPOSIT_FALLBACK = 'https://bintao-1308403501.cos.ap-guangzhou.myqcloud.com/uploads/images/202605121234283091d3980.png'
Page(createPage({ Page(createPage({
data: { data: {
@@ -35,8 +34,7 @@ Page(createPage({
shangjiaCertified: false, shangjiaCertified: false,
totalAssets: '0.00', totalAssets: '0.00',
assetBreakdown: [], assetBreakdown: [],
pendingAuthList: [], moreFuncList: [],
showAuthSection: false,
inviteCode: '', inviteCode: '',
guanshiInviteCode: '', guanshiInviteCode: '',
zuzhangInviteCode: '', zuzhangInviteCode: '',
@@ -94,111 +92,58 @@ Page(createPage({
showRechargeBanners: false, showRechargeBanners: false,
showPindaoEntry: true, showPindaoEntry: true,
userBg: '',
qiepianBanner: '',
ksIcon: '',
penaltyTipIcon: '',
followExpanded: false,
followClass: '',
pendingPenaltyCount: 0,
myZhidingList: [], myZhidingList: [],
myZhidingCount: 0, myZhidingCount: 0,
showBadgeZone: false, orderNavXym: [],
}, tradeNavXym: [],
inviteNavXym: [],
_syncBadgeZoneFlags(patch = {}) {
const d = { ...this.data, ...patch };
const showBadgeZone = !!(
(d.chenghaoList && d.chenghaoList.length > 0)
|| (d.isGuanshi && d.guanshiChenghaoList && d.guanshiChenghaoList.length > 0)
|| (d.identityTagList && d.identityTagList.length > 0)
);
return { ...patch, showBadgeZone };
}, },
_buildImgUrls(ossImageUrl) { _buildImgUrls(ossImageUrl) {
const app = getApp(); const app = getApp();
const dsBase = ossImageUrl + 'beijing/dashouduan/'; const icon = (key, fallback) => resolveMiniappIcon(app, key, fallback || defaultIconRel(key));
const iconBase = ossImageUrl + 'beijing/dashouduan/dashoutubiaobeijing/';
const gsBase = ossImageUrl + 'beijing/guanshiduan/';
const khBase = ossImageUrl + 'beijing/kaohe/';
const icon = (key, fallback) => resolveMiniappIcon(app, key, fallback);
return { return {
pageBg: dsBase + 'page-bg.jpg', iconRefresh: icon(ICON_KEYS.ICON_REFRESH, 'beijing/guanshiduan/icon-refresh.png'),
userCardBg: dsBase + 'user-card-bg.png', iconCopy: icon(ICON_KEYS.FIGHTER_MINE_COPY, 'beijing/guanshiduan/icon-copy.png'),
vipCardBg: dsBase + 'vip-card-bg.jpg', iconEdit: icon(ICON_KEYS.FIGHTER_MINE_EDIT, 'beijing/dashouduan/dashoutubiaobeijing/icon-edit.jpg'),
assetPanelBg: dsBase + 'asset-panel-bg.png', iconPunish: icon(ICON_KEYS.FIGHTER_MINE_PUNISH, 'beijing/dashouduan/dashoutubiaobeijing/icon-punish.jpg'),
rankHubBg: dsBase + 'rank-hub-bg.png', iconMedal: icon(ICON_KEYS.FIGHTER_MINE_MEDAL, 'beijing/dashouduan/dashoutubiaobeijing/icon-medal.jpg'),
rankTileBg: dsBase + 'rank-tile-bg.png', iconBook: icon(ICON_KEYS.FIGHTER_MINE_BOOK, 'beijing/dashouduan/dashoutubiaobeijing/icon-book.jpg'),
funcPanelBg: dsBase + 'func-panel-bg.png', iconRank: icon(ICON_KEYS.FIGHTER_MINE_RANK, 'beijing/dashouduan/dashoutubiaobeijing/icon-rank.jpg'),
listBg: dsBase + 'list-card-bg.png', iconInvite: icon(ICON_KEYS.FIGHTER_MINE_INVITE, 'beijing/guanshiduan/icon-invite.png'),
topBg: iconBase + 'top-bg.jpg', iconContact: icon(ICON_KEYS.FIGHTER_MINE_CONTACT, 'beijing/guanshiduan/icon-contact.png'),
cardBg: iconBase + 'card-bg.jpg', iconKefu: icon(ICON_KEYS.FIGHTER_MINE_KEFU, 'beijing/tubiao/grzx_kefu.jpg'),
iconRefresh: icon(ICON_KEYS.ICON_REFRESH, gsBase + 'icon-refresh.png'), iconPindao: icon(ICON_KEYS.MINE_PINDAO, PINDAO_ICON_FALLBACK),
iconCopy: gsBase + 'icon-copy.png', iconKaoheDafen: icon(ICON_KEYS.FIGHTER_MINE_KAOHE_DAFEN, 'beijing/kaohe/daofen.png'),
iconVip: dsBase + 'icon-vip.png', iconKaoheJilu: icon(ICON_KEYS.FIGHTER_MINE_KAOHE_JILU, 'beijing/kaohe/jilu.png'),
iconArrowLight: dsBase + 'icon-arrow-light.png', iconKaoheZhongxin: icon(ICON_KEYS.FIGHTER_MINE_KAOHE_ZHONGXIN, 'beijing/kaohe/zhongxin.png'),
iconSectionAsset: dsBase + 'icon-section-asset.png', iconShangjia: icon(ICON_KEYS.FIGHTER_MINE_SHANGJIA, 'beijing/tubiao/grzx_shangjia.jpg'),
iconSectionRank: dsBase + 'icon-section-rank.png', iconDashouAuth: icon(ICON_KEYS.FIGHTER_MINE_DASHOU_AUTH, 'beijing/tubiao/grzx_dashou.jpg'),
iconSectionFunc: dsBase + 'icon-section-func.png', iconClear: icon(ICON_KEYS.FIGHTER_MINE_CLEAR, 'beijing/tubiao/grzx_qingchu.jpg'),
iconSectionGuanshi: dsBase + 'icon-section-guanshi.png', iconSwitch: icon(ICON_KEYS.FIGHTER_MINE_SWITCH, `${ICON_FOLDER}/fighter_mine_switch.png`),
iconSectionZuzhang: dsBase + 'icon-section-zuzhang.png', iconRecord: icon(ICON_KEYS.FIGHTER_MINE_RECORD, 'beijing/guanshiduan/icon-record.png'),
iconSectionKaohe: dsBase + 'icon-section-kaohe.png', bannerVip: icon(ICON_KEYS.FIGHTER_RECHARGE_MEMBER, `${ICON_FOLDER}/fighter_recharge_member.png`),
iconSectionMore: dsBase + 'icon-section-more.png', bannerDeposit: icon(ICON_KEYS.FIGHTER_RECHARGE_DEPOSIT, `${ICON_FOLDER}/fighter_recharge_deposit.png`),
iconRankDashou: dsBase + 'rank-dashou.png', avatarDefault: getDefaultAvatarUrl(app),
iconRankGuanshi: dsBase + 'rank-guanshi.png',
iconRankZuzhang: dsBase + 'rank-zuzhang.png',
iconRankShangjia: dsBase + 'rank-shangjia.png',
iconGame: iconBase + 'icon-game.jpg',
iconRecharge: iconBase + 'icon-recharge.jpg',
iconOrders: iconBase + 'icon-orders.jpg',
iconPunish: iconBase + 'icon-punish.jpg',
iconRank: iconBase + 'icon-rank.jpg',
iconInvite: gsBase + 'icon-invite.png',
iconMedal: iconBase + 'icon-medal.jpg',
iconEdit: iconBase + 'icon-edit.jpg',
iconBook: iconBase + 'icon-book.jpg',
iconArrow: gsBase + 'icon-arrow.png',
iconSub: gsBase + 'icon-sub.png',
iconRecord: gsBase + 'icon-record.png',
iconPoster: gsBase + 'icon-poster.png',
iconWithdraw: gsBase + 'icon-withdraw.png',
iconContact: gsBase + 'icon-contact.png',
avatarDefault: ossImageUrl + 'avatar/default.jpg',
iconClear: ossImageUrl + 'beijing/tubiao/grzx_qingchu.jpg',
iconSwitch: '/images/_exit.png',
iconKefu: ossImageUrl + 'beijing/tubiao/grzx_kefu.jpg',
iconKuaishou: ossImageUrl + 'beijing/tubiao/grzx_guanzhualong.jpg',
iconPindao: icon(ICON_KEYS.MINE_PINDAO, ossImageUrl + PINDAO_ICON_FALLBACK),
iconKaoheDafen: khBase + 'daofen.png',
iconKaoheJilu: khBase + 'jilu.png',
iconKaoheZhongxin: khBase + 'zhongxin.png',
iconShangjia: ossImageUrl + 'beijing/tubiao/grzx_shangjia.jpg',
iconDashouAuth: ossImageUrl + 'beijing/tubiao/grzx_dashou.jpg',
iconGuanshiAuth: ossImageUrl + 'beijing/tubiao/grzx_guanshi.jpg',
iconZuzhangAuth: ossImageUrl + 'beijing/tubiao/grzx_zuzhang.jpg',
kefuBannerBg: dsBase + 'kefu-banner-bg.png',
totalAssetBg: dsBase + 'total-asset-bg.png',
authPanelBg: dsBase + 'auth-panel-bg.png',
bannerVip: resolveConfiguredIcon(app, ICON_KEYS.FIGHTER_RECHARGE_MEMBER) || FIGHTER_BANNER_VIP_FALLBACK,
bannerDeposit: resolveConfiguredIcon(app, ICON_KEYS.FIGHTER_RECHARGE_DEPOSIT) || FIGHTER_BANNER_DEPOSIT_FALLBACK,
}; };
}, },
_applyRankBoardIcons(imgUrls) {
const iconMap = {
dashou: imgUrls.iconRankDashou,
guanshi: imgUrls.iconRankGuanshi,
zuzhang: imgUrls.iconRankZuzhang,
shangjia: imgUrls.iconRankShangjia,
};
return (this.data.rankBoardList || []).map((item) => ({
...item,
icon: iconMap[item.type] || imgUrls.iconRank,
}));
},
onLoad(options) { onLoad(options) {
const app = getApp(); const app = getApp();
const sys = wx.getSystemInfoSync(); const sys = wx.getSystemInfoSync();
const ossImageUrl = app.globalData.ossImageUrl || ''; const ossImageUrl = app.globalData.ossImageUrl || '';
const imgUrls = this._buildImgUrls(ossImageUrl); const imgUrls = this._buildImgUrls(ossImageUrl);
const nav = this._buildNavLists(app);
this.setData({ this.setData({
imgUrls, imgUrls,
rankBoardList: this._applyRankBoardIcons(imgUrls), ...nav,
statusBar: sys.statusBarHeight || 20, statusBar: sys.statusBarHeight || 20,
navBar: (sys.statusBarHeight || 20) + 44, navBar: (sys.statusBarHeight || 20) + 44,
}); });
@@ -225,15 +170,48 @@ Page(createPage({
this.syncConfiguredAssets(); this.syncConfiguredAssets();
}, },
_buildNavLists(app) {
const icon = (key) => resolveMiniappIcon(app, key, defaultIconRel(key));
return {
orderNavXym: [
{ name: '待完成', statusKey: 'jinxingzhong', icon: icon(ICON_KEYS.FIGHTER_ORDER_PENDING), badge: 0, showBadge: false },
{ name: '待结算', statusKey: 'jiesuanzhong', icon: icon(ICON_KEYS.FIGHTER_ORDER_SETTLING), badge: 0, showBadge: false },
{ name: '已完成', statusKey: 'yiwancheng', icon: icon(ICON_KEYS.FIGHTER_ORDER_DONE), badge: 0, showBadge: false },
{ name: '已关闭', statusKey: 'yituikuan', icon: icon(ICON_KEYS.FIGHTER_ORDER_CLOSED), badge: 0, showBadge: false },
],
tradeNavXym: [
{ name: '佣金记录', type: 'commission', icon: icon(ICON_KEYS.FIGHTER_TRADE_COMMISSION) },
{ name: '提现记录', type: 'withdraw', icon: icon(ICON_KEYS.FIGHTER_TRADE_WITHDRAW) },
{ name: '结算记录', type: 'settle', icon: icon(ICON_KEYS.FIGHTER_TRADE_SETTLE) },
{ name: '扣款记录', type: 'deduct', icon: icon(ICON_KEYS.FIGHTER_TRADE_DEDUCT) },
{ name: '充值记录', type: 'recharge', icon: icon(ICON_KEYS.FIGHTER_TRADE_RECHARGE) },
],
inviteNavXym: [
{ name: '我的下级', action: 'subordinate', icon: icon(ICON_KEYS.FIGHTER_INVITE_SUBORDINATE) },
{ name: '推广海报', action: 'poster', icon: icon(ICON_KEYS.FIGHTER_INVITE_POSTER) },
{ name: '邀请码', action: 'inviteCode', icon: icon(ICON_KEYS.FIGHTER_INVITE_CODE) },
],
ksIcon: icon(ICON_KEYS.FIGHTER_KUAISHOU_CASH),
qiepianBanner: icon(ICON_KEYS.FIGHTER_MINE_QIEPIAN),
penaltyTipIcon: icon(ICON_KEYS.FIGHTER_MINE_PENALTY_TIP),
};
},
syncConfiguredAssets() { syncConfiguredAssets() {
const app = getApp(); const app = getApp();
const bannerVip = resolveConfiguredIcon(app, ICON_KEYS.FIGHTER_RECHARGE_MEMBER) || FIGHTER_BANNER_VIP_FALLBACK; const ossImageUrl = app.globalData.ossImageUrl || '';
const bannerDeposit = resolveConfiguredIcon(app, ICON_KEYS.FIGHTER_RECHARGE_DEPOSIT) || FIGHTER_BANNER_DEPOSIT_FALLBACK; const imgUrls = this._buildImgUrls(ossImageUrl);
const imgUrls = { ...this.data.imgUrls, bannerVip, bannerDeposit }; const nav = this._buildNavLists(app);
const bannerVip = imgUrls.bannerVip;
const bannerDeposit = imgUrls.bannerDeposit;
this.setData({ this.setData({
imgUrls, imgUrls,
...nav,
showRechargeBanners: !!(bannerVip || bannerDeposit), showRechargeBanners: !!(bannerVip || bannerDeposit),
showPindaoEntry: this.data.isDashou || this.data.isGuanshi || this.data.isZuzhang || this.data.isKaoheguan, // showPindaoEntry: ... || this.data.isKaoheguan 临时隐藏考核官
showPindaoEntry: this.data.isDashou || this.data.isGuanshi || this.data.isZuzhang,
}, () => {
this._buildMoreFuncList();
}); });
}, },
@@ -257,6 +235,7 @@ Page(createPage({
warmupPindaoConfig(app); warmupPindaoConfig(app);
this.checkRoleStatuses(); this.checkRoleStatuses();
this.syncConfiguredAssets(); this.syncConfiguredAssets();
this.loadPenaltyCount();
if (isCenterPageActive(this, 'isDashou', 'dashoustatus')) { if (isCenterPageActive(this, 'isDashou', 'dashoustatus')) {
if (!this.data.isDashou) this.setData({ isDashou: true }); if (!this.data.isDashou) this.setData({ isDashou: true });
ensureRoleOnCenterPage(this, 'dashou'); ensureRoleOnCenterPage(this, 'dashou');
@@ -299,8 +278,7 @@ Page(createPage({
layoutSparse: subRoleCount === 0, layoutSparse: subRoleCount === 0,
}, () => { }, () => {
this._updateTotalAssets(); this._updateTotalAssets();
this._updatePendingAuth(); this._buildMoreFuncList();
this.setData(this._syncBadgeZoneFlags());
}); });
if (isDashou) { if (isDashou) {
const uid = wx.getStorageSync('uid') || ''; const uid = wx.getStorageSync('uid') || '';
@@ -326,43 +304,82 @@ Page(createPage({
total += this._parseMoney(d.ketixian); total += this._parseMoney(d.ketixian);
breakdown.push({ label: '组长余额', amount: d.ketixian || '0.00' }); breakdown.push({ label: '组长余额', amount: d.ketixian || '0.00' });
} }
if (d.isKaoheguan) { // 临时隐藏考核官余额展示,恢复时取消注释
total += this._parseMoney(d.kaoheYue); // if (d.isKaoheguan) {
breakdown.push({ label: '考核余额', amount: d.kaoheYue || '0.00' }); // total += this._parseMoney(d.kaoheYue);
} // breakdown.push({ label: '考核余额', amount: d.kaoheYue || '0.00' });
// }
this.setData({ totalAssets: total.toFixed(2), assetBreakdown: breakdown }); this.setData({ totalAssets: total.toFixed(2), assetBreakdown: breakdown });
}, },
/** 打手端:已认证不展示;商家始终第一位 */ /** 更多功能:常用优先,按身份动态展示 */
_updatePendingAuth() { _buildMoreFuncList() {
const d = this.data; const d = this.data;
const img = d.imgUrls || {}; const img = d.imgUrls || {};
const list = []; const list = [];
list.push({ const push = (action, name, icon, extra = {}) => {
type: 'shangjia', list.push({ action, name, icon, ...extra });
name: '商家', };
icon: img.iconShangjia,
tag: d.shangjiaCertified ? '进入商家端' : '去认证', if (d.isZuzhang) {
done: d.shangjiaCertified, push('goToYaoqingGuanshi', '邀请管事', img.iconInvite);
});
list.push({
type: 'staff',
name: '商家客服',
icon: img.iconKefu || img.iconShangjia,
tag: isStaffMode() ? '进入工作台' : '去入驻',
done: isStaffMode(),
});
if (!d.isGuanshi) {
list.push({ type: 'guanshi', name: '管事', icon: img.iconGuanshiAuth, tag: '去认证' });
} }
// 组长由后台添加,前端不再展示「组长认证」入口 push('contactInviter', '联系管事', img.iconInvite);
if (d.isGuanshi) {
push('contactZuzhang', '联系组长', img.iconContact);
}
push('goToKefu', '在线客服', img.iconKefu);
push('onTapShangjiaAuth', d.shangjiaCertified ? '进入商家端' : '商家认证', img.iconShangjia);
push('onTapStaffAuth', isStaffMode() ? '商家客服工作台' : '商家客服入驻', img.iconKefu || img.iconShangjia);
if (d.showPindaoEntry) {
push('openPindaoModal', '频道', img.iconPindao);
}
push('goToMyPunishment', '我的处罚', img.iconPunish);
// push('goToKaohe', '考核金牌', img.iconMedal); // 临时隐藏,恢复时取消注释
push('goToDashouExam', '接单考试', img.iconBook);
push('goToRanking', '总排行榜', img.iconRank, { rankType: 'dashou' });
// 会员记录 / 分红记录已合并至「佣金记录」页 Tab 切换
// 临时隐藏考核官入口,恢复时取消注释
// if (d.isKaoheguan) {
// push('goToKaoheDafen', '考核打分', img.iconKaoheDafen);
// push('goToKaoheJilu', '考核记录', img.iconKaoheJilu);
// push('goToKaoheZhongxin', '考核中心', img.iconKaoheZhongxin);
// }
if (!d.isDashou) { if (!d.isDashou) {
list.push({ type: 'dashou', name: '接单员', icon: img.iconDashouAuth, tag: '去认证' }); push('goToAuth', '接单员认证', img.iconDashouAuth, { authType: 'dashou' });
}
push('goToRules', '用户规则', img.iconBook);
push('switchToNormal', '返回点单端', img.iconSwitch);
push('clearCache', '退出登录', img.iconClear);
this.setData({ moreFuncList: list });
},
onMoreFuncTap(e) {
const { action, authType, rankType } = e.currentTarget.dataset;
if (action === 'goToAuth' && authType) {
this.goToAuth({ currentTarget: { dataset: { type: authType } } });
return;
}
if (action === 'goToRanking') {
this.goToRanking({ currentTarget: { dataset: { type: rankType || 'dashou' } } });
return;
}
if (action === 'onTapStaffAuth') {
this.onTapAuthItem({ currentTarget: { dataset: { type: 'staff' } } });
return;
}
if (action === 'onTapShangjiaAuth') {
this.onTapShangjiaAuth();
return;
}
if (typeof this[action] === 'function') {
this[action]();
} }
this.setData({
pendingAuthList: list,
showAuthSection: list.length > 0,
});
}, },
async refreshAllInfo(showToast = true) { async refreshAllInfo(showToast = true) {
@@ -429,7 +446,7 @@ Page(createPage({
...(d.zuzhang || []), ...(d.zuzhang || []),
...(d.guanshi || []), ...(d.guanshi || []),
]; ];
this.setData(this._syncBadgeZoneFlags({ identityTagList: merged })); this.setData({ identityTagList: merged });
} }
} catch (e) { } catch (e) {
/* 静默 */ /* 静默 */
@@ -567,7 +584,7 @@ Page(createPage({
data: { role: 'guanshi' }, data: { role: 'guanshi' },
}); });
if (res && res.data.code === 0 && res.data.data) { if (res && res.data.code === 0 && res.data.data) {
this.setData(this._syncBadgeZoneFlags({ guanshiChenghaoList: res.data.data.chenghao_list || [] })); this.setData({ guanshiChenghaoList: res.data.data.chenghao_list || [] });
} }
} catch (e) {} } catch (e) {}
}, },
@@ -729,12 +746,15 @@ Page(createPage({
goToInviteUser() { wx.navigateTo({ url: '/pages/invite-fighter/invite-fighter' }); }, goToInviteUser() { wx.navigateTo({ url: '/pages/invite-fighter/invite-fighter' }); },
goToMySubordinate() { wx.navigateTo({ url: '/pages/my-fighter/my-fighter' }); }, goToMySubordinate() { wx.navigateTo({ url: '/pages/my-fighter/my-fighter' }); },
goToRechargeRecord() { wx.navigateTo({ url: '/pages/recharge-log/recharge-log' }); }, goToRechargeRecord() { wx.navigateTo({ url: '/pages/recharge-log/recharge-log?tab=guanshi' }); },
goToCommissionLog(tab = 'dashou') {
wx.navigateTo({ url: `/pages/recharge-log/recharge-log?tab=${tab}` });
},
goToGuanshiRanking() { goToGuanshiRanking() {
wx.navigateTo({ url: '/pages/fighter-rank/fighter-rank?type=guanshi' }); wx.navigateTo({ url: '/pages/fighter-rank/fighter-rank?type=guanshi' });
}, },
goToPromoPoster() { wx.navigateTo({ url: '/pages/poster/poster' }); }, goToPromoPoster() { wx.navigateTo({ url: '/pages/poster/poster' }); },
goToFenhongJilu() { wx.navigateTo({ url: '/pages/leader-bonus-log/leader-bonus-log' }); }, goToFenhongJilu() { wx.navigateTo({ url: '/pages/recharge-log/recharge-log?tab=zuzhang' }); },
goToYaoqingGuanshi() { wx.navigateTo({ url: '/pages/invite-manager/invite-manager' }); }, goToYaoqingGuanshi() { wx.navigateTo({ url: '/pages/invite-manager/invite-manager' }); },
goToGuanshiAuthPage() { wx.navigateTo({ url: '/pages/verify/verify?type=guanshi' }); }, goToGuanshiAuthPage() { wx.navigateTo({ url: '/pages/verify/verify?type=guanshi' }); },
@@ -771,17 +791,17 @@ Page(createPage({
}); });
if (res && res.data.code === 0 && res.data.data) { if (res && res.data.code === 0 && res.data.data) {
const list = res.data.data.chenghao_list || []; const list = res.data.data.chenghao_list || [];
this.setData(this._syncBadgeZoneFlags({ chenghaoList: list })); this.setData({ chenghaoList: list });
const app = getApp(); const app = getApp();
app.globalData.chenghaoList = list; app.globalData.chenghaoList = list;
} else { } else {
this.setData(this._syncBadgeZoneFlags({ chenghaoList: [] })); this.setData({ chenghaoList: [] });
} }
} catch (e) { } catch (e) {
} }
}, },
// 联系邀请人 // 联系管事(邀请人)
async contactInviter() { async contactInviter() {
wx.showLoading({ title: '获取邀请人...', mask: true }); wx.showLoading({ title: '获取邀请人...', mask: true });
try { try {
@@ -1149,9 +1169,7 @@ Page(createPage({
} }
wx.navigateTo({ url: '/pages/verify/verify?type=shangjia' }); wx.navigateTo({ url: '/pages/verify/verify?type=shangjia' });
}, },
goToReceiveOrder() { goToReceiveOrder() { wx.switchTab({ url: '/pages/accept-order/accept-order' }) },
wx.switchTab({ url: '/pages/accept-order/accept-order' });
},
async loadMyZhidingOrders() { async loadMyZhidingOrders() {
if (!isCenterPageActive(this, 'isDashou', 'dashoustatus')) return; if (!isCenterPageActive(this, 'isDashou', 'dashoustatus')) return;
@@ -1177,18 +1195,101 @@ Page(createPage({
}); });
}, },
openZhidingDetailFromMine(e) {
const item = e.currentTarget.dataset.item;
const id = item?.dingdan_id || e.currentTarget.dataset.id;
if (!id) return;
getApp().globalData._acceptOrderHighlight = id;
wx.switchTab({
url: '/pages/accept-order/accept-order',
fail: () => wx.showToast({ title: '跳转失败', icon: 'none' }),
});
},
goToDashouExam() { wx.navigateTo({ url: '/pages/dashou-exam/dashou-exam' }) }, goToDashouExam() { wx.navigateTo({ url: '/pages/dashou-exam/dashou-exam' }) },
goToMyOrders() { wx.switchTab({ url: '/pages/fighter-orders/fighter-orders' }) },
goToOrdersWithStatus(e) {
const statusKey = e.currentTarget.dataset.status;
if (statusKey) {
getApp().globalData._fighterOrdersStatusKey = statusKey;
}
wx.switchTab({ url: '/pages/fighter-orders/fighter-orders' });
},
goToAllOrders() {
getApp().globalData._fighterOrdersStatusKey = 'all';
wx.switchTab({ url: '/pages/fighter-orders/fighter-orders' });
},
goToTradeNav(e) {
const type = e.currentTarget.dataset.type;
if (type === 'commission') {
this.goToCommissionLog('dashou');
return;
}
if (type === 'recharge') {
if (this.data.isGuanshi) {
this.goToCommissionLog('guanshi');
} else {
this.onComingSoon();
}
return;
}
if (type === 'withdraw') {
wx.navigateTo({ url: '/pages/withdraw/withdraw-records' });
return;
}
if (type === 'deduct') {
wx.navigateTo({ url: '/pages/fighter-ledger/fighter-ledger?type=deduct' });
return;
}
wx.navigateTo({ url: `/pages/fighter-ledger/fighter-ledger?type=${type}` });
},
goToWalletDetail() {
this.goToCommissionLog('dashou');
},
onInviteNavTap(e) {
if (!this.data.isGuanshi) {
this.goToGuanshiAuthPage();
return;
}
const action = e.currentTarget.dataset.action;
if (action === 'subordinate') {
this.goToMySubordinate();
return;
}
if (action === 'poster') {
this.goToPromoPoster();
return;
}
if (action === 'inviteCode') {
this.goToInviteUser();
}
},
onComingSoon() {
wx.showToast({ title: '该功能待开发', icon: 'none' });
},
toggleFollowKuaishou() {
const next = !this.data.followExpanded;
this.setData({ followExpanded: next, followClass: next ? 'expanded' : '' });
},
onQiepianTap() {
this.onComingSoon();
},
async loadPenaltyCount() {
if (!this.data.isDashou && !this.data.isGuanshi) return;
try {
const res = await request({ url: '/yonghu/cffktjhq', method: 'POST' });
const body = res?.data;
if (body && (body.code === 200 || body.code === 0) && body.data) {
const d = body.data;
const cnt = Number(d.daichuli_fakuan || d.fakuan_wait || d.pending || 0);
this.setData({ pendingPenaltyCount: cnt > 0 ? cnt : 0 });
}
} catch (e) {
/* ignore */
}
},
goToMyPunishment() { wx.navigateTo({ url: '/pages/penalty/penalty/penalty' }) },
async loadExamStatus() { async loadExamStatus() {
try { try {
const res = await request({ url: '/jituan/dashou-exam/status', method: 'POST' }); const res = await request({ url: '/jituan/dashou-exam/status', method: 'POST' });
@@ -1202,9 +1303,9 @@ Page(createPage({
} }
} catch (e) { /* 静默 */ } } catch (e) { /* 静默 */ }
}, },
goToMyOrders() { wx.navigateTo({ url: '/pages/fighter-orders/fighter-orders' }) }, goToRecharge() { wx.navigateTo({ url: '/pages/fighter-recharge/fighter-recharge' }); },
goToMyPunishment() { wx.navigateTo({ url: '/pages/penalty/penalty/penalty' }) }, goToRechargeMember() { wx.navigateTo({ url: '/pages/fighter-recharge/fighter-recharge' }); },
goToRecharge() { wx.navigateTo({ url: '/pages/fighter-recharge/fighter-recharge' }) }, goToRechargeDeposit() { wx.navigateTo({ url: '/pages/fighter-recharge/fighter-deposit' }); },
goToRanking(e) { goToRanking(e) {
const type = e?.currentTarget?.dataset?.type || 'dashou'; const type = e?.currentTarget?.dataset?.type || 'dashou';
wx.navigateTo({ url: `/pages/fighter-rank/fighter-rank?type=${type}` }); wx.navigateTo({ url: `/pages/fighter-rank/fighter-rank?type=${type}` });
+2 -3
View File
@@ -3,11 +3,10 @@
"global-notification": "/components/global-notification/global-notification", "global-notification": "/components/global-notification/global-notification",
"chenghao-tag": "/components/chenghao-tag/chenghao-tag", "chenghao-tag": "/components/chenghao-tag/chenghao-tag",
"tab-bar": "/tab-bar/index", "tab-bar": "/tab-bar/index",
"pindao-modal": "/components/pindao-modal/pindao-modal", "pindao-modal": "/components/pindao-modal/pindao-modal"
"kefu-float": "/components/kefu-float/kefu-float"
}, },
"navigationStyle": "custom", "navigationStyle": "custom",
"backgroundColor": "#f5f3ff", "backgroundColor": "#fff8e1",
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"enablePullDownRefresh": false, "enablePullDownRefresh": false,
"onReachBottomDistance": 50 "onReachBottomDistance": 50
+74 -138
View File
@@ -14,17 +14,16 @@
<view class="btn-bg unreg-btn" bindtap="onRegister"><text class="unreg-btn-text">立即注册</text></view> <view class="btn-bg unreg-btn" bindtap="onRegister"><text class="unreg-btn-text">立即注册</text></view>
<view class="unreg-btn-secondary" bindtap="quickRegisterAsPlatform"><text>平台直签注册</text></view> <view class="unreg-btn-secondary" bindtap="quickRegisterAsPlatform"><text>平台直签注册</text></view>
<view class="unreg-link" bindtap="switchToNormal"><text>返回点单端</text></view> <view class="unreg-link" bindtap="switchToNormal"><text>返回点单端</text></view>
<view class="unreg-link" bindtap="clearCache"><text>清除缓存,重新登录</text></view> <view class="unreg-link" bindtap="clearCache"><text>退出登录</text></view>
</view> </view>
</view> </view>
<tab-bar/> <tab-bar/>
<kefu-float bottom="200rpx" />
</view> </view>
</block> </block>
<!-- 已注册 --> <!-- 已注册 -->
<block wx:else> <block wx:else>
<view class="user-page"> <view class="user-page xym-user">
<view class="page-header"> <view class="page-header">
<view class="status-bar" style="height:{{statusBar}}px"></view> <view class="status-bar" style="height:{{statusBar}}px"></view>
<view class="nav-bar" style="height:{{navBar - statusBar}}px"> <view class="nav-bar" style="height:{{navBar - statusBar}}px">
@@ -40,11 +39,10 @@
refresher-enabled="{{true}}" refresher-enabled="{{true}}"
refresher-threshold="80" refresher-threshold="80"
refresher-default-style="black" refresher-default-style="black"
refresher-background="#f5f3ff" refresher-background="#fff8e1"
refresher-triggered="{{scrollViewRefreshing}}" refresher-triggered="{{scrollViewRefreshing}}"
bindrefresherrefresh="onPullDownRefresh" bindrefresherrefresh="onPullDownRefresh"
> >
<!-- 用户信息 -->
<view class="user-info flexb"> <view class="user-info flexb">
<view class="flex"> <view class="flex">
<image class="avatar" src="{{avatarUrl || imgUrls.avatarDefault}}" mode="aspectFill" bindtap="previewAvatar"/> <image class="avatar" src="{{avatarUrl || imgUrls.avatarDefault}}" mode="aspectFill" bindtap="previewAvatar"/>
@@ -56,10 +54,11 @@
<text class="role-tag">接单员</text> <text class="role-tag">接单员</text>
<text class="role-tag" wx:if="{{isGuanshi}}">管事</text> <text class="role-tag" wx:if="{{isGuanshi}}">管事</text>
<text class="role-tag" wx:if="{{isZuzhang}}">组长</text> <text class="role-tag" wx:if="{{isZuzhang}}">组长</text>
<text class="role-tag" wx:if="{{isKaoheguan}}">考核</text> <!-- 临时隐藏考核身份标签,恢复时取消注释 -->
<!-- <text class="role-tag" wx:if="{{isKaoheguan}}">考核</text> -->
</view> </view>
</view> </view>
<view class="sn-row" bindtap="copyUid"> <view class="sn-row flex" bindtap="copyUid">
<text class="sn">ID: {{uid || '--'}}</text> <text class="sn">ID: {{uid || '--'}}</text>
<image class="copy-ico" src="{{imgUrls.iconCopy}}" mode="aspectFit"/> <image class="copy-ico" src="{{imgUrls.iconCopy}}" mode="aspectFit"/>
</view> </view>
@@ -71,17 +70,7 @@
</view> </view>
</view> </view>
<!-- 被指定订单(紧凑条,不占满屏) --> <view class="badge-zone" wx:if="{{chenghaoList.length > 0 || (isGuanshi && guanshiChenghaoList.length > 0) || identityTagList.length > 0}}">
<view class="my-zhiding-mine-strip" wx:if="{{myZhidingCount > 0 && isDashou}}" bindtap="goToZhidingFromMine">
<view class="my-zhiding-mine-strip-left">
<text class="my-zhiding-mine-badge">指定</text>
<text class="my-zhiding-mine-count">{{myZhidingCount}}单待接待</text>
</view>
<text class="my-zhiding-mine-arrow">去处理 ›</text>
</view>
<!-- 称号 -->
<view class="badge-zone" wx:if="{{showBadgeZone}}">
<scroll-view scroll-x class="badge-scroll" wx:if="{{chenghaoList.length > 0}}"> <scroll-view scroll-x class="badge-scroll" wx:if="{{chenghaoList.length > 0}}">
<view class="badge-tag-wrap" wx:for="{{chenghaoList}}" wx:key="index"> <view class="badge-tag-wrap" wx:for="{{chenghaoList}}" wx:key="index">
<chenghao-tag mingcheng="{{item.mingcheng}}" texiaoJson="{{item.texiao_json}}"/> <chenghao-tag mingcheng="{{item.mingcheng}}" texiaoJson="{{item.texiao_json}}"/>
@@ -99,9 +88,8 @@
</scroll-view> </scroll-view>
</view> </view>
<!-- 佣金/资产卡(逍遥梦 wallet-card) -->
<view class="wallet-card flexb"> <view class="wallet-card flexb">
<view class="wallet-left"> <view bindtap="goToWalletDetail">
<view class="w-label">我的佣金(元)</view> <view class="w-label">我的佣金(元)</view>
<view class="w-num">¥{{totalAssets}}</view> <view class="w-num">¥{{totalAssets}}</view>
<view class="w-sub">可提现 ¥{{yongjin || '0.00'}} · 查看</view> <view class="w-sub">可提现 ¥{{yongjin || '0.00'}} · 查看</view>
@@ -112,17 +100,19 @@
</view> </view>
</view> </view>
<!-- 会员充值 + 保证金(无后台图时显示文字按钮) -->
<view class="banner-row flex" wx:if="{{showRechargeBanners}}"> <view class="banner-row flex" wx:if="{{showRechargeBanners}}">
<image wx:if="{{imgUrls.bannerVip}}" class="banner-img" src="{{imgUrls.bannerVip}}" mode="widthFix" bindtap="goToRecharge"/> <image wx:if="{{imgUrls.bannerVip}}" class="banner-img" src="{{imgUrls.bannerVip}}" mode="widthFix" bindtap="goToRechargeMember"/>
<image wx:if="{{imgUrls.bannerDeposit}}" class="banner-img" src="{{imgUrls.bannerDeposit}}" mode="widthFix" bindtap="goToRecharge"/> <image wx:if="{{imgUrls.bannerDeposit}}" class="banner-img" src="{{imgUrls.bannerDeposit}}" mode="widthFix" bindtap="goToRechargeDeposit"/>
</view> </view>
<view class="recharge-text-row flex" wx:else> <view class="recharge-text-row flex" wx:else>
<view class="recharge-text-btn" catchtap="goToRecharge">充值会员</view> <view class="recharge-text-btn" catchtap="goToRechargeMember">充值会员</view>
<view class="recharge-text-btn" catchtap="goToRecharge">充值保证金</view> <view class="recharge-text-btn" catchtap="goToRechargeDeposit">充值保证金</view>
</view>
<view class="qiepian-wrap" bindtap="onQiepianTap">
<image class="qiepian-banner" src="{{qiepianBanner}}" mode="widthFix"/>
</view> </view>
<!-- 资产统计(逍遥梦 freeze-row) -->
<view class="freeze-row flexa"> <view class="freeze-row flexa">
<view class="freeze-col flexmc"> <view class="freeze-col flexmc">
<text class="freeze-num">{{jinfen || '0'}}</text> <text class="freeze-num">{{jinfen || '0'}}</text>
@@ -138,132 +128,78 @@
</view> </view>
</view> </view>
<!-- 角色扩展统计(从左往右排列,不均分撑满) --> <view wx:if="{{pendingPenaltyCount > 0}}" class="tip-bar flexb" bindtap="goToMyPunishment">
<view class="stats-bar" wx:if="{{isGuanshi || isZuzhang || isKaoheguan}}"> <view class="flex">
<view class="stat-cell" wx:if="{{isGuanshi}}"><text class="stat-val">{{yaoqingzongshu || 0}}</text><text class="stat-lbl">邀请总数</text></view> <image class="tip-ico" src="{{penaltyTipIcon}}" mode="aspectFit"/>
<view class="stat-cell" wx:if="{{isGuanshi}}"><text class="stat-val">{{yichongzhiDashou || 0}}</text><text class="stat-lbl">已充值</text></view> <text>你有{{pendingPenaltyCount}}条罚单待处理, 前往处理</text>
<view class="stat-cell" wx:if="{{isGuanshi}}"><text class="stat-val">{{fenyongzonge || '0.00'}}</text><text class="stat-lbl">分成总额</text></view> </view>
<view class="stat-cell" wx:if="{{isGuanshi}}"><text class="stat-val">{{zhuanhualv || 0}}%</text><text class="stat-lbl">有效率</text></view> <text class="tip-arrow">›</text>
<view class="stat-cell" wx:if="{{isZuzhang}}"><text class="stat-val">{{guanshiCount || 0}}</text><text class="stat-lbl">邀请管事</text></view>
<view class="stat-cell" wx:if="{{isZuzhang}}"><text class="stat-val">{{fenhongZonge || '0.00'}}</text><text class="stat-lbl">分红总额</text></view>
<view class="stat-cell" wx:if="{{isKaoheguan}}"><text class="stat-val">{{shenheZongshu || 0}}</text><text class="stat-lbl">审核总数</text></view>
<view class="stat-cell" wx:if="{{isKaoheguan}}"><text class="stat-val">{{tongguoZongshu || 0}}</text><text class="stat-lbl">通过总数</text></view>
<view class="stat-cell" wx:if="{{isKaoheguan}}"><text class="stat-val">{{pendingShenheCount || 0}}</text><text class="stat-lbl">待审核</text></view>
</view> </view>
<!-- 接单服务(对应逍遥梦「我的订单」四宫格) --> <view class="my-box shadow order-nav-box">
<view class="panel shadow"> <view class="panel-title flexb" bindtap="goToAllOrders">
<view class="panel-title flexb"><text class="lg">接单服务</text></view> <text class="lg">我的订单</text>
<text class="muted">全部订单 ›</text>
</view>
<view class="order-nav"> <view class="order-nav">
<view class="nav-item flexmc" bindtap="goToReceiveOrder"> <view wx:for="{{orderNavXym}}" wx:key="name" class="nav-item" data-status="{{item.statusKey}}" bindtap="goToOrdersWithStatus">
<image class="nav-icon" src="{{imgUrls.iconGame}}" mode="aspectFit"/><text class="sm">抢单大厅</text> <view class="icon-wrap">
</view> <view wx:if="{{item.showBadge && item.badge > 0}}" class="nav-badge">{{item.badge}}</view>
<view class="nav-item flexmc" bindtap="goToMyOrders"> <image class="nav-icon" src="{{item.icon}}" mode="aspectFit"/>
<image class="nav-icon" src="{{imgUrls.iconOrders}}" mode="aspectFit"/><text class="sm">我的订单</text>
</view>
<view class="nav-item flexmc" bindtap="goToMyPunishment">
<image class="nav-icon" src="{{imgUrls.iconPunish}}" mode="aspectFit"/><text class="sm">我的处罚</text>
</view>
<view class="nav-item flexmc" bindtap="goToKaohe">
<image class="nav-icon" src="{{imgUrls.iconMedal}}" mode="aspectFit"/><text class="sm">考核金牌</text>
</view>
<view class="nav-item flexmc" bindtap="goToDashouExam">
<image class="nav-icon" src="{{imgUrls.iconBook}}" mode="aspectFit"/>
<text class="sm">接单考试</text>
<text wx:if="{{examEnabled}}" class="exam-tag {{examPassed ? 'exam-tag-pass' : 'exam-tag-pending'}}">{{examPassed ? '已通过' : '待考试'}}</text>
</view>
</view>
</view>
<!-- 荣耀排行榜(横向滑动,省空间) -->
<view class="rank-hub panel shadow">
<view class="panel-title flexb">
<text class="lg">荣耀排行榜</text>
<text class="rank-hub-tip">TOP50</text>
</view>
<scroll-view scroll-x class="rank-hub-scroll" enhanced show-scrollbar="{{false}}">
<view class="rank-hub-track">
<view
wx:for="{{rankBoardList}}"
wx:key="type"
class="rank-tile {{item.themeClass}}"
bindtap="goToRanking"
data-type="{{item.type}}"
>
<view class="rank-tile-inner">
<image class="rank-tile-icon" src="{{item.icon}}" mode="aspectFit"/>
<view class="rank-tile-text">
<text class="rank-tile-name">{{item.name}}</text>
<text class="rank-tile-sub">{{item.sub}}</text>
</view>
<text class="rank-tile-go">进入</text>
</view>
</view> </view>
</view> <text class="sm">{{item.name}}</text>
</scroll-view>
</view>
<!-- 管事功能 -->
<view class="panel shadow" wx:if="{{isGuanshi}}">
<view class="panel-title"><text class="lg">管事功能</text></view>
<view class="func-grid">
<view class="func-item flexmc" bindtap="goToInviteUser"><image class="func-icon" src="{{imgUrls.iconInvite}}" mode="aspectFit"/><text class="func-txt">邀请用户</text></view>
<view class="func-item flexmc" bindtap="goToMySubordinate"><image class="func-icon" src="{{imgUrls.iconSub}}" mode="aspectFit"/><text class="func-txt">我的下级</text></view>
<view class="func-item flexmc" bindtap="goToRechargeRecord"><image class="func-icon" src="{{imgUrls.iconRecord}}" mode="aspectFit"/><text class="func-txt">会员记录</text></view>
<view class="func-item flexmc" bindtap="goToPromoPoster"><image class="func-icon" src="{{imgUrls.iconPoster}}" mode="aspectFit"/><text class="func-txt">推广海报</text></view>
<view class="func-item flexmc" bindtap="contactZuzhang"><image class="func-icon" src="{{imgUrls.iconContact}}" mode="aspectFit"/><text class="func-txt">联系组长</text></view>
</view>
</view>
<!-- 组长功能 -->
<view class="panel shadow" wx:if="{{isZuzhang}}">
<view class="panel-title"><text class="lg">组长功能</text></view>
<view class="func-grid">
<view class="func-item flexmc" bindtap="goToFenhongJilu"><image class="func-icon" src="{{imgUrls.iconRecord}}" mode="aspectFit"/><text class="func-txt">分红记录</text></view>
<view class="func-item flexmc" bindtap="goToYaoqingGuanshi"><image class="func-icon" src="{{imgUrls.iconInvite}}" mode="aspectFit"/><text class="func-txt">邀请管事</text></view>
</view>
</view>
<!-- 考核官功能 -->
<view class="panel shadow" wx:if="{{isKaoheguan}}">
<view class="panel-title"><text class="lg">考核官功能</text></view>
<view class="func-grid">
<view class="func-item flexmc" bindtap="goToKaoheDafen"><image class="func-icon" src="{{imgUrls.iconKaoheDafen}}" mode="aspectFit"/><text class="func-txt">考核打分</text></view>
<view class="func-item flexmc" bindtap="goToKaoheJilu"><image class="func-icon" src="{{imgUrls.iconKaoheJilu}}" mode="aspectFit"/><text class="func-txt">考核记录</text></view>
<view class="func-item flexmc" bindtap="goToKaoheZhongxin"><image class="func-icon" src="{{imgUrls.iconKaoheZhongxin}}" mode="aspectFit"/><text class="func-txt">考核中心</text></view>
</view>
</view>
<!-- 身份认证 -->
<view class="panel shadow" wx:if="{{showAuthSection}}">
<view class="panel-title"><text class="lg">身份认证</text></view>
<view class="func-grid">
<view class="func-item flexmc" wx:for="{{pendingAuthList}}" wx:key="type" bindtap="onTapAuthItem" data-type="{{item.type}}">
<image class="func-icon" src="{{item.icon}}" mode="aspectFit"/>
<text class="func-txt">{{item.name}}</text>
<text class="func-tag {{item.done ? 'func-tag-done' : ''}}">{{item.tag}}</text>
</view> </view>
</view> </view>
</view> </view>
<!-- 更多功能 --> <view class="my-box shadow trade-box">
<view class="panel shadow"> <view class="section-hd">交易明细</view>
<view class="panel-title"><text class="lg">更多功能</text></view> <view class="trade-list">
<view class="func-grid"> <view wx:for="{{tradeNavXym}}" wx:key="name" class="trade-item" data-type="{{item.type}}" bindtap="goToTradeNav">
<view class="func-item flexmc" bindtap="goToKefu"><image class="func-icon" src="{{imgUrls.iconKefu}}" mode="aspectFit"/><text class="func-txt">在线客服</text></view> <image class="trade-icon" src="{{item.icon}}" mode="aspectFit"/>
<view class="func-item flexmc" bindtap="goToGuanzhuKs"><image class="func-icon" src="{{imgUrls.iconKuaishou}}" mode="aspectFit"/><text class="func-txt">关注快手</text></view> <text class="sm">{{item.name}}</text>
<view class="func-item flexmc" wx:if="{{showPindaoEntry}}" bindtap="openPindaoModal"><image class="func-icon" src="{{imgUrls.iconPindao}}" mode="aspectFit"/><text class="func-txt">频道</text></view> </view>
<view class="func-item flexmc" bindtap="contactInviter"><image class="func-icon" src="{{imgUrls.iconInvite}}" mode="aspectFit"/><text class="func-txt">联系邀请人</text></view>
<view class="func-item flexmc" bindtap="goToRules"><image class="func-icon" src="{{imgUrls.iconBook}}" mode="aspectFit"/><text class="func-txt">用户规则</text></view>
<view class="func-item flexmc" bindtap="switchToNormal"><image class="func-icon" src="{{imgUrls.iconSwitch}}" mode="aspectFit"/><text class="func-txt">返回点单端</text></view>
<view class="func-item flexmc" bindtap="clearCache"><image class="func-icon" src="{{imgUrls.iconClear}}" mode="aspectFit"/><text class="func-txt">清除缓存</text></view>
</view> </view>
</view> </view>
<view class="my-box shadow invite-box">
<view class="section-hd">好友邀请</view>
<view class="invite-row">
<view wx:for="{{inviteNavXym}}" wx:key="name" class="invite-item" data-action="{{item.action}}" bindtap="onInviteNavTap">
<image class="invite-icon" src="{{item.icon}}" mode="aspectFit"/>
<text class="sm">{{item.name}}</text>
</view>
</view>
</view>
<view class="my-box shadow more-box">
<view class="section-hd">更多功能</view>
<view class="func-list">
<view
wx:for="{{moreFuncList}}"
wx:key="action"
class="func-item-xym"
bindtap="onMoreFuncTap"
data-action="{{item.action}}"
data-auth-type="{{item.authType}}"
data-rank-type="{{item.rankType}}"
>
<view class="func-icon-wrap"><image class="func-icon-xym" src="{{item.icon}}" mode="aspectFit"/></view>
<text class="func-txt-xym">{{item.name}}</text>
</view>
</view>
</view>
<view class="load-tip">— 已加载全部 —</view>
<view class="content-bottom"></view> <view class="content-bottom"></view>
</scroll-view> </scroll-view>
<view class="follow-kuaishou {{followClass}}" bindtap="toggleFollowKuaishou">
<image class="ks-icon" src="{{ksIcon}}" mode="aspectFit"/>
<text wx:if="{{followExpanded}}" class="ks-text" catchtap="goToGuanzhuKs">关注快手</text>
</view>
<tab-bar/> <tab-bar/>
<kefu-float bottom="200rpx" />
</view> </view>
</block> </block>
+13 -84
View File
@@ -1,7 +1,8 @@
/* 打手端个人中心 - 逍遥梦 UI(逻辑不变) */ /* 打手端个人中心 - 逍遥梦 UI(逻辑不变) */
@import '../../styles/dashou-xym-user.wxss';
page { page {
background: #f5f3ff; background: #fff8e1;
color: #333; color: #333;
} }
@@ -16,7 +17,7 @@ page {
flex-direction: column; flex-direction: column;
overflow: hidden; overflow: hidden;
box-sizing: border-box; box-sizing: border-box;
background: linear-gradient(180deg, #c4b5fd 0%, #fff 28%, #f5f3ff 100%); background: linear-gradient(180deg, #f7dc51 0%, #fff 28%, #fff8e1 100%);
position: relative; position: relative;
} }
@@ -24,6 +25,7 @@ page {
position: relative; position: relative;
z-index: 2; z-index: 2;
flex-shrink: 0; flex-shrink: 0;
background: linear-gradient(180deg, #f7dc51 0%, #ffd061 100%);
} }
.status-bar, .status-bar,
@@ -65,10 +67,6 @@ page {
padding-bottom: 0; padding-bottom: 0;
} }
.content-bottom {
height: 12rpx;
}
.refresh-float { .refresh-float {
position: fixed; position: fixed;
right: 24rpx; right: 24rpx;
@@ -126,7 +124,7 @@ page {
padding: 2rpx 12rpx; padding: 2rpx 12rpx;
border-radius: 8rpx; border-radius: 8rpx;
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
} }
.sn-row { .sn-row {
@@ -238,7 +236,7 @@ page {
border: 2rpx solid #fff; border: 2rpx solid #fff;
border-radius: 60rpx; border-radius: 60rpx;
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
white-space: nowrap; white-space: nowrap;
} }
@@ -272,8 +270,8 @@ page {
border-radius: 16rpx; border-radius: 16rpx;
font-size: 28rpx; font-size: 28rpx;
font-weight: 600; font-weight: 600;
color: #6d28d9; color: #492f00;
background: linear-gradient(180deg, #f5f3ff, #ffe8b8); background: linear-gradient(180deg, #fff8e1, #ffe8b8);
border: 1rpx solid rgba(201, 169, 98, 0.45); border: 1rpx solid rgba(201, 169, 98, 0.45);
} }
@@ -305,7 +303,7 @@ page {
.btn-bg { .btn-bg {
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
border-radius: 30px; border-radius: 30px;
color: #6d28d9; color: #492f00;
} }
.withdraw { .withdraw {
@@ -334,7 +332,7 @@ page {
.vip-strip-sub { .vip-strip-sub {
display: block; display: block;
font-size: 22rpx; font-size: 22rpx;
color: rgba(196, 181, 253, 0.65); color: rgba(252, 210, 112, 0.65);
margin-top: 4rpx; margin-top: 4rpx;
} }
@@ -344,39 +342,6 @@ page {
font-weight: 700; font-weight: 700;
} }
.stats-bar {
margin: 12rpx 30rpx 0;
padding: 16rpx 16rpx 8rpx;
background: #fdfcfa;
border-radius: 16rpx;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-content: flex-start;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.04);
}
.stat-cell {
width: 25%;
padding: 8rpx 0 12rpx;
box-sizing: border-box;
text-align: center;
}
.stat-val {
display: block;
font-size: 28rpx;
font-weight: 700;
color: #222;
}
.stat-lbl {
display: block;
font-size: 22rpx;
color: #999;
margin-top: 4rpx;
}
.panel { .panel {
margin: 20rpx 20rpx 12rpx; margin: 20rpx 20rpx 12rpx;
background: #fdfcfa; background: #fdfcfa;
@@ -552,7 +517,7 @@ page {
} }
.rank-theme-gold { .rank-theme-gold {
background: linear-gradient(135deg, #a8842a 0%, #c4b5fd 100%); background: linear-gradient(135deg, #a8842a 0%, #f5d563 100%);
} }
.rank-theme-gold .rank-tile-name, .rank-theme-gold .rank-tile-name,
@@ -608,7 +573,7 @@ page {
margin-bottom: 16rpx; margin-bottom: 16rpx;
} }
.unreg-btn-text { color: #6d28d9; } .unreg-btn-text { color: #492f00; }
.unreg-btn-secondary { .unreg-btn-secondary {
text-align: center; text-align: center;
@@ -644,7 +609,7 @@ page {
width: 60rpx; width: 60rpx;
height: 60rpx; height: 60rpx;
border: 4rpx solid rgba(0, 0, 0, 0.08); border: 4rpx solid rgba(0, 0, 0, 0.08);
border-top-color: #9333ea; border-top-color: #ffd061;
border-radius: 50%; border-radius: 50%;
animation: fighterSpin 0.8s linear infinite; animation: fighterSpin 0.8s linear infinite;
} }
@@ -652,39 +617,3 @@ page {
@keyframes fighterSpin { @keyframes fighterSpin {
to { transform: rotate(360deg); } to { transform: rotate(360deg); }
} }
.my-zhiding-mine-strip {
margin: 0 24rpx 16rpx;
padding: 20rpx 24rpx;
border-radius: 16rpx;
background: linear-gradient(90deg, #ff6b00, #ff4500);
border: 2rpx solid #ff3300;
box-shadow: 0 8rpx 24rpx rgba(255, 69, 0, 0.4);
display: flex;
align-items: center;
justify-content: space-between;
}
.my-zhiding-mine-strip:active { opacity: 0.92; }
.my-zhiding-mine-strip-left {
display: flex;
align-items: center;
gap: 12rpx;
}
.my-zhiding-mine-badge {
font-size: 22rpx;
font-weight: 800;
color: #ff4500;
background: #fff;
padding: 4rpx 14rpx;
border-radius: 999rpx;
}
.my-zhiding-mine-count {
font-size: 28rpx;
color: #fff;
font-weight: 700;
}
.my-zhiding-mine-arrow {
font-size: 26rpx;
color: #fff;
font-weight: 700;
}
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"navigationBarTitleText": "关注星阙", "navigationBarTitleText": "星之界",
"usingComponents": { "usingComponents": {
"global-notification": "/components/global-notification/global-notification" "global-notification": "/components/global-notification/global-notification"
}, },
@@ -1,6 +1,6 @@
@import '../../styles/shangjia-xym-common.wxss'; @import '../../styles/shangjia-xym-common.wxss';
page { background: #f5f3ff; } page { background: #fff8e1; }
.sub-scroll { height: calc(100vh - 120rpx); } .sub-scroll { height: calc(100vh - 120rpx); }
@@ -4,9 +4,9 @@
"popup-notice": "/components/popup-notice/popup-notice" "popup-notice": "/components/popup-notice/popup-notice"
}, },
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"navigationBarBackgroundColor": "#f5f3ff", "navigationBarBackgroundColor": "#f7dc51",
"navigationBarTitleText": "自定义发单", "navigationBarTitleText": "自定义发单",
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"backgroundColor": "#f5f5f5", "backgroundColor": "#fff8e1",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
@@ -159,7 +159,7 @@
<text class="field-optional">选填</text> <text class="field-optional">选填</text>
</view> </view>
<view class="switch-row"> <view class="switch-row">
<switch checked="{{commissionEnabled}}" bindchange="onCommissionToggle" color="#9333ea"/> <switch checked="{{commissionEnabled}}" bindchange="onCommissionToggle" color="#ffd061"/>
<text class="switch-label">{{commissionEnabled ? '已开启' : '未开启'}}</text> <text class="switch-label">{{commissionEnabled ? '已开启' : '未开启'}}</text>
</view> </view>
<input <input
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"navigationStyle": "custom", "navigationStyle": "custom",
"enablePullDownRefresh": true, "enablePullDownRefresh": true,
"backgroundColor": "#f5f3ff", "backgroundColor": "#fff8e1",
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"usingComponents": { "usingComponents": {
"global-notification": "/components/global-notification/global-notification", "global-notification": "/components/global-notification/global-notification",
+4 -4
View File
@@ -1,7 +1,7 @@
@import '../../styles/shangjia-xym-common.wxss'; @import '../../styles/shangjia-xym-common.wxss';
page { page {
background: #f5f3ff; background: #fff8e1;
} }
.sj-page--home { .sj-page--home {
@@ -85,13 +85,13 @@ page {
.dot.active { .dot.active {
width: 16rpx; width: 16rpx;
border-radius: 8rpx; border-radius: 8rpx;
background: #9333ea; background: #ffd061;
} }
.sj-notice-bar { .sj-notice-bar {
display: flex; display: flex;
align-items: center; align-items: center;
background: #f5f3ff; background: #fdf9db;
margin: 12rpx 24rpx 0; margin: 12rpx 24rpx 0;
border-radius: 10rpx; border-radius: 10rpx;
padding: 10rpx 16rpx; padding: 10rpx 16rpx;
@@ -166,7 +166,7 @@ page {
.sj-fadan-big-title { .sj-fadan-big-title {
font-size: 30rpx; font-size: 30rpx;
font-weight: 700; font-weight: 700;
color: #6d28d9; color: #492f00;
} }
.sj-fadan-big-sub { .sj-fadan-big-sub {
@@ -1,5 +1,5 @@
{ {
"navigationStyle": "custom", "navigationStyle": "custom",
"backgroundColor": "#f5f3ff", "backgroundColor": "#fff8e1",
"usingComponents": {} "usingComponents": {}
} }
@@ -96,7 +96,7 @@
min-height: 64rpx; min-height: 64rpx;
border-radius: 10rpx; border-radius: 10rpx;
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
font-size: 28rpx; font-size: 28rpx;
font-weight: 700; font-weight: 700;
flex-shrink: 0; flex-shrink: 0;
@@ -1,5 +1,5 @@
{ {
"navigationStyle": "custom", "navigationStyle": "custom",
"backgroundColor": "#f5f3ff", "backgroundColor": "#fff8e1",
"usingComponents": {} "usingComponents": {}
} }
+3 -3
View File
@@ -3,8 +3,8 @@
"global-notification": "/components/global-notification/global-notification" "global-notification": "/components/global-notification/global-notification"
}, },
"navigationBarTitleText": "处罚记录", "navigationBarTitleText": "处罚记录",
"navigationBarBackgroundColor": "#0a0a12", "navigationBarBackgroundColor": "#f7dc51",
"navigationBarTextStyle": "white", "navigationBarTextStyle": "black",
"backgroundColor": "#0a0a12", "backgroundColor": "#fff8e1",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
+38 -38
View File
@@ -2,20 +2,20 @@
/* 🔴【样式与cfss页面基本相同,只添加了独占按钮样式】 */ /* 🔴【样式与cfss页面基本相同,只添加了独占按钮样式】 */
:root { :root {
--cyber-blue: rgba(0, 243, 255, 0.7); --cyber-blue: rgba(255, 208, 97, 0.85);
--cyber-pink: rgba(255, 0, 255, 0.7); --cyber-pink: rgba(255, 192, 163, 0.85);
--cyber-purple: rgba(157, 0, 255, 0.7); --cyber-purple: rgba(230, 126, 34, 0.85);
--cyber-green: rgba(0, 255, 157, 0.7); --cyber-green: rgba(76, 175, 80, 0.85);
--cyber-red: rgba(255, 0, 102, 0.7); --cyber-red: rgba(230, 74, 25, 0.85);
--cyber-bg: #2a2a3a; --cyber-bg: #fff8e1;
--cyber-card: #333344; --cyber-card: #fef6d4;
--cyber-border: rgba(255, 255, 255, 0.15); --cyber-border: rgba(255, 208, 97, 0.35);
--cyber-glow: rgba(0, 243, 255, 0.2); --cyber-glow: rgba(255, 208, 97, 0.2);
--cyber-text: #ffffff; --cyber-text: #333333;
--cyber-text-light: #e6e6e6; --cyber-text-light: #666666;
--cyber-text-lighter: #cccccc; --cyber-text-lighter: #888888;
} }
.cfss-container { .cfss-container {
@@ -38,8 +38,8 @@
bottom: 0; bottom: 0;
background-image: background-image:
linear-gradient(rgba(0, 243, 255, 0.05) 1px, transparent 1px), linear-gradient(rgba(255, 208, 97, 0.08) 1px, transparent 1px),
linear-gradient(90deg, rgba(0, 243, 255, 0.05) 1px, transparent 1px); linear-gradient(90deg, rgba(255, 208, 97, 0.08) 1px, transparent 1px);
background-size: 40rpx 40rpx; background-size: 40rpx 40rpx;
pointer-events: none; pointer-events: none;
opacity: 0.15; opacity: 0.15;
@@ -48,14 +48,14 @@
/* ====== 统计卡片 ====== */ /* ====== 统计卡片 ====== */
.tongji-card { .tongji-card {
background: rgba(255, 0, 102, 0.3); background: #fef6d4;
border-radius: 20rpx; border-radius: 20rpx;
padding: 30rpx; padding: 30rpx;
margin-bottom: 30rpx; margin-bottom: 30rpx;
border: 1rpx solid var(--cyber-border); border: 1rpx solid var(--cyber-border);
box-shadow: box-shadow:
0 0 20rpx rgba(255, 0, 102, 0.2), 0 0 20rpx rgba(255, 0, 102, 0.2),
inset 0 0 10rpx rgba(0, 243, 255, 0.05); inset 0 0 10rpx rgba(255, 208, 97, 0.05);
position: relative; position: relative;
overflow: hidden; overflow: hidden;
z-index: 1; z-index: 1;
@@ -109,7 +109,7 @@
/* ====== 类型切换 ====== */ /* ====== 类型切换 ====== */
.leixing-qiehuan { .leixing-qiehuan {
display: flex; display: flex;
background: rgba(255, 0, 102, 0.3); background: #fef6d4;
border-radius: 16rpx; border-radius: 16rpx;
padding: 10rpx; padding: 10rpx;
margin-bottom: 30rpx; margin-bottom: 30rpx;
@@ -133,8 +133,8 @@
} }
.leixing-active { .leixing-active {
background: linear-gradient(135deg, rgba(0, 243, 255, 0.15), rgba(157, 0, 255, 0.15)); background: linear-gradient(135deg, rgba(250, 224, 77, 0.25), rgba(255, 192, 163, 0.25));
box-shadow: 0 0 15rpx rgba(0, 243, 255, 0.2); box-shadow: 0 0 15rpx rgba(255, 208, 97, 0.2);
} }
.leixing-text { .leixing-text {
@@ -211,7 +211,7 @@
/* 处罚卡片 */ /* 处罚卡片 */
.chufa-card { .chufa-card {
background: rgba(560, 50, 65, 0.8); background: #fff;
border-radius: 20rpx; border-radius: 20rpx;
padding: 30rpx; padding: 30rpx;
margin-bottom: 30rpx; margin-bottom: 30rpx;
@@ -236,7 +236,7 @@
right: -1px; right: -1px;
bottom: -1px; bottom: -1px;
border-radius: 21rpx; border-radius: 21rpx;
background: linear-gradient(45deg, rgba(138, 60, 138, 0.3), rgba(131, 208, 212, 0.3), rgba(255, 0, 255, 0.3), rgba(0, 243, 255, 0.3)); background: linear-gradient(45deg, rgba(250, 224, 77, 0.3), rgba(255, 192, 163, 0.3), rgba(255, 208, 97, 0.3), rgba(255, 224, 130, 0.3));
z-index: -1; z-index: -1;
opacity: 0; opacity: 0;
transition: opacity 0.3s ease; transition: opacity 0.3s ease;
@@ -298,9 +298,9 @@
} }
.zhuangtai-weizhi { .zhuangtai-weizhi {
background: rgba(128, 0, 255, 0.2); background: rgba(255, 152, 0, 0.15);
border-color: rgba(128, 0, 255, 0.5); border-color: rgba(255, 152, 0, 0.5);
box-shadow: 0 0 8rpx rgba(128, 0, 255, 0.2); box-shadow: 0 0 8rpx rgba(255, 152, 0, 0.2);
} }
/* 其他文字内容 */ /* 其他文字内容 */
@@ -423,7 +423,7 @@
.modal-content { .modal-content {
position: relative; position: relative;
background: #3a3a4a; background: #fff;
border-radius: 30rpx; border-radius: 30rpx;
width: 90%; width: 90%;
max-height: 80vh; max-height: 80vh;
@@ -458,11 +458,11 @@
justify-content: center; justify-content: center;
border-radius: 50%; border-radius: 50%;
background: rgba(137, 210, 214, 0.1); background: rgba(137, 210, 214, 0.1);
border: 1rpx solid rgba(0, 243, 255, 0.3); border: 1rpx solid rgba(255, 208, 97, 0.3);
} }
.modal-close:active { .modal-close:active {
background: rgba(0, 243, 255, 0.2); background: rgba(255, 208, 97, 0.2);
transform: scale(0.95); transform: scale(0.95);
} }
@@ -492,7 +492,7 @@
color: var(--cyber-blue); color: var(--cyber-blue);
margin-bottom: 25rpx; margin-bottom: 25rpx;
padding-bottom: 15rpx; padding-bottom: 15rpx;
border-bottom: 1rpx solid rgba(0, 243, 255, 0.2); border-bottom: 1rpx solid rgba(255, 208, 97, 0.2);
text-shadow: 0 0 8rpx var(--cyber-blue); text-shadow: 0 0 8rpx var(--cyber-blue);
} }
@@ -534,13 +534,13 @@
font-size: 24rpx; font-size: 24rpx;
padding: 8rpx 20rpx; padding: 8rpx 20rpx;
border-radius: 8rpx; border-radius: 8rpx;
background: rgba(0, 243, 255, 0.1); background: rgba(255, 208, 97, 0.1);
border: 1rpx solid rgba(0, 243, 255, 0.3); border: 1rpx solid rgba(255, 208, 97, 0.3);
flex-shrink: 0; flex-shrink: 0;
} }
.fuzhi-btn:active { .fuzhi-btn:active {
background: rgba(0, 243, 255, 0.2); background: rgba(255, 208, 97, 0.2);
} }
.full-row { .full-row {
@@ -598,7 +598,7 @@
border-radius: 10rpx; border-radius: 10rpx;
overflow: hidden; overflow: hidden;
position: relative; position: relative;
border: 1rpx solid rgba(0, 243, 255, 0.2); border: 1rpx solid rgba(255, 208, 97, 0.2);
} }
.tupian-image { .tupian-image {
@@ -628,7 +628,7 @@
.preview-text { .preview-text {
color: white; color: white;
font-size: 24rpx; font-size: 24rpx;
background: rgba(0, 243, 255, 0.7); background: rgba(255, 208, 97, 0.7);
padding: 8rpx 16rpx; padding: 8rpx 16rpx;
border-radius: 8rpx; border-radius: 8rpx;
} }
@@ -636,7 +636,7 @@
/* 🔴【新增】弹窗底部按钮独占一行样式 */ /* 🔴【新增】弹窗底部按钮独占一行样式 */
.modal-footer { .modal-footer {
padding: 30rpx; padding: 30rpx;
border-top: 1rpx solid rgba(0, 243, 255, 0.2); border-top: 1rpx solid rgba(255, 208, 97, 0.2);
flex-shrink: 0; flex-shrink: 0;
} }
@@ -666,9 +666,9 @@
/* 按钮样式 */ /* 按钮样式 */
.btn-kefu { .btn-kefu {
background: rgba(0, 243, 255, 0.1); background: rgba(255, 208, 97, 0.1);
border-color: var(--cyber-blue); border-color: var(--cyber-blue);
box-shadow: 0 0 12rpx rgba(0, 243, 255, 0.2); box-shadow: 0 0 12rpx rgba(255, 208, 97, 0.2);
} }
/* 响应式调整 */ /* 响应式调整 */
@@ -712,7 +712,7 @@
aspect-ratio: 1; aspect-ratio: 1;
border-radius: 12rpx; border-radius: 12rpx;
overflow: hidden; overflow: hidden;
border: 1rpx solid rgba(0, 243, 255, 0.3); border: 1rpx solid rgba(255, 208, 97, 0.3);
background-color: rgba(0, 0, 0, 0.2); background-color: rgba(0, 0, 0, 0.2);
} }
@@ -745,7 +745,7 @@
.preview-text { .preview-text {
color: white; color: white;
font-size: 24rpx; font-size: 24rpx;
background: rgba(0, 243, 255, 0.7); background: rgba(255, 208, 97, 0.7);
padding: 8rpx 16rpx; padding: 8rpx 16rpx;
border-radius: 8rpx; border-radius: 8rpx;
} }
@@ -1,7 +1,7 @@
/* pages/merchant-order-detail/merchant-order-detail.wxss - 商家订单详情(逍遥梦金色主题) */ /* pages/merchant-order-detail/merchant-order-detail.wxss - 商家订单详情(逍遥梦金色主题) */
@import '../../styles/shangjia-xym-common.wxss'; @import '../../styles/shangjia-xym-common.wxss';
page { background: #f5f3ff; } page { background: #fff8e1; }
.sjddxq-page { padding-bottom: calc(200rpx + env(safe-area-inset-bottom)); } .sjddxq-page { padding-bottom: calc(200rpx + env(safe-area-inset-bottom)); }
/* 加载状态居中布局 */ /* 加载状态居中布局 */
@@ -94,7 +94,7 @@ page { background: #f5f3ff; }
bottom: 0; bottom: 0;
left: 0; left: 0;
right: 0; right: 0;
background: linear-gradient(180deg, rgba(245, 243, 255, 0.96), #f5f3ff 30%); background: linear-gradient(180deg, rgba(255, 248, 225, 0.96), #fff8e1 30%);
padding: 16rpx 24rpx calc(16rpx + env(safe-area-inset-bottom)); padding: 16rpx 24rpx calc(16rpx + env(safe-area-inset-bottom));
box-shadow: 0 -8rpx 28rpx rgba(0, 0, 0, 0.08); box-shadow: 0 -8rpx 28rpx rgba(0, 0, 0, 0.08);
display: flex; display: flex;
@@ -123,20 +123,20 @@ page { background: #f5f3ff; }
.sj-action-btn--gold { .sj-action-btn--gold {
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
border: 2rpx solid #fff; border: 2rpx solid #fff;
box-shadow: 0 6rpx 18rpx rgba(245, 213, 99, 0.35); box-shadow: 0 6rpx 18rpx rgba(245, 213, 99, 0.35);
} }
.sj-action-btn--outline { .sj-action-btn--outline {
background: rgba(255, 255, 255, 0.95); background: rgba(255, 255, 255, 0.95);
color: #6d28d9; color: #492f00;
border: 2rpx solid #c4b5fd; border: 2rpx solid #ffd061;
} }
.sj-action-btn--warn { .sj-action-btn--warn {
background: linear-gradient(180deg, #ffb74d, #ff8a65); background: linear-gradient(180deg, #ffb74d, #ff8a65);
color: #6d28d9; color: #492f00;
border: 2rpx solid #fff; border: 2rpx solid #fff;
box-shadow: 0 6rpx 16rpx rgba(255, 138, 101, 0.28); box-shadow: 0 6rpx 16rpx rgba(255, 138, 101, 0.28);
} }
@@ -149,7 +149,7 @@ page { background: #f5f3ff; }
.modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 1000; display: flex; align-items: center; justify-content: center; } .modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 1000; display: flex; align-items: center; justify-content: center; }
.modal-mask { position: absolute; width: 100%; height: 100%; background: rgba(0,0,0,0.45); } .modal-mask { position: absolute; width: 100%; height: 100%; background: rgba(0,0,0,0.45); }
.modal-content { position: relative; width: 620rpx; background: #fdfcfa; border-radius: 32rpx; overflow: hidden; border: 2rpx solid rgba(245, 213, 99, 0.4); } .modal-content { position: relative; width: 620rpx; background: #fdfcfa; border-radius: 32rpx; overflow: hidden; border: 2rpx solid rgba(245, 213, 99, 0.4); }
.modal-hd { padding: 32rpx; font-size: 34rpx; font-weight: 700; color: #6d28d9; display: flex; justify-content: space-between; border-bottom: 1rpx solid rgba(245, 213, 99, 0.35); } .modal-hd { padding: 32rpx; font-size: 34rpx; font-weight: 700; color: #492f00; display: flex; justify-content: space-between; border-bottom: 1rpx solid rgba(245, 213, 99, 0.35); }
.modal-close { color: #999; font-size: 40rpx; } .modal-close { color: #999; font-size: 40rpx; }
.modal-body { padding: 32rpx; } .modal-body { padding: 32rpx; }
.modal-tip { font-size: 28rpx; color: #555; margin-bottom: 12rpx; } .modal-tip { font-size: 28rpx; color: #555; margin-bottom: 12rpx; }
@@ -163,7 +163,7 @@ page { background: #f5f3ff; }
.fenhong-tip { text-align: center; font-size: 28rpx; color: #ff9800; margin: 16rpx 0 0; } .fenhong-tip { text-align: center; font-size: 28rpx; color: #ff9800; margin: 16rpx 0 0; }
.modal-btns { display: flex; border-top: 1rpx solid #f0f0f0; } .modal-btns { display: flex; border-top: 1rpx solid #f0f0f0; }
.modal-btn { flex: 1; text-align: center; padding: 28rpx; font-size: 30rpx; font-weight: 500; } .modal-btn { flex: 1; text-align: center; padding: 28rpx; font-size: 30rpx; font-weight: 500; }
.modal-btn.cancel { color: #886633; background: #f5f3ff; } .modal-btn.cancel { color: #886633; background: #fff8e1; }
.modal-btn.confirm { color: #492f00; background: linear-gradient(180deg, #fae04d, #ffc0a3); font-weight: 700; } .modal-btn.confirm { color: #492f00; background: linear-gradient(180deg, #fae04d, #ffc0a3); font-weight: 700; }
+1 -1
View File
@@ -2,7 +2,7 @@
"navigationBarTitleText": "我的派单", "navigationBarTitleText": "我的派单",
"enablePullDownRefresh": false, "enablePullDownRefresh": false,
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"backgroundColor": "#f5f3ff", "backgroundColor": "#fff8e1",
"usingComponents": { "usingComponents": {
"global-notification": "/components/global-notification/global-notification", "global-notification": "/components/global-notification/global-notification",
"chenghao-tag": "/components/chenghao-tag/chenghao-tag" "chenghao-tag": "/components/chenghao-tag/chenghao-tag"
+1 -1
View File
@@ -89,7 +89,7 @@
refresher-enabled="{{true}}" refresher-enabled="{{true}}"
refresher-threshold="80" refresher-threshold="80"
refresher-default-style="black" refresher-default-style="black"
refresher-background="#f5f3ff" refresher-background="#fff8e1"
refresher-triggered="{{scrollViewRefreshing}}" refresher-triggered="{{scrollViewRefreshing}}"
bindrefresherrefresh="onPullDownRefresh" bindrefresherrefresh="onPullDownRefresh"
bindscrolltolower="onReachBottom" bindscrolltolower="onReachBottom"
+8 -8
View File
@@ -6,13 +6,13 @@
page { page {
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
background: #f5f3ff; background: #fff8e1;
} }
.sj-page { .sj-page {
height: 100vh; height: 100vh;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background: #f5f3ff; background: #fff8e1;
overflow: hidden; overflow: hidden;
box-sizing: border-box; box-sizing: border-box;
} }
@@ -125,8 +125,8 @@ page {
text-align: center; text-align: center;
} }
.time-pill--active { .time-pill--active {
color: #6d28d9; color: #492f00;
background: linear-gradient(180deg, #f5f3ff, #ffe9b8); background: linear-gradient(180deg, #fff8e1, #ffe9b8);
border: 1rpx solid #e8c547; border: 1rpx solid #e8c547;
} }
.time-sep { .time-sep {
@@ -177,7 +177,7 @@ page {
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
} }
.staff-filter-pill--active { .staff-filter-pill--active {
background: linear-gradient(180deg, #f5f3ff, #ffe9b8); background: linear-gradient(180deg, #fff8e1, #ffe9b8);
border-color: #e8c547; border-color: #e8c547;
box-shadow: 0 4rpx 12rpx rgba(232, 197, 71, 0.25); box-shadow: 0 4rpx 12rpx rgba(232, 197, 71, 0.25);
} }
@@ -193,7 +193,7 @@ page {
} }
.staff-filter-pill--active .staff-filter-tag { .staff-filter-pill--active .staff-filter-tag {
background: rgba(255, 255, 255, 0.85); background: rgba(255, 255, 255, 0.85);
color: #6d28d9; color: #492f00;
} }
.staff-filter-value { .staff-filter-value {
flex: 1; flex: 1;
@@ -206,7 +206,7 @@ page {
white-space: nowrap; white-space: nowrap;
} }
.staff-filter-pill--active .staff-filter-value { .staff-filter-pill--active .staff-filter-value {
color: #6d28d9; color: #492f00;
} }
.staff-filter-arrow { .staff-filter-arrow {
flex-shrink: 0; flex-shrink: 0;
@@ -572,7 +572,7 @@ page {
.load-more-btn { .load-more-btn {
background: linear-gradient(180deg, #fae04d, #ffc0a3); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #6d28d9; color: #492f00;
border: 2rpx solid #fff; border: 2rpx solid #fff;
box-shadow: 0 6rpx 16rpx rgba(245, 213, 99, 0.3); box-shadow: 0 6rpx 16rpx rgba(245, 213, 99, 0.3);
} }
+1 -1
View File
@@ -1,4 +1,4 @@
page { background: #f7f8fa; } page { background: #fff8e1; }
.page-container { padding-bottom: 30rpx; } .page-container { padding-bottom: 30rpx; }
.stats-card { .stats-card {
+3 -3
View File
@@ -3,10 +3,10 @@
"global-notification": "/components/global-notification/global-notification" "global-notification": "/components/global-notification/global-notification"
}, },
"navigationBarTitleText": "商家排行榜", "navigationBarTitleText": "商家排行榜",
"navigationBarBackgroundColor": "#000000", "navigationBarBackgroundColor": "#f7dc51",
"navigationBarTextStyle": "white", "navigationBarTextStyle": "black",
"enablePullDownRefresh": false, "enablePullDownRefresh": false,
"backgroundColor": "#000000", "backgroundColor": "#fff8e1",
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"onReachBottomDistance": 50 "onReachBottomDistance": 50
} }
@@ -1,8 +1,8 @@
{ {
"navigationBarTitleText": "商家充值", "navigationBarTitleText": "商家充值",
"navigationBarBackgroundColor": "#0a0e17", "navigationBarBackgroundColor": "#f7dc51",
"navigationBarTextStyle": "white", "navigationBarTextStyle": "black",
"backgroundColor": "#0a0e17", "backgroundColor": "#fff8e1",
"backgroundTextStyle": "light", "backgroundTextStyle": "light",
"enablePullDownRefresh": false, "enablePullDownRefresh": false,
"usingComponents": { "usingComponents": {
+108 -114
View File
@@ -6,23 +6,23 @@
/* 科技主题色 - 增强对比度 */ /* 科技主题色 - 增强对比度 */
:root { :root {
--primary-color: #00f3ff; /* 主科技蓝 */ --primary-color: #ffd061;
--primary-light: #4dfbff; /* 亮科技蓝 */ --primary-light: #ffe082;
--primary-dark: #00a0b0; /* 暗科技蓝 */ --primary-dark: #e6a020;
--secondary-color: #ff2a6d; /* 科技粉红 */ --secondary-color: #ffc0a3;
--accent-color: #ffd700; /* 科技金 */ --accent-color: #e67e22;
--accent-purple: #9d4edd; /* 科技紫 */ --accent-purple: #ffb74d;
--dark-bg: #0a0e17; /* 深色背景 */ --dark-bg: #fff8e1;
--medium-bg: #13182b; /* 中色背景 */ --medium-bg: #fff9f0;
--light-bg: #1c2238; /* 浅色背景 */ --light-bg: #fff8e1;
--card-bg: rgba(20, 25, 40, 0.85); /* 卡片背景 - 提高透明度 */ --card-bg: #fef6d4;
--border-glow: rgba(0, 243, 255, 0.4); --border-glow: rgba(255, 208, 97, 0.4);
--text-primary: #ffffff; /* 主要文字 */ --text-primary: #222222;
--text-secondary: #a0aec0; /* 次要文字 */ --text-secondary: #666666;
--text-highlight: #ffffff; /* 高亮文字 */ --text-highlight: #492f00;
--text-glow: #00f3ff; /* 发光文字 */ --text-glow: #e67e22;
--shadow-tech: 0 8rpx 24rpx rgba(0, 0, 0, 0.5); --shadow-tech: 0 8rpx 24rpx rgba(0, 0, 0, 0.08);
--shadow-glow: 0 0 20rpx rgba(0, 243, 255, 0.25); --shadow-glow: 0 0 20rpx rgba(255, 208, 97, 0.25);
} }
/* 全局页面样式 - 修复背景 */ /* 全局页面样式 - 修复背景 */
@@ -31,9 +31,9 @@
color: var(--text-primary); color: var(--text-primary);
min-height: 100vh; min-height: 100vh;
background: linear-gradient(145deg, background: linear-gradient(145deg,
var(--dark-bg) 0%, #f7dc51 0%,
var(--medium-bg) 50%, #fff8e1 50%,
var(--light-bg) 100% #fff9f0 100%
) !important; ) !important;
position: relative; position: relative;
overflow-x: hidden; overflow-x: hidden;
@@ -46,17 +46,17 @@
/* ========== 余额卡片样式 - 完全重写 ========== */ /* ========== 余额卡片样式 - 完全重写 ========== */
.balance-card { .balance-card {
background: rgba(20, 25, 40, 0.9); /* 降低透明度,提高文字可见性 */ background: #fef6d4; /* 降低透明度,提高文字可见性 */
border-radius: 25rpx; border-radius: 25rpx;
padding: 35rpx 25rpx; padding: 35rpx 25rpx;
margin: 0 0 35rpx; margin: 0 0 35rpx;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
border: 1.5rpx solid rgba(0, 243, 255, 0.3); border: 1.5rpx solid rgba(255, 208, 97, 0.3);
box-shadow: box-shadow:
var(--shadow-tech), var(--shadow-tech),
var(--shadow-glow), var(--shadow-glow),
inset 0 0 15rpx rgba(0, 243, 255, 0.08); inset 0 0 15rpx rgba(255, 208, 97, 0.08);
z-index: 1; z-index: 1;
/* 移除或大幅降低毛玻璃效果 */ /* 移除或大幅降低毛玻璃效果 */
backdrop-filter: blur(2px); backdrop-filter: blur(2px);
@@ -82,9 +82,9 @@
letter-spacing: 1.5rpx; letter-spacing: 1.5rpx;
color: var(--text-primary) !important; /* 强制使用白色,确保可见 */ color: var(--text-primary) !important; /* 强制使用白色,确保可见 */
text-shadow: text-shadow:
0 0 15rpx rgba(0, 243, 255, 0.8), 0 0 15rpx rgba(255, 208, 97, 0.8),
0 0 30rpx rgba(0, 243, 255, 0.4), 0 0 30rpx rgba(255, 208, 97, 0.4),
0 0 45rpx rgba(0, 243, 255, 0.2); 0 0 45rpx rgba(255, 208, 97, 0.2);
position: relative; position: relative;
display: inline-block; display: inline-block;
/* 移除背景渐变,直接用纯色加阴影 */ /* 移除背景渐变,直接用纯色加阴影 */
@@ -142,10 +142,10 @@
/* VIP商家标签 */ /* VIP商家标签 */
.balance-chip { .balance-chip {
background: linear-gradient(90deg, background: linear-gradient(90deg,
rgba(0, 243, 255, 0.15), rgba(255, 208, 97, 0.15),
rgba(255, 42, 109, 0.15) rgba(255, 42, 109, 0.15)
); );
border: 1rpx solid rgba(0, 243, 255, 0.3); border: 1rpx solid rgba(255, 208, 97, 0.3);
border-radius: 20rpx; border-radius: 20rpx;
padding: 10rpx 20rpx; padding: 10rpx 20rpx;
display: flex; display: flex;
@@ -154,8 +154,8 @@
height: 44rpx; height: 44rpx;
min-width: 180rpx; min-width: 180rpx;
box-shadow: box-shadow:
0 4rpx 12rpx rgba(0, 243, 255, 0.2), 0 4rpx 12rpx rgba(255, 208, 97, 0.2),
inset 0 0 8rpx rgba(0, 243, 255, 0.1); inset 0 0 8rpx rgba(255, 208, 97, 0.1);
position: relative; position: relative;
z-index: 10; /* 确保在最上层 */ z-index: 10; /* 确保在最上层 */
} }
@@ -201,9 +201,9 @@
color: var(--text-primary) !important; /* 强制使用白色 */ color: var(--text-primary) !important; /* 强制使用白色 */
line-height: 1; line-height: 1;
text-shadow: text-shadow:
0 0 20rpx rgba(0, 243, 255, 0.8), 0 0 20rpx rgba(255, 208, 97, 0.8),
0 0 40rpx rgba(0, 243, 255, 0.5), 0 0 40rpx rgba(255, 208, 97, 0.5),
0 0 60rpx rgba(0, 243, 255, 0.3); 0 0 60rpx rgba(255, 208, 97, 0.3);
letter-spacing: -1.5rpx; letter-spacing: -1.5rpx;
display: inline-block; display: inline-block;
position: relative; position: relative;
@@ -242,10 +242,10 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: rgba(0, 243, 255, 0.08); background: rgba(255, 208, 97, 0.08);
padding: 10rpx 22rpx; padding: 10rpx 22rpx;
border-radius: 18rpx; border-radius: 18rpx;
border: 1rpx solid rgba(0, 243, 255, 0.2); border: 1rpx solid rgba(255, 208, 97, 0.2);
min-width: 150rpx; min-width: 150rpx;
} }
@@ -337,7 +337,7 @@
/* ========== 充值金额区域 ========== */ /* ========== 充值金额区域 ========== */
.amount-section { .amount-section {
background: rgba(25, 30, 48, 0.9); background: #fef6d4;
border-radius: 25rpx; border-radius: 25rpx;
padding: 35rpx 25rpx; padding: 35rpx 25rpx;
margin-bottom: 35rpx; margin-bottom: 35rpx;
@@ -345,7 +345,7 @@
backdrop-filter: blur(4px); backdrop-filter: blur(4px);
box-shadow: box-shadow:
var(--shadow-tech), var(--shadow-tech),
inset 0 0 15rpx rgba(0, 243, 255, 0.05); inset 0 0 15rpx rgba(255, 208, 97, 0.05);
position: relative; position: relative;
z-index: 1; z-index: 1;
} }
@@ -387,8 +387,8 @@
} }
.amount-item { .amount-item {
background: rgba(255, 255, 255, 0.05); background: rgba(255, 255, 255, 0.85);
border: 2rpx solid rgba(255, 255, 255, 0.12); border: 2rpx solid rgba(255, 208, 97, 0.35);
border-radius: 18rpx; border-radius: 18rpx;
padding: 26rpx 10rpx; padding: 26rpx 10rpx;
text-align: center; text-align: center;
@@ -408,15 +408,15 @@
.amount-item.active { .amount-item.active {
background: linear-gradient(135deg, background: linear-gradient(135deg,
rgba(0, 243, 255, 0.15), rgba(250, 224, 77, 0.35),
rgba(157, 78, 221, 0.15) rgba(255, 192, 163, 0.35)
); );
border-color: var(--primary-color); border-color: var(--primary-color);
transform: translateY(-3rpx); transform: translateY(-3rpx);
box-shadow: box-shadow:
0 10rpx 25rpx rgba(0, 243, 255, 0.2), 0 10rpx 25rpx rgba(255, 208, 97, 0.2),
0 0 30rpx rgba(0, 243, 255, 0.1), 0 0 30rpx rgba(255, 208, 97, 0.1),
inset 0 0 12rpx rgba(0, 243, 255, 0.1); inset 0 0 12rpx rgba(255, 208, 97, 0.1);
} }
.amount-text { .amount-text {
@@ -442,7 +442,7 @@
height: 90%; height: 90%;
background: radial-gradient( background: radial-gradient(
circle at center, circle at center,
rgba(0, 243, 255, 0.2) 0%, rgba(255, 208, 97, 0.2) 0%,
transparent 70% transparent 70%
); );
border-radius: 50%; border-radius: 50%;
@@ -515,7 +515,7 @@
.custom-input:focus { .custom-input:focus {
border-bottom-color: var(--primary-color); border-bottom-color: var(--primary-color);
box-shadow: 0 0 15rpx rgba(0, 243, 255, 0.3); box-shadow: 0 0 15rpx rgba(255, 208, 97, 0.3);
} }
.placeholder { .placeholder {
@@ -589,23 +589,23 @@
/* 激活状态 - 修复为科技蓝渐变 */ /* 激活状态 - 修复为科技蓝渐变 */
.pay-button.active { .pay-button.active {
background: linear-gradient(135deg, background: linear-gradient(135deg,
#008ca3, /* 深蓝 */ #fae04d,
#00b8d4, /* 中蓝 */ #ffc0a3,
#00f3ff /* 亮蓝 */ #ffd061
); );
border: 1.5rpx solid rgba(0, 243, 255, 0.6); border: 1.5rpx solid rgba(255, 208, 97, 0.6);
box-shadow: box-shadow:
0 12rpx 35rpx rgba(0, 243, 255, 0.4), 0 12rpx 35rpx rgba(255, 208, 97, 0.4),
0 0 50rpx rgba(0, 243, 255, 0.3), 0 0 50rpx rgba(255, 208, 97, 0.3),
inset 0 0 20rpx rgba(0, 243, 255, 0.15); inset 0 0 20rpx rgba(255, 208, 97, 0.15);
} }
.pay-button.active:active { .pay-button.active:active {
transform: scale(0.98); transform: scale(0.98);
box-shadow: box-shadow:
0 8rpx 25rpx rgba(0, 243, 255, 0.4), 0 8rpx 25rpx rgba(255, 208, 97, 0.4),
0 0 35rpx rgba(0, 243, 255, 0.3), 0 0 35rpx rgba(255, 208, 97, 0.3),
inset 0 0 15rpx rgba(0, 243, 255, 0.15); inset 0 0 15rpx rgba(255, 208, 97, 0.15);
} }
/* 按钮闪光特效 */ /* 按钮闪光特效 */
@@ -658,7 +658,7 @@
color: white !important; color: white !important;
text-shadow: text-shadow:
0 0 12rpx rgba(255, 255, 255, 0.8), 0 0 12rpx rgba(255, 255, 255, 0.8),
0 0 25rpx rgba(0, 243, 255, 0.6); 0 0 25rpx rgba(255, 208, 97, 0.6);
} }
/* ========== 支付状态提示 ========== */ /* ========== 支付状态提示 ========== */
@@ -668,7 +668,7 @@
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
background: rgba(10, 14, 23, 0.95); background: rgba(255, 248, 225, 0.95);
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@@ -678,8 +678,8 @@
.status-content { .status-content {
background: linear-gradient(135deg, background: linear-gradient(135deg,
rgba(25, 30, 48, 0.95), #fff,
rgba(40, 47, 75, 0.95) #fef6d4
); );
border-radius: 28rpx; border-radius: 28rpx;
padding: 60rpx 40rpx; padding: 60rpx 40rpx;
@@ -689,7 +689,7 @@
border: 2rpx solid var(--primary-color); border: 2rpx solid var(--primary-color);
box-shadow: box-shadow:
0 20rpx 50rpx rgba(0, 0, 0, 0.6), 0 20rpx 50rpx rgba(0, 0, 0, 0.6),
0 0 50rpx rgba(0, 243, 255, 0.4); 0 0 50rpx rgba(255, 208, 97, 0.4);
position: relative; position: relative;
overflow: hidden; overflow: hidden;
animation: statusAppear 0.3s ease-out; animation: statusAppear 0.3s ease-out;
@@ -706,7 +706,7 @@
color: var(--text-primary) !important; color: var(--text-primary) !important;
display: block; display: block;
margin-bottom: 15rpx; margin-bottom: 15rpx;
text-shadow: 0 0 10rpx rgba(0, 243, 255, 0.6); text-shadow: 0 0 10rpx rgba(255, 208, 97, 0.6);
position: relative; position: relative;
z-index: 10; z-index: 10;
} }
@@ -729,13 +729,13 @@
} }
.action-button { .action-button {
background: linear-gradient(135deg, #008ca3, #00f3ff); background: linear-gradient(135deg, #fae04d, #ffd061);
border-radius: 20rpx; border-radius: 20rpx;
padding: 20rpx 40rpx; padding: 20rpx 40rpx;
min-width: 200rpx; min-width: 200rpx;
box-shadow: box-shadow:
0 8rpx 24rpx rgba(0, 243, 255, 0.4), 0 8rpx 24rpx rgba(255, 208, 97, 0.4),
0 0 16rpx rgba(0, 243, 255, 0.3); 0 0 16rpx rgba(255, 208, 97, 0.3);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -745,8 +745,8 @@
.action-button:active { .action-button:active {
transform: scale(0.95); transform: scale(0.95);
box-shadow: box-shadow:
0 4rpx 12rpx rgba(0, 243, 255, 0.4), 0 4rpx 12rpx rgba(255, 208, 97, 0.4),
0 0 8rpx rgba(0, 243, 255, 0.3); 0 0 8rpx rgba(255, 208, 97, 0.3);
} }
.action-text { .action-text {
@@ -764,7 +764,7 @@
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
background: rgba(10, 14, 23, 0.92); background: rgba(255, 248, 225, 0.92);
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@@ -793,7 +793,7 @@
margin: 0 auto 30rpx; margin: 0 auto 30rpx;
box-shadow: box-shadow:
0 0 20rpx var(--primary-color), 0 0 20rpx var(--primary-color),
inset 0 0 12rpx rgba(0, 243, 255, 0.2); inset 0 0 12rpx rgba(255, 208, 97, 0.2);
position: relative; position: relative;
} }
@@ -805,7 +805,7 @@
.loading-text { .loading-text {
font-size: 28rpx; font-size: 28rpx;
color: var(--text-primary); color: var(--text-primary);
text-shadow: 0 0 10rpx rgba(0, 243, 255, 0.6); text-shadow: 0 0 10rpx rgba(255, 208, 97, 0.6);
letter-spacing: 1rpx; letter-spacing: 1rpx;
} }
@@ -814,12 +814,12 @@
/* ========== 修复背景颜色和间距 ========== */ /* ========== 修复背景颜色和间距 ========== */
/* 1. 调整背景颜色为更亮的科技风 */ /* 1. 橙黄主题背景 */
page { page {
background: linear-gradient(135deg, background: linear-gradient(180deg,
#0e1424 0%, /* 调亮深色部分 */ #f7dc51 0%,
#1a2238 50%, #fff8e1 50%,
#242d45 100% #fff9f0 100%
) !important; ) !important;
height: 100%; height: 100%;
} }
@@ -836,8 +836,8 @@ page {
margin: 0 0 30rpx !important; /* 增加下方间距 */ margin: 0 0 30rpx !important; /* 增加下方间距 */
padding: 35rpx 25rpx !important; /* 增加内边距 */ padding: 35rpx 25rpx !important; /* 增加内边距 */
border-radius: 25rpx !important; border-radius: 25rpx !important;
background: rgba(25, 30, 48, 0.9) !important; /* 调亮背景 */ background: #fef6d4 !important; /* 调亮背景 */
border: 1.5rpx solid rgba(0, 243, 255, 0.4) !important; /* 加强边框 */ border: 1.5rpx solid rgba(255, 208, 97, 0.4) !important; /* 加强边框 */
} }
/* 4. 调整余额字体和颜色 - 确保可见 */ /* 4. 调整余额字体和颜色 - 确保可见 */
@@ -847,21 +847,19 @@ page {
.currency { .currency {
font-size: 42rpx !important; font-size: 42rpx !important;
color: #ffd700 !important; /* 使用更亮的金色 */ color: #e67e22 !important;
text-shadow: 0 0 20rpx rgba(255, 215, 0, 0.8) !important; text-shadow: none !important;
} }
.amount { .amount {
font-size: 72rpx !important; /* 稍微调大 */ font-size: 72rpx !important;
color: #ffffff !important; color: #222 !important;
text-shadow: text-shadow: none !important;
0 0 25rpx rgba(0, 243, 255, 0.8),
0 0 50rpx rgba(0, 243, 255, 0.5) !important;
} }
.unit { .unit {
font-size: 30rpx !important; font-size: 30rpx !important;
color: #a0aec0 !important; /* 调亮灰色 */ color: #666 !important;
} }
/* 5. 调整充值金额区域 */ /* 5. 调整充值金额区域 */
@@ -869,7 +867,7 @@ page {
margin-bottom: 30rpx !important; margin-bottom: 30rpx !important;
padding: 30rpx 25rpx !important; padding: 30rpx 25rpx !important;
border-radius: 25rpx !important; border-radius: 25rpx !important;
background: rgba(30, 35, 55, 0.9) !important; /* 调亮背景 */ background: #fff !important; /* 调亮背景 */
} }
/* 6. 调整快捷金额网格 */ /* 6. 调整快捷金额网格 */
@@ -885,7 +883,7 @@ page {
.amount-text { .amount-text {
font-size: 32rpx !important; font-size: 32rpx !important;
color: #ffffff !important; color: #333 !important;
} }
/* 7. 调整输入区域 - 修复占位符溢出问题 */ /* 7. 调整输入区域 - 修复占位符溢出问题 */
@@ -900,27 +898,27 @@ page {
.custom-input { .custom-input {
padding: 28rpx 20rpx 28rpx 60rpx !important; padding: 28rpx 20rpx 28rpx 60rpx !important;
height: 145rpx !important; /* 增加高度,让内容有足够空间 */ height: 145rpx !important;
font-size: 40rpx !important; font-size: 40rpx !important;
color: #ffffff !important; color: #222 !important;
border-bottom: 2rpx solid rgba(255, 255, 255, 0.2) !important; border-bottom: 2rpx solid rgba(0, 0, 0, 0.12) !important;
} }
.custom-input:focus { .custom-input:focus {
border-bottom-color: #00f3ff !important; border-bottom-color: #ffd061 !important;
box-shadow: 0 0 20rpx rgba(0, 243, 255, 0.4) !important; box-shadow: 0 0 20rpx rgba(255, 208, 97, 0.4) !important;
} }
.input-label { .input-label {
font-size: 40rpx !important; font-size: 40rpx !important;
color: #ffd700 !important; /* 使用金色 */ color: #e67e22 !important;
text-shadow: 0 0 15rpx rgba(255, 215, 0, 0.6) !important; text-shadow: none !important;
top: 50% !important; top: 50% !important;
transform: translateY(-50%) !important; transform: translateY(-50%) !important;
} }
.placeholder { .placeholder {
color: rgba(160, 174, 192, 0.8) !important; /* 调亮占位符 */ color: rgba(102, 102, 102, 0.7) !important;
font-size: 34rpx !important; font-size: 34rpx !important;
font-weight: 500 !important; font-weight: 500 !important;
} }
@@ -937,49 +935,45 @@ page {
.pay-button.active { .pay-button.active {
background: linear-gradient(135deg, background: linear-gradient(135deg,
#0099b0, /* 更亮的蓝 */ #fae04d,
#00ccff, /* 亮蓝 */ #ffc0a3,
#00f3ff /* 最亮蓝 */ #ffd061
) !important; ) !important;
border: 1.5rpx solid rgba(0, 243, 255, 0.8) !important; border: 1.5rpx solid rgba(255, 208, 97, 0.8) !important;
} }
.button-text { .button-text {
font-size: 36rpx !important; font-size: 36rpx !important;
color: #ffffff !important; color: #492f00 !important;
text-shadow: 0 0 10rpx rgba(0, 243, 255, 0.8) !important; text-shadow: none !important;
} }
/* 9. 调整标题文字颜色 - 确保清晰可见 */
.title-text { .title-text {
font-size: 36rpx !important; font-size: 36rpx !important;
color: #ffffff !important; color: #222 !important;
text-shadow: text-shadow: none !important;
0 0 20rpx rgba(0, 243, 255, 0.8),
0 0 40rpx rgba(0, 243, 255, 0.4) !important;
} }
.section-title { .section-title {
font-size: 34rpx !important; font-size: 34rpx !important;
color: #ffffff !important; color: #222 !important;
text-shadow: 0 0 15rpx rgba(255, 255, 255, 0.3) !important; text-shadow: none !important;
} }
.subtitle-text, .subtitle-text,
.amount-hint { .amount-hint {
color: #b8c2cc !important; /* 调亮灰色文字 */ color: #666 !important;
font-size: 26rpx !important; font-size: 26rpx !important;
} }
/* 10. 调整卡片文字颜色 */
.chip-text { .chip-text {
color: #ffffff !important; color: #492f00 !important;
text-shadow: 0 0 8rpx rgba(0, 243, 255, 0.6) !important; text-shadow: none !important;
} }
.tag-text { .tag-text {
color: #4dfbff !important; /* 使用亮科技蓝 */ color: #e67e22 !important;
text-shadow: 0 0 8rpx rgba(0, 243, 255, 0.4) !important; text-shadow: none !important;
} }
/* 11. 增强装饰元素可见性(但不干扰文字) */ /* 11. 增强装饰元素可见性(但不干扰文字) */
@@ -5,9 +5,9 @@
"chenghao-tag": "/components/chenghao-tag/chenghao-tag" "chenghao-tag": "/components/chenghao-tag/chenghao-tag"
}, },
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"navigationBarBackgroundColor": "#f5f3ff", "navigationBarBackgroundColor": "#f7dc51",
"navigationBarTitleText": "常规发单", "navigationBarTitleText": "常规发单",
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"backgroundColor": "#f5f5f5", "backgroundColor": "#fff8e1",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
@@ -1,4 +1,4 @@
.page { padding: 24rpx; background: #f5f5f5; min-height: 100vh; box-sizing: border-box; } .page { padding: 24rpx; background: #fff8e1; min-height: 100vh; box-sizing: border-box; }
.head-tip { font-size: 24rpx; color: #888; margin-bottom: 16rpx; line-height: 1.5; } .head-tip { font-size: 24rpx; color: #888; margin-bottom: 16rpx; line-height: 1.5; }
.tabs { display: flex; margin-bottom: 24rpx; } .tabs { display: flex; margin-bottom: 24rpx; }
.tab { flex: 1; text-align: center; padding: 20rpx; background: #fff; margin-right: 8rpx; border-radius: 8rpx; font-size: 28rpx; } .tab { flex: 1; text-align: center; padding: 20rpx; background: #fff; margin-right: 8rpx; border-radius: 8rpx; font-size: 28rpx; }
@@ -2,7 +2,7 @@
.role-page { .role-page {
min-height: 100vh; min-height: 100vh;
background: linear-gradient(180deg, #c4b5fd 0%, #fff 28%, #f5f3ff 100%); background: linear-gradient(180deg, #f7dc51 0%, #fff 28%, #fff8e1 100%);
box-sizing: border-box; box-sizing: border-box;
} }
+1 -1
View File
@@ -6,7 +6,7 @@
"chenghao-tag": "/components/chenghao-tag/chenghao-tag" "chenghao-tag": "/components/chenghao-tag/chenghao-tag"
}, },
"navigationStyle": "custom", "navigationStyle": "custom",
"backgroundColor": "#f5f3ff", "backgroundColor": "#fff8e1",
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"enablePullDownRefresh": true "enablePullDownRefresh": true
} }
+3 -3
View File
@@ -1,7 +1,7 @@
@import '../../styles/shangjia-xym-common.wxss'; @import '../../styles/shangjia-xym-common.wxss';
page { page {
background: #f5f3ff; background: #fff8e1;
} }
.user-page { .user-page {
@@ -120,7 +120,7 @@ page {
font-size: 24rpx; font-size: 24rpx;
font-weight: 600; font-weight: 600;
color: #7a5a12; color: #7a5a12;
background: linear-gradient(180deg, #f5f3ff, #ffe9b8); background: linear-gradient(180deg, #fff8e1, #ffe9b8);
border: 1rpx solid #e8c547; border: 1rpx solid #e8c547;
border-radius: 28rpx; border-radius: 28rpx;
box-shadow: 0 2rpx 8rpx rgba(200, 160, 40, 0.15); box-shadow: 0 2rpx 8rpx rgba(200, 160, 40, 0.15);
@@ -301,7 +301,7 @@ page {
width: 60rpx; width: 60rpx;
height: 60rpx; height: 60rpx;
border: 4rpx solid rgba(0, 0, 0, 0.08); border: 4rpx solid rgba(0, 0, 0, 0.08);
border-top-color: #9333ea; border-top-color: #ffd061;
border-radius: 50%; border-radius: 50%;
animation: sjSpin 0.8s linear infinite; animation: sjSpin 0.8s linear infinite;
} }
+6 -2
View File
@@ -535,7 +535,10 @@ Page(createPage({
switchTab(e) { switchTab(e) {
const index = parseInt(e.currentTarget.dataset.index); const index = parseInt(e.currentTarget.dataset.index);
this.setData({ activeTab: index, displayCount: 10, searchKeyword: '' }, () => this.applyFilter()); this.setData({ activeTab: index, displayCount: 10, searchKeyword: '' }, () => {
this.applyFilter();
this.calculateScrollHeight();
});
}, },
onSearchInput(e) { onSearchInput(e) {
@@ -662,8 +665,9 @@ Page(createPage({
const rpxRatio = 750 / windowWidth; const rpxRatio = 750 / windowWidth;
const headerHeight = 150 / rpxRatio; const headerHeight = 150 / rpxRatio;
const tabBarHeight = 130 / rpxRatio; const tabBarHeight = 130 / rpxRatio;
const kefuBarHeight = this.data.activeTab === 2 ? (112 / rpxRatio) : 0;
const safeAreaBottom = systemInfo.safeArea ? (windowHeight - systemInfo.safeArea.bottom) : 0; const safeAreaBottom = systemInfo.safeArea ? (windowHeight - systemInfo.safeArea.bottom) : 0;
this.setData({ scrollHeight: windowHeight - headerHeight - tabBarHeight - safeAreaBottom }); this.setData({ scrollHeight: windowHeight - headerHeight - tabBarHeight - kefuBarHeight - safeAreaBottom });
}, },
onAvatarError(e) { onAvatarError(e) {
+1
View File
@@ -1,4 +1,5 @@
{ {
"navigationBarTitleText": "星之界",
"usingComponents": { "usingComponents": {
"global-notification": "/components/global-notification/global-notification", "global-notification": "/components/global-notification/global-notification",
"tab-bar": "/tab-bar/index" "tab-bar": "/tab-bar/index"
+4 -3
View File
@@ -31,6 +31,10 @@
</view> </view>
</view> </view>
<view class="kefu-entry" wx:if="{{activeTab === 2}}">
<button class="kefu-btn" bindtap="chatKefu">💬 联系客服</button>
</view>
<!-- 会话列表 (上拉加载更多) --> <!-- 会话列表 (上拉加载更多) -->
<scroll-view class="conversation-list" scroll-y="true" bindscrolltolower="onScrollToLower" style="height: {{scrollHeight}}px"> <scroll-view class="conversation-list" scroll-y="true" bindscrolltolower="onScrollToLower" style="height: {{scrollHeight}}px">
<block wx:for="{{filteredConversations}}" wx:key="key" wx:for-index="i" wx:if="{{i < displayCount}}"> <block wx:for="{{filteredConversations}}" wx:key="key" wx:for-index="i" wx:if="{{i < displayCount}}">
@@ -66,9 +70,6 @@
</view> </view>
</block> </block>
<view class="kefu-entry" wx:if="{{activeTab === 2 && filteredConversations.length === 0}}">
<button class="kefu-btn" bindtap="chatKefu">联系客服</button>
</view>
<view class="load-tip" wx:if="{{filteredConversations.length > displayCount}}">上拉加载更多</view> <view class="load-tip" wx:if="{{filteredConversations.length > displayCount}}">上拉加载更多</view>
<view class="empty" wx:if="{{filteredConversations.length === 0 && activeTab !== 2}}"> <view class="empty" wx:if="{{filteredConversations.length === 0 && activeTab !== 2}}">
<text>暂无相关消息</text> <text>暂无相关消息</text>
+15 -6
View File
@@ -337,16 +337,25 @@
/* 客服入口 */ /* 客服入口 */
.kefu-entry { .kefu-entry {
text-align: center; padding: 16rpx 24rpx 8rpx;
padding: 100rpx 0; background: #fff;
} }
.kefu-btn { .kefu-btn {
width: 300rpx; width: 100%;
background: #07c160; height: 88rpx;
line-height: 88rpx;
background: linear-gradient(135deg, #07c160 0%, #06ad56 100%);
color: #fff; color: #fff;
border-radius: 40rpx; border-radius: 44rpx;
font-size: 28rpx; font-size: 32rpx;
font-weight: 700;
box-shadow: 0 8rpx 24rpx rgba(7, 193, 96, 0.35);
border: none;
}
.kefu-btn::after {
border: none;
} }
/* 操作弹窗 */ /* 操作弹窗 */
+1 -1
View File
@@ -141,7 +141,7 @@ page {
line-height: 1.2; line-height: 1.2;
} }
.gradient-bg { .gradient-bg {
background: linear-gradient(to right, rgba(147, 51, 234, 0.05), rgba(147, 51, 234, 0.15)); background: linear-gradient(to right, rgba(255, 208, 97, 0.05), rgba(255, 208, 97, 0.15));
} }
.title-text { .title-text {
font-size: 34rpx; font-size: 34rpx;
+6 -3
View File
@@ -308,13 +308,16 @@ Page({
let params = {}; let params = {};
switch (failureType) { switch (failureType) {
case 'huiyuan': case 'huiyuan':
params = { needScroll: '0', scrollTo: 'member' }; url = '/pages/fighter-recharge/fighter-recharge';
params = { scrollTo: 'member' };
break; break;
case 'yajin': case 'yajin':
params = { needScroll: '1', scrollTo: 'bottom', requiredYajin: requiredYajin }; url = '/pages/fighter-recharge/fighter-deposit';
params = { requiredYajin: requiredYajin };
break; break;
case 'jifen': case 'jifen':
params = { needScroll: '1', scrollTo: 'bottom' }; url = '/pages/fighter-recharge/fighter-recharge';
params = { scrollTo: 'jifen' };
break; break;
} }
if (huiyuanId) params.huiyuanId = huiyuanId; if (huiyuanId) params.huiyuanId = huiyuanId;
+1 -1
View File
@@ -25,7 +25,7 @@
class="xym-lunbo-swiper" class="xym-lunbo-swiper"
indicator-dots="{{lunboList.length > 1}}" indicator-dots="{{lunboList.length > 1}}"
indicator-color="rgba(255,255,255,0.6)" indicator-color="rgba(255,255,255,0.6)"
indicator-active-color="#9333ea" indicator-active-color="#ffd061"
autoplay="{{lunboList.length > 1}}" autoplay="{{lunboList.length > 1}}"
interval="4000" interval="4000"
circular circular
+325 -212
View File
@@ -1,288 +1,401 @@
// 管事会员记录页面逻辑 // 佣金记录(三合一:接单佣金 / 管事分佣 / 组长分红)
import request from '../../utils/request.js'; import request from '../../utils/request.js';
import { getOrderStatusText } from '../../utils/api-helper.js';
import { isRoleStatusActive } from '../../utils/base-page.js';
// 每页数据条数常量 - 统一管理,方便修改 const MEIYE_TIAOSHU_GUANSHI = 50;
const MEIYE_TIAOSHU = 50; const PAGE_SIZE_DASHOU = 15;
const PAGE_SIZE_ZUZHANG = 5;
const REFRESH_CD = 2000;
const TAB_MAP = {
dashou: 'dashou',
commission: 'dashou',
guanshi: 'guanshi',
recharge: 'guanshi',
zuzhang: 'zuzhang',
fenhong: 'zuzhang',
};
Page({ Page({
data: { data: {
// 从全局变量获取的数据 activeTab: 'dashou',
yaoqingzongshu: 0, // 邀请打手总数 tabs: [],
fenyongzonge: '0.00', // 分成总额
isDashou: false,
// 从接口获取的数据 isGuanshi: false,
chongzhiDashouShuliang: 0, // 充值打手数量 isZuzhang: false,
dashouList: [], // 打手列表数据
zongTiaoshu: 0, // 总条数 // 管事分佣统计
yaoqingzongshu: 0,
// 分页相关 fenyongzonge: '0.00',
dangqianYe: 1, // 当前页 chongzhiDashouShuliang: 0,
meiyouGengduo: false, // 没有更多数据
jiazaiZhong: false, // 加载中状态 // 组长分红统计
jiazaiGengduo: false, // 加载更多状态 fenhongZonge: '0.00',
yaoqingGuanshi: 0,
// UI状态 fenhongCishu: 0,
cuowuTishi: '', // 错误提示
shuaxinKezhi: false, // 刷新按钮是否可点击 // 接单佣金列表
shuaxinCd: 2000, // 刷新冷却时间(毫秒) dashouCommissionList: [],
dashouPage: 1,
// 常量(用于模板) dashouHasMore: true,
meiyeTiaoshu: MEIYE_TIAOSHU // 每页条数 dashouTotal: 0,
// 管事分佣列表
guanshiList: [],
guanshiPage: 1,
guanshiHasMore: false,
guanshiTotal: 0,
// 组长分红列表
zuzhangList: [],
zuzhangPage: 1,
zuzhangHasMore: true,
zuzhangTotal: 0,
jiazaiZhong: false,
jiazaiGengduo: false,
shuaxinKezhi: false,
cuowuTishi: '',
loadedTabs: {},
scrollTop: 0,
}, },
onLoad(options) { onLoad(options) {
// 从全局变量获取管事数据 this._initRoles();
this.huoquQuanjubianliang(); const requested = TAB_MAP[(options.tab || options.type || '').trim()] || 'dashou';
const tabs = this._buildTabs();
// 加载第一页数据 const activeTab = tabs.find((t) => t.key === requested)?.key || tabs[0]?.key || 'dashou';
this.jiazaiShuju(true);
this.setData({ tabs, activeTab }, () => {
if (this.data.isGuanshi) this.huoquQuanjubianliang();
this._loadTab(activeTab, true);
});
}, },
onShow() { onShow() {
// 页面显示时检查全局变量是否有更新
this.registerNotificationComponent(); this.registerNotificationComponent();
this.huoquQuanjubianliang(); if (this.data.isGuanshi) this.huoquQuanjubianliang();
}, },
// 🆕 新增:注册通知组件
registerNotificationComponent() {
const app = getApp();
const notificationComp = this.selectComponent('#global-notification');
if (notificationComp && notificationComp.showNotification) {
console.log('🏪 商城页面注册通知组件');
app.globalData.globalNotification = {
show: (data) => notificationComp.showNotification(data),
hide: () => notificationComp.hideNotification()
};
}
},
// 获取全局变量数据 registerNotificationComponent() {
huoquQuanjubianliang() {
const app = getApp(); const app = getApp();
const guanshiData = app.globalData.guanshi; const notificationComp = this.selectComponent('#global-notification');
if (notificationComp && notificationComp.showNotification) {
app.globalData.globalNotification = {
show: (data) => notificationComp.showNotification(data),
hide: () => notificationComp.hideNotification(),
};
}
},
_initRoles() {
const isDashou = isRoleStatusActive(wx.getStorageSync('dashoustatus'));
const isGuanshi = isRoleStatusActive(wx.getStorageSync('guanshistatus'));
const isZuzhang = isRoleStatusActive(wx.getStorageSync('zuzhangstatus'));
this.setData({
isDashou: isDashou || (!isGuanshi && !isZuzhang),
isGuanshi,
isZuzhang,
});
},
_buildTabs() {
const { isDashou, isGuanshi, isZuzhang } = this.data;
const tabs = [];
if (isDashou) tabs.push({ key: 'dashou', label: '接单佣金' });
if (isGuanshi) tabs.push({ key: 'guanshi', label: '管事分佣' });
if (isZuzhang) tabs.push({ key: 'zuzhang', label: '组长分红' });
if (!tabs.length) tabs.push({ key: 'dashou', label: '接单佣金' });
return tabs;
},
onTabTap(e) {
const key = e.currentTarget.dataset.key;
if (key === this.data.activeTab) return;
this.setData({ activeTab: key, cuowuTishi: '', scrollTop: 0 });
if (!this.data.loadedTabs[key]) {
this._loadTab(key, true);
}
},
huoquQuanjubianliang() {
const guanshiData = getApp().globalData.guanshi;
if (guanshiData) { if (guanshiData) {
this.setData({ this.setData({
yaoqingzongshu: guanshiData.yaoqingzongshu || 0, yaoqingzongshu: guanshiData.yaoqingzongshu || 0,
fenyongzonge: guanshiData.fenyongzonge || '0.00' fenyongzonge: guanshiData.fenyongzonge || '0.00',
}); });
} }
}, },
// 加载数据核心方法 _loadTab(tab, reset) {
async jiazaiShuju(chushihua = false) { if (tab === 'dashou') return this._loadDashouCommission(reset);
// 防止重复请求 if (tab === 'guanshi') return this._loadGuanshi(reset);
if (this.data.jiazaiZhong) return; if (tab === 'zuzhang') return this._loadZuzhang(reset);
return Promise.resolve();
// 如果是初始化加载,重置分页 },
if (chushihua) {
shuaxinShuju() {
if (this.data.shuaxinKezhi) {
wx.showToast({ title: `请等待${REFRESH_CD / 1000}秒`, icon: 'none' });
return;
}
this.setData({ shuaxinKezhi: true, cuowuTishi: '' });
this._loadTab(this.data.activeTab, true).finally(() => {
setTimeout(() => this.setData({ shuaxinKezhi: false }), REFRESH_CD);
});
},
shanglaJiazai() {
const { activeTab, jiazaiGengduo, jiazaiZhong, loadedTabs } = this.data;
if (!loadedTabs[activeTab] || jiazaiGengduo || jiazaiZhong) return;
if (activeTab === 'dashou' && !this.data.dashouHasMore) return;
if (activeTab === 'guanshi' && this.data.guanshiHasMore === false) return;
if (activeTab === 'zuzhang' && !this.data.zuzhangHasMore) return;
this._loadTab(activeTab, false);
},
chongshiJiazai() {
this.setData({ cuowuTishi: '' });
this._loadTab(this.data.activeTab, true);
},
async _loadDashouCommission(reset) {
if (this.data.jiazaiZhong || this.data.jiazaiGengduo) return;
const page = reset ? 1 : this.data.dashouPage;
if (!reset && !this.data.dashouHasMore) return;
this.setData({
jiazaiZhong: reset,
jiazaiGengduo: !reset,
cuowuTishi: '',
});
try {
const res = await request({
url: '/dingdan/dshqdingdan',
method: 'POST',
data: {
zhuangtai_list: [3, 8],
page,
page_size: PAGE_SIZE_DASHOU,
},
});
const body = res?.data;
if (body && (body.code === 200 || body.code === 0)) {
const raw = body.data?.list || [];
const rows = raw.map((item) => {
const amt = item.jine || item.dashou_fencheng || '0.00';
const brief = (item.jieshao || '').trim();
const title = brief
? (brief.length > 18 ? `${brief.slice(0, 18)}…` : brief)
: `订单 ${item.dingdan_id || ''}`;
return {
id: item.dingdan_id,
title,
time: item.wancheng_shijian || item.jiesuan_shijian || item.creat_time || getOrderStatusText(item.zhuangtai),
amount: parseFloat(amt || 0).toFixed(2),
};
});
const list = reset ? rows : [...this.data.dashouCommissionList, ...rows];
const hasMore = body.data?.has_more ?? raw.length >= PAGE_SIZE_DASHOU;
const loadedTabs = { ...this.data.loadedTabs, dashou: true };
this.setData({
dashouCommissionList: list,
dashouPage: reset ? 2 : page + 1,
dashouHasMore: hasMore,
dashouTotal: body.data?.total || list.length,
loadedTabs,
});
} else {
this.setData({ cuowuTishi: body?.msg || '数据加载失败' });
}
} catch (e) {
console.error('接单佣金加载失败', e);
this.setData({ cuowuTishi: '网络错误,请检查网络连接' });
} finally {
this.setData({ jiazaiZhong: false, jiazaiGengduo: false });
}
},
async _loadGuanshi(reset) {
if (this.data.jiazaiZhong || this.data.jiazaiGengduo) return;
if (reset) {
this.setData({ this.setData({
dangqianYe: 1, guanshiPage: 1,
meiyouGengduo: false, guanshiHasMore: false,
dashouList: [], guanshiList: [],
zongTiaoshu: 0, guanshiTotal: 0,
chongzhiDashouShuliang: 0 chongzhiDashouShuliang: 0,
}); });
} else { } else {
// 上拉加载更多时,检查是否还有更多数据 if (this.data.guanshiList.length > 0 && this.data.guanshiList.length < MEIYE_TIAOSHU_GUANSHI) {
if (this.data.meiyouGengduo) return; this.setData({ guanshiHasMore: false });
// 如果有数据但不足一页,说明后端已经没数据了
if (this.data.dashouList.length > 0 && this.data.dashouList.length < MEIYE_TIAOSHU) {
this.setData({ meiyouGengduo: true });
return; return;
} }
if (this.data.guanshiList.length >= this.data.guanshiTotal && this.data.guanshiTotal > 0) {
// 如果数据量已经达到总条数,则不请求 this.setData({ guanshiHasMore: false });
if (this.data.dashouList.length >= this.data.zongTiaoshu && this.data.zongTiaoshu > 0) {
this.setData({ meiyouGengduo: true });
return; return;
} }
} }
// 设置加载状态 const dangqianYe = reset ? 1 : this.data.guanshiPage;
this.setData({ this.setData({
jiazaiZhong: chushihua ? true : false, jiazaiZhong: reset,
jiazaiGengduo: !chushihua ? true : false, jiazaiGengduo: !reset,
cuowuTishi: '' cuowuTishi: '',
}); });
try { try {
const { dangqianYe } = this.data;
// 严格按照您的request规范调用
const res = await request({ const res = await request({
url: '/shangpin/fenhonghq', url: '/shangpin/fenhonghq',
method: 'POST', method: 'POST',
data: { data: { page: dangqianYe, page_size: MEIYE_TIAOSHU_GUANSHI },
page: dangqianYe,
page_size: MEIYE_TIAOSHU // 使用统一常量
}
}); });
// 处理返回数据
if (res.data.code === 200) { if (res.data.code === 200) {
const data = res.data.data || {}; const data = res.data.data || {};
const newList = data.list || []; const newList = this.chuliTouxiangURL(data.list || []);
const total = data.total || 0; const hasMore = newList.length === MEIYE_TIAOSHU_GUANSHI;
const loadedTabs = { ...this.data.loadedTabs, guanshi: true };
// 处理头像URL拼接
const processedList = this.chuliTouxiangURL(newList);
// 计算是否有更多数据
const hasMoreData = processedList.length === MEIYE_TIAOSHU;
// 更新数据
this.setData({ this.setData({
dashouList: chushihua ? processedList : [...this.data.dashouList, ...processedList], guanshiList: reset ? newList : [...this.data.guanshiList, ...newList],
zongTiaoshu: total, guanshiTotal: data.total || 0,
chongzhiDashouShuliang: data.chongzhi_dashou_shuliang || 0, chongzhiDashouShuliang: data.chongzhi_dashou_shuliang || 0,
meiyouGengduo: !hasMoreData, guanshiHasMore: hasMore,
dangqianYe: chushihua ? 2 : this.data.dangqianYe + 1 guanshiPage: reset ? 2 : dangqianYe + 1,
loadedTabs,
}); });
// 如果数据为空,显示空状态
if (chushihua && processedList.length === 0) {
wx.showToast({
title: '暂无数据',
icon: 'none',
duration: 1500
});
}
// 如果加载了数据,给个提示
if (processedList.length > 0) {
if (chushihua) {
wx.showToast({
title: `已加载${processedList.length}条记录`,
icon: 'success',
duration: 1000
});
}
}
} else { } else {
this.setData({ this.setData({ cuowuTishi: res.data.msg || '数据加载失败' });
cuowuTishi: res.data.msg || '数据加载失败'
});
wx.showToast({
title: res.data.msg || '加载失败',
icon: 'none',
duration: 2000
});
} }
} catch (error) { } catch (e) {
console.error('加载数据失败:', error); console.error('管事分佣加载失败', e);
this.setData({ this.setData({ cuowuTishi: '网络错误,请检查网络连接' });
cuowuTishi: '网络错误,请检查网络连接'
});
wx.showToast({
title: '网络错误',
icon: 'none',
duration: 2000
});
} finally { } finally {
this.setData({ this.setData({ jiazaiZhong: false, jiazaiGengduo: false });
jiazaiZhong: false, }
jiazaiGengduo: false },
});
async _loadZuzhang(reset) {
if (this.data.jiazaiZhong || this.data.jiazaiGengduo) return;
const page = reset ? 1 : this.data.zuzhangPage;
if (!reset && !this.data.zuzhangHasMore) return;
this.setData({
jiazaiZhong: reset,
jiazaiGengduo: !reset,
cuowuTishi: '',
});
try {
const res = await request({
url: '/shangpin/zuzhangfenhong',
method: 'POST',
data: { page, page_size: PAGE_SIZE_ZUZHANG },
});
if (res.data.code === 200) {
const data = res.data.data || {};
const processedList = this.processZuzhangList(data.list || []);
const loadedTabs = { ...this.data.loadedTabs, zuzhang: true };
if (reset) {
this.setData({
fenhongZonge: data.fenhong_zonge || '0.00',
yaoqingGuanshi: data.yaoqing_guanshi || 0,
fenhongCishu: data.fenhong_cishu || 0,
zuzhangList: processedList,
zuzhangTotal: data.total || 0,
zuzhangPage: 2,
zuzhangHasMore: processedList.length === PAGE_SIZE_ZUZHANG,
loadedTabs,
});
} else {
const newList = [...this.data.zuzhangList, ...processedList];
this.setData({
zuzhangList: newList,
zuzhangPage: page + 1,
zuzhangHasMore: processedList.length === PAGE_SIZE_ZUZHANG,
loadedTabs,
});
}
} else {
this.setData({ cuowuTishi: res.data.msg || '数据加载失败' });
}
} catch (e) {
console.error('组长分红加载失败', e);
this.setData({ cuowuTishi: '网络错误,请检查网络连接' });
} finally {
this.setData({ jiazaiZhong: false, jiazaiGengduo: false });
} }
}, },
// 处理头像URL拼接
chuliTouxiangURL(list) { chuliTouxiangURL(list) {
const app = getApp(); const app = getApp();
const ossUrl = app.globalData.ossImageUrl || ''; const ossUrl = app.globalData.ossImageUrl || '';
return list.map((item) => {
return list.map(item => {
// 确保有头像URL,如果没有则使用默认头像
let touxiangUrl = item.avatar || ''; let touxiangUrl = item.avatar || '';
if (touxiangUrl && !touxiangUrl.startsWith('http')) { if (touxiangUrl && !touxiangUrl.startsWith('http')) {
touxiangUrl = ossUrl + touxiangUrl; touxiangUrl = ossUrl + touxiangUrl;
} }
// 格式化时间
let shijian = item.create_time || ''; let shijian = item.create_time || '';
if (shijian) { if (shijian) {
// 如果是时间戳,转换为日期格式
if (/^\d+$/.test(shijian)) { if (/^\d+$/.test(shijian)) {
const date = new Date(parseInt(shijian)); const date = new Date(parseInt(shijian, 10));
shijian = `${date.getMonth() + 1}月${date.getDate()}日 ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`; shijian = `${date.getMonth() + 1}月${date.getDate()}日 ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`;
} else { } else {
// 如果是字符串,提取日期和时间
try { try {
const dateObj = new Date(shijian); const dateObj = new Date(shijian);
shijian = `${dateObj.getMonth() + 1}月${dateObj.getDate()}日 ${dateObj.getHours().toString().padStart(2, '0')}:${dateObj.getMinutes().toString().padStart(2, '0')}`; shijian = `${dateObj.getMonth() + 1}月${dateObj.getDate()}日 ${String(dateObj.getHours()).padStart(2, '0')}:${String(dateObj.getMinutes()).padStart(2, '0')}`;
} catch (e) { } catch (err) {
shijian = shijian.substring(0, 10); shijian = shijian.substring(0, 10);
} }
} }
} }
return { return {
...item, ...item,
touxiangUrl: touxiangUrl || '/images/default-avatar.png', touxiangUrl: touxiangUrl || '/images/default-avatar.png',
shijian: shijian, shijian,
fenhong: parseFloat(item.fenhong || 0).toFixed(2) fenhong: parseFloat(item.fenhong || 0).toFixed(2),
}; };
}); });
}, },
// 刷新数据(带防重复点击) processZuzhangList(list) {
shuaxinShuju() { const app = getApp();
// 检查是否在冷却中 const ossUrl = app.globalData.ossImageUrl || '';
if (this.data.shuaxinKezhi) { const defaultAvatar = ossUrl + (app.globalData.morentouxiang || 'avatar/default.jpg');
wx.showToast({ return list.map((item) => ({
title: `请等待${this.data.shuaxinCd/1000}秒`, dashouAvatar: this.getFullUrl(item.dashou_avatar, ossUrl, defaultAvatar),
icon: 'none', dashouNicheng: item.dashou_nicheng || '接单员',
duration: 1000 dashouYonghuid: item.dashou_yonghuid || '',
}); guanshiAvatar: this.getFullUrl(item.guanshi_avatar, ossUrl, defaultAvatar),
return; guanshiNicheng: item.guanshi_nicheng || '管事',
} guanshiYonghuid: item.guanshi_yonghuid || '',
fenhong: parseFloat(item.fenhong || 0).toFixed(2),
// 设置冷却状态 shijian: this.formatTime(item.create_time),
this.setData({ shuaxinKezhi: true }); }));
// 显示刷新动画
this.setData({
jiazaiZhong: true
});
// 刷新数据
this.jiazaiShuju(true).finally(() => {
// 2秒后恢复按钮可点击
setTimeout(() => {
this.setData({ shuaxinKezhi: false });
}, this.data.shuaxinCd);
});
}, },
// 上拉加载更多 getFullUrl(relativePath, ossUrl, defaultUrl) {
shanglaJiazai() { if (!relativePath) return defaultUrl;
// 没有更多数据时不再请求 if (relativePath.startsWith('http')) return relativePath;
if (this.data.meiyouGengduo) { return ossUrl + (relativePath.startsWith('/') ? relativePath : `/${relativePath}`) || defaultUrl;
wx.showToast({
title: '已经到底了',
icon: 'none',
duration: 1000
});
return;
}
// 如果正在加载,不再请求
if (this.data.jiazaiGengduo || this.data.jiazaiZhong) {
return;
}
this.jiazaiShuju(false);
}, },
// 重试加载 formatTime(timestamp) {
chongshiJiazai() { if (!timestamp) return '';
this.setData({ try {
cuowuTishi: '', const date = new Date(timestamp);
meiyouGengduo: false return `${date.getMonth() + 1}月${date.getDate()}日 ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`;
}); } catch (e) {
this.jiazaiShuju(true); return String(timestamp).substring(0, 10) || '';
} }
}); },
});
+10 -10
View File
@@ -1,11 +1,11 @@
{ {
"usingComponents": { "usingComponents": {
"global-notification": "/components/global-notification/global-notification" "global-notification": "/components/global-notification/global-notification"
}, },
"navigationBarTitleText": "会员记录", "navigationBarTitleText": "佣金记录",
"navigationBarBackgroundColor": "#0a0a0f", "navigationBarBackgroundColor": "#f7dc51",
"navigationBarTextStyle": "white", "navigationBarTextStyle": "black",
"backgroundColor": "#0a0a0f", "backgroundColor": "#fff8e1",
"backgroundTextStyle": "light", "backgroundTextStyle": "dark",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
+162 -90
View File
@@ -1,119 +1,191 @@
<!-- 管事会员记录页面 --> <!-- 佣金记录(接单佣金 / 管事分佣 / 组长分红) -->
<view class="page-container"> <view class="page-container">
<!-- 固定顶部区域 - 不动 -->
<view class="fixed-top"> <view class="fixed-top">
<!-- 顶部统计区域 --> <!-- Tab 切换 -->
<view class="tongji-quyu"> <view class="tab-bar" wx:if="{{tabs.length > 1}}">
<!-- 分红总额 --> <view
<view class="fenyong-zonge"> wx:for="{{tabs}}"
<view class="zonge-label">分红总额</view> wx:key="key"
<view class="zonge-value">¥{{fenyongzonge}}</view> class="tab-item {{activeTab === item.key ? 'active' : ''}}"
<view class="zonge-tip">累计收益</view> data-key="{{item.key}}"
</view> bindtap="onTabTap"
>{{item.label}}</view>
</view>
<!-- 底部统计信息 --> <!-- 管事分佣统计 -->
<view class="tongji-bottom"> <view class="stats-card" wx:if="{{activeTab === 'guanshi'}}">
<view class="tongji-item"> <view class="stats-main">
<view class="tongji-number">{{yaoqingzongshu}}</view> <text class="stats-label">分红总额</text>
<view class="tongji-label">邀请接单员</view> <text class="stats-amount">¥{{fenyongzonge}}</text>
<text class="stats-tip">累计管事分佣收益</text>
</view>
<view class="stats-row">
<view class="stats-cell">
<text class="stats-num">{{yaoqingzongshu}}</text>
<text class="stats-sub">邀请接单员</text>
</view> </view>
<view class="stats-divider"></view>
<view class="tongji-divider"></view> <view class="stats-cell">
<text class="stats-num">{{chongzhiDashouShuliang}}</text>
<view class="tongji-item"> <text class="stats-sub">充值接单员</text>
<view class="tongji-number">{{chongzhiDashouShuliang}}</view>
<view class="tongji-label">充值接单员</view>
</view> </view>
</view> </view>
</view> </view>
<!-- 刷新按钮 --> <!-- 组长分红统计 -->
<view class="shuaxin-anniu" bindtap="shuaxinShuju"> <view class="stats-card" wx:if="{{activeTab === 'zuzhang'}}">
<text class="shuaxin-icon {{shuaxinKezhi ? 'shuaxin-disabled' : ''}}">↻</text> <view class="stats-row three">
<view class="stats-cell">
<text class="stats-label-sm">分红总额</text>
<text class="stats-amount-sm">¥{{fenhongZonge}}</text>
</view>
<view class="stats-divider"></view>
<view class="stats-cell">
<text class="stats-label-sm">邀请管事</text>
<text class="stats-num">{{yaoqingGuanshi}}</text>
</view>
<view class="stats-divider"></view>
<view class="stats-cell">
<text class="stats-label-sm">分红次数</text>
<text class="stats-num">{{fenhongCishu}}</text>
</view>
</view>
</view>
<!-- 接单佣金说明 -->
<view class="stats-card dashou-hd" wx:if="{{activeTab === 'dashou'}}">
<text class="dashou-title">接单佣金明细</text>
<text class="dashou-sub">已完成 / 已结算订单的分佣记录</text>
</view>
<view class="refresh-btn" bindtap="shuaxinShuju">
<text class="refresh-icon {{shuaxinKezhi ? 'spin' : ''}}">↻</text>
</view> </view>
</view> </view>
<!-- 滚动区域 - 只包裹列表部分 --> <scroll-view
<scroll-view class="scroll-area {{tabs.length > 1 ? 'has-tabs' : ''}} {{activeTab}}"
class="scroll-area"
scroll-y scroll-y
enable-back-to-top enable-back-to-top
bindscrolltolower="shanglaJiazai"> scroll-top="{{scrollTop}}"
bindscrolltolower="shanglaJiazai"
<!-- 全局加载状态 --> >
<view wx:if="{{jiazaiZhong && dashouList.length === 0}}" class="jiazai-quanju"> <!-- 加载中 -->
<view class="jiazai-spinner"></view> <view wx:if="{{jiazaiZhong && activeTab === 'dashou' && dashouCommissionList.length === 0}}" class="state-box">
<view class="jiazai-text">加载中...</view> <view class="spinner"></view>
<text>加载中...</text>
</view> </view>
<view wx:if="{{jiazaiZhong && activeTab === 'guanshi' && guanshiList.length === 0}}" class="state-box">
<!-- 空数据提示 --> <view class="spinner"></view>
<view wx:if="{{!jiazaiZhong && dashouList.length === 0}}" class="kong-shuju"> <text>加载中...</text>
<view class="kong-icon">🚀</view> </view>
<view class="kong-text">暂无会员记录</view> <view wx:if="{{jiazaiZhong && activeTab === 'zuzhang' && zuzhangList.length === 0}}" class="state-box">
<view class="kong-tip">快去邀请接单员吧</view> <view class="spinner"></view>
<view class="kong-btn" bindtap="shuaxinShuju">点击刷新</view> <text>加载中...</text>
</view> </view>
<!-- 会员记录卡片列表 --> <!-- 接单佣金列表 -->
<block wx:if="{{dashouList.length > 0}}"> <block wx:if="{{activeTab === 'dashou'}}">
<!-- 列表标题 --> <view wx:if="{{!jiazaiZhong && dashouCommissionList.length === 0}}" class="empty-box">
<view class="list-title"> <text class="empty-icon">📋</text>
<text class="title-text">充值记录</text> <text class="empty-title">暂无佣金记录</text>
<text class="title-count">({{dashouList.length}}/{{zongTiaoshu}})</text> <text class="empty-tip">完成订单后将在此展示</text>
<view class="empty-btn" bindtap="shuaxinShuju">刷新</view>
</view> </view>
<block wx:if="{{dashouCommissionList.length > 0}}">
<!-- 卡片列表 --> <view class="list-hd">
<view class="card-list"> <text class="list-title">佣金明细</text>
<block wx:for="{{dashouList}}" wx:key="index"> <text class="list-count">{{dashouCommissionList.length}}条</text>
<view class="dashou-card"> </view>
<!-- 圆形头像区域 --> <view class="record-list">
<view class="touxiang-quyu"> <view wx:for="{{dashouCommissionList}}" wx:key="id" class="record-card">
<image <view class="record-main">
class="dashou-touxiang" <text class="record-title">{{item.title}}</text>
src="{{item.touxiangUrl}}" <text class="record-time">{{item.time}}</text>
mode="aspectFill">
</image>
<!-- 头像边框效果 -->
<view class="touxiang-border"></view>
</view> </view>
<text class="record-amt plus">+¥{{item.amount}}</text>
</view>
</view>
<view wx:if="{{jiazaiGengduo}}" class="footer-tip"><view class="spinner sm"></view><text>加载更多...</text></view>
<view wx:if="{{!dashouHasMore && dashouCommissionList.length > 0}}" class="footer-tip muted">—— 没有更多了 ——</view>
</block>
</block>
<!-- 信息区域 --> <!-- 管事分佣列表 -->
<view class="xinxi-quyu"> <block wx:if="{{activeTab === 'guanshi'}}">
<view class="nicheng">{{item.nicheng}}</view> <view wx:if="{{!jiazaiZhong && guanshiList.length === 0}}" class="empty-box">
<view class="dashou-id">ID: {{item.yonghuid}}</view> <text class="empty-icon">🚀</text>
<text class="empty-title">暂无分佣记录</text>
<text class="empty-tip">邀请接单员充值后将获得分佣</text>
<view class="empty-btn" bindtap="shuaxinShuju">刷新</view>
</view>
<block wx:if="{{guanshiList.length > 0}}">
<view class="list-hd">
<text class="list-title">分佣明细</text>
<text class="list-count">{{guanshiList.length}}/{{guanshiTotal}}</text>
</view>
<view class="record-list">
<view wx:for="{{guanshiList}}" wx:key="index" class="record-card avatar-card">
<image class="avatar" src="{{item.touxiangUrl}}" mode="aspectFill"/>
<view class="record-main">
<text class="record-title">{{item.nicheng}}</text>
<text class="record-time">ID: {{item.yonghuid}} · {{item.shijian}}</text>
</view> </view>
<view class="amt-col">
<!-- 分红金额区域 --> <text class="record-amt plus">+¥{{item.fenhong}}</text>
<view class="fenhong-quyu">
<view class="fenhong-value">
<text class="fenhong-jiahao">+</text>
<text class="fenhong-shuzi">¥{{item.fenhong}}</text>
</view>
<view class="shijian">{{item.shijian}}</view>
</view> </view>
</view> </view>
</block> </view>
</view> <view wx:if="{{jiazaiGengduo}}" class="footer-tip"><view class="spinner sm"></view><text>加载更多...</text></view>
<view wx:if="{{!guanshiHasMore && guanshiList.length > 0}}" class="footer-tip muted">—— 没有更多了 ——</view>
<!-- 加载更多提示 --> </block>
<view wx:if="{{jiazaiGengduo}}" class="jiazai-gengduo"> </block>
<view class="gengduo-spinner"></view>
<text class="gengduo-text">加载更多中...</text> <!-- 组长分红列表 -->
</view> <block wx:if="{{activeTab === 'zuzhang'}}">
<view wx:if="{{!jiazaiZhong && zuzhangList.length === 0}}" class="empty-box">
<!-- 没有更多数据 --> <text class="empty-icon">📭</text>
<view wx:if="{{meiyouGengduo && dashouList.length > 0}}" class="meiyou-gengduo"> <text class="empty-title">暂无分红记录</text>
<view class="meiyou-icon">✓</view> <text class="empty-tip">邀请管事并让接单员充值即可获得分红</text>
<text class="meiyou-text">已经到底了,共{{dashouList.length}}条记录</text> <view class="empty-btn" bindtap="shuaxinShuju">刷新</view>
</view> </view>
<block wx:if="{{zuzhangList.length > 0}}">
<view class="list-hd">
<text class="list-title">分红明细</text>
<text class="list-count">{{zuzhangList.length}}/{{zuzhangTotal}}</text>
</view>
<view class="record-list">
<view wx:for="{{zuzhangList}}" wx:key="index" class="bonus-card">
<view class="bonus-left">
<image class="avatar sm" src="{{item.dashouAvatar}}" mode="aspectFill"/>
<view class="bonus-info">
<text class="record-title">{{item.dashouNicheng}}</text>
<text class="record-time">ID: {{item.dashouYonghuid}}</text>
</view>
</view>
<view class="bonus-mid">
<text class="bonus-tag">所属管事</text>
<text class="bonus-arrow">→</text>
</view>
<view class="bonus-right">
<image class="avatar sm" src="{{item.guanshiAvatar}}" mode="aspectFill"/>
<view class="bonus-info">
<text class="record-title">{{item.guanshiNicheng}}</text>
<text class="record-amt plus">+¥{{item.fenhong}}</text>
<text class="record-time">{{item.shijian}}</text>
</view>
</view>
</view>
</view>
<view wx:if="{{jiazaiGengduo}}" class="footer-tip"><view class="spinner sm"></view><text>加载更多...</text></view>
<view wx:if="{{!zuzhangHasMore && zuzhangList.length > 0}}" class="footer-tip muted">—— 没有更多了 ——</view>
</block>
</block> </block>
</scroll-view> </scroll-view>
<!-- 错误提示 --> <view wx:if="{{cuowuTishi}}" class="error-bar">
<view wx:if="{{cuowuTishi}}" class="cuowu-quyu"> <text>{{cuowuTishi}}</text>
<view class="cuowu-icon">⚠️</view> <view class="error-btn" bindtap="chongshiJiazai">重试</view>
<view class="cuowu-text">{{cuowuTishi}}</view>
<view class="cuowu-btn" bindtap="chongshiJiazai">重试加载</view>
</view> </view>
</view> </view>
<global-notification id="global-notification" /> <global-notification id="global-notification" />
+414 -500
View File
@@ -1,506 +1,420 @@
/* 管事会员记录页面样式 - 赛博风格 */ /* 佣金记录 - 逍遥梦黄色风格 */
/* 页面容器 */
page { page {
height: 100%; height: 100%;
background: #0a0a0f; background: #fff8e1;
} }
.page-container {
height: 100%;
background: linear-gradient(135deg, #0a0a0f 0%, #1a1a2e 50%, #16213e 100%);
position: relative;
}
/* 固定顶部区域 */
.fixed-top {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(135deg, #0a0a0f 0%, #1a1a2e 100%);
padding-bottom: 20rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.3);
}
/* 顶部统计区域 - 赛博卡片设计 */
.tongji-quyu {
position: relative;
margin: 20rpx 30rpx 0;
padding: 40rpx 30rpx;
background: rgba(20, 20, 35, 0.9);
border-radius: 24rpx;
border: 1px solid rgba(100, 255, 255, 0.1);
box-shadow:
0 10rpx 30rpx rgba(0, 0, 0, 0.4),
0 0 20rpx rgba(100, 255, 255, 0.05) inset,
0 0 0 1px rgba(100, 255, 255, 0.1);
backdrop-filter: blur(10px);
overflow: hidden;
}
.tongji-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background:
linear-gradient(45deg,
rgba(100, 255, 255, 0.03) 0%,
rgba(255, 100, 255, 0.03) 100%);
z-index: 0;
}
/* 分红总额样式 - 赛博霓虹效果 */
.fenyong-zonge {
position: relative;
text-align: center;
padding: 20rpx 0 30rpx;
margin-bottom: 25rpx;
border-bottom: 1px solid rgba(100, 255, 255, 0.1);
z-index: 1;
}
.zonge-label {
font-size: 26rpx;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 15rpx;
text-transform: uppercase;
letter-spacing: 2rpx;
}
.zonge-value {
font-size: 60rpx;
font-weight: 800;
color: #00ffea;
margin-bottom: 8rpx;
text-shadow:
0 0 10rpx rgba(0, 255, 234, 0.5),
0 0 20rpx rgba(0, 255, 234, 0.3);
font-family: 'Arial', sans-serif;
}
.zonge-tip {
font-size: 22rpx;
color: rgba(255, 255, 255, 0.5);
}
/* 底部统计信息 */
.tongji-bottom {
display: flex;
justify-content: space-around;
align-items: center;
z-index: 1;
position: relative;
}
.tongji-item {
text-align: center;
flex: 1;
}
.tongji-number {
font-size: 40rpx;
font-weight: 700;
color: #ffffff;
margin-bottom: 6rpx;
text-shadow: 0 0 10rpx rgba(255, 255, 255, 0.3);
}
.tongji-label {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.6);
}
.tongji-divider {
width: 1px;
height: 45rpx;
background: linear-gradient(to bottom,
transparent 0%,
rgba(100, 255, 255, 0.3) 50%,
transparent 100%);
}
/* 刷新按钮 - 固定在右上角 */
.shuaxin-anniu {
position: absolute;
top: 60rpx;
right: 60rpx;
z-index: 200;
display: flex;
align-items: center;
justify-content: center;
width: 70rpx;
height: 70rpx;
background: rgba(20, 20, 35, 0.95);
border-radius: 50%;
border: 1px solid rgba(100, 255, 255, 0.2);
box-shadow:
0 8rpx 20rpx rgba(0, 0, 0, 0.4),
0 0 20rpx rgba(100, 255, 255, 0.1);
backdrop-filter: blur(10px);
transition: all 0.3s ease;
}
.shuaxin-anniu:active {
transform: scale(0.95);
background: rgba(100, 255, 255, 0.1);
box-shadow:
0 4rpx 10rpx rgba(0, 0, 0, 0.3),
0 0 30rpx rgba(100, 255, 255, 0.2);
}
.shuaxin-icon {
font-size: 32rpx;
color: #00ffea;
transition: all 0.3s ease;
}
.shuaxin-disabled {
color: rgba(255, 255, 255, 0.3);
animation: rotate 1s linear infinite;
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* 滚动区域 - 只包裹列表部分 */
.scroll-area {
position: fixed;
top: 340rpx; /* 根据固定区域高度调整 */
left: 0;
right: 0;
bottom: 0;
z-index: 50;
}
/* 全局加载状态 */
.jiazai-quanju {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 120rpx 0;
}
.jiazai-spinner {
width: 80rpx;
height: 80rpx;
border: 4rpx solid rgba(100, 255, 255, 0.1);
border-top: 4rpx solid #00ffea;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 30rpx;
box-shadow: 0 0 20rpx rgba(0, 255, 234, 0.3);
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.jiazai-text {
font-size: 28rpx;
color: rgba(255, 255, 255, 0.7);
}
/* 空数据提示 */
.kong-shuju {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 120rpx 30rpx;
background: rgba(20, 20, 35, 0.5);
border-radius: 24rpx;
border: 1px solid rgba(100, 255, 255, 0.1);
margin: 40rpx 30rpx 0;
}
.kong-icon {
font-size: 100rpx;
margin-bottom: 30rpx;
color: rgba(255, 255, 255, 0.2);
}
.kong-text {
font-size: 32rpx;
color: rgba(255, 255, 255, 0.8);
margin-bottom: 10rpx;
font-weight: 500;
}
.kong-tip {
font-size: 26rpx;
color: rgba(255, 255, 255, 0.5);
margin-bottom: 50rpx;
}
.kong-btn {
padding: 20rpx 50rpx;
background: linear-gradient(90deg, #00ffea 0%, #0088ff 100%);
color: #000;
border-radius: 50rpx;
font-size: 28rpx;
font-weight: 600;
box-shadow: 0 8rpx 20rpx rgba(0, 255, 234, 0.3);
}
.kong-btn:active {
transform: scale(0.95);
box-shadow: 0 4rpx 10rpx rgba(0, 255, 234, 0.2);
}
/* 列表标题 */
.list-title {
margin: 0 30rpx 20rpx;
display: flex;
align-items: baseline;
}
.title-text {
font-size: 32rpx;
color: #ffffff;
font-weight: 600;
margin-right: 10rpx;
text-shadow: 0 0 10rpx rgba(255, 255, 255, 0.2);
}
.title-count {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.5);
}
/* 卡片列表 */
.card-list {
margin: 0 30rpx;
}
/* 打手卡片 - 赛博风格设计 */
.dashou-card {
position: relative;
display: flex;
align-items: center;
padding: 30rpx;
margin-bottom: 20rpx;
background: rgba(20, 20, 35, 0.7);
border-radius: 20rpx;
border: 1px solid rgba(100, 255, 255, 0.1);
box-shadow:
0 8rpx 24rpx rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(100, 255, 255, 0.05);
transition: all 0.3s ease;
}
.dashou-card:active {
transform: translateY(-2rpx);
background: rgba(30, 30, 50, 0.8);
box-shadow:
0 12rpx 30rpx rgba(0, 0, 0, 0.4),
0 0 20rpx rgba(100, 255, 255, 0.1);
}
/* 头像区域 - 纯圆形 */
.touxiang-quyu {
position: relative;
margin-right: 30rpx;
flex-shrink: 0;
}
.dashou-touxiang {
width: 100rpx;
height: 100rpx;
border-radius: 50%; /* 确保是纯圆形 */
z-index: 2;
position: relative;
}
.touxiang-border {
position: absolute;
top: -4rpx;
left: -4rpx;
width: 108rpx;
height: 108rpx;
border-radius: 50%;
background: linear-gradient(45deg, #00ffea, #ff00ff);
z-index: 1;
opacity: 0.3;
animation: borderGlow 2s linear infinite;
}
@keyframes borderGlow {
0%, 100% { opacity: 0.3; }
50% { opacity: 0.6; }
}
/* 信息区域 */
.xinxi-quyu {
flex: 1;
min-width: 0; /* 防止内容撑开 */
}
.nicheng {
font-size: 32rpx;
font-weight: 600;
color: #ffffff;
margin-bottom: 10rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-shadow: 0 0 10rpx rgba(255, 255, 255, 0.2);
}
.dashou-id {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.5);
letter-spacing: 1rpx;
}
/* 分红金额区域 */
.fenhong-quyu {
text-align: right;
flex-shrink: 0;
min-width: 180rpx;
}
.fenhong-value {
margin-bottom: 8rpx;
}
.fenhong-jiahao {
font-size: 26rpx;
color: #00ff00;
margin-right: 4rpx;
}
.fenhong-shuzi {
font-size: 32rpx;
font-weight: 700;
color: #00ff00;
text-shadow: 0 0 10rpx rgba(0, 255, 0, 0.5);
}
.shijian {
font-size: 22rpx;
color: rgba(255, 255, 255, 0.4);
}
/* 加载更多提示 */
.jiazai-gengduo {
display: flex;
flex-direction: column;
align-items: center;
padding: 40rpx 0 60rpx;
margin: 0 30rpx;
}
.gengduo-spinner {
width: 40rpx;
height: 40rpx;
border: 3rpx solid rgba(100, 255, 255, 0.1);
border-top: 3rpx solid #00ffea;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 20rpx;
}
.gengduo-text {
font-size: 26rpx;
color: rgba(255, 255, 255, 0.6);
}
/* 没有更多数据 */
.meiyou-gengduo {
display: flex;
flex-direction: column;
align-items: center;
padding: 50rpx 0 80rpx;
margin: 0 30rpx;
color: rgba(255, 255, 255, 0.4);
}
.meiyou-icon {
width: 60rpx;
height: 60rpx;
border-radius: 50%;
background: rgba(0, 255, 234, 0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
color: #00ffea;
margin-bottom: 20rpx;
border: 1px solid rgba(0, 255, 234, 0.2);
}
.meiyou-text {
font-size: 26rpx;
text-align: center;
}
/* 错误提示 */
.cuowu-quyu {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 100rpx 30rpx;
background: rgba(40, 20, 20, 0.8);
border-radius: 24rpx;
border: 1px solid rgba(255, 100, 100, 0.2);
margin: 40rpx 30rpx 0;
}
.cuowu-icon {
font-size: 80rpx;
color: #ff5555;
margin-bottom: 30rpx;
text-shadow: 0 0 20rpx rgba(255, 85, 85, 0.5);
}
.cuowu-text {
font-size: 30rpx;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 40rpx;
text-align: center;
line-height: 1.5;
}
.cuowu-btn {
padding: 20rpx 50rpx;
background: linear-gradient(90deg, #ff5555 0%, #ff8800 100%);
color: #fff;
border-radius: 50rpx;
font-size: 28rpx;
font-weight: 600;
box-shadow: 0 8rpx 20rpx rgba(255, 85, 85, 0.3);
}
.cuowu-btn:active {
transform: scale(0.95);
box-shadow: 0 4rpx 10rpx rgba(255, 85, 85, 0.2);
}
.page-container {
height: 100%;
background: linear-gradient(180deg, #f7dc51 0%, #fff 18%, #fff8e1 100%);
position: relative;
}
.fixed-top {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
padding: 16rpx 24rpx 20rpx;
background: linear-gradient(180deg, #f7dc51 0%, #ffd061 85%, #fff8e1 100%);
box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.06);
}
.tab-bar {
display: flex;
background: rgba(255, 255, 255, 0.75);
border-radius: 999rpx;
padding: 6rpx;
margin-bottom: 20rpx;
}
.tab-item {
flex: 1;
text-align: center;
padding: 16rpx 8rpx;
font-size: 26rpx;
color: #666;
border-radius: 999rpx;
transition: all 0.2s;
}
.tab-item.active {
background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #492f00;
font-weight: 700;
box-shadow: 0 4rpx 12rpx rgba(250, 180, 80, 0.35);
}
.stats-card {
background: #fef6d4;
border-radius: 24rpx;
padding: 28rpx 24rpx;
border: 2rpx solid rgba(255, 255, 255, 0.8);
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);
}
.stats-main {
text-align: center;
padding-bottom: 20rpx;
margin-bottom: 20rpx;
border-bottom: 1rpx solid rgba(0, 0, 0, 0.06);
}
.stats-label,
.stats-label-sm {
display: block;
font-size: 24rpx;
color: #888;
margin-bottom: 8rpx;
}
.stats-amount {
display: block;
font-size: 52rpx;
font-weight: 800;
color: #e65100;
line-height: 1.2;
}
.stats-amount-sm {
display: block;
font-size: 36rpx;
font-weight: 700;
color: #e65100;
}
.stats-tip {
display: block;
font-size: 22rpx;
color: #999;
margin-top: 6rpx;
}
.stats-row {
display: flex;
align-items: center;
justify-content: space-around;
}
.stats-row.three .stats-cell {
flex: 1;
text-align: center;
}
.stats-cell {
text-align: center;
flex: 1;
}
.stats-num {
display: block;
font-size: 36rpx;
font-weight: 700;
color: #333;
}
.stats-sub {
display: block;
font-size: 22rpx;
color: #888;
margin-top: 4rpx;
}
.stats-divider {
width: 1rpx;
height: 48rpx;
background: rgba(0, 0, 0, 0.08);
}
.dashou-hd {
text-align: center;
padding: 32rpx 24rpx;
}
.dashou-title {
display: block;
font-size: 32rpx;
font-weight: 700;
color: #333;
}
.dashou-sub {
display: block;
font-size: 24rpx;
color: #888;
margin-top: 8rpx;
}
.refresh-btn {
position: absolute;
top: 20rpx;
right: 36rpx;
width: 64rpx;
height: 64rpx;
background: rgba(255, 255, 255, 0.9);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
}
.refresh-icon {
font-size: 32rpx;
color: #e65100;
}
.refresh-icon.spin {
animation: spin 1s linear infinite;
opacity: 0.5;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* 调整滚动区域的顶部距离,增加间隔 */
.scroll-area { .scroll-area {
position: fixed; position: fixed;
top: 400rpx; /* 从 340rpx 增加到 360rpx,增加20rpx的间隔 */ top: 280rpx;
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
z-index: 50; z-index: 50;
} }
/* 如果觉得还不够,可以再增加列表标题的上边距 */ .scroll-area.has-tabs.dashou { top: 300rpx; }
.list-title { .scroll-area.has-tabs.guanshi { top: 420rpx; }
margin: 10rpx 30rpx 20rpx; /* 从 0 30rpx 20rpx 改为 10rpx 30rpx 20rpx */ .scroll-area.has-tabs.zuzhang { top: 320rpx; }
display: flex; .scroll-area.guanshi:not(.has-tabs) { top: 400rpx; }
align-items: baseline; .scroll-area.zuzhang:not(.has-tabs) { top: 300rpx; }
}
.state-box,
.empty-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 80rpx 40rpx;
margin: 24rpx;
background: #fff;
border-radius: 24rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
}
.spinner {
width: 64rpx;
height: 64rpx;
border: 4rpx solid #ffe082;
border-top-color: #e65100;
border-radius: 50%;
animation: spin 0.8s linear infinite;
margin-bottom: 20rpx;
}
.spinner.sm {
width: 36rpx;
height: 36rpx;
margin-bottom: 0;
margin-right: 12rpx;
}
.empty-icon {
font-size: 72rpx;
margin-bottom: 16rpx;
}
.empty-title {
font-size: 30rpx;
font-weight: 600;
color: #333;
margin-bottom: 8rpx;
}
.empty-tip {
font-size: 24rpx;
color: #999;
margin-bottom: 32rpx;
text-align: center;
}
.empty-btn {
padding: 16rpx 48rpx;
background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #492f00;
font-size: 28rpx;
font-weight: 600;
border-radius: 999rpx;
}
.list-hd {
display: flex;
align-items: baseline;
margin: 8rpx 24rpx 16rpx;
}
.list-title {
font-size: 30rpx;
font-weight: 700;
color: #333;
margin-right: 12rpx;
}
.list-count {
font-size: 24rpx;
color: #999;
}
.record-list {
padding: 0 24rpx 40rpx;
}
.record-card {
display: flex;
align-items: center;
padding: 24rpx;
margin-bottom: 16rpx;
background: #fff;
border-radius: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
}
.record-card.avatar-card .avatar {
width: 88rpx;
height: 88rpx;
border-radius: 50%;
margin-right: 20rpx;
flex-shrink: 0;
background: #eee;
}
.record-main {
flex: 1;
min-width: 0;
}
.record-title {
display: block;
font-size: 28rpx;
font-weight: 600;
color: #333;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.record-time {
display: block;
font-size: 22rpx;
color: #999;
margin-top: 6rpx;
}
.record-amt {
font-size: 30rpx;
font-weight: 700;
flex-shrink: 0;
}
.record-amt.plus {
color: #2e7d32;
}
.amt-col {
text-align: right;
}
.bonus-card {
display: flex;
align-items: center;
padding: 20rpx;
margin-bottom: 16rpx;
background: #fff;
border-radius: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
}
.bonus-left,
.bonus-right {
display: flex;
align-items: center;
flex: 1;
min-width: 0;
}
.bonus-right {
flex-direction: row;
justify-content: flex-end;
}
.avatar.sm {
width: 64rpx;
height: 64rpx;
border-radius: 50%;
margin-right: 12rpx;
flex-shrink: 0;
background: #eee;
}
.bonus-info {
min-width: 0;
flex: 1;
}
.bonus-mid {
display: flex;
flex-direction: column;
align-items: center;
padding: 0 8rpx;
flex-shrink: 0;
}
.bonus-tag {
font-size: 20rpx;
color: #999;
}
.bonus-arrow {
font-size: 24rpx;
color: #e65100;
}
.footer-tip {
display: flex;
align-items: center;
justify-content: center;
padding: 24rpx;
font-size: 24rpx;
color: #999;
}
.footer-tip.muted {
padding-bottom: 60rpx;
}
.error-bar {
position: fixed;
bottom: 40rpx;
left: 24rpx;
right: 24rpx;
z-index: 200;
background: #fff;
border-radius: 16rpx;
padding: 20rpx 24rpx;
display: flex;
align-items: center;
justify-content: space-between;
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.12);
font-size: 26rpx;
color: #666;
}
.error-btn {
padding: 10rpx 28rpx;
background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #492f00;
font-size: 24rpx;
font-weight: 600;
border-radius: 999rpx;
}
+412 -456
View File
@@ -1,484 +1,440 @@
// pages/withdraw/withdraw.js // pages/withdraw/components/mode1/mode1.js — 收款码手动审核纯提现
// 子组件版本 - 完整代码,仅适配生命周期,业务逻辑不动
import request from '../../../../utils/request.js'; import request from '../../../../utils/request.js';
import upload from '../../../../utils/upload.js'; import upload from '../../../../utils/upload.js';
import PopupService from '../../../../services/popupService.js'; import PopupService from '../../../../services/popupService.js';
const app = getApp(); const app = getApp();
const PAGE_SIZE = 10;
let lastPullDownTime = 0; const ASSET_TYPES = {
const PULL_DOWN_INTERVAL = 2000; dashou_yue: { leixing: 1, label: '接单员佣金' },
dashou_yajin: { leixing: 5, label: '接单员保证金' },
shangjia_yue: { leixing: 6, label: '商家余额' },
guanshi_fenyong: { leixing: 2, label: '管事分红' },
zuzhang_fenyong: { leixing: 3, label: '组长分红' },
kaoheguan_fenyong: { leixing: 4, label: '考核官分佣' },
};
const FROM_ASSET_MAP = {
dashou: 'dashou_yue',
guanshi: 'guanshi_fenyong',
zuzhang: 'zuzhang_fenyong',
kaoheguan: 'kaoheguan_fenyong',
kaohe: 'kaoheguan_fenyong',
shangjia: 'shangjia_yue',
yajin: 'dashou_yajin',
};
Component({ Component({
data: { properties: { options: { type: Object, value: {} } },
imgUrls: { data: {
pageBg: '', imgUrls: { iconWechat: '', iconAlipay: '' },
cardBg: '', assetList: [],
iconWechat: '', displayAssetList: [],
iconAlipay: '', totalAmount: '0.00',
iconRecord: '', canWithdraw: false,
iconRefresh: '', isLoadingAssets: false,
}, selectedAsset: null,
assetList: [],
totalAmount: '0.00',
selectedAsset: null,
txfangshi: null,
txdianhua: '',
txzh: '',
txtupian: '',
ossImageUrl: '',
showTixianModal: false,
tixianAmount: '',
shouxufei: '0.00',
shijidaozhang: '0.00',
currentRate: '0.00',
recordList: [],
page: 1,
nomore: false,
loading: false,
isRefreshing: false,
canloadmore: true,
showSkfsModal: false,
tempTxfangshi: null,
tempTxPhone: '',
tempTxAccount: '',
tempTxImage: '',
choosingImage: false,
showModifyModal: false,
modifyingRecord: null,
modifyTxfangshi: null,
modifyTxPhone: '',
modifyTxAccount: '',
modifyTxImage: '',
modifyImageUrl: '',
showFailModal: false,
currentFailReason: '',
isLoading: false,
},
attached() {
this.initImageUrls();
this.loadAllAssets();
this.loadWithdrawMethod();
this.loadWithdrawRecords(true);
},
pageLifetimes: {
show() {
this.registerNotification();
PopupService.checkAndShow(this, 'tixian');
},
hide() {
const popup = this.selectComponent('#popupNotice');
popup?.cleanup?.();
}
},
methods: {
// 下拉刷新
onPullDownRefresh() {
if (this.data.isRefreshing) {
wx.stopPullDownRefresh();
return;
}
this.setData({ isRefreshing: true });
this.loadWithdrawRecords(true).then(() => {
wx.stopPullDownRefresh();
this.setData({ isRefreshing: false });
}).catch(() => {
wx.stopPullDownRefresh();
this.setData({ isRefreshing: false });
});
},
// 底部按钮加载更多
loadMoreRecords() {
if (this.data.nomore) {
wx.showToast({ title: '没有更多记录了', icon: 'none' });
return;
}
if (this.data.loading) return;
this.loadWithdrawRecords();
},
initImageUrls() {
const ossBase = app.globalData.ossImageUrl || '';
const imgDir = `${ossBase}beijing/tixian/`;
this.setData({
imgUrls: {
pageBg: `${imgDir}page_bg.png`,
cardBg: `${imgDir}card_bg.png`,
iconWechat: `${imgDir}icon_wechat.png`,
iconAlipay: `${imgDir}icon_alipay.png`,
iconRecord: `${imgDir}icon_record.png`,
iconRefresh: `${imgDir}icon_refresh.png`,
assetTileBg: `${imgDir}asset_tile_bg.png`,
}
});
},
async loadAllAssets() {
this.setData({ isLoading: true });
try {
const res = await request({ url: '/yonghu/tixianzichan', method: 'POST' });
if (res?.data?.code === 200) {
const data = res.data.data;
const assets = [];
if (data.dashou_yue && parseFloat(data.dashou_yue) > 0) {
assets.push({ type: 'dashou_yue', label: '接单员佣金', amount: data.dashou_yue, rate: data.dashou_rate || 0 });
}
if (data.dashou_yajin && parseFloat(data.dashou_yajin) > 0) {
assets.push({ type: 'dashou_yajin', label: '接单员保证金', amount: data.dashou_yajin, rate: data.dashou_yajin_rate || 0 });
}
if (data.shangjia_yue && parseFloat(data.shangjia_yue) > 0) {
assets.push({ type: 'shangjia_yue', label: '商家余额', amount: data.shangjia_yue, rate: data.shangjia_rate || 0 });
}
if (data.guanshi_fenyong && parseFloat(data.guanshi_fenyong) > 0) {
assets.push({ type: 'guanshi_fenyong', label: '管事分红', amount: data.guanshi_fenyong, rate: data.guanshi_rate || 0 });
}
if (data.zuzhang_fenyong && parseFloat(data.zuzhang_fenyong) > 0) {
assets.push({ type: 'zuzhang_fenyong', label: '组长分红', amount: data.zuzhang_fenyong, rate: data.zuzhang_rate || 0 });
}
if (data.kaoheguan_fenyong && parseFloat(data.kaoheguan_fenyong) > 0) {
assets.push({ type: 'kaoheguan_fenyong', label: '考核官分佣', amount: data.kaoheguan_fenyong, rate: data.kaoheguan_rate || 0 });
}
let total = 0;
assets.forEach(item => { total += parseFloat(item.amount); });
this.setData({ assetList: assets, totalAmount: total.toFixed(2), isLoading: false });
// 缓存费率
wx.setStorageSync('dashouRate', data.dashou_rate || 0);
wx.setStorageSync('dashou_yajin_rate', data.dashou_yajin_rate || 0);
wx.setStorageSync('shangjia_rate', data.shangjia_rate || 0);
wx.setStorageSync('guanshi_rate', data.guanshi_rate || 0);
wx.setStorageSync('zuzhang_rate', data.zuzhang_rate || 0);
wx.setStorageSync('kaoheguan_rate', data.kaoheguan_rate || 0);
} else {
throw new Error(res?.data?.msg || '获取资产失败');
}
} catch (err) {
console.error(err);
wx.showToast({ title: '加载失败', icon: 'none' });
this.setData({ isLoading: false });
}
},
async loadWithdrawMethod() {
const txzh = wx.getStorageSync('txzh') || '';
const txtupian = wx.getStorageSync('txtupian') || '';
const txfangshi = wx.getStorageSync('txfangshi') || null;
const txdianhua = wx.getStorageSync('txdianhua') || '';
if (txzh || txtupian) {
this.setData({ txzh, txtupian, txfangshi, txdianhua, ossImageUrl: app.globalData.ossImageUrl || '' });
} else {
try {
const res = await request({ url: '/yonghu/tixianhq', method: 'POST' });
if (res?.data?.code === 0) {
const data = res.data.data;
this.setData({
txzh: data.txzh || '',
txtupian: data.txtupian || '',
txfangshi: data.txfangshi || null,
txdianhua: data.txdianhua || '',
});
wx.setStorageSync('txzh', data.txzh || '');
wx.setStorageSync('txtupian', data.txtupian || '');
wx.setStorageSync('txfangshi', data.txfangshi || null);
wx.setStorageSync('txdianhua', data.txdianhua || '');
}
} catch (err) {}
}
},
onSelectAsset(e) {
const index = e.currentTarget.dataset.index;
const asset = this.data.assetList[index];
if (!asset || parseFloat(asset.amount) <= 0) {
wx.showToast({ title: '无可提现金额', icon: 'none' });
return;
}
this.setData({
selectedAsset: asset,
showTixianModal: true,
tixianAmount: '', tixianAmount: '',
feeRateText: '--',
currentRate: '0%',
shouxufei: '0.00', shouxufei: '0.00',
shijidaozhang: '0.00', shijidaozhang: '0.00',
currentRate: asset.rate showTixianModal: false,
}); submitting: false,
txfangshi: null,
txdianhua: '',
txzh: '',
txtupian: '',
showSkfsModal: false,
tempTxfangshi: null,
tempTxPhone: '',
tempTxAccount: '',
tempTxImage: '',
choosingImage: false,
}, },
onAmountInput(e) { attached() {
let val = e.detail.value; this.initImageUrls();
if (val && !/^\d*\.?\d{0,2}$/.test(val)) return; this.loadAllAssets();
this.setData({ tixianAmount: val }); this.loadWithdrawMethod();
if (val && parseFloat(val) > 0) {
const amount = parseFloat(val);
const rate = parseFloat(this.data.selectedAsset.rate) || 0;
const fee = amount * rate;
const actual = amount - fee;
this.setData({ shouxufei: fee.toFixed(2), shijidaozhang: actual.toFixed(2) });
} else {
this.setData({ shouxufei: '0.00', shijidaozhang: '0.00' });
}
}, },
onQuickAmount(e) { pageLifetimes: {
const val = e.currentTarget.dataset.value; show() {
this.setData({ tixianAmount: val.toString() }); this.registerNotification();
this.onAmountInput({ detail: { value: val.toString() } }); this.loadAllAssets();
PopupService.checkAndShow(this, 'tixian');
},
hide() {
const popup = this.selectComponent('#popupNotice');
popup?.cleanup?.();
},
}, },
async onConfirmWithdraw() { methods: {
const { selectedAsset, tixianAmount, txfangshi, txzh, txtupian, txdianhua } = this.data; formatRatePercent(rate) {
if (!selectedAsset) { wx.showToast({ title: '请选择提现项目', icon: 'none' }); return; } const r = parseFloat(rate) || 0;
const amount = parseFloat(tixianAmount); if (r <= 1 && r > 0) return `${(r * 100).toFixed(0)}%`;
if (isNaN(amount) || amount <= 0) { wx.showToast({ title: '请输入有效金额', icon: 'none' }); return; } return `${r}%`;
if (amount > parseFloat(selectedAsset.amount)) { wx.showToast({ title: '超过可提现金额', icon: 'none' }); return; } },
if (!txfangshi || (!txzh && !txtupian)) {
wx.showToast({ title: '请先设置收款方式', icon: 'none' }); registerNotification() {
this.setData({ showTixianModal: false }); const comp = this.selectComponent('#global-notification');
this.onSetSkfs(); if (comp?.showNotification) {
return; app.globalData.globalNotification = {
} show: (data) => comp.showNotification(data),
let leixing = 1; hide: () => comp.hideNotification(),
switch (selectedAsset.type) { };
case 'dashou_yue': leixing = 1; break;
case 'dashou_yajin': leixing = 5; break;
case 'shangjia_yue': leixing = 6; break;
case 'guanshi_fenyong': leixing = 2; break;
case 'zuzhang_fenyong': leixing = 3; break;
case 'kaoheguan_fenyong': leixing = 4; break;
}
let txskfs = 0;
if (txzh && txtupian) txskfs = 3;
else if (txzh) txskfs = 1;
else if (txtupian) txskfs = 2;
try {
const res = await request({
url: '/yonghu/tixian',
method: 'POST',
data: { leixing, jine: amount.toFixed(2), fangshi: txfangshi, txskfs }
});
if (res?.data?.code === 0) {
const newAssetList = this.data.assetList.map(item => {
if (item.type === selectedAsset.type) {
const newAmount = (parseFloat(item.amount) - amount).toFixed(2);
return { ...item, amount: newAmount };
} }
return item; },
});
let newTotal = 0;
newAssetList.forEach(item => { newTotal += parseFloat(item.amount); });
this.setData({ assetList: newAssetList, totalAmount: newTotal.toFixed(2), showTixianModal: false, selectedAsset: null });
this.loadWithdrawRecords(true);
wx.showToast({ title: '提现申请已提交', icon: 'success' });
} else {
wx.showToast({ title: res?.data?.msg || '提现失败', icon: 'none' });
}
} catch (err) {
wx.showToast({ title: '网络错误', icon: 'none' });
}
},
onCloseTixianModal() { initImageUrls() {
this.setData({ showTixianModal: false, selectedAsset: null, tixianAmount: '' }); const ossBase = app.globalData.ossImageUrl || '';
}, const imgDir = `${ossBase}beijing/tixian/`;
this.setData({
imgUrls: {
iconWechat: `${imgDir}icon_wechat.png`,
iconAlipay: `${imgDir}icon_alipay.png`,
},
});
},
onSetSkfs() { /** 顶部展示:不含保证金的可提现合计 */
this.setData({ calcDisplayTotal(assets) {
showSkfsModal: true, let total = 0;
tempTxfangshi: this.data.txfangshi, (assets || []).forEach((item) => {
tempTxPhone: this.data.txdianhua, if (item.type === 'dashou_yajin') return;
tempTxAccount: this.data.txzh, total += parseFloat(item.amount) || 0;
tempTxImage: '' });
}); return total;
}, },
onSelectFangshi(e) { hasAnyWithdrawable(assets) {
this.setData({ tempTxfangshi: e.currentTarget.dataset.fangshi }); return (assets || []).some((item) => parseFloat(item.amount) > 0);
}, },
onPhoneInput(e) { this.setData({ tempTxPhone: e.detail.value }); }, applyRouteOptions(assets) {
onAccountInput(e) { this.setData({ tempTxAccount: e.detail.value }); }, const opts = this.properties.options || {};
const fromKey = FROM_ASSET_MAP[opts.from];
onChooseImage() { let selected = null;
if (this.data.choosingImage) return; if (fromKey) {
this.setData({ choosingImage: true }); selected = assets.find((a) => a.type === fromKey) || null;
wx.chooseMedia({ } else if (assets.length === 1) {
count: 1, mediaType: ['image'], selected = assets[0];
success: (res) => { this.setData({ tempTxImage: res.tempFiles[0].tempFilePath }); },
complete: () => { this.setData({ choosingImage: false }); }
});
},
onPreviewImage() {
if (this.data.tempTxImage) wx.previewImage({ urls: [this.data.tempTxImage] });
},
onDeleteImage() { this.setData({ tempTxImage: '' }); },
async onConfirmSkfs() {
const { tempTxfangshi, tempTxPhone, tempTxAccount, tempTxImage } = this.data;
if (!tempTxfangshi) { wx.showToast({ title: '请选择提现方式', icon: 'none' }); return; }
if (!tempTxPhone) { wx.showToast({ title: '请输入收款人电话', icon: 'none' }); return; }
if (tempTxfangshi == 1 && !tempTxImage) { wx.showToast({ title: '请上传微信收款码', icon: 'none' }); return; }
if (tempTxfangshi == 2 && !tempTxAccount && !tempTxImage) {
wx.showToast({ title: '请填写支付宝账号或上传收款码', icon: 'none' }); return;
}
const formData = { txdianhua: tempTxPhone, txzh: tempTxAccount || '' };
try {
const res = await upload({ url: '/yonghu/sksc', formData, filePath: tempTxImage || null, fileName: 'file' });
if (res?.data?.code === 0) {
const data = res.data.data;
this.setData({
txfangshi: tempTxfangshi, txdianhua: tempTxPhone, txzh: data.txzh || '', txtupian: data.txtupian || '', showSkfsModal: false
});
wx.setStorageSync('txfangshi', tempTxfangshi);
wx.setStorageSync('txdianhua', tempTxPhone);
wx.setStorageSync('txzh', data.txzh || '');
wx.setStorageSync('txtupian', data.txtupian || '');
wx.showToast({ title: '设置成功', icon: 'success' });
} else {
wx.showToast({ title: res?.data?.msg || '保存失败', icon: 'none' });
}
} catch (err) {
wx.showToast({ title: '网络错误', icon: 'none' });
}
},
onCloseSkfsModal() { this.setData({ showSkfsModal: false }); },
async loadWithdrawRecords(refresh = false) {
const now = Date.now();
if (now - lastPullDownTime < PULL_DOWN_INTERVAL && !refresh) return;
if (this.data.loading || this.data.isRefreshing) return;
const page = refresh ? 1 : this.data.page;
if (this.data.nomore && !refresh) return;
this.setData({ loading: true, isRefreshing: refresh });
lastPullDownTime = now;
try {
const res = await request({ url: '/yonghu/tixianjiluhq', method: 'POST', data: { page, limit: PAGE_SIZE } });
if (res?.data?.code === 0) {
const list = (res.data.data.list || []).map(item => ({
...item,
statusText: this.getStatusText(item.zhuangtai),
statusColor: this.getStatusColor(item.zhuangtai)
}));
const newList = refresh ? list : [...this.data.recordList, ...list];
const hasMore = res.data.data.has_more === true;
this.setData({
recordList: newList, page: page + 1, nomore: !hasMore, canloadmore: hasMore,
loading: false, isRefreshing: false
});
} else {
this.setData({ loading: false, isRefreshing: false });
}
} catch (err) {
this.setData({ loading: false, isRefreshing: false });
}
},
onModifyRecord(e) {
const record = e.currentTarget.dataset.record;
if (parseInt(record.zhuangtai) !== 1) {
wx.showToast({ title: '只有审核中的记录可修改', icon: 'none' });
return;
}
this.setData({
modifyingRecord: record,
modifyTxfangshi: record.fangshi,
modifyTxPhone: record.txdianhua || '',
modifyTxAccount: record.txzh || '',
modifyTxImage: '',
modifyImageUrl: record.txtupian ? (app.globalData.ossImageUrl + record.txtupian) : '',
showModifyModal: true
});
},
onSelectModifyFangshi(e) { this.setData({ modifyTxfangshi: e.currentTarget.dataset.fangshi }); },
onModifyPhoneInput(e) { this.setData({ modifyTxPhone: e.detail.value }); },
onModifyAccountInput(e) { this.setData({ modifyTxAccount: e.detail.value }); },
onChooseModifyImage() {
if (this.data.choosingImage) return;
this.setData({ choosingImage: true });
wx.chooseMedia({
count: 1, mediaType: ['image'],
success: (res) => { this.setData({ modifyTxImage: res.tempFiles[0].tempFilePath }); },
complete: () => { this.setData({ choosingImage: false }); }
});
},
onPreviewModifyImage() {
if (this.data.modifyTxImage) wx.previewImage({ urls: [this.data.modifyTxImage] });
else if (this.data.modifyImageUrl) wx.previewImage({ urls: [this.data.modifyImageUrl] });
},
onDeleteModifyImage() { this.setData({ modifyTxImage: '' }); },
async onConfirmModify() {
const { modifyTxfangshi, modifyTxPhone, modifyTxAccount, modifyTxImage, modifyingRecord } = this.data;
if (!modifyTxfangshi) { wx.showToast({ title: '请选择提现方式', icon: 'none' }); return; }
if (!modifyTxPhone) { wx.showToast({ title: '请输入收款人电话', icon: 'none' }); return; }
if (modifyTxfangshi == 1 && !modifyTxImage) { wx.showToast({ title: '请上传微信收款码', icon: 'none' }); return; }
if (modifyTxfangshi == 2 && !modifyTxAccount && !modifyTxImage) {
wx.showToast({ title: '请填写支付宝账号或上传收款码', icon: 'none' }); return;
}
const formData = { tixian_id: modifyingRecord.id, fangshi: modifyTxfangshi, txdianhua: modifyTxPhone, txzh: modifyTxAccount || '' };
try {
const res = await upload({ url: '/yonghu/yonghutxshxg', formData, filePath: modifyTxImage || null, fileName: 'file' });
if (res?.data?.code === 0) {
const data = res.data.data;
const newList = this.data.recordList.map(item => {
if (item.id === modifyingRecord.id) {
return { ...item, fangshi: modifyTxfangshi, txdianhua: modifyTxPhone, txzh: modifyTxAccount || '', txtupian: data.txtupian || modifyingRecord.txtupian };
} }
return item; const patch = {};
}); if (selected) {
this.setData({ recordList: newList, showModifyModal: false, modifyingRecord: null }); patch.selectedAsset = selected;
wx.showToast({ title: '修改成功', icon: 'success' }); patch.feeRateText = selected.rateText;
} else { }
wx.showToast({ title: res?.data?.msg || '修改失败', icon: 'none' }); if (opts.amount && parseFloat(opts.amount) > 0) {
} const amt = parseFloat(opts.amount);
} catch (err) { const max = selected ? parseFloat(selected.amount) : amt;
wx.showToast({ title: '网络错误', icon: 'none' }); patch.tixianAmount = Math.min(amt, max).toFixed(2);
} }
}, if (Object.keys(patch).length) {
this.setData(patch, () => {
this.recalcFee(this.data.tixianAmount, this.data.selectedAsset);
});
}
},
onCloseModifyModal() { this.setData({ showModifyModal: false, modifyingRecord: null }); }, onSelectAsset(e) {
const index = e.currentTarget.dataset.index;
const asset = this.data.displayAssetList[index];
if (!asset || parseFloat(asset.amount) <= 0) {
wx.showToast({ title: '该账户无可提余额', icon: 'none' });
return;
}
let amount = this.data.tixianAmount;
const max = parseFloat(asset.amount);
if (amount && parseFloat(amount) > max) {
amount = asset.amount;
}
this.setData({ selectedAsset: asset, tixianAmount: amount });
this.recalcFee(amount, asset);
},
onViewFailReason(e) { async loadAllAssets() {
const record = e.currentTarget.dataset.record; this.setData({ isLoadingAssets: true, totalAmount: '0.00', canWithdraw: false, assetList: [] });
const reason = record.fail_reason || record.shibaiyuanyin || '暂无详细信息'; try {
this.setData({ currentFailReason: reason, showFailModal: true }); const res = await request({ url: '/yonghu/tixianzichan', method: 'POST' });
}, if (res?.data?.code === 200 || res?.data?.code === 0) {
const data = res.data.data || {};
const assets = [];
const push = (type, amount, rate) => {
const cfg = ASSET_TYPES[type];
if (!cfg || !amount || parseFloat(amount) <= 0) return;
assets.push({
type,
leixing: cfg.leixing,
label: cfg.label,
amount: parseFloat(amount).toFixed(2),
rate: rate || 0,
rateText: this.formatRatePercent(rate || 0),
});
};
push('dashou_yue', data.dashou_yue, data.dashou_rate);
push('dashou_yajin', data.dashou_yajin, data.dashou_yajin_rate);
push('shangjia_yue', data.shangjia_yue, data.shangjia_rate);
push('guanshi_fenyong', data.guanshi_fenyong, data.guanshi_rate);
push('zuzhang_fenyong', data.zuzhang_fenyong, data.zuzhang_rate);
push('kaoheguan_fenyong', data.kaoheguan_fenyong, data.kaoheguan_rate);
onCloseFailModal() { this.setData({ showFailModal: false }); }, const displayTotal = this.calcDisplayTotal(assets);
const firstRate = assets.find((a) => a.type !== 'dashou_yajin')?.rate || 0;
this.setData({
assetList: assets,
displayAssetList: assets,
totalAmount: displayTotal.toFixed(2),
canWithdraw: this.hasAnyWithdrawable(assets),
isLoadingAssets: false,
feeRateText: displayTotal > 0 ? this.formatRatePercent(firstRate) : '--',
}, () => this.applyRouteOptions(assets));
if (!this.data.selectedAsset) {
this.recalcFee(this.data.tixianAmount, null);
}
} else {
throw new Error(res?.data?.msg || '获取资产失败');
}
} catch (err) {
console.error('loadAllAssets', err);
this.setData({ isLoadingAssets: false, totalAmount: '0.00', canWithdraw: false, assetList: [] });
}
},
getStatusText(zhuangtai) { async loadWithdrawMethod() {
const s = parseInt(zhuangtai); const txzh = wx.getStorageSync('txzh') || '';
if (s === 1) return '审核中'; const txtupian = wx.getStorageSync('txtupian') || '';
if (s === 2) return '成功'; const txfangshi = wx.getStorageSync('txfangshi') || null;
if (s === 3) return '失败'; const txdianhua = wx.getStorageSync('txdianhua') || '';
return '未知'; if (txzh || txtupian || txfangshi) {
}, this.setData({ txzh, txtupian, txfangshi, txdianhua });
getStatusColor(zhuangtai) { return;
const s = parseInt(zhuangtai); }
if (s === 1) return '#F5A623'; try {
if (s === 2) return '#2ED158'; const res = await request({ url: '/yonghu/tixianhq', method: 'POST' });
if (s === 3) return '#FF4D4F'; if (res?.data?.code === 0) {
return '#999'; const data = res.data.data;
}, this.setData({
txzh: data.txzh || '',
txtupian: data.txtupian || '',
txfangshi: data.txfangshi || null,
txdianhua: data.txdianhua || '',
});
wx.setStorageSync('txzh', data.txzh || '');
wx.setStorageSync('txtupian', data.txtupian || '');
wx.setStorageSync('txfangshi', data.txfangshi || null);
wx.setStorageSync('txdianhua', data.txdianhua || '');
}
} catch (err) { /* ignore */ }
},
registerNotification() { recalcFee(amountStr, asset) {
const comp = this.selectComponent('#global-notification'); const amount = parseFloat(amountStr);
if (comp?.showNotification) { if (!amountStr || isNaN(amount) || amount <= 0 || !asset) {
app.globalData.globalNotification = { this.setData({
show: (data) => comp.showNotification(data), shouxufei: '0.00',
hide: () => comp.hideNotification() shijidaozhang: '0.00',
}; feeRateText: asset ? asset.rateText : this.data.feeRateText,
} });
return;
}
const rate = parseFloat(asset.rate) || 0;
const fee = amount * rate;
this.setData({
shouxufei: fee.toFixed(2),
shijidaozhang: (amount - fee).toFixed(2),
feeRateText: asset.rateText,
currentRate: asset.rateText,
});
},
onAmountInput(e) {
let val = e.detail.value;
if (val && !/^\d*\.?\d{0,2}$/.test(val)) return;
this.setData({ tixianAmount: val });
this.recalcFee(val, this.data.selectedAsset);
},
onWithdrawAll() {
const { selectedAsset } = this.data;
if (!selectedAsset) {
wx.showToast({ title: '请先选择提现账户', icon: 'none' });
return;
}
const max = selectedAsset.amount;
this.setData({ tixianAmount: max });
this.recalcFee(max, selectedAsset);
},
onTapWithdraw() {
if (this.data.submitting) return;
if (!this.hasAnyWithdrawable(this.data.assetList)) {
wx.showToast({ title: '暂无可提现余额', icon: 'none' });
return;
}
const { selectedAsset, tixianAmount } = this.data;
if (!selectedAsset) {
wx.showToast({ title: '请先选择要提现的账户', icon: 'none' });
return;
}
const amount = parseFloat(tixianAmount);
if (isNaN(amount) || amount <= 0) {
wx.showToast({ title: '请输入有效金额', icon: 'none' });
return;
}
if (amount > parseFloat(selectedAsset.amount)) {
wx.showToast({ title: `超过${selectedAsset.label}可提余额`, icon: 'none' });
return;
}
const { txfangshi, txzh, txtupian } = this.data;
if (!txfangshi || (!txzh && !txtupian)) {
wx.showToast({ title: '请先设置收款方式', icon: 'none' });
this.onSetSkfs();
return;
}
this.applyIdentityAndConfirm(selectedAsset);
},
applyIdentityAndConfirm(asset) {
this.recalcFee(this.data.tixianAmount, asset);
this.setData({ selectedAsset: asset, showTixianModal: true });
},
async onConfirmWithdraw() {
const { selectedAsset, tixianAmount, txfangshi, txzh, txtupian } = this.data;
if (!selectedAsset) {
wx.showToast({ title: '请选择提现身份', icon: 'none' });
return;
}
const amount = parseFloat(tixianAmount);
if (isNaN(amount) || amount <= 0) {
wx.showToast({ title: '请输入有效金额', icon: 'none' });
return;
}
if (amount > parseFloat(selectedAsset.amount)) {
wx.showToast({ title: '超过可提余额', icon: 'none' });
return;
}
const leixing = selectedAsset.leixing;
let txskfs = 0;
if (txzh && txtupian) txskfs = 3;
else if (txzh) txskfs = 1;
else if (txtupian) txskfs = 2;
this.setData({ submitting: true });
try {
const res = await request({
url: '/yonghu/tixian',
method: 'POST',
data: { leixing, jine: amount.toFixed(2), fangshi: txfangshi, txskfs },
});
if (res?.data?.code === 0) {
this.setData({
showTixianModal: false,
selectedAsset: null,
tixianAmount: '',
submitting: false,
});
await this.loadAllAssets();
wx.showModal({
title: '申请成功',
content: '提现申请已提交,请前往「提现记录」查看审核进度。',
confirmText: '查看提现记录',
cancelText: '知道了',
success: (res) => {
if (res.confirm) {
wx.navigateTo({ url: '/pages/withdraw/withdraw-records' });
}
},
});
} else {
wx.showToast({ title: res?.data?.msg || '提现失败', icon: 'none' });
this.setData({ submitting: false });
}
} catch (err) {
wx.showToast({ title: '网络错误', icon: 'none' });
this.setData({ submitting: false });
}
},
onCloseTixianModal() {
if (this.data.submitting) return;
this.setData({ showTixianModal: false, selectedAsset: null });
},
onSetSkfs() {
this.setData({
showSkfsModal: true,
tempTxfangshi: this.data.txfangshi,
tempTxPhone: this.data.txdianhua,
tempTxAccount: this.data.txzh,
tempTxImage: '',
});
},
onSelectFangshi(e) { this.setData({ tempTxfangshi: e.currentTarget.dataset.fangshi }); },
onPhoneInput(e) { this.setData({ tempTxPhone: e.detail.value }); },
onAccountInput(e) { this.setData({ tempTxAccount: e.detail.value }); },
onChooseImage() {
if (this.data.choosingImage) return;
this.setData({ choosingImage: true });
wx.chooseMedia({
count: 1,
mediaType: ['image'],
success: (res) => { this.setData({ tempTxImage: res.tempFiles[0].tempFilePath }); },
complete: () => { this.setData({ choosingImage: false }); },
});
},
onPreviewImage() {
if (this.data.tempTxImage) wx.previewImage({ urls: [this.data.tempTxImage] });
},
onDeleteImage() { this.setData({ tempTxImage: '' }); },
async onConfirmSkfs() {
const { tempTxfangshi, tempTxPhone, tempTxAccount, tempTxImage } = this.data;
if (!tempTxfangshi) { wx.showToast({ title: '请选择提现方式', icon: 'none' }); return; }
if (!tempTxPhone) { wx.showToast({ title: '请输入收款人电话', icon: 'none' }); return; }
if (tempTxfangshi == 1 && !tempTxImage && !this.data.txtupian) {
wx.showToast({ title: '请上传微信收款码', icon: 'none' }); return;
}
if (tempTxfangshi == 2 && !tempTxAccount && !tempTxImage && !this.data.txzh) {
wx.showToast({ title: '请填写支付宝账号或上传收款码', icon: 'none' }); return;
}
try {
const res = await upload({
url: '/yonghu/sksc',
formData: { txdianhua: tempTxPhone, txzh: tempTxAccount || '' },
filePath: tempTxImage || null,
fileName: 'file',
});
if (res?.data?.code === 0) {
const data = res.data.data;
this.setData({
txfangshi: tempTxfangshi,
txdianhua: tempTxPhone,
txzh: data.txzh || '',
txtupian: data.txtupian || this.data.txtupian,
showSkfsModal: false,
});
wx.setStorageSync('txfangshi', tempTxfangshi);
wx.setStorageSync('txdianhua', tempTxPhone);
wx.setStorageSync('txzh', data.txzh || '');
wx.setStorageSync('txtupian', data.txtupian || this.data.txtupian);
wx.showToast({ title: '设置成功', icon: 'success' });
} else {
wx.showToast({ title: res?.data?.msg || '保存失败', icon: 'none' });
}
} catch (err) {
wx.showToast({ title: '网络错误', icon: 'none' });
}
},
onCloseSkfsModal() { this.setData({ showSkfsModal: false }); },
stopPropagation() {},
}, },
stopPropagation() {} });
}
});
+86 -104
View File
@@ -1,133 +1,115 @@
<!-- pages/withdraw/withdraw.wxml --> <!-- mode1 收款码手动审核 - 参考逍遥梦样式 -->
<!-- 最终版:资产卡片添加背景图,微调模糊 --> <view class="ref-page">
<view class="method-card method-card--row">
<view class="app"> <view class="method-tab method-tab--active">
<!-- 页面背景(全局模糊降低) --> <image wx:if="{{txfangshi == 1}}" class="method-tab-icon" src="{{imgUrls.iconWechat}}" mode="aspectFit" />
<image class="global-bg" src="{{imgUrls.pageBg}}" mode="aspectFill" /> <image wx:elif="{{txfangshi == 2}}" class="method-tab-icon" src="{{imgUrls.iconAlipay}}" mode="aspectFit" />
<view wx:else class="method-tab-icon method-tab-icon--placeholder"></view>
<!-- 资产区域 --> <text class="method-tab-text">{{txfangshi == 1 ? '微信零钱' : (txfangshi == 2 ? '收款码' : '请先设置收款')}}</text>
<view class="assets-section"> <view class="method-tab-line"></view>
<view class="main-card" style="background-image: url('{{imgUrls.cardBg}}'); background-size: cover;">
<!-- 总余额 -->
<view class="balance-wrap">
<text class="balance-label">可提总余额</text>
<text class="balance-value">¥{{totalAmount}}</text>
</view>
<!-- 内部分隔线 -->
<view class="inner-divider"></view>
<!-- 左右滑动提示 -->
<text class="assets-hint">← 左右滑动查看更多资产 →</text>
<!-- 资产横向滚动区 -->
<scroll-view class="assets-scroll" scroll-x="true" show-scrollbar="{{false}}" enhanced>
<view class="assets-track">
<block wx:for="{{assetList}}" wx:key="index">
<!-- 每个资产卡片加上自己的背景图 -->
<view class="asset-tile" bindtap="onSelectAsset" data-index="{{index}}" style="background-image: url('{{imgUrls.assetTileBg}}'); background-size: cover; background-position: center;">
<text class="asset-name">{{item.label}}</text>
<text class="asset-balance">¥{{item.amount}}</text>
<text class="asset-fee">费率 {{item.rate}}%</text>
</view>
</block>
<view wx:if="{{assetList.length === 0 && !isLoading}}" class="assets-empty">暂无可用资金</view>
</view>
</scroll-view>
</view> </view>
<text class="method-setting" bindtap="onSetSkfs">设置收款方式</text>
<!-- 层次分隔线 -->
<view class="divider-line"></view>
</view> </view>
<!-- 提现记录区 --> <view class="account-card" wx:if="{{displayAssetList.length > 0}}">
<view class="history-section"> <scroll-view scroll-x enable-flex class="account-scroll" show-scrollbar="{{false}}">
<view class="history-header"> <view
<text class="history-title">提现记录</text> wx:for="{{displayAssetList}}"
<text class="history-settings" bindtap="onSetSkfs">收款方式</text> wx:key="type"
</view> class="account-chip {{selectedAsset.type === item.type ? 'account-chip--active' : ''}} {{item.amount <= 0 ? 'account-chip--disabled' : ''}}"
<scroll-view class="history-scroll" scroll-y enable-back-to-top bindscrolltolower="onLoadMoreFromScroll"> bindtap="onSelectAsset"
<view wx:for="{{recordList}}" wx:key="index" class="history-item"> data-index="{{index}}"
<view class="history-info"> >
<text class="history-amount">¥{{item.jine}}</text> <text class="chip-label">{{item.label}}</text>
<text class="history-time">{{item.create}}</text> <text class="chip-amount">¥{{item.amount}}</text>
</view>
<view class="history-detail">
<text class="history-method">{{item.fangshi == 1 ? '微信' : '支付宝'}}</text>
<text class="history-type">{{item.leixing == 1 ? '佣金' : (item.leixing == 2 ? '分红' : (item.leixing == 3 ? '组长' : (item.leixing == 4 ? '考核官' : '保证金')))}}</text>
</view>
<view class="history-status">
<view wx:if="{{item.zhuangtai == 1}}" class="status-badge status-wait" bindtap="onModifyRecord" data-record="{{item}}">{{item.statusText}} ✏修改</view>
<view wx:elif="{{item.zhuangtai == 3}}" class="status-badge status-fail">
{{item.statusText}}
<text class="fail-link" bindtap="onViewFailReason" data-record="{{item}}">详情</text>
</view>
<view wx:else class="status-badge status-done">{{item.statusText}}</view>
</view>
</view> </view>
<view wx:if="{{loading}}" class="load-tip">加载中...</view>
<view wx:if="{{nomore && recordList.length > 0}}" class="more-tip">—— 没有更多了 ——</view>
<view wx:if="{{!nomore && recordList.length > 0}}" class="load-more-btn" bindtap="loadMoreRecords">加载更多记录</view>
</scroll-view> </scroll-view>
<text wx:if="{{!selectedAsset}}" class="account-warn">请先选择上方提现账户</text>
<text wx:else class="account-ok">当前:{{selectedAsset.label}}</text>
</view> </view>
<view class="safe-bottom"></view> <view class="amount-card">
<view class="avail-row">
<text class="avail-label">当前可提现:</text>
<text class="avail-symbol">¥</text>
<text class="avail-amount">{{selectedAsset ? selectedAsset.amount : totalAmount}}</text>
</view>
<view class="input-row">
<text class="input-symbol">¥</text>
<input
class="amount-input"
type="digit"
placeholder="请输入金额"
placeholder-class="amount-placeholder"
value="{{tixianAmount}}"
bindinput="onAmountInput"
/>
<text class="withdraw-all" bindtap="onWithdrawAll">全部提现</text>
</view>
<view class="input-divider"></view>
<view class="fee-tip">
<text>提示:提现手续费</text>
<text class="fee-highlight">{{feeRateText}}</text>
<text>。</text>
</view>
</view>
<view class="submit-wrap">
<view class="confirm-btn {{canWithdraw && !submitting ? '' : 'confirm-btn--disabled'}}" bindtap="onTapWithdraw">
<text wx:if="{{submitting}}">处理中...</text>
<text wx:else>确认提现</text>
</view>
</view>
<view class="notice-box">
<view class="notice-title">📢 提现须知</view>
<view class="notice-item">🕒 提交后将进入人工审核,请耐心等待</view>
<view class="notice-item">📌 审核结果可在「提现记录」中查看</view>
<view class="notice-item">💰 每笔只能从单个账户提现,请先选择对应账户</view>
<view class="notice-item">✅ 请确保收款方式与收款码正确后再提交</view>
<view class="notice-item">🎧 如有疑问请联系客服核实处理</view>
</view>
</view> </view>
<!-- ========== 弹窗(完整保留,无省略) ========== -->
<!-- 提现弹窗 -->
<view wx:if="{{showTixianModal}}" class="modal-mask" bindtap="onCloseTixianModal"> <view wx:if="{{showTixianModal}}" class="modal-mask" bindtap="onCloseTixianModal">
<view class="modal-dialog" catchtap="stopPropagation"> <view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">提现</view> <view class="modal-header">确认提现</view>
<view class="modal-body"> <view class="modal-body">
<view class="info-row"><text>项目</text><text>{{selectedAsset.label}}</text></view> <view class="info-row"><text>身份</text><text>{{selectedAsset.label}}</text></view>
<view class="info-row"><text>可提</text><text>¥{{selectedAsset.amount}}</text></view> <view class="info-row"><text>可提</text><text>¥{{selectedAsset.amount}}</text></view>
<view class="info-row"><text>费率</text><text>{{currentRate}}%</text></view> <view class="info-row"><text>费率</text><text>{{currentRate}}</text></view>
<view class="amount-row"><text>金额</text><input type="digit" placeholder="0.00" value="{{tixianAmount}}" bindinput="onAmountInput" /></view> <view class="info-row"><text>提现金额</text><text>¥{{tixianAmount}}</text></view>
<view class="quick-row"><view wx:for="{{[100,200,500,1000]}}" wx:key="item" class="quick-chip" data-value="{{item}}" bindtap="onQuickAmount">¥{{item}}</view></view>
<view class="fee-row"><text>手续费 ¥{{shouxufei}}</text><text>到账 ¥{{shijidaozhang}}</text></view> <view class="fee-row"><text>手续费 ¥{{shouxufei}}</text><text>到账 ¥{{shijidaozhang}}</text></view>
<view class="method-row"><text>收款方式 {{txfangshi == 1 ? '微信' : (txfangshi == 2 ? '支付宝' : '未设置')}}</text><text class="link-text" bindtap="onSetSkfs">更换</text></view> <view class="info-row"><text>收款</text><text>{{txfangshi == 1 ? '微信' : (txfangshi == 2 ? '支付宝' : '未设置')}}</text></view>
</view>
<view class="modal-footer">
<view class="modal-btn cancel" bindtap="onCloseTixianModal">取消</view>
<view class="modal-btn confirm" bindtap="onConfirmWithdraw">{{submitting ? '处理中' : '提交申请'}}</view>
</view> </view>
<view class="modal-footer"><view class="modal-btn cancel" bindtap="onCloseTixianModal">取消</view><view class="modal-btn confirm" bindtap="onConfirmWithdraw">确认</view></view>
</view> </view>
</view> </view>
<!-- 设置收款方式弹窗 -->
<view wx:if="{{showSkfsModal}}" class="modal-mask" bindtap="onCloseSkfsModal"> <view wx:if="{{showSkfsModal}}" class="modal-mask" bindtap="onCloseSkfsModal">
<view class="modal-dialog" catchtap="stopPropagation"> <view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">收款方式</view> <view class="modal-header">收款方式</view>
<view class="modal-body"> <view class="modal-body skfs-body">
<view class="toggle-row"><view class="toggle-item {{tempTxfangshi == 1 ? 'active' : ''}}" bindtap="onSelectFangshi" data-fangshi="1">微信</view><view class="toggle-item {{tempTxfangshi == 2 ? 'active' : ''}}" bindtap="onSelectFangshi" data-fangshi="2">支付宝</view></view> <view class="toggle-row">
<view class="toggle-item {{tempTxfangshi == 1 ? 'active' : ''}}" bindtap="onSelectFangshi" data-fangshi="1">微信</view>
<view class="toggle-item {{tempTxfangshi == 2 ? 'active' : ''}}" bindtap="onSelectFangshi" data-fangshi="2">支付宝</view>
</view>
<input class="field-input" placeholder="手机号" value="{{tempTxPhone}}" bindinput="onPhoneInput" /> <input class="field-input" placeholder="手机号" value="{{tempTxPhone}}" bindinput="onPhoneInput" />
<view wx:if="{{tempTxfangshi == 2}}"><input class="field-input" placeholder="支付宝账号" value="{{tempTxAccount}}" bindinput="onAccountInput" /></view> <view wx:if="{{tempTxfangshi == 2}}"><input class="field-input" placeholder="支付宝账号" value="{{tempTxAccount}}" bindinput="onAccountInput" /></view>
<view class="upload-wrap"><view wx:if="{{!tempTxImage}}" class="upload-trigger" bindtap="onChooseImage">+ 上传收款码</view><view wx:else class="image-preview"><image src="{{tempTxImage}}" mode="aspectFill" /><view class="image-actions"><text bindtap="onPreviewImage">预览</text><text bindtap="onDeleteImage">删除</text></view></view></view> <view class="upload-wrap">
<view wx:if="{{!tempTxImage}}" class="upload-trigger" bindtap="onChooseImage">+ 上传收款码</view>
<view wx:else class="image-preview"><image src="{{tempTxImage}}" mode="aspectFill" /><view class="image-actions"><text bindtap="onPreviewImage">预览</text><text bindtap="onDeleteImage">删除</text></view></view>
</view>
</view> </view>
<view class="modal-footer"><view class="modal-btn cancel" bindtap="onCloseSkfsModal">取消</view><view class="modal-btn confirm" bindtap="onConfirmSkfs">保存</view></view> <view class="modal-footer">
</view> <view class="modal-btn cancel" bindtap="onCloseSkfsModal">取消</view>
</view> <view class="modal-btn confirm" bindtap="onConfirmSkfs">保存</view>
<!-- 修改审核中记录弹窗 -->
<view wx:if="{{showModifyModal}}" class="modal-mask" bindtap="onCloseModifyModal">
<view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">修改信息</view>
<view class="modal-body">
<view class="toggle-row"><view class="toggle-item {{modifyTxfangshi == 1 ? 'active' : ''}}" bindtap="onSelectModifyFangshi" data-fangshi="1">微信</view><view class="toggle-item {{modifyTxfangshi == 2 ? 'active' : ''}}" bindtap="onSelectModifyFangshi" data-fangshi="2">支付宝</view></view>
<input class="field-input" placeholder="电话" value="{{modifyTxPhone}}" bindinput="onModifyPhoneInput" />
<view wx:if="{{modifyTxfangshi == 2}}"><input class="field-input" placeholder="支付宝账号" value="{{modifyTxAccount}}" bindinput="onModifyAccountInput" /></view>
<view class="upload-wrap"><view wx:if="{{modifyImageUrl}}" class="current-img"><image src="{{modifyImageUrl}}" mode="aspectFill" bindtap="onPreviewModifyImage" /></view><view class="upload-trigger" bindtap="onChooseModifyImage">+ 上传新图片</view><view wx:if="{{modifyTxImage}}" class="image-preview"><image src="{{modifyTxImage}}" mode="aspectFill" /><view class="image-actions"><text bindtap="onPreviewModifyImage">预览</text><text bindtap="onDeleteModifyImage">删除</text></view></view></view>
</view> </view>
<view class="modal-footer"><view class="modal-btn cancel" bindtap="onCloseModifyModal">取消</view><view class="modal-btn confirm" bindtap="onConfirmModify">确认</view></view>
</view>
</view>
<!-- 失败原因弹窗 -->
<view wx:if="{{showFailModal}}" class="modal-mask" bindtap="onCloseFailModal">
<view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">失败原因</view>
<view class="modal-body">{{currentFailReason}}</view>
<view class="modal-footer"><view class="modal-btn confirm" bindtap="onCloseFailModal">知道了</view></view>
</view> </view>
</view> </view>
<global-notification id="global-notification" /> <global-notification id="global-notification" />
<popup-notice id="popupNotice" /> <popup-notice id="popupNotice" />
+84 -423
View File
@@ -1,424 +1,85 @@
/* pages/withdraw/withdraw.wxss - 终极优化版 */ @import '../mode2/mode2.wxss';
page { .method-card--row {
background-color: #f5f7fb; display: flex;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; align-items: center;
height: 100%; justify-content: space-between;
} padding-right: 24rpx;
}
.app {
display: flex; .method-setting {
flex-direction: column; font-size: 26rpx;
min-height: 100vh; color: #ff8c00;
padding: 0 24rpx 0; flex-shrink: 0;
position: relative; padding: 16rpx 8rpx;
z-index: 1; }
box-sizing: border-box;
} .method-tab-icon--placeholder {
background: #e0e0e0;
/* 页面背景模糊极低,不影响阅读 */ border-radius: 8rpx;
.global-bg { }
position: fixed;
top: 0; .skfs-body .toggle-row {
left: 0; display: flex;
width: 100%; gap: 16rpx;
height: 100%; margin-bottom: 24rpx;
z-index: -1; }
opacity: 0.1;
object-fit: cover; .toggle-item {
filter: blur(1rpx); flex: 1;
} text-align: center;
padding: 20rpx;
/* 资产区域整体与顶部保持间距 */ border-radius: 12rpx;
.assets-section { background: #f5f5f5;
margin-top: 24rpx; font-size: 28rpx;
flex-shrink: 0; color: #666;
} }
/* 主卡片玻璃质感 - 模糊加重避免抢眼,同时文字对比加强 */ .toggle-item.active {
.main-card { background: #fff8e1;
background: rgba(248, 250, 252, 0.88); /* 稍微降低透明度,让背景更柔和 */ color: #ff8c00;
backdrop-filter: blur(28rpx); /* 增强模糊,不抢眼 */ font-weight: 600;
-webkit-backdrop-filter: blur(28rpx); border: 2rpx solid #FFD54F;
border-radius: 48rpx; }
padding: 30rpx 28rpx 24rpx; /* 稍微缩小高度 */
margin-bottom: 20rpx; .field-input {
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.04); width: 100%;
border: 1rpx solid rgba(255, 255, 255, 0.4); box-sizing: border-box;
background-size: cover; padding: 24rpx;
} margin-bottom: 16rpx;
background: #f8f8f8;
/* 总余额 - 字体加深加粗,增加阴影提高可读性 */ border-radius: 12rpx;
.balance-wrap { font-size: 28rpx;
text-align: center; }
margin-bottom: 20rpx; /* 减小间距,让卡片更紧凑 */
} .upload-wrap {
.balance-label { margin-top: 16rpx;
font-size: 28rpx; }
color: #0f172a; /* 更深色 */
letter-spacing: 1px; .upload-trigger {
display: block; padding: 48rpx;
margin-bottom: 10rpx; text-align: center;
font-weight: 700; /* 加粗 */ border: 2rpx dashed #ddd;
text-shadow: 0 1rpx 2rpx rgba(255,255,255,0.8); border-radius: 12rpx;
} color: #999;
.balance-value { font-size: 28rpx;
font-size: 68rpx; }
font-weight: 800;
color: #0f172a; .image-preview {
font-family: 'DIN', monospace; position: relative;
letter-spacing: -1rpx; }
text-shadow: 0 1rpx 2rpx rgba(255,255,255,0.6);
} .image-preview image {
width: 100%;
/* 内部分隔线(横杠)- 明显且保持层次 */ height: 320rpx;
.inner-divider { border-radius: 12rpx;
width: 60%; }
height: 2rpx;
background: linear-gradient(90deg, transparent, #64748b, #64748b, transparent); /* 加深颜色 */ .image-actions {
margin: 0 auto 20rpx auto; display: flex;
border-radius: 2rpx; justify-content: center;
opacity: 0.9; gap: 32rpx;
} margin-top: 16rpx;
font-size: 28rpx;
/* 左右滑动提示 - 字体明显 */ color: #ff8c00;
.assets-hint { }
display: block;
text-align: center;
font-size: 24rpx;
color: #334155; /* 深灰 */
margin-bottom: 14rpx;
font-weight: 600;
}
.assets-scroll {
width: 100%;
white-space: nowrap;
}
.assets-track {
display: inline-flex;
gap: 16rpx;
}
/* 资产小卡片 - 背景半透模糊,字体深色加粗 */
.asset-tile {
width: 170rpx;
background: rgba(255, 255, 255, 0.75); /* 稍微提高透明度,让模糊背景透出 */
backdrop-filter: blur(8rpx); /* 自身轻微模糊,不抢眼 */
border-radius: 28rpx;
padding: 18rpx 12rpx;
display: inline-flex;
flex-direction: column;
align-items: center;
text-align: center;
border: 1rpx solid rgba(255,255,255,0.5);
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.02);
transition: all 0.2s;
white-space: normal;
background-size: cover;
background-position: center;
}
.asset-tile:active {
background: rgba(255, 255, 255, 0.9);
transform: scale(0.98);
}
.asset-name {
font-size: 24rpx;
font-weight: 700; /* 加粗 */
color: #1e293b; /* 深色 */
margin-bottom: 10rpx;
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.5);
}
.asset-balance {
font-size: 28rpx;
font-weight: 800; /* 加粗 */
color: #2d6a4f;
font-family: monospace;
margin-bottom: 6rpx;
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.3);
}
.asset-fee {
font-size: 20rpx;
font-weight: 600; /* 加粗并加深 */
color: #475569;
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.3);
}
.assets-empty {
width: 400rpx;
text-align: center;
color: #a0abb9;
padding: 40rpx 0;
}
/* 外部层次分隔线 - 保持不变,保留分层 */
.divider-line {
height: 2rpx;
background: linear-gradient(90deg, transparent, #cbd5e1, #cbd5e1, transparent);
margin: 16rpx 0 20rpx;
width: 80%;
margin-left: auto;
margin-right: auto;
}
/* 提现记录区 - 无改动,自然贴底 */
.history-section {
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
margin-top: 0;
}
.history-header {
display: flex;
justify-content: space-between;
align-items: baseline;
padding: 0 8rpx 20rpx;
flex-shrink: 0;
}
.history-title {
font-size: 34rpx;
font-weight: 600;
color: #1e293b;
}
.history-settings {
font-size: 28rpx;
color: #3b82f6;
}
.history-scroll {
flex: 1;
width: 100%;
padding: 0 20rpx;
box-sizing: border-box;
}
.history-item {
display: flex;
align-items: center;
padding: 28rpx 0;
border-bottom: 1rpx solid rgba(0,0,0,0.05);
}
.history-info {
width: 160rpx;
}
.history-amount {
font-size: 36rpx;
font-weight: 700;
color: #1e293b;
display: block;
}
.history-time {
font-size: 22rpx;
color: #94a3b8;
}
.history-detail {
flex: 1;
padding: 0 20rpx;
}
.history-method {
font-size: 30rpx;
color: #334155;
display: block;
margin-bottom: 6rpx;
}
.history-type {
font-size: 24rpx;
color: #94a3b8;
}
.history-status {
text-align: right;
}
.status-badge {
font-size: 26rpx;
font-weight: 500;
padding: 6rpx 14rpx;
border-radius: 30rpx;
display: inline-block;
}
.status-wait {
color: #f59e0b;
background: rgba(245,158,11,0.1);
}
.status-done {
color: #10b981;
background: rgba(16,185,129,0.1);
}
.status-fail {
color: #ef4444;
background: rgba(239,68,68,0.1);
}
.fail-link {
margin-left: 8rpx;
text-decoration: underline;
}
.load-tip, .more-tip {
text-align: center;
padding: 30rpx;
font-size: 24rpx;
color: #94a3b8;
}
.load-more-btn {
margin: 16rpx 0 20rpx;
padding: 20rpx;
text-align: center;
background: rgba(255,255,255,0.7);
backdrop-filter: blur(8rpx);
border-radius: 40rpx;
font-size: 28rpx;
color: #3b82f6;
border: 1rpx solid rgba(255,255,255,0.5);
}
.load-more-btn:active {
background: rgba(255,255,255,0.9);
}
.safe-bottom {
height: 12rpx;
flex-shrink: 0;
}
/* ========== 弹窗样式(完整保留) ========== */
.modal-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-dialog {
width: 600rpx;
background: rgba(255,255,255,0.96);
backdrop-filter: blur(20rpx);
border-radius: 48rpx;
overflow: hidden;
box-shadow: 0 20rpx 40rpx rgba(0,0,0,0.1);
border: 1rpx solid rgba(255,255,255,0.6);
}
.modal-header {
padding: 36rpx 32rpx 20rpx;
font-size: 36rpx;
font-weight: 700;
border-bottom: 1rpx solid rgba(0,0,0,0.05);
}
.modal-body {
padding: 32rpx;
}
.info-row, .amount-row, .method-row {
display: flex;
justify-content: space-between;
margin-bottom: 24rpx;
font-size: 28rpx;
}
.amount-row input {
border: 1rpx solid rgba(0,0,0,0.1);
border-radius: 28rpx;
padding: 16rpx 20rpx;
width: 260rpx;
background: rgba(255,255,255,0.9);
}
.quick-row {
display: flex;
gap: 16rpx;
margin: 24rpx 0;
}
.quick-chip {
flex: 1;
background: rgba(241,245,249,0.8);
text-align: center;
padding: 12rpx;
border-radius: 40rpx;
font-size: 28rpx;
}
.fee-row {
display: flex;
justify-content: space-between;
background: rgba(248,250,252,0.8);
padding: 20rpx;
border-radius: 28rpx;
margin: 20rpx 0;
}
.link-text {
color: #3b82f6;
}
.toggle-row {
display: flex;
gap: 20rpx;
margin-bottom: 28rpx;
}
.toggle-item {
flex: 1;
text-align: center;
padding: 20rpx;
border: 1rpx solid rgba(0,0,0,0.08);
border-radius: 30rpx;
background: rgba(255,255,255,0.8);
}
.toggle-item.active {
border-color: #3b82f6;
background: #eff6ff;
}
.field-input {
width: 100%;
border: 1rpx solid rgba(0,0,0,0.08);
border-radius: 28rpx;
padding: 20rpx;
margin-bottom: 20rpx;
box-sizing: border-box;
background: rgba(255,255,255,0.9);
}
.upload-trigger {
background: rgba(241,245,249,0.8);
border: 1rpx dashed #cbd5e1;
border-radius: 28rpx;
padding: 28rpx;
text-align: center;
}
.image-preview {
margin-top: 16rpx;
position: relative;
}
.image-preview image {
width: 100%;
height: 200rpx;
border-radius: 28rpx;
}
.image-actions {
display: flex;
justify-content: space-around;
background: rgba(0,0,0,0.6);
padding: 12rpx;
position: absolute;
bottom: 0;
left: 0;
right: 0;
color: white;
border-bottom-left-radius: 28rpx;
border-bottom-right-radius: 28rpx;
}
.current-img {
margin: 20rpx 0;
}
.current-img image {
width: 100%;
height: 140rpx;
border-radius: 24rpx;
}
.modal-footer {
display: flex;
border-top: 1rpx solid rgba(0,0,0,0.05);
}
.modal-btn {
flex: 1;
text-align: center;
padding: 28rpx;
font-size: 30rpx;
}
.modal-btn.cancel {
color: #8f9bb3;
border-right: 1rpx solid rgba(0,0,0,0.05);
}
.modal-btn.confirm {
color: #3b82f6;
}
+193 -466
View File
@@ -1,21 +1,8 @@
// pages/withdraw/components/mode2/mode2.js // pages/withdraw/components/mode2/mode2.js — 自动打款纯提现
// UI 与 mode1 完全一致,业务逻辑为自动打款审核收款
import request from '../../../../utils/request.js'; import request from '../../../../utils/request.js';
import PopupService from '../../../../services/popupService.js'; import PopupService from '../../../../services/popupService.js';
const app = getApp(); const app = getApp();
const yemianshuju = 5;
let lastPullDownTime = 0;
const PULL_DOWN_INTERVAL = 2000;
const TX_STATUS = {
SHENHEZHONG: 1,
TIXIAN_CHENGGONG: 2,
TIXIAN_SHIBAI: 3,
SHENHE_CHENGGONG: 4,
SHENHE_SHIBAI: 5,
DAI_SHOUKUAN: 6,
};
const ASSET_CONFIG = { const ASSET_CONFIG = {
dashou_yue: { leixing: 1, label: '接单员佣金' }, dashou_yue: { leixing: 1, label: '接单员佣金' },
@@ -26,58 +13,41 @@ const ASSET_CONFIG = {
shangjia_yue: { leixing: 6, label: '商家余额' }, shangjia_yue: { leixing: 6, label: '商家余额' },
}; };
const LEIXING_LABEL = { /** 页面入参 from 与资产 type 映射 */
1: '接单员佣金', 2: '管事分红', 3: '组长分红', const FROM_ASSET_MAP = {
4: '考核官分佣', 5: '接单员保证金', 6: '商家余额', dashou: 'dashou_yue',
guanshi: 'guanshi_fenyong',
zuzhang: 'zuzhang_fenyong',
kaoheguan: 'kaoheguan_fenyong',
kaohe: 'kaoheguan_fenyong',
shangjia: 'shangjia_yue',
yajin: 'dashou_yajin',
}; };
Component({ Component({
properties: { options: { type: Object, value: {} } }, properties: { options: { type: Object, value: {} } },
data: { data: {
imgUrls: { imgUrls: { iconWechat: '' },
pageBg: '', cardBg: '', assetTileBg: '',
},
assetList: [], assetList: [],
displayAssetList: [],
totalAmount: '0.00', totalAmount: '0.00',
canWithdraw: false,
selectedAsset: null, selectedAsset: null,
isLoadingAssets: false, isLoadingAssets: false,
tixianleixing: null, tixianleixing: null,
tixianjine: '', tixianjine: '',
currentRate: '0.00', currentRate: '0.00',
feeRateText: '--',
showTixian: false, showTixian: false,
recordList: [],
page: 1,
loading: false,
nomore: false,
canloadmore: true,
isRefreshing: false,
shouxufei: '0.00', shouxufei: '0.00',
shijidaozhang: '0.00', shijidaozhang: '0.00',
currentTixianId: null,
submitting: false, submitting: false,
mchId: '',
currentStatusFilter: 0,
statusTabs: [
{ value: 0, label: '全部' },
{ value: 1, label: '审核中' },
{ value: 6, label: '待收款' },
{ value: 4, label: '审核成功' },
{ value: 5, label: '审核失败' },
{ value: 2, label: '提现成功' },
{ value: 3, label: '提现失败' },
],
hasPendingCollect: false,
showCollectConfirm: false,
collectConfirmRecord: null,
showDetailModal: false,
detailTitle: '',
detailContent: '',
}, },
lifetimes: { lifetimes: {
attached() { attached() {
this.initImageUrls(); this.initImageUrls();
this.chushihuashuju(); this.loadAllAssets();
} },
}, },
pageLifetimes: { pageLifetimes: {
show() { show() {
@@ -88,7 +58,7 @@ Component({
hide() { hide() {
const popupComp = this.selectComponent('#popupNotice'); const popupComp = this.selectComponent('#popupNotice');
if (popupComp && popupComp.cleanup) popupComp.cleanup(); if (popupComp && popupComp.cleanup) popupComp.cleanup();
} },
}, },
methods: { methods: {
registerNotificationComponent() { registerNotificationComponent() {
@@ -96,127 +66,11 @@ Component({
if (notificationComp && notificationComp.showNotification) { if (notificationComp && notificationComp.showNotification) {
app.globalData.globalNotification = { app.globalData.globalNotification = {
show: (data) => notificationComp.showNotification(data), show: (data) => notificationComp.showNotification(data),
hide: () => notificationComp.hideNotification() hide: () => notificationComp.hideNotification(),
}; };
} }
}, },
initImageUrls() {
const ossBase = app.globalData.ossImageUrl || '';
const imgDir = `${ossBase}beijing/tixian/`;
this.setData({
imgUrls: {
pageBg: `${imgDir}page_bg.png`,
cardBg: `${imgDir}card_bg.png`,
assetTileBg: `${imgDir}asset_tile_bg.png`,
}
});
},
parseZhuangtai(item) {
const raw = item.zhuangtai ?? item.status ?? item.state;
const n = parseInt(raw, 10);
return Number.isNaN(n) ? -1 : n;
},
/** 规范化列表字段(兼容后端多种命名 / 嵌套 audit) */
normalizeRecordFields(item) {
const audit = item.audit || item.shenhe || item.shenhe_info || {};
const shenheJiluId = item.shenhe_jilu_id ?? item.shenheJiluId
?? item.audit_id ?? item.shenheid ?? audit.id ?? audit.shenhe_jilu_id ?? null;
const shenheDanhao = String(
item.shenhe_danhao || item.shenheDanhao || item.audit_shenhe_danhao
|| audit.shenhe_danhao || audit.danhao || ''
).trim();
const tixianjiluId = item.tixianjilu_id ?? item.tixianjiluId ?? item.id ?? null;
const zhuangtai = this.parseZhuangtai(item);
return {
...item,
zhuangtai: zhuangtai >= 0 ? zhuangtai : item.zhuangtai,
shenhe_jilu_id: shenheJiluId,
shenhe_danhao: shenheDanhao,
tixianjilu_id: tixianjiluId,
};
},
hasAuditJiluId(item) {
const id = item.shenhe_jilu_id;
return id !== null && id !== undefined && id !== '' && id !== 0 && id !== '0';
},
hasShenheDanhao(item) {
return !!(item.shenhe_danhao && String(item.shenhe_danhao).trim());
},
isNewAuditRecord(item) {
return this.hasAuditJiluId(item) && this.hasShenheDanhao(item);
},
/** 待收款是否可点击:状态6 + 审核记录ID + 审核单号 缺一不可 */
canCollectRecord(item) {
return this.parseZhuangtai(item) === TX_STATUS.DAI_SHOUKUAN
&& this.hasAuditJiluId(item)
&& this.hasShenheDanhao(item);
},
getLeixingLabel(leixing) {
return LEIXING_LABEL[parseInt(leixing)] || '提现';
},
getStatusBadgeClass(status) {
switch (parseInt(status)) {
case TX_STATUS.SHENHEZHONG: return 'status-wait';
case TX_STATUS.TIXIAN_CHENGGONG:
case TX_STATUS.SHENHE_CHENGGONG: return 'status-done';
case TX_STATUS.DAI_SHOUKUAN: return 'status-pending';
case TX_STATUS.TIXIAN_SHIBAI:
case TX_STATUS.SHENHE_SHIBAI: return 'status-fail';
default: return 'status-wait';
}
},
processRecordItem(item) {
item = this.normalizeRecordFields(item);
const isNew = this.isNewAuditRecord(item);
const status = this.parseZhuangtai(item);
let statusText = '未知';
let canCollect = false;
let canShowDetail = false;
let detailReason = '';
switch (status) {
case TX_STATUS.SHENHEZHONG: statusText = '审核中'; break;
case TX_STATUS.TIXIAN_CHENGGONG: statusText = '提现成功'; break;
case TX_STATUS.TIXIAN_SHIBAI:
statusText = '提现失败';
if (item.fail_reason || item.bhliyou) {
canShowDetail = true;
detailReason = item.fail_reason || item.bhliyou;
}
break;
case TX_STATUS.SHENHE_CHENGGONG: statusText = '审核成功'; break;
case TX_STATUS.SHENHE_SHIBAI:
statusText = '审核失败';
if (item.bhliyou) { canShowDetail = true; detailReason = item.bhliyou; }
break;
case TX_STATUS.DAI_SHOUKUAN:
statusText = '待收款';
canCollect = this.canCollectRecord(item);
break;
}
return {
...item,
isNewAudit: isNew,
leixingLabel: this.getLeixingLabel(item.leixing),
statusText,
statusBadgeClass: this.getStatusBadgeClass(status),
canCollect,
canShowDetail,
detailReason,
};
},
gengxinYue(data, leixing) { gengxinYue(data, leixing) {
if (!data) return; if (!data) return;
if (data.new_yongjin !== undefined && data.new_yongjin !== null) { if (data.new_yongjin !== undefined && data.new_yongjin !== null) {
@@ -239,51 +93,79 @@ Component({
} }
}, },
updatePendingCollectFlag(list) { initImageUrls() {
const hasPending = (list || []).some(item => item.canCollect); const ossBase = app.globalData.ossImageUrl || '';
if (hasPending !== this.data.hasPendingCollect) { const imgDir = `${ossBase}beijing/tixian/`;
this.setData({ hasPendingCollect: hasPending }); this.setData({
imgUrls: {
iconWechat: `${imgDir}icon_wechat.png`,
},
});
},
/** 顶部展示:不含保证金的可提现合计 */
calcDisplayTotal(assets) {
let total = 0;
(assets || []).forEach((item) => {
if (item.type === 'dashou_yajin') return;
total += parseFloat(item.amount) || 0;
});
return total;
},
hasAnyWithdrawable(assets) {
return (assets || []).some((item) => parseFloat(item.amount) > 0);
},
applyRouteOptions(assets) {
const opts = this.properties.options || {};
const fromKey = FROM_ASSET_MAP[opts.from];
let selected = null;
if (fromKey) {
selected = assets.find((a) => a.type === fromKey) || null;
} else if (assets.length === 1) {
selected = assets[0];
}
const patch = {};
if (selected) {
patch.selectedAsset = selected;
patch.tixianleixing = selected.leixing;
patch.feeRateText = selected.rateText;
}
if (opts.amount && parseFloat(opts.amount) > 0) {
const amt = parseFloat(opts.amount);
const max = selected ? parseFloat(selected.amount) : amt;
patch.tixianjine = Math.min(amt, max).toFixed(2);
}
if (Object.keys(patch).length) {
this.setData(patch, () => {
this.recalcFee(this.data.tixianjine, this.data.selectedAsset);
});
} }
}, },
/** 微信确认收款成功后,本地先把对应记录标为「提现成功」 */ onSelectAsset(e) {
markLocalRecordWithdrawSuccess(record) { const index = e.currentTarget.dataset.index;
if (!record) return; const asset = this.data.displayAssetList[index];
const matchId = String(record.tixianjilu_id || record.id || ''); if (!asset || parseFloat(asset.amount) <= 0) {
const matchDanhao = String(record.shenhe_danhao || '').trim(); wx.showToast({ title: '该账户无可提余额', icon: 'none' });
if (!matchId && !matchDanhao) return; return;
}
const newList = (this.data.recordList || []).map((item) => { let jine = this.data.tixianjine;
const itemId = String(item.tixianjilu_id || item.id || ''); const max = parseFloat(asset.amount);
const itemDanhao = String(item.shenhe_danhao || '').trim(); if (jine && parseFloat(jine) > max) {
const isMatch = (matchId && itemId === matchId) jine = asset.amount;
|| (matchDanhao && itemDanhao === matchDanhao); }
if (!isMatch) return item; this.setData({
return this.processRecordItem({ selectedAsset: asset,
...item, tixianleixing: asset.leixing,
zhuangtai: TX_STATUS.TIXIAN_CHENGGONG, tixianjine: jine,
});
});
this.setData({ recordList: newList });
this.updatePendingCollectFlag(newList);
},
async finishWxCollectSuccess(record) {
this.markLocalRecordWithdrawSuccess(record);
await this.loadAllAssets();
await this.huoquJilu(true, true);
// 后端若尚未落库,刷新后仍可能显示待收款,再覆盖一次本地成功态
this.markLocalRecordWithdrawSuccess(record);
PopupService.checkAndShow(this, 'tixianchenggong');
wx.showToast({
title: '提现成功',
icon: 'success',
duration: 3000,
}); });
this.recalcFee(jine, asset);
}, },
async loadAllAssets() { async loadAllAssets() {
this.setData({ isLoadingAssets: true }); this.setData({ isLoadingAssets: true, totalAmount: '0.00', canWithdraw: false, assetList: [] });
try { try {
const res = await request({ url: '/yonghu/tixianzichan', method: 'POST' }); const res = await request({ url: '/yonghu/tixianzichan', method: 'POST' });
if (res?.data?.code === 200 || res?.data?.code === 0) { if (res?.data?.code === 200 || res?.data?.code === 0) {
@@ -298,6 +180,7 @@ Component({
label: cfg.label, label: cfg.label,
amount: parseFloat(amount).toFixed(2), amount: parseFloat(amount).toFixed(2),
rate: rate || 0, rate: rate || 0,
rateText: this.formatRatePercent(rate || 0),
}); });
}; };
pushAsset('dashou_yue', data.dashou_yue, data.dashou_rate); pushAsset('dashou_yue', data.dashou_yue, data.dashou_rate);
@@ -307,63 +190,114 @@ Component({
pushAsset('zuzhang_fenyong', data.zuzhang_fenyong, data.zuzhang_rate); pushAsset('zuzhang_fenyong', data.zuzhang_fenyong, data.zuzhang_rate);
pushAsset('kaoheguan_fenyong', data.kaoheguan_fenyong, data.kaoheguan_rate); pushAsset('kaoheguan_fenyong', data.kaoheguan_fenyong, data.kaoheguan_rate);
let total = 0; const displayTotal = this.calcDisplayTotal(assets);
assets.forEach(item => { total += parseFloat(item.amount); }); const firstRate = assets.find((a) => a.type !== 'dashou_yajin')?.rate || 0;
this.setData({ assetList: assets, totalAmount: total.toFixed(2), isLoadingAssets: false }); this.setData({
assetList: assets,
displayAssetList: assets,
totalAmount: displayTotal.toFixed(2),
canWithdraw: this.hasAnyWithdrawable(assets),
isLoadingAssets: false,
feeRateText: displayTotal > 0 ? this.formatRatePercent(firstRate) : '--',
}, () => this.applyRouteOptions(assets));
if (!this.data.selectedAsset) {
this.recalcFee(this.data.tixianjine, null);
}
} else { } else {
throw new Error(res?.data?.msg || '获取资产失败'); throw new Error(res?.data?.msg || '获取资产失败');
} }
} catch (err) { } catch (err) {
console.error('loadAllAssets', err); console.error('loadAllAssets', err);
this.setData({ isLoadingAssets: false }); this.setData({ isLoadingAssets: false, totalAmount: '0.00', canWithdraw: false, assetList: [] });
} }
}, },
chushihuashuju() { formatRatePercent(rate) {
this.loadAllAssets(); const r = parseFloat(rate) || 0;
this.huoquJilu(true); if (r <= 1 && r > 0) return `${(r * 100).toFixed(0)}%`;
return `${r}%`;
}, },
/** 点击资产卡片(与 mode1 一致) */ recalcFee(amountStr, asset) {
onSelectAsset(e) { const amount = parseFloat(amountStr);
const index = e.currentTarget.dataset.index; if (!amountStr || isNaN(amount) || amount <= 0 || !asset) {
const asset = this.data.assetList[index]; this.setData({
if (!asset || parseFloat(asset.amount) <= 0) { shouxufei: '0.00',
wx.showToast({ title: '无可提现金额', icon: 'none' }); shijidaozhang: '0.00',
feeRateText: asset ? this.formatRatePercent(asset.rate) : this.data.feeRateText,
});
return; return;
} }
const rate = parseFloat(asset.rate) || 0;
const fee = amount * rate;
const actual = amount - fee;
this.setData({ this.setData({
selectedAsset: asset, shouxufei: fee.toFixed(2),
tixianleixing: asset.leixing, shijidaozhang: actual.toFixed(2),
currentRate: asset.rate, feeRateText: this.formatRatePercent(rate),
tixianjine: '', currentRate: this.formatRatePercent(rate),
shouxufei: '0.00',
shijidaozhang: '0.00',
showTixian: true,
}); });
}, },
onJineInput(e) { onJineInput(e) {
this.setData({ tixianjine: e.detail.value, shouxufei: '0.00', shijidaozhang: '0.00' }); const val = e.detail.value;
this.setData({ tixianjine: val });
this.recalcFee(val, this.data.selectedAsset);
}, },
onQuickAmountTap(e) { onWithdrawAll() {
const value = e.currentTarget.dataset.value; const { selectedAsset } = this.data;
this.setData({ tixianjine: value.toString(), shouxufei: '0.00', shijidaozhang: '0.00' }); if (!selectedAsset) {
wx.showToast({ title: '请先选择提现账户', icon: 'none' });
return;
}
const max = selectedAsset.amount;
this.setData({ tixianjine: max });
this.recalcFee(max, selectedAsset);
}, },
onStatusFilterTap(e) { onTapWithdraw() {
const value = parseInt(e.currentTarget.dataset.value); if (this.data.submitting) return;
if (value === this.data.currentStatusFilter) return; if (!this.hasAnyWithdrawable(this.data.assetList)) {
this.setData({ currentStatusFilter: value }); wx.showToast({ title: '暂无可提现余额', icon: 'none' });
this.huoquJilu(true); return;
}
const { selectedAsset, tixianjine } = this.data;
if (!selectedAsset) {
wx.showToast({ title: '请先选择要提现的账户', icon: 'none' });
return;
}
const jineValue = parseFloat(tixianjine);
if (!tixianjine || isNaN(jineValue) || jineValue <= 0) {
wx.showToast({ title: '请输入有效金额', icon: 'none' });
return;
}
if (jineValue <= 0.1) {
wx.showToast({ title: '提现金额须大于0.1元', icon: 'none' });
return;
}
if (jineValue > parseFloat(selectedAsset.amount)) {
wx.showToast({ title: `超过${selectedAsset.label}可提余额`, icon: 'none' });
return;
}
this.applyIdentityAndConfirm(selectedAsset);
},
applyIdentityAndConfirm(asset) {
this.recalcFee(this.data.tixianjine, asset);
this.setData({
selectedAsset: asset,
tixianleixing: asset.leixing,
currentRate: this.formatRatePercent(asset.rate),
showTixian: true,
});
}, },
async onConfirmTixian() { async onConfirmTixian() {
if (this.data.submitting) return; if (this.data.submitting) return;
const { tixianleixing, tixianjine, selectedAsset } = this.data; const { tixianleixing, tixianjine, selectedAsset } = this.data;
if (!tixianleixing || !selectedAsset) { if (!tixianleixing || !selectedAsset) {
wx.showToast({ title: '请选择提现类型', icon: 'none' }); wx.showToast({ title: '请选择提现身份', icon: 'none' });
return; return;
} }
const jineValue = parseFloat(tixianjine); const jineValue = parseFloat(tixianjine);
@@ -372,7 +306,7 @@ Component({
return; return;
} }
if (jineValue > parseFloat(selectedAsset.amount)) { if (jineValue > parseFloat(selectedAsset.amount)) {
wx.showToast({ title: `超过可提${selectedAsset.label}`, icon: 'none' }); wx.showToast({ title: `超过${selectedAsset.label}可提余额`, icon: 'none' });
return; return;
} }
@@ -381,24 +315,30 @@ Component({
const res = await request({ const res = await request({
url: '/yonghu/zddksh', url: '/yonghu/zddksh',
method: 'POST', method: 'POST',
data: { leixing: tixianleixing, jine: jineValue.toFixed(2) } data: { leixing: tixianleixing, jine: jineValue.toFixed(2) },
}); });
if (res.statusCode === 200 && res.data && res.data.code === 0) { if (res.statusCode === 200 && res.data && res.data.code === 0) {
const data = res.data.data || {}; const data = res.data.data || {};
this.gengxinYue(data, tixianleixing); this.gengxinYue(data, tixianleixing);
if (data.shouxufei !== undefined) { this.setData({
this.setData({ showTixian: false,
shouxufei: parseFloat(data.shouxufei || 0).toFixed(2), submitting: false,
shijidaozhang: parseFloat(data.shijidaozhang || 0).toFixed(2), selectedAsset: null,
}); tixianjine: '',
} shouxufei: '0.00',
this.setData({ showTixian: false, submitting: false, selectedAsset: null }); shijidaozhang: '0.00',
});
await this.loadAllAssets(); await this.loadAllAssets();
this.huoquJilu(true);
wx.showModal({ wx.showModal({
title: '申请已提交', title: '申请成功',
content: '您的提现申请已提交,请等待后台审核。审核通过后,请在本页「提现记录」中点击「收款」按钮,主动确认后才能到账微信零钱。', content: '提现申请已提交,请前往「提现记录」查看进度;审核通过后可在该页点击「收款」确认到账。',
showCancel: false, confirmText: '查看提现记录',
cancelText: '知道了',
success: (res) => {
if (res.confirm) {
wx.navigateTo({ url: '/pages/withdraw/withdraw-records' });
}
},
}); });
} else { } else {
wx.showModal({ title: '提现申请失败', content: res.data?.msg || '未知错误', showCancel: false }); wx.showModal({ title: '提现申请失败', content: res.data?.msg || '未知错误', showCancel: false });
@@ -410,233 +350,20 @@ Component({
} }
}, },
onCollectTap(e) { onCloseTixian() {
const index = e.currentTarget.dataset.index;
const record = this.data.recordList[index];
if (!record) return;
if (this.parseZhuangtai(record) !== TX_STATUS.DAI_SHOUKUAN) {
wx.showToast({ title: '当前状态不可收款', icon: 'none' });
return;
}
if (!this.hasShenheDanhao(record) || !this.hasAuditJiluId(record)) {
wx.showToast({ title: '审核信息不完整,请刷新后重试', icon: 'none' });
return;
}
if (this.data.submitting) { if (this.data.submitting) {
wx.showToast({ title: '正在处理中,请稍后', icon: 'none' }); wx.showToast({ title: '正在处理中,请稍后', icon: 'none' });
return; return;
} }
this.setData({ showCollectConfirm: true, collectConfirmRecord: record });
},
onCloseCollectConfirm() {
if (this.data.submitting) return;
this.setData({ showCollectConfirm: false, collectConfirmRecord: null });
},
async onConfirmCollect() {
if (this.data.submitting) return;
let record = this.data.collectConfirmRecord;
if (!record) return;
if (!this.canCollectRecord(record)) {
await this.huoquJilu(true, true);
const refreshed = (this.data.recordList || []).find(
r => String(r.id) === String(record.id)
|| String(r.tixianjilu_id) === String(record.tixianjilu_id)
);
if (refreshed) record = refreshed;
}
if (!this.canCollectRecord(record)) {
wx.showModal({
title: '暂时无法收款',
content: '缺少审核单号或审核记录ID,请下拉刷新后重试。仍不行请联系客服。',
showCancel: false,
});
return;
}
this.setData({ showCollectConfirm: false, submitting: true, collectConfirmRecord: record });
try {
const res = await request({
url: '/yonghu/tixiansq',
method: 'POST',
data: {
shenhe_danhao: record.shenhe_danhao,
shenhe_jilu_id: record.shenhe_jilu_id || '',
tixianjilu_id: record.tixianjilu_id || record.id || '',
leixing: record.leixing,
}
});
if (res.statusCode === 200 && res.data && res.data.code === 0) {
const data = res.data.data;
this.setData({
currentTixianId: data.tixian_id,
mchId: data.mch_id || '',
collectConfirmRecord: record,
});
this.tiaoqiWeixinQueRen(data.package_info);
} else {
wx.showModal({ title: '收款失败', content: res.data?.msg || '无法发起收款,请稍后重试', showCancel: false });
this.setData({ submitting: false, collectConfirmRecord: null });
}
} catch (err) {
wx.showModal({ title: '网络错误', content: '网络连接失败,请稍后重试', showCancel: false });
this.setData({ submitting: false, collectConfirmRecord: null });
}
},
tiaoqiWeixinQueRen(packageInfo) {
const appId = app.globalData.appId;
const mchId = this.data.mchId;
if (!appId || !mchId) {
wx.showModal({ title: '配置错误', content: '无法调起收款,请联系客服', showCancel: false });
this.setData({ submitting: false, collectConfirmRecord: null });
return;
}
wx.requestMerchantTransfer({
appId, mchId, package: packageInfo,
success: () => { this.tongzhiHouduanQueRen(1); },
fail: () => {
this.tongzhiHouduanQueRen(0);
wx.showModal({
title: '确认收款失败',
content: '微信收款确认失败,您可在记录中再次点击「收款」重试。',
showCancel: false,
});
}
});
},
async tongzhiHouduanQueRen(result) {
if (!this.data.currentTixianId) {
this.setData({ submitting: false, collectConfirmRecord: null });
return;
}
const record = this.data.collectConfirmRecord;
const wxConfirmed = result === 1;
try {
const res = await request({
url: '/yonghu/tixianqr',
method: 'POST',
data: {
tixian_id: this.data.currentTixianId,
result: result,
shenhe_danhao: record ? record.shenhe_danhao : '',
shenhe_jilu_id: record ? (record.shenhe_jilu_id || '') : '',
tixianjilu_id: record ? (record.tixianjilu_id || record.id || '') : '',
leixing: record ? record.leixing : '',
}
});
if (res.statusCode === 200 && res.data && res.data.code === 0) {
const data = res.data.data || {};
this.gengxinYue(data, record ? record.leixing : null);
}
// 微信已确认收款:不论 tixianqr 返回什么,都刷新列表,不弹系统异常
if (wxConfirmed) {
await this.finishWxCollectSuccess(record);
} else if (res.statusCode === 200 && res.data && res.data.code === 0) {
await this.loadAllAssets();
this.huoquJilu(true);
wx.showToast({
title: '收款已取消',
icon: 'none',
duration: 3000,
});
} else {
wx.showModal({
title: '确认状态失败',
content: res.data?.msg || '操作失败',
showCancel: false,
});
}
} catch (err) {
if (wxConfirmed) {
await this.finishWxCollectSuccess(record);
} else {
wx.showModal({
title: '网络错误',
content: '网络连接失败',
showCancel: false,
});
}
} finally {
this.setData({ submitting: false, currentTixianId: null, collectConfirmRecord: null });
}
},
onViewDetail(e) {
const index = e.currentTarget.dataset.index;
const record = this.data.recordList[index];
if (!record || !record.canShowDetail) return;
const status = parseInt(record.zhuangtai);
let detailTitle = '失败原因';
if (status === TX_STATUS.SHENHE_SHIBAI) detailTitle = '审核失败原因';
else if (status === TX_STATUS.TIXIAN_SHIBAI) detailTitle = '提现失败原因';
this.setData({ this.setData({
showDetailModal: true, showTixian: false,
detailTitle, selectedAsset: null,
detailContent: record.detailReason || '暂无详细信息', tixianleixing: null,
shouxufei: '0.00',
shijidaozhang: '0.00',
}); });
}, },
onCloseDetailModal() { stopPropagation() {},
this.setData({ showDetailModal: false, detailTitle: '', detailContent: '' }); },
},
onCloseTixian() {
if (this.data.submitting) { wx.showToast({ title: '正在处理中,请稍后', icon: 'none' }); return; }
this.setData({
showTixian: false, selectedAsset: null, tixianleixing: null,
tixianjine: '', shouxufei: '0.00', shijidaozhang: '0.00', submitting: false,
});
},
async huoquJilu(fresh = false, force = false) {
const now = Date.now();
if (!force && now - lastPullDownTime < 2000 && !fresh) return;
if (!force && (this.data.loading || this.data.isRefreshing)) return;
const page = fresh ? 1 : this.data.page;
if (fresh) this.setData({ nomore: false, canloadmore: true, isRefreshing: true });
if (this.data.nomore && !fresh) return;
this.setData({ loading: true });
lastPullDownTime = now;
try {
const res = await request({
url: '/yonghu/tixianjiluhq',
method: 'POST',
data: { page, limit: yemianshuju, mode: 2, zhuangtai: this.data.currentStatusFilter }
});
if (res.statusCode === 200 && res.data && res.data.code === 0) {
const data = res.data.data;
const processedList = (data.list || []).map(item => this.processRecordItem(item));
const newList = fresh ? processedList : [...this.data.recordList, ...processedList];
this.setData({
recordList: newList,
page: page + 1,
nomore: !(data.has_more === true),
canloadmore: data.has_more === true,
loading: false,
isRefreshing: false,
});
this.updatePendingCollectFlag(newList);
} else {
this.setData({ loading: false, isRefreshing: false });
}
} catch (err) {
this.setData({ loading: false, isRefreshing: false });
}
},
onReachBottom() {
if (this.data.canloadmore && !this.data.nomore && !this.data.loading && !this.data.isRefreshing) {
const now = Date.now();
if (now - lastPullDownTime >= PULL_DOWN_INTERVAL) this.huoquJilu();
}
},
stopPropagation() {}
}
}); });
+75 -125
View File
@@ -1,113 +1,91 @@
<!-- mode2 自动打款 - UI 与 mode1 手动提现完全一致,逻辑为自动审核收款 --> <!-- mode2 自动打款 - 参考逍遥梦样式(仅微信零钱) -->
<view class="app"> <view class="ref-page">
<image class="global-bg" src="{{imgUrls.pageBg}}" mode="aspectFill" /> <!-- 提现方式:仅微信 -->
<view class="method-card">
<!-- 资产区域(与 mode1 相同) --> <view class="method-tab method-tab--active">
<view class="assets-section"> <image class="method-tab-icon" src="{{imgUrls.iconWechat}}" mode="aspectFit" />
<view class="main-card" style="background-image: url('{{imgUrls.cardBg}}'); background-size: cover;"> <text class="method-tab-text">微信零钱</text>
<view class="balance-wrap"> <view class="method-tab-line"></view>
<text class="balance-label">可提总余额</text>
<text class="balance-value">¥{{totalAmount}}</text>
</view>
<view class="inner-divider"></view>
<text class="assets-hint">← 左右滑动查看更多资产 →</text>
<scroll-view class="assets-scroll" scroll-x="true" show-scrollbar="{{false}}" enhanced>
<view class="assets-track">
<block wx:for="{{assetList}}" wx:key="type">
<view
class="asset-tile"
bindtap="onSelectAsset"
data-index="{{index}}"
style="background-image: url('{{imgUrls.assetTileBg}}'); background-size: cover; background-position: center;"
>
<text class="asset-name">{{item.label}}</text>
<text class="asset-balance">¥{{item.amount}}</text>
<text class="asset-fee">费率 {{item.rate}}%</text>
</view>
</block>
<view wx:if="{{assetList.length === 0 && !isLoadingAssets}}" class="assets-empty">暂无可用资金</view>
</view>
</scroll-view>
</view> </view>
<view class="divider-line"></view>
</view> </view>
<!-- 提现记录区(mode1 布局 + 自动打款筛选/收款) --> <!-- 选择提现账户(多身份时展示) -->
<view class="history-section"> <view class="account-card" wx:if="{{displayAssetList.length > 0}}">
<view class="history-header"> <scroll-view scroll-x enable-flex class="account-scroll" show-scrollbar="{{false}}">
<text class="history-title">提现记录</text> <view
</view> wx:for="{{displayAssetList}}"
wx:key="type"
<view wx:if="{{hasPendingCollect}}" class="pending-tip"> class="account-chip {{selectedAsset.type === item.type ? 'account-chip--active' : ''}} {{item.amount <= 0 ? 'account-chip--disabled' : ''}}"
您有审核通过的提现待收款,请点击「收款」按钮,在微信中主动确认后才能到账。 bindtap="onSelectAsset"
</view> data-index="{{index}}"
>
<scroll-view class="filter-scroll" scroll-x show-scrollbar="{{false}}"> <text class="chip-label">{{item.label}}</text>
<view class="filter-track"> <text class="chip-amount">¥{{item.amount}}</text>
<view
wx:for="{{statusTabs}}"
wx:key="value"
class="filter-chip {{currentStatusFilter == item.value ? 'active' : ''}}"
bindtap="onStatusFilterTap"
data-value="{{item.value}}"
>{{item.label}}</view>
</view> </view>
</scroll-view> </scroll-view>
<text wx:if="{{!selectedAsset}}" class="account-warn">请先选择上方提现账户</text>
<scroll-view class="history-scroll" scroll-y enable-back-to-top bindscrolltolower="onReachBottom"> <text wx:else class="account-ok">当前:{{selectedAsset.label}}</text>
<view wx:for="{{recordList}}" wx:key="index" class="history-item">
<view class="history-info">
<text class="history-amount">¥{{item.jine}}</text>
<text class="history-time">{{item.create}}</text>
</view>
<view class="history-detail">
<text class="history-method">微信零钱</text>
<text class="history-type">{{item.leixingLabel}}</text>
</view>
<view class="history-status">
<!-- 待收款:整块可点击 → 弹出确认收款弹窗 → 用户确认后才请求后端 -->
<view
wx:if="{{item.canCollect}}"
class="status-badge status-pending collect-tappable"
bindtap="onCollectTap"
data-index="{{index}}"
>
<text>{{item.statusText}}</text>
<text class="collect-sub">点击收款</text>
</view>
<view wx:elif="{{item.canShowDetail}}" class="status-badge status-fail">
{{item.statusText}}
<text class="fail-link" bindtap="onViewDetail" data-index="{{index}}">详情</text>
</view>
<view wx:else class="status-badge {{item.statusBadgeClass}}">{{item.statusText}}</view>
</view>
</view>
<view wx:if="{{loading}}" class="load-tip">加载中...</view>
<view wx:if="{{nomore && recordList.length > 0}}" class="more-tip">—— 没有更多了 ——</view>
<view wx:if="{{!nomore && recordList.length > 0}}" class="load-more-btn" bindtap="onReachBottom">加载更多记录</view>
<view wx:if="{{recordList.length === 0 && !loading}}" class="load-tip">暂无提现记录</view>
</scroll-view>
</view> </view>
<view class="safe-bottom"></view> <!-- 金额输入区 -->
<view class="amount-card">
<view class="avail-row">
<text class="avail-label">当前可提现:</text>
<text class="avail-symbol">¥</text>
<text class="avail-amount">{{selectedAsset ? selectedAsset.amount : totalAmount}}</text>
</view>
<view class="input-row">
<text class="input-symbol">¥</text>
<input
class="amount-input"
type="digit"
placeholder="请输入金额"
placeholder-class="amount-placeholder"
value="{{tixianjine}}"
bindinput="onJineInput"
/>
<text class="withdraw-all" bindtap="onWithdrawAll">全部提现</text>
</view>
<view class="input-divider"></view>
<view class="fee-tip">
<text>提示:提现手续费</text>
<text class="fee-highlight">{{feeRateText}}</text>
<text>。</text>
</view>
</view>
<!-- 确认按钮 -->
<view class="submit-wrap">
<view
class="confirm-btn {{canWithdraw && !submitting ? '' : 'confirm-btn--disabled'}}"
bindtap="onTapWithdraw"
>
<text wx:if="{{submitting}}">处理中...</text>
<text wx:else>确认提现</text>
</view>
</view>
<!-- 提现须知 -->
<view class="notice-box">
<view class="notice-title">📢 提现须知</view>
<view class="notice-item">🕒 提交后需等待后台审核,请耐心等待</view>
<view class="notice-item">📌 审核通过后,请前往「提现记录」点击「收款」确认到账</view>
<view class="notice-item">💰 每笔只能从单个账户提现,请先选择对应账户再填写金额</view>
<view class="notice-item">✅ 提现方式仅支持微信零钱,暂不支持支付宝</view>
<view class="notice-item">🎧 运营账户不足时暂时无法提现,请稍后再试或联系客服</view>
</view>
</view> </view>
<!-- 申请提现弹窗(mode1 样式,无收款方式) --> <!-- 确认提现弹窗 -->
<view wx:if="{{showTixian}}" class="modal-mask" bindtap="onCloseTixian"> <view wx:if="{{showTixian}}" class="modal-mask" bindtap="onCloseTixian">
<view class="modal-dialog" catchtap="stopPropagation"> <view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">申请提现</view> <view class="modal-header">确认提现</view>
<view class="modal-body"> <view class="modal-body">
<view class="auto-tip">提交后需等待审核,审核通过后请在本页点击「收款」确认到账</view> <view class="auto-tip">提交后需等待审核,审核通过后请在「提现记录」中点击「收款」确认到账</view>
<view class="info-row"><text>项目</text><text>{{selectedAsset.label}}</text></view> <view class="info-row"><text>身份</text><text>{{selectedAsset.label}}</text></view>
<view class="info-row"><text>可提</text><text>¥{{selectedAsset.amount}}</text></view> <view class="info-row"><text>可提</text><text>¥{{selectedAsset.amount}}</text></view>
<view class="info-row"><text>费率</text><text>{{currentRate}}%</text></view> <view class="info-row"><text>费率</text><text>{{currentRate}}</text></view>
<view class="amount-row"> <view class="info-row"><text>提现金额</text><text>¥{{tixianjine}}</text></view>
<text>金额</text>
<input type="digit" placeholder="0.00" value="{{tixianjine}}" bindinput="onJineInput" />
</view>
<view class="quick-row">
<view wx:for="{{[100,200,500,1000]}}" wx:key="item" class="quick-chip" data-value="{{item}}" bindtap="onQuickAmountTap">¥{{item}}</view>
</view>
<view class="fee-row"> <view class="fee-row">
<text>手续费 ¥{{shouxufei}}</text> <text>手续费 ¥{{shouxufei}}</text>
<text>到账 ¥{{shijidaozhang}}</text> <text>到账 ¥{{shijidaozhang}}</text>
@@ -120,33 +98,5 @@
</view> </view>
</view> </view>
<!-- 收款确认弹窗 -->
<view wx:if="{{showCollectConfirm}}" class="modal-mask" bindtap="onCloseCollectConfirm">
<view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">确认收款</view>
<view class="modal-body">
<view class="auto-tip">审核已通过,{{collectConfirmRecord.leixingLabel}} ¥{{collectConfirmRecord.jine}}</view>
<view>请点击「去收款」,然后在微信弹窗中主动确认,资金才会打入您的微信零钱。</view>
<view class="warn-tip" wx:if="{{collectConfirmRecord.shenhe_danhao}}">审核单号:{{collectConfirmRecord.shenhe_danhao}}</view>
<view class="warn-tip">注意:审核通过≠已到账,必须您本人点击确认才能完成收款!</view>
</view>
<view class="modal-footer">
<view class="modal-btn cancel" bindtap="onCloseCollectConfirm">稍后再说</view>
<view class="modal-btn confirm" bindtap="onConfirmCollect">{{submitting ? '处理中...' : '去收款'}}</view>
</view>
</view>
</view>
<!-- 失败/驳回详情弹窗 -->
<view wx:if="{{showDetailModal}}" class="modal-mask" bindtap="onCloseDetailModal">
<view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">{{detailTitle}}</view>
<view class="modal-body">{{detailContent}}</view>
<view class="modal-footer">
<view class="modal-btn confirm" bindtap="onCloseDetailModal">知道了</view>
</view>
</view>
</view>
<global-notification id="global-notification" /> <global-notification id="global-notification" />
<popup-notice id="popupNotice" /> <popup-notice id="popupNotice" />
+324 -407
View File
@@ -1,408 +1,325 @@
/* mode2 自动打款 - UI 完全复用 mode1 样式 */
page { page {
background-color: #f5f7fb; background: #f5f5f5;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; min-height: 100vh;
height: 100%; }
}
.ref-page {
.app { min-height: 100vh;
display: flex; padding: 24rpx 24rpx 48rpx;
flex-direction: column; box-sizing: border-box;
min-height: 100vh; }
padding: 0 24rpx 0;
position: relative; /* 提现方式 Tab */
z-index: 1; .method-card {
box-sizing: border-box; background: #fff;
} border-radius: 16rpx;
padding: 0 32rpx;
.global-bg { margin-bottom: 20rpx;
position: fixed; }
top: 0;
left: 0; .method-tab {
width: 100%; display: inline-flex;
height: 100%; flex-direction: column;
z-index: -1; align-items: center;
opacity: 0.1; padding: 28rpx 16rpx 20rpx;
object-fit: cover; position: relative;
filter: blur(1rpx); }
}
.method-tab-icon {
.assets-section { width: 48rpx;
margin-top: 24rpx; height: 48rpx;
flex-shrink: 0; margin-bottom: 8rpx;
} }
.main-card { .method-tab-text {
background: rgba(248, 250, 252, 0.88); font-size: 28rpx;
backdrop-filter: blur(28rpx); color: #333;
-webkit-backdrop-filter: blur(28rpx); font-weight: 500;
border-radius: 48rpx; }
padding: 30rpx 28rpx 24rpx;
margin-bottom: 20rpx; .method-tab-line {
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.04); position: absolute;
border: 1rpx solid rgba(255, 255, 255, 0.4); bottom: 0;
background-size: cover; left: 50%;
} transform: translateX(-50%);
width: 80rpx;
.balance-wrap { height: 6rpx;
text-align: center; background: #FFD54F;
margin-bottom: 20rpx; border-radius: 3rpx;
} }
.balance-label {
font-size: 28rpx; /* 账户选择 */
color: #0f172a; .account-card {
letter-spacing: 1px; background: #fff;
display: block; border-radius: 16rpx;
margin-bottom: 10rpx; padding: 20rpx 16rpx 16rpx;
font-weight: 700; margin-bottom: 20rpx;
text-shadow: 0 1rpx 2rpx rgba(255,255,255,0.8); }
}
.balance-value { .account-scroll {
font-size: 68rpx; white-space: nowrap;
font-weight: 800; display: flex;
color: #0f172a; flex-direction: row;
font-family: 'DIN', monospace; }
letter-spacing: -1rpx;
text-shadow: 0 1rpx 2rpx rgba(255,255,255,0.6); .account-chip {
} display: inline-flex;
flex-direction: column;
.inner-divider { align-items: center;
width: 60%; padding: 16rpx 24rpx;
height: 2rpx; margin-right: 16rpx;
background: linear-gradient(90deg, transparent, #64748b, #64748b, transparent); border-radius: 12rpx;
margin: 0 auto 20rpx auto; background: #f8f8f8;
border-radius: 2rpx; border: 2rpx solid transparent;
opacity: 0.9; min-width: 160rpx;
} }
.assets-hint { .account-chip--active {
display: block; background: #fffbeb;
text-align: center; border-color: #FFD54F;
font-size: 24rpx; }
color: #334155;
margin-bottom: 14rpx; .account-chip--disabled {
font-weight: 600; opacity: 0.45;
} }
.assets-scroll { .chip-label {
width: 100%; font-size: 24rpx;
white-space: nowrap; color: #666;
} margin-bottom: 4rpx;
.assets-track { }
display: inline-flex;
gap: 16rpx; .chip-amount {
} font-size: 28rpx;
color: #333;
.asset-tile { font-weight: 600;
width: 170rpx; }
background: rgba(255, 255, 255, 0.75);
backdrop-filter: blur(8rpx); .account-warn {
border-radius: 28rpx; display: block;
padding: 18rpx 12rpx; margin-top: 12rpx;
display: inline-flex; font-size: 24rpx;
flex-direction: column; color: #ff8c00;
align-items: center; padding: 0 8rpx;
text-align: center; }
border: 1rpx solid rgba(255,255,255,0.5);
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.02); .account-ok {
transition: all 0.2s; display: block;
white-space: normal; margin-top: 12rpx;
background-size: cover; font-size: 24rpx;
background-position: center; color: #888;
} padding: 0 8rpx;
.asset-tile:active { }
background: rgba(255, 255, 255, 0.9);
transform: scale(0.98); /* 金额卡片 */
} .amount-card {
.asset-name { background: #fff;
font-size: 24rpx; border-radius: 16rpx;
font-weight: 700; padding: 32rpx 32rpx 28rpx;
color: #1e293b; margin-bottom: 32rpx;
margin-bottom: 10rpx; }
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.5);
} .avail-row {
.asset-balance { display: flex;
font-size: 28rpx; align-items: baseline;
font-weight: 800; margin-bottom: 32rpx;
color: #2d6a4f; }
font-family: monospace;
margin-bottom: 6rpx; .avail-label {
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.3); font-size: 28rpx;
} color: #333;
.asset-fee { }
font-size: 20rpx;
font-weight: 600; .avail-symbol {
color: #475569; font-size: 28rpx;
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.3); color: #ff8c00;
} margin-left: 4rpx;
.assets-empty { }
width: 400rpx;
text-align: center; .avail-amount {
color: #a0abb9; font-size: 32rpx;
padding: 40rpx 0; color: #ff8c00;
} font-weight: 700;
}
.divider-line {
height: 2rpx; .input-row {
background: linear-gradient(90deg, transparent, #cbd5e1, #cbd5e1, transparent); display: flex;
margin: 16rpx 0 20rpx; align-items: center;
width: 80%; padding-bottom: 8rpx;
margin-left: auto; }
margin-right: auto;
} .input-symbol {
font-size: 64rpx;
.history-section { font-weight: 700;
flex: 1; color: #333;
display: flex; line-height: 1;
flex-direction: column; margin-right: 8rpx;
min-height: 0; }
margin-top: 0;
} .amount-input {
.history-header { flex: 1;
display: flex; font-size: 56rpx;
justify-content: space-between; font-weight: 600;
align-items: baseline; color: #333;
padding: 0 8rpx 20rpx; height: 80rpx;
flex-shrink: 0; min-height: 80rpx;
} }
.history-title {
font-size: 34rpx; .amount-placeholder {
font-weight: 600; color: #ccc;
color: #1e293b; font-size: 40rpx;
} font-weight: 400;
.history-scroll { }
flex: 1;
width: 100%; .withdraw-all {
padding: 0 20rpx; font-size: 28rpx;
box-sizing: border-box; color: #ff8c00;
} padding: 8rpx 0 8rpx 16rpx;
.history-item { flex-shrink: 0;
display: flex; }
align-items: center;
padding: 28rpx 0; .input-divider {
border-bottom: 1rpx solid rgba(0,0,0,0.05); height: 1rpx;
} background: #eee;
.history-info { width: 160rpx; } margin: 16rpx 0 20rpx;
.history-amount { }
font-size: 36rpx;
font-weight: 700; .fee-tip {
color: #1e293b; font-size: 26rpx;
display: block; color: #666;
} }
.history-time {
font-size: 22rpx; .fee-highlight {
color: #94a3b8; color: #ff8c00;
} font-weight: 600;
.history-detail { }
flex: 1;
padding: 0 20rpx; /* 确认按钮 */
} .submit-wrap {
.history-method { padding: 0 8rpx;
font-size: 30rpx; margin-bottom: 32rpx;
color: #334155; }
display: block;
margin-bottom: 6rpx; .confirm-btn {
} width: 100%;
.history-type { height: 96rpx;
font-size: 24rpx; background: linear-gradient(90deg, #FFD54F 0%, #FFB300 100%);
color: #94a3b8; border-radius: 48rpx;
} display: flex;
.history-status { text-align: right; } align-items: center;
justify-content: center;
.status-badge { font-size: 34rpx;
font-size: 26rpx; font-weight: 700;
font-weight: 500; color: #333;
padding: 6rpx 14rpx; box-shadow: 0 8rpx 20rpx rgba(255, 179, 0, 0.35);
border-radius: 30rpx; }
display: inline-block;
} .confirm-btn:active {
.status-wait { opacity: 0.92;
color: #f59e0b; transform: scale(0.99);
background: rgba(245,158,11,0.1); }
}
.status-done { .confirm-btn--disabled {
color: #10b981; background: linear-gradient(90deg, #e0e0e0, #bdbdbd);
background: rgba(16,185,129,0.1); box-shadow: none;
} color: #999;
.status-fail { }
color: #ef4444;
background: rgba(239,68,68,0.1); /* 须知 */
} .notice-box {
.status-pending { background: #ebebeb;
color: #3b82f6; border-radius: 16rpx;
background: rgba(59,130,246,0.1); padding: 28rpx 28rpx 32rpx;
} }
.fail-link {
margin-left: 8rpx; .notice-title {
text-decoration: underline; font-size: 28rpx;
} color: #333;
.collect-tappable { font-weight: 600;
display: inline-flex; margin-bottom: 20rpx;
flex-direction: column; }
align-items: center;
gap: 4rpx; .notice-item {
padding: 10rpx 18rpx; font-size: 26rpx;
cursor: pointer; color: #555;
border: 2rpx solid rgba(59,130,246,0.35); line-height: 1.7;
box-shadow: 0 4rpx 12rpx rgba(59,130,246,0.15); margin-bottom: 8rpx;
} }
.collect-tappable:active {
transform: scale(0.97); /* 确认弹窗 */
opacity: 0.9; .modal-mask {
} position: fixed;
.collect-sub { inset: 0;
font-size: 22rpx; background: rgba(0, 0, 0, 0.5);
font-weight: 700; display: flex;
color: #1d4ed8; align-items: center;
text-decoration: underline; justify-content: center;
} z-index: 1001;
}
.load-tip, .more-tip {
text-align: center; .modal-dialog {
padding: 30rpx; width: 620rpx;
font-size: 24rpx; background: #fff;
color: #94a3b8; border-radius: 20rpx;
} overflow: hidden;
.load-more-btn { }
margin: 16rpx 0 20rpx;
padding: 20rpx; .modal-header {
text-align: center; padding: 32rpx;
background: rgba(255,255,255,0.7); font-size: 34rpx;
backdrop-filter: blur(8rpx); font-weight: 700;
border-radius: 40rpx; text-align: center;
font-size: 28rpx; border-bottom: 1rpx solid #f0f0f0;
color: #3b82f6; }
border: 1rpx solid rgba(255,255,255,0.5);
} .modal-body {
.load-more-btn:active { background: rgba(255,255,255,0.9); } padding: 32rpx;
.safe-bottom { height: 12rpx; flex-shrink: 0; } font-size: 28rpx;
color: #333;
/* 自动打款专属(少量追加) */ }
.pending-tip {
margin: 0 8rpx 16rpx; .auto-tip {
padding: 16rpx 20rpx; font-size: 24rpx;
font-size: 24rpx; color: #ff8c00;
color: #1d4ed8; margin-bottom: 20rpx;
background: rgba(59,130,246,0.08); line-height: 1.5;
border-radius: 20rpx; }
line-height: 1.5;
} .info-row {
.filter-scroll { display: flex;
width: 100%; justify-content: space-between;
white-space: nowrap; margin-bottom: 16rpx;
margin-bottom: 12rpx; font-size: 28rpx;
} }
.filter-track {
display: inline-flex; .fee-row {
gap: 12rpx; display: flex;
padding: 0 8rpx; justify-content: space-between;
} background: #fff8e1;
.filter-chip { padding: 20rpx;
flex-shrink: 0; border-radius: 12rpx;
padding: 10rpx 22rpx; margin-top: 16rpx;
font-size: 24rpx; color: #333;
color: #64748b; }
background: rgba(255,255,255,0.8);
border-radius: 30rpx; .modal-footer {
border: 1rpx solid rgba(0,0,0,0.06); display: flex;
} border-top: 1rpx solid #f0f0f0;
.filter-chip.active { }
color: #3b82f6;
background: #eff6ff; .modal-btn {
border-color: #3b82f6; flex: 1;
} text-align: center;
.auto-tip { padding: 28rpx;
font-size: 24rpx; font-size: 30rpx;
color: #3b82f6; }
margin-bottom: 20rpx;
line-height: 1.5; .modal-btn.cancel {
} color: #999;
.warn-tip { border-right: 1rpx solid #f0f0f0;
font-size: 24rpx; }
color: #f59e0b;
margin-top: 16rpx; .modal-btn.confirm {
font-weight: 600; color: #ff8c00;
} font-weight: 600;
}
/* 弹窗(与 mode1 一致) */
.modal-mask {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-dialog {
width: 600rpx;
background: rgba(255,255,255,0.96);
backdrop-filter: blur(20rpx);
border-radius: 48rpx;
overflow: hidden;
box-shadow: 0 20rpx 40rpx rgba(0,0,0,0.1);
border: 1rpx solid rgba(255,255,255,0.6);
}
.modal-header {
padding: 36rpx 32rpx 20rpx;
font-size: 36rpx;
font-weight: 700;
border-bottom: 1rpx solid rgba(0,0,0,0.05);
}
.modal-body {
padding: 32rpx;
font-size: 28rpx;
color: #334155;
line-height: 1.6;
}
.info-row, .amount-row {
display: flex;
justify-content: space-between;
margin-bottom: 24rpx;
font-size: 28rpx;
}
.amount-row input {
border: 1rpx solid rgba(0,0,0,0.1);
border-radius: 28rpx;
padding: 16rpx 20rpx;
width: 260rpx;
background: rgba(255,255,255,0.9);
}
.quick-row {
display: flex;
gap: 16rpx;
margin: 24rpx 0;
}
.quick-chip {
flex: 1;
background: rgba(241,245,249,0.8);
text-align: center;
padding: 12rpx;
border-radius: 40rpx;
font-size: 28rpx;
}
.fee-row {
display: flex;
justify-content: space-between;
background: rgba(248,250,252,0.8);
padding: 20rpx;
border-radius: 28rpx;
margin: 20rpx 0;
}
.modal-footer {
display: flex;
border-top: 1rpx solid rgba(0,0,0,0.05);
}
.modal-btn {
flex: 1;
text-align: center;
padding: 28rpx;
font-size: 30rpx;
}
.modal-btn.cancel {
color: #8f9bb3;
border-right: 1rpx solid rgba(0,0,0,0.05);
}
.modal-btn.confirm { color: #3b82f6; }
@@ -0,0 +1,243 @@
// pages/withdraw/components/record-mode1/record-mode1.js
// 子组件版本 - 完整代码,仅适配生命周期,业务逻辑不动
import request from '../../../../utils/request.js';
import upload from '../../../../utils/upload.js';
import PopupService from '../../../../services/popupService.js';
const app = getApp();
const PAGE_SIZE = 10;
let lastPullDownTime = 0;
const PULL_DOWN_INTERVAL = 2000;
Component({
data: {
imgUrls: {
pageBg: '',
cardBg: '',
iconWechat: '',
iconAlipay: '',
iconRecord: '',
iconRefresh: '',
},
assetList: [],
totalAmount: '0.00',
selectedAsset: null,
txfangshi: null,
txdianhua: '',
txzh: '',
txtupian: '',
ossImageUrl: '',
showTixianModal: false,
tixianAmount: '',
shouxufei: '0.00',
shijidaozhang: '0.00',
currentRate: '0.00',
recordList: [],
page: 1,
nomore: false,
loading: false,
isRefreshing: false,
canloadmore: true,
showSkfsModal: false,
tempTxfangshi: null,
tempTxPhone: '',
tempTxAccount: '',
tempTxImage: '',
choosingImage: false,
showModifyModal: false,
modifyingRecord: null,
modifyTxfangshi: null,
modifyTxPhone: '',
modifyTxAccount: '',
modifyTxImage: '',
modifyImageUrl: '',
showFailModal: false,
currentFailReason: '',
isLoading: false,
},
attached() {
this.initImageUrls();
this.loadWithdrawRecords(true);
},
pageLifetimes: {
show() {
this.registerNotification();
PopupService.checkAndShow(this, 'tixian');
},
hide() {
const popup = this.selectComponent('#popupNotice');
popup?.cleanup?.();
}
},
methods: {
onPullDownRefresh() {
return this.loadWithdrawRecords(true);
},
onLoadMoreFromScroll() {
this.loadMoreRecords();
},
loadMoreRecords() {
if (this.data.nomore) {
wx.showToast({ title: '没有更多记录了', icon: 'none' });
return;
}
if (this.data.loading) return;
this.loadWithdrawRecords();
},
initImageUrls() {
const ossBase = app.globalData.ossImageUrl || '';
const imgDir = `${ossBase}beijing/tixian/`;
this.setData({
imgUrls: {
pageBg: `${imgDir}page_bg.png`,
cardBg: `${imgDir}card_bg.png`,
iconWechat: `${imgDir}icon_wechat.png`,
iconAlipay: `${imgDir}icon_alipay.png`,
iconRecord: `${imgDir}icon_record.png`,
iconRefresh: `${imgDir}icon_refresh.png`,
assetTileBg: `${imgDir}asset_tile_bg.png`,
}
});
},
async loadWithdrawRecords(refresh = false) {
const now = Date.now();
if (now - lastPullDownTime < PULL_DOWN_INTERVAL && !refresh) return;
if (this.data.loading || this.data.isRefreshing) return;
const page = refresh ? 1 : this.data.page;
if (this.data.nomore && !refresh) return;
this.setData({ loading: true, isRefreshing: refresh });
lastPullDownTime = now;
try {
const res = await request({ url: '/yonghu/tixianjiluhq', method: 'POST', data: { page, limit: PAGE_SIZE } });
if (res?.data?.code === 0) {
const list = (res.data.data.list || []).map(item => ({
...item,
statusText: this.getStatusText(item.zhuangtai),
statusColor: this.getStatusColor(item.zhuangtai)
}));
const newList = refresh ? list : [...this.data.recordList, ...list];
const hasMore = res.data.data.has_more === true;
this.setData({
recordList: newList, page: page + 1, nomore: !hasMore, canloadmore: hasMore,
loading: false, isRefreshing: false
});
} else {
this.setData({ loading: false, isRefreshing: false });
}
} catch (err) {
this.setData({ loading: false, isRefreshing: false });
}
},
onModifyRecord(e) {
const record = e.currentTarget.dataset.record;
if (parseInt(record.zhuangtai) !== 1) {
wx.showToast({ title: '只有审核中的记录可修改', icon: 'none' });
return;
}
this.setData({
modifyingRecord: record,
modifyTxfangshi: record.fangshi,
modifyTxPhone: record.txdianhua || '',
modifyTxAccount: record.txzh || '',
modifyTxImage: '',
modifyImageUrl: record.txtupian ? (app.globalData.ossImageUrl + record.txtupian) : '',
showModifyModal: true
});
},
onSelectModifyFangshi(e) { this.setData({ modifyTxfangshi: e.currentTarget.dataset.fangshi }); },
onModifyPhoneInput(e) { this.setData({ modifyTxPhone: e.detail.value }); },
onModifyAccountInput(e) { this.setData({ modifyTxAccount: e.detail.value }); },
onChooseModifyImage() {
if (this.data.choosingImage) return;
this.setData({ choosingImage: true });
wx.chooseMedia({
count: 1, mediaType: ['image'],
success: (res) => { this.setData({ modifyTxImage: res.tempFiles[0].tempFilePath }); },
complete: () => { this.setData({ choosingImage: false }); }
});
},
onPreviewModifyImage() {
if (this.data.modifyTxImage) wx.previewImage({ urls: [this.data.modifyTxImage] });
else if (this.data.modifyImageUrl) wx.previewImage({ urls: [this.data.modifyImageUrl] });
},
onDeleteModifyImage() { this.setData({ modifyTxImage: '' }); },
async onConfirmModify() {
const { modifyTxfangshi, modifyTxPhone, modifyTxAccount, modifyTxImage, modifyingRecord } = this.data;
if (!modifyTxfangshi) { wx.showToast({ title: '请选择提现方式', icon: 'none' }); return; }
if (!modifyTxPhone) { wx.showToast({ title: '请输入收款人电话', icon: 'none' }); return; }
if (modifyTxfangshi == 1 && !modifyTxImage) { wx.showToast({ title: '请上传微信收款码', icon: 'none' }); return; }
if (modifyTxfangshi == 2 && !modifyTxAccount && !modifyTxImage) {
wx.showToast({ title: '请填写支付宝账号或上传收款码', icon: 'none' }); return;
}
const formData = { tixian_id: modifyingRecord.id, fangshi: modifyTxfangshi, txdianhua: modifyTxPhone, txzh: modifyTxAccount || '' };
try {
const res = await upload({ url: '/yonghu/yonghutxshxg', formData, filePath: modifyTxImage || null, fileName: 'file' });
if (res?.data?.code === 0) {
const data = res.data.data;
const newList = this.data.recordList.map(item => {
if (item.id === modifyingRecord.id) {
return { ...item, fangshi: modifyTxfangshi, txdianhua: modifyTxPhone, txzh: modifyTxAccount || '', txtupian: data.txtupian || modifyingRecord.txtupian };
}
return item;
});
this.setData({ recordList: newList, showModifyModal: false, modifyingRecord: null });
wx.showToast({ title: '修改成功', icon: 'success' });
} else {
wx.showToast({ title: res?.data?.msg || '修改失败', icon: 'none' });
}
} catch (err) {
wx.showToast({ title: '网络错误', icon: 'none' });
}
},
onCloseModifyModal() { this.setData({ showModifyModal: false, modifyingRecord: null }); },
onViewFailReason(e) {
const record = e.currentTarget.dataset.record;
const reason = record.fail_reason || record.shibaiyuanyin || '暂无详细信息';
this.setData({ currentFailReason: reason, showFailModal: true });
},
onCloseFailModal() { this.setData({ showFailModal: false }); },
getStatusText(zhuangtai) {
const s = parseInt(zhuangtai);
if (s === 1) return '审核中';
if (s === 2) return '成功';
if (s === 3) return '失败';
return '未知';
},
getStatusColor(zhuangtai) {
const s = parseInt(zhuangtai);
if (s === 1) return '#F5A623';
if (s === 2) return '#2ED158';
if (s === 3) return '#FF4D4F';
return '#999';
},
registerNotification() {
const comp = this.selectComponent('#global-notification');
if (comp?.showNotification) {
app.globalData.globalNotification = {
show: (data) => comp.showNotification(data),
hide: () => comp.hideNotification()
};
}
},
stopPropagation() {}
}
});
@@ -0,0 +1,7 @@
{
"component": true,
"usingComponents": {
"global-notification": "/components/global-notification/global-notification",
"popup-notice": "/components/popup-notice/popup-notice"
}
}
@@ -0,0 +1,60 @@
<!-- record-mode1:仅提现记录(收款码手动审核) -->
<view class="app">
<image class="global-bg" src="{{imgUrls.pageBg}}" mode="aspectFill" />
<view class="history-section history-section--full">
<view class="history-header">
<text class="history-title">提现记录</text>
</view>
<scroll-view class="history-scroll" scroll-y enable-back-to-top bindscrolltolower="onLoadMoreFromScroll">
<view wx:for="{{recordList}}" wx:key="index" class="history-item">
<view class="history-info">
<text class="history-amount">¥{{item.jine}}</text>
<text class="history-time">{{item.create}}</text>
</view>
<view class="history-detail">
<text class="history-method">{{item.fangshi == 1 ? '微信' : '支付宝'}}</text>
<text class="history-type">{{item.leixing == 1 ? '佣金' : (item.leixing == 2 ? '分红' : (item.leixing == 3 ? '组长' : (item.leixing == 4 ? '考核官' : '保证金')))}}</text>
</view>
<view class="history-status">
<view wx:if="{{item.zhuangtai == 1}}" class="status-badge status-wait" bindtap="onModifyRecord" data-record="{{item}}">{{item.statusText}} ✏修改</view>
<view wx:elif="{{item.zhuangtai == 3}}" class="status-badge status-fail">
{{item.statusText}}
<text class="fail-link" bindtap="onViewFailReason" data-record="{{item}}">详情</text>
</view>
<view wx:else class="status-badge status-done">{{item.statusText}}</view>
</view>
</view>
<view wx:if="{{loading}}" class="load-tip">加载中...</view>
<view wx:if="{{nomore && recordList.length > 0}}" class="more-tip">—— 没有更多了 ——</view>
<view wx:if="{{!nomore && recordList.length > 0}}" class="load-more-btn" bindtap="loadMoreRecords">加载更多记录</view>
<view wx:if="{{recordList.length === 0 && !loading}}" class="load-tip">暂无提现记录</view>
</scroll-view>
</view>
<view class="safe-bottom"></view>
</view>
<view wx:if="{{showModifyModal}}" class="modal-mask" bindtap="onCloseModifyModal">
<view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">修改信息</view>
<view class="modal-body">
<view class="toggle-row"><view class="toggle-item {{modifyTxfangshi == 1 ? 'active' : ''}}" bindtap="onSelectModifyFangshi" data-fangshi="1">微信</view><view class="toggle-item {{modifyTxfangshi == 2 ? 'active' : ''}}" bindtap="onSelectModifyFangshi" data-fangshi="2">支付宝</view></view>
<input class="field-input" placeholder="电话" value="{{modifyTxPhone}}" bindinput="onModifyPhoneInput" />
<view wx:if="{{modifyTxfangshi == 2}}"><input class="field-input" placeholder="支付宝账号" value="{{modifyTxAccount}}" bindinput="onModifyAccountInput" /></view>
<view class="upload-wrap"><view wx:if="{{modifyImageUrl}}" class="current-img"><image src="{{modifyImageUrl}}" mode="aspectFill" bindtap="onPreviewModifyImage" /></view><view class="upload-trigger" bindtap="onChooseModifyImage">+ 上传新图片</view><view wx:if="{{modifyTxImage}}" class="image-preview"><image src="{{modifyTxImage}}" mode="aspectFill" /><view class="image-actions"><text bindtap="onPreviewModifyImage">预览</text><text bindtap="onDeleteModifyImage">删除</text></view></view></view>
</view>
<view class="modal-footer"><view class="modal-btn cancel" bindtap="onCloseModifyModal">取消</view><view class="modal-btn confirm" bindtap="onConfirmModify">确认</view></view>
</view>
</view>
<view wx:if="{{showFailModal}}" class="modal-mask" bindtap="onCloseFailModal">
<view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">失败原因</view>
<view class="modal-body">{{currentFailReason}}</view>
<view class="modal-footer"><view class="modal-btn confirm" bindtap="onCloseFailModal">知道了</view></view>
</view>
</view>
<global-notification id="global-notification" />
<popup-notice id="popupNotice" />
@@ -0,0 +1,67 @@
@import "../record-mode2/record-mode2.wxss";
.history-section--full {
flex: 1;
min-height: calc(100vh - 48rpx);
margin-top: 24rpx;
}
.history-section--full .history-scroll {
height: calc(100vh - 200rpx);
}
.toggle-row {
display: flex;
gap: 16rpx;
margin-bottom: 20rpx;
}
.toggle-item {
flex: 1;
text-align: center;
padding: 16rpx;
border-radius: 12rpx;
background: #f1f5f9;
font-size: 28rpx;
color: #64748b;
}
.toggle-item.active {
background: #eff6ff;
color: #3b82f6;
font-weight: 600;
}
.field-input {
width: 100%;
box-sizing: border-box;
padding: 20rpx;
border: 1rpx solid #e2e8f0;
border-radius: 12rpx;
margin-bottom: 16rpx;
font-size: 28rpx;
}
.upload-trigger {
padding: 40rpx;
text-align: center;
border: 2rpx dashed #cbd5e1;
border-radius: 12rpx;
color: #64748b;
font-size: 28rpx;
}
.image-preview image {
width: 100%;
height: 240rpx;
border-radius: 12rpx;
}
.image-actions {
display: flex;
gap: 24rpx;
justify-content: center;
margin-top: 12rpx;
font-size: 26rpx;
color: #3b82f6;
}
@@ -0,0 +1,513 @@
// pages/withdraw/components/record-mode2/record-mode2.js
// UI 与 mode1 完全一致,业务逻辑为自动打款审核收款
import request from '../../../../utils/request.js';
import PopupService from '../../../../services/popupService.js';
const app = getApp();
const yemianshuju = 5;
let lastPullDownTime = 0;
const PULL_DOWN_INTERVAL = 2000;
const TX_STATUS = {
SHENHEZHONG: 1,
TIXIAN_CHENGGONG: 2,
TIXIAN_SHIBAI: 3,
SHENHE_CHENGGONG: 4,
SHENHE_SHIBAI: 5,
DAI_SHOUKUAN: 6,
};
const ASSET_CONFIG = {
dashou_yue: { leixing: 1, label: '接单员佣金' },
guanshi_fenyong: { leixing: 2, label: '管事分红' },
zuzhang_fenyong: { leixing: 3, label: '组长分红' },
kaoheguan_fenyong: { leixing: 4, label: '考核官分佣' },
dashou_yajin: { leixing: 5, label: '接单员保证金' },
shangjia_yue: { leixing: 6, label: '商家余额' },
};
const LEIXING_LABEL = {
1: '接单员佣金', 2: '管事分红', 3: '组长分红',
4: '考核官分佣', 5: '接单员保证金', 6: '商家余额',
};
Component({
properties: { options: { type: Object, value: {} } },
data: {
imgUrls: {
pageBg: '', cardBg: '', assetTileBg: '',
},
assetList: [],
totalAmount: '0.00',
selectedAsset: null,
isLoadingAssets: false,
tixianleixing: null,
tixianjine: '',
currentRate: '0.00',
showTixian: false,
recordList: [],
page: 1,
loading: false,
nomore: false,
canloadmore: true,
isRefreshing: false,
shouxufei: '0.00',
shijidaozhang: '0.00',
currentTixianId: null,
submitting: false,
mchId: '',
currentStatusFilter: 0,
statusTabs: [
{ value: 0, label: '全部' },
{ value: 1, label: '审核中' },
{ value: 6, label: '待收款' },
{ value: 4, label: '审核成功' },
{ value: 5, label: '审核失败' },
{ value: 2, label: '提现成功' },
{ value: 3, label: '提现失败' },
],
hasPendingCollect: false,
showCollectConfirm: false,
collectConfirmRecord: null,
showDetailModal: false,
detailTitle: '',
detailContent: '',
},
lifetimes: {
attached() {
this.initImageUrls();
this.huoquJilu(true);
}
},
pageLifetimes: {
show() {
this.registerNotificationComponent();
PopupService.checkAndShow(this, 'tixian');
},
hide() {
const popupComp = this.selectComponent('#popupNotice');
if (popupComp && popupComp.cleanup) popupComp.cleanup();
}
},
methods: {
registerNotificationComponent() {
const notificationComp = this.selectComponent('#global-notification');
if (notificationComp && notificationComp.showNotification) {
app.globalData.globalNotification = {
show: (data) => notificationComp.showNotification(data),
hide: () => notificationComp.hideNotification()
};
}
},
initImageUrls() {
const ossBase = app.globalData.ossImageUrl || '';
const imgDir = `${ossBase}beijing/tixian/`;
this.setData({
imgUrls: {
pageBg: `${imgDir}page_bg.png`,
cardBg: `${imgDir}card_bg.png`,
assetTileBg: `${imgDir}asset_tile_bg.png`,
}
});
},
parseZhuangtai(item) {
const raw = item.zhuangtai ?? item.status ?? item.state;
const n = parseInt(raw, 10);
return Number.isNaN(n) ? -1 : n;
},
/** 规范化列表字段(兼容后端多种命名 / 嵌套 audit) */
normalizeRecordFields(item) {
const audit = item.audit || item.shenhe || item.shenhe_info || {};
const shenheJiluId = item.shenhe_jilu_id ?? item.shenheJiluId
?? item.audit_id ?? item.shenheid ?? audit.id ?? audit.shenhe_jilu_id ?? null;
const shenheDanhao = String(
item.shenhe_danhao || item.shenheDanhao || item.audit_shenhe_danhao
|| audit.shenhe_danhao || audit.danhao || ''
).trim();
const tixianjiluId = item.tixianjilu_id ?? item.tixianjiluId ?? item.id ?? null;
const zhuangtai = this.parseZhuangtai(item);
return {
...item,
zhuangtai: zhuangtai >= 0 ? zhuangtai : item.zhuangtai,
shenhe_jilu_id: shenheJiluId,
shenhe_danhao: shenheDanhao,
tixianjilu_id: tixianjiluId,
};
},
hasAuditJiluId(item) {
const id = item.shenhe_jilu_id;
return id !== null && id !== undefined && id !== '' && id !== 0 && id !== '0';
},
hasShenheDanhao(item) {
return !!(item.shenhe_danhao && String(item.shenhe_danhao).trim());
},
isNewAuditRecord(item) {
return this.hasAuditJiluId(item) && this.hasShenheDanhao(item);
},
/** 待收款是否可点击:状态6 + 审核记录ID + 审核单号 缺一不可 */
canCollectRecord(item) {
return this.parseZhuangtai(item) === TX_STATUS.DAI_SHOUKUAN
&& this.hasAuditJiluId(item)
&& this.hasShenheDanhao(item);
},
getLeixingLabel(leixing) {
return LEIXING_LABEL[parseInt(leixing)] || '提现';
},
getStatusBadgeClass(status) {
switch (parseInt(status)) {
case TX_STATUS.SHENHEZHONG: return 'status-wait';
case TX_STATUS.TIXIAN_CHENGGONG:
case TX_STATUS.SHENHE_CHENGGONG: return 'status-done';
case TX_STATUS.DAI_SHOUKUAN: return 'status-pending';
case TX_STATUS.TIXIAN_SHIBAI:
case TX_STATUS.SHENHE_SHIBAI: return 'status-fail';
default: return 'status-wait';
}
},
processRecordItem(item) {
item = this.normalizeRecordFields(item);
const isNew = this.isNewAuditRecord(item);
const status = this.parseZhuangtai(item);
let statusText = '未知';
let canCollect = false;
let canShowDetail = false;
let detailReason = '';
switch (status) {
case TX_STATUS.SHENHEZHONG: statusText = '审核中'; break;
case TX_STATUS.TIXIAN_CHENGGONG: statusText = '提现成功'; break;
case TX_STATUS.TIXIAN_SHIBAI:
statusText = '提现失败';
if (item.fail_reason || item.bhliyou) {
canShowDetail = true;
detailReason = item.fail_reason || item.bhliyou;
}
break;
case TX_STATUS.SHENHE_CHENGGONG: statusText = '审核成功'; break;
case TX_STATUS.SHENHE_SHIBAI:
statusText = '审核失败';
if (item.bhliyou) { canShowDetail = true; detailReason = item.bhliyou; }
break;
case TX_STATUS.DAI_SHOUKUAN:
statusText = '待收款';
canCollect = this.canCollectRecord(item);
break;
}
return {
...item,
isNewAudit: isNew,
leixingLabel: this.getLeixingLabel(item.leixing),
statusText,
statusBadgeClass: this.getStatusBadgeClass(status),
canCollect,
canShowDetail,
detailReason,
};
},
gengxinYue(data, leixing) {
if (!data) return;
if (data.new_yongjin !== undefined && data.new_yongjin !== null) {
app.globalData.yongjin = data.new_yongjin;
}
if (data.new_fenyong !== undefined && data.new_fenyong !== null) {
app.globalData.guanshi.fenyongtixian = data.new_fenyong;
}
if (data.new_yajin !== undefined && data.new_yajin !== null) {
app.globalData.yajin = data.new_yajin;
}
if (data.new_shangjia_yue !== undefined && data.new_shangjia_yue !== null) {
if (app.globalData.shangjia) app.globalData.shangjia.sjyue = data.new_shangjia_yue;
}
if (data.current_rate !== undefined && leixing) {
const rate = parseFloat(data.current_rate);
const rateKeyMap = { 1: 'dashouRate', 5: 'dashou_yajin_rate', 6: 'shangjia_rate', 2: 'guanshi_rate', 3: 'zuzhang_rate', 4: 'kaoheguan_rate' };
const key = rateKeyMap[leixing];
if (key) wx.setStorageSync(key, rate);
}
},
updatePendingCollectFlag(list) {
const hasPending = (list || []).some(item => item.canCollect);
if (hasPending !== this.data.hasPendingCollect) {
this.setData({ hasPendingCollect: hasPending });
}
},
/** 微信确认收款成功后,本地先把对应记录标为「提现成功」 */
markLocalRecordWithdrawSuccess(record) {
if (!record) return;
const matchId = String(record.tixianjilu_id || record.id || '');
const matchDanhao = String(record.shenhe_danhao || '').trim();
if (!matchId && !matchDanhao) return;
const newList = (this.data.recordList || []).map((item) => {
const itemId = String(item.tixianjilu_id || item.id || '');
const itemDanhao = String(item.shenhe_danhao || '').trim();
const isMatch = (matchId && itemId === matchId)
|| (matchDanhao && itemDanhao === matchDanhao);
if (!isMatch) return item;
return this.processRecordItem({
...item,
zhuangtai: TX_STATUS.TIXIAN_CHENGGONG,
});
});
this.setData({ recordList: newList });
this.updatePendingCollectFlag(newList);
},
async finishWxCollectSuccess(record) {
this.markLocalRecordWithdrawSuccess(record);
await this.huoquJilu(true, true);
this.markLocalRecordWithdrawSuccess(record);
PopupService.checkAndShow(this, 'tixianchenggong');
wx.showToast({
title: '提现成功',
icon: 'success',
duration: 3000,
});
},
onPullDownRefresh() {
return this.huoquJilu(true, true);
},
onStatusFilterTap(e) {
const value = parseInt(e.currentTarget.dataset.value, 10);
if (value === this.data.currentStatusFilter) return;
this.setData({ currentStatusFilter: value });
this.huoquJilu(true);
},
onCollectTap(e) {
const index = e.currentTarget.dataset.index;
const record = this.data.recordList[index];
if (!record) return;
if (this.parseZhuangtai(record) !== TX_STATUS.DAI_SHOUKUAN) {
wx.showToast({ title: '当前状态不可收款', icon: 'none' });
return;
}
if (!this.hasShenheDanhao(record) || !this.hasAuditJiluId(record)) {
wx.showToast({ title: '审核信息不完整,请刷新后重试', icon: 'none' });
return;
}
if (this.data.submitting) {
wx.showToast({ title: '正在处理中,请稍后', icon: 'none' });
return;
}
this.setData({ showCollectConfirm: true, collectConfirmRecord: record });
},
onCloseCollectConfirm() {
if (this.data.submitting) return;
this.setData({ showCollectConfirm: false, collectConfirmRecord: null });
},
async onConfirmCollect() {
if (this.data.submitting) return;
let record = this.data.collectConfirmRecord;
if (!record) return;
if (!this.canCollectRecord(record)) {
await this.huoquJilu(true, true);
const refreshed = (this.data.recordList || []).find(
r => String(r.id) === String(record.id)
|| String(r.tixianjilu_id) === String(record.tixianjilu_id)
);
if (refreshed) record = refreshed;
}
if (!this.canCollectRecord(record)) {
wx.showModal({
title: '暂时无法收款',
content: '缺少审核单号或审核记录ID,请下拉刷新后重试。仍不行请联系客服。',
showCancel: false,
});
return;
}
this.setData({ showCollectConfirm: false, submitting: true, collectConfirmRecord: record });
try {
const res = await request({
url: '/yonghu/tixiansq',
method: 'POST',
data: {
shenhe_danhao: record.shenhe_danhao,
shenhe_jilu_id: record.shenhe_jilu_id || '',
tixianjilu_id: record.tixianjilu_id || record.id || '',
leixing: record.leixing,
}
});
if (res.statusCode === 200 && res.data && res.data.code === 0) {
const data = res.data.data;
this.setData({
currentTixianId: data.tixian_id,
mchId: data.mch_id || '',
collectConfirmRecord: record,
});
this.tiaoqiWeixinQueRen(data.package_info);
} else {
wx.showModal({ title: '收款失败', content: res.data?.msg || '无法发起收款,请稍后重试', showCancel: false });
this.setData({ submitting: false, collectConfirmRecord: null });
}
} catch (err) {
wx.showModal({ title: '网络错误', content: '网络连接失败,请稍后重试', showCancel: false });
this.setData({ submitting: false, collectConfirmRecord: null });
}
},
tiaoqiWeixinQueRen(packageInfo) {
const appId = app.globalData.appId;
const mchId = this.data.mchId;
if (!appId || !mchId) {
wx.showModal({ title: '配置错误', content: '无法调起收款,请联系客服', showCancel: false });
this.setData({ submitting: false, collectConfirmRecord: null });
return;
}
wx.requestMerchantTransfer({
appId, mchId, package: packageInfo,
success: () => { this.tongzhiHouduanQueRen(1); },
fail: () => {
this.tongzhiHouduanQueRen(0);
wx.showModal({
title: '确认收款失败',
content: '微信收款确认失败,您可在记录中再次点击「收款」重试。',
showCancel: false,
});
}
});
},
async tongzhiHouduanQueRen(result) {
if (!this.data.currentTixianId) {
this.setData({ submitting: false, collectConfirmRecord: null });
return;
}
const record = this.data.collectConfirmRecord;
const wxConfirmed = result === 1;
try {
const res = await request({
url: '/yonghu/tixianqr',
method: 'POST',
data: {
tixian_id: this.data.currentTixianId,
result: result,
shenhe_danhao: record ? record.shenhe_danhao : '',
shenhe_jilu_id: record ? (record.shenhe_jilu_id || '') : '',
tixianjilu_id: record ? (record.tixianjilu_id || record.id || '') : '',
leixing: record ? record.leixing : '',
}
});
if (res.statusCode === 200 && res.data && res.data.code === 0) {
const data = res.data.data || {};
this.gengxinYue(data, record ? record.leixing : null);
}
// 微信已确认收款:不论 tixianqr 返回什么,都刷新列表,不弹系统异常
if (wxConfirmed) {
await this.finishWxCollectSuccess(record);
} else if (res.statusCode === 200 && res.data && res.data.code === 0) {
this.huoquJilu(true);
wx.showToast({
title: '收款已取消',
icon: 'none',
duration: 3000,
});
} else {
wx.showModal({
title: '确认状态失败',
content: res.data?.msg || '操作失败',
showCancel: false,
});
}
} catch (err) {
if (wxConfirmed) {
await this.finishWxCollectSuccess(record);
} else {
wx.showModal({
title: '网络错误',
content: '网络连接失败',
showCancel: false,
});
}
} finally {
this.setData({ submitting: false, currentTixianId: null, collectConfirmRecord: null });
}
},
onViewDetail(e) {
const index = e.currentTarget.dataset.index;
const record = this.data.recordList[index];
if (!record || !record.canShowDetail) return;
const status = parseInt(record.zhuangtai);
let detailTitle = '失败原因';
if (status === TX_STATUS.SHENHE_SHIBAI) detailTitle = '审核失败原因';
else if (status === TX_STATUS.TIXIAN_SHIBAI) detailTitle = '提现失败原因';
this.setData({
showDetailModal: true,
detailTitle,
detailContent: record.detailReason || '暂无详细信息',
});
},
onCloseDetailModal() {
this.setData({ showDetailModal: false, detailTitle: '', detailContent: '' });
},
async huoquJilu(fresh = false, force = false) {
const now = Date.now();
if (!force && now - lastPullDownTime < 2000 && !fresh) return;
if (!force && (this.data.loading || this.data.isRefreshing)) return;
const page = fresh ? 1 : this.data.page;
if (fresh) this.setData({ nomore: false, canloadmore: true, isRefreshing: true });
if (this.data.nomore && !fresh) return;
this.setData({ loading: true });
lastPullDownTime = now;
try {
const res = await request({
url: '/yonghu/tixianjiluhq',
method: 'POST',
data: { page, limit: yemianshuju, mode: 2, zhuangtai: this.data.currentStatusFilter }
});
if (res.statusCode === 200 && res.data && res.data.code === 0) {
const data = res.data.data;
const processedList = (data.list || []).map(item => this.processRecordItem(item));
const newList = fresh ? processedList : [...this.data.recordList, ...processedList];
this.setData({
recordList: newList,
page: page + 1,
nomore: !(data.has_more === true),
canloadmore: data.has_more === true,
loading: false,
isRefreshing: false,
});
this.updatePendingCollectFlag(newList);
} else {
this.setData({ loading: false, isRefreshing: false });
}
} catch (err) {
this.setData({ loading: false, isRefreshing: false });
}
},
onReachBottom() {
if (this.data.canloadmore && !this.data.nomore && !this.data.loading && !this.data.isRefreshing) {
const now = Date.now();
if (now - lastPullDownTime >= PULL_DOWN_INTERVAL) this.huoquJilu();
}
},
stopPropagation() {}
}
});
@@ -0,0 +1,7 @@
{
"component": true,
"usingComponents": {
"global-notification": "/components/global-notification/global-notification",
"popup-notice": "/components/popup-notice/popup-notice"
}
}
@@ -0,0 +1,90 @@
<!-- record-mode2:仅提现记录(自动打款) -->
<view class="app">
<image class="global-bg" src="{{imgUrls.pageBg}}" mode="aspectFill" />
<view class="history-section history-section--full">
<view class="history-header">
<text class="history-title">提现记录</text>
</view>
<view wx:if="{{hasPendingCollect}}" class="pending-tip">
您有审核通过的提现待收款,请点击「收款」按钮,在微信中主动确认后才能到账。
</view>
<scroll-view class="filter-scroll" scroll-x show-scrollbar="{{false}}">
<view class="filter-track">
<view
wx:for="{{statusTabs}}"
wx:key="value"
class="filter-chip {{currentStatusFilter == item.value ? 'active' : ''}}"
bindtap="onStatusFilterTap"
data-value="{{item.value}}"
>{{item.label}}</view>
</view>
</scroll-view>
<scroll-view class="history-scroll" scroll-y enable-back-to-top bindscrolltolower="onReachBottom">
<view wx:for="{{recordList}}" wx:key="index" class="history-item">
<view class="history-info">
<text class="history-amount">¥{{item.jine}}</text>
<text class="history-time">{{item.create}}</text>
</view>
<view class="history-detail">
<text class="history-method">微信零钱</text>
<text class="history-type">{{item.leixingLabel}}</text>
</view>
<view class="history-status">
<view
wx:if="{{item.canCollect}}"
class="status-badge status-pending collect-tappable"
bindtap="onCollectTap"
data-index="{{index}}"
>
<text>{{item.statusText}}</text>
<text class="collect-sub">点击收款</text>
</view>
<view wx:elif="{{item.canShowDetail}}" class="status-badge status-fail">
{{item.statusText}}
<text class="fail-link" bindtap="onViewDetail" data-index="{{index}}">详情</text>
</view>
<view wx:else class="status-badge {{item.statusBadgeClass}}">{{item.statusText}}</view>
</view>
</view>
<view wx:if="{{loading}}" class="load-tip">加载中...</view>
<view wx:if="{{nomore && recordList.length > 0}}" class="more-tip">—— 没有更多了 ——</view>
<view wx:if="{{!nomore && recordList.length > 0}}" class="load-more-btn" bindtap="onReachBottom">加载更多记录</view>
<view wx:if="{{recordList.length === 0 && !loading}}" class="load-tip">暂无提现记录</view>
</scroll-view>
</view>
<view class="safe-bottom"></view>
</view>
<view wx:if="{{showCollectConfirm}}" class="modal-mask" bindtap="onCloseCollectConfirm">
<view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">确认收款</view>
<view class="modal-body">
<view class="auto-tip">审核已通过,{{collectConfirmRecord.leixingLabel}} ¥{{collectConfirmRecord.jine}}</view>
<view>请点击「去收款」,然后在微信弹窗中主动确认,资金才会打入您的微信零钱。</view>
<view class="warn-tip" wx:if="{{collectConfirmRecord.shenhe_danhao}}">审核单号:{{collectConfirmRecord.shenhe_danhao}}</view>
<view class="warn-tip">注意:审核通过≠已到账,必须您本人点击确认才能完成收款!</view>
</view>
<view class="modal-footer">
<view class="modal-btn cancel" bindtap="onCloseCollectConfirm">稍后再说</view>
<view class="modal-btn confirm" bindtap="onConfirmCollect">{{submitting ? '处理中...' : '去收款'}}</view>
</view>
</view>
</view>
<view wx:if="{{showDetailModal}}" class="modal-mask" bindtap="onCloseDetailModal">
<view class="modal-dialog" catchtap="stopPropagation">
<view class="modal-header">{{detailTitle}}</view>
<view class="modal-body">{{detailContent}}</view>
<view class="modal-footer">
<view class="modal-btn confirm" bindtap="onCloseDetailModal">知道了</view>
</view>
</view>
</view>
<global-notification id="global-notification" />
<popup-notice id="popupNotice" />
@@ -0,0 +1,416 @@
/* mode2 自动打款 - UI 完全复用 mode1 样式 */
page {
background-color: #f5f7fb;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
height: 100%;
}
.app {
display: flex;
flex-direction: column;
min-height: 100vh;
padding: 0 24rpx 0;
position: relative;
z-index: 1;
box-sizing: border-box;
}
.global-bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
opacity: 0.1;
object-fit: cover;
filter: blur(1rpx);
}
.assets-section {
margin-top: 24rpx;
flex-shrink: 0;
}
.main-card {
background: rgba(248, 250, 252, 0.88);
backdrop-filter: blur(28rpx);
-webkit-backdrop-filter: blur(28rpx);
border-radius: 48rpx;
padding: 30rpx 28rpx 24rpx;
margin-bottom: 20rpx;
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.04);
border: 1rpx solid rgba(255, 255, 255, 0.4);
background-size: cover;
}
.balance-wrap {
text-align: center;
margin-bottom: 20rpx;
}
.balance-label {
font-size: 28rpx;
color: #0f172a;
letter-spacing: 1px;
display: block;
margin-bottom: 10rpx;
font-weight: 700;
text-shadow: 0 1rpx 2rpx rgba(255,255,255,0.8);
}
.balance-value {
font-size: 68rpx;
font-weight: 800;
color: #0f172a;
font-family: 'DIN', monospace;
letter-spacing: -1rpx;
text-shadow: 0 1rpx 2rpx rgba(255,255,255,0.6);
}
.inner-divider {
width: 60%;
height: 2rpx;
background: linear-gradient(90deg, transparent, #64748b, #64748b, transparent);
margin: 0 auto 20rpx auto;
border-radius: 2rpx;
opacity: 0.9;
}
.assets-hint {
display: block;
text-align: center;
font-size: 24rpx;
color: #334155;
margin-bottom: 14rpx;
font-weight: 600;
}
.assets-scroll {
width: 100%;
white-space: nowrap;
}
.assets-track {
display: inline-flex;
gap: 16rpx;
}
.asset-tile {
width: 170rpx;
background: rgba(255, 255, 255, 0.75);
backdrop-filter: blur(8rpx);
border-radius: 28rpx;
padding: 18rpx 12rpx;
display: inline-flex;
flex-direction: column;
align-items: center;
text-align: center;
border: 1rpx solid rgba(255,255,255,0.5);
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.02);
transition: all 0.2s;
white-space: normal;
background-size: cover;
background-position: center;
}
.asset-tile:active {
background: rgba(255, 255, 255, 0.9);
transform: scale(0.98);
}
.asset-name {
font-size: 24rpx;
font-weight: 700;
color: #1e293b;
margin-bottom: 10rpx;
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.5);
}
.asset-balance {
font-size: 28rpx;
font-weight: 800;
color: #2d6a4f;
font-family: monospace;
margin-bottom: 6rpx;
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.3);
}
.asset-fee {
font-size: 20rpx;
font-weight: 600;
color: #475569;
text-shadow: 0 1rpx 1rpx rgba(255,255,255,0.3);
}
.assets-empty {
width: 400rpx;
text-align: center;
color: #a0abb9;
padding: 40rpx 0;
}
.divider-line {
height: 2rpx;
background: linear-gradient(90deg, transparent, #cbd5e1, #cbd5e1, transparent);
margin: 16rpx 0 20rpx;
width: 80%;
margin-left: auto;
margin-right: auto;
}
.history-section {
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
margin-top: 0;
}
.history-header {
display: flex;
justify-content: space-between;
align-items: baseline;
padding: 0 8rpx 20rpx;
flex-shrink: 0;
}
.history-title {
font-size: 34rpx;
font-weight: 600;
color: #1e293b;
}
.history-scroll {
flex: 1;
width: 100%;
padding: 0 20rpx;
box-sizing: border-box;
}
.history-item {
display: flex;
align-items: center;
padding: 28rpx 0;
border-bottom: 1rpx solid rgba(0,0,0,0.05);
}
.history-info { width: 160rpx; }
.history-amount {
font-size: 36rpx;
font-weight: 700;
color: #1e293b;
display: block;
}
.history-time {
font-size: 22rpx;
color: #94a3b8;
}
.history-detail {
flex: 1;
padding: 0 20rpx;
}
.history-method {
font-size: 30rpx;
color: #334155;
display: block;
margin-bottom: 6rpx;
}
.history-type {
font-size: 24rpx;
color: #94a3b8;
}
.history-status { text-align: right; }
.status-badge {
font-size: 26rpx;
font-weight: 500;
padding: 6rpx 14rpx;
border-radius: 30rpx;
display: inline-block;
}
.status-wait {
color: #f59e0b;
background: rgba(245,158,11,0.1);
}
.status-done {
color: #10b981;
background: rgba(16,185,129,0.1);
}
.status-fail {
color: #ef4444;
background: rgba(239,68,68,0.1);
}
.status-pending {
color: #3b82f6;
background: rgba(59,130,246,0.1);
}
.fail-link {
margin-left: 8rpx;
text-decoration: underline;
}
.collect-tappable {
display: inline-flex;
flex-direction: column;
align-items: center;
gap: 4rpx;
padding: 10rpx 18rpx;
cursor: pointer;
border: 2rpx solid rgba(59,130,246,0.35);
box-shadow: 0 4rpx 12rpx rgba(59,130,246,0.15);
}
.collect-tappable:active {
transform: scale(0.97);
opacity: 0.9;
}
.collect-sub {
font-size: 22rpx;
font-weight: 700;
color: #1d4ed8;
text-decoration: underline;
}
.load-tip, .more-tip {
text-align: center;
padding: 30rpx;
font-size: 24rpx;
color: #94a3b8;
}
.load-more-btn {
margin: 16rpx 0 20rpx;
padding: 20rpx;
text-align: center;
background: rgba(255,255,255,0.7);
backdrop-filter: blur(8rpx);
border-radius: 40rpx;
font-size: 28rpx;
color: #3b82f6;
border: 1rpx solid rgba(255,255,255,0.5);
}
.load-more-btn:active { background: rgba(255,255,255,0.9); }
.history-section--full {
flex: 1;
min-height: calc(100vh - 48rpx);
margin-top: 24rpx;
}
.history-section--full .history-scroll {
height: calc(100vh - 280rpx);
}
/* 自动打款专属(少量追加) */
.pending-tip {
margin: 0 8rpx 16rpx;
padding: 16rpx 20rpx;
font-size: 24rpx;
color: #1d4ed8;
background: rgba(59,130,246,0.08);
border-radius: 20rpx;
line-height: 1.5;
}
.filter-scroll {
width: 100%;
white-space: nowrap;
margin-bottom: 12rpx;
}
.filter-track {
display: inline-flex;
gap: 12rpx;
padding: 0 8rpx;
}
.filter-chip {
flex-shrink: 0;
padding: 10rpx 22rpx;
font-size: 24rpx;
color: #64748b;
background: rgba(255,255,255,0.8);
border-radius: 30rpx;
border: 1rpx solid rgba(0,0,0,0.06);
}
.filter-chip.active {
color: #3b82f6;
background: #eff6ff;
border-color: #3b82f6;
}
.auto-tip {
font-size: 24rpx;
color: #3b82f6;
margin-bottom: 20rpx;
line-height: 1.5;
}
.warn-tip {
font-size: 24rpx;
color: #f59e0b;
margin-top: 16rpx;
font-weight: 600;
}
/* 弹窗(与 mode1 一致) */
.modal-mask {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-dialog {
width: 600rpx;
background: rgba(255,255,255,0.96);
backdrop-filter: blur(20rpx);
border-radius: 48rpx;
overflow: hidden;
box-shadow: 0 20rpx 40rpx rgba(0,0,0,0.1);
border: 1rpx solid rgba(255,255,255,0.6);
}
.modal-header {
padding: 36rpx 32rpx 20rpx;
font-size: 36rpx;
font-weight: 700;
border-bottom: 1rpx solid rgba(0,0,0,0.05);
}
.modal-body {
padding: 32rpx;
font-size: 28rpx;
color: #334155;
line-height: 1.6;
}
.info-row, .amount-row {
display: flex;
justify-content: space-between;
margin-bottom: 24rpx;
font-size: 28rpx;
}
.amount-row input {
border: 1rpx solid rgba(0,0,0,0.1);
border-radius: 28rpx;
padding: 16rpx 20rpx;
width: 260rpx;
background: rgba(255,255,255,0.9);
}
.quick-row {
display: flex;
gap: 16rpx;
margin: 24rpx 0;
}
.quick-chip {
flex: 1;
background: rgba(241,245,249,0.8);
text-align: center;
padding: 12rpx;
border-radius: 40rpx;
font-size: 28rpx;
}
.fee-row {
display: flex;
justify-content: space-between;
background: rgba(248,250,252,0.8);
padding: 20rpx;
border-radius: 28rpx;
margin: 20rpx 0;
}
.modal-footer {
display: flex;
border-top: 1rpx solid rgba(0,0,0,0.05);
}
.modal-btn {
flex: 1;
text-align: center;
padding: 28rpx;
font-size: 30rpx;
}
.modal-btn.cancel {
color: #8f9bb3;
border-right: 1rpx solid rgba(0,0,0,0.05);
}
.modal-btn.confirm { color: #3b82f6; }
+51
View File
@@ -0,0 +1,51 @@
// pages/withdraw/withdraw-records.js — 提现记录独立页
import { createPage, request } from '../../utils/base-page.js';
Page(createPage({
data: {
pageMode: 0,
loadError: false,
},
onLoad() {
this.fetchPageMode();
},
async fetchPageMode() {
try {
const res = await request({
url: '/peizhi/hqtxzsym',
method: 'POST',
});
if (res.statusCode === 200 && res.data && res.data.code === 0) {
const mode = parseInt(res.data.data.mode, 10);
this.setData({
pageMode: (mode === 1 || mode === 2) ? mode : 1,
loadError: false,
});
} else {
this.setData({ pageMode: 1, loadError: false });
}
} catch (err) {
console.error('获取展示模式失败:', err);
this.setData({ loadError: true });
}
},
retryFetch() {
this.setData({ loadError: false, pageMode: 0 });
this.fetchPageMode();
},
onPullDownRefresh() {
const mode = this.data.pageMode;
const compId = mode === 1 ? '#record-mode2' : mode === 2 ? '#record-mode1' : null;
if (!compId) {
wx.stopPullDownRefresh();
return;
}
const comp = this.selectComponent(compId);
const p = comp && comp.onPullDownRefresh ? comp.onPullDownRefresh() : Promise.resolve();
Promise.resolve(p).finally(() => wx.stopPullDownRefresh());
},
}));
+11
View File
@@ -0,0 +1,11 @@
{
"navigationBarTitleText": "提现记录",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"backgroundColor": "#f5f7fb",
"enablePullDownRefresh": true,
"usingComponents": {
"record-mode1": "./components/record-mode1/record-mode1",
"record-mode2": "./components/record-mode2/record-mode2"
}
}
+14
View File
@@ -0,0 +1,14 @@
<view class="records-container">
<view wx:if="{{pageMode === 0 && !loadError}}" class="loading-center">
<view class="loading-spinner"></view>
<text class="loading-text">加载中...</text>
</view>
<view wx:elif="{{loadError}}" class="error-center">
<text class="error-text">加载失败,请检查网络</text>
<view class="retry-btn" bindtap="retryFetch">点击重试</view>
</view>
<record-mode1 wx:elif="{{pageMode === 2}}" id="record-mode1" />
<record-mode2 wx:elif="{{pageMode === 1}}" id="record-mode2" />
</view>
+41
View File
@@ -0,0 +1,41 @@
.records-container {
width: 100%;
min-height: 100vh;
background: #f5f7fb;
}
.loading-center, .error-center {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #64748b;
}
.loading-spinner {
width: 60rpx;
height: 60rpx;
border: 4rpx solid rgba(59, 130, 246, 0.2);
border-top-color: #3b82f6;
border-radius: 50%;
animation: spin 0.8s linear infinite;
margin-bottom: 24rpx;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.loading-text, .error-text {
font-size: 28rpx;
}
.retry-btn {
margin-top: 24rpx;
padding: 16rpx 48rpx;
background: #3b82f6;
color: #fff;
border-radius: 40rpx;
font-size: 28rpx;
}
+13 -13
View File
@@ -1,14 +1,14 @@
{ {
"usingComponents": { "usingComponents": {
"mode1": "./components/mode1/mode1", "mode1": "./components/mode1/mode1",
"mode2": "./components/mode2/mode2" "mode2": "./components/mode2/mode2"
}, },
"navigationBarTitleText": "提现中心", "navigationBarTitleText": "提现",
"navigationBarBackgroundColor": "#ffffff", "navigationBarBackgroundColor": "#FFD54F",
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"backgroundColor": "#f5f7fb", "backgroundColor": "#f5f5f5",
"enablePullDownRefresh": false, "enablePullDownRefresh": false,
"onReachBottomDistance": 50, "onReachBottomDistance": 50,
"navigationStyle": "default", "navigationStyle": "default",
"disableScroll": false "disableScroll": false
} }
+8 -2
View File
@@ -1,13 +1,19 @@
/* pages/withdraw/withdraw.wxss */ /* pages/withdraw/withdraw.wxss */
.tixian-container { .tixian-container {
width: 100%; width: 100%;
min-height: 100vh;
background: #f5f5f5;
} }
/* 加载状态 */ /* 加载状态 */
.loading-center, .error-center { .loading-center, .error-center {
height: 100vh; height: 100vh;
color: #ffffff; display: flex;
background: #1a0b2e; flex-direction: column;
align-items: center;
justify-content: center;
color: #666;
background: #f5f5f5;
} }
.loading-spinner { .loading-spinner {
+27 -2
View File
@@ -34,9 +34,34 @@
}, },
"libVersion": "3.14.3", "libVersion": "3.14.3",
"packOptions": { "packOptions": {
"ignore": [], "ignore": [
{
"value": "_backup_20260705_pre_split",
"type": "folder"
},
{
"value": "_backup_withdraw_20260705",
"type": "folder"
},
{
"value": "_backup_pre_redesign",
"type": "folder"
},
{
"value": "_backup_20260706",
"type": "folder"
},
{
"value": "_backup_ui_20260706",
"type": "folder"
},
{
"value": ".bak",
"type": "suffix"
}
],
"include": [] "include": []
}, },
"appid": "wx0e4be86faac4a8d1", "appid": "wxdefa454152e78a03",
"simulatorPluginLibVersion": {} "simulatorPluginLibVersion": {}
} }
+79 -182
View File
@@ -17,80 +17,47 @@
box-shadow: 0 10rpx 28rpx rgba(0, 0, 0, 0.09); box-shadow: 0 10rpx 28rpx rgba(0, 0, 0, 0.09);
} }
/* 平台订单 - 机甲冷色 */ /* 平台订单 */
.xym-pingtai-order { .xym-pingtai-order {
padding-bottom: 5rpx; padding-bottom: 5rpx;
background: linear-gradient(145deg, rgba(18, 28, 48, 0.98), rgba(8, 18, 35, 0.98)); background: #927a46;
border: 1rpx solid rgba(0, 200, 255, 0.12);
box-shadow: 0 20rpx 40rpx rgba(0, 0, 0, 0.55);
}
.xym-pingtai-order::before {
content: '';
position: absolute;
top: 0;
left: 10%;
width: 80%;
height: 4rpx;
background: linear-gradient(90deg, transparent, #00c8ff, transparent);
border-radius: 2rpx;
opacity: 0.75;
z-index: 2;
} }
.xym-pingtai-head { .xym-pingtai-head {
height: 72rpx; height: 72rpx;
padding: 0 24rpx; padding: 0 24rpx;
background: transparent; background: linear-gradient(50deg, #957c48, #5c4a28);
border-radius: 30rpx 30rpx 0 0; border-radius: 30rpx 30rpx 0 0;
border-bottom: 1rpx dashed rgba(255, 255, 255, 0.08);
} }
.xym-head-time { .xym-head-time {
font-size: 24rpx; font-size: 24rpx;
color: #c0d0ff; color: #fcd270;
text-shadow: 0 0 5px rgba(0, 200, 255, 0.3);
} }
.xym-head-tag { .xym-head-tag {
font-size: 22rpx; font-size: 22rpx;
padding: 4rpx 16rpx; padding: 4rpx 16rpx;
border-radius: 40rpx; border-radius: 8rpx;
font-weight: 600; font-weight: 600;
background: rgba(0, 200, 255, 0.08); background: rgba(252, 210, 112, 0.22);
color: #aac8ff; color: #fcd270;
border: 1rpx solid rgba(0, 200, 255, 0.3); border: 1rpx solid rgba(252, 210, 112, 0.4);
box-shadow: 0 0 10rpx rgba(0, 200, 255, 0.15);
} }
.xym-pingtai-body { .xym-pingtai-body {
border-radius: 0 0 30rpx 30rpx; border-radius: 40rpx 10rpx 30rpx 30rpx;
padding: 0 20rpx 24rpx; padding: 0 20rpx 24rpx;
background: transparent; background: linear-gradient(to bottom, #3a3220, #cec180);
} }
/* 商家订单 - 机甲暖色 */ /* 商家订单 */
.xym-shangjia-order { .xym-shangjia-order {
padding-bottom: 5rpx; padding-bottom: 5rpx;
background: linear-gradient(145deg, rgba(38, 18, 48, 0.98), rgba(25, 8, 35, 0.98)); background: linear-gradient(to bottom, #fff8e1, #ffe0b2);
border: 1rpx solid rgba(255, 77, 109, 0.12);
box-shadow: 0 20rpx 40rpx rgba(0, 0, 0, 0.55);
overflow: hidden; overflow: hidden;
} }
.xym-shangjia-order::before {
content: '';
position: absolute;
top: 0;
left: 10%;
width: 80%;
height: 4rpx;
background: linear-gradient(90deg, transparent, #ff4d6d, transparent);
border-radius: 2rpx;
opacity: 0.75;
z-index: 2;
}
.xym-shangjia-body { .xym-shangjia-body {
border-radius: 10rpx 10rpx 30rpx 30rpx; border-radius: 10rpx 10rpx 30rpx 30rpx;
padding: 0 20rpx 24rpx; padding: 0 20rpx 24rpx;
@@ -101,13 +68,13 @@
} }
.xym-shangjia-head .xym-head-time { .xym-shangjia-head .xym-head-time {
color: #ffc0d0; color: #888;
} }
.xym-shangjia-head .xym-head-tag { .xym-shangjia-head .xym-head-tag {
background: rgba(255, 77, 109, 0.12); background: rgba(255, 255, 255, 0.65);
color: #ffb3c6; color: #492f00;
border-color: rgba(255, 77, 109, 0.35); border-color: rgba(255, 208, 97, 0.5);
} }
.order-con { .order-con {
@@ -126,23 +93,7 @@
border-radius: 12rpx; border-radius: 12rpx;
margin-right: 14rpx; margin-right: 14rpx;
flex-shrink: 0; flex-shrink: 0;
background: rgba(255, 255, 255, 0.06); background: #eee;
}
.xym-pingtai-body .o-logo {
border: 2rpx solid rgba(0, 200, 255, 0.45);
box-shadow: 0 6rpx 18rpx rgba(0, 200, 255, 0.2);
}
.xym-shangjia-body .o-logo,
.gold-card .o-logo {
border: 2rpx solid rgba(255, 77, 109, 0.35);
box-shadow: 0 6rpx 18rpx rgba(255, 77, 109, 0.15);
}
.gold-card .o-logo {
border-color: rgba(255, 215, 0, 0.45);
box-shadow: 0 6rpx 18rpx rgba(255, 215, 0, 0.2);
} }
.o-col { .o-col {
@@ -156,11 +107,11 @@
font-weight: 700; font-weight: 700;
font-size: 30rpx; font-size: 30rpx;
line-height: 1.5; line-height: 1.5;
color: #ffb3c6; color: #333;
} }
.o-goods.light { .o-goods.light {
color: #b0c8f0; color: #fff;
} }
.line2 { .line2 {
@@ -189,7 +140,7 @@
.m-name-sm { .m-name-sm {
font-size: 26rpx; font-size: 26rpx;
font-weight: 600; font-weight: 600;
color: #ffb3c6; color: #333;
} }
.zhiding-strip { .zhiding-strip {
@@ -262,6 +213,7 @@
margin-top: 8rpx; margin-top: 8rpx;
} }
/* 金牌卡底部商家条 */
.gold-card .merchant-strip { .gold-card .merchant-strip {
margin: 16rpx 6rpx 0; margin: 16rpx 6rpx 0;
padding: 16rpx 20rpx; padding: 16rpx 20rpx;
@@ -344,7 +296,7 @@
} }
.xym-pingtai-body .zhiding-strip .zhiding-name { .xym-pingtai-body .zhiding-strip .zhiding-name {
color: #ffc0d0; color: #f5e6b8;
} }
.reward-badge { .reward-badge {
@@ -357,21 +309,17 @@
display: flex; display: flex;
align-items: baseline; align-items: baseline;
z-index: 3; z-index: 3;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.25); box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
} }
.reward-badge.normal-reward { .reward-badge.normal-reward {
color: #ffd700; color: #492f00;
background: rgba(0, 0, 0, 0.35); background: linear-gradient(to bottom, #fae04d, #ffc0a3);
border: 1rpx solid rgba(255, 215, 0, 0.35);
text-shadow: 0 0 12px rgba(255, 215, 0, 0.45);
} }
.reward-badge.platform-reward { .reward-badge.platform-reward {
color: #fff; color: #fff;
background: linear-gradient(145deg, rgba(0, 200, 255, 0.25), rgba(0, 120, 200, 0.15)); background: linear-gradient(to right, #dabd83, #704029);
border: 1rpx solid rgba(0, 200, 255, 0.35);
box-shadow: 0 0 16rpx rgba(0, 200, 255, 0.2);
} }
.xym-shangjia-body .reward-badge:not(.member-tip) { .xym-shangjia-body .reward-badge:not(.member-tip) {
@@ -379,20 +327,13 @@
} }
.reward-badge.member-tip { .reward-badge.member-tip {
background: rgba(255, 77, 109, 0.15); background: rgba(255, 255, 255, 0.85);
border: 1rpx solid rgba(255, 77, 109, 0.35);
padding: 8rpx 16rpx; padding: 8rpx 16rpx;
border-radius: 20rpx; border-radius: 20rpx;
top: 16rpx; top: 16rpx;
right: 10rpx; right: 10rpx;
} }
.reward-tip {
font-size: 22rpx;
color: #ff9aab;
font-weight: 600;
}
.reward-yen { .reward-yen {
font-size: 28rpx; font-size: 28rpx;
} }
@@ -403,7 +344,13 @@
} }
.reward-num.dark { .reward-num.dark {
color: #ffd700; color: #c00;
}
.reward-tip {
font-size: 22rpx;
color: #c0392b;
font-weight: 600;
} }
.reward-yen.sm { .reward-yen.sm {
@@ -420,15 +367,15 @@
} }
.remark-block.gold { .remark-block.gold {
color: #b0c8f0; color: #fff;
border-color: rgba(0, 200, 255, 0.45); border-color: #ffd700;
background: rgba(255, 255, 255, 0.03); background: rgba(255, 215, 0, 0.12);
} }
.remark-block.dark { .remark-block.dark {
color: #e0c8ff; color: #666;
border-color: rgba(255, 77, 109, 0.45); border-color: #87ceeb;
background: rgba(255, 255, 255, 0.03); background: rgba(135, 206, 235, 0.12);
} }
.remark-label { .remark-label {
@@ -436,11 +383,11 @@
} }
.remark-block.gold .remark-label { .remark-block.gold .remark-label {
color: #80d0ff; color: #ffd700;
} }
.remark-block.dark .remark-label { .remark-block.dark .remark-label {
color: #ff9aab; color: #87ceeb;
} }
.xuqiu-tags-row { .xuqiu-tags-row {
@@ -450,20 +397,16 @@
} }
.xym-shangjia-body .xuqiu-tags-row { .xym-shangjia-body .xuqiu-tags-row {
border-top-color: rgba(255, 255, 255, 0.08); border-top-color: rgba(0, 0, 0, 0.08);
} }
.xuqiu-tags-row .xuqiu-label { .xuqiu-tags-row .xuqiu-label {
font-size: 22rpx; font-size: 22rpx;
color: #80d0ff; color: #87ceeb;
margin-bottom: 8rpx; margin-bottom: 8rpx;
display: block; display: block;
} }
.xym-shangjia-body .xuqiu-tags-row .xuqiu-label {
color: #ff9aab;
}
.o-foot { .o-foot {
margin-top: 18rpx; margin-top: 18rpx;
padding: 0 10rpx 8rpx; padding: 0 10rpx 8rpx;
@@ -475,62 +418,35 @@
} }
.o-amt.light { .o-amt.light {
color: #aac8ff; color: #f5e6b8;
} }
.btn-bg { .btn-bg {
background: linear-gradient(145deg, #1a2a48, #0e1a30); background: linear-gradient(180deg, #fae04d, #ffc0a3);
border-radius: 0; border-radius: 60rpx;
color: #fff; color: #492f00;
border: 1rpx solid rgba(255, 255, 255, 0.1);
box-shadow:
0 8rpx 0 #0a1525,
0 12rpx 28rpx rgba(0, 0, 0, 0.55),
inset 0 2rpx 6rpx rgba(0, 200, 255, 0.35);
} }
.qiangdan { .qiangdan {
color: #fff; color: #492f00;
width: 180rpx; width: 180rpx;
min-width: 100rpx; min-width: 100rpx;
padding: 15rpx 10rpx; padding: 15rpx 10rpx;
border: 2rpx solid #fff;
box-sizing: border-box; box-sizing: border-box;
font-size: 26rpx; font-size: 26rpx;
font-weight: 700; font-weight: 700;
flex-shrink: 0; flex-shrink: 0;
clip-path: polygon(10% 0%, 90% 0%, 100% 25%, 100% 75%, 90% 100%, 10% 100%, 0% 75%, 0% 25%);
}
.xym-shangjia-order .qiangdan.btn-bg,
.xym-shangjia-order .qiangdan {
background: linear-gradient(145deg, #3a2048, #251030);
box-shadow:
0 8rpx 0 #2a0a1a,
0 12rpx 28rpx rgba(0, 0, 0, 0.55),
inset 0 2rpx 6rpx rgba(255, 77, 109, 0.35);
}
.gold-card .qiangdan.btn-bg,
.gold-card .qiangdan {
background: linear-gradient(145deg, #3a3018, #251a08);
box-shadow:
0 8rpx 0 #1a1208,
0 12rpx 28rpx rgba(0, 0, 0, 0.55),
inset 0 2rpx 6rpx rgba(255, 215, 0, 0.35);
} }
.qiangdan.btn-qiang-brown { .qiangdan.btn-qiang-brown {
background: linear-gradient(145deg, #1a2a48, #0e1a30) !important; background: linear-gradient(to right, #7a4a2d 0%, #e4ce94 100%) !important;
color: #fff !important; color: #000 !important;
box-shadow:
0 8rpx 0 #0a1525,
0 12rpx 28rpx rgba(0, 0, 0, 0.55),
inset 0 2rpx 6rpx rgba(0, 200, 255, 0.35) !important;
} }
.view-more-inline { .view-more-inline {
font-size: 22rpx; font-size: 22rpx;
color: #00c8ff; color: #87ceeb;
margin-left: 4rpx; margin-left: 4rpx;
} }
@@ -547,41 +463,26 @@
padding-right: 12rpx; padding-right: 12rpx;
} }
/* 优质商家 - 机甲金牌 */ /* 优质商家金牌卡片 — 与逍遥梦 ui-preview 一致 */
.xym-order-item.gold-card { .xym-order-item.gold-card {
margin-bottom: 20rpx; margin-bottom: 20rpx;
border-radius: 30rpx; border-radius: 30rpx;
box-shadow: 0 20rpx 40rpx rgba(0, 0, 0, 0.55), 0 0 24rpx rgba(255, 215, 0, 0.08); box-shadow: 0 12rpx 32rpx rgba(248, 211, 44, 0.28);
overflow: hidden; overflow: hidden;
border: 1rpx solid rgba(255, 215, 0, 0.2);
} }
.gold-card { .gold-card {
padding-bottom: 5rpx; padding-bottom: 5rpx;
position: relative; position: relative;
background: linear-gradient(145deg, rgba(28, 22, 12, 0.98), rgba(18, 12, 6, 0.98)); background: linear-gradient(to bottom, #ffecc5, #fffbf3);
}
.gold-card::before {
content: '';
position: absolute;
top: 0;
left: 10%;
width: 80%;
height: 4rpx;
background: linear-gradient(90deg, transparent, #ffd700, transparent);
border-radius: 2rpx;
opacity: 0.85;
z-index: 2;
} }
.gold-head { .gold-head {
height: 77rpx; height: 77rpx;
display: flex; display: flex;
align-items: center; align-items: center;
background: linear-gradient(145deg, rgba(58, 48, 24, 0.95), rgba(38, 28, 12, 0.95)); background: linear-gradient(127deg, #F8D32C 0%, #FFB26A 35%, #FFEE58 70%, #F8D32C 100%);
border-radius: 32rpx 32rpx 0 0; border-radius: 32rpx 32rpx 0 0;
border-bottom: 1rpx dashed rgba(255, 215, 0, 0.15);
} }
.kehuduan-banner-wrap, .kehuduan-banner-wrap,
@@ -611,21 +512,19 @@
.tag-pill.tag-youzhi, .tag-pill.tag-youzhi,
.tag-youzhi { .tag-youzhi {
background: linear-gradient(145deg, rgba(255, 215, 0, 0.25), rgba(255, 140, 0, 0.15)); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #ffd700; color: #492c00;
font-size: 24rpx; font-size: 24rpx;
padding: 4rpx 18rpx; padding: 4rpx 18rpx;
border-radius: 10rpx; border-radius: 10rpx;
margin-right: 10rpx; margin-right: 10rpx;
font-weight: 600; font-weight: 600;
border: 1rpx solid rgba(255, 215, 0, 0.35);
text-shadow: 0 0 8px rgba(255, 215, 0, 0.35);
} }
.gold-body-wrap { .gold-body-wrap {
border-radius: 0 0 30rpx 30rpx; border-radius: 10rpx 10rpx 30rpx 30rpx;
padding: 0 20rpx 20rpx; padding: 0 20rpx 20rpx;
background: linear-gradient(to bottom, rgba(20, 16, 10, 0.98) 0%, rgba(42, 34, 22, 0.95) 55%, rgba(58, 46, 28, 0.92) 100%); background: linear-gradient(to bottom, #1f1a14 0%, #342b22 38%, #4a3d30 68%, #6b5638 100%);
} }
.gold-inner { .gold-inner {
@@ -774,31 +673,29 @@
padding: 0 10rpx 6rpx; padding: 0 10rpx 6rpx;
} }
.merchant-plain { /* 公告条 */
.xym-gonggao-bar {
display: flex; display: flex;
align-items: center; align-items: center;
background: #fdf9db;
margin: 0 24rpx 0;
border-radius: 10rpx;
padding: 10rpx 16rpx;
} }
.merchant-user { .xym-gonggao-ico {
display: flex; width: 40rpx;
align-items: center; height: 40rpx;
flex-shrink: 0;
margin-right: 12rpx;
} }
.m-info { .xym-gonggao-txt {
flex: 1;
min-width: 0;
}
.dark-t {
color: #e8c547;
}
.o-amt-grey {
font-size: 24rpx; font-size: 24rpx;
color: rgba(255, 255, 255, 0.65); color: #666;
} line-height: 1.5;
flex: 1;
.kehuduan-foot { overflow: hidden;
display: flex; text-overflow: ellipsis;
align-items: center; white-space: nowrap;
} }
+119
View File
@@ -0,0 +1,119 @@
/* 打手订单 Tab - 逍遥梦 order 页布局增强 */
@import './xym-layout.wxss';
.ds-page.xym-order-page {
background: #f5f5f5;
min-height: 100vh;
display: flex;
flex-direction: column;
}
.xym-order-page .xym-order-header {
position: relative;
flex-shrink: 0;
padding-bottom: 8rpx;
}
.xym-order-page .xym-order-bg {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 200rpx;
z-index: 0;
}
.xym-order-page .xym-order-title-bar {
position: relative;
z-index: 2;
text-align: center;
padding: 16rpx 0 8rpx;
}
.xym-order-page .xym-order-title {
font-size: 34rpx;
font-weight: 700;
color: #343434;
}
.xym-order-page .main-container {
flex: 1;
min-height: 0;
}
.xym-order-page .order-card-xym {
margin: 0 0 16rpx;
padding: 20rpx;
border-radius: 16rpx;
background: #fff;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
display: flex;
align-items: flex-start;
}
.xym-order-page .card-hd-xym {
width: 100%;
display: flex;
justify-content: space-between;
margin-bottom: 12rpx;
}
.xym-order-page .card-time-xym {
font-size: 22rpx;
color: #999;
}
.xym-order-page .card-status-xym {
font-size: 24rpx;
font-weight: 600;
}
.xym-order-page .card-bd-xym {
display: flex;
width: 100%;
}
.xym-order-page .goods-img-xym {
width: 120rpx;
height: 120rpx;
border-radius: 12rpx;
flex-shrink: 0;
background: #f0f0f0;
}
.xym-order-page .goods-info-xym {
flex: 1;
margin-left: 16rpx;
min-width: 0;
}
.xym-order-page .goods-name-xym {
font-size: 28rpx;
font-weight: 600;
color: #222;
line-height: 1.4;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.xym-order-page .goods-sub-xym {
font-size: 24rpx;
color: #666;
margin-top: 8rpx;
}
.xym-order-page .goods-price-xym {
font-size: 30rpx;
font-weight: 700;
color: #492f00;
margin-top: 8rpx;
}
.xym-order-page .load-tip-xym {
text-align: center;
color: #999;
font-size: 24rpx;
padding: 20rpx 0 40rpx;
}
+8 -8
View File
@@ -13,8 +13,8 @@
} }
.leixing-item.leixing-active { .leixing-item.leixing-active {
background: linear-gradient(180deg, #ede9fe, #c4b5fd) !important; background: linear-gradient(180deg, #fff0c2, #f5d563) !important;
box-shadow: 0 4rpx 12rpx rgba(147, 51, 234, 0.35) !important; box-shadow: 0 4rpx 12rpx rgba(255, 208, 97, 0.35) !important;
} }
.leixing-active .leixing-name { .leixing-active .leixing-name {
@@ -32,14 +32,14 @@
} }
.type-btn.type-active { .type-btn.type-active {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
color: #492f00 !important; color: #492f00 !important;
box-shadow: 0 2rpx 8rpx rgba(180, 130, 20, 0.2) !important; box-shadow: 0 2rpx 8rpx rgba(180, 130, 20, 0.2) !important;
} }
.search-box { .search-box {
background: #fff !important; background: #fff !important;
border: 1rpx solid rgba(147, 51, 234, 0.3) !important; border: 1rpx solid rgba(255, 208, 97, 0.3) !important;
} }
.left-status { .left-status {
@@ -48,7 +48,7 @@
} }
.status-item.status-active { .status-item.status-active {
background: #f5f3ff !important; background: #fff8e1 !important;
} }
.status-active .status-name { .status-active .status-name {
@@ -56,7 +56,7 @@
} }
.status-dot { .status-dot {
background: #9333ea !important; background: #ffd061 !important;
} }
.right-list { .right-list {
@@ -74,11 +74,11 @@
.loading-spinner, .loading-spinner,
.mini-spinner { .mini-spinner {
border-top-color: #9333ea !important; border-top-color: #ffd061 !important;
} }
.load-more-btn { .load-more-btn {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
color: #492f00 !important; color: #492f00 !important;
border: 2rpx solid #fff !important; border: 2rpx solid #fff !important;
} }
+6 -6
View File
@@ -24,13 +24,13 @@ page {
.role-chip { .role-chip {
background: rgba(255, 255, 255, 0.8) !important; background: rgba(255, 255, 255, 0.8) !important;
color: #666 !important; color: #666 !important;
border: 2rpx solid rgba(147, 51, 234, 0.25) !important; border: 2rpx solid rgba(255, 208, 97, 0.25) !important;
} }
.role-chip.on { .role-chip.on {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
color: #492f00 !important; color: #492f00 !important;
border-color: #9333ea !important; border-color: #ffd061 !important;
font-weight: 700 !important; font-weight: 700 !important;
} }
@@ -40,7 +40,7 @@ page {
} }
.date-chip.on { .date-chip.on {
background: #ede9fe !important; background: #fef6d4 !important;
color: #492f00 !important; color: #492f00 !important;
font-weight: 700 !important; font-weight: 700 !important;
} }
@@ -76,7 +76,7 @@ page {
} }
.my-rank-bar { .my-rank-bar {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
} }
.my-rank-bar text { .my-rank-bar text {
@@ -88,5 +88,5 @@ page {
} }
.loader { .loader {
border-top-color: #9333ea !important; border-top-color: #ffd061 !important;
} }
+16 -16
View File
@@ -1,7 +1,7 @@
/* 打手充值页 - 逍遥梦风格视觉覆盖(不改 wxml/逻辑) */ /* 打手充值页 - 逍遥梦风格视觉覆盖(不改 wxml/逻辑) */
.page-container { .page-container {
background: linear-gradient(180deg, #c4b5fd 0%, #fff 22%, #f5f3ff 100%) !important; background: linear-gradient(180deg, #f7dc51 0%, #fff 22%, #fff8e1 100%) !important;
} }
.page-container::before { .page-container::before {
@@ -19,18 +19,18 @@
.dec-line, .dec-line,
.dec-diamond { .dec-diamond {
background: #9333ea !important; background: #ffd061 !important;
} }
.vip-card { .vip-card {
background: #fdfcfa !important; background: #fdfcfa !important;
border: 2rpx solid rgba(147, 51, 234, 0.5) !important; border: 2rpx solid rgba(255, 208, 97, 0.5) !important;
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.08) !important; box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.08) !important;
} }
.vip-card.active { .vip-card.active {
border-color: #9333ea !important; border-color: #ffd061 !important;
box-shadow: 0 8rpx 28rpx rgba(147, 51, 234, 0.35) !important; box-shadow: 0 8rpx 28rpx rgba(255, 208, 97, 0.35) !important;
} }
.card-frame, .card-frame,
@@ -69,7 +69,7 @@
.tech-buy-btn, .tech-buy-btn,
.tech-btn, .tech-btn,
.modal-btn.confirm-btn { .modal-btn.confirm-btn {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
border: 2rpx solid #fff !important; border: 2rpx solid #fff !important;
border-radius: 44rpx !important; border-radius: 44rpx !important;
box-shadow: 0 4rpx 12rpx rgba(180, 130, 20, 0.25) !important; box-shadow: 0 4rpx 12rpx rgba(180, 130, 20, 0.25) !important;
@@ -122,8 +122,8 @@
.huiyuan-tag, .huiyuan-tag,
.tech-tag { .tech-tag {
background: #ede9fe !important; background: #fef6d4 !important;
border: 1rpx solid rgba(147, 51, 234, 0.4) !important; border: 1rpx solid rgba(255, 208, 97, 0.4) !important;
} }
.tag-name { .tag-name {
@@ -135,7 +135,7 @@
} }
.tech-line { .tech-line {
background: linear-gradient(90deg, transparent, #9333ea, transparent) !important; background: linear-gradient(90deg, transparent, #ffd061, transparent) !important;
} }
.tech-modal .modal-container { .tech-modal .modal-container {
@@ -168,13 +168,13 @@
} }
.quick-btn { .quick-btn {
background: #ede9fe !important; background: #fef6d4 !important;
border: 2rpx solid rgba(147, 51, 234, 0.4) !important; border: 2rpx solid rgba(255, 208, 97, 0.4) !important;
} }
.quick-btn.active { .quick-btn.active {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
border-color: #9333ea !important; border-color: #ffd061 !important;
} }
.quick-text { .quick-text {
@@ -182,7 +182,7 @@
} }
.pay-method-item { .pay-method-item {
background: #ede9fe !important; background: #fef6d4 !important;
border-radius: 16rpx !important; border-radius: 16rpx !important;
} }
@@ -204,8 +204,8 @@
} }
.spinner-ring { .spinner-ring {
border-color: rgba(147, 51, 234, 0.3) !important; border-color: rgba(255, 208, 97, 0.3) !important;
border-top-color: #9333ea !important; border-top-color: #ffd061 !important;
} }
.tech-footer .footer-text { .tech-footer .footer-text {
+295 -48
View File
@@ -1,13 +1,13 @@
/* 打手端抢单页 - 机甲风格辅助样式(不改 wxml / 逻辑) */ /* 打手端抢单页 - 逍遥梦风格视觉覆盖(不改 wxml 结构/class) */
.xym-lunbo-container { .xym-lunbo-container {
margin: 8rpx 24rpx 10rpx; margin: 8rpx 24rpx 10rpx;
border-radius: 20rpx; border-radius: 20rpx;
overflow: hidden; overflow: hidden;
flex-shrink: 0; flex-shrink: 0;
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.45); box-shadow: 0 6rpx 18rpx rgba(0, 0, 0, 0.08);
border: 2rpx solid rgba(0, 200, 255, 0.25); border: 2rpx solid rgba(255, 255, 255, 0.7);
background: rgba(18, 22, 38, 0.85); background: #fff;
} }
.xym-section-gap { .xym-section-gap {
@@ -15,34 +15,6 @@
flex-shrink: 0; flex-shrink: 0;
} }
.xym-gonggao-bar {
display: flex;
align-items: center;
background: rgba(18, 22, 38, 0.88);
margin: 0 24rpx 8rpx;
border-radius: 12rpx;
padding: 10rpx 16rpx;
border: 1rpx solid rgba(0, 200, 255, 0.22);
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.35);
}
.xym-gonggao-ico {
width: 40rpx;
height: 40rpx;
flex-shrink: 0;
margin-right: 12rpx;
}
.xym-gonggao-txt {
font-size: 24rpx;
color: #b0c8f0;
line-height: 1.5;
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.xym-lunbo-swiper { .xym-lunbo-swiper {
height: 300rpx; height: 300rpx;
border-radius: 20rpx; border-radius: 20rpx;
@@ -54,56 +26,331 @@
border-radius: 20rpx; border-radius: 20rpx;
} }
.qiangdan-page {
background: linear-gradient(180deg, #f7dc51 0%, #fff 28%, #fff8e1 100%) !important;
}
.qiangdan-page::before {
display: none !important;
}
.leixing-quyu {
background: #fff !important;
border-bottom: none !important;
box-shadow: 0 4rpx 14rpx rgba(0, 0, 0, 0.06) !important;
margin: 6rpx 20rpx 8rpx !important;
border-radius: 28rpx !important;
padding: 14rpx 0 8rpx !important;
border: 2rpx solid rgba(255, 224, 130, 0.5) !important;
}
.leixing-scroll {
height: 132rpx !important;
}
.leixing-item {
width: 120rpx !important;
}
.leixing-tupian {
width: 88rpx !important;
height: 88rpx !important;
border-radius: 20rpx !important;
border: none !important;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08) !important;
}
.leixing-active .leixing-tupian {
border: 3rpx solid #ffd061 !important;
box-shadow: 0 6rpx 16rpx rgba(255, 208, 97, 0.45) !important;
}
.leixing-jieshao {
margin-top: 8rpx !important;
font-size: 22rpx !important;
color: #666 !important;
text-shadow: none !important;
}
.leixing-active .leixing-jieshao {
color: #492f00 !important;
font-weight: 700 !important;
}
.guangyun-effect {
background: radial-gradient(circle, rgba(255, 208, 97, 0.35) 0%, transparent 70%) !important;
}
.biaoqian-quyu {
background: transparent !important;
padding: 8rpx 20rpx 0 !important;
}
.biaoqian-item {
background: rgba(255, 255, 255, 0.65) !important;
border: 2rpx solid rgba(201, 162, 39, 0.25) !important;
}
.biaoqian-active {
background: linear-gradient(180deg, #fff0c2, #f5d563) !important;
border-color: rgba(180, 130, 20, 0.85) !important;
}
.fenge-xian {
background: linear-gradient(90deg, transparent, #ffd061, transparent) !important;
opacity: 0.6 !important;
margin: 6rpx 30rpx 0 !important;
}
.dingdan-list {
padding: 16rpx 20rpx 0 !important;
margin-top: 8rpx !important;
}
.refreshing-text, .refreshing-text,
.pull-down-text { .pull-down-text {
color: #6a9cff !important; color: #6b5420 !important;
text-shadow: 0 0 8px rgba(0, 200, 255, 0.35) !important; text-shadow: none !important;
} }
.tip-text { .tip-text {
color: #8a9ac0 !important; color: #999 !important;
} }
.tip-icon { .tip-icon {
filter: drop-shadow(0 0 16px rgba(0, 200, 255, 0.25)) !important; filter: none !important;
opacity: 0.65 !important; }
.dingdan-card {
border-radius: 28rpx !important;
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.08) !important;
border: none !important;
backdrop-filter: none !important;
}
.pingtai-card {
background: linear-gradient(to bottom, #927a46, #cec180) !important;
padding: 0 0 16rpx !important;
}
.pingtai-card::before,
.shangjia-card::before {
display: none !important;
}
.pingtai-card .card-top,
.shangjia-card .card-top {
background: linear-gradient(50deg, #957c48, #5c4a28) !important;
border-radius: 28rpx 28rpx 0 0 !important;
margin: -28rpx -24rpx 16rpx !important;
padding: 16rpx 24rpx !important;
}
.pingtai-tag,
.creat-time {
color: #fcd270 !important;
}
.shangjia-card {
background: linear-gradient(to bottom, #fff8e1, #ffe0b2) !important;
}
.card-content,
.jieshao-box,
.beizhu-box,
.shangjia-jieshao,
.shangjia-beizhu {
background: rgba(255, 255, 255, 0.55) !important;
border-radius: 12rpx !important;
}
.jieshao-label,
.beizhu-label,
.xuqiu-label {
color: #87ceeb !important;
}
.jieshao-text,
.beizhu-text {
color: #333 !important;
}
.fenyong-box {
background: linear-gradient(to bottom, #fae04d, #ffc0a3) !important;
border-radius: 30rpx !important;
}
.fenyong-text,
.fenyong-price,
.fenyong-unit {
color: #492f00 !important;
}
.qiangdan-btn,
.mecha-btn {
background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
border: 2rpx solid #fff !important;
box-shadow: 0 4rpx 12rpx rgba(180, 130, 20, 0.25) !important;
}
.qiangdan-btn .btn-text,
.mecha-btn .btn-text {
color: #492f00 !important;
}
.btn-shine,
.btn-glow,
.mecha-overlay {
display: none !important;
} }
.loading-mask { .loading-mask {
background: rgba(5, 8, 18, 0.92) !important; background: rgba(255, 248, 225, 0.85) !important;
} }
.loading-mask-text, .loading-mask-text,
.loading-text, .loading-text,
.no-more-text { .no-more-text {
color: #6a9cff !important; color: #999 !important;
} }
.unauthorized-container { .unauthorized-container {
background: radial-gradient(ellipse at top, #1a1f30, #0b0f1a) !important; background: linear-gradient(180deg, #f7dc51, #fff 50%) !important;
} }
.unauthorized-card { .unauthorized-card {
background: rgba(18, 28, 48, 0.95) !important; background: #fdfcfa !important;
border: 1rpx solid rgba(0, 200, 255, 0.2) !important; border: none !important;
box-shadow: 0 12rpx 40rpx rgba(0, 0, 0, 0.55) !important; box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.08) !important;
} }
.unauthorized-card .title { .unauthorized-card .title {
color: #c0d0ff !important; color: #343434 !important;
} }
.unauthorized-card .message, .unauthorized-card .message,
.unauthorized-card .description { .unauthorized-card .description {
color: #8a9ac0 !important; color: #666 !important;
} }
.btn-register { .btn-register {
background: linear-gradient(145deg, #1a2a48, #0e1a30) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
border: 1rpx solid rgba(0, 200, 255, 0.35) !important;
border-radius: 44rpx !important; border-radius: 44rpx !important;
} }
.btn-register .btn-text { .btn-register .btn-text {
color: #fff !important; color: #492f00 !important;
}
.card-glow {
display: none !important;
}
.order-type-tag {
font-size: 22rpx;
padding: 6rpx 16rpx;
border-radius: 8rpx;
font-weight: 600;
line-height: 1.4;
}
.tag-platform {
background: rgba(252, 210, 112, 0.22);
color: #fcd270;
border: 1rpx solid rgba(252, 210, 112, 0.45);
}
.tag-merchant {
background: rgba(255, 255, 255, 0.45);
color: #492f00;
border: 1rpx solid rgba(255, 208, 97, 0.55);
}
.fenyong-mark {
width: 36rpx;
height: 36rpx;
line-height: 36rpx;
text-align: center;
font-size: 22rpx;
font-weight: 700;
color: #492f00;
background: rgba(255, 255, 255, 0.72);
border-radius: 50%;
margin-right: 8rpx;
flex-shrink: 0;
}
.fenyong-icon {
display: none !important;
}
.qiangdan-btn {
min-width: 180rpx !important;
height: 68rpx !important;
border-radius: 34rpx !important;
}
.qiangdan-btn .btn-text {
font-size: 28rpx !important;
font-weight: 700 !important;
letter-spacing: 1rpx;
}
/* 手动刷新悬浮钮(抢单池 / 接单页) */
.refresh-float {
position: fixed;
right: 24rpx;
top: calc(env(safe-area-inset-top) + 88rpx);
z-index: 20;
width: 64rpx;
height: 64rpx;
background: rgba(255, 255, 255, 0.92);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 6rpx 16rpx rgba(0, 0, 0, 0.12);
border: 2rpx solid rgba(255, 208, 97, 0.45);
}
.refresh-float:active {
transform: scale(0.96);
}
.refresh-float-ico {
width: 34rpx;
height: 34rpx;
}
.dingdanxiang1.filter-card {
margin: 12rpx 20rpx 8rpx !important;
border-radius: 24rpx !important;
background: rgba(255, 255, 255, 0.95) !important;
box-shadow: 0 6rpx 18rpx rgba(0, 0, 0, 0.06) !important;
border: 2rpx solid rgba(255, 224, 130, 0.45) !important;
}
.xym-gonggao-bar {
margin: 8rpx 20rpx 0;
padding: 12rpx 16rpx;
border-radius: 12rpx;
background: rgba(255, 255, 255, 0.9);
display: flex;
align-items: center;
}
.xym-gonggao-ico {
width: 32rpx;
height: 32rpx;
margin-right: 12rpx;
flex-shrink: 0;
}
.xym-gonggao-txt {
font-size: 24rpx;
color: #492f00;
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
} }
+292
View File
@@ -0,0 +1,292 @@
/* 打手「我的」页 - 逍遥梦 user 页视觉(仅样式) */
@import './xym-layout.wxss';
.shadow {
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);
}
.user-page.xym-user {
background: linear-gradient(180deg, #f7dc51 0%, #fff 28%, #fff8e1 100%);
}
.user-page.xym-user .bg-img {
display: none;
}
.user-page.xym-user .wallet-card {
margin: 0 30rpx;
padding: 20rpx;
border-radius: 26rpx;
background: #fef6d4;
}
.user-page.xym-user .w-label {
color: #666;
font-size: 26rpx;
}
.user-page.xym-user .w-num {
font-size: 44rpx;
font-weight: 700;
color: #222;
margin-top: 10rpx;
}
.user-page.xym-user .w-sub {
color: #666;
font-size: 26rpx;
margin-top: 8rpx;
}
.user-page.xym-user .btn-outline {
padding: 10rpx 24rpx;
font-size: 26rpx;
font-weight: 700;
border: 2rpx solid #fff;
border-radius: 60rpx;
background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #492f00;
white-space: nowrap;
margin-left: 12rpx;
}
.user-page.xym-user .banner-row {
margin: 20rpx 24rpx 0;
align-items: flex-start;
}
.user-page.xym-user .banner-img {
width: 48%;
height: 150rpx;
border-radius: 16rpx;
overflow: hidden;
background: #eee;
display: block;
}
.user-page.xym-user .banner-row .banner-img:first-child {
margin-right: 2%;
}
.user-page.xym-user .qiepian-wrap {
margin: 20rpx 24rpx 0;
border-radius: 16rpx;
overflow: hidden;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
}
.user-page.xym-user .qiepian-banner {
width: 100%;
display: block;
min-height: 120rpx;
}
.user-page.xym-user .tip-bar {
margin: 22rpx 30rpx 0;
padding: 20rpx;
border-radius: 20rpx;
background: #ffedee;
color: #ff4c45;
font-size: 26rpx;
}
.user-page.xym-user .tip-ico {
width: 28rpx;
height: 28rpx;
margin-right: 12rpx;
}
.user-page.xym-user .tip-arrow {
color: #ff4c45;
font-size: 36rpx;
}
.user-page.xym-user .my-box {
border-radius: 20rpx;
margin: 20rpx;
padding-bottom: 10rpx;
background: #fdfcfa;
}
.user-page.xym-user .panel-title {
padding: 35rpx 35rpx 0;
font-weight: 700;
}
.user-page.xym-user .lg {
font-size: 32rpx;
font-weight: 700;
color: #222;
}
.user-page.xym-user .muted {
color: #999;
font-size: 28rpx;
}
.user-page.xym-user .sm {
font-size: 24rpx;
color: #666;
}
.user-page.xym-user .order-nav {
padding: 26rpx 0 10rpx;
display: flex;
align-items: center;
justify-content: space-around;
}
.user-page.xym-user .nav-item {
width: 25%;
display: flex;
flex-direction: column;
align-items: center;
}
.user-page.xym-user .icon-wrap {
position: relative;
display: flex;
justify-content: center;
}
.user-page.xym-user .nav-badge {
position: absolute;
top: -8rpx;
right: 8rpx;
min-width: 32rpx;
height: 32rpx;
line-height: 32rpx;
text-align: center;
font-size: 20rpx;
background: #ff4c45;
color: #fff;
border-radius: 16rpx;
z-index: 1;
padding: 0 6rpx;
}
.user-page.xym-user .nav-icon {
width: 62rpx;
height: 62rpx;
margin-bottom: 10rpx;
}
.user-page.xym-user .section-hd {
font-weight: 700;
font-size: 32rpx;
padding: 30rpx 20rpx 0;
color: #222;
}
.user-page.xym-user .trade-list {
flex-wrap: wrap;
padding: 20rpx 10rpx;
display: flex;
align-items: center;
justify-content: flex-start;
}
.user-page.xym-user .trade-item {
width: 20%;
padding: 12rpx 0;
display: flex;
flex-direction: column;
align-items: center;
}
.user-page.xym-user .trade-icon {
width: 50rpx;
height: 50rpx;
margin-bottom: 10rpx;
}
.user-page.xym-user .invite-row {
padding: 20rpx 10rpx 30rpx;
display: flex;
align-items: center;
justify-content: space-around;
}
.user-page.xym-user .invite-item {
width: 33.33%;
padding: 10rpx 0;
display: flex;
flex-direction: column;
align-items: center;
}
.user-page.xym-user .invite-icon {
width: 50rpx;
height: 50rpx;
margin-bottom: 8rpx;
}
.user-page.xym-user .func-list {
display: flex;
flex-wrap: wrap;
padding: 10rpx 0;
}
.user-page.xym-user .func-item-xym {
width: 25%;
padding: 16rpx 0;
display: flex;
flex-direction: column;
align-items: center;
}
.user-page.xym-user .func-icon-wrap {
width: 88rpx;
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 8rpx;
}
.user-page.xym-user .func-icon-xym {
width: 48rpx;
height: 48rpx;
}
.user-page.xym-user .func-txt-xym {
font-size: 24rpx;
color: #666;
text-align: center;
}
.user-page.xym-user .follow-kuaishou {
position: fixed;
right: 0;
bottom: calc(280rpx + env(safe-area-inset-bottom));
z-index: 99;
display: flex;
align-items: center;
background: rgba(255, 255, 255, 0.95);
border-radius: 40rpx 0 0 40rpx;
padding: 12rpx 16rpx 12rpx 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
}
.user-page.xym-user .follow-kuaishou.expanded {
padding-right: 24rpx;
}
.user-page.xym-user .ks-icon {
width: 48rpx;
height: 48rpx;
}
.user-page.xym-user .ks-text {
font-size: 24rpx;
color: #333;
margin-left: 10rpx;
white-space: nowrap;
}
.user-page.xym-user .load-tip {
text-align: center;
color: #999;
font-size: 24rpx;
padding: 24rpx 0 40rpx;
}
+1 -1
View File
@@ -5,7 +5,7 @@
margin-bottom: 24rpx; margin-bottom: 24rpx;
border-radius: 30rpx; border-radius: 30rpx;
position: relative; position: relative;
background: linear-gradient(to bottom, #f5f3ff, #ddd6fe); background: linear-gradient(to bottom, #fff8e1, #ffe0b2);
box-sizing: border-box; box-sizing: border-box;
overflow: hidden; overflow: hidden;
box-shadow: 0 12rpx 32rpx rgba(0, 0, 0, 0.12); box-shadow: 0 12rpx 32rpx rgba(0, 0, 0, 0.12);
+8 -8
View File
@@ -10,7 +10,7 @@
min-height: 100vh; min-height: 100vh;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background: linear-gradient(180deg, #c4b5fd 0%, #fff 28%, #f5f3ff 100%); background: linear-gradient(180deg, #f7dc51 0%, #fff 28%, #fff8e1 100%);
box-sizing: border-box; box-sizing: border-box;
overflow: hidden; overflow: hidden;
} }
@@ -49,13 +49,13 @@
font-weight: 700; font-weight: 700;
border: 2rpx solid #fff; border: 2rpx solid #fff;
border-radius: 60rpx; border-radius: 60rpx;
background: linear-gradient(180deg, #c4b5fd, #a78bfa); background: linear-gradient(180deg, #fae04d, #ffc0a3);
color: #492f00; color: #492f00;
white-space: nowrap; white-space: nowrap;
} }
.sj-btn-bg { .sj-btn-bg {
background: linear-gradient(180deg, #c4b5fd, #a78bfa); background: linear-gradient(180deg, #fae04d, #ffc0a3);
border-radius: 60rpx; border-radius: 60rpx;
color: #492f00; color: #492f00;
font-weight: 700; font-weight: 700;
@@ -66,7 +66,7 @@
font-size: 20rpx; font-size: 20rpx;
padding: 4rpx 12rpx; padding: 4rpx 12rpx;
border-radius: 8rpx; border-radius: 8rpx;
background: #8b5cf6; background: #ffb74d;
color: #fff; color: #fff;
} }
@@ -74,7 +74,7 @@
margin: 0 30rpx; margin: 0 30rpx;
padding: 24rpx 20rpx; padding: 24rpx 20rpx;
border-radius: 26rpx; border-radius: 26rpx;
background: #ede9fe; background: #fef6d4;
} }
.sj-w-label { .sj-w-label {
@@ -129,11 +129,11 @@
} }
.sj-fadan-btn--regular { .sj-fadan-btn--regular {
background: linear-gradient(135deg, #f5f3ff, #ddd6fe); background: linear-gradient(135deg, #fff8e1, #ffe0b2);
} }
.sj-fadan-btn--custom { .sj-fadan-btn--custom {
background: linear-gradient(135deg, #ede9fe, #c4b5fd); background: linear-gradient(135deg, #fef6d4, #ffd061);
} }
.sj-fadan-title { .sj-fadan-title {
@@ -219,7 +219,7 @@
text-align: center; text-align: center;
padding: 16rpx 8rpx; padding: 16rpx 8rpx;
border-radius: 12rpx; border-radius: 12rpx;
background: linear-gradient(180deg, #f5f3ff, #ede9fe); background: linear-gradient(180deg, #fff8e1, #fef6d4);
font-size: 24rpx; font-size: 24rpx;
color: #492f00; color: #492f00;
font-weight: 600; font-weight: 600;
+11 -11
View File
@@ -7,11 +7,11 @@
padding: 24rpx; padding: 24rpx;
padding-bottom: 160rpx; padding-bottom: 160rpx;
box-sizing: border-box; box-sizing: border-box;
background: linear-gradient(180deg, #c4b5fd 0%, #f5f5f5 18%, #f5f5f5 100%); background: linear-gradient(180deg, #f7dc51 0%, #fff8e1 18%, #fff8e1 100%);
} }
.sj-form-theme .balance-card { .sj-form-theme .balance-card {
background: #ede9fe !important; background: #fef6d4 !important;
border-radius: 26rpx !important; border-radius: 26rpx !important;
padding: 28rpx 24rpx !important; padding: 28rpx 24rpx !important;
margin-bottom: 20rpx !important; margin-bottom: 20rpx !important;
@@ -76,7 +76,7 @@
} }
.sj-form-theme .card-dot { .sj-form-theme .card-dot {
background: #9333ea !important; background: #ffd061 !important;
} }
.sj-form-theme .card-title, .sj-form-theme .card-title,
@@ -108,12 +108,12 @@
.sj-form-theme .type-chip--active, .sj-form-theme .type-chip--active,
.sj-form-theme .type-active { .sj-form-theme .type-active {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
color: #492f00 !important; color: #492f00 !important;
font-weight: 700 !important; font-weight: 700 !important;
border: none !important; border: none !important;
transform: none !important; transform: none !important;
box-shadow: 0 4rpx 12rpx rgba(147, 51, 234, 0.35) !important; box-shadow: 0 4rpx 12rpx rgba(255, 208, 97, 0.45) !important;
} }
.sj-form-theme .type-text { .sj-form-theme .type-text {
@@ -161,11 +161,11 @@
} }
.sj-form-theme .submit-btn { .sj-form-theme .submit-btn {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
color: #492f00 !important; color: #492f00 !important;
border-radius: 44rpx !important; border-radius: 44rpx !important;
font-weight: 700 !important; font-weight: 700 !important;
box-shadow: 0 6rpx 16rpx rgba(147, 51, 234, 0.35) !important; box-shadow: 0 6rpx 16rpx rgba(255, 208, 97, 0.45) !important;
} }
.sj-form-theme .submit-bar { .sj-form-theme .submit-bar {
@@ -174,7 +174,7 @@
} }
.sj-form-theme switch { .sj-form-theme switch {
color: #9333ea !important; color: #ffd061 !important;
} }
.sj-form-theme .search-section { .sj-form-theme .search-section {
@@ -197,7 +197,7 @@
} }
.sj-form-theme .search-btn { .sj-form-theme .search-btn {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
box-shadow: none !important; box-shadow: none !important;
} }
@@ -233,7 +233,7 @@
.sj-form-theme .generate-grid-btn, .sj-form-theme .generate-grid-btn,
.sj-form-theme .copy-grid-btn, .sj-form-theme .copy-grid-btn,
.sj-form-theme .action-grid-btn { .sj-form-theme .action-grid-btn {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
color: #492f00 !important; color: #492f00 !important;
border: 2rpx solid #fff !important; border: 2rpx solid #fff !important;
box-shadow: none !important; box-shadow: none !important;
@@ -250,7 +250,7 @@
} }
.sj-form-theme .tutorial-btn { .sj-form-theme .tutorial-btn {
background: linear-gradient(180deg, #c4b5fd, #a78bfa) !important; background: linear-gradient(180deg, #fae04d, #ffc0a3) !important;
color: #492f00 !important; color: #492f00 !important;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1) !important; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1) !important;
} }
+5
View File
@@ -0,0 +1,5 @@
/* 逍遥梦布局工具类 */
.flex { display: flex; align-items: center; }
.flexb { display: flex; align-items: center; justify-content: space-between; }
.flexa { display: flex; align-items: center; justify-content: space-around; }
.flexmc { display: flex; flex-direction: column; align-items: center; justify-content: center; }
+171
View File
@@ -0,0 +1,171 @@
/* 会员/保证金充值页共用弹窗与 loading */
.modal-mask {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.45);
z-index: 1000;
display: flex;
align-items: flex-end;
justify-content: center;
}
.modal-panel {
width: 100%;
background: #fff;
border-radius: 32rpx 32rpx 0 0;
padding: 32rpx 28rpx calc(24rpx + env(safe-area-inset-bottom));
}
.modal-title {
display: block;
font-size: 34rpx;
font-weight: 700;
text-align: center;
margin-bottom: 8rpx;
}
.modal-sub {
display: block;
text-align: center;
font-size: 24rpx;
color: #999;
margin-bottom: 24rpx;
}
.amount-input-wrap {
display: flex;
align-items: center;
border-bottom: 2rpx solid #f0e6d8;
padding-bottom: 12rpx;
margin-bottom: 20rpx;
}
.amount-prefix {
font-size: 40rpx;
font-weight: 700;
color: #492f00;
margin-right: 8rpx;
}
.amount-input {
flex: 1;
font-size: 36rpx;
}
.quick-row {
display: flex;
flex-wrap: wrap;
gap: 16rpx;
margin-bottom: 24rpx;
}
.quick-chip {
padding: 12rpx 24rpx;
border-radius: 999rpx;
background: #f5f5f5;
font-size: 26rpx;
color: #666;
}
.quick-chip.active {
background: #fff3cd;
color: #492f00;
font-weight: 600;
}
.modal-actions {
display: flex;
gap: 20rpx;
}
.modal-btn {
flex: 1;
height: 88rpx;
border-radius: 44rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 30rpx;
}
.modal-btn.cancel {
background: #f5f5f5;
color: #666;
}
.modal-btn.confirm {
background: linear-gradient(90deg, #fae04d, #ffc0a3);
color: #492f00;
font-weight: 700;
}
.pay-method-item {
padding: 28rpx 20rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.pay-method-name {
display: block;
font-size: 30rpx;
font-weight: 600;
}
.pay-method-desc {
display: block;
font-size: 24rpx;
color: #999;
margin-top: 6rpx;
}
.balance-item {
display: flex;
justify-content: space-between;
padding: 24rpx 12rpx;
border-bottom: 1rpx solid #f5f5f5;
font-size: 28rpx;
}
.balance-need {
color: #e6a23c;
font-weight: 600;
}
.confirm-row {
display: flex;
justify-content: space-between;
padding: 16rpx 0;
font-size: 28rpx;
}
.loading-mask {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.35);
z-index: 2000;
display: flex;
align-items: center;
justify-content: center;
}
.loading-box {
background: #fff;
border-radius: 20rpx;
padding: 40rpx 48rpx;
display: flex;
flex-direction: column;
align-items: center;
gap: 16rpx;
}
.loading-spinner {
width: 56rpx;
height: 56rpx;
border: 4rpx solid #f0e6d8;
border-top-color: #f5a623;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
Loaded 100 of 103 files, more files were not shown because too many files have changed in this diff. Show more