统一排行榜对齐星雀UI,页面资源后台配置实时刷新

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-06-27 01:26:11 +08:00
parent 1ab2e2080a
commit 21112173f2
292 changed files with 64010 additions and 81 deletions

View File

@@ -0,0 +1,201 @@
// pages/zuzhangduan/zuzhangduan.js
import request from '../../utils/request.js'
Page({
data: {
// 页面状态
isZuzhang: false,
isLoading: false,
// 邀请码相关
inviteCode: '',
// 用户信息
uid: '',
nicheng: '',
avatarUrl: '',
// 组长信息
ketixian: '0.00', // 可提现金额
guanshiCount: 0, // 邀请的管事数量
fenhongZonge: '0.00', // 分红总额
},
onLoad() {
this.checkLoginStatus()
},
onShow() {
this.registerNotificationComponent()
if (this.data.isZuzhang) {
this.getZuzhangInfo()
}
},
// 检查登录状态
checkLoginStatus() {
const token = wx.getStorageSync('token')
if (!token) {
wx.showModal({
title: '提示',
content: '您尚未登录,请先登录',
confirmText: '去登录',
success: (res) => {
if (res.confirm) {
wx.reLaunch({ url: '/pages/gerenzhongxin/gerenzhongxin' })
}
}
})
return false
}
this.checkZuzhangStatus()
return true
},
// 检查组长状态
checkZuzhangStatus() {
try {
const zuzhangstatus = wx.getStorageSync('zuzhangstatus')
if (zuzhangstatus === 1) {
this.setData({ isZuzhang: true })
this.loadUserInfo()
this.getZuzhangInfo()
} else {
this.setData({ isZuzhang: false })
}
} catch (error) {
console.error('读取缓存失败:', error)
this.setData({ isZuzhang: false })
}
},
// 加载用户信息
loadUserInfo() {
const app = getApp()
const globalData = app.globalData || {}
const touxiang = wx.getStorageSync('touxiang')
const ossImageUrl = globalData.ossImageUrl || ''
const morentouxiang = globalData.morentouxiang || 'avatar/default.jpg'
let avatarUrl = ''
if (touxiang) {
avatarUrl = ossImageUrl + (touxiang.startsWith('/') ? touxiang : '/' + touxiang)
} else {
avatarUrl = ossImageUrl + (morentouxiang.startsWith('/') ? morentouxiang : '/' + morentouxiang)
}
const uid = wx.getStorageSync('uid') || ''
const nicheng = wx.getStorageSync('nicheng') || globalData.nicheng || ''
this.setData({ avatarUrl, uid, nicheng })
},
// 注册通知组件
registerNotificationComponent() {
const app = getApp()
const notificationComp = this.selectComponent('#global-notification')
if (notificationComp && notificationComp.showNotification) {
app.globalData.globalNotification = {
show: (data) => notificationComp.showNotification(data),
hide: () => notificationComp.hideNotification()
}
}
},
// 获取组长信息(刷新)
async getZuzhangInfo() {
this.setData({ isLoading: true })
try {
const res = await request({
url: '/yonghu/zuzhangxinxi',
method: 'POST'
})
if (res && res.data.code === 200) {
const data = res.data.data
this.setData({
ketixian: data.ketixian || '0.00',
guanshiCount: data.guanshiCount || 0,
fenhongZonge: data.fenhongZonge || '0.00',
isLoading: false
})
wx.showToast({ title: '刷新成功', icon: 'success', duration: 1500 })
} else {
throw new Error(res?.data?.msg || '获取信息失败')
}
} catch (error) {
console.error('获取组长信息失败:', error)
this.setData({ isLoading: false })
wx.showToast({ title: error.message || '刷新失败', icon: 'none' })
}
},
// 刷新按钮点击
refreshZuzhangInfo() {
this.getZuzhangInfo()
},
// 邀请码输入
onInviteCodeInput(e) {
this.setData({ inviteCode: e.detail.value.trim() })
},
// 注册组长
async onRegister() {
const { inviteCode } = this.data
if (!inviteCode) {
wx.showToast({ title: '请输入邀请码', icon: 'none', duration: 2000 })
return
}
if (inviteCode.length > 100) {
wx.showToast({ title: '邀请码不能超过100字符', icon: 'none', duration: 2000 })
return
}
this.setData({ isLoading: true })
try {
const res = await request({
url: '/yonghu/zuzhangzhuce',
method: 'POST',
data: { inviteCode }
})
if (res && res.data.code === 200) {
wx.setStorageSync('zuzhangstatus', 1)
const data = res.data.data
this.setData({
isZuzhang: true,
ketixian: data.ketixian || '0.00',
guanshiCount: data.guanshiCount || 0,
fenhongZonge: data.fenhongZonge || '0.00',
isLoading: false
})
this.loadUserInfo()
wx.showToast({ title: '注册成功!', icon: 'success', duration: 2000 })
} else {
throw new Error(res?.data?.msg || '注册失败')
}
} catch (error) {
console.error('注册失败:', error)
this.setData({ isLoading: false })
wx.showToast({ title: error.message || '注册失败', icon: 'error' })
}
},
// 🔥【修改】跳转到提现页面传递from=zuzhang参数
goToWithdraw() {
const { ketixian } = this.data
wx.navigateTo({
url: `/pages/tixian/tixian?from=zuzhang&amount=${ketixian}`
})
},
// 跳转到分红记录页面
goToFenhongJilu() {
wx.navigateTo({ url: '/pages/zzfhjilu/zzfhjilu' })
},
// 跳转到邀请管事页面
goToYaoqingGuanshi() {
wx.navigateTo({ url: '/pages/yqguanshi/yqguanshi' })
}
})

