V1.6: Zodiac Share Logic, Back Button Fix, Points UI Polish
This commit is contained in:
parent
9292e8dc0f
commit
2b532c0116
54
app.js
54
app.js
|
|
@ -1,5 +1,53 @@
|
||||||
App({
|
App({
|
||||||
onLaunch() {
|
|
||||||
console.log('小程序启动啦!')
|
onShow: function (options) {
|
||||||
|
|
||||||
|
// 检查是否从分享卡片进入 (场景值 1007, 1008)
|
||||||
|
if (options && (options.scene === 1007 || options.scene === 1008)) {
|
||||||
|
|
||||||
|
console.log('[App] 用户通过分享卡片进入');
|
||||||
|
|
||||||
|
// 获取来源用户ID(保留结构,暂不使用)
|
||||||
|
const fromUserId = options.query && options.query.fromUserId;
|
||||||
|
if (fromUserId) {
|
||||||
|
console.log('[App] 来源用户ID:', fromUserId);
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
// 只做欢迎提示,不发积分
|
||||||
|
wx.showToast({
|
||||||
|
title: '欢迎进入今日命运场 ✨',
|
||||||
|
icon: 'none',
|
||||||
|
duration: 2000
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onLaunch: function () {
|
||||||
|
|
||||||
|
console.log('小程序启动啦!');
|
||||||
|
|
||||||
|
// 检查隐私协议同意状态
|
||||||
|
const agreed = wx.getStorageSync('privacyAgreed');
|
||||||
|
|
||||||
|
if (!agreed) {
|
||||||
|
|
||||||
|
wx.onAppRoute((res) => {
|
||||||
|
|
||||||
|
const isAgreed = wx.getStorageSync('privacyAgreed');
|
||||||
|
if (isAgreed) return;
|
||||||
|
|
||||||
|
if (res.path !== 'pages/privacy-agree/privacy-agree' &&
|
||||||
|
res.path !== 'pages/privacy/privacy') {
|
||||||
|
|
||||||
|
wx.reLaunch({
|
||||||
|
url: '/pages/privacy-agree/privacy-agree'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
wx.reLaunch({
|
||||||
|
url: '/pages/privacy-agree/privacy-agree'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
11
app.json
11
app.json
|
|
@ -1,15 +1,22 @@
|
||||||
{
|
{
|
||||||
"pages": [
|
"pages": [
|
||||||
"pages/home/home",
|
"pages/home/home",
|
||||||
|
"pages/zodiac/index",
|
||||||
"pages/index/index",
|
"pages/index/index",
|
||||||
"pages/knowledge/index",
|
"pages/knowledge/index",
|
||||||
"pages/knowledge/list",
|
"pages/knowledge/list",
|
||||||
"pages/knowledge/article",
|
"pages/knowledge/article",
|
||||||
"pages/webview/index",
|
"pages/webview/index",
|
||||||
"pages/privacy/privacy"
|
"pages/privacy/privacy",
|
||||||
|
"pages/privacy-agree/privacy-agree",
|
||||||
|
"pages/settings/settings",
|
||||||
|
"pages/user-agreement/user-agreement"
|
||||||
],
|
],
|
||||||
"window": {
|
"window": {
|
||||||
"navigationBarTitleText": "我的第一个小程序"
|
"navigationBarTitleText": "塔罗星语",
|
||||||
|
"navigationBarBackgroundColor": "#1a1a2e",
|
||||||
|
"navigationBarTextStyle": "white",
|
||||||
|
"backgroundColor": "#1a1a2e"
|
||||||
},
|
},
|
||||||
"style": "v2",
|
"style": "v2",
|
||||||
"sitemapLocation": "sitemap.json"
|
"sitemapLocation": "sitemap.json"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,105 @@
|
||||||
|
Component({
|
||||||
|
properties: {
|
||||||
|
spread: { type: Object, value: null },
|
||||||
|
cards: { type: Array, value: [] },
|
||||||
|
revealedCount: { type: Number, value: 0 },
|
||||||
|
cardWidth: { type: Number, value: 160 } // 安全默认值 160
|
||||||
|
},
|
||||||
|
|
||||||
|
data: {
|
||||||
|
displayList: [] // 统一渲染列表 (merged with layout info)
|
||||||
|
},
|
||||||
|
|
||||||
|
lifetimes: {
|
||||||
|
attached() {
|
||||||
|
this.updateLayout();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
observers: {
|
||||||
|
'spread, cards, cardWidth': function (spread, cards, cardWidth) {
|
||||||
|
this.updateLayout();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
updateLayout() {
|
||||||
|
const { spread, cards, cardWidth } = this.data;
|
||||||
|
if (!spread || !spread.layout || !cards || cards.length === 0) return;
|
||||||
|
|
||||||
|
const layoutType = spread.layout.type;
|
||||||
|
|
||||||
|
// 1. Grid 处理 (简单网格布局,不涉及复杂计算)
|
||||||
|
if (layoutType === 'grid') {
|
||||||
|
const list = cards.map((c, i) => ({
|
||||||
|
...c,
|
||||||
|
_posName: spread.positions[i],
|
||||||
|
_seq: i + 1,
|
||||||
|
_index: i,
|
||||||
|
_style: '' // 无内联样式,交给 grid CSS
|
||||||
|
}));
|
||||||
|
this.setData({ displayList: list });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Celtic Cross (静止百分比布局 - 600x900rpx 容器适配)
|
||||||
|
if (layoutType === 'celtic') {
|
||||||
|
// 容器: 600rpx x 900rpx
|
||||||
|
// 卡牌: 140rpx x 210rpx
|
||||||
|
// 安全水平间距: 140/600 = 23.3% -> 中心间距需 > 23.3%
|
||||||
|
// 安全垂直间距: 210/900 = 23.3% -> 中心间距需 > 23.3%
|
||||||
|
|
||||||
|
// 中轴 X: 38% (228rpx) - 左移给右侧列留空间
|
||||||
|
// 左牌 X: 38% - 25% = 13% (78rpx) - 安全
|
||||||
|
// 右牌 X: 38% + 25% = 63% (378rpx) - 安全
|
||||||
|
// 右侧列 X: 85% (510rpx) - 离右牌 22% = 132rpx > 140rpx 略挤,调整到 87%
|
||||||
|
|
||||||
|
const positions = [
|
||||||
|
{ left: 38, top: 47 }, // 1 现状
|
||||||
|
{ left: 38, top: 47, rotate: 'rotate(90deg)' }, // 2 阻碍 (重叠)
|
||||||
|
{ left: 38, top: 73 }, // 3 根基 (47+26=73)
|
||||||
|
{ left: 13, top: 47 }, // 4 过去
|
||||||
|
{ left: 38, top: 21 }, // 5 可能性 (47-26=21)
|
||||||
|
{ left: 63, top: 47 }, // 6 近期未来
|
||||||
|
|
||||||
|
// 右侧列 X: 87%, 纵向间距 ~22% of 900 = 198rpx > 210rpx 略挤
|
||||||
|
// 调整为 4 张牌均匀分布在 10%-90% 之间
|
||||||
|
// 间距: (90-10)/3 = 26.7% = 240rpx > 210rpx ✓
|
||||||
|
{ left: 87, top: 15 }, // 7 你的态度
|
||||||
|
{ left: 87, top: 38 }, // 8 外部影响 (15+23=38)
|
||||||
|
{ left: 87, top: 61 }, // 9 希望与恐惧 (38+23=61)
|
||||||
|
{ left: 87, top: 84 }, // 10 最终结果 (61+23=84)
|
||||||
|
];
|
||||||
|
|
||||||
|
// Merge Layout + Card Data
|
||||||
|
const list = cards.map((c, i) => {
|
||||||
|
const pos = positions[i] || {};
|
||||||
|
// 直接生成内联样式,移除所有动态计算
|
||||||
|
const style = `left: ${pos.left}%; top: ${pos.top}%; transform: translate(-50%, -50%) ${pos.rotate || ''};`;
|
||||||
|
|
||||||
|
return {
|
||||||
|
...c,
|
||||||
|
_posName: spread.positions[i],
|
||||||
|
_seq: i + 1,
|
||||||
|
_index: i,
|
||||||
|
_style: style
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
this.setData({ displayList: list });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 移除多余的 calcCelticLayout 方法,直接在 updateLayout 中处理
|
||||||
|
handleCardTap(e) {
|
||||||
|
const idx = e.currentTarget.dataset.index;
|
||||||
|
if (idx === undefined) return;
|
||||||
|
|
||||||
|
if (idx === this.data.revealedCount) {
|
||||||
|
this.triggerEvent('reveal', { index: idx });
|
||||||
|
} else if (idx < this.data.revealedCount) {
|
||||||
|
this.triggerEvent('viewDetail', { index: idx });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"component": true,
|
||||||
|
"usingComponents": {}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,82 @@
|
||||||
|
<!-- components/spread-container/spread-container.wxml -->
|
||||||
|
|
||||||
|
<!-- 1. 卡牌单元模板 -->
|
||||||
|
<template name="card-item">
|
||||||
|
<view class="card-slot" style="{{extraStyle}}" bindtap="handleCardTap" data-index="{{card._index}}">
|
||||||
|
|
||||||
|
<!-- 位置信息 -->
|
||||||
|
<view class="pos-info">
|
||||||
|
<text class="pos-name">{{card._posName}}</text>
|
||||||
|
<!-- <text class="pos-seq">NO.{{card._seq}}</text> -->
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 翻牌场景 -->
|
||||||
|
<view class="flip-scene">
|
||||||
|
<view class="flip-card {{card._index < revealedCount ? 'flipped' : ''}}">
|
||||||
|
<!-- 背面 -->
|
||||||
|
<view class="card-face face-back">
|
||||||
|
<image class="card-image" src="/images/beimian.png" mode="aspectFit" />
|
||||||
|
</view>
|
||||||
|
<!-- 正面 -->
|
||||||
|
<view class="card-face face-front">
|
||||||
|
<image
|
||||||
|
class="card-image {{card.isReversed ? 'reversed' : ''}}"
|
||||||
|
src="{{card.image}}"
|
||||||
|
mode="aspectFit"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 牌名称 (翻开后显示) -->
|
||||||
|
<text class="card-name-sm" wx:if="{{card._index < revealedCount}}">{{card.name}}</text>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<view class="spread-wrapper {{spread.layout.type === 'celtic' ? 'celtic-mode' : ''}}">
|
||||||
|
|
||||||
|
<!-- =========================================
|
||||||
|
布局 1: Grid (网格)
|
||||||
|
直接遍历 displayList,无特殊定位
|
||||||
|
========================================= -->
|
||||||
|
<view class="layout-grid" wx:if="{{spread.layout.type === 'grid'}}">
|
||||||
|
<block wx:for="{{displayList}}" wx:key="_index">
|
||||||
|
<template is="card-item" data="{{card: item, revealedCount: revealedCount, extraStyle: ''}}" />
|
||||||
|
</block>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- =========================================
|
||||||
|
布局 2: Celtic Cross (舞台模式 - 600x900rpx)
|
||||||
|
使用 displayList 中的 _style 进行绝对定位
|
||||||
|
========================================= -->
|
||||||
|
<view class="spread-container" wx:if="{{spread.layout.type === 'celtic'}}">
|
||||||
|
<block wx:for="{{displayList}}" wx:key="_index">
|
||||||
|
<view class="stage-card" style="{{item._style}}" bindtap="handleCardTap" data-index="{{item._index}}">
|
||||||
|
<!-- 复用 card-item 内部结构,但不使用 template 以避免 style 冲突 -->
|
||||||
|
<view class="card-slot">
|
||||||
|
<view class="pos-info">
|
||||||
|
<text class="pos-name">{{item._posName}}</text>
|
||||||
|
</view>
|
||||||
|
<view class="flip-scene">
|
||||||
|
<view class="flip-card {{item._index < revealedCount ? 'flipped' : ''}}">
|
||||||
|
<view class="card-face face-back">
|
||||||
|
<image class="card-image" src="/images/beimian.png" mode="aspectFit" />
|
||||||
|
</view>
|
||||||
|
<view class="card-face face-front">
|
||||||
|
<image
|
||||||
|
class="card-image {{item.isReversed ? 'reversed' : ''}}"
|
||||||
|
src="{{item.image}}"
|
||||||
|
mode="aspectFit"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<text class="card-name-sm" wx:if="{{item._index < revealedCount}}">{{item.name}}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</block>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
</view>
|
||||||
|
|
@ -0,0 +1,165 @@
|
||||||
|
/* components/spread-container/spread-container.wxss */
|
||||||
|
|
||||||
|
/* 通用容器 */
|
||||||
|
.spread-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 40rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
卡牌单元 (Card Item)
|
||||||
|
========================================= */
|
||||||
|
.card-slot {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
/* 默认尺寸,grid 布局使用 */
|
||||||
|
width: 124rpx;
|
||||||
|
margin-bottom: 24rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 翻牌场景 */
|
||||||
|
.flip-scene {
|
||||||
|
width: 100%;
|
||||||
|
/* 保持 160:260 比例 -> 1:1.625 */
|
||||||
|
/* 或 124:200 -> 1:1.61 */
|
||||||
|
aspect-ratio: 2/3;
|
||||||
|
perspective: 1000rpx;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flip-card {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
transition: transform 0.6s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flip-card.flipped {
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-face {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
backface-visibility: hidden;
|
||||||
|
border-radius: 12rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.face-front {
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-image {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-image.reversed {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 文字信息 */
|
||||||
|
.pos-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 8rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pos-name {
|
||||||
|
font-size: 22rpx;
|
||||||
|
color: #ddd;
|
||||||
|
line-height: 1.2;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pos-seq {
|
||||||
|
font-size: 18rpx;
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-name-sm {
|
||||||
|
font-size: 20rpx;
|
||||||
|
color: #fff;
|
||||||
|
margin-top: 8rpx;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 120%;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
布局 1: Grid (网格)
|
||||||
|
========================================= */
|
||||||
|
.layout-grid {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 30rpx;
|
||||||
|
padding: 40rpx 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
布局系统 2: Celtic Cross (从零重构 - 绝对锁定)
|
||||||
|
========================================= */
|
||||||
|
|
||||||
|
/* 1. 全屏垂直水平居中包装器 (仅 celtic 模式) */
|
||||||
|
.spread-wrapper.celtic-mode {
|
||||||
|
width: 100%;
|
||||||
|
/* 高度设为 100vh 可能会导致不可滚动,这里视情况调整 */
|
||||||
|
/* 用户虽然要求 100vh,但在小程序组件中可能会溢出,建议 min-height */
|
||||||
|
min-height: 80vh;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 2. 核心容器 (600x900rpx) */
|
||||||
|
.spread-container {
|
||||||
|
position: relative;
|
||||||
|
width: 600rpx;
|
||||||
|
height: 900rpx;
|
||||||
|
/* 调试辅助: border: 1px dashed rgba(255,255,255,0.2); */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 3. 卡牌通用样式 (绝对定位 + 居中) */
|
||||||
|
.stage-card {
|
||||||
|
position: absolute;
|
||||||
|
transform: translate(-50%, -50%); /* 核心锚点居中 */
|
||||||
|
z-index: 10;
|
||||||
|
width: 140rpx; /* 适配 600rpx 容器的推荐尺寸 */
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column; /* 确保文字在下方 */
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 复写卡牌槽样式以匹配新容器 */
|
||||||
|
.spread-container .card-slot {
|
||||||
|
width: 100%; /* 跟随 stage-card */
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spread-container .flip-scene {
|
||||||
|
width: 100%;
|
||||||
|
height: 210rpx; /* 强制高度 (140 * 1.5) */
|
||||||
|
background: rgba(255, 255, 255, 0.1); /* 调试背景,确保占位可见 */
|
||||||
|
border-radius: 8rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spread-container .card-face {
|
||||||
|
background: #1a1a2e; /* 默认深色背景,防图挂 */
|
||||||
|
border: 1px solid rgba(255,255,255,0.2); /* 边框 */
|
||||||
|
}
|
||||||
|
|
@ -2,15 +2,28 @@ const { getPoints, checkDailyReward, canWatchAd, getTodayAdCount, rewardFromAd,
|
||||||
const { getDailyAdvice } = require('../../utils/dailyAdvice');
|
const { getDailyAdvice } = require('../../utils/dailyAdvice');
|
||||||
const { getDailyArticle, getCategories } = require('../../utils/knowledgeData');
|
const { getDailyArticle, getCategories } = require('../../utils/knowledgeData');
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 🔧 开发模式配置
|
* 🔧 广告功能开关 (上线前配置)
|
||||||
*
|
*
|
||||||
* DEV_MODE = true: 使用模拟广告(开发测试)
|
* 1. ENABLE_AD (总开关):
|
||||||
* DEV_MODE = false: 使用真实广告(正式上线)
|
* - true: 开启广告功能
|
||||||
|
* - false: 关闭广告功能 (隐藏按钮, 点击提示"即将上线")
|
||||||
*
|
*
|
||||||
* ⚠️ 上线前务必改为 false!
|
* 2. DEV_MODE (开发模式):
|
||||||
|
* - true: 使用模拟广告 (不拉起微信广告, 直接发奖励)
|
||||||
|
* - false: 使用真实广告 (拉起微信广告组件)
|
||||||
|
*
|
||||||
|
* ⚠️ 上线前:
|
||||||
|
* - 确保已开通流量主并填入真实 ID
|
||||||
|
* - 将 DEV_MODE 改为 false
|
||||||
|
* - 将 ENABLE_AD 改为 true
|
||||||
*/
|
*/
|
||||||
const DEV_MODE = true; // 👈 开发时设为 true,上线前改为 false
|
const ENABLE_AD = false; // 👈 暂时关闭广告功能
|
||||||
|
const DEV_MODE = true; // 👈 开发测试模式
|
||||||
|
|
||||||
|
// 积分系统开关 (即便 ENABLE_AD 为 true, 如果此开关为 false, UI 也不显示积分)
|
||||||
|
const ENABLE_POINTS_UI = true;
|
||||||
|
|
||||||
Page({
|
Page({
|
||||||
data: {
|
data: {
|
||||||
|
|
@ -24,7 +37,7 @@ Page({
|
||||||
categoryName: '',
|
categoryName: '',
|
||||||
type: 'local'
|
type: 'local'
|
||||||
},
|
},
|
||||||
energyVisible: false,
|
showAdButton: ENABLE_AD, // 控制广告按钮显示
|
||||||
knowledgeVisible: false
|
knowledgeVisible: false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -36,14 +49,29 @@ Page({
|
||||||
this.initRewardedAd();
|
this.initRewardedAd();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// ... (keeping other methods)
|
||||||
|
|
||||||
|
// 跳转到星座模块
|
||||||
|
goToZodiac: function () {
|
||||||
|
wx.navigateTo({
|
||||||
|
url: '/pages/zodiac/index'
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 初始化激励视频广告
|
* 初始化激励视频广告
|
||||||
* ⚠️ 需要在微信公众平台开通流量主并获取广告位ID
|
* ⚠️ 需要在微信公众平台开通流量主并获取广告位ID
|
||||||
*/
|
*/
|
||||||
initRewardedAd: function () {
|
initRewardedAd: function () {
|
||||||
// 🔧 开发模式:跳过真实广告初始化
|
// 1. 如果广告功能关闭,直接返回
|
||||||
|
if (!ENABLE_AD) {
|
||||||
|
console.log('[广告系统] 🔧 广告功能已关闭 (ENABLE_AD = false)');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 如果是开发模式,使用模拟广告,不需要初始化真实组件
|
||||||
if (DEV_MODE) {
|
if (DEV_MODE) {
|
||||||
console.log('[广告系统] 🔧 开发模式:使用模拟广告');
|
console.log('[广告系统] 🔧 开发模式:使用模拟广告 (DEV_MODE = true)');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -56,6 +84,7 @@ Page({
|
||||||
try {
|
try {
|
||||||
// 创建激励视频广告实例
|
// 创建激励视频广告实例
|
||||||
// ⚠️ TODO: 替换为你的真实广告位ID
|
// ⚠️ TODO: 替换为你的真实广告位ID
|
||||||
|
// 只有在非开发模式且开启广告时才创建
|
||||||
this.rewardedAd = wx.createRewardedVideoAd({
|
this.rewardedAd = wx.createRewardedVideoAd({
|
||||||
adUnitId: 'adunit-xxxxxxxxxxxxxxxx' // 请替换为你的广告位ID
|
adUnitId: 'adunit-xxxxxxxxxxxxxxxx' // 请替换为你的广告位ID
|
||||||
});
|
});
|
||||||
|
|
@ -122,6 +151,7 @@ Page({
|
||||||
},
|
},
|
||||||
|
|
||||||
onShow: function () {
|
onShow: function () {
|
||||||
|
if (ENABLE_POINTS_UI) {
|
||||||
// 检查每日登录奖励
|
// 检查每日登录奖励
|
||||||
const rewardResult = checkDailyReward();
|
const rewardResult = checkDailyReward();
|
||||||
|
|
||||||
|
|
@ -138,6 +168,7 @@ Page({
|
||||||
this.setData({
|
this.setData({
|
||||||
currentPoints: getPoints()
|
currentPoints: getPoints()
|
||||||
});
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 加载每日内容
|
// 加载每日内容
|
||||||
|
|
@ -213,6 +244,13 @@ Page({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 跳转到星座模块
|
||||||
|
goToZodiac: function () {
|
||||||
|
wx.navigateTo({
|
||||||
|
url: '/pages/zodiac/index'
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
// 跳转到文章详情
|
// 跳转到文章详情
|
||||||
goToArticle: function () {
|
goToArticle: function () {
|
||||||
const article = this.data.dailyArticle;
|
const article = this.data.dailyArticle;
|
||||||
|
|
@ -238,61 +276,40 @@ Page({
|
||||||
}, 300);
|
}, 300);
|
||||||
},
|
},
|
||||||
|
|
||||||
// 跳转到隐私政策
|
// 跳转到设置页
|
||||||
goToPrivacy: function () {
|
goToSettings: function () {
|
||||||
wx.navigateTo({
|
wx.navigateTo({
|
||||||
url: '/pages/privacy/privacy'
|
url: '/pages/settings/settings'
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// 显示积分说明
|
// 显示积分说明 (切换为自定义浮层)
|
||||||
showPointsInfo: function () {
|
showPointsInfo: function () {
|
||||||
try {
|
this.setData({
|
||||||
console.log('[首页] 点击积分徽章');
|
pointsVisible: true
|
||||||
const remaining = AD_REWARD_CONFIG.DAILY_LIMIT - getTodayAdCount();
|
});
|
||||||
const canWatch = canWatchAd();
|
},
|
||||||
|
|
||||||
console.log('[首页] 剩余广告次数:', remaining);
|
// 关闭积分说明
|
||||||
console.log('[首页] 是否可以观看:', canWatch);
|
hidePointsInfo: function () {
|
||||||
console.log('[首页] 当前积分:', this.data.currentPoints);
|
this.setData({
|
||||||
|
pointsVisible: false
|
||||||
const lines = [
|
|
||||||
'当前积分:' + this.data.currentPoints,
|
|
||||||
'',
|
|
||||||
'每次占卜会消耗积分,不同牌阵消耗不同。',
|
|
||||||
'每日首次登录可获得 +3 积分奖励。',
|
|
||||||
'',
|
|
||||||
'看广告可获得积分(今日剩余 ' + remaining + ' 次)'
|
|
||||||
];
|
|
||||||
|
|
||||||
const content = lines.join('\n');
|
|
||||||
console.log('[首页] 弹窗内容:', content);
|
|
||||||
|
|
||||||
console.log('[首页] 准备调用 wx.showModal');
|
|
||||||
wx.showModal({
|
|
||||||
title: '积分说明',
|
|
||||||
content: content,
|
|
||||||
confirmText: canWatch ? '看广告' : '知道了',
|
|
||||||
cancelText: '关闭',
|
|
||||||
success: (res) => {
|
|
||||||
console.log('[首页] 弹窗回调:', res);
|
|
||||||
if (res.confirm && canWatch) {
|
|
||||||
this.watchAdForPoints();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fail: (err) => {
|
|
||||||
console.error('[首页] 弹窗失败:', err);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
console.log('[首页] wx.showModal 已调用');
|
|
||||||
} catch (error) {
|
|
||||||
console.error('[首页] showPointsInfo 错误:', error);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// 观看广告获取积分(支持开发模式)
|
// 观看广告获取积分(支持开发模式)
|
||||||
watchAdForPoints: function () {
|
watchAdForPoints: function () {
|
||||||
// 检查是否还有观看次数
|
// 1. 全局开关检查
|
||||||
|
if (!ENABLE_AD) {
|
||||||
|
wx.showToast({
|
||||||
|
title: '功能即将上线',
|
||||||
|
icon: 'none',
|
||||||
|
duration: 2000
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 检查是否还有观看次数
|
||||||
if (!canWatchAd()) {
|
if (!canWatchAd()) {
|
||||||
wx.showToast({
|
wx.showToast({
|
||||||
title: '今日广告次数已用完',
|
title: '今日广告次数已用完',
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,37 @@
|
||||||
<view class="tarot-table">
|
<view class="tarot-table">
|
||||||
|
|
||||||
|
<!-- 顶部栏 (已移除) -->
|
||||||
|
|
||||||
<!-- 右上角积分徽章 -->
|
<!-- 右上角积分徽章 -->
|
||||||
<view class="points-badge" bindtap="showPointsInfo">
|
<view class="points-badge" bindtap="showPointsInfo" style="top: 100rpx;">
|
||||||
<text class="badge-icon">🎯</text>
|
<text class="badge-icon">🎯</text>
|
||||||
<text class="badge-value">{{currentPoints}}</text>
|
<text class="badge-value">{{currentPoints}}</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
<!-- 星座能量入口 (放在主牌堆上方) -->
|
||||||
|
<view class="zodiac-entry" bindtap="goToZodiac">
|
||||||
|
<view class="zodiac-content">
|
||||||
|
<text class="zodiac-title">今日星象能量</text>
|
||||||
|
<text class="zodiac-subtitle">看看今天宇宙给你的提示</text>
|
||||||
|
</view>
|
||||||
|
<view class="zodiac-icon">🌑</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
<!-- 中央主牌堆 -->
|
<!-- 中央主牌堆 -->
|
||||||
<view class="main-deck" bindtap="goToTarot" hover-class="deck-hover">
|
<view class="main-deck" bindtap="goToTarot" hover-class="deck-hover">
|
||||||
<view class="deck-cards">
|
<view class="deck-cards">
|
||||||
<view class="card-stack card-1"></view>
|
<view class="card-stack card-1">
|
||||||
<view class="card-stack card-2"></view>
|
<view class="card-bg"></view>
|
||||||
<view class="card-stack card-3"></view>
|
</view>
|
||||||
|
<view class="card-stack card-2">
|
||||||
|
<view class="card-bg"></view>
|
||||||
|
</view>
|
||||||
|
<view class="card-stack card-3">
|
||||||
|
<view class="card-bg"></view>
|
||||||
|
<view class="card-pattern">
|
||||||
|
<view class="card-symbol">✡</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<text class="deck-title">开始抽牌</text>
|
<text class="deck-title">开始抽牌</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
@ -41,9 +62,9 @@
|
||||||
<text class="drawer-icon">🎯</text>
|
<text class="drawer-icon">🎯</text>
|
||||||
<text class="drawer-text">积分说明</text>
|
<text class="drawer-text">积分说明</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="drawer-item" bindtap="goToPrivacy" hover-class="drawer-hover">
|
<view class="drawer-item" bindtap="goToSettings" hover-class="drawer-hover">
|
||||||
<text class="drawer-icon">🔒</text>
|
<text class="drawer-icon">⚙️</text>
|
||||||
<text class="drawer-text">隐私政策</text>
|
<text class="drawer-text">更多设置</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|
@ -56,6 +77,43 @@
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
<!-- 积分说明浮层 -->
|
||||||
|
<view class="overlay {{pointsVisible ? 'show' : ''}}" bindtap="hidePointsInfo">
|
||||||
|
<view class="overlay-content points-content" catchtap="stopPropagation">
|
||||||
|
<view class="points-header">
|
||||||
|
<text class="points-big-icon">🎯</text>
|
||||||
|
<text class="points-big-value">{{currentPoints}}</text>
|
||||||
|
<text class="points-label">当前积分</text>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="points-rules">
|
||||||
|
<view class="rule-item">
|
||||||
|
<text class="rule-icon">📅</text>
|
||||||
|
<view class="rule-text">
|
||||||
|
<text class="rule-title">每日登录</text>
|
||||||
|
<text class="rule-desc">自动获得 +3 积分</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="rule-item">
|
||||||
|
<text class="rule-icon">🎁</text>
|
||||||
|
<view class="rule-text">
|
||||||
|
<text class="rule-title">分享给朋友</text>
|
||||||
|
<text class="rule-desc">获得 +10 积分 (每日限3次)</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="rule-item">
|
||||||
|
<text class="rule-icon">🔮</text>
|
||||||
|
<view class="rule-text">
|
||||||
|
<text class="rule-title">消耗规则</text>
|
||||||
|
<text class="rule-desc">不同牌阵消耗不同积分</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="overlay-close" bindtap="hidePointsInfo">知道了</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
<!-- 知识卡半屏 -->
|
<!-- 知识卡半屏 -->
|
||||||
<view class="panel {{knowledgeVisible ? 'show' : ''}}" bindtap="hideKnowledgePanel">
|
<view class="panel {{knowledgeVisible ? 'show' : ''}}" bindtap="hideKnowledgePanel">
|
||||||
<view class="panel-content" catchtap="stopPropagation">
|
<view class="panel-content" catchtap="stopPropagation">
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,20 @@ page {
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: flex-start;
|
||||||
|
padding-top: 120rpx;
|
||||||
|
gap: 40px;
|
||||||
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ========== 顶部栏 (已移除) ========== */
|
||||||
|
|
||||||
/* ========== 右上角积分徽章 ========== */
|
/* ========== 右上角积分徽章 ========== */
|
||||||
.points-badge {
|
.points-badge {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 30px;
|
top: 30px; /* Restore original position */
|
||||||
right: 20px;
|
right: 20px;
|
||||||
background: linear-gradient(135deg, rgba(233, 69, 96, 0.25), rgba(233, 69, 96, 0.15));
|
background: linear-gradient(135deg, rgba(233, 69, 96, 0.25), rgba(233, 69, 96, 0.15));
|
||||||
border: 1px solid rgba(233, 69, 96, 0.5);
|
border: 1px solid rgba(233, 69, 96, 0.5);
|
||||||
|
|
@ -31,6 +37,56 @@ page {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ========== 星座入口 ========== */
|
||||||
|
.zodiac-entry {
|
||||||
|
width: 80%;
|
||||||
|
max-width: 320px;
|
||||||
|
background: linear-gradient(90deg, #2a2a3e, #16213e);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.15);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 15px 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
|
||||||
|
z-index: 10;
|
||||||
|
animation: float 6s ease-in-out infinite;
|
||||||
|
margin-top: 120rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-hover {
|
||||||
|
transform: scale(0.98);
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zodiac-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zodiac-title {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zodiac-subtitle {
|
||||||
|
color: rgba(255, 255, 255, 0.6);
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zodiac-icon {
|
||||||
|
font-size: 28px;
|
||||||
|
filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3));
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes float {
|
||||||
|
0%, 100% { transform: translateY(0); }
|
||||||
|
50% { transform: translateY(-8px); }
|
||||||
|
}
|
||||||
|
|
||||||
.badge-icon {
|
.badge-icon {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
@ -61,10 +117,79 @@ page {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 180px;
|
width: 180px;
|
||||||
height: 260px;
|
height: 260px;
|
||||||
background: linear-gradient(135deg, #e94560 0%, #8b3a62 50%, #4a1942 100%);
|
/* background moved to .card-bg */
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
|
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.6);
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
|
/* overflow: hidden; Removed to allow glow to show outside */
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-bg {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(135deg, #4a1942 0%, #8b3a62 50%, #e94560 100%);
|
||||||
|
border-radius: 12px;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 模糊光晕描边 */
|
||||||
|
.card-stack::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -2px;
|
||||||
|
left: -2px;
|
||||||
|
right: -2px;
|
||||||
|
bottom: -2px;
|
||||||
|
z-index: -1;
|
||||||
|
background: linear-gradient(135deg, #7a5cff, #005bea);
|
||||||
|
border-radius: 14px;
|
||||||
|
filter: blur(2px); /* 微调模糊度 */
|
||||||
|
opacity: 1; /* 增强可见度 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Card Pattern Overlay */
|
||||||
|
.card-stack::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
left: 10px;
|
||||||
|
right: 10px;
|
||||||
|
bottom: 10px;
|
||||||
|
border: 1px solid rgba(255, 215, 0, 0.2);
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-pattern {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background-image: radial-gradient(circle at center, rgba(255,255,255,0.1) 0%, transparent 60%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-symbol {
|
||||||
|
font-size: 200rpx; /* 最大化视局冲击 */
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(180deg, #FFD700 10%, #E0C3FC 50%, #8A2BE2 90%); /* 金色-淡紫-深紫渐变,增加神秘感 */
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
filter: drop-shadow(0 0 20rpx rgba(255, 215, 0, 0.5)) drop-shadow(0 0 50rpx rgba(138, 43, 226, 0.7)); /* 静态综合光晕 */
|
||||||
|
animation: pulseMystic 4s infinite ease-in-out;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
line-height: 1;
|
||||||
|
will-change: transform, opacity; /* 硬件加速优化 */
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulseMystic {
|
||||||
|
0%, 100% { transform: scale(1); opacity: 0.85; }
|
||||||
|
50% { transform: scale(1.15); opacity: 1; }
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-1 {
|
.card-1 {
|
||||||
|
|
@ -113,8 +238,8 @@ page {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 120px;
|
height: 120px;
|
||||||
background: rgba(255, 255, 255, 0.08);
|
background: rgba(255, 255, 255, 0.08); /* Semi-transparent white */
|
||||||
border: 1px solid rgba(255, 255, 255, 0.15);
|
border: 1px solid rgba(255, 255, 255, 0.15); /* Light border */
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
@ -124,6 +249,8 @@ page {
|
||||||
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
|
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
z-index: 5;
|
z-index: 5;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-hover {
|
.card-hover {
|
||||||
|
|
@ -132,15 +259,11 @@ page {
|
||||||
}
|
}
|
||||||
|
|
||||||
.energy-card {
|
.energy-card {
|
||||||
left: 30px;
|
left: 10px;
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.knowledge-card {
|
.knowledge-card {
|
||||||
right: 30px;
|
right: 10px;
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-icon {
|
.card-icon {
|
||||||
|
|
@ -163,7 +286,7 @@ page {
|
||||||
background: rgba(0, 0, 0, 0.3);
|
background: rgba(0, 0, 0, 0.3);
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(10px);
|
||||||
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
padding: 15px 20px 25px;
|
padding: 8px 10px 15px;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
z-index: 20;
|
z-index: 20;
|
||||||
|
|
@ -173,8 +296,8 @@ page {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
gap: 2px;
|
||||||
padding: 10px 15px;
|
padding: 4px 8px;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
@ -347,3 +470,95 @@ page {
|
||||||
background: rgba(255, 255, 255, 0.1);
|
background: rgba(255, 255, 255, 0.1);
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 积分浮层特有样式 */
|
||||||
|
.points-header {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.points-big-icon {
|
||||||
|
font-size: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
filter: drop-shadow(0 0 10px rgba(233, 69, 96, 0.4));
|
||||||
|
animation: float 4s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.points-big-value {
|
||||||
|
font-size: 48px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 0 0 20px rgba(233, 69, 96, 0.6);
|
||||||
|
line-height: 1;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.points-label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: rgba(255, 255, 255, 0.6);
|
||||||
|
letter-spacing: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.points-rules {
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 15px;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rule-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rule-item:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rule-icon {
|
||||||
|
font-size: 24px;
|
||||||
|
margin-right: 15px;
|
||||||
|
width: 30px;
|
||||||
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rule-text {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.rule-title {
|
||||||
|
color: #ffffff !important;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
text-align: left;
|
||||||
|
text-shadow: 0 1px 2px rgba(0,0,0,0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rule-desc {
|
||||||
|
color: #eeeeee !important;
|
||||||
|
font-size: 13px;
|
||||||
|
text-align: left;
|
||||||
|
opacity: 0.9;
|
||||||
|
text-shadow: 0 1px 2px rgba(0,0,0,0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.points-content {
|
||||||
|
width: 70% !important;
|
||||||
|
max-width: 300px !important;
|
||||||
|
padding: 20px !important;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,20 @@ const TAROT_PROMPT_NIGHT = `你是一位安静、克制、不制造依赖的塔
|
||||||
// 3. 增强版模板:解读稳定器 + 高关联性结构化解读
|
// 3. 增强版模板:解读稳定器 + 高关联性结构化解读
|
||||||
const TAROT_PROMPT_ENHANCED = `📏 解读稳定规则(高优先级执行)
|
const TAROT_PROMPT_ENHANCED = `📏 解读稳定规则(高优先级执行)
|
||||||
|
|
||||||
你必须保持解读风格稳定、具体且一致,不允许出现质量波动。
|
【合规红线 - 必须遵守】
|
||||||
|
1. **娱乐属性**:明确告知用户内容仅供参考,不构成现实决策依据。
|
||||||
|
2. **严禁迷信**:禁止使用“注定”、“必然”、“灾祸”、“鬼神”等封建迷信词汇。
|
||||||
|
3. **禁止决策建议**:严禁提供任何医疗、法律、投资理财方面的具体建议。
|
||||||
|
4. **正向引导**:解读必须积极向上,侧重心理疏导和个人成长,避免制造焦虑。
|
||||||
|
|
||||||
|
1. **结构化输出**:必须严格遵循JSON格式,包含 theme, status, influence, advice, positions (数组)。
|
||||||
|
2. **字数控制**:
|
||||||
|
- 核心主题:15-20字(精炼一句话)
|
||||||
|
- 单个位置解读:60-100字(深度但不过长)每张牌2句以内
|
||||||
|
- 当前状态:2~3句
|
||||||
|
- 发展趋势:2~3句
|
||||||
|
- 行动建议:3~5条短句
|
||||||
|
• 禁止:超长段落、大段心理学科普、冗长比喻
|
||||||
|
|
||||||
【一、解读长度控制】
|
【一、解读长度控制】
|
||||||
• 整体长度:400~700 字(不少于 300 字,不超过 900 字)
|
• 整体长度:400~700 字(不少于 300 字,不超过 900 字)
|
||||||
|
|
@ -168,7 +181,8 @@ const SPREADS = [
|
||||||
"positions": ["当下的指引"],
|
"positions": ["当下的指引"],
|
||||||
"description": "为你此刻的状态提供一个温和而清晰的方向提示",
|
"description": "为你此刻的状态提供一个温和而清晰的方向提示",
|
||||||
"tags": ["综合"],
|
"tags": ["综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "three_time_flow",
|
"id": "three_time_flow",
|
||||||
|
|
@ -178,7 +192,8 @@ const SPREADS = [
|
||||||
"positions": ["过去", "现在", "未来"],
|
"positions": ["过去", "现在", "未来"],
|
||||||
"description": "帮助你理解事情的发展过程与可能走向",
|
"description": "帮助你理解事情的发展过程与可能走向",
|
||||||
"tags": ["综合", "决策"],
|
"tags": ["综合", "决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "three_problem_solution",
|
"id": "three_problem_solution",
|
||||||
|
|
@ -188,7 +203,8 @@ const SPREADS = [
|
||||||
"positions": ["问题核心", "当前阻碍", "行动建议"],
|
"positions": ["问题核心", "当前阻碍", "行动建议"],
|
||||||
"description": "聚焦关键问题,找出当下最可行的应对方式",
|
"description": "聚焦关键问题,找出当下最可行的应对方式",
|
||||||
"tags": ["决策"],
|
"tags": ["决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "love_spark",
|
"id": "love_spark",
|
||||||
|
|
@ -198,7 +214,8 @@ const SPREADS = [
|
||||||
"positions": ["你的感受", "对方的感受", "关系潜力"],
|
"positions": ["你的感受", "对方的感受", "关系潜力"],
|
||||||
"description": "探索彼此的真实感受与这段关系的可能性",
|
"description": "探索彼此的真实感受与这段关系的可能性",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "two_choice_decision",
|
"id": "two_choice_decision",
|
||||||
|
|
@ -208,7 +225,8 @@ const SPREADS = [
|
||||||
"positions": ["选择A的发展", "选择A的结果", "选择B的发展", "选择B的结果"],
|
"positions": ["选择A的发展", "选择A的结果", "选择B的发展", "选择B的结果"],
|
||||||
"description": "对比两种选择的潜在走向,辅助理性决策",
|
"description": "对比两种选择的潜在走向,辅助理性决策",
|
||||||
"tags": ["决策"],
|
"tags": ["决策"],
|
||||||
"aiSchema": ["core_theme", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "relationship_healing",
|
"id": "relationship_healing",
|
||||||
|
|
@ -218,7 +236,8 @@ const SPREADS = [
|
||||||
"positions": ["问题根源", "你的责任", "对方的责任", "修复方向"],
|
"positions": ["问题根源", "你的责任", "对方的责任", "修复方向"],
|
||||||
"description": "深入理解关系裂痕,找到和解与修复的路径",
|
"description": "深入理解关系裂痕,找到和解与修复的路径",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "five_situation_analysis",
|
"id": "five_situation_analysis",
|
||||||
|
|
@ -228,7 +247,8 @@ const SPREADS = [
|
||||||
"positions": ["现状", "内在因素", "外在影响", "行动方向", "可能结果"],
|
"positions": ["现状", "内在因素", "外在影响", "行动方向", "可能结果"],
|
||||||
"description": "从内外层面拆解局势,明确下一步行动",
|
"description": "从内外层面拆解局势,明确下一步行动",
|
||||||
"tags": ["事业", "综合"],
|
"tags": ["事业", "综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "relationship_spread",
|
"id": "relationship_spread",
|
||||||
|
|
@ -238,7 +258,8 @@ const SPREADS = [
|
||||||
"positions": ["你的位置", "对方的位置", "关系现状", "隐藏影响", "未来趋势"],
|
"positions": ["你的位置", "对方的位置", "关系现状", "隐藏影响", "未来趋势"],
|
||||||
"description": "理解一段关系中的互动模式与发展方向",
|
"description": "理解一段关系中的互动模式与发展方向",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "destiny_connection",
|
"id": "destiny_connection",
|
||||||
|
|
@ -248,7 +269,8 @@ const SPREADS = [
|
||||||
"positions": ["前世因缘", "今生相遇", "情感纽带", "考验挑战", "缘分走向"],
|
"positions": ["前世因缘", "今生相遇", "情感纽带", "考验挑战", "缘分走向"],
|
||||||
"description": "探索两人之间的灵性连接与命运安排",
|
"description": "探索两人之间的灵性连接与命运安排",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "career_breakthrough",
|
"id": "career_breakthrough",
|
||||||
|
|
@ -258,7 +280,8 @@ const SPREADS = [
|
||||||
"positions": ["当前困境", "优势资源", "潜在机会", "需要克服", "突破方向"],
|
"positions": ["当前困境", "优势资源", "潜在机会", "需要克服", "突破方向"],
|
||||||
"description": "识别职场瓶颈,找到突破与晋升的关键",
|
"description": "识别职场瓶颈,找到突破与晋升的关键",
|
||||||
"tags": ["事业"],
|
"tags": ["事业"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "timeline_spread",
|
"id": "timeline_spread",
|
||||||
|
|
@ -268,7 +291,8 @@ const SPREADS = [
|
||||||
"positions": ["远古根源", "过去影响", "当下状态", "近期发展", "未来趋势"],
|
"positions": ["远古根源", "过去影响", "当下状态", "近期发展", "未来趋势"],
|
||||||
"description": "追溯事件的时间线,看清发展脉络",
|
"description": "追溯事件的时间线,看清发展脉络",
|
||||||
"tags": ["综合"],
|
"tags": ["综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "diamond_spread",
|
"id": "diamond_spread",
|
||||||
|
|
@ -278,7 +302,8 @@ const SPREADS = [
|
||||||
"positions": ["问题本质", "过去原因", "未来发展", "外部资源", "最佳行动"],
|
"positions": ["问题本质", "过去原因", "未来发展", "外部资源", "最佳行动"],
|
||||||
"description": "多角度剖析问题,找到解决之道",
|
"description": "多角度剖析问题,找到解决之道",
|
||||||
"tags": ["决策"],
|
"tags": ["决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "career_planning",
|
"id": "career_planning",
|
||||||
|
|
@ -288,7 +313,8 @@ const SPREADS = [
|
||||||
"positions": ["当前位置", "核心优势", "发展方向", "潜在障碍", "贵人助力", "长期目标"],
|
"positions": ["当前位置", "核心优势", "发展方向", "潜在障碍", "贵人助力", "长期目标"],
|
||||||
"description": "全面规划职业发展路径,明确长期目标",
|
"description": "全面规划职业发展路径,明确长期目标",
|
||||||
"tags": ["事业"],
|
"tags": ["事业"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "wealth_analysis",
|
"id": "wealth_analysis",
|
||||||
|
|
@ -298,7 +324,8 @@ const SPREADS = [
|
||||||
"positions": ["财务现状", "收入来源", "支出模式", "投资机会", "财务风险", "财富增长"],
|
"positions": ["财务现状", "收入来源", "支出模式", "投资机会", "财务风险", "财富增长"],
|
||||||
"description": "深入分析财务状况,找到财富增长的路径",
|
"description": "深入分析财务状况,找到财富增长的路径",
|
||||||
"tags": ["事业"],
|
"tags": ["事业"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "spiritual_guidance",
|
"id": "spiritual_guidance",
|
||||||
|
|
@ -308,7 +335,8 @@ const SPREADS = [
|
||||||
"positions": ["当前能量", "内在阻碍", "潜在天赋", "灵性课题", "指导建议", "未来机遇", "最高指引"],
|
"positions": ["当前能量", "内在阻碍", "潜在天赋", "灵性课题", "指导建议", "未来机遇", "最高指引"],
|
||||||
"description": "深入探索内在世界,获得灵性层面的启发",
|
"description": "深入探索内在世界,获得灵性层面的启发",
|
||||||
"tags": ["深度"],
|
"tags": ["深度"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "horseshoe_spread",
|
"id": "horseshoe_spread",
|
||||||
|
|
@ -318,7 +346,8 @@ const SPREADS = [
|
||||||
"positions": ["过去", "现在", "未来", "你的态度", "他人影响", "障碍", "最终结果"],
|
"positions": ["过去", "现在", "未来", "你的态度", "他人影响", "障碍", "最终结果"],
|
||||||
"description": "全面了解情况的来龙去脉与未来走向",
|
"description": "全面了解情况的来龙去脉与未来走向",
|
||||||
"tags": ["综合"],
|
"tags": ["综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "celtic_cross",
|
"id": "celtic_cross",
|
||||||
|
|
@ -328,7 +357,8 @@ const SPREADS = [
|
||||||
"positions": ["现状", "挑战", "根基", "过去", "可能性", "近期未来", "你的态度", "外部影响", "希望与恐惧", "最终结果"],
|
"positions": ["现状", "挑战", "根基", "过去", "可能性", "近期未来", "你的态度", "外部影响", "希望与恐惧", "最终结果"],
|
||||||
"description": "最经典的综合牌阵,深度解析生命议题",
|
"description": "最经典的综合牌阵,深度解析生命议题",
|
||||||
"tags": ["深度"],
|
"tags": ["深度"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "tree_of_life",
|
"id": "tree_of_life",
|
||||||
|
|
@ -338,7 +368,8 @@ const SPREADS = [
|
||||||
"positions": ["王冠", "智慧", "理解", "慈悲", "严厉", "美丽", "胜利", "荣耀", "基础", "王国"],
|
"positions": ["王冠", "智慧", "理解", "慈悲", "严厉", "美丽", "胜利", "荣耀", "基础", "王国"],
|
||||||
"description": "基于卡巴拉生命之树的深度灵性探索",
|
"description": "基于卡巴拉生命之树的深度灵性探索",
|
||||||
"tags": ["深度"],
|
"tags": ["深度"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
// 新增爱情牌阵
|
// 新增爱情牌阵
|
||||||
{
|
{
|
||||||
|
|
@ -349,7 +380,8 @@ const SPREADS = [
|
||||||
"positions": ["核心关系", "你的状态", "对方状态", "未来发展"],
|
"positions": ["核心关系", "你的状态", "对方状态", "未来发展"],
|
||||||
"description": "适合恋人关系 & 互动解析",
|
"description": "适合恋人关系 & 互动解析",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "new_love",
|
"id": "new_love",
|
||||||
|
|
@ -359,7 +391,8 @@ const SPREADS = [
|
||||||
"positions": ["当前状态", "遇见契机", "发展方向"],
|
"positions": ["当前状态", "遇见契机", "发展方向"],
|
||||||
"description": "适合新的感情 & 遇见新欢,为单身的你或刚分手的你带来新爱提示",
|
"description": "适合新的感情 & 遇见新欢,为单身的你或刚分手的你带来新爱提示",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "relationship_basic",
|
"id": "relationship_basic",
|
||||||
|
|
@ -369,7 +402,8 @@ const SPREADS = [
|
||||||
"positions": ["你的想法", "对方想法", "关系走向"],
|
"positions": ["你的想法", "对方想法", "关系走向"],
|
||||||
"description": "适合梳理关系 & 拉近距离,回溯结识初衷,梳理人际关系,拉近彼此距离",
|
"description": "适合梳理关系 & 拉近距离,回溯结识初衷,梳理人际关系,拉近彼此距离",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "love_tree_spread",
|
"id": "love_tree_spread",
|
||||||
|
|
@ -379,7 +413,8 @@ const SPREADS = [
|
||||||
"positions": ["核心问题", "过去影响", "现在状况", "未来趋势", "最终结果"],
|
"positions": ["核心问题", "过去影响", "现在状况", "未来趋势", "最终结果"],
|
||||||
"description": "适合深度求爱 & 寻找症结,解析前因后果,回溯爱情过往,探究本源核心",
|
"description": "适合深度求爱 & 寻找症结,解析前因后果,回溯爱情过往,探究本源核心",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "love_cross_spread",
|
"id": "love_cross_spread",
|
||||||
|
|
@ -389,7 +424,8 @@ const SPREADS = [
|
||||||
"positions": ["你的状态", "对方状态", "过去影响", "现在情况", "未来发展"],
|
"positions": ["你的状态", "对方状态", "过去影响", "现在情况", "未来发展"],
|
||||||
"description": "适合解析两性关系 & 爱情状况,基于洞悉彼此关系中的情感状况并分析结果",
|
"description": "适合解析两性关系 & 爱情状况,基于洞悉彼此关系中的情感状况并分析结果",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "mr_right",
|
"id": "mr_right",
|
||||||
|
|
@ -399,7 +435,8 @@ const SPREADS = [
|
||||||
"positions": ["内心期待", "现实阻碍", "理想对象", "行动建议", "遇见时机"],
|
"positions": ["内心期待", "现实阻碍", "理想对象", "行动建议", "遇见时机"],
|
||||||
"description": "单身探索有缘人 & 合适对象,探索内心的想法,改善外在的行为,遇到适合的人",
|
"description": "单身探索有缘人 & 合适对象,探索内心的想法,改善外在的行为,遇到适合的人",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "search_lover",
|
"id": "search_lover",
|
||||||
|
|
@ -409,7 +446,8 @@ const SPREADS = [
|
||||||
"positions": ["当前状态", "优势特质", "改进方向", "寻找方式", "目标确定"],
|
"positions": ["当前状态", "优势特质", "改进方向", "寻找方式", "目标确定"],
|
||||||
"description": "适合寻找意中人 & 有缘人,睁全宫中人的愿景,帮助自己确定目标",
|
"description": "适合寻找意中人 & 有缘人,睁全宫中人的愿景,帮助自己确定目标",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "inspiration_correspondence",
|
"id": "inspiration_correspondence",
|
||||||
|
|
@ -419,7 +457,8 @@ const SPREADS = [
|
||||||
"positions": ["情感现状", "内心需求", "对方感受", "互动方式", "发展建议", "最终走向"],
|
"positions": ["情感现状", "内心需求", "对方感受", "互动方式", "发展建议", "最终走向"],
|
||||||
"description": "适合情感困惑 & 人际关系,增长解析指缘联接或情感互动,帮您交融状态",
|
"description": "适合情感困惑 & 人际关系,增长解析指缘联接或情感互动,帮您交融状态",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "gypsy_spread",
|
"id": "gypsy_spread",
|
||||||
|
|
@ -429,7 +468,8 @@ const SPREADS = [
|
||||||
"positions": ["你的想法", "对方想法", "过去经历", "现在状况", "未来发展"],
|
"positions": ["你的想法", "对方想法", "过去经历", "现在状况", "未来发展"],
|
||||||
"description": "适合情侣分析 & 关系延展,探索彼此内心想法,找到合适的相处方式",
|
"description": "适合情侣分析 & 关系延展,探索彼此内心想法,找到合适的相处方式",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "venus_spread",
|
"id": "venus_spread",
|
||||||
|
|
@ -439,7 +479,8 @@ const SPREADS = [
|
||||||
"positions": ["你的状态", "对方状态", "关系开始", "当前情况", "核心问题", "最终结果", "外部影响", "内在感受"],
|
"positions": ["你的状态", "对方状态", "关系开始", "当前情况", "核心问题", "最终结果", "外部影响", "内在感受"],
|
||||||
"description": "适合爱情发展 & 判断走向,全面的爱情解析牌阵,深入分析两性关系",
|
"description": "适合爱情发展 & 判断走向,全面的爱情解析牌阵,深入分析两性关系",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "lover_tree",
|
"id": "lover_tree",
|
||||||
|
|
@ -449,7 +490,8 @@ const SPREADS = [
|
||||||
"positions": ["你的行为", "对方行为", "你的想法", "对方想法", "你的感受", "对方感受", "关系走向"],
|
"positions": ["你的行为", "对方行为", "你的想法", "对方想法", "你的感受", "对方感受", "关系走向"],
|
||||||
"description": "适合探究对方心理 & 行为模式,对比情侣间的行为差异,进而根据事实做出判断",
|
"description": "适合探究对方心理 & 行为模式,对比情侣间的行为差异,进而根据事实做出判断",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "marriage_spread",
|
"id": "marriage_spread",
|
||||||
|
|
@ -459,7 +501,8 @@ const SPREADS = [
|
||||||
"positions": ["婚姻基础", "你的期望", "对方期望", "核心问题", "外部影响", "内在感受", "未来走向"],
|
"positions": ["婚姻基础", "你的期望", "对方期望", "核心问题", "外部影响", "内在感受", "未来走向"],
|
||||||
"description": "适合婚姻状况 & 内在剖析,针对婚姻状况和期望进行解析,通过细致分析把握婚姻走向",
|
"description": "适合婚姻状况 & 内在剖析,针对婚姻状况和期望进行解析,通过细致分析把握婚姻走向",
|
||||||
"tags": ["爱情"],
|
"tags": ["爱情"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
// 新增事业牌阵
|
// 新增事业牌阵
|
||||||
{
|
{
|
||||||
|
|
@ -470,7 +513,8 @@ const SPREADS = [
|
||||||
"positions": ["问题核心", "左侧因素", "右侧因素"],
|
"positions": ["问题核心", "左侧因素", "右侧因素"],
|
||||||
"description": "适合财富探索 & 问题解析,清楚审视整个问题的来龙去脉,进而做出正确决策",
|
"description": "适合财富探索 & 问题解析,清楚审视整个问题的来龙去脉,进而做出正确决策",
|
||||||
"tags": ["事业", "财富"],
|
"tags": ["事业", "财富"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "success_star",
|
"id": "success_star",
|
||||||
|
|
@ -480,7 +524,8 @@ const SPREADS = [
|
||||||
"positions": ["当前位置", "行动方向", "成功目标"],
|
"positions": ["当前位置", "行动方向", "成功目标"],
|
||||||
"description": "适合走位辨路 & 累积行动,锁定目标破除阻碍,告诉星光,心有明月再出发",
|
"description": "适合走位辨路 & 累积行动,锁定目标破除阻碍,告诉星光,心有明月再出发",
|
||||||
"tags": ["事业"],
|
"tags": ["事业"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "career_pyramid",
|
"id": "career_pyramid",
|
||||||
|
|
@ -490,7 +535,8 @@ const SPREADS = [
|
||||||
"positions": ["核心优势", "需要改进", "外部机会", "未来发展"],
|
"positions": ["核心优势", "需要改进", "外部机会", "未来发展"],
|
||||||
"description": "适合解析财富运势 & 提升财商,明晰自我的优缺点,帮助自己除弊趋利在事业中获得优势",
|
"description": "适合解析财富运势 & 提升财商,明晰自我的优缺点,帮助自己除弊趋利在事业中获得优势",
|
||||||
"tags": ["事业"],
|
"tags": ["事业"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "wealth_tree",
|
"id": "wealth_tree",
|
||||||
|
|
@ -500,7 +546,8 @@ const SPREADS = [
|
||||||
"positions": ["财务基础", "收入来源", "支出状况", "当前状态", "未来趋势"],
|
"positions": ["财务基础", "收入来源", "支出状况", "当前状态", "未来趋势"],
|
||||||
"description": "适合事业发展 & 状态评估,通过对财富的梳理,健全适合自己的财务模式",
|
"description": "适合事业发展 & 状态评估,通过对财富的梳理,健全适合自己的财务模式",
|
||||||
"tags": ["事业", "财富"],
|
"tags": ["事业", "财富"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "x_opportunity",
|
"id": "x_opportunity",
|
||||||
|
|
@ -510,7 +557,8 @@ const SPREADS = [
|
||||||
"positions": ["当前时机", "有利因素", "不利因素", "行动建议", "结果预测"],
|
"positions": ["当前时机", "有利因素", "不利因素", "行动建议", "结果预测"],
|
||||||
"description": "适合时机捕捉 & 临场决策,以事物处理时机为主线轴,牵挂问题解决的成功概率",
|
"description": "适合时机捕捉 & 临场决策,以事物处理时机为主线轴,牵挂问题解决的成功概率",
|
||||||
"tags": ["事业", "决策"],
|
"tags": ["事业", "决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "job_interview",
|
"id": "job_interview",
|
||||||
|
|
@ -520,7 +568,8 @@ const SPREADS = [
|
||||||
"positions": ["自我状态", "优势展现", "需要注意", "面试官印象", "录用可能"],
|
"positions": ["自我状态", "优势展现", "需要注意", "面试官印象", "录用可能"],
|
||||||
"description": "适合解析应聘面试 & 求职状况,洞察对方需求与自我留言,有效提高面试成功率",
|
"description": "适合解析应聘面试 & 求职状况,洞察对方需求与自我留言,有效提高面试成功率",
|
||||||
"tags": ["事业"],
|
"tags": ["事业"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "work_problems",
|
"id": "work_problems",
|
||||||
|
|
@ -530,7 +579,8 @@ const SPREADS = [
|
||||||
"positions": ["问题核心", "上级态度", "同事关系", "个人能力", "外部环境", "解决方案"],
|
"positions": ["问题核心", "上级态度", "同事关系", "个人能力", "外部环境", "解决方案"],
|
||||||
"description": "适合聚焦目标 & 优化路径,当你明确自己的目标,全世界都会为你让路",
|
"description": "适合聚焦目标 & 优化路径,当你明确自己的目标,全世界都会为你让路",
|
||||||
"tags": ["事业"],
|
"tags": ["事业"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "turbulent_finances",
|
"id": "turbulent_finances",
|
||||||
|
|
@ -540,7 +590,8 @@ const SPREADS = [
|
||||||
"positions": ["财务起点", "第一波动", "稳定期", "第二波动", "调整期", "未来趋势"],
|
"positions": ["财务起点", "第一波动", "稳定期", "第二波动", "调整期", "未来趋势"],
|
||||||
"description": "适合借力打力 & 多空对比,追问本质,结合正反两方面的分析,做出理智判断",
|
"description": "适合借力打力 & 多空对比,追问本质,结合正反两方面的分析,做出理智判断",
|
||||||
"tags": ["事业", "财富"],
|
"tags": ["事业", "财富"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "desired_job",
|
"id": "desired_job",
|
||||||
|
|
@ -550,7 +601,8 @@ const SPREADS = [
|
||||||
"positions": ["理想工作", "个人优势", "需要提升", "寻找方向", "关键因素", "实现可能"],
|
"positions": ["理想工作", "个人优势", "需要提升", "寻找方向", "关键因素", "实现可能"],
|
||||||
"description": "适合评估工作前景 & 关联因素,剖析工作前景,理清相关因素,给出明确的思路",
|
"description": "适合评估工作前景 & 关联因素,剖析工作前景,理清相关因素,给出明确的思路",
|
||||||
"tags": ["事业"],
|
"tags": ["事业"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
// 新增决策牌阵
|
// 新增决策牌阵
|
||||||
{
|
{
|
||||||
|
|
@ -561,7 +613,8 @@ const SPREADS = [
|
||||||
"positions": ["选项A", "选项B", "建议方向"],
|
"positions": ["选项A", "选项B", "建议方向"],
|
||||||
"description": "适合评测选项 & 做出抉择,在两难的处境中给出建议,选出适合自己的抉择",
|
"description": "适合评测选项 & 做出抉择,在两难的处境中给出建议,选出适合自己的抉择",
|
||||||
"tags": ["决策"],
|
"tags": ["决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "three_options",
|
"id": "three_options",
|
||||||
|
|
@ -571,7 +624,8 @@ const SPREADS = [
|
||||||
"positions": ["当前状况", "参考方向一", "参考方向二"],
|
"positions": ["当前状况", "参考方向一", "参考方向二"],
|
||||||
"description": "提供参考方向 & 行动指向,遇到3个选择时,给你提供参考的方向",
|
"description": "提供参考方向 & 行动指向,遇到3个选择时,给你提供参考的方向",
|
||||||
"tags": ["决策"],
|
"tags": ["决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "daily_tree",
|
"id": "daily_tree",
|
||||||
|
|
@ -581,7 +635,8 @@ const SPREADS = [
|
||||||
"positions": ["今日核心", "需要注意", "有利因素", "行动建议"],
|
"positions": ["今日核心", "需要注意", "有利因素", "行动建议"],
|
||||||
"description": "适长当日难题 & 当日解决,天天没烦恼,解决每天遇到的问题",
|
"description": "适长当日难题 & 当日解决,天天没烦恼,解决每天遇到的问题",
|
||||||
"tags": ["综合"],
|
"tags": ["综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "weigh_two",
|
"id": "weigh_two",
|
||||||
|
|
@ -591,7 +646,8 @@ const SPREADS = [
|
||||||
"positions": ["当前状况", "选项A优势", "选项B优势", "选项A劣势", "选项B劣势"],
|
"positions": ["当前状况", "选项A优势", "选项B优势", "选项A劣势", "选项B劣势"],
|
||||||
"description": "主要用于抉择 & 判断,二选一,适用于二种情况选择其中一种",
|
"description": "主要用于抉择 & 判断,二选一,适用于二种情况选择其中一种",
|
||||||
"tags": ["决策"],
|
"tags": ["决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "comparing_choices",
|
"id": "comparing_choices",
|
||||||
|
|
@ -601,7 +657,8 @@ const SPREADS = [
|
||||||
"positions": ["选项A现状", "选项A发展", "选项A结果", "选项B现状", "选项B发展", "选项B结果"],
|
"positions": ["选项A现状", "选项A发展", "选项A结果", "选项B现状", "选项B发展", "选项B结果"],
|
||||||
"description": "适合判断情势 & 决定方向,多层面聚焦两个方向,更多的线索更多的细节",
|
"description": "适合判断情势 & 决定方向,多层面聚焦两个方向,更多的线索更多的细节",
|
||||||
"tags": ["决策"],
|
"tags": ["决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "weigh_three",
|
"id": "weigh_three",
|
||||||
|
|
@ -611,7 +668,8 @@ const SPREADS = [
|
||||||
"positions": ["当前状况", "选项A优势", "选项B优势", "选项A劣势", "选项C优势", "选项C劣势", "选项B劣势"],
|
"positions": ["当前状况", "选项A优势", "选项B优势", "选项A劣势", "选项C优势", "选项C劣势", "选项B劣势"],
|
||||||
"description": "适合事情抉择 & 选择评估,对利弊关系进行分析判断,权衡利弊,做出最终的选择",
|
"description": "适合事情抉择 & 选择评估,对利弊关系进行分析判断,权衡利弊,做出最终的选择",
|
||||||
"tags": ["决策"],
|
"tags": ["决策"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
// 新增深度探索牌阵
|
// 新增深度探索牌阵
|
||||||
{
|
{
|
||||||
|
|
@ -622,7 +680,8 @@ const SPREADS = [
|
||||||
"positions": ["身体", "心智", "灵性", "整体状态"],
|
"positions": ["身体", "心智", "灵性", "整体状态"],
|
||||||
"description": "适合自我探索 & 了解自己,透彻审视自我,更直切明了自身成长路径",
|
"description": "适合自我探索 & 了解自己,透彻审视自我,更直切明了自身成长路径",
|
||||||
"tags": ["成长", "综合"],
|
"tags": ["成长", "综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "four_elements",
|
"id": "four_elements",
|
||||||
|
|
@ -632,7 +691,8 @@ const SPREADS = [
|
||||||
"positions": ["感性", "理性", "物质", "行动"],
|
"positions": ["感性", "理性", "物质", "行动"],
|
||||||
"description": "适合问题探索 & 多方解析,从感性、理性、物质、行动四方面分析,进而接近实质",
|
"description": "适合问题探索 & 多方解析,从感性、理性、物质、行动四方面分析,进而接近实质",
|
||||||
"tags": ["探索", "综合"],
|
"tags": ["探索", "综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "self_discovery",
|
"id": "self_discovery",
|
||||||
|
|
@ -642,7 +702,8 @@ const SPREADS = [
|
||||||
"positions": ["核心自我", "潜能", "优势", "需要提升"],
|
"positions": ["核心自我", "潜能", "优势", "需要提升"],
|
||||||
"description": "适合认识自我 & 提升潜能,开发自身潜力,提高对自己的认识",
|
"description": "适合认识自我 & 提升潜能,开发自身潜力,提高对自己的认识",
|
||||||
"tags": ["探索", "成长"],
|
"tags": ["探索", "成长"],
|
||||||
"aiSchema": ["core_theme", "current_state", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "know_yourself",
|
"id": "know_yourself",
|
||||||
|
|
@ -652,7 +713,8 @@ const SPREADS = [
|
||||||
"positions": ["核心自我", "思想", "行为", "情感", "环境影响"],
|
"positions": ["核心自我", "思想", "行为", "情感", "环境影响"],
|
||||||
"description": "适合自我剖析 & 境况认知,人无时无刻不受环境的影响,在各种关系的交织中成长",
|
"description": "适合自我剖析 & 境况认知,人无时无刻不受环境的影响,在各种关系的交织中成长",
|
||||||
"tags": ["成长", "综合"],
|
"tags": ["成长", "综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "your_breakthrough",
|
"id": "your_breakthrough",
|
||||||
|
|
@ -662,7 +724,8 @@ const SPREADS = [
|
||||||
"positions": ["当前困境", "阻碍因素", "突破点", "行动方向", "预期结果"],
|
"positions": ["当前困境", "阻碍因素", "突破点", "行动方向", "预期结果"],
|
||||||
"description": "适合打破僵环 & 突破自我,识别固定模式,突破往复循环",
|
"description": "适合打破僵环 & 突破自我,识别固定模式,突破往复循环",
|
||||||
"tags": ["成长"],
|
"tags": ["成长"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "elemental_cross",
|
"id": "elemental_cross",
|
||||||
|
|
@ -672,7 +735,8 @@ const SPREADS = [
|
||||||
"positions": ["核心问题", "火元素", "水元素", "风元素", "土元素", "解决方案"],
|
"positions": ["核心问题", "火元素", "水元素", "风元素", "土元素", "解决方案"],
|
||||||
"description": "主要用于带入问题 & 解决问题,根据现实情况全面运用四元素能提升自己",
|
"description": "主要用于带入问题 & 解决问题,根据现实情况全面运用四元素能提升自己",
|
||||||
"tags": ["探索", "综合"],
|
"tags": ["探索", "综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "wheel_spread",
|
"id": "wheel_spread",
|
||||||
|
|
@ -682,7 +746,8 @@ const SPREADS = [
|
||||||
"positions": ["中心", "过去", "现在", "未来", "机会", "挑战", "结果"],
|
"positions": ["中心", "过去", "现在", "未来", "机会", "挑战", "结果"],
|
||||||
"description": "适合专注自我 & 探寻改变,有时走出循环照顾的舒适圈,有所改变时,才能成长",
|
"description": "适合专注自我 & 探寻改变,有时走出循环照顾的舒适圈,有所改变时,才能成长",
|
||||||
"tags": ["成长"],
|
"tags": ["成长"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "seven_planets",
|
"id": "seven_planets",
|
||||||
|
|
@ -692,7 +757,8 @@ const SPREADS = [
|
||||||
"positions": ["核心", "月亮", "水星", "金星", "太阳", "火星", "木星"],
|
"positions": ["核心", "月亮", "水星", "金星", "太阳", "火星", "木星"],
|
||||||
"description": "适合审视目前状态 & 了解自己,综合分析当下状况,全面的了解自己",
|
"description": "适合审视目前状态 & 了解自己,综合分析当下状况,全面的了解自己",
|
||||||
"tags": ["成长", "综合"],
|
"tags": ["成长", "综合"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "dream_mirror",
|
"id": "dream_mirror",
|
||||||
|
|
@ -702,7 +768,8 @@ const SPREADS = [
|
||||||
"positions": ["梦境表象", "潜意识", "情感", "符号", "启示", "行动", "整合"],
|
"positions": ["梦境表象", "潜意识", "情感", "符号", "启示", "行动", "整合"],
|
||||||
"description": "适合分析梦境 & 获得启迪,梦像一面镜子,解读梦境,是理解自己的渠道",
|
"description": "适合分析梦境 & 获得启迪,梦像一面镜子,解读梦境,是理解自己的渠道",
|
||||||
"tags": ["探索"],
|
"tags": ["探索"],
|
||||||
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"]
|
"aiSchema": ["core_theme", "current_state", "potential_influence", "action_advice"],
|
||||||
|
layout: { type: 'grid' }
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -739,17 +806,29 @@ Page({
|
||||||
// AI 解读相关
|
// AI 解读相关
|
||||||
aiResult: null,
|
aiResult: null,
|
||||||
isAiLoading: false,
|
isAiLoading: false,
|
||||||
aiLoadingText: '正在抽取牌面…', // 动态加载提示
|
aiLoadingText: '正在深度解读...', // 动态加载提示
|
||||||
spreadStory: '',
|
spreadStory: '',
|
||||||
|
|
||||||
// 3. 前缀文案列表(随机抽取)
|
// 3. 前缀文案列表(随机抽取)
|
||||||
prefixList: [
|
prefixList: [
|
||||||
"今天,这张牌提醒你:",
|
"透过层层迷雾,牌面显示...",
|
||||||
"此刻,宇宙传递的信息:",
|
"连接此刻的能量,这张牌意味着...",
|
||||||
"这张牌想告诉你:",
|
"这是一个特别的信号...",
|
||||||
"请收下这份指引:"
|
"如同命运的低语...",
|
||||||
|
"在潜意识的深处..."
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// 4. 分享引导文案
|
||||||
|
randomGuidanceText: "",
|
||||||
|
guidanceList: [
|
||||||
|
"这组牌很少见",
|
||||||
|
"你的能量状态正在转折",
|
||||||
|
"这个答案值得记录",
|
||||||
|
"一次直抵内心的对话",
|
||||||
|
"命运在这一刻给予了回应"
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
// 2. 完整的 22 张大阿尔卡那牌组(包含逆位含义)
|
// 2. 完整的 22 张大阿尔卡那牌组(包含逆位含义)
|
||||||
cardList: [
|
cardList: [
|
||||||
{
|
{
|
||||||
|
|
@ -1206,7 +1285,7 @@ Page({
|
||||||
|
|
||||||
// --- 4. 逐一翻牌 ---
|
// --- 4. 逐一翻牌 ---
|
||||||
revealNext: function (e) {
|
revealNext: function (e) {
|
||||||
const index = e.currentTarget.dataset.index;
|
const index = (e.detail && e.detail.index !== undefined) ? e.detail.index : e.currentTarget.dataset.index;
|
||||||
if (index === this.data.revealedCount) {
|
if (index === this.data.revealedCount) {
|
||||||
const nextCount = index + 1;
|
const nextCount = index + 1;
|
||||||
this.setData({
|
this.setData({
|
||||||
|
|
@ -1215,12 +1294,34 @@ Page({
|
||||||
|
|
||||||
// 如果全部翻开,触发解读
|
// 如果全部翻开,触发解读
|
||||||
if (nextCount === this.data.selectedSpread.cardCount) {
|
if (nextCount === this.data.selectedSpread.cardCount) {
|
||||||
this.setData({ state: 'revealed' });
|
// 随机生成分享引导文案
|
||||||
|
// Note: guidanceList needs to be defined in data or elsewhere for this to work.
|
||||||
|
// For now, assuming it exists or will be added.
|
||||||
|
const guidanceIdx = Math.floor(Math.random() * (this.data.guidanceList ? this.data.guidanceList.length : 1));
|
||||||
|
const guidanceText = this.data.guidanceList ? this.data.guidanceList[guidanceIdx] : '分享你的塔罗解读,获得更多指引!';
|
||||||
|
|
||||||
|
this.setData({
|
||||||
|
state: 'revealed',
|
||||||
|
randomGuidanceText: guidanceText // 设置引导文案
|
||||||
|
});
|
||||||
this.showInterpretation();
|
this.showInterpretation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 查看已翻开牌的详情
|
||||||
|
viewCardDetail: function (e) {
|
||||||
|
const index = (e.detail && e.detail.index !== undefined) ? e.detail.index : e.currentTarget.dataset.index;
|
||||||
|
const card = this.data.drawnCards[index];
|
||||||
|
if (card) {
|
||||||
|
wx.showToast({
|
||||||
|
title: card.name + (card.isReversed ? '(逆)' : ''),
|
||||||
|
icon: 'none',
|
||||||
|
duration: 1500
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// --- 展示解读内容 ---
|
// --- 展示解读内容 ---
|
||||||
showInterpretation: function () {
|
showInterpretation: function () {
|
||||||
const infoAnim = wx.createAnimation({
|
const infoAnim = wx.createAnimation({
|
||||||
|
|
@ -1242,6 +1343,7 @@ Page({
|
||||||
this.setData({
|
this.setData({
|
||||||
isAiLoading: true,
|
isAiLoading: true,
|
||||||
aiResult: null,
|
aiResult: null,
|
||||||
|
aiStreamText: '',
|
||||||
aiLoadingText: '正在抽取牌面…'
|
aiLoadingText: '正在抽取牌面…'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -1305,11 +1407,7 @@ ${cardMeanings}
|
||||||
|
|
||||||
// 5. 处理结果
|
// 5. 处理结果
|
||||||
if (result.status === 'blocked') {
|
if (result.status === 'blocked') {
|
||||||
wx.showToast({
|
wx.showToast({ title: result.message, icon: 'none', duration: 2000 });
|
||||||
title: result.message,
|
|
||||||
icon: 'none',
|
|
||||||
duration: 2000
|
|
||||||
});
|
|
||||||
this.setData({ isAiLoading: false });
|
this.setData({ isAiLoading: false });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -1326,14 +1424,69 @@ ${cardMeanings}
|
||||||
|
|
||||||
// 8. 如果是 fallback,显示提示
|
// 8. 如果是 fallback,显示提示
|
||||||
if (result.status === 'fallback' && result.error) {
|
if (result.status === 'fallback' && result.error) {
|
||||||
wx.showToast({
|
wx.showToast({ title: 'AI 解读失败,已使用备用解读', icon: 'none', duration: 3000 });
|
||||||
title: 'AI 解读失败,已使用备用解读',
|
|
||||||
icon: 'none',
|
|
||||||
duration: 3000
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// --- 打字机效果:逐字显示 AI 解读 ---
|
||||||
|
typewriterReveal: function (data) {
|
||||||
|
// 初始化空的 aiResult 结构,先占位
|
||||||
|
const emptyResult = {
|
||||||
|
theme: '',
|
||||||
|
status: '',
|
||||||
|
influence: '',
|
||||||
|
advice: '',
|
||||||
|
positions: (data.positions || []).map(p => ({
|
||||||
|
posName: p.posName,
|
||||||
|
posMeaning: ''
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
this.setData({ aiResult: emptyResult });
|
||||||
|
|
||||||
|
// 把所有需要打字机显示的字段排成队列
|
||||||
|
const fields = [
|
||||||
|
{ key: 'aiResult.theme', text: data.theme || '' },
|
||||||
|
{ key: 'aiResult.status', text: data.status || '' },
|
||||||
|
{ key: 'aiResult.influence', text: data.influence || '' },
|
||||||
|
{ key: 'aiResult.advice', text: data.advice || '' },
|
||||||
|
];
|
||||||
|
|
||||||
|
// 加入每个位置的解读
|
||||||
|
(data.positions || []).forEach((pos, i) => {
|
||||||
|
fields.push({
|
||||||
|
key: `aiResult.positions[${i}].posMeaning`,
|
||||||
|
text: pos.posMeaning || ''
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 逐字段、逐字符地显示
|
||||||
|
let fieldIndex = 0;
|
||||||
|
|
||||||
|
const revealNextField = () => {
|
||||||
|
if (fieldIndex >= fields.length) return; // 全部完成
|
||||||
|
|
||||||
|
const field = fields[fieldIndex];
|
||||||
|
const fullText = field.text;
|
||||||
|
let charIndex = 0;
|
||||||
|
|
||||||
|
// 每个字符间隔 25ms(约 40字/秒)
|
||||||
|
const timer = setInterval(() => {
|
||||||
|
charIndex++;
|
||||||
|
const partial = fullText.slice(0, charIndex);
|
||||||
|
this.setData({ [field.key]: partial });
|
||||||
|
|
||||||
|
if (charIndex >= fullText.length) {
|
||||||
|
clearInterval(timer);
|
||||||
|
fieldIndex++;
|
||||||
|
// 字段间停顿 150ms 再开始下一个字段
|
||||||
|
setTimeout(revealNextField, 150);
|
||||||
|
}
|
||||||
|
}, 25);
|
||||||
|
};
|
||||||
|
|
||||||
|
revealNextField();
|
||||||
|
},
|
||||||
|
|
||||||
handleAiFallback: function () {
|
handleAiFallback: function () {
|
||||||
// 构建一个基础的回退对象
|
// 构建一个基础的回退对象
|
||||||
const fallback = {
|
const fallback = {
|
||||||
|
|
@ -1401,11 +1554,30 @@ ${cardMeanings}
|
||||||
wx.navigateBack({
|
wx.navigateBack({
|
||||||
delta: 1
|
delta: 1
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
// 其他状态直接返回主页
|
|
||||||
wx.navigateBack({
|
|
||||||
delta: 1
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户点击右上角分享
|
||||||
|
*/
|
||||||
|
onShareAppMessage: function () {
|
||||||
|
const titles = [
|
||||||
|
"我刚抽到一组很准的塔罗…",
|
||||||
|
"这次塔罗结果让我有点意外",
|
||||||
|
"今天的塔罗指引比我想象深",
|
||||||
|
"这是我此刻的能量状态✨",
|
||||||
|
"这里有一个答案,也许你也需要"
|
||||||
|
];
|
||||||
|
const randomTitle = titles[Math.floor(Math.random() * titles.length)];
|
||||||
|
|
||||||
|
// 模拟生成 fromUserId (实际应从用户信息获取)
|
||||||
|
// 这里简单使用一个随机字符串代替,或者保留为空等待后续接入用户系统
|
||||||
|
const mockUserId = 'user_' + Math.random().toString(36).substr(2, 9);
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: randomTitle,
|
||||||
|
path: `/pages/home/home?fromUserId=${mockUserId}`,
|
||||||
|
imageUrl: '/images/share-cover.png' // 建议后续添加一张通用的分享图
|
||||||
|
};
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
{
|
{
|
||||||
"navigationBarTitleText": "塔罗指引",
|
"navigationBarTitleText": "塔罗指引",
|
||||||
"usingComponents": {}
|
"usingComponents": {
|
||||||
|
"spread-container": "/components/spread-container/spread-container"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
<text class="back-icon">⇠</text>
|
<text class="back-icon">⇠</text>
|
||||||
<text class="back-text">返回</text>
|
<text class="back-text">返回</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 1. 牌阵选择状态 - 卡片式V2 -->
|
<!-- 1. 牌阵选择状态 - 卡片式V2 -->
|
||||||
<view class="spread-select-area" wx:if="{{state === 'spread_select'}}">
|
<view class="spread-select-area" wx:if="{{state === 'spread_select'}}">
|
||||||
<!-- 顶部标题区域 -->
|
<!-- 顶部标题区域 -->
|
||||||
|
|
@ -47,7 +48,7 @@
|
||||||
<!-- 底部信息 -->
|
<!-- 底部信息 -->
|
||||||
<view class="card-footer">
|
<view class="card-footer">
|
||||||
<text class="card-count">{{item.cardCount}} 张牌</text>
|
<text class="card-count">{{item.cardCount}} 张牌</text>
|
||||||
<text class="card-cost">消耗 {{item.cost}} 积分</text>
|
<text class="card-cost">需 {{item.cost}} 积分</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
@ -145,33 +146,42 @@
|
||||||
module.exports.getTransform = function(indices, currentIdx, count) {
|
module.exports.getTransform = function(indices, currentIdx, count) {
|
||||||
var pos = indices.indexOf(currentIdx);
|
var pos = indices.indexOf(currentIdx);
|
||||||
if (pos !== -1) {
|
if (pos !== -1) {
|
||||||
// 每排最多5张牌
|
|
||||||
var maxPerRow = 5;
|
var maxPerRow = 5;
|
||||||
var row = Math.floor(pos / maxPerRow); // 第几排(0或1)
|
var row = Math.floor(pos / maxPerRow);
|
||||||
var col = pos % maxPerRow; // 该排的第几个
|
var col = pos % maxPerRow;
|
||||||
var cardsInRow = (row === 0) ? Math.min(count, maxPerRow) : (count - maxPerRow);
|
|
||||||
|
|
||||||
// 槽位:宽100rpx + gap 20rpx = 120rpx 间距
|
var cardsRemaining = count - (row * maxPerRow);
|
||||||
var slotWidth = 100;
|
var cardsInRow = (cardsRemaining > maxPerRow) ? maxPerRow : cardsRemaining;
|
||||||
var gap = 20;
|
|
||||||
var slotSpacing = slotWidth + gap;
|
|
||||||
|
|
||||||
// 计算该排槽位的水平居中偏移
|
// Container Calculation
|
||||||
// 从该排中间位置开始计算
|
var rowCount = Math.ceil(count / maxPerRow);
|
||||||
var centerOffset = (col - (cardsInRow - 1) / 2) * slotSpacing;
|
var contentHeight = (rowCount * 160) + ((rowCount - 1) * 20);
|
||||||
|
if (contentHeight < 240) { contentHeight = 240; } // Handle min-height: 240rpx
|
||||||
|
|
||||||
// 垂直偏移计算
|
// Distance from Slot Container Top to Fan Deck Bottom
|
||||||
// 第一排槽位:向上 -520rpx(已验证接近正确)
|
// FanHeight(380) + FanMarginTop(20) + ContainerMarginBottom(60) + ContainerHeight
|
||||||
// 第二排:需要减少向上的距离
|
var distToFanBottom = 380 + 20 + 60 + contentHeight;
|
||||||
// 槽位高度160 + gap 20 = 180,但实际可能需要微调
|
|
||||||
var firstRowY = -520;
|
// Determine Slot Center Y from Container Top
|
||||||
var secondRowOffset = 200; // 增加偏移量,让第二排更接近fan-deck
|
// Row 0 starts at 0. Center is 80.
|
||||||
var yOffset = firstRowY + (row * secondRowOffset); // row=0: -520, row=1: -320
|
// Row 1 starts at 180. Center is 260.
|
||||||
|
var slotCenterY = (row * 180) + 80;
|
||||||
|
|
||||||
|
// Target Y relative to Fan Bottom (0)
|
||||||
|
// SlotCenter is above FanBottom, so negative.
|
||||||
|
var targetY = -(distToFanBottom - slotCenterY);
|
||||||
|
|
||||||
|
// Adjust for Card Visual Center (Transform Origin: Bottom Center)
|
||||||
|
// Card Height 260 -> Scaled 0.65 -> 169
|
||||||
|
// Visual Center is 84.5 from bottom.
|
||||||
|
// We want visual center at targetY.
|
||||||
|
// Origin (Bottom) needs to be at targetY + 84.5
|
||||||
|
var yOffset = targetY + 84.5;
|
||||||
|
|
||||||
|
var centerOffset = (col - (cardsInRow - 1) / 2) * 120;
|
||||||
|
|
||||||
// 位移并缩小到0.65
|
|
||||||
return 'translate(' + centerOffset + 'rpx, ' + yOffset + 'rpx) scale(0.65) rotate(0deg)';
|
return 'translate(' + centerOffset + 'rpx, ' + yOffset + 'rpx) scale(0.65) rotate(0deg)';
|
||||||
} else {
|
} else {
|
||||||
// 保持在牌堆中的放射状
|
|
||||||
return 'rotate(' + ((currentIdx - 10) * 8) + 'deg)';
|
return 'rotate(' + ((currentIdx - 10) * 8) + 'deg)';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -184,25 +194,25 @@
|
||||||
<!-- 4. 翻牌与结果展示状态 -->
|
<!-- 4. 翻牌与结果展示状态 -->
|
||||||
<view class="result-area" wx:if="{{state === 'flipping' || state === 'revealed'}}">
|
<view class="result-area" wx:if="{{state === 'flipping' || state === 'revealed'}}">
|
||||||
<!-- 卡牌阵列 -->
|
<!-- 卡牌阵列 -->
|
||||||
<view class="spread-display {{selectedSpread.id}}">
|
<!-- 卡牌阵列 (Unified Layout System) -->
|
||||||
<view class="card-slot" wx:for="{{drawnCards}}" wx:key="index">
|
<spread-container
|
||||||
<text class="pos-name">{{selectedSpread.positions[index]}}(第{{index + 1}}张)</text>
|
spread="{{selectedSpread}}"
|
||||||
<view class="flip-scene" bindtap="revealNext" data-index="{{index}}">
|
cards="{{drawnCards}}"
|
||||||
<view class="flip-card {{index < revealedCount ? 'flipped' : ''}}">
|
revealed-count="{{revealedCount}}"
|
||||||
<view class="card-face face-back">
|
bind:reveal="revealNext"
|
||||||
<image class="card-image" src="{{cardBackImage}}" mode="widthFix"></image>
|
bind:viewDetail="viewCardDetail"
|
||||||
</view>
|
/>
|
||||||
<view class="card-face face-front">
|
|
||||||
<image class="card-image {{item.isReversed ? 'reversed' : ''}}" src="{{item.image}}" mode="widthFix"></image>
|
<!-- 翻牌提示 -->
|
||||||
</view>
|
<view class="flip-hint" wx:if="{{state === 'flipping' && revealedCount < selectedSpread.cardCount}}">
|
||||||
</view>
|
<text class="flip-hint-icon">✦</text>
|
||||||
</view>
|
<text class="flip-hint-text">依次点击牌面,逐一揭示</text>
|
||||||
<text class="card-name-sm" wx:if="{{index < revealedCount}}">{{item.name}}{{item.isReversed ? '(逆)' : ''}}</text>
|
<text class="flip-hint-icon">✦</text>
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 解读区域 -->
|
<!-- 解读区域 -->
|
||||||
<view class="interpretation-area" wx:if="{{revealedCount === selectedSpread.cardCount}}" animation="{{infoAnimation}}">
|
<view class="interpretation-area" wx:if="{{revealedCount === selectedSpread.cardCount}}" animation="{{infoAnimation}}">
|
||||||
|
<!-- 加载中 -->
|
||||||
<view class="loading-ai" wx:if="{{isAiLoading}}">
|
<view class="loading-ai" wx:if="{{isAiLoading}}">
|
||||||
<text class="loading-dot">···</text>
|
<text class="loading-dot">···</text>
|
||||||
<text>{{aiLoadingText}}</text>
|
<text>{{aiLoadingText}}</text>
|
||||||
|
|
@ -243,6 +253,20 @@
|
||||||
<text class="content">{{aiResult.advice}}</text>
|
<text class="content">{{aiResult.advice}}</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
<view class="ai-warning">
|
||||||
|
<text>⚠ 塔罗映照潜意识的微光,最终的选择始终在你手中。</text>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 🌟 新增:分享引导模块 -->
|
||||||
|
<view class="share-guidance">
|
||||||
|
<view class="guidance-text">
|
||||||
|
<text>“{{randomGuidanceText}}”</text>
|
||||||
|
</view>
|
||||||
|
<button class="share-btn" open-type="share">
|
||||||
|
<text>分享这次塔罗</text>
|
||||||
|
</button>
|
||||||
|
</view>
|
||||||
|
|
||||||
<button class="reset-btn" bindtap="resetSpread">重新开启</button>
|
<button class="reset-btn" bindtap="resetSpread">重新开启</button>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
|
||||||
|
|
@ -505,14 +505,14 @@ page {
|
||||||
/* 10张牌 - 凯尔特十字 */
|
/* 10张牌 - 凯尔特十字 */
|
||||||
.spread-display.celtic_cross {
|
.spread-display.celtic_cross {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(6, 90rpx);
|
grid-template-columns: repeat(6, 104rpx);
|
||||||
grid-template-rows: repeat(4, auto);
|
grid-template-rows: repeat(4, auto);
|
||||||
gap: 8rpx;
|
gap: 8rpx;
|
||||||
max-width: 580rpx;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.spread-display.celtic_cross .card-slot { width: 90rpx; }
|
.spread-display.celtic_cross .card-slot { width: 104rpx; }
|
||||||
.spread-display.celtic_cross .flip-scene { width: 90rpx; height: 150rpx; }
|
.spread-display.celtic_cross .flip-scene { width: 104rpx; height: 174rpx; }
|
||||||
|
|
||||||
.spread-display.celtic_cross .card-slot:nth-child(1) { grid-area: 2 / 3; }
|
.spread-display.celtic_cross .card-slot:nth-child(1) { grid-area: 2 / 3; }
|
||||||
.spread-display.celtic_cross .card-slot:nth-child(2) { grid-area: 2 / 3; transform: rotate(90deg); z-index: 1; }
|
.spread-display.celtic_cross .card-slot:nth-child(2) { grid-area: 2 / 3; transform: rotate(90deg); z-index: 1; }
|
||||||
|
|
@ -528,14 +528,14 @@ page {
|
||||||
/* 10张牌 - 生命之树 */
|
/* 10张牌 - 生命之树 */
|
||||||
.spread-display.tree_of_life {
|
.spread-display.tree_of_life {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, 90rpx);
|
grid-template-columns: repeat(3, 104rpx);
|
||||||
grid-template-rows: repeat(5, auto);
|
grid-template-rows: repeat(5, auto);
|
||||||
gap: 10rpx;
|
gap: 10rpx;
|
||||||
max-width: 310rpx;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.spread-display.tree_of_life .card-slot { width: 90rpx; }
|
.spread-display.tree_of_life .card-slot { width: 104rpx; }
|
||||||
.spread-display.tree_of_life .flip-scene { width: 90rpx; height: 150rpx; }
|
.spread-display.tree_of_life .flip-scene { width: 104rpx; height: 174rpx; }
|
||||||
|
|
||||||
.spread-display.tree_of_life .card-slot:nth-child(1) { grid-area: 1 / 2; }
|
.spread-display.tree_of_life .card-slot:nth-child(1) { grid-area: 1 / 2; }
|
||||||
.spread-display.tree_of_life .card-slot:nth-child(2) { grid-area: 2 / 1; }
|
.spread-display.tree_of_life .card-slot:nth-child(2) { grid-area: 2 / 1; }
|
||||||
|
|
@ -1091,24 +1091,38 @@ page {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
width: 110rpx;
|
width: 124rpx;
|
||||||
margin-bottom: 8rpx;
|
margin-bottom: 8rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pos-name {
|
.pos-info {
|
||||||
font-size: 20rpx;
|
|
||||||
color: #8a8a9d;
|
|
||||||
margin-bottom: 8rpx;
|
|
||||||
text-align: center;
|
|
||||||
height: 40rpx;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
min-height: 60rpx;
|
||||||
|
margin-bottom: 8rpx;
|
||||||
|
width: 140%; /* Allow spilling over slightly */
|
||||||
|
margin-left: -20%; /* Center the spill */
|
||||||
|
}
|
||||||
|
|
||||||
|
.pos-text-main {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #8a8a9d;
|
||||||
|
text-align: center;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
|
white-space: nowrap; /* Force single line if possible, or allow wrap controlling height */
|
||||||
|
}
|
||||||
|
|
||||||
|
.pos-seq {
|
||||||
|
font-size: 20rpx;
|
||||||
|
color: rgba(138, 138, 157, 0.6);
|
||||||
|
margin-top: 4rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.flip-scene {
|
.flip-scene {
|
||||||
width: 110rpx;
|
width: 124rpx;
|
||||||
height: 185rpx;
|
height: 208rpx;
|
||||||
perspective: 1000rpx;
|
perspective: 1000rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1141,17 +1155,17 @@ page {
|
||||||
|
|
||||||
.card-name-sm {
|
.card-name-sm {
|
||||||
margin-top: 12rpx;
|
margin-top: 12rpx;
|
||||||
font-size: 18rpx;
|
font-size: 22rpx;
|
||||||
color: #c9a0dc;
|
color: #c9a0dc;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 5. 深度解读区域 */
|
/* 5. 深度解读区域 */
|
||||||
.interpretation-area {
|
.interpretation-area {
|
||||||
margin-top: 60rpx;
|
margin-top: 20rpx;
|
||||||
background: rgba(255, 255, 255, 0.03);
|
background: rgba(255, 255, 255, 0.03);
|
||||||
border-radius: 24rpx;
|
border-radius: 24rpx;
|
||||||
padding: 40rpx;
|
padding: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-box {
|
.theme-box {
|
||||||
|
|
@ -1245,7 +1259,7 @@ page {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 80rpx 0;
|
padding: 20rpx 0;
|
||||||
color: #c9a0dc;
|
color: #c9a0dc;
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
}
|
}
|
||||||
|
|
@ -1484,3 +1498,106 @@ page {
|
||||||
box-shadow: 0 4rpx 20rpx rgba(201, 160, 220, 0.3);
|
box-shadow: 0 4rpx 20rpx rgba(201, 160, 220, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* =========================================
|
||||||
|
流式 AI 解读输出样式
|
||||||
|
========================================= */
|
||||||
|
.stream-result {
|
||||||
|
padding: 30rpx 20rpx;
|
||||||
|
animation: fadeIn 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stream-text {
|
||||||
|
display: block;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #e8e0f0;
|
||||||
|
line-height: 1.8;
|
||||||
|
white-space: pre-wrap; /* 保留换行 */
|
||||||
|
word-break: break-all;
|
||||||
|
letter-spacing: 0.5rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from { opacity: 0; transform: translateY(10rpx); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 翻牌提示 */
|
||||||
|
.flip-hint {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 16rpx;
|
||||||
|
margin-top: 32rpx;
|
||||||
|
animation: hintPulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flip-hint-text {
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: #c9a0dc;
|
||||||
|
letter-spacing: 2rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flip-hint-icon {
|
||||||
|
font-size: 20rpx;
|
||||||
|
color: #c9a0dc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes hintPulse {
|
||||||
|
0%, 100% { opacity: 0.5; }
|
||||||
|
50% { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* AI 警示语精简版 */
|
||||||
|
.ai-warning {
|
||||||
|
margin-top: 40rpx;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 22rpx;
|
||||||
|
color: rgba(201, 160, 220, 0.4);
|
||||||
|
letter-spacing: 1rpx;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
padding: 0 40rpx;
|
||||||
|
}
|
||||||
|
/* 5. 分享引导模块 */
|
||||||
|
.share-guidance {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 600rpx;
|
||||||
|
background: linear-gradient(135deg, rgba(201, 160, 220, 0.1) 0%, rgba(201, 160, 220, 0.05) 100%);
|
||||||
|
border: 1px solid rgba(201, 160, 220, 0.3);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
padding: 30rpx;
|
||||||
|
margin: 40rpx 0;
|
||||||
|
text-align: center;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guidance-text {
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #c9a0dc;
|
||||||
|
margin-bottom: 24rpx;
|
||||||
|
font-style: italic;
|
||||||
|
letter-spacing: 2rpx;
|
||||||
|
text-shadow: 0 0 10rpx rgba(201, 160, 220, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-btn {
|
||||||
|
background: linear-gradient(90deg, #ffd700, #daa520);
|
||||||
|
color: #1a1a2e;
|
||||||
|
font-size: 30rpx;
|
||||||
|
font-weight: 600;
|
||||||
|
border-radius: 40rpx;
|
||||||
|
padding: 0 40rpx;
|
||||||
|
line-height: 80rpx;
|
||||||
|
border: none;
|
||||||
|
box-shadow: 0 4rpx 16rpx rgba(218, 165, 32, 0.3);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-btn:active {
|
||||||
|
transform: scale(0.96);
|
||||||
|
box-shadow: 0 2rpx 8rpx rgba(218, 165, 32, 0.3);
|
||||||
|
}
|
||||||
|
/ | ||||||