|
|
@@ -12,20 +12,11 @@
|
|
|
</view>
|
|
|
|
|
|
<!-- 性能指标卡片 -->
|
|
|
- <view class="card performance-card">
|
|
|
- <view class="performance-item">
|
|
|
- <text class="performance-label">历史成功率</text>
|
|
|
- <text class="performance-value success">88%</text>
|
|
|
- </view>
|
|
|
- <view class="performance-item">
|
|
|
- <text class="performance-label">平均收益率</text>
|
|
|
- <text class="performance-value profit">+12.5%</text>
|
|
|
- </view>
|
|
|
- <view class="performance-item">
|
|
|
- <text class="performance-label">总交易次数</text>
|
|
|
- <text class="performance-value">45</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
+ <PerformanceCard
|
|
|
+ successRate="88%"
|
|
|
+ profitRate="+12.5%"
|
|
|
+ :totalTrades="45"
|
|
|
+ />
|
|
|
|
|
|
<!-- 强势趋势池区域 -->
|
|
|
<view class="card pool-card">
|
|
|
@@ -52,10 +43,8 @@
|
|
|
</view>
|
|
|
</view>
|
|
|
<view class="stock-right">
|
|
|
- <view class="stock-actions">
|
|
|
- <view class="action-btn buy-btn" @click="addToMyStocks(stock)">
|
|
|
- <text class="action-icon">+</text>
|
|
|
- </view>
|
|
|
+ <view class="action-btn buy-btn" @click="addToMyStocks(stock)">
|
|
|
+ <text class="action-icon">+</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
@@ -63,47 +52,7 @@
|
|
|
</view>
|
|
|
|
|
|
<!-- 历史股票池回顾 -->
|
|
|
- <view class="card history-card">
|
|
|
- <view class="history-header">
|
|
|
- <text class="history-title">历史股票池回顾</text>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 月份区间选择 -->
|
|
|
- <view class="date-range-row">
|
|
|
- <picker
|
|
|
- mode="date"
|
|
|
- fields="month"
|
|
|
- :value="startMonth"
|
|
|
- @change="onStartMonthChange"
|
|
|
- class="date-picker-half"
|
|
|
- >
|
|
|
- <view class="date-input">
|
|
|
- <text class="date-text">{{ formatMonth(startMonth) }}</text>
|
|
|
- </view>
|
|
|
- </picker>
|
|
|
-
|
|
|
- <text class="date-separator">至</text>
|
|
|
-
|
|
|
- <picker
|
|
|
- mode="date"
|
|
|
- fields="month"
|
|
|
- :value="endMonth"
|
|
|
- @change="onEndMonthChange"
|
|
|
- class="date-picker-half"
|
|
|
- >
|
|
|
- <view class="date-input">
|
|
|
- <text class="date-text">{{ formatMonth(endMonth) }}</text>
|
|
|
- </view>
|
|
|
- </picker>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 查询按钮 -->
|
|
|
- <view class="history-search-button-full" @click="onHistorySearch">
|
|
|
- <text class="search-button-text">🔍 查询历史数据</text>
|
|
|
- </view>
|
|
|
-
|
|
|
- <text class="history-tip">选择时间区间,查询该期间的入池股票及表现。</text>
|
|
|
- </view>
|
|
|
+ <HistorySearchCard @search="onHistorySearch" />
|
|
|
|
|
|
<!-- 预留底部空间 -->
|
|
|
<view class="bottom-safe-area"></view>
|
|
|
@@ -111,33 +60,16 @@
|
|
|
</scroll-view>
|
|
|
|
|
|
<!-- 购买弹窗 -->
|
|
|
- <view v-if="showModal" class="modal-overlay" @click="closePurchaseModal">
|
|
|
- <view class="modal-content" @click.stop>
|
|
|
- <view class="modal-close-btn" @click="closePurchaseModal">
|
|
|
- <text class="close-icon">✕</text>
|
|
|
- </view>
|
|
|
-
|
|
|
- <view class="reward-header">
|
|
|
- <text class="reward-icon">📅</text>
|
|
|
- <text class="reward-title">年订阅解锁</text>
|
|
|
- </view>
|
|
|
-
|
|
|
- <view class="reward-info">
|
|
|
- <text class="reward-desc">订阅全年,解锁强势趋势池内容</text>
|
|
|
- <view class="reward-amount-simple">
|
|
|
- <text class="amount-label">订阅金额:</text>
|
|
|
- <text class="amount-value">¥98</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <view class="modal-footer">
|
|
|
- <view class="pay-button" @click="handlePurchase">
|
|
|
- <text class="pay-button-text">确认支付</text>
|
|
|
- </view>
|
|
|
- <text class="agreement-text">点击即表示同意《用户订阅协议》</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
+ <PurchaseModal
|
|
|
+ :visible="showModal"
|
|
|
+ icon="📅"
|
|
|
+ title="年订阅解锁"
|
|
|
+ description="订阅全年,解锁强势趋势池内容"
|
|
|
+ amountLabel="订阅金额:"
|
|
|
+ :amount="98"
|
|
|
+ @close="closePurchaseModal"
|
|
|
+ @confirm="handlePurchase"
|
|
|
+ />
|
|
|
</view>
|
|
|
</template>
|
|
|
|
|
|
@@ -146,36 +78,20 @@ import { ref } from 'vue'
|
|
|
import { onLoad, onShow } from '@dcloudio/uni-app'
|
|
|
import { isLoggedIn as checkLoginStatus } from '../../utils/auth.js'
|
|
|
import { getStockQuotes, addUserStock } from '../../utils/api.js'
|
|
|
+import PurchaseModal from '../../components/PurchaseModal.vue'
|
|
|
+import PerformanceCard from '../../components/PerformanceCard.vue'
|
|
|
+import HistorySearchCard from '../../components/HistorySearchCard.vue'
|
|
|
|
|
|
-// 购买状态
|
|
|
const isPurchased = ref(false)
|
|
|
const showModal = ref(false)
|
|
|
|
|
|
-// 股票列表数据
|
|
|
const stockList = ref([
|
|
|
- {
|
|
|
- name: '信维通信',
|
|
|
- code: '300136',
|
|
|
- },
|
|
|
- {
|
|
|
- name: '中国卫星',
|
|
|
- code: '600118',
|
|
|
- }
|
|
|
+ { name: '信维通信', code: '300136' },
|
|
|
+ { name: '中国卫星', code: '600118' }
|
|
|
])
|
|
|
|
|
|
-const startMonth = ref('2025-01') // 开始月份
|
|
|
-const endMonth = ref('2025-11') // 结束月份
|
|
|
-
|
|
|
-// 格式化月份显示
|
|
|
-const formatMonth = (monthStr) => {
|
|
|
- if (!monthStr) return '请选择'
|
|
|
- const [year, month] = monthStr.split('-')
|
|
|
- return `${year}年${month}月`
|
|
|
-}
|
|
|
-
|
|
|
// 检查购买状态
|
|
|
const checkPurchaseStatus = () => {
|
|
|
- // 先检查登录状态
|
|
|
if (!checkLoginStatus()) {
|
|
|
isPurchased.value = false
|
|
|
return
|
|
|
@@ -185,11 +101,9 @@ const checkPurchaseStatus = () => {
|
|
|
const purchaseInfo = uni.getStorageSync('strong_pool_purchase')
|
|
|
if (purchaseInfo) {
|
|
|
const now = Date.now()
|
|
|
- const expireTime = purchaseInfo.expireTime
|
|
|
- if (now < expireTime) {
|
|
|
+ if (now < purchaseInfo.expireTime) {
|
|
|
isPurchased.value = true
|
|
|
} else {
|
|
|
- // 已过期,清除购买信息
|
|
|
uni.removeStorageSync('strong_pool_purchase')
|
|
|
isPurchased.value = false
|
|
|
}
|
|
|
@@ -204,7 +118,6 @@ const checkPurchaseStatus = () => {
|
|
|
|
|
|
// 显示购买弹窗(需要登录)
|
|
|
const showPurchaseModal = () => {
|
|
|
- // 检查登录状态
|
|
|
if (!checkLoginStatus()) {
|
|
|
uni.showModal({
|
|
|
title: '登录提示',
|
|
|
@@ -213,81 +126,43 @@ const showPurchaseModal = () => {
|
|
|
cancelText: '取消',
|
|
|
success: (res) => {
|
|
|
if (res.confirm) {
|
|
|
- uni.navigateTo({
|
|
|
- url: '/pages/login/login'
|
|
|
- })
|
|
|
+ uni.navigateTo({ url: '/pages/login/login' })
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
showModal.value = true
|
|
|
}
|
|
|
|
|
|
-// 关闭购买弹窗
|
|
|
const closePurchaseModal = () => {
|
|
|
showModal.value = false
|
|
|
}
|
|
|
|
|
|
// 处理购买
|
|
|
const handlePurchase = () => {
|
|
|
- // 计算过期时间 - 年订阅365天后过期
|
|
|
const now = Date.now()
|
|
|
const expireTime = now + 365 * 24 * 60 * 60 * 1000
|
|
|
|
|
|
- // 保存购买信息
|
|
|
- const purchaseInfo = {
|
|
|
+ uni.setStorageSync('strong_pool_purchase', {
|
|
|
plan: 'yearly',
|
|
|
purchaseTime: now,
|
|
|
expireTime: expireTime
|
|
|
- }
|
|
|
- uni.setStorageSync('strong_pool_purchase', purchaseInfo)
|
|
|
+ })
|
|
|
|
|
|
- // 更新购买状态
|
|
|
isPurchased.value = true
|
|
|
-
|
|
|
- // 关闭弹窗
|
|
|
closePurchaseModal()
|
|
|
-
|
|
|
- // 显示成功提示
|
|
|
- uni.showToast({
|
|
|
- title: '解锁成功',
|
|
|
- icon: 'success'
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-// 开始月份选择变化
|
|
|
-const onStartMonthChange = (e) => {
|
|
|
- startMonth.value = e.detail.value
|
|
|
-}
|
|
|
-
|
|
|
-// 结束月份选择变化
|
|
|
-const onEndMonthChange = (e) => {
|
|
|
- endMonth.value = e.detail.value
|
|
|
+ uni.showToast({ title: '解锁成功', icon: 'success' })
|
|
|
}
|
|
|
|
|
|
// 历史查询
|
|
|
-const onHistorySearch = () => {
|
|
|
- if (!startMonth.value || !endMonth.value) {
|
|
|
- uni.showToast({
|
|
|
- title: '请选择开始和结束月份',
|
|
|
- icon: 'none'
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 验证时间区间
|
|
|
- if (startMonth.value > endMonth.value) {
|
|
|
- uni.showToast({
|
|
|
- title: '开始月份不能晚于结束月份',
|
|
|
- icon: 'none'
|
|
|
- })
|
|
|
- return
|
|
|
+const onHistorySearch = ({ startMonth, endMonth }) => {
|
|
|
+ const formatMonth = (monthStr) => {
|
|
|
+ const [year, month] = monthStr.split('-')
|
|
|
+ return `${year}年${month}月`
|
|
|
}
|
|
|
-
|
|
|
uni.showToast({
|
|
|
- title: `查询${formatMonth(startMonth.value)}至${formatMonth(endMonth.value)}`,
|
|
|
+ title: `查询${formatMonth(startMonth)}至${formatMonth(endMonth)}`,
|
|
|
icon: 'none',
|
|
|
duration: 2000
|
|
|
})
|
|
|
@@ -295,7 +170,6 @@ const onHistorySearch = () => {
|
|
|
|
|
|
// 添加到我的股票
|
|
|
const addToMyStocks = async (stock) => {
|
|
|
- // 检查登录状态
|
|
|
if (!checkLoginStatus()) {
|
|
|
uni.showModal({
|
|
|
title: '登录提示',
|
|
|
@@ -310,74 +184,50 @@ const addToMyStocks = async (stock) => {
|
|
|
})
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
try {
|
|
|
- // 显示加载提示
|
|
|
uni.showLoading({ title: '添加中...' })
|
|
|
|
|
|
- // 获取股票实时行情数据
|
|
|
let currentPrice = null
|
|
|
try {
|
|
|
const quoteRes = await getStockQuotes(stock.code)
|
|
|
- console.log('[添加股票] 行情数据:', JSON.stringify(quoteRes))
|
|
|
if (quoteRes.code === 200 && quoteRes.data && quoteRes.data.length > 0) {
|
|
|
- const quoteData = quoteRes.data[0]
|
|
|
- currentPrice = quoteData.currentPrice
|
|
|
+ currentPrice = quoteRes.data[0].currentPrice
|
|
|
}
|
|
|
} catch (e) {
|
|
|
console.error('获取行情数据失败:', e)
|
|
|
}
|
|
|
|
|
|
- // 调用后端接口保存到数据库
|
|
|
- console.log('[添加股票] 请求参数:', { stockCode: stock.code, stockName: stock.name, currentPrice })
|
|
|
const addRes = await addUserStock({
|
|
|
stockCode: stock.code,
|
|
|
stockName: stock.name,
|
|
|
currentPrice: currentPrice
|
|
|
})
|
|
|
- console.log('[添加股票] 服务器返回:', JSON.stringify(addRes))
|
|
|
|
|
|
uni.hideLoading()
|
|
|
|
|
|
if (addRes.code === 200 && addRes.data === true) {
|
|
|
- uni.showToast({
|
|
|
- title: '添加成功',
|
|
|
- icon: 'success'
|
|
|
- })
|
|
|
+ uni.showToast({ title: '添加成功', icon: 'success' })
|
|
|
} else if (addRes.code === 200 && addRes.data === false) {
|
|
|
- uni.showToast({
|
|
|
- title: '股票已存在',
|
|
|
- icon: 'none'
|
|
|
- })
|
|
|
+ uni.showToast({ title: '股票已存在', icon: 'none' })
|
|
|
} else {
|
|
|
- uni.showToast({
|
|
|
- title: addRes.message || '添加失败',
|
|
|
- icon: 'none'
|
|
|
- })
|
|
|
+ uni.showToast({ title: addRes.message || '添加失败', icon: 'none' })
|
|
|
}
|
|
|
} catch (e) {
|
|
|
uni.hideLoading()
|
|
|
console.error('添加股票失败:', e)
|
|
|
- uni.showToast({
|
|
|
- title: '添加失败',
|
|
|
- icon: 'none'
|
|
|
- })
|
|
|
+ uni.showToast({ title: '添加失败', icon: 'none' })
|
|
|
}
|
|
|
}
|
|
|
|
|
|
onLoad(() => {
|
|
|
- // 页面加载时检查登录状态和购买状态
|
|
|
- const loginStatus = checkLoginStatus()
|
|
|
- console.log('[强势池] 登录状态:', loginStatus)
|
|
|
+ console.log('[强势池] 登录状态:', checkLoginStatus())
|
|
|
checkPurchaseStatus()
|
|
|
})
|
|
|
|
|
|
onShow(() => {
|
|
|
- // 页面显示时检查登录状态和购买状态(从登录页返回时会触发)
|
|
|
- const loginStatus = checkLoginStatus()
|
|
|
- console.log('[强势池] 登录状态:', loginStatus)
|
|
|
+ console.log('[强势池] 登录状态:', checkLoginStatus())
|
|
|
checkPurchaseStatus()
|
|
|
- // 设置导航栏标题
|
|
|
uni.setNavigationBarTitle({ title: '量化交易大师' })
|
|
|
})
|
|
|
</script>
|
|
|
@@ -409,7 +259,6 @@ onShow(() => {
|
|
|
margin-bottom: 32rpx;
|
|
|
}
|
|
|
|
|
|
-/* 强势趋势池标题区域 */
|
|
|
.pool-header-section {
|
|
|
margin-bottom: 24rpx;
|
|
|
}
|
|
|
@@ -436,44 +285,64 @@ onShow(() => {
|
|
|
color: #666a7f;
|
|
|
}
|
|
|
|
|
|
-/* 性能指标卡片 */
|
|
|
-.performance-card {
|
|
|
- display: flex;
|
|
|
- justify-content: space-around;
|
|
|
- align-items: center;
|
|
|
- background: #f7f8fc;
|
|
|
- padding: 32rpx 24rpx;
|
|
|
+.pool-card {
|
|
|
+ padding: 32rpx;
|
|
|
}
|
|
|
|
|
|
-.performance-item {
|
|
|
+.locked-content {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
align-items: center;
|
|
|
+ padding: 60rpx 0 40rpx;
|
|
|
}
|
|
|
|
|
|
-.performance-label {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #666a7f;
|
|
|
- margin-bottom: 12rpx;
|
|
|
+.lock-icon-wrapper {
|
|
|
+ margin-bottom: 32rpx;
|
|
|
}
|
|
|
|
|
|
-.performance-value {
|
|
|
- font-size: 32rpx;
|
|
|
- font-weight: 700;
|
|
|
+.lock-icon {
|
|
|
+ font-size: 80rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.lock-text {
|
|
|
+ font-size: 28rpx;
|
|
|
color: #222222;
|
|
|
+ margin-bottom: 16rpx;
|
|
|
+ text-align: center;
|
|
|
}
|
|
|
|
|
|
-.performance-value.success {
|
|
|
- color: #3abf81;
|
|
|
+.lock-desc {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #9ca2b5;
|
|
|
+ margin-bottom: 48rpx;
|
|
|
+ text-align: center;
|
|
|
+ line-height: 1.6;
|
|
|
}
|
|
|
|
|
|
-.performance-value.profit {
|
|
|
- color: #f16565;
|
|
|
+.unlock-button {
|
|
|
+ width: 100%;
|
|
|
+ background: linear-gradient(135deg, #5d55e8, #7568ff);
|
|
|
+ border-radius: 16rpx;
|
|
|
+ padding: 28rpx 0;
|
|
|
+ text-align: center;
|
|
|
+ box-shadow: 0 12rpx 24rpx rgba(93, 85, 232, 0.4);
|
|
|
}
|
|
|
|
|
|
-/* 股票池卡片 */
|
|
|
-.pool-card {
|
|
|
- padding: 32rpx;
|
|
|
+.unlock-button-text {
|
|
|
+ font-size: 30rpx;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #ffffff;
|
|
|
+}
|
|
|
+
|
|
|
+.unlocked-content {
|
|
|
+ margin-top: 32rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.unlocked-tip {
|
|
|
+ font-size: 26rpx;
|
|
|
+ color: #3abf81;
|
|
|
+ margin-bottom: 24rpx;
|
|
|
+ display: block;
|
|
|
}
|
|
|
|
|
|
.stock-item {
|
|
|
@@ -495,7 +364,6 @@ onShow(() => {
|
|
|
.stock-name-row {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- margin-bottom: 12rpx;
|
|
|
}
|
|
|
|
|
|
.stock-name {
|
|
|
@@ -513,12 +381,6 @@ onShow(() => {
|
|
|
.stock-right {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- gap: 16rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.stock-actions {
|
|
|
- display: flex;
|
|
|
- gap: 12rpx;
|
|
|
}
|
|
|
|
|
|
.action-btn {
|
|
|
@@ -541,289 +403,6 @@ onShow(() => {
|
|
|
color: #ffffff;
|
|
|
}
|
|
|
|
|
|
-/* 历史股票池回顾 */
|
|
|
-.history-card {
|
|
|
- padding: 32rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.history-header {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 24rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.history-icon {
|
|
|
- font-size: 28rpx;
|
|
|
- margin-right: 12rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.history-title {
|
|
|
- font-size: 30rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #222222;
|
|
|
-}
|
|
|
-
|
|
|
-.history-search-row {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
-}
|
|
|
-
|
|
|
-.date-range-row {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- gap: 16rpx;
|
|
|
- margin-bottom: 24rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.date-picker-half {
|
|
|
- flex: 1;
|
|
|
-}
|
|
|
-
|
|
|
-.date-separator {
|
|
|
- font-size: 26rpx;
|
|
|
- color: #666a7f;
|
|
|
- padding: 0 8rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.date-input {
|
|
|
- background: #f7f8fc;
|
|
|
- border-radius: 12rpx;
|
|
|
- padding: 24rpx;
|
|
|
- font-size: 26rpx;
|
|
|
- color: #222222;
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
-}
|
|
|
-
|
|
|
-.date-text {
|
|
|
- flex: 1;
|
|
|
-}
|
|
|
-
|
|
|
-.date-icon {
|
|
|
- font-size: 28rpx;
|
|
|
- margin-left: 12rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.history-search-button-full {
|
|
|
- width: 100%;
|
|
|
- background: linear-gradient(135deg, #5d55e8, #7568ff);
|
|
|
- border-radius: 16rpx;
|
|
|
- padding: 28rpx 0;
|
|
|
- text-align: center;
|
|
|
- margin-top: 12rpx;
|
|
|
- margin-bottom: 24rpx;
|
|
|
- box-shadow: 0 8rpx 20rpx rgba(93, 85, 232, 0.3);
|
|
|
-}
|
|
|
-
|
|
|
-.search-button-text {
|
|
|
- font-size: 28rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #ffffff;
|
|
|
-}
|
|
|
-
|
|
|
-.history-tip {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #9ca2b5;
|
|
|
- line-height: 1.6;
|
|
|
-}
|
|
|
-
|
|
|
-.history-search-button {
|
|
|
- width: 80rpx;
|
|
|
- height: 80rpx;
|
|
|
- background: #5d55e8;
|
|
|
- border-radius: 12rpx;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- margin-left: 16rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.search-icon {
|
|
|
- font-size: 32rpx;
|
|
|
- color: #ffffff;
|
|
|
-}
|
|
|
-
|
|
|
-/* 弹窗样式 */
|
|
|
-.modal-overlay {
|
|
|
- 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-content {
|
|
|
- width: 640rpx;
|
|
|
- background: #ffffff;
|
|
|
- border-radius: 24rpx;
|
|
|
- padding: 48rpx 40rpx 40rpx;
|
|
|
- box-sizing: border-box;
|
|
|
- position: relative;
|
|
|
-}
|
|
|
-
|
|
|
-.modal-close-btn {
|
|
|
- position: absolute;
|
|
|
- top: 24rpx;
|
|
|
- right: 24rpx;
|
|
|
- width: 48rpx;
|
|
|
- height: 48rpx;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- z-index: 10;
|
|
|
-}
|
|
|
-
|
|
|
-.close-icon {
|
|
|
- font-size: 36rpx;
|
|
|
- color: #9ca2b5;
|
|
|
- font-weight: 300;
|
|
|
- line-height: 1;
|
|
|
-}
|
|
|
-
|
|
|
-.reward-header {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 40rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.reward-icon {
|
|
|
- font-size: 64rpx;
|
|
|
- margin-bottom: 16rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.reward-title {
|
|
|
- font-size: 32rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #222222;
|
|
|
-}
|
|
|
-
|
|
|
-.reward-info {
|
|
|
- margin-bottom: 40rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.reward-desc {
|
|
|
- display: block;
|
|
|
- font-size: 26rpx;
|
|
|
- color: #666a7f;
|
|
|
- text-align: center;
|
|
|
- margin-bottom: 24rpx;
|
|
|
- line-height: 1.6;
|
|
|
-}
|
|
|
-
|
|
|
-.reward-amount-simple {
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- gap: 8rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.amount-label {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #666a7f;
|
|
|
-}
|
|
|
-
|
|
|
-.amount-value {
|
|
|
- font-size: 36rpx;
|
|
|
- font-weight: 700;
|
|
|
- color: #f16565;
|
|
|
-}
|
|
|
-
|
|
|
-.modal-footer {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
-}
|
|
|
-
|
|
|
-.pay-button {
|
|
|
- width: 100%;
|
|
|
- background: linear-gradient(135deg, #5d55e8, #7568ff);
|
|
|
- border-radius: 16rpx;
|
|
|
- padding: 28rpx 0;
|
|
|
- text-align: center;
|
|
|
- margin-bottom: 24rpx;
|
|
|
- box-shadow: 0 8rpx 20rpx rgba(93, 85, 232, 0.3);
|
|
|
-}
|
|
|
-
|
|
|
-.pay-button-text {
|
|
|
- font-size: 30rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #ffffff;
|
|
|
-}
|
|
|
-
|
|
|
-.agreement-text {
|
|
|
- font-size: 22rpx;
|
|
|
- color: #9ca2b5;
|
|
|
-}
|
|
|
-
|
|
|
-.bottom-safe-area {
|
|
|
- height: 80rpx;
|
|
|
-}
|
|
|
-
|
|
|
-/* 锁定内容样式 */
|
|
|
-.locked-content {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
- padding: 60rpx 0 40rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.lock-icon-wrapper {
|
|
|
- margin-bottom: 32rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.locked-content .lock-icon {
|
|
|
- font-size: 80rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.lock-text {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #222222;
|
|
|
- margin-bottom: 16rpx;
|
|
|
- text-align: center;
|
|
|
-}
|
|
|
-
|
|
|
-.lock-desc {
|
|
|
- font-size: 24rpx;
|
|
|
- color: #9ca2b5;
|
|
|
- margin-bottom: 48rpx;
|
|
|
- text-align: center;
|
|
|
- line-height: 1.6;
|
|
|
-}
|
|
|
-
|
|
|
-.locked-content .unlock-button {
|
|
|
- width: 100%;
|
|
|
- background: linear-gradient(135deg, #5d55e8, #7568ff);
|
|
|
- border-radius: 16rpx;
|
|
|
- padding: 28rpx 0;
|
|
|
- text-align: center;
|
|
|
- box-shadow: 0 12rpx 24rpx rgba(93, 85, 232, 0.4);
|
|
|
-}
|
|
|
-
|
|
|
-.locked-content .unlock-button-text {
|
|
|
- font-size: 30rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #ffffff;
|
|
|
-}
|
|
|
-
|
|
|
-/* 已解锁内容样式 */
|
|
|
-.unlocked-content {
|
|
|
- margin-top: 32rpx;
|
|
|
-}
|
|
|
-
|
|
|
-.unlocked-tip {
|
|
|
- font-size: 26rpx;
|
|
|
- color: #3abf81;
|
|
|
- margin-bottom: 24rpx;
|
|
|
- display: block;
|
|
|
-}
|
|
|
-
|
|
|
.bottom-safe-area {
|
|
|
height: 80rpx;
|
|
|
}
|