View File

@@ -0,0 +1,10 @@
{
"navigationBarBackgroundColor": "#0b0f1c",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "组长驾驶舱",
"backgroundColor": "#0b0f1c",
"backgroundTextStyle": "light",
"usingComponents": {
"global-notification": "/components/global-notification/global-notification"
}
}

View File

@@ -0,0 +1,108 @@
<!-- pages/zuzhangduan/zuzhangduan.wxml - 重设计,更饱满科技感 -->
<!-- 未注册状态(保持原样) -->
<view class="page-container unregistered-page" wx:if="{{!isZuzhang}}">
<view class="glitch-title">⚡ 组长认证 ⚡</view>
<view class="input-area">
<input
class="glitch-input"
type="text"
placeholder="输入邀请码激活权限"
maxlength="100"
value="{{inviteCode}}"
bindinput="onInviteCodeInput"
placeholder-class="placeholder"
/>
</view>
<view class="glitch-button" bindtap="onRegister">
<text class="button-text">立即激活</text>
<view class="button-glow"></view>
</view>
</view>
<!-- 已注册状态 - 赛博驾驶舱(重设计) -->
<view class="page-container registered-page" wx:else>
<!-- 背景网格 + 扫描线 -->
<view class="cyber-grid"></view>
<view class="scan-line"></view>
<!-- 刷新按钮(能量核心)保持不变 -->
<view class="refresh-core" bindtap="refreshZuzhangInfo">
<view class="core-spinner"></view>
</view>
<!-- 头部用户信息(增强光效) -->
<view class="cyber-header">
<view class="avatar-container">
<image class="avatar" src="{{avatarUrl}}" mode="aspectFill"></image>
<view class="avatar-ring"></view>
<view class="avatar-glow"></view>
</view>
<view class="user-info">
<text class="nickname">{{nicheng || '组长'}}</text>
<view class="uid-tag">
<text>UID: {{uid || '--'}}</text>
</view>
</view>
</view>
<!-- 资产总览卡片(突出可提现余额) -->
<view class="asset-card">
<view class="card-glow"></view>
<view class="asset-title">💰 可提现余额</view>
<view class="asset-value">
<text class="value-number">{{ketixian}}</text>
<text class="value-unit">元</text>
</view>
<!-- 装饰性光条 -->
<view class="asset-beam"></view>
</view>
<!-- 双数据卡片(邀请管事数 + 分红总额) -->
<view class="stats-row">
<view class="stat-card">
<view class="stat-icon">👥</view>
<view class="stat-content">
<text class="stat-label">邀请管事</text>
<text class="stat-number">{{guanshiCount}}</text>
</view>
<view class="stat-glow"></view>
</view>
<view class="stat-card">
<view class="stat-icon">📊</view>
<view class="stat-content">
<text class="stat-label">分红总额</text>
<text class="stat-number">{{fenhongZonge}}</text>
</view>
<view class="stat-glow"></view>
</view>
</view>
<!-- 立即提现按钮(无图标,大尺寸) -->
<view class="withdraw-btn-wrapper">
<view class="withdraw-btn" bindtap="goToWithdraw">
<text class="btn-text">⚡ 立即提现 ⚡</text>
<view class="btn-glow"></view>
</view>
</view>
<!-- 底部功能按钮(调整样式) -->
<view class="function-panel">
<view class="function-btn" bindtap="goToFenhongJilu">
<text class="btn-icon">📈</text>
<text class="btn-label">分红记录</text>
</view>
<view class="function-btn" bindtap="goToYaoqingGuanshi">
<text class="btn-icon">👥</text>
<text class="btn-label">邀请管事</text>
</view>
</view>
<global-notification id="global-notification" />
<custom-tab-bar />
</view>
<!-- 加载遮罩(保持不变) -->
<view class="loading-mask" wx:if="{{isLoading}}">
<view class="loader"></view>
</view>

