|
@@ -1,82 +1,82 @@
|
|
|
<template>
|
|
<template>
|
|
|
<view class="page-mine">
|
|
<view class="page-mine">
|
|
|
- <!-- User Info Card -->
|
|
|
|
|
- <view class="user-card">
|
|
|
|
|
- <view class="avatar-container" @click="handleEditProfile">
|
|
|
|
|
- <!-- Default avatar if not logged in or no avatar -->
|
|
|
|
|
- <image
|
|
|
|
|
- class="avatar"
|
|
|
|
|
- :src="isLoggedIn && userInfo.avatar ? userInfo.avatar : '/static/images/head.png'"
|
|
|
|
|
- mode="aspectFill"
|
|
|
|
|
- ></image>
|
|
|
|
|
- <view class="edit-icon">✏️</view>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="user-info">
|
|
|
|
|
- <text class="username">{{ isLoggedIn ? (userInfo.nickname || '微信用户') : '游客' }}</text>
|
|
|
|
|
- <text class="phone" v-if="isLoggedIn && userInfo.phone">{{ userInfo.phone }}</text>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
+ <!-- 顶部标题卡片 -->
|
|
|
|
|
+ <view class="page-title-card">
|
|
|
|
|
+ <text class="page-title-text">量化选股大师</text>
|
|
|
</view>
|
|
</view>
|
|
|
|
|
|
|
|
- <!-- Points Card -->
|
|
|
|
|
- <view class="section-card">
|
|
|
|
|
- <view class="card-header">
|
|
|
|
|
- <view class="header-icon-box">
|
|
|
|
|
- <text class="header-icon-text">🪙</text>
|
|
|
|
|
|
|
+ <scroll-view class="scroll-view" scroll-y>
|
|
|
|
|
+ <view class="content-wrapper">
|
|
|
|
|
+ <!-- 用户信息卡片 -->
|
|
|
|
|
+ <view class="user-info-card" @click="handleUserCardClick">
|
|
|
|
|
+ <view class="user-header">
|
|
|
|
|
+ <image
|
|
|
|
|
+ class="user-avatar"
|
|
|
|
|
+ :src="isLoggedIn && userInfo.avatar ? userInfo.avatar : '/static/images/head.png'"
|
|
|
|
|
+ mode="aspectFill"
|
|
|
|
|
+ ></image>
|
|
|
|
|
+ <view class="user-details">
|
|
|
|
|
+ <text class="user-name">{{ isLoggedIn ? (userInfo.nickname || '微信用户') : '登录/注册' }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="arrow-icon">›</view>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
- <text class="header-title">积分值</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="card-content points-content">
|
|
|
|
|
- <text class="points-value">积分值:{{ isLoggedIn ? points : 0 }}</text>
|
|
|
|
|
- <view class="points-actions">
|
|
|
|
|
- <button class="mini-btn" @click="handleRecharge">充值</button>
|
|
|
|
|
- <button class="mini-btn" @click="handleHistory">积分记录</button>
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 积分区域 -->
|
|
|
|
|
+ <view class="my-tasks-section">
|
|
|
|
|
+ <view class="tasks-grid">
|
|
|
|
|
+ <view class="task-item" @click="handleViewPoints">
|
|
|
|
|
+ <view class="task-icon-wrapper points">
|
|
|
|
|
+ <text class="task-icon">💰</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="task-info">
|
|
|
|
|
+ <text class="task-label">积分</text>
|
|
|
|
|
+ <text class="task-value">{{ isLoggedIn ? points : 0 }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <view class="task-item" @click="handleRecharge">
|
|
|
|
|
+ <view class="task-icon-wrapper recharge">
|
|
|
|
|
+ <text class="task-icon">💳</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="task-info">
|
|
|
|
|
+ <text class="task-label">充值</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <view class="task-item" @click="handleHistory">
|
|
|
|
|
+ <view class="task-icon-wrapper history">
|
|
|
|
|
+ <text class="task-icon">📋</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="task-info">
|
|
|
|
|
+ <text class="task-label">积分记录</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
|
|
|
- <!-- Transaction Record Card -->
|
|
|
|
|
- <view class="section-card">
|
|
|
|
|
- <view class="card-header">
|
|
|
|
|
- <view class="header-icon-box">
|
|
|
|
|
- <text class="header-icon-text">📝</text>
|
|
|
|
|
|
|
+ <!-- 菜单列表 -->
|
|
|
|
|
+ <view class="menu-list">
|
|
|
|
|
+ <view class="menu-item" @click="handleTransactionRecord">
|
|
|
|
|
+ <view class="menu-left">
|
|
|
|
|
+ <text class="menu-icon">📝</text>
|
|
|
|
|
+ <text class="menu-label">交易记录</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <text class="menu-arrow">›</text>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
- <text class="header-title">交易记录</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="card-content transaction-content">
|
|
|
|
|
- <text class="empty-text">暂无交易记录</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
|
|
|
- <!-- Login/Logout Button -->
|
|
|
|
|
- <view class="action-area">
|
|
|
|
|
- <!-- 未登录且未开始授权 -->
|
|
|
|
|
- <button
|
|
|
|
|
- v-if="!isLoggedIn && !showPhoneAuth"
|
|
|
|
|
- class="main-btn"
|
|
|
|
|
- @click="handleLogin"
|
|
|
|
|
- >
|
|
|
|
|
- 微信授权登录
|
|
|
|
|
- </button>
|
|
|
|
|
-
|
|
|
|
|
- <!-- 未登录但已获取用户信息,等待手机号授权 -->
|
|
|
|
|
- <button
|
|
|
|
|
- v-else-if="!isLoggedIn && showPhoneAuth"
|
|
|
|
|
- class="main-btn phone-auth-btn"
|
|
|
|
|
- open-type="getPhoneNumber"
|
|
|
|
|
- @getphonenumber="onGetPhoneNumber"
|
|
|
|
|
- >
|
|
|
|
|
- 授权手机号
|
|
|
|
|
- </button>
|
|
|
|
|
-
|
|
|
|
|
- <!-- 已登录 -->
|
|
|
|
|
- <button
|
|
|
|
|
- v-else
|
|
|
|
|
- class="main-btn"
|
|
|
|
|
- @click="handleLogout"
|
|
|
|
|
- >
|
|
|
|
|
- 退出登录
|
|
|
|
|
- </button>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
+ <!-- 退出登录按钮(仅登录后显示) -->
|
|
|
|
|
+ <view class="logout-section" v-if="isLoggedIn">
|
|
|
|
|
+ <button class="logout-btn" @click="handleLogout">
|
|
|
|
|
+ 退出登录
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 预留底部空间 -->
|
|
|
|
|
+ <view class="bottom-safe-area"></view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </scroll-view>
|
|
|
</view>
|
|
</view>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
@@ -86,7 +86,7 @@ import { onShow } from '@dcloudio/uni-app'
|
|
|
import { isLoggedIn as checkLogin, getUserInfo as getStoredUserInfo, logout, checkLogin as requireLogin, wxAuthLogin } from '@/utils/auth.js'
|
|
import { isLoggedIn as checkLogin, getUserInfo as getStoredUserInfo, logout, checkLogin as requireLogin, wxAuthLogin } from '@/utils/auth.js'
|
|
|
|
|
|
|
|
const isLoggedIn = ref(false)
|
|
const isLoggedIn = ref(false)
|
|
|
-const showPhoneAuth = ref(false) // 是否显示手机号授权按钮
|
|
|
|
|
|
|
+const showPhoneAuth = ref(false)
|
|
|
const userInfo = ref({
|
|
const userInfo = ref({
|
|
|
nickname: '',
|
|
nickname: '',
|
|
|
avatar: '',
|
|
avatar: '',
|
|
@@ -102,7 +102,7 @@ onMounted(() => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 页面显示时刷新用户信息(从登录页返回时会触发)
|
|
|
|
|
|
|
+ * 页面显示时刷新用户信息
|
|
|
*/
|
|
*/
|
|
|
onShow(() => {
|
|
onShow(() => {
|
|
|
loadUserInfo()
|
|
loadUserInfo()
|
|
@@ -124,31 +124,61 @@ const loadUserInfo = () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 编辑个人资料
|
|
|
|
|
|
|
+ * 点击用户卡片
|
|
|
*/
|
|
*/
|
|
|
-const handleEditProfile = () => {
|
|
|
|
|
- if (!requireLogin(() => {
|
|
|
|
|
- handleEditProfile()
|
|
|
|
|
- })) {
|
|
|
|
|
- return
|
|
|
|
|
|
|
+const handleUserCardClick = () => {
|
|
|
|
|
+ if (!isLoggedIn.value) {
|
|
|
|
|
+ handleLogin()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 跳转到编辑资料页面
|
|
|
|
|
- uni.navigateTo({
|
|
|
|
|
- url: '/pages/profile/edit'
|
|
|
|
|
- })
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 处理登录按钮点击 - 直接显示手机号授权
|
|
|
|
|
|
|
+ * 处理登录
|
|
|
*/
|
|
*/
|
|
|
-const handleLogin = () => {
|
|
|
|
|
- console.log('[我的] 显示手机号授权弹窗')
|
|
|
|
|
- showPhoneAuth.value = true
|
|
|
|
|
|
|
+const handleLogin = async () => {
|
|
|
|
|
+ console.log('[我的] 开始登录流程')
|
|
|
|
|
+
|
|
|
|
|
+ uni.showLoading({
|
|
|
|
|
+ title: '登录中...',
|
|
|
|
|
+ mask: true
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 获取微信登录code
|
|
|
|
|
+ const loginRes = await uni.login()
|
|
|
|
|
+ console.log('[我的] uni.login完整响应:', loginRes)
|
|
|
|
|
+
|
|
|
|
|
+ if (!loginRes.code) {
|
|
|
|
|
+ throw new Error('获取微信登录code失败')
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 获取手机号授权
|
|
|
|
|
+ uni.hideLoading()
|
|
|
|
|
+
|
|
|
|
|
+ // 显示手机号授权按钮
|
|
|
|
|
+ showPhoneAuth.value = true
|
|
|
|
|
+
|
|
|
|
|
+ // 触发手机号授权
|
|
|
|
|
+ uni.showModal({
|
|
|
|
|
+ title: '授权提示',
|
|
|
|
|
+ content: '需要授权手机号才能完成登录',
|
|
|
|
|
+ showCancel: false,
|
|
|
|
|
+ success: () => {
|
|
|
|
|
+ // 用户需要点击授权按钮
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ uni.hideLoading()
|
|
|
|
|
+ console.error('[我的] 登录失败:', error)
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ title: '登录失败,请重试',
|
|
|
|
|
+ icon: 'none'
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 处理手机号授权并完成登录
|
|
|
|
|
|
|
+ * 处理手机号授权
|
|
|
*/
|
|
*/
|
|
|
const onGetPhoneNumber = async (e) => {
|
|
const onGetPhoneNumber = async (e) => {
|
|
|
console.log('[我的] 获取手机号回调:', e.detail)
|
|
console.log('[我的] 获取手机号回调:', e.detail)
|
|
@@ -165,7 +195,6 @@ const onGetPhoneNumber = async (e) => {
|
|
|
try {
|
|
try {
|
|
|
const loginRes = await uni.login()
|
|
const loginRes = await uni.login()
|
|
|
console.log('[我的] uni.login完整响应:', loginRes)
|
|
console.log('[我的] uni.login完整响应:', loginRes)
|
|
|
- console.log('[我的] 微信登录code:', loginRes.code)
|
|
|
|
|
|
|
|
|
|
if (!loginRes.code) {
|
|
if (!loginRes.code) {
|
|
|
throw new Error('获取微信登录code失败')
|
|
throw new Error('获取微信登录code失败')
|
|
@@ -212,12 +241,23 @@ const handleLogout = () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 处理充值按钮点击
|
|
|
|
|
- * 需要登录才能操作
|
|
|
|
|
|
|
+ * 查看积分
|
|
|
|
|
+ */
|
|
|
|
|
+const handleViewPoints = () => {
|
|
|
|
|
+ if (!requireLogin(() => {
|
|
|
|
|
+ handleViewPoints()
|
|
|
|
|
+ })) {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ uni.showToast({ title: `当前积分: ${points.value}`, icon: 'none' })
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 充值
|
|
|
*/
|
|
*/
|
|
|
const handleRecharge = () => {
|
|
const handleRecharge = () => {
|
|
|
if (!requireLogin(() => {
|
|
if (!requireLogin(() => {
|
|
|
- // 登录成功后的回调
|
|
|
|
|
handleRecharge()
|
|
handleRecharge()
|
|
|
})) {
|
|
})) {
|
|
|
return
|
|
return
|
|
@@ -227,201 +267,251 @@ const handleRecharge = () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 处理积分记录按钮点击
|
|
|
|
|
- * 需要登录才能操作
|
|
|
|
|
|
|
+ * 积分记录
|
|
|
*/
|
|
*/
|
|
|
const handleHistory = () => {
|
|
const handleHistory = () => {
|
|
|
if (!requireLogin(() => {
|
|
if (!requireLogin(() => {
|
|
|
- // 登录成功后的回调
|
|
|
|
|
handleHistory()
|
|
handleHistory()
|
|
|
})) {
|
|
})) {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- uni.showToast({ title: '记录功能开发中', icon: 'none' })
|
|
|
|
|
|
|
+ uni.showToast({ title: '积分记录功能开发中', icon: 'none' })
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 交易记录
|
|
|
|
|
+ */
|
|
|
|
|
+const handleTransactionRecord = () => {
|
|
|
|
|
+ if (!requireLogin(() => {
|
|
|
|
|
+ handleTransactionRecord()
|
|
|
|
|
+ })) {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 跳转到交易记录页面
|
|
|
|
|
+ uni.navigateTo({
|
|
|
|
|
+ url: '/pages/transaction/transaction'
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style>
|
|
<style>
|
|
|
.page-mine {
|
|
.page-mine {
|
|
|
|
|
+ height: 100vh;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
background: #f5f6fb;
|
|
background: #f5f6fb;
|
|
|
- min-height: 100vh;
|
|
|
|
|
- padding: 30rpx;
|
|
|
|
|
- box-sizing: border-box;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* User Card */
|
|
|
|
|
-.user-card {
|
|
|
|
|
|
|
+.page-title-card {
|
|
|
background: #ffffff;
|
|
background: #ffffff;
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- padding: 40rpx;
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
|
|
|
|
|
- margin-bottom: 30rpx;
|
|
|
|
|
|
|
+ padding: 30rpx 0;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
|
|
|
|
|
+ border-radius: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.avatar-container {
|
|
|
|
|
- width: 120rpx;
|
|
|
|
|
- height: 120rpx;
|
|
|
|
|
- border-radius: 50%;
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
- background-color: #eee;
|
|
|
|
|
- flex-shrink: 0;
|
|
|
|
|
- position: relative;
|
|
|
|
|
- cursor: pointer;
|
|
|
|
|
|
|
+.page-title-text {
|
|
|
|
|
+ font-size: 36rpx;
|
|
|
|
|
+ font-weight: 800;
|
|
|
|
|
+ color: #3F51F7;
|
|
|
|
|
+ letter-spacing: 2rpx;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.edit-icon {
|
|
|
|
|
- position: absolute;
|
|
|
|
|
- bottom: 0;
|
|
|
|
|
- right: 0;
|
|
|
|
|
- width: 36rpx;
|
|
|
|
|
- height: 36rpx;
|
|
|
|
|
- background: #5d55e8;
|
|
|
|
|
- border-radius: 50%;
|
|
|
|
|
|
|
+.scroll-view {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ height: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.content-wrapper {
|
|
|
|
|
+ padding: 32rpx;
|
|
|
|
|
+ background: #f5f6fb;
|
|
|
|
|
+ min-height: 100%;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 用户信息卡片 */
|
|
|
|
|
+.user-info-card {
|
|
|
|
|
+ background: #ffffff;
|
|
|
|
|
+ border-radius: 24rpx;
|
|
|
|
|
+ padding: 40rpx 32rpx;
|
|
|
|
|
+ margin-bottom: 32rpx;
|
|
|
|
|
+ box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.user-header {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- justify-content: center;
|
|
|
|
|
- font-size: 20rpx;
|
|
|
|
|
- border: 2rpx solid #fff;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.avatar {
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: 100%;
|
|
|
|
|
|
|
+.user-avatar {
|
|
|
|
|
+ width: 100rpx;
|
|
|
|
|
+ height: 100rpx;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
|
|
+ background: #f5f6fb;
|
|
|
|
|
+ margin-right: 24rpx;
|
|
|
|
|
+ border: 4rpx solid #f5f6fb;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.user-info {
|
|
|
|
|
- margin-left: 30rpx;
|
|
|
|
|
|
|
+.user-details {
|
|
|
flex: 1;
|
|
flex: 1;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.username {
|
|
|
|
|
- font-size: 36rpx;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
|
|
+.user-name {
|
|
|
|
|
+ font-size: 32rpx;
|
|
|
|
|
+ font-weight: 600;
|
|
|
color: #222222;
|
|
color: #222222;
|
|
|
- margin-bottom: 10rpx;
|
|
|
|
|
|
|
+ margin-bottom: 8rpx;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.phone {
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
- color: #999999;
|
|
|
|
|
|
|
+.arrow-icon {
|
|
|
|
|
+ font-size: 48rpx;
|
|
|
|
|
+ color: #9ca2b5;
|
|
|
|
|
+ font-weight: 300;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* Section Cards */
|
|
|
|
|
-.section-card {
|
|
|
|
|
|
|
+/* 积分区域 */
|
|
|
|
|
+.my-tasks-section {
|
|
|
background: #ffffff;
|
|
background: #ffffff;
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
|
|
+ border-radius: 24rpx;
|
|
|
|
|
+ padding: 32rpx;
|
|
|
|
|
+ margin-bottom: 32rpx;
|
|
|
box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
|
|
box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
|
|
|
- margin-bottom: 30rpx;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.card-header {
|
|
|
|
|
- background: linear-gradient(135deg, #5d55e8, #7568ff);
|
|
|
|
|
- padding: 20rpx 30rpx;
|
|
|
|
|
|
|
+.tasks-grid {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 24rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.task-item {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
|
|
+ padding: 24rpx;
|
|
|
|
|
+ background: #f7f8fc;
|
|
|
|
|
+ border-radius: 16rpx;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.header-icon-box {
|
|
|
|
|
- width: 40rpx;
|
|
|
|
|
- height: 40rpx;
|
|
|
|
|
|
|
+.task-icon-wrapper {
|
|
|
|
|
+ width: 80rpx;
|
|
|
|
|
+ height: 80rpx;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
justify-content: center;
|
|
|
- margin-right: 15rpx;
|
|
|
|
|
|
|
+ margin-right: 24rpx;
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+ box-shadow: 0 8rpx 20rpx rgba(0, 0, 0, 0.1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.header-icon-text {
|
|
|
|
|
- font-size: 32rpx;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
|
|
+.task-icon-wrapper.points {
|
|
|
|
|
+ background: linear-gradient(135deg, #00BFA5, #00D4B5);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.header-title {
|
|
|
|
|
- color: #ffffff;
|
|
|
|
|
- font-size: 32rpx;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
|
|
+.task-icon-wrapper.recharge {
|
|
|
|
|
+ background: linear-gradient(135deg, #5d55e8, #7568ff);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.task-icon-wrapper.history {
|
|
|
|
|
+ background: linear-gradient(135deg, #FF9800, #FFA726);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.card-content {
|
|
|
|
|
- padding: 30rpx;
|
|
|
|
|
- background: #fff;
|
|
|
|
|
|
|
+.task-icon {
|
|
|
|
|
+ font-size: 40rpx;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* Points Content */
|
|
|
|
|
-.points-content {
|
|
|
|
|
|
|
+.task-info {
|
|
|
|
|
+ flex: 1;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
- justify-content: space-between;
|
|
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.points-value {
|
|
|
|
|
- font-size: 32rpx;
|
|
|
|
|
|
|
+.task-label {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
color: #222222;
|
|
color: #222222;
|
|
|
font-weight: 500;
|
|
font-weight: 500;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.points-actions {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- gap: 20rpx;
|
|
|
|
|
|
|
+.task-value {
|
|
|
|
|
+ font-size: 32rpx;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ color: #00BFA5;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.mini-btn {
|
|
|
|
|
- background: linear-gradient(135deg, #5d55e8, #7568ff);
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
- padding: 10rpx 30rpx;
|
|
|
|
|
- border-radius: 30rpx;
|
|
|
|
|
- line-height: 2;
|
|
|
|
|
- margin: 0;
|
|
|
|
|
- border: none;
|
|
|
|
|
- box-shadow: 0 4rpx 12rpx rgba(93, 85, 232, 0.3);
|
|
|
|
|
|
|
+/* 菜单列表 */
|
|
|
|
|
+.menu-list {
|
|
|
|
|
+ background: #ffffff;
|
|
|
|
|
+ border-radius: 24rpx;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ box-shadow: 0 16rpx 40rpx rgba(37, 52, 94, 0.08);
|
|
|
|
|
+ margin-bottom: 32rpx;
|
|
|
}
|
|
}
|
|
|
-.mini-btn::after {
|
|
|
|
|
- border: none;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.menu-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 32rpx;
|
|
|
|
|
+ border-bottom: 1rpx solid #f5f6fb;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.menu-item:last-child {
|
|
|
|
|
+ border-bottom: none;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* Transaction Content */
|
|
|
|
|
-.transaction-content {
|
|
|
|
|
|
|
+.menu-left {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
- justify-content: center;
|
|
|
|
|
- padding: 60rpx 30rpx;
|
|
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.menu-icon {
|
|
|
|
|
+ font-size: 36rpx;
|
|
|
|
|
+ margin-right: 20rpx;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.empty-text {
|
|
|
|
|
- color: #999;
|
|
|
|
|
|
|
+.menu-label {
|
|
|
font-size: 28rpx;
|
|
font-size: 28rpx;
|
|
|
|
|
+ color: #222222;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* Bottom Action */
|
|
|
|
|
-.action-area {
|
|
|
|
|
- margin-top: 40rpx;
|
|
|
|
|
|
|
+.menu-arrow {
|
|
|
|
|
+ font-size: 40rpx;
|
|
|
|
|
+ color: #9ca2b5;
|
|
|
|
|
+ font-weight: 300;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.main-btn {
|
|
|
|
|
- background: linear-gradient(135deg, #5d55e8, #7568ff);
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- font-size: 32rpx;
|
|
|
|
|
- border-radius: 50rpx;
|
|
|
|
|
- padding: 10rpx 0;
|
|
|
|
|
|
|
+/* 退出登录按钮 */
|
|
|
|
|
+.logout-section {
|
|
|
|
|
+ margin-top: 20rpx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.logout-btn {
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
- box-shadow: 0 12rpx 24rpx rgba(93, 85, 232, 0.4);
|
|
|
|
|
- line-height: 2.5;
|
|
|
|
|
|
|
+ background: #5d55e8;
|
|
|
|
|
+ color: #ffffff;
|
|
|
|
|
+ border-radius: 16rpx;
|
|
|
|
|
+ padding: 28rpx 0;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ font-size: 30rpx;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ box-shadow: 0 12rpx 24rpx rgba(93, 85, 232, 0.3);
|
|
|
|
|
+ border: none;
|
|
|
|
|
+ line-height: 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.main-btn:active {
|
|
|
|
|
- opacity: 0.9;
|
|
|
|
|
|
|
+.logout-btn::after {
|
|
|
|
|
+ border: none;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.phone-auth-btn {
|
|
|
|
|
- background: linear-gradient(135deg, #FF9800, #FFA726);
|
|
|
|
|
- box-shadow: 0 12rpx 24rpx rgba(255, 152, 0, 0.4);
|
|
|
|
|
|
|
+.logout-btn:active {
|
|
|
|
|
+ opacity: 0.8;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.bottom-safe-area {
|
|
|
|
|
+ height: 80rpx;
|
|
|
|
|
+}
|
|
|
</style>
|
|
</style>
|