|
@@ -1,155 +1,247 @@
|
|
|
<template>
|
|
<template>
|
|
|
<scroll-view class="container" scroll-y>
|
|
<scroll-view class="container" scroll-y>
|
|
|
- <!-- 当前会员状态 -->
|
|
|
|
|
- <view class="membership-card">
|
|
|
|
|
- <view class="card-header">
|
|
|
|
|
- <view class="card-header-left">
|
|
|
|
|
- <text class="card-title">我的会员</text>
|
|
|
|
|
- <text class="card-subtitle">Membership</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <text class="card-level-badge" :class="currentLevel.levelCode === 'FAMILY' ? 'badge-family' : 'badge-free'">
|
|
|
|
|
- {{ currentLevel.levelName || '免费用户' }}
|
|
|
|
|
- </text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="card-body" v-if="membership">
|
|
|
|
|
- <view class="expiry-info">
|
|
|
|
|
- <text class="label">到期时间</text>
|
|
|
|
|
- <text class="value">{{ formatDate(membership.endDate) }}</text>
|
|
|
|
|
|
|
+ <!-- 加载状态 -->
|
|
|
|
|
+ <view class="loading-wrap" v-if="loading">
|
|
|
|
|
+ <text class="loading-text">加载中...</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 错误状态 -->
|
|
|
|
|
+ <view class="error-wrap" v-if="error">
|
|
|
|
|
+ <text class="error-text">{{ error }}</text>
|
|
|
|
|
+ <button class="btn-retry" @click="loadData">重新加载</button>
|
|
|
|
|
+ </view>
|
|
|
|
|
+
|
|
|
|
|
+ <template v-if="!loading && !error">
|
|
|
|
|
+ <!-- 当前会员状态卡片 -->
|
|
|
|
|
+ <view class="membership-card">
|
|
|
|
|
+ <view class="card-header">
|
|
|
|
|
+ <view class="card-header-left">
|
|
|
|
|
+ <text class="card-title">我的会员</text>
|
|
|
|
|
+ <text class="card-subtitle">Membership</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="card-level-badge" :class="isFamilyMember ? 'badge-family' : 'badge-free'">
|
|
|
|
|
+ <text class="badge-icon">{{ isFamilyMember ? '●' : '○' }}</text>
|
|
|
|
|
+ <text class="badge-text">{{ currentLevelName }}</text>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
- <view class="days-info" v-if="membership.isActive">
|
|
|
|
|
- <text class="remaining">{{ membership.daysRemaining }}天</text>
|
|
|
|
|
- <text class="tip">剩余天数</text>
|
|
|
|
|
|
|
+ <view class="card-body" v-if="membership && membership.levelCode && membership.levelCode !== 'FREE'">
|
|
|
|
|
+ <view class="expiry-row">
|
|
|
|
|
+ <text class="expiry-label">到期时间</text>
|
|
|
|
|
+ <text class="expiry-value">{{ formatDate(membership.endDate) }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="days-remaining" v-if="membership.isActive">
|
|
|
|
|
+ <text class="days-num">{{ membership.daysRemaining || 0 }}</text>
|
|
|
|
|
+ <text class="days-unit">天剩余</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="expired-msg" v-else>
|
|
|
|
|
+ <text class="expired-text">会员已过期,请续费</text>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
- <view class="expired-tip" v-else>
|
|
|
|
|
- <text class="tip">会员已过期,请续费</text>
|
|
|
|
|
|
|
+ <view class="card-body" v-else>
|
|
|
|
|
+ <text class="free-hint">当前为免费版,升级享受更多服务</text>
|
|
|
</view>
|
|
</view>
|
|
|
|
|
+ <button class="btn-upgrade" @click="goToUpgrade">
|
|
|
|
|
+ {{ isFamilyMember ? '续费升级' : '立即升级' }}
|
|
|
|
|
+ </button>
|
|
|
</view>
|
|
</view>
|
|
|
- <view class="card-body" v-else>
|
|
|
|
|
- <text class="free-tip">您当前为免费版,升级享受更多服务</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <button class="btn-upgrade" @click="goToUpgrade">
|
|
|
|
|
- {{ currentLevel.levelCode === 'FAMILY' ? '续费升级' : '立即升级' }}
|
|
|
|
|
- </button>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
|
|
|
- <!-- 会员权益亮点 -->
|
|
|
|
|
- <view class="highlights-section">
|
|
|
|
|
- <text class="section-title">会员特权</text>
|
|
|
|
|
- <view class="highlights-grid">
|
|
|
|
|
- <view class="highlight-item" v-for="(item, idx) in highlights" :key="idx">
|
|
|
|
|
- <view class="highlight-icon" :style="'background:' + item.bg">
|
|
|
|
|
- <text class="highlight-emoji">{{ item.icon }}</text>
|
|
|
|
|
|
|
+ <!-- 会员特权亮点 -->
|
|
|
|
|
+ <view class="highlights-section">
|
|
|
|
|
+ <text class="section-title">会员特权</text>
|
|
|
|
|
+ <view class="highlights-grid">
|
|
|
|
|
+ <view class="highlight-item" v-for="(item, idx) in highlights" :key="idx">
|
|
|
|
|
+ <view class="highlight-icon" :style="'background:' + item.bg">
|
|
|
|
|
+ <text class="highlight-emoji">{{ item.icon }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <text class="highlight-name">{{ item.name }}</text>
|
|
|
|
|
+ <text class="highlight-desc">{{ item.desc }}</text>
|
|
|
</view>
|
|
</view>
|
|
|
- <text class="highlight-name">{{ item.name }}</text>
|
|
|
|
|
- <text class="highlight-desc">{{ item.desc }}</text>
|
|
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
- </view>
|
|
|
|
|
|
|
|
|
|
- <!-- 开通CTA -->
|
|
|
|
|
- <view class="cta-section" v-if="!membership || !membership.isActive">
|
|
|
|
|
- <text class="cta-title">开通家庭会员,享受全部特权</text>
|
|
|
|
|
- <text class="cta-price">{{ formatPriceWithSymbol(36500) }}/年</text>
|
|
|
|
|
- <button class="cta-btn" @click="goToUpgrade">立即开通</button>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
+ <!-- 开通CTA -->
|
|
|
|
|
+ <view class="cta-section" v-if="!membership || !membership.isActive">
|
|
|
|
|
+ <text class="cta-title">开通家庭会员,享受全部特权</text>
|
|
|
|
|
+ <text class="cta-price">{{ familyPriceText }}/年</text>
|
|
|
|
|
+ <button class="cta-btn" @click="goToUpgrade">立即开通</button>
|
|
|
|
|
+ </view>
|
|
|
|
|
|
|
|
- <!-- 会员权益 -->
|
|
|
|
|
- <view class="benefits-section">
|
|
|
|
|
- <text class="section-title">会员等级</text>
|
|
|
|
|
- <view class="benefits-grid">
|
|
|
|
|
- <view class="benefit-item" v-for="level in levels" :key="level.levelCode">
|
|
|
|
|
- <view class="benefit-header">
|
|
|
|
|
- <text class="level-name">{{ level.levelName }}</text>
|
|
|
|
|
- <text class="level-price" v-if="level.priceMonthly > 0">{{ formatPriceWithSymbol(level.priceMonthly) }}/月</text>
|
|
|
|
|
- <text class="level-price free" v-else>免费</text>
|
|
|
|
|
|
|
+ <!-- 等级对比/权益说明 -->
|
|
|
|
|
+ <view class="compare-section">
|
|
|
|
|
+ <text class="section-title">等级对比</text>
|
|
|
|
|
+ <view class="compare-table">
|
|
|
|
|
+ <view class="compare-row header-row">
|
|
|
|
|
+ <text class="compare-cell cell-feature">权益项</text>
|
|
|
|
|
+ <text class="compare-cell cell-free">免费</text>
|
|
|
|
|
+ <text class="compare-cell cell-family active">家庭会员</text>
|
|
|
</view>
|
|
</view>
|
|
|
- <view class="benefit-features">
|
|
|
|
|
- <text class="feature-tag" v-for="(feature, idx) in parseFeatures(level.features)" :key="idx">
|
|
|
|
|
- {{ feature }}
|
|
|
|
|
- </text>
|
|
|
|
|
|
|
+ <view class="compare-row" v-for="(item, idx) in compareData" :key="idx">
|
|
|
|
|
+ <text class="compare-cell cell-feature">{{ item.name }}</text>
|
|
|
|
|
+ <text class="compare-cell cell-free">{{ item.free }}</text>
|
|
|
|
|
+ <text class="compare-cell cell-family active">{{ item.family }}</text>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
- </view>
|
|
|
|
|
|
|
|
|
|
- <!-- 老师咨询授权 -->
|
|
|
|
|
- <view class="auth-section">
|
|
|
|
|
- <text class="section-title">老师咨询授权</text>
|
|
|
|
|
- <view class="auth-item" v-for="auth in authorizations" :key="auth.id">
|
|
|
|
|
- <view class="auth-info">
|
|
|
|
|
- <text class="teacher-name">{{ auth.teacherName }}</text>
|
|
|
|
|
- <text class="auth-status" :class="auth.status">{{ auth.statusText }}</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="auth-actions">
|
|
|
|
|
- <button class="btn-revoke" v-if="auth.status === 'active'" @click="revokeAuth(auth.id)">撤销</button>
|
|
|
|
|
|
|
+ <!-- 会员等级列表 -->
|
|
|
|
|
+ <view class="levels-section">
|
|
|
|
|
+ <text class="section-title">会员等级</text>
|
|
|
|
|
+ <view class="levels-list">
|
|
|
|
|
+ <view class="level-card" v-for="level in levels" :key="level.levelCode" :class="{'level-card-active': level.levelCode === currentLevelCode}">
|
|
|
|
|
+ <view class="level-header">
|
|
|
|
|
+ <view class="level-name-row">
|
|
|
|
|
+ <text class="level-name">{{ level.levelName }}</text>
|
|
|
|
|
+ <view class="level-current-tag" v-if="level.levelCode === currentLevelCode">
|
|
|
|
|
+ <text class="tag-text">当前</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <text class="level-price" v-if="level.priceMonthly > 0">{{ formatPrice(level.priceMonthly) }}/月</text>
|
|
|
|
|
+ <text class="level-price free" v-else>免费</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="level-features">
|
|
|
|
|
+ <text class="feature-tag" v-for="(feature, idx) in parseFeatures(level.features)" :key="idx">
|
|
|
|
|
+ {{ feature }}
|
|
|
|
|
+ </text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <button class="btn-level-action" v-if="level.levelCode !== currentLevelCode && level.levelCode !== 'FREE'" @click="handlePurchase(level)">
|
|
|
|
|
+ {{ level.levelCode === 'FAMILY' ? '开通' : '升级' }}
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
- <view class="no-auth" v-if="authorizations.length === 0">
|
|
|
|
|
- <text class="tip">暂无老师授权</text>
|
|
|
|
|
- <text class="desc">联系老师获取授权后,可查看孩子任务执行情况</text>
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 升级记录 -->
|
|
|
|
|
+ <view class="records-section" v-if="records && records.length > 0">
|
|
|
|
|
+ <text class="section-title">升级记录</text>
|
|
|
|
|
+ <view class="record-item" v-for="record in records" :key="record.id">
|
|
|
|
|
+ <view class="record-left">
|
|
|
|
|
+ <text class="record-level">{{ record.levelName }}</text>
|
|
|
|
|
+ <text class="record-time">{{ formatDate(record.createdAt) }}</text>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <text class="record-amount">{{ formatPrice(record.amount) }}</text>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
- </view>
|
|
|
|
|
|
|
+ </template>
|
|
|
</scroll-view>
|
|
</scroll-view>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
-import { getMembershipLevels, getMyMembership, getAuthorizations } from '../../utils/api.js'
|
|
|
|
|
|
|
+import { getMembershipLevels, getMyMembership, getCurrentLevel, getUpgradeRecords } from '../../utils/api.js'
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
data() {
|
|
data() {
|
|
|
return {
|
|
return {
|
|
|
|
|
+ loading: true,
|
|
|
|
|
+ error: '',
|
|
|
levels: [],
|
|
levels: [],
|
|
|
membership: null,
|
|
membership: null,
|
|
|
currentLevel: {},
|
|
currentLevel: {},
|
|
|
- authorizations: [],
|
|
|
|
|
|
|
+ currentLevelCode: '',
|
|
|
|
|
+ currentLevelName: '免费用户',
|
|
|
|
|
+ records: [],
|
|
|
highlights: [
|
|
highlights: [
|
|
|
{ icon: '🛒', name: '折扣购物', desc: '商品会员专享价', bg: '#FEF3C7' },
|
|
{ icon: '🛒', name: '折扣购物', desc: '商品会员专享价', bg: '#FEF3C7' },
|
|
|
{ icon: '👨👩👧👦', name: '家庭管理', desc: '多成员统一管理', bg: '#DBEAFE' },
|
|
{ icon: '👨👩👧👦', name: '家庭管理', desc: '多成员统一管理', bg: '#DBEAFE' },
|
|
|
{ icon: '💰', name: '推荐佣金', desc: '分享赚取佣金', bg: '#D1FAE5' },
|
|
{ icon: '💰', name: '推荐佣金', desc: '分享赚取佣金', bg: '#D1FAE5' },
|
|
|
{ icon: '🎪', name: '专属活动', desc: '会员优先参与', bg: '#FCE7F3' }
|
|
{ icon: '🎪', name: '专属活动', desc: '会员优先参与', bg: '#FCE7F3' }
|
|
|
|
|
+ ],
|
|
|
|
|
+ compareData: [
|
|
|
|
|
+ { name: '商品折扣', free: '普通价格', family: '会员专享价' },
|
|
|
|
|
+ { name: '家庭管理', free: '基础功能', family: '全部功能' },
|
|
|
|
|
+ { name: '推荐佣金', free: '不可参与', family: '最高15%' },
|
|
|
|
|
+ { name: '专属活动', free: '部分参与', family: '全部参与' },
|
|
|
|
|
+ { name: '成长报告', free: '月度', family: '每周+深度' },
|
|
|
|
|
+ { name: '任务配额', free: '每日5个', family: '不限量' }
|
|
|
]
|
|
]
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ computed: {
|
|
|
|
|
+ isFamilyMember() {
|
|
|
|
|
+ return this.membership && this.membership.levelCode && this.membership.levelCode !== 'FREE' && this.membership.isActive
|
|
|
|
|
+ },
|
|
|
|
|
+ familyPriceText() {
|
|
|
|
|
+ var familyLevel = this.levels.find(function(l) { return l.levelCode === 'FAMILY' })
|
|
|
|
|
+ if (familyLevel && familyLevel.priceYearly > 0) {
|
|
|
|
|
+ return this.formatPrice(familyLevel.priceYearly)
|
|
|
|
|
+ }
|
|
|
|
|
+ return '¥365.00'
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
onShow() {
|
|
onShow() {
|
|
|
this.loadData()
|
|
this.loadData()
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
async loadData() {
|
|
async loadData() {
|
|
|
|
|
+ this.loading = true
|
|
|
|
|
+ this.error = ''
|
|
|
|
|
+ var hasError = false
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
- // 获取会员等级
|
|
|
|
|
- const levelsRes = await getMembershipLevels()
|
|
|
|
|
|
|
+ var levelsRes = await getMembershipLevels()
|
|
|
this.levels = levelsRes.data || []
|
|
this.levels = levelsRes.data || []
|
|
|
-
|
|
|
|
|
- // 获取我的会员信息
|
|
|
|
|
- const membershipRes = await getMyMembership()
|
|
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('获取会员等级失败', e)
|
|
|
|
|
+ hasError = true
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ var membershipRes = await getMyMembership()
|
|
|
this.membership = membershipRes.data
|
|
this.membership = membershipRes.data
|
|
|
-
|
|
|
|
|
- // 确定当前等级
|
|
|
|
|
- if (this.membership && this.membership.levelCode) {
|
|
|
|
|
- this.currentLevel = this.levels.find(function(l) { return l.levelCode === this.membership.levelCode }.bind(this)) || {}
|
|
|
|
|
|
|
+ if (this.membership && this.membership.levelCode && this.membership.levelCode !== 'FREE') {
|
|
|
|
|
+ this.currentLevelCode = this.membership.levelCode
|
|
|
|
|
+ this.currentLevelName = this.membership.levelName || '家庭会员'
|
|
|
} else {
|
|
} else {
|
|
|
- this.currentLevel = this.levels.find(function(l) { return l.levelCode === 'FREE' }) || {}
|
|
|
|
|
|
|
+ this.currentLevelCode = 'FREE'
|
|
|
|
|
+ this.currentLevelName = '免费用户'
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 获取授权列表
|
|
|
|
|
- const authRes = await getAuthorizations()
|
|
|
|
|
- const authData = authRes.data || []
|
|
|
|
|
- this.authorizations = authData.map(function(a) {
|
|
|
|
|
- return Object.assign({}, a, {
|
|
|
|
|
- statusText: a.status === 'active' ? '已授权' : '已撤销'
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- console.error('加载数据失败', e)
|
|
|
|
|
|
|
+ console.error('获取会员信息失败', e)
|
|
|
|
|
+ this.currentLevelCode = 'FREE'
|
|
|
|
|
+ this.currentLevelName = '免费用户'
|
|
|
|
|
+ hasError = true
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ var currentRes = await getCurrentLevel()
|
|
|
|
|
+ if (currentRes.data) {
|
|
|
|
|
+ this.currentLevel = currentRes.data
|
|
|
|
|
+ if (!this.currentLevelCode || this.currentLevelCode === 'FREE') {
|
|
|
|
|
+ this.currentLevelCode = currentRes.data.levelCode || 'FREE'
|
|
|
|
|
+ this.currentLevelName = currentRes.data.levelName || '免费用户'
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('获取当前等级失败', e)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ var recordsRes = await getUpgradeRecords()
|
|
|
|
|
+ if (recordsRes.data && recordsRes.data.records) {
|
|
|
|
|
+ this.records = recordsRes.data.records
|
|
|
|
|
+ } else if (Array.isArray(recordsRes.data)) {
|
|
|
|
|
+ this.records = recordsRes.data
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('获取升级记录失败', e)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (hasError && this.levels.length === 0 && !this.membership) {
|
|
|
|
|
+ this.error = '加载失败,请重试'
|
|
|
|
|
+ }
|
|
|
|
|
+ this.loading = false
|
|
|
},
|
|
},
|
|
|
formatDate(date) {
|
|
formatDate(date) {
|
|
|
if (!date) return ''
|
|
if (!date) return ''
|
|
|
- const d = new Date(date)
|
|
|
|
|
|
|
+ var d = new Date(date)
|
|
|
return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0')
|
|
return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0')
|
|
|
},
|
|
},
|
|
|
|
|
+ formatPrice(cents) {
|
|
|
|
|
+ if (!cents && cents !== 0) return '¥0.00'
|
|
|
|
|
+ return '¥' + (cents / 100).toFixed(2)
|
|
|
|
|
+ },
|
|
|
parseFeatures(features) {
|
|
parseFeatures(features) {
|
|
|
if (!features) return []
|
|
if (!features) return []
|
|
|
|
|
+ if (Array.isArray(features)) return features
|
|
|
try {
|
|
try {
|
|
|
return JSON.parse(features)
|
|
return JSON.parse(features)
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
@@ -157,21 +249,10 @@ export default {
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
goToUpgrade() {
|
|
goToUpgrade() {
|
|
|
- uni.navigateTo({
|
|
|
|
|
- url: '/pages/membership/upgrade'
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ uni.navigateTo({ url: '/pages/membership/upgrade' })
|
|
|
},
|
|
},
|
|
|
- revokeAuth(authId) {
|
|
|
|
|
- uni.showModal({
|
|
|
|
|
- title: '撤销授权',
|
|
|
|
|
- content: '确定要撤销该老师的查看权限吗?',
|
|
|
|
|
- success: function(res) {
|
|
|
|
|
- if (res.confirm) {
|
|
|
|
|
- uni.showToast({ title: '已撤销', icon: 'success' })
|
|
|
|
|
- this.loadData()
|
|
|
|
|
- }
|
|
|
|
|
- }.bind(this)
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ handlePurchase(level) {
|
|
|
|
|
+ uni.showToast({ title: '即将上线', icon: 'none' })
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -180,262 +261,180 @@ export default {
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
.container {
|
|
.container {
|
|
|
padding: 30rpx;
|
|
padding: 30rpx;
|
|
|
|
|
+ min-height: 100vh;
|
|
|
|
|
+ background: #FFF7ED;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* ===== 加载/错误状态 ===== */
|
|
|
|
|
+.loading-wrap {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 200rpx 0;
|
|
|
|
|
+}
|
|
|
|
|
+.loading-text {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #94A3B8;
|
|
|
|
|
+}
|
|
|
|
|
+.error-wrap {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 200rpx 60rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.error-text {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #EF4444;
|
|
|
|
|
+ margin-bottom: 30rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.btn-retry {
|
|
|
|
|
+ background: #F97316;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ border-radius: 40rpx;
|
|
|
|
|
+ padding: 16rpx 48rpx;
|
|
|
|
|
+ border: none;
|
|
|
|
|
+}
|
|
|
|
|
+.btn-retry::after {
|
|
|
|
|
+ border: none;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* ===== 会员状态卡片 ===== */
|
|
|
.membership-card {
|
|
.membership-card {
|
|
|
- background: linear-gradient(135deg, #5B9BD5 0%, #3A7CC4 100%);
|
|
|
|
|
|
|
+ background: linear-gradient(135deg, #F97316 0%, #EA580C 100%);
|
|
|
border-radius: 20rpx;
|
|
border-radius: 20rpx;
|
|
|
padding: 40rpx;
|
|
padding: 40rpx;
|
|
|
margin-bottom: 30rpx;
|
|
margin-bottom: 30rpx;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.card-header {
|
|
.card-header {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.card-header-left {
|
|
.card-header-left {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.card-title {
|
|
.card-title {
|
|
|
font-size: 32rpx;
|
|
font-size: 32rpx;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
font-weight: bold;
|
|
font-weight: bold;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.card-subtitle {
|
|
.card-subtitle {
|
|
|
font-size: 20rpx;
|
|
font-size: 20rpx;
|
|
|
color: rgba(255,255,255,0.6);
|
|
color: rgba(255,255,255,0.6);
|
|
|
margin-top: 4rpx;
|
|
margin-top: 4rpx;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.card-level-badge {
|
|
.card-level-badge {
|
|
|
- font-size: 22rpx;
|
|
|
|
|
- padding: 8rpx 20rpx;
|
|
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 10rpx 24rpx;
|
|
|
border-radius: 9999rpx;
|
|
border-radius: 9999rpx;
|
|
|
- font-weight: 600;
|
|
|
|
|
|
|
+ font-size: 24rpx;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.badge-free {
|
|
.badge-free {
|
|
|
background: rgba(255,255,255,0.2);
|
|
background: rgba(255,255,255,0.2);
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.badge-family {
|
|
.badge-family {
|
|
|
- background: #FEF3C7;
|
|
|
|
|
- color: #D97706;
|
|
|
|
|
|
|
+ background: rgba(255,255,255,0.3);
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+}
|
|
|
|
|
+.badge-icon {
|
|
|
|
|
+ font-size: 20rpx;
|
|
|
|
|
+ margin-right: 8rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.badge-text {
|
|
|
|
|
+ font-weight: 600;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.card-body {
|
|
.card-body {
|
|
|
margin-top: 30rpx;
|
|
margin-top: 30rpx;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.expiry-info {
|
|
|
|
|
|
|
+.expiry-row {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.expiry-info .label {
|
|
|
|
|
|
|
+.expiry-label {
|
|
|
font-size: 26rpx;
|
|
font-size: 26rpx;
|
|
|
color: rgba(255,255,255,0.8);
|
|
color: rgba(255,255,255,0.8);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.expiry-info .value {
|
|
|
|
|
- font-size: 26rpx;
|
|
|
|
|
|
|
+.expiry-value {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
|
|
|
+ font-weight: 500;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.days-info {
|
|
|
|
|
- text-align: center;
|
|
|
|
|
|
|
+.days-remaining {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: baseline;
|
|
|
|
|
+ justify-content: center;
|
|
|
margin-top: 20rpx;
|
|
margin-top: 20rpx;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.remaining {
|
|
|
|
|
- font-size: 48rpx;
|
|
|
|
|
|
|
+.days-num {
|
|
|
|
|
+ font-size: 56rpx;
|
|
|
font-weight: bold;
|
|
font-weight: bold;
|
|
|
- color: #FFD700;
|
|
|
|
|
|
|
+ color: #FEF3C7;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.days-info .tip {
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
|
|
+.days-unit {
|
|
|
|
|
+ font-size: 26rpx;
|
|
|
color: rgba(255,255,255,0.7);
|
|
color: rgba(255,255,255,0.7);
|
|
|
- display: block;
|
|
|
|
|
|
|
+ margin-left: 8rpx;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.expired-tip {
|
|
|
|
|
|
|
+.expired-msg {
|
|
|
text-align: center;
|
|
text-align: center;
|
|
|
- margin-top: 20rpx;
|
|
|
|
|
|
|
+ margin-top: 16rpx;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.expired-tip .tip {
|
|
|
|
|
- color: #FFD700;
|
|
|
|
|
|
|
+.expired-text {
|
|
|
font-size: 26rpx;
|
|
font-size: 26rpx;
|
|
|
|
|
+ color: #FEF3C7;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-.free-tip {
|
|
|
|
|
|
|
+.free-hint {
|
|
|
font-size: 26rpx;
|
|
font-size: 26rpx;
|
|
|
- color: rgba(255,255,255,0.8);
|
|
|
|
|
|
|
+ color: rgba(255,255,255,0.85);
|
|
|
text-align: center;
|
|
text-align: center;
|
|
|
|
|
+ display: block;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.btn-upgrade {
|
|
.btn-upgrade {
|
|
|
margin-top: 30rpx;
|
|
margin-top: 30rpx;
|
|
|
background: #FFD700;
|
|
background: #FFD700;
|
|
|
color: #333;
|
|
color: #333;
|
|
|
border-radius: 40rpx;
|
|
border-radius: 40rpx;
|
|
|
font-size: 28rpx;
|
|
font-size: 28rpx;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ border: none;
|
|
|
|
|
+}
|
|
|
|
|
+.btn-upgrade::after {
|
|
|
|
|
+ border: none;
|
|
|
|
|
+}
|
|
|
|
|
+.btn-upgrade:active {
|
|
|
|
|
+ opacity: 0.9;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.benefits-section {
|
|
|
|
|
|
|
+/* ===== 会员特权亮点 ===== */
|
|
|
|
|
+.highlights-section {
|
|
|
background: #fff;
|
|
background: #fff;
|
|
|
border-radius: 20rpx;
|
|
border-radius: 20rpx;
|
|
|
padding: 30rpx;
|
|
padding: 30rpx;
|
|
|
margin-bottom: 30rpx;
|
|
margin-bottom: 30rpx;
|
|
|
|
|
+ box-shadow: 0 2rpx 12rpx rgba(249,115,22,0.08);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
.section-title {
|
|
.section-title {
|
|
|
font-size: 32rpx;
|
|
font-size: 32rpx;
|
|
|
font-weight: bold;
|
|
font-weight: bold;
|
|
|
- color: #333;
|
|
|
|
|
- display: block;
|
|
|
|
|
- margin-bottom: 20rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.benefits-grid {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-direction: column;
|
|
|
|
|
- gap: 20rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.benefit-item {
|
|
|
|
|
- border: 1rpx solid #eee;
|
|
|
|
|
- border-radius: 10rpx;
|
|
|
|
|
- padding: 20rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.benefit-header {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- justify-content: space-between;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.level-name {
|
|
|
|
|
- font-size: 28rpx;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
- color: #333;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.level-price {
|
|
|
|
|
- font-size: 26rpx;
|
|
|
|
|
- color: #5B9BD5;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.level-price.free {
|
|
|
|
|
- color: #52C41A;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.benefit-features {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-wrap: wrap;
|
|
|
|
|
- gap: 10rpx;
|
|
|
|
|
- margin-top: 15rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.feature-tag {
|
|
|
|
|
- font-size: 22rpx;
|
|
|
|
|
- padding: 6rpx 16rpx;
|
|
|
|
|
- background: #f5f5f5;
|
|
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- color: #666;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.auth-section {
|
|
|
|
|
- background: #fff;
|
|
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- padding: 30rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.auth-item {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- justify-content: space-between;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- padding: 20rpx 0;
|
|
|
|
|
- border-bottom: 1rpx solid #f0f0f0;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.auth-item:last-child {
|
|
|
|
|
- border-bottom: none;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.auth-info {
|
|
|
|
|
- flex: 1;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.teacher-name {
|
|
|
|
|
- font-size: 28rpx;
|
|
|
|
|
- color: #333;
|
|
|
|
|
- display: block;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.auth-status {
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
- color: #999;
|
|
|
|
|
- margin-top: 8rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.auth-status.active {
|
|
|
|
|
- color: #52C41A;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.btn-revoke {
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
- padding: 10rpx 20rpx;
|
|
|
|
|
- background: #FF4D4F;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- border-radius: 10rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.no-auth {
|
|
|
|
|
- text-align: center;
|
|
|
|
|
- padding: 40rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.no-auth .tip {
|
|
|
|
|
- font-size: 28rpx;
|
|
|
|
|
- color: #999;
|
|
|
|
|
- display: block;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.no-auth .desc {
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
- color: #ccc;
|
|
|
|
|
- margin-top: 10rpx;
|
|
|
|
|
|
|
+ color: #1E293B;
|
|
|
display: block;
|
|
display: block;
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-/* ===== 权益亮点 ===== */
|
|
|
|
|
-.highlights-section {
|
|
|
|
|
- background: #fff;
|
|
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- padding: 30rpx;
|
|
|
|
|
- margin-bottom: 30rpx;
|
|
|
|
|
|
|
+ margin-bottom: 24rpx;
|
|
|
}
|
|
}
|
|
|
.highlights-grid {
|
|
.highlights-grid {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
flex-wrap: wrap;
|
|
|
- gap: 20rpx;
|
|
|
|
|
}
|
|
}
|
|
|
.highlight-item {
|
|
.highlight-item {
|
|
|
- width: calc(50% - 10rpx);
|
|
|
|
|
|
|
+ width: 50%;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
padding: 24rpx 16rpx;
|
|
padding: 24rpx 16rpx;
|
|
|
- background: #FFF7ED;
|
|
|
|
|
- border-radius: 16rpx;
|
|
|
|
|
box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
|
}
|
|
}
|
|
|
.highlight-icon {
|
|
.highlight-icon {
|
|
@@ -496,4 +495,191 @@ export default {
|
|
|
.cta-btn::after {
|
|
.cta-btn::after {
|
|
|
border: none;
|
|
border: none;
|
|
|
}
|
|
}
|
|
|
|
|
+.cta-btn:active {
|
|
|
|
|
+ opacity: 0.9;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* ===== 等级对比表 ===== */
|
|
|
|
|
+.compare-section {
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ border-radius: 20rpx;
|
|
|
|
|
+ padding: 30rpx;
|
|
|
|
|
+ margin-bottom: 30rpx;
|
|
|
|
|
+ box-shadow: 0 2rpx 12rpx rgba(249,115,22,0.08);
|
|
|
|
|
+}
|
|
|
|
|
+.compare-table {
|
|
|
|
|
+ border-radius: 16rpx;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ border: 1rpx solid #FED7AA;
|
|
|
|
|
+}
|
|
|
|
|
+.compare-row {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ border-bottom: 1rpx solid #FED7AA;
|
|
|
|
|
+}
|
|
|
|
|
+.compare-row:last-child {
|
|
|
|
|
+ border-bottom: none;
|
|
|
|
|
+}
|
|
|
|
|
+.header-row {
|
|
|
|
|
+ background: #FFF7ED;
|
|
|
|
|
+}
|
|
|
|
|
+.compare-cell {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ padding: 20rpx 16rpx;
|
|
|
|
|
+ font-size: 26rpx;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+}
|
|
|
|
|
+.cell-feature {
|
|
|
|
|
+ flex: 1.5;
|
|
|
|
|
+ color: #1E293B;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ justify-content: flex-start;
|
|
|
|
|
+}
|
|
|
|
|
+.cell-free {
|
|
|
|
|
+ color: #94A3B8;
|
|
|
|
|
+}
|
|
|
|
|
+.cell-family.active {
|
|
|
|
|
+ color: #F97316;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+}
|
|
|
|
|
+.header-row .compare-cell {
|
|
|
|
|
+ font-size: 24rpx;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #64748B;
|
|
|
|
|
+}
|
|
|
|
|
+.header-row .cell-family.active {
|
|
|
|
|
+ color: #F97316;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* ===== 会员等级列表 ===== */
|
|
|
|
|
+.levels-section {
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ border-radius: 20rpx;
|
|
|
|
|
+ padding: 30rpx;
|
|
|
|
|
+ margin-bottom: 30rpx;
|
|
|
|
|
+ box-shadow: 0 2rpx 12rpx rgba(249,115,22,0.08);
|
|
|
|
|
+}
|
|
|
|
|
+.levels-list {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+}
|
|
|
|
|
+.level-card {
|
|
|
|
|
+ border: 1rpx solid #FED7AA;
|
|
|
|
|
+ border-radius: 16rpx;
|
|
|
|
|
+ padding: 24rpx 32rpx;
|
|
|
|
|
+ margin-bottom: 20rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.level-card:last-child {
|
|
|
|
|
+ margin-bottom: 0;
|
|
|
|
|
+}
|
|
|
|
|
+.level-card-active {
|
|
|
|
|
+ border-color: #F97316;
|
|
|
|
|
+ background: #FFF7ED;
|
|
|
|
|
+}
|
|
|
|
|
+.level-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+}
|
|
|
|
|
+.level-name-row {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+}
|
|
|
|
|
+.level-name {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ color: #1E293B;
|
|
|
|
|
+}
|
|
|
|
|
+.level-current-tag {
|
|
|
|
|
+ margin-left: 12rpx;
|
|
|
|
|
+ background: #F97316;
|
|
|
|
|
+ border-radius: 9999rpx;
|
|
|
|
|
+ padding: 4rpx 16rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.tag-text {
|
|
|
|
|
+ font-size: 20rpx;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+}
|
|
|
|
|
+.level-price {
|
|
|
|
|
+ font-size: 26rpx;
|
|
|
|
|
+ color: #F97316;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+}
|
|
|
|
|
+.level-price.free {
|
|
|
|
|
+ color: #10B981;
|
|
|
|
|
+}
|
|
|
|
|
+.level-features {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
+ margin-top: 16rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.feature-tag {
|
|
|
|
|
+ font-size: 22rpx;
|
|
|
|
|
+ padding: 6rpx 16rpx;
|
|
|
|
|
+ background: #FFF7ED;
|
|
|
|
|
+ border-radius: 20rpx;
|
|
|
|
|
+ color: #64748B;
|
|
|
|
|
+ margin-right: 10rpx;
|
|
|
|
|
+ margin-bottom: 8rpx;
|
|
|
|
|
+}
|
|
|
|
|
+.level-card-active .feature-tag {
|
|
|
|
|
+ background: #FEF3C7;
|
|
|
|
|
+ color: #92400E;
|
|
|
|
|
+}
|
|
|
|
|
+.btn-level-action {
|
|
|
|
|
+ margin-top: 16rpx;
|
|
|
|
|
+ background: linear-gradient(135deg, #F97316 0%, #EA580C 100%);
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ font-size: 26rpx;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ border-radius: 40rpx;
|
|
|
|
|
+ padding: 12rpx 0;
|
|
|
|
|
+ border: none;
|
|
|
|
|
+}
|
|
|
|
|
+.btn-level-action::after {
|
|
|
|
|
+ border: none;
|
|
|
|
|
+}
|
|
|
|
|
+.btn-level-action:active {
|
|
|
|
|
+ opacity: 0.9;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* ===== 升级记录 ===== */
|
|
|
|
|
+.records-section {
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ border-radius: 20rpx;
|
|
|
|
|
+ padding: 30rpx;
|
|
|
|
|
+ margin-bottom: 30rpx;
|
|
|
|
|
+ box-shadow: 0 2rpx 12rpx rgba(249,115,22,0.08);
|
|
|
|
|
+}
|
|
|
|
|
+.record-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 20rpx 0;
|
|
|
|
|
+ border-bottom: 1rpx solid #FED7AA;
|
|
|
|
|
+}
|
|
|
|
|
+.record-item:last-child {
|
|
|
|
|
+ border-bottom: none;
|
|
|
|
|
+}
|
|
|
|
|
+.record-left {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+}
|
|
|
|
|
+.record-level {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #1E293B;
|
|
|
|
|
+ display: block;
|
|
|
|
|
+}
|
|
|
|
|
+.record-time {
|
|
|
|
|
+ font-size: 22rpx;
|
|
|
|
|
+ color: #94A3B8;
|
|
|
|
|
+ margin-top: 4rpx;
|
|
|
|
|
+ display: block;
|
|
|
|
|
+}
|
|
|
|
|
+.record-amount {
|
|
|
|
|
+ font-size: 30rpx;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ color: #F97316;
|
|
|
|
|
+}
|
|
|
</style>
|
|
</style>
|