View File

@@ -0,0 +1,562 @@
/* pages/zuzhangduan/zuzhangduan.wxss - 重设计,更饱满科技感 */
/* ===== 全局变量 ===== */
page {
background: #0a0c14;
min-height: 100vh;
font-family: 'Avenir', 'PingFang SC', 'Helvetica Neue', sans-serif;
color: #fff;
}
/* 背景网格(增强) */
page::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image:
linear-gradient(rgba(0, 255, 255, 0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(0, 255, 255, 0.03) 1px, transparent 1px);
background-size: 50rpx 50rpx;
pointer-events: none;
z-index: 0;
}
.page-container {
position: relative;
z-index: 2;
min-height: 100vh;
padding: 40rpx 30rpx;
box-sizing: border-box;
}
/* ===== 未注册状态(保持原样,稍作调整) ===== */
.unregistered-page {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
background: rgba(0, 10, 20, 0.9);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 2rpx solid #0ff;
box-shadow: 0 0 150rpx rgba(0, 255, 255, 0.4);
clip-path: polygon(0 0, 100% 0, 90% 100%, 0 100%);
margin: 20rpx;
padding: 60rpx 40rpx;
}
.glitch-title {
font-size: 40rpx;
color: #0ff;
text-transform: uppercase;
letter-spacing: 8rpx;
text-shadow: 0 0 20rpx #0ff, 0 0 40rpx #0ff, 0 0 60rpx #0ff;
margin-bottom: 80rpx;
border-bottom: 2rpx solid #0ff;
padding-bottom: 20rpx;
animation: glitch 3s infinite;
}
@keyframes glitch {
0%,100% { transform: skew(0deg); }
95% { transform: skew(2deg); }
96% { transform: skew(-2deg); }
97% { transform: skew(0deg); }
}
.input-area {
width: 100%;
margin-bottom: 80rpx;
}
.glitch-input {
width: 100%;
height: 100rpx;
background: transparent;
border: 2rpx solid #0ff;
border-right: none;
border-bottom: none;
clip-path: polygon(0 0, 100% 0, 90% 100%, 0 100%);
padding: 0 40rpx;
font-size: 30rpx;
color: #fff;
caret-color: #0ff;
box-sizing: border-box;
}
.glitch-input:focus {
box-shadow: inset 0 0 40rpx rgba(0, 255, 255, 0.3);
}
.placeholder {
color: rgba(255, 255, 255, 0.2);
}
.glitch-button {
width: 100%;
height: 100rpx;
background: linear-gradient(45deg, #00cccc, #0066ff);
clip-path: polygon(0 0, 100% 0, 85% 100%, 0 100%);
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
box-shadow: 0 0 60rpx #0ff;
}
.button-text {
font-size: 36rpx;
font-weight: bold;
color: #fff;
letter-spacing: 4rpx;
z-index: 2;
}
.button-glow {
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
animation: scan 3s infinite;
}
/* ===== 已注册状态(重设计) ===== */
.registered-page {
position: relative;
padding: 30rpx 20rpx;
}
/* 增强网格背景 */
.cyber-grid {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image:
linear-gradient(rgba(0, 255, 255, 0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(0, 255, 255, 0.05) 1px, transparent 1px);
background-size: 80rpx 80rpx;
pointer-events: none;
z-index: 0;
}
/* 扫描线效果(调快) */
.scan-line {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 8rpx;
background: rgba(0, 255, 255, 0.25);
box-shadow: 0 0 60rpx #0ff;
animation: scanMove 3s linear infinite;
pointer-events: none;
z-index: 10;
}
@keyframes scanMove {
0% { top: 0; }
100% { top: 100%; }
}
/* 刷新按钮(能量核心)保持不变 */
.refresh-core {
position: absolute;
top: 20rpx;
right: 20rpx;
width: 80rpx;
height: 80rpx;
background: rgba(0, 20, 40, 0.9);
border: 2rpx solid #0ff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
z-index: 30;
box-shadow: 0 0 30rpx #0ff;
}
.core-spinner {
width: 40rpx;
height: 40rpx;
border: 4rpx solid #0ff;
border-top-color: transparent;
border-radius: 50%;
animation: spin 1s linear infinite;
}
.refresh-core:active {
box-shadow: 0 0 80rpx #0ff;
transform: scale(0.95);
}
/* 头部(增强) */
.cyber-header {
display: flex;
align-items: center;
margin: 80rpx 0 60rpx;
position: relative;
z-index: 20;
}
.avatar-container {
width: 140rpx;
height: 140rpx;
position: relative;
margin-right: 30rpx;
}
.avatar {
width: 100%;
height: 100%;
border-radius: 50%;
border: 4rpx solid #0ff;
box-shadow: 0 0 60rpx #0ff;
object-fit: cover;
position: relative;
z-index: 2;
}
.avatar-ring {
position: absolute;
top: -10rpx;
left: -10rpx;
right: -10rpx;
bottom: -10rpx;
border: 2rpx solid #0ff;
border-radius: 50%;
opacity: 0.6;
animation: pulse 2s infinite;
z-index: 1;
}
.avatar-glow {
position: absolute;
top: -20rpx;
left: -20rpx;
right: -20rpx;
bottom: -20rpx;
background: radial-gradient(circle, rgba(0, 255, 255, 0.4) 0%, transparent 70%);
border-radius: 50%;
z-index: 0;
animation: glowPulse 3s infinite alternate;
}
.user-info {
flex: 1;
}
.nickname {
font-size: 48rpx;
font-weight: bold;
color: #fff;
text-shadow: 0 0 30rpx #0ff, 0 0 60rpx #0ff;
margin-bottom: 10rpx;
display: block;
}
.uid-tag {
display: inline-block;
background: rgba(0, 30, 50, 0.8);
border-left: 4rpx solid #0ff;
padding: 10rpx 40rpx;
clip-path: polygon(0 0, 100% 0, 90% 100%, 0 100%);
font-size: 28rpx;
color: #9cf;
box-shadow: 0 0 20rpx rgba(0, 255, 255, 0.2);
}
/* 资产总览卡片 */
.asset-card {
background: rgba(0, 20, 30, 0.7);
backdrop-filter: blur(15px);
-webkit-backdrop-filter: blur(15px);
border: 2rpx solid #0ff;
border-radius: 40rpx;
padding: 40rpx 30rpx;
margin-bottom: 40rpx;
position: relative;
overflow: hidden;
box-shadow: 0 0 100rpx rgba(0, 255, 255, 0.3);
z-index: 20;
}
.card-glow {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at 70% 30%, rgba(0, 255, 255, 0.2), transparent 70%);
pointer-events: none;
}
.asset-title {
font-size: 32rpx;
color: #9cf;
text-transform: uppercase;
letter-spacing: 4rpx;
margin-bottom: 20rpx;
display: flex;
align-items: center;
}
.asset-title::before {
content: '⚡';
margin-right: 10rpx;
font-size: 40rpx;
color: #0ff;
}
.asset-value {
display: flex;
align-items: baseline;
margin-bottom: 10rpx;
}
.value-number {
font-size: 120rpx;
font-weight: 800;
color: #fff;
text-shadow: 0 0 40rpx #0ff, 0 0 80rpx #0ff, 0 0 120rpx #0ff;
margin-right: 15rpx;
line-height: 1;
}
.value-unit {
font-size: 40rpx;
color: #0ff;
text-shadow: 0 0 20rpx #0ff;
}
.asset-beam {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 4rpx;
background: linear-gradient(90deg, transparent, #0ff, #00f, #0ff, transparent);
animation: beamMove 4s linear infinite;
}
@keyframes beamMove {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
/* 双数据卡片 */
.stats-row {
display: flex;
gap: 30rpx;
margin-bottom: 50rpx;
z-index: 20;
position: relative;
}
.stat-card {
flex: 1;
background: rgba(0, 20, 30, 0.7);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 2rpx solid #0ff;
border-radius: 30rpx;
padding: 30rpx 20rpx;
display: flex;
align-items: center;
position: relative;
overflow: hidden;
box-shadow: 0 0 50rpx rgba(0, 255, 255, 0.2);
}
.stat-icon {
font-size: 70rpx;
margin-right: 20rpx;
filter: drop-shadow(0 0 15rpx #0ff);
}
.stat-content {
flex: 1;
display: flex;
flex-direction: column;
}
.stat-label {
font-size: 28rpx;
color: #9cf;
margin-bottom: 10rpx;
}
.stat-number {
font-size: 48rpx;
font-weight: bold;
color: #fff;
text-shadow: 0 0 20rpx #0ff;
}
.stat-glow {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at 30% 30%, rgba(0, 255, 255, 0.15), transparent 70%);
pointer-events: none;
}
.stat-card:active {
transform: scale(0.98);
box-shadow: 0 0 80rpx #0ff;
}
/* 立即提现按钮(无图标,大尺寸) */
.withdraw-btn-wrapper {
display: flex;
justify-content: center;
margin: 30rpx 0 50rpx;
z-index: 20;
position: relative;
}
.withdraw-btn {
width: 80%;
height: 100rpx;
background: linear-gradient(45deg, #00cccc, #0066ff);
border-radius: 60rpx;
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
box-shadow: 0 0 80rpx #0ff, 0 0 150rpx rgba(0, 255, 255, 0.3);
border: 2rpx solid rgba(255, 255, 255, 0.3);
}
.btn-text {
font-size: 40rpx;
font-weight: bold;
color: #fff;
letter-spacing: 6rpx;
z-index: 2;
text-shadow: 0 0 20rpx #fff;
}
.btn-glow {
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent);
animation: scan 2s infinite;
}
.withdraw-btn:active {
transform: scale(0.96);
box-shadow: 0 0 120rpx #0ff;
}
/* 底部功能按钮(调整间距) */
.function-panel {
display: flex;
justify-content: space-around;
gap: 30rpx;
margin-top: 20rpx;
z-index: 20;
position: relative;
}
.function-btn {
flex: 1;
background: rgba(0, 20, 30, 0.8);
border: 2rpx solid #0ff;
border-radius: 40rpx;
padding: 30rpx 0;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
overflow: hidden;
box-shadow: 0 0 40rpx rgba(0, 255, 255, 0.1);
}
.function-btn::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 4rpx;
background: linear-gradient(90deg, transparent, #0ff, transparent);
}
.function-btn:active {
transform: translateY(-8rpx);
box-shadow: 0 20rpx 80rpx #0ff;
}
.btn-icon {
font-size: 80rpx;
margin-bottom: 15rpx;
filter: drop-shadow(0 0 20rpx #0ff);
}
.btn-label {
font-size: 30rpx;
color: #fff;
font-weight: 500;
text-shadow: 0 0 10rpx #0ff;
}
/* 动画 */
@keyframes scan {
0% { left: -100%; }
100% { left: 100%; }
}
@keyframes pulse {
0%,100% { opacity: 0.5; transform: scale(1); }
50% { opacity: 1; transform: scale(1.1); }
}
@keyframes glowPulse {
0% { opacity: 0.3; transform: scale(0.9); }
100% { opacity: 0.6; transform: scale(1.2); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* ===== 加载遮罩(保持不变) ===== */
.loading-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(2, 6, 12, 0.95);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
}
.loader {
width: 200rpx;
height: 200rpx;
border: 4rpx solid #0ff;
border-radius: 50%;
border-top-color: transparent;
animation: spin 1s linear infinite;
}