/** * 属相(生肖)计算工具 */ // 十二生肖数组 const ZODIACS = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'] // 生肖对应的emoji const ZODIAC_EMOJIS = { '鼠': '🐭', '牛': '🐮', '虎': '🐯', '兔': '🐰', '龙': '🐲', '蛇': '🐍', '马': '🐴', '羊': '🐑', '猴': '🐵', '鸡': '🐔', '狗': '🐶', '猪': '🐷' } // 生肖性格特征 const ZODIAC_TRAITS = { '鼠': { name: '鼠', emoji: '🐭', personality: '机智灵活,善于社交,聪明伶俐', loveStyle: '浪漫细腻,善于制造惊喜', advantage: '头脑灵活、适应力强、幽默风趣', weakness: '有时过于谨慎、容易多疑', luckyColor: '蓝色、金色', luckyNumber: '2、3', compatibility: { best: ['龙', '猴', '牛'], good: ['鼠', '虎', '蛇'], avoid: ['马', '羊', '鸡'] } }, '牛': { name: '牛', emoji: '🐮', personality: '踏实稳重,勤劳努力,值得信赖', loveStyle: '专一深情,默默付出', advantage: '勤奋踏实、责任心强、值得依靠', weakness: '有时固执己见、不够浪漫', luckyColor: '黄色、绿色', luckyNumber: '1、9', compatibility: { best: ['鼠', '蛇', '鸡'], good: ['牛', '兔', '猪'], avoid: ['马', '羊', '龙'] } }, '虎': { name: '虎', emoji: '🐯', personality: '勇敢自信,充满激情,领导力强', loveStyle: '热情主动,保护欲强', advantage: '勇敢果断、充满魅力、正义感强', weakness: '容易冲动、有时过于强势', luckyColor: '橙色、蓝色', luckyNumber: '1、3、4', compatibility: { best: ['马', '狗', '猪'], good: ['龙', '羊'], avoid: ['蛇', '猴'] } }, '兔': { name: '兔', emoji: '🐰', personality: '温柔善良,优雅细腻,懂得生活', loveStyle: '温柔体贴,浪漫优雅', advantage: '温柔善良、审美出众、善解人意', weakness: '有时过于敏感、缺乏安全感', luckyColor: '粉色、白色', luckyNumber: '3、4、9', compatibility: { best: ['羊', '狗', '猪'], good: ['虎', '龙', '蛇'], avoid: ['鸡', '鼠'] } }, '龙': { name: '龙', emoji: '🐲', personality: '自信大方,富有理想,魅力十足', loveStyle: '浪漫大气,懂得制造惊喜', advantage: '自信魅力、理想远大、慷慨大方', weakness: '有时过于自我、不够耐心', luckyColor: '金色、银色', luckyNumber: '1、6、7', compatibility: { best: ['鼠', '猴', '鸡'], good: ['虎', '兔', '蛇'], avoid: ['狗', '龙'] } }, '蛇': { name: '蛇', emoji: '🐍', personality: '智慧深沉,神秘优雅,洞察力强', loveStyle: '深情专一,神秘诱人', advantage: '智慧深邃、优雅迷人、直觉敏锐', weakness: '有时过于冷静、不易亲近', luckyColor: '红色、黄色', luckyNumber: '2、8、9', compatibility: { best: ['牛', '鸡'], good: ['龙', '兔', '羊'], avoid: ['虎', '猪'] } }, '马': { name: '马', emoji: '🐴', personality: '热情开朗,积极乐观,充满活力', loveStyle: '热烈奔放,追求自由', advantage: '热情开朗、活力四射、乐观向上', weakness: '有时缺乏耐心、容易三分钟热度', luckyColor: '红色、紫色', luckyNumber: '2、3、7', compatibility: { best: ['虎', '羊', '狗'], good: ['龙', '蛇', '猴'], avoid: ['鼠', '牛', '马'] } }, '羊': { name: '羊', emoji: '🐑', personality: '温和善良,富有同情心,艺术气质', loveStyle: '温柔依赖,需要呵护', advantage: '温柔善良、富有创意、同情心强', weakness: '有时过于依赖、优柔寡断', luckyColor: '绿色、红色', luckyNumber: '3、4、9', compatibility: { best: ['兔', '马', '猪'], good: ['蛇', '猴', '鸡'], avoid: ['牛', '狗'] } }, '猴': { name: '猴', emoji: '🐵', personality: '聪明机智,活泼开朗,适应力强', loveStyle: '幽默风趣,善于讨喜', advantage: '聪明机智、幽默风趣、多才多艺', weakness: '有时过于浮躁、不够专注', luckyColor: '白色、蓝色', luckyNumber: '1、7、8', compatibility: { best: ['鼠', '龙'], good: ['牛', '兔', '马'], avoid: ['虎', '猪'] } }, '鸡': { name: '鸡', emoji: '🐔', personality: '自信独立,追求完美,时尚品味', loveStyle: '忠诚专一,追求完美', advantage: '自信独立、追求完美、有品味', weakness: '有时过于挑剔、爱面子', luckyColor: '金色、棕色', luckyNumber: '5、7、8', compatibility: { best: ['牛', '龙', '蛇'], good: ['羊', '猴', '猪'], avoid: ['兔', '鸡', '狗'] } }, '狗': { name: '狗', emoji: '🐶', personality: '忠诚可靠,正直善良,责任感强', loveStyle: '忠诚专一,保护欲强', advantage: '忠诚可靠、正直善良、责任心强', weakness: '有时过于固执、容易焦虑', luckyColor: '红色、绿色', luckyNumber: '3、4、9', compatibility: { best: ['虎', '兔', '马'], good: ['蛇', '猴', '猪'], avoid: ['龙', '羊', '鸡'] } }, '猪': { name: '猪', emoji: '🐷', personality: '真诚善良,乐观豁达,享受生活', loveStyle: '真诚浪漫,包容大度', advantage: '真诚善良、乐观豁达、宽容大度', weakness: '有时过于天真、容易受骗', luckyColor: '黄色、灰色', luckyNumber: '2、5、8', compatibility: { best: ['虎', '兔', '羊'], good: ['鼠', '龙', '鸡'], avoid: ['蛇', '猴', '猪'] } } } /** * 根据公历年份计算生肖 * @param {Number} year - 公历年份 * @returns {String} 生肖名称 */ export function getZodiacByYear(year) { // 1900年是鼠年,以此为基准计算 const baseYear = 1900 const index = (year - baseYear) % 12 return ZODIACS[index] } /** * 根据生日计算生肖 * 注意:这里简化处理,实际应该考虑农历新年 * @param {String} birthday - 生日,格式:YYYY-MM-DD * @returns {String} 生肖名称 */ export function getZodiacByBirthday(birthday) { const year = parseInt(birthday.split('-')[0]) const month = parseInt(birthday.split('-')[1]) // 简化处理:2月4日前算上一年的生肖 let zodiacYear = year if (month === 1 || (month === 2 && parseInt(birthday.split('-')[2]) < 4)) { zodiacYear = year - 1 } return getZodiacByYear(zodiacYear) } /** * 获取生肖emoji * @param {String} zodiac - 生肖名称 * @returns {String} emoji */ export function getZodiacEmoji(zodiac) { return ZODIAC_EMOJIS[zodiac] || '🐷' } /** * 获取生肖详细信息 * @param {String} zodiac - 生肖名称 * @returns {Object} 生肖详细信息 */ export function getZodiacInfo(zodiac) { return ZODIAC_TRAITS[zodiac] || ZODIAC_TRAITS['猪'] } /** * 计算两个生肖的配对指数 * @param {String} zodiac1 - 生肖1 * @param {String} zodiac2 - 生肖2 * @returns {Object} 配对结果 {level: 'best'|'good'|'normal'|'avoid', score: 85} * * 注意:基于传统生肖配对理论,仅供参考 */ export function getZodiacCompatibility(zodiac1, zodiac2) { const info = ZODIAC_TRAITS[zodiac1] if (!info) return { level: 'normal', score: 65, desc: '需要了解更多信息', disclaimer: '仅供参考,真正的契合需要双方共同努力' } if (info.compatibility.best.includes(zodiac2)) { return { level: 'best', score: Math.floor(Math.random() * 8) + 85, // 85-92(避免100%) desc: '根据传统理论,相处较为融洽', disclaimer: '配对仅供参考,感情需要经营' } } else if (info.compatibility.good.includes(zodiac2)) { return { level: 'good', score: Math.floor(Math.random() * 12) + 70, // 70-81 desc: '互相欣赏,可以和谐相处', disclaimer: '配对仅供参考,感情需要经营' } } else if (info.compatibility.avoid.includes(zodiac2)) { return { level: 'avoid', score: Math.floor(Math.random() * 15) + 50, // 50-64 desc: '可能需要更多磨合和包容', disclaimer: '配对仅供参考,感情需要经营' } } else { return { level: 'normal', score: Math.floor(Math.random() * 10) + 60, // 60-69 desc: '各有特色,需要互相理解', disclaimer: '配对仅供参考,感情需要经营' } } } /** * 获取今日运势 * @param {String} zodiac - 生肖名称 * @returns {Object} 今日运势 * * 注意:当前版本为示例数据,建议接入专业API或建立专家数据库 * 推荐API:聚合数据、天行数据、阿凡提数据 */ export function getTodayFortune(zodiac) { // ⚠️ 警告:当前为模拟数据,仅供演示 // TODO: 接入专业API或后端数据库 const fortunes = ['较好', '平稳', '一般'] const randomIndex = Math.floor(Math.random() * fortunes.length) // 生成相对保守的分数(避免极端值) const generateScore = () => Math.floor(Math.random() * 20) + 70 // 70-89 const yiList = ['保持微笑', '积极社交', '主动沟通', '关心他人'] const jiList = ['过度焦虑', '冲动决定', '熬夜晚睡', '情绪化'] return { overall: fortunes[randomIndex], love: generateScore(), career: generateScore(), wealth: generateScore(), health: generateScore(), tips: `根据传统理论建议:${yiList[Math.floor(Math.random() * yiList.length)]},避免${jiList[Math.floor(Math.random() * jiList.length)]}(仅供参考)`, source: 'local_demo', // 标记数据来源 disclaimer: '此数据为示例,建议接入专业API' } } export default { getZodiacByYear, getZodiacByBirthday, getZodiacEmoji, getZodiacInfo, getZodiacCompatibility, getTodayFortune, ZODIACS, ZODIAC_EMOJIS }