/** * 星座相关工具函数 */ import { TIANAPI_CONFIG } from '@/config/api-config.js' // 十二星座数据 export const CONSTELLATIONS = [ { name: '白羊座', emoji: '♈', period: '3.21-4.19', element: '火象', ruler: '火星', description: '热情勇敢的火象星座', traits: ['勇敢', '热情', '积极'], personality: '热情洋溢,勇敢直率,富有冒险精神', loveStyle: '主动热情,喜欢浪漫刺激的恋爱', luckyColor: '红色', luckyNumber: [1, 3, 9], compatibility: { best: ['狮子座', '射手座', '双子座'], good: ['水瓶座', '天秤座'], avoid: ['巨蟹座', '摩羯座'] } }, { name: '金牛座', emoji: '♉', period: '4.20-5.20', element: '土象', ruler: '金星', description: '稳重踏实的土象星座', traits: ['稳重', '务实', '固执'], personality: '踏实稳重,勤劳努力,值得信赖', loveStyle: '专一深情,默默付出', luckyColor: '绿色', luckyNumber: [2, 6, 18], compatibility: { best: ['处女座', '摩羯座', '巨蟹座'], good: ['双鱼座', '天蝎座'], avoid: ['狮子座', '水瓶座'] } }, { name: '双子座', emoji: '♊', period: '5.21-6.21', element: '风象', ruler: '水星', description: '机智灵活的风象星座', traits: ['机智', '多变', '好奇'], personality: '机智灵活,好奇心强,善于沟通交流', loveStyle: '喜欢有趣的恋爱关系,注重精神交流', luckyColor: '黄色', luckyNumber: [3, 5, 14], compatibility: { best: ['天秤座', '水瓶座', '白羊座'], good: ['狮子座', '射手座'], avoid: ['处女座', '双鱼座'] } }, { name: '巨蟹座', emoji: '♋', period: '6.22-7.22', element: '水象', ruler: '月亮', description: '温柔感性的水象星座', traits: ['温柔', '感性', '顾家'], personality: '温柔敏感,重视家庭和情感', loveStyle: '渴望稳定温馨的恋爱关系', luckyColor: '银色', luckyNumber: [2, 7, 11], compatibility: { best: ['天蝎座', '双鱼座', '金牛座'], good: ['处女座', '摩羯座'], avoid: ['白羊座', '天秤座'] } }, { name: '狮子座', emoji: '♌', period: '7.23-8.22', element: '火象', ruler: '太阳', description: '自信王者的火象星座', traits: ['自信', '大方', '领导'], personality: '自信大方,有王者风范', loveStyle: '在爱情中慷慨浪漫,喜欢被崇拜', luckyColor: '金色', luckyNumber: [1, 10, 19], compatibility: { best: ['白羊座', '射手座', '双子座'], good: ['天秤座', '水瓶座'], avoid: ['金牛座', '天蝎座'] } }, { name: '处女座', emoji: '♍', period: '8.23-9.22', element: '土象', ruler: '水星', description: '完美主义的土象星座', traits: ['完美', '细致', '挑剔'], personality: '追求完美,注重细节', loveStyle: '在感情中谨慎细心,默默关心', luckyColor: '蓝色', luckyNumber: [3, 6, 15], compatibility: { best: ['金牛座', '摩羯座', '巨蟹座'], good: ['天蝎座', '双鱼座'], avoid: ['双子座', '射手座'] } }, { name: '天秤座', emoji: '♎', period: '9.23-10.23', element: '风象', ruler: '金星', description: '优雅和谐的风象星座', traits: ['优雅', '和谐', '犹豫'], personality: '追求和谐平衡,有优雅的品味', loveStyle: '渴望和谐美好的爱情,重视精神契合', luckyColor: '粉色', luckyNumber: [6, 9, 24], compatibility: { best: ['双子座', '水瓶座', '狮子座'], good: ['白羊座', '射手座'], avoid: ['巨蟹座', '摩羯座'] } }, { name: '天蝎座', emoji: '♏', period: '10.24-11.22', element: '水象', ruler: '冥王星', description: '神秘深刻的水象星座', traits: ['神秘', '专注', '极端'], personality: '神秘深刻,意志坚强', loveStyle: '在感情中专一深情,爱恨分明', luckyColor: '深红色', luckyNumber: [4, 8, 13], compatibility: { best: ['巨蟹座', '双鱼座', '处女座'], good: ['金牛座', '摩羯座'], avoid: ['狮子座', '水瓶座'] } }, { name: '射手座', emoji: '♐', period: '11.23-12.21', element: '火象', ruler: '木星', description: '自由奔放的火象星座', traits: ['自由', '乐观', '直率'], personality: '自由奔放,乐观开朗', loveStyle: '在感情中追求自由和刺激', luckyColor: '紫色', luckyNumber: [3, 9, 21], compatibility: { best: ['白羊座', '狮子座', '水瓶座'], good: ['双子座', '天秤座'], avoid: ['处女座', '双鱼座'] } }, { name: '摩羯座', emoji: '♑', period: '12.22-1.19', element: '土象', ruler: '土星', description: '踏实上进的土象星座', traits: ['踏实', '上进', '保守'], personality: '踏实上进,有强烈的责任感', loveStyle: '在感情中谨慎稳重,注重长期发展', luckyColor: '棕色', luckyNumber: [8, 10, 26], compatibility: { best: ['金牛座', '处女座', '天蝎座'], good: ['巨蟹座', '双鱼座'], avoid: ['白羊座', '天秤座'] } }, { name: '水瓶座', emoji: '♒', period: '1.20-2.18', element: '风象', ruler: '天王星', description: '创新独立的风象星座', traits: ['创新', '独立', '理性'], personality: '独立创新,有人道主义精神', loveStyle: '在感情中追求精神层面的交流', luckyColor: '蓝紫色', luckyNumber: [4, 7, 22], compatibility: { best: ['双子座', '天秤座', '射手座'], good: ['白羊座', '狮子座'], avoid: ['金牛座', '天蝎座'] } }, { name: '双鱼座', emoji: '♓', period: '2.19-3.20', element: '水象', ruler: '海王星', description: '浪漫梦幻的水象星座', traits: ['浪漫', '梦幻', '敏感'], personality: '浪漫梦幻,富有同情心', loveStyle: '在感情中浪漫理想,渴望童话般的爱情', luckyColor: '海蓝色', luckyNumber: [5, 12, 29], compatibility: { best: ['巨蟹座', '天蝎座', '摩羯座'], good: ['金牛座', '处女座'], avoid: ['双子座', '射手座'] } } ] /** * 根据星座名称获取星座信息 * @param {String} constellationName 星座名称 * @returns {Object} 星座信息对象 */ export function getConstellationInfo(constellationName) { return CONSTELLATIONS.find(c => c.name === constellationName) || null } /** * 根据星座名称获取星座emoji * @param {String} constellationName 星座名称 * @returns {String} 星座emoji */ export function getConstellationEmoji(constellationName) { const constellation = getConstellationInfo(constellationName) return constellation ? constellation.emoji : '⭐' } /** * 获取所有星座列表 * @returns {Array} 星座列表 */ export function getAllConstellations() { return CONSTELLATIONS } /** * 调用天行数据API获取星座运势 * @param {String} constellation 星座名称 * @returns {Promise} API返回结果 */ export async function getConstellationFortuneFromAPI(constellation) { try { if (!TIANAPI_CONFIG.API_KEY) { return null } // 星座名称映射 (天行数据可能需要英文或特定格式) const constellationMap = { '白羊座': 'aries', '金牛座': 'taurus', '双子座': 'gemini', '巨蟹座': 'cancer', '狮子座': 'leo', '处女座': 'virgo', '天秤座': 'libra', '天蝎座': 'scorpio', '射手座': 'sagittarius', '摩羯座': 'capricorn', '水瓶座': 'aquarius', '双鱼座': 'pisces' } const englishName = constellationMap[constellation] if (!englishName) { return null } const url = `${TIANAPI_CONFIG.BASE_URL}${TIANAPI_CONFIG.ENDPOINTS.constellation}` const params = { key: TIANAPI_CONFIG.API_KEY, astro: englishName } const response = await new Promise((resolve, reject) => { uni.request({ url: url, data: params, method: 'GET', timeout: 10000, success: (res) => { resolve(res) }, fail: (err) => { console.error('📡 API请求失败:', err) reject(err) } }) }) if (response.statusCode === 200 && response.data && response.data.code === 200) { const result = response.data.result if (result && result.list && result.list.length > 0) { // 解析天行数据API返回的格式 const apiData = {} result.list.forEach(item => { switch(item.type) { case '综合指数': apiData.overall = parseInt(item.content) || 80 break case '爱情指数': apiData.love = parseInt(item.content) || 75 break case '事业指数': apiData.career = parseInt(item.content) || 78 break case '财运指数': apiData.wealth = parseInt(item.content) || 72 break case '健康指数': apiData.health = parseInt(item.content) || 80 break case '今日概述': apiData.advice = item.content || '今天是美好的一天!' break } }) return { overall: apiData.overall || 80, love: apiData.love || 75, career: apiData.career || 78, wealth: apiData.wealth || 72, health: apiData.health || 80, advice: apiData.advice || '今天是美好的一天,保持积极心态!', level: apiData.overall >= 90 ? '超棒' : apiData.overall >= 80 ? '极佳' : apiData.overall >= 70 ? '良好' : '一般', levelColor: apiData.overall >= 90 ? 'linear-gradient(135deg, #FF6B6B 0%, #FF8E53 100%)' : apiData.overall >= 80 ? 'linear-gradient(135deg, #4CAF50 0%, #81C784 100%)' : apiData.overall >= 70 ? 'linear-gradient(135deg, #2196F3 0%, #64B5F6 100%)' : 'linear-gradient(135deg, #9E9E9E 0%, #BDBDBD 100%)', source: 'tianapi', dataFrom: '天行数据专业API', updateTime: new Date().toLocaleString('zh-CN') } } } return null } catch (error) { console.error('❌ 星座运势API调用异常:', error) return null } } /** * 生成本地星座运势数据 * @param {String} constellation 星座名称 * @returns {Object} 运势数据 */ export function generateLocalConstellationFortune(constellation) { const constellationInfo = getConstellationInfo(constellation) if (!constellationInfo) { return null } // 生成随机分数 const scores = { overall: Math.floor(Math.random() * 30) + 70, love: Math.floor(Math.random() * 40) + 60, career: Math.floor(Math.random() * 40) + 60, wealth: Math.floor(Math.random() * 40) + 60, health: Math.floor(Math.random() * 40) + 60 } // 根据分数确定等级 const levels = ['一般', '良好', '极佳', '超棒'] const levelColors = [ 'linear-gradient(135deg, #9E9E9E 0%, #BDBDBD 100%)', 'linear-gradient(135deg, #2196F3 0%, #64B5F6 100%)', 'linear-gradient(135deg, #4CAF50 0%, #81C784 100%)', 'linear-gradient(135deg, #FF6B6B 0%, #FF8E53 100%)' ] const levelIndex = Math.floor(scores.overall / 25) const level = levels[Math.min(levelIndex, levels.length - 1)] const levelColor = levelColors[Math.min(levelIndex, levelColors.length - 1)] // 根据星座特性生成建议 const adviceTemplates = { '白羊座': [ '今天是展现你勇敢本色的好时机,不要害怕迎接挑战!', '你的热情感染着周围的人,保持这种积极的能量。', '适合主动出击,在爱情或事业上都有不错的机会。' ], '金牛座': [ '稳扎稳打是你的优势,今天坚持自己的节奏就好。', '财运不错,但要避免冲动消费,理性规划更重要。', '感情方面需要多一些耐心,真诚的付出会有回报。' ], '双子座': [ '你的机智和幽默感今天特别受欢迎,多与人交流。', '适合学习新知识或尝试新事物,保持好奇心。', '在沟通中要注意表达的准确性,避免误解。' ], '巨蟹座': [ '今天的直觉特别准确,相信自己的第一感觉。', '家庭和感情是你的能量源泉,多花时间陪伴亲人。', '情绪起伏较大时,找个安静的地方调整心情。' ], '狮子座': [ '你的魅力今天格外闪耀,是展现自己的好时机。', '领导才能得到认可,但要注意倾听他人的意见。', '在感情中保持大方和真诚,会收获意想不到的惊喜。' ], '处女座': [ '细致入微的工作态度为你赢得好评,继续保持。', '今天适合整理和规划,让生活更有条理。', '对自己不要过于苛刻,适当放松也很重要。' ], '天秤座': [ '你的协调能力今天特别突出,可以化解不少矛盾。', '在美的事物上有不错的眼光,适合艺术相关活动。', '做决定时不要过于犹豫,相信自己的判断。' ], '天蝎座': [ '你的洞察力今天特别敏锐,能看透事物的本质。', '在感情中要学会适度表达,不要把所有感受都埋在心里。', '专注力很强,适合处理复杂或需要深度思考的事务。' ], '射手座': [ '自由和冒险的心情高涨,可以计划一次小旅行。', '乐观的态度感染着周围的人,继续传播正能量。', '在学习和探索新领域方面会有不错的收获。' ], '摩羯座': [ '踏实的努力今天会看到成果,坚持就是胜利。', '在职场上的表现得到认可,但不要忘记劳逸结合。', '感情需要更多的浪漫元素,偶尔打破常规很有必要。' ], '水瓶座': [ '创新的想法今天特别多,不妨记录下来慢慢实践。', '朋友圈中你是重要的智慧来源,多分享你的见解。', '在感情中要学会表达真实的感受,不要过于理性。' ], '双鱼座': [ '艺术创作灵感爆发,可以尝试画画、写作或音乐。', '同情心让你成为朋友们的倾诉对象,但也要保护好自己。', '直觉和梦境可能给你重要的启示,多留意。' ] } const advice = adviceTemplates[constellation] || ['今天是美好的一天,保持积极心态!'] const selectedAdvice = advice[Math.floor(Math.random() * advice.length)] return { constellation: constellation, date: new Date().toLocaleDateString('zh-CN'), overall: scores.overall, level: level, levelColor: levelColor, love: scores.love, career: scores.career, wealth: scores.wealth, health: scores.health, advice: selectedAdvice, luckyColor: constellationInfo.luckyColor, luckyNumber: constellationInfo.luckyNumber[Math.floor(Math.random() * constellationInfo.luckyNumber.length)], source: 'local', dataFrom: '星座占星学理论', updateTime: new Date().toLocaleString('zh-CN') } } /** * 获取星座运势(优先API,失败时使用本地数据) * @param {String} constellation 星座名称 * @returns {Promise} 运势数据 */ export async function getConstellationFortune(constellation) { try { // 尝试获取API数据 const apiResult = await getConstellationFortuneFromAPI(constellation) if (apiResult) { return apiResult } // API失败,使用本地数据 return generateLocalConstellationFortune(constellation) } catch (error) { console.error('❌ 获取星座运势异常:', error) // 异常情况下也使用本地数据 return generateLocalConstellationFortune(constellation) } } /** * 生成星座匹配数据 * @param {String} constellation 星座名称 * @returns {Object} 匹配数据 */ export function generateConstellationMatch(constellation) { const constellationInfo = getConstellationInfo(constellation) if (!constellationInfo) { return { best: [], good: [] } } return { best: constellationInfo.compatibility.best.map(name => { const matchInfo = getConstellationInfo(name) return { name: name, emoji: matchInfo?.emoji || '⭐', score: Math.floor(Math.random() * 10) + 90 } }), good: constellationInfo.compatibility.good.map(name => { const matchInfo = getConstellationInfo(name) return { name: name, emoji: matchInfo?.emoji || '⭐', score: Math.floor(Math.random() * 15) + 75 } }) } } /** * 调用天行数据API获取星座配对分析 * @param {String} constellation1 第一个星座名称 * @param {String} constellation2 第二个星座名称 * @returns {Promise} API返回结果 */ export async function getConstellationMatchFromAPI(constellation1, constellation2) { try { if (!TIANAPI_CONFIG.API_KEY) { return null } // 星座名称处理(去掉"座"字) const me = constellation1.replace('座', '') const he = constellation2.replace('座', '') const url = `${TIANAPI_CONFIG.BASE_URL}${TIANAPI_CONFIG.ENDPOINTS.constellationMatch}` const params = { key: TIANAPI_CONFIG.API_KEY, me: me, he: he } const response = await new Promise((resolve, reject) => { uni.request({ url: url, data: params, method: 'GET', timeout: 10000, success: (res) => { resolve(res) }, fail: (err) => { console.error('📡 API请求失败:', err) reject(err) } }) }) if (response.statusCode === 200 && response.data && response.data.code === 200) { const result = response.data.result if (result && (result.title || result.content)) { // 解析天行数据API返回的格式 return { title: result.title || `${constellation1}×${constellation2}`, grade: result.grade || '', content: result.content || '', source: 'tianapi', dataFrom: '天行数据专业API', updateTime: new Date().toLocaleString('zh-CN'), apiData: result } } } return null } catch (error) { console.error('❌ 星座配对API调用异常:', error) return null } } /** * 计算两个星座的详细配对分析(优先API,失败时使用本地数据) * @param {String} constellation1 第一个星座名称 * @param {String} constellation2 第二个星座名称 * @returns {Promise} 详细配对分析结果 */ export async function getDetailedConstellationMatch(constellation1, constellation2) { try { // 尝试获取API数据 const apiResult = await getConstellationMatchFromAPI(constellation1, constellation2) if (apiResult) { return convertAPIDataToStandardFormat(constellation1, constellation2, apiResult) } return getLocalConstellationMatch(constellation1, constellation2) } catch (error) { console.error('❌ 获取星座配对异常:', error) // 异常情况下也使用本地数据 return getLocalConstellationMatch(constellation1, constellation2) } } /** * 将API数据转换为标准格式 * @param {String} constellation1 第一个星座名称 * @param {String} constellation2 第二个星座名称 * @param {Object} apiResult API返回数据 * @returns {Object} 标准格式的配对分析 */ function convertAPIDataToStandardFormat(constellation1, constellation2, apiResult) { const info1 = getConstellationInfo(constellation1) const info2 = getConstellationInfo(constellation2) // 从API的grade字段解析分数 let totalScore = 75 // 默认分数 if (apiResult.grade) { // 解析 "友情:★★ 爱情:★★★ 婚姻:★★ 亲情:★★" 格式 const loveMatch = apiResult.grade.match(/爱情:(★+)/) if (loveMatch) { const stars = loveMatch[1].length totalScore = Math.min(50 + stars * 10, 100) // 1-5颗星对应60-100分 } } // 确定等级和颜色 let level, levelColor, scoreColor if (totalScore >= 90) { level = '天作之合' levelColor = 'linear-gradient(135deg, #FF6B9D 0%, #FFA5C6 100%)' scoreColor = 'linear-gradient(135deg, #FF6B9D 0%, #FFA5C6 100%)' } else if (totalScore >= 80) { level = '非常匹配' levelColor = 'linear-gradient(135deg, #4CAF50 0%, #81C784 100%)' scoreColor = 'linear-gradient(135deg, #4CAF50 0%, #81C784 100%)' } else if (totalScore >= 70) { level = '比较合适' levelColor = 'linear-gradient(135deg, #2196F3 0%, #64B5F6 100%)' scoreColor = 'linear-gradient(135deg, #2196F3 0%, #64B5F6 100%)' } else if (totalScore >= 60) { level = '需要努力' levelColor = 'linear-gradient(135deg, #FF9800 0%, #FFB74D 100%)' scoreColor = 'linear-gradient(135deg, #FF9800 0%, #FFB74D 100%)' } else { level = '挑战较大' levelColor = 'linear-gradient(135deg, #9E9E9E 0%, #BDBDBD 100%)' scoreColor = 'linear-gradient(135deg, #9E9E9E 0%, #BDBDBD 100%)' } // 生成本地分析作为补充 const localAnalysis = generateConstellationAnalysis(info1, info2, { total: totalScore }) return { constellation1: constellation1, constellation2: constellation2, totalScore: totalScore, level: level, levelColor: levelColor, scoreColor: scoreColor, title: apiResult.title || `${constellation1}×${constellation2}`, apiGrade: apiResult.grade || '', apiContent: apiResult.content || '', elementCompatibility: localAnalysis.elementCompatibility, personalityMatch: localAnalysis.personalityMatch, advantages: apiResult.content || localAnalysis.advantages, challenges: localAnalysis.challenges, suggestions: localAnalysis.suggestions, lovePrediction: localAnalysis.lovePrediction, source: 'tianapi', dataFrom: '天行数据专业API + 本地分析', updateTime: apiResult.updateTime } } /** * 获取本地星座配对分析 * @param {String} constellation1 第一个星座名称 * @param {String} constellation2 第二个星座名称 * @returns {Object} 本地配对分析结果 */ function getLocalConstellationMatch(constellation1, constellation2) { const info1 = getConstellationInfo(constellation1) const info2 = getConstellationInfo(constellation2) if (!info1 || !info2) { return null } // 计算基础匹配度 const compatibilityScore = calculateConstellationCompatibility(info1, info2) // 生成详细分析 const analysis = generateConstellationAnalysis(info1, info2, compatibilityScore) return { constellation1: constellation1, constellation2: constellation2, totalScore: compatibilityScore.total, level: compatibilityScore.level, levelColor: compatibilityScore.levelColor, scoreColor: compatibilityScore.scoreColor, elementCompatibility: analysis.elementCompatibility, personalityMatch: analysis.personalityMatch, advantages: analysis.advantages, challenges: analysis.challenges, suggestions: analysis.suggestions, lovePrediction: analysis.lovePrediction, source: 'local', dataFrom: '星座占星学理论', updateTime: new Date().toLocaleString('zh-CN') } } /** * 计算星座配对得分 * @param {Object} info1 第一个星座信息 * @param {Object} info2 第二个星座信息 * @returns {Object} 配对得分详情 */ function calculateConstellationCompatibility(info1, info2) { // 元素相容性得分 (30%) const elementScore = getElementCompatibilityScore(info1.element, info2.element) // 传统配对得分 (40%) const traditionalScore = getTraditionalMatchScore(info1, info2) // 性格互补得分 (30%) const personalityScore = getPersonalityCompatibilityScore(info1, info2) // 综合计算 const total = Math.round( elementScore * 0.3 + traditionalScore * 0.4 + personalityScore * 0.3 ) // 确定等级和颜色 let level, levelColor, scoreColor if (total >= 90) { level = '天作之合' levelColor = 'linear-gradient(135deg, #FF6B9D 0%, #FFA5C6 100%)' scoreColor = 'linear-gradient(135deg, #FF6B9D 0%, #FFA5C6 100%)' } else if (total >= 80) { level = '非常匹配' levelColor = 'linear-gradient(135deg, #4CAF50 0%, #81C784 100%)' scoreColor = 'linear-gradient(135deg, #4CAF50 0%, #81C784 100%)' } else if (total >= 70) { level = '比较合适' levelColor = 'linear-gradient(135deg, #2196F3 0%, #64B5F6 100%)' scoreColor = 'linear-gradient(135deg, #2196F3 0%, #64B5F6 100%)' } else if (total >= 60) { level = '需要努力' levelColor = 'linear-gradient(135deg, #FF9800 0%, #FFB74D 100%)' scoreColor = 'linear-gradient(135deg, #FF9800 0%, #FFB74D 100%)' } else { level = '挑战较大' levelColor = 'linear-gradient(135deg, #9E9E9E 0%, #BDBDBD 100%)' scoreColor = 'linear-gradient(135deg, #9E9E9E 0%, #BDBDBD 100%)' } return { total, level, levelColor, scoreColor, elementScore, traditionalScore, personalityScore } } /** * 获取元素相容性得分 * @param {String} element1 第一个元素 * @param {String} element2 第二个元素 * @returns {Number} 相容性得分 */ function getElementCompatibilityScore(element1, element2) { const compatibilityMatrix = { '火象': { '火象': 85, '土象': 65, '风象': 90, '水象': 45 }, '土象': { '火象': 65, '土象': 80, '风象': 55, '水象': 95 }, '风象': { '火象': 90, '土象': 55, '风象': 75, '水象': 70 }, '水象': { '火象': 45, '土象': 95, '风象': 70, '水象': 85 } } return compatibilityMatrix[element1]?.[element2] || 70 } /** * 获取传统配对得分 * @param {Object} info1 第一个星座信息 * @param {Object} info2 第二个星座信息 * @returns {Number} 传统配对得分 */ function getTraditionalMatchScore(info1, info2) { let score1 = 70, score2 = 70 // 双向检查配对关系 if (info1.compatibility.best.includes(info2.name)) score1 = 95 else if (info1.compatibility.good.includes(info2.name)) score1 = 80 else if (info1.compatibility.avoid.includes(info2.name)) score1 = 50 if (info2.compatibility.best.includes(info1.name)) score2 = 95 else if (info2.compatibility.good.includes(info1.name)) score2 = 80 else if (info2.compatibility.avoid.includes(info1.name)) score2 = 50 return Math.round((score1 + score2) / 2) } /** * 获取性格相容性得分 * @param {Object} info1 第一个星座信息 * @param {Object} info2 第二个星座信息 * @returns {Number} 性格相容性得分 */ function getPersonalityCompatibilityScore(info1, info2) { // 检查共同特质 const commonTraits = info1.traits.filter(trait => info2.traits.includes(trait)) const commonTraitsScore = commonTraits.length * 15 // 检查互补特质 const complementaryPairs = [ ['勇敢', '温柔'], ['热情', '稳重'], ['积极', '细致'], ['自信', '谦逊'], ['领导', '支持'], ['创新', '传统'] ] let complementaryScore = 0 complementaryPairs.forEach(pair => { if ((info1.traits.includes(pair[0]) && info2.traits.includes(pair[1])) || (info1.traits.includes(pair[1]) && info2.traits.includes(pair[0]))) { complementaryScore += 10 } }) return Math.min(60 + commonTraitsScore + complementaryScore, 100) } /** * 生成星座配对分析 * @param {Object} info1 第一个星座信息 * @param {Object} info2 第二个星座信息 * @param {Object} compatibilityScore 配对得分 * @returns {Object} 配对分析 */ function generateConstellationAnalysis(info1, info2, compatibilityScore) { const element1 = info1.element const element2 = info2.element const totalScore = compatibilityScore.total // 元素相容性分析 const elementCompatibility = getElementCompatibilityAnalysis(element1, element2) // 性格匹配分析 const personalityMatch = getPersonalityMatchAnalysis(info1, info2) // 优势分析 const advantages = generateAdvantagesAnalysis(info1, info2, element1, element2) // 挑战分析 const challenges = generateChallengesAnalysis(info1, info2, element1, element2) // 建议分析 const suggestions = generateSuggestionsAnalysis(info1, info2, totalScore) // 爱情预测 const lovePrediction = generateLovePredictionData(totalScore) return { elementCompatibility, personalityMatch, advantages, challenges, suggestions, lovePrediction } } /** * 获取元素相容性分析 * @param {String} element1 第一个元素 * @param {String} element2 第二个元素 * @returns {String} 元素相容性分析 */ function getElementCompatibilityAnalysis(element1, element2) { const analyses = { '火象火象': '同为火象星座,你们都充满激情和活力,能够互相理解对方的冲动和热情,但也要注意避免过度竞争。', '火象土象': '火象的激情与土象的稳重形成有趣的对比,火象能激发土象的活力,土象能稳定火象的冲动。', '火象风象': '火象与风象的结合如同火遇风,能够互相激发,创造出更大的能量和无限的可能性。', '火象水象': '火象与水象的组合充满戏剧性,虽然差异明显,但正是这种差异创造了独特的吸引力。', '土象土象': '同为土象星座,你们都追求稳定和安全感,能够建立坚实可靠的关系基础。', '土象风象': '土象的踏实与风象的灵活形成互补,需要相互学习和适应,找到平衡点。', '土象水象': '土象与水象的组合非常和谐,既有物质基础的稳定性又有情感上的丰富性。', '风象风象': '同为风象星座,你们都重视精神交流和智慧碰撞,有着无穷无尽的话题。', '风象水象': '风象的理性与水象的感性形成有趣的平衡,能够互相学习不同的思维方式。', '水象水象': '同为水象星座,你们情感丰富敏感,能够深度理解彼此的内心世界和情感需求。' } const key = element1 + element2 return analyses[key] || analyses[element2 + element1] || '你们的元素组合有着独特的化学反应,值得深入探索。' } /** * 获取性格匹配分析 * @param {Object} info1 第一个星座信息 * @param {Object} info2 第二个星座信息 * @returns {String} 性格匹配分析 */ function getPersonalityMatchAnalysis(info1, info2) { const commonTraits = info1.traits.filter(trait => info2.traits.includes(trait)) if (commonTraits.length >= 2) { return `你们都具有${commonTraits.join('、')}的特质,在这些方面容易产生共鸣和理解。` } else if (commonTraits.length === 1) { return `你们共同的${commonTraits[0]}特质为关系奠定了基础,其他方面的差异则增加了吸引力。` } else { return '你们的性格特质各有特色,这种差异性能够让彼此学到很多新的东西。' } } /** * 生成优势分析 * @param {Object} info1 第一个星座信息 * @param {Object} info2 第二个星座信息 * @param {String} element1 第一个元素 * @param {String} element2 第二个元素 * @returns {String} 优势分析 */ function generateAdvantagesAnalysis(info1, info2, element1, element2) { const advantages = [] // 基于元素的优势 if (element1 === element2) { advantages.push('属于同一元素,在价值观和生活节奏上有天然的默契') } else if ( (element1 === '火象' && element2 === '风象') || (element1 === '风象' && element2 === '火象') ) { advantages.push('火象与风象的组合充满创意和激情,能够互相激发潜能') } else if ( (element1 === '土象' && element2 === '水象') || (element1 === '水象' && element2 === '土象') ) { advantages.push('土象与水象的结合既稳定又温馨,能够建立深厚的情感纽带') } // 基于配对关系的优势 if (info1.compatibility.best.includes(info2.name)) { advantages.push('从传统占星学角度来看,你们是理想的配对组合') } else if (info1.compatibility.good.includes(info2.name)) { advantages.push('你们的星座组合在传统上被认为是和谐的搭配') } // 基于特质的优势 const commonTraits = info1.traits.filter(trait => info2.traits.includes(trait)) if (commonTraits.length > 0) { advantages.push(`共同的${commonTraits.join('、')}特质让你们容易理解彼此`) } return advantages.length > 0 ? advantages.join(';') : '你们的组合有着独特的魅力和潜力。' } /** * 生成挑战分析 * @param {Object} info1 第一个星座信息 * @param {Object} info2 第二个星座信息 * @param {String} element1 第一个元素 * @param {String} element2 第二个元素 * @returns {String} 挑战分析 */ function generateChallengesAnalysis(info1, info2, element1, element2) { const challenges = [] // 基于元素的挑战 if ( (element1 === '火象' && element2 === '水象') || (element1 === '水象' && element2 === '火象') ) { challenges.push('火象的直接与水象的含蓄可能造成沟通上的误解') } else if ( (element1 === '土象' && element2 === '风象') || (element1 === '风象' && element2 === '土象') ) { challenges.push('土象的稳重与风象的多变可能在生活节奏上产生分歧') } // 基于避免列表的挑战 if (info1.compatibility.avoid.includes(info2.name)) { challenges.push('你们的性格差异较大,需要更多的理解和包容') } // 通用挑战 challenges.push('任何关系都需要双方的努力和妥协,保持开放诚实的沟通') return challenges.join(';') } /** * 生成建议分析 * @param {Object} info1 第一个星座信息 * @param {Object} info2 第二个星座信息 * @param {Number} totalScore 总分 * @returns {String} 建议分析 */ function generateSuggestionsAnalysis(info1, info2, totalScore) { const suggestions = [] if (totalScore >= 85) { suggestions.push('你们的匹配度很高,要珍惜这份难得的缘分') } else if (totalScore >= 70) { suggestions.push('通过深入了解和有效沟通,你们的关系会更加稳固') } else { suggestions.push('虽然面临一些挑战,但只要双方都愿意努力,完全可以克服') } suggestions.push(`理解${info1.name}的${info1.loveStyle}和${info2.name}的${info2.loveStyle},互相欣赏对方的爱情观`) suggestions.push('记住,星座只是参考,真正的感情需要用心去经营和维护') return suggestions.join(';') } /** * 生成爱情预测数据 * @param {Number} totalScore 总分 * @returns {Array} 爱情预测数据 */ function generateLovePredictionData(totalScore) { const baseScore = totalScore return [ { label: '初见印象', icon: '👀', value: Math.min(baseScore + Math.floor(Math.random() * 10) - 5, 100) + '%', bgColor: 'linear-gradient(135deg, #FFB6C1 0%, #FFE4E1 100%)' }, { label: '恋爱甜蜜度', icon: '🍯', value: Math.min(baseScore + Math.floor(Math.random() * 15) - 7, 100) + '%', bgColor: 'linear-gradient(135deg, #FF6B9D 0%, #FFA5C6 100%)' }, { label: '长期稳定性', icon: '🏠', value: Math.min(baseScore + Math.floor(Math.random() * 8) - 4, 100) + '%', bgColor: 'linear-gradient(135deg, #4CAF50 0%, #81C784 100%)' }, { label: '婚姻契合度', icon: '💍', value: Math.min(baseScore + Math.floor(Math.random() * 12) - 6, 100) + '%', bgColor: 'linear-gradient(135deg, #9C27B0 0%, #CE93D8 100%)' } ] } /** * 生成幸运元素 * @param {String} constellation 星座名称 * @returns {Array} 幸运元素列表 */ export function generateLuckyElements(constellation) { const constellationInfo = getConstellationInfo(constellation) if (!constellationInfo) { return [] } const stones = ['紫水晶', '玫瑰石英', '黑曜石', '白水晶', '碧玺', '翡翠', '琥珀', '珍珠'] const directions = ['东', '南', '西', '北', '东南', '西南', '东北', '西北'] return [ { label: '幸运色', icon: '🎨', value: constellationInfo.luckyColor, bgColor: 'linear-gradient(135deg, #FFB6C1 0%, #FFE4E1 100%)' }, { label: '幸运数字', icon: '🔢', value: constellationInfo.luckyNumber[Math.floor(Math.random() * constellationInfo.luckyNumber.length)].toString(), bgColor: 'linear-gradient(135deg, #9C27B0 0%, #CE93D8 100%)' }, { label: '幸运石', icon: '💎', value: stones[Math.floor(Math.random() * stones.length)], bgColor: 'linear-gradient(135deg, #2196F3 0%, #64B5F6 100%)' }, { label: '幸运方位', icon: '🧭', value: directions[Math.floor(Math.random() * directions.length)], bgColor: 'linear-gradient(135deg, #4CAF50 0%, #81C784 100%)' } ] } /** * 生成星座特质详解 * @param {String} constellation 星座名称 * @returns {Array} 特质详解列表 */ export function generateConstellationTraits(constellation) { const traitsData = { '白羊座': [ { icon: '🔥', title: '性格特点', content: '热情洋溢,勇敢直率,富有冒险精神。喜欢挑战,敢于开拓新领域,是天生的领导者。' }, { icon: '💕', title: '爱情观', content: '在爱情中主动热情,喜欢浪漫刺激的恋爱。一旦爱上就会全力以赴,但也容易因冲动而受伤。' }, { icon: '💼', title: '事业运', content: '适合需要创新和领导能力的工作。在竞争激烈的环境中能发挥优势,但需要学会耐心和坚持。' } ], '金牛座': [ { icon: '🏔️', title: '性格特点', content: '稳重踏实,有强烈的责任感。注重物质安全,喜欢稳定的生活环境,做事有始有终。' }, { icon: '💕', title: '爱情观', content: '在感情中忠诚专一,注重长期稳定的关系。虽然慢热,但一旦确定关系就会全心投入。' }, { icon: '💼', title: '事业运', content: '适合需要耐心和专业技能的工作。在金融、艺术、美食等领域有天赋,能够长期积累成就。' } ], '双子座': [ { icon: '🌪️', title: '性格特点', content: '机智灵活,好奇心强,善于沟通交流。思维活跃,适应能力强,但有时显得不够专一。' }, { icon: '💕', title: '爱情观', content: '喜欢有趣的恋爱关系,注重精神层面的交流。需要对方能跟上自己的思维节奏。' }, { icon: '💼', title: '事业运', content: '适合需要沟通协调的工作。在媒体、教育、销售等领域能发挥优势,但需要避免三心二意。' } ], '巨蟹座': [ { icon: '🏠', title: '性格特点', content: '温柔敏感,重视家庭和情感。有强烈的保护欲,善于照顾他人,但有时过于敏感多疑。' }, { icon: '💕', title: '爱情观', content: '渴望稳定温馨的恋爱关系,会为爱人付出一切。但容易因为缺乏安全感而多疑。' }, { icon: '💼', title: '事业运', content: '适合与人打交道的服务性工作。在医疗、教育、餐饮等领域有天赋,能给人温暖感受。' } ], '狮子座': [ { icon: '👑', title: '性格特点', content: '自信大方,有王者风范。喜欢成为焦点,慷慨大度,但有时过于骄傲,需要别人的赞美。' }, { icon: '💕', title: '爱情观', content: '在爱情中慷慨浪漫,喜欢被崇拜的感觉。会为爱人创造浪漫惊喜,但也需要对方的认可。' }, { icon: '💼', title: '事业运', content: '适合需要展现个人魅力的工作。在娱乐、艺术、管理等领域能发光发热,是天生的明星。' } ], '处女座': [ { icon: '🔍', title: '性格特点', content: '追求完美,注重细节。做事认真负责,有强烈的服务精神,但有时过于挑剔苛求。' }, { icon: '💕', title: '爱情观', content: '在感情中谨慎细心,会默默关心对方的每个细节。虽然不善表达,但爱意深藏。' }, { icon: '💼', title: '事业运', content: '适合需要精确性和专业性的工作。在医疗、会计、研究等领域有优势,能做到精益求精。' } ], '天秤座': [ { icon: '⚖️', title: '性格特点', content: '追求和谐平衡,有优雅的品味。善于调解矛盾,但有时过于犹豫不决,难以做出选择。' }, { icon: '💕', title: '爱情观', content: '渴望和谐美好的爱情,重视精神契合。在感情中善于妥协,但有时缺乏主见。' }, { icon: '💼', title: '事业运', content: '适合需要审美和协调能力的工作。在设计、法律、外交等领域有天赋,能营造和谐氛围。' } ], '天蝎座': [ { icon: '🦂', title: '性格特点', content: '神秘深刻,意志坚强。有强烈的直觉力,善于洞察他人内心,但有时过于极端和报复心重。' }, { icon: '💕', title: '爱情观', content: '在感情中专一深情,爱恨分明。一旦爱上就会全身心投入,但也容易因嫉妒而痛苦。' }, { icon: '💼', title: '事业运', content: '适合需要深度研究和洞察力的工作。在心理学、侦探、投资等领域有优势,能发现他人忽略的细节。' } ], '射手座': [ { icon: '🏹', title: '性格特点', content: '自由奔放,乐观开朗。热爱冒险和旅行,有哲学思维,但有时过于直率,缺乏耐心。' }, { icon: '💕', title: '爱情观', content: '在感情中追求自由和刺激,不喜欢被束缚。需要有共同兴趣和理想的伴侣。' }, { icon: '💼', title: '事业运', content: '适合需要创新和自由度的工作。在旅游、教育、出版等领域有优势,能带来新鲜活力。' } ], '摩羯座': [ { icon: '🏔️', title: '性格特点', content: '踏实上进,有强烈的责任感。目标明确,善于规划,但有时过于严肃,缺乏幽默感。' }, { icon: '💕', title: '爱情观', content: '在感情中谨慎稳重,注重长期发展。虽然表达含蓄,但会通过实际行动证明爱意。' }, { icon: '💼', title: '事业运', content: '适合需要长期规划和管理能力的工作。在企业管理、建筑、政府等领域有优势,能稳步上升。' } ], '水瓶座': [ { icon: '🌊', title: '性格特点', content: '独立创新,有人道主义精神。思维前卫,善于发现新事物,但有时过于理性,显得冷漠。' }, { icon: '💕', title: '爱情观', content: '在感情中追求精神层面的交流,注重友谊基础。需要理解和支持自己理想的伴侣。' }, { icon: '💼', title: '事业运', content: '适合需要创新思维的工作。在科技、公益、新媒体等领域有优势,能引领时代潮流。' } ], '双鱼座': [ { icon: '🌙', title: '性格特点', content: '浪漫梦幻,富有同情心。想象力丰富,艺术天赋高,但有时过于敏感,容易逃避现实。' }, { icon: '💕', title: '爱情观', content: '在感情中浪漫理想,渴望童话般的爱情。容易为爱牺牲,但也容易受伤。' }, { icon: '💼', title: '事业运', content: '适合需要创意和同情心的工作。在艺术、医疗、慈善等领域有优势,能给人带来温暖。' } ] } return traitsData[constellation] || [] } export default { CONSTELLATIONS, getConstellationInfo, getConstellationEmoji, getAllConstellations, getConstellationFortune, generateConstellationMatch, generateLuckyElements, generateConstellationTraits, getDetailedConstellationMatch, getConstellationMatchFromAPI }