zodiac.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. /**
  2. * 属相(生肖)计算工具
  3. */
  4. // 十二生肖数组
  5. const ZODIACS = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪']
  6. // 生肖对应的emoji
  7. const ZODIAC_EMOJIS = {
  8. '鼠': '🐭',
  9. '牛': '🐮',
  10. '虎': '🐯',
  11. '兔': '🐰',
  12. '龙': '🐲',
  13. '蛇': '🐍',
  14. '马': '🐴',
  15. '羊': '🐑',
  16. '猴': '🐵',
  17. '鸡': '🐔',
  18. '狗': '🐶',
  19. '猪': '🐷'
  20. }
  21. // 生肖性格特征
  22. const ZODIAC_TRAITS = {
  23. '鼠': {
  24. name: '鼠',
  25. emoji: '🐭',
  26. personality: '机智灵活,善于社交,聪明伶俐',
  27. loveStyle: '浪漫细腻,善于制造惊喜',
  28. advantage: '头脑灵活、适应力强、幽默风趣',
  29. weakness: '有时过于谨慎、容易多疑',
  30. luckyColor: '蓝色、金色',
  31. luckyNumber: '2、3',
  32. compatibility: {
  33. best: ['龙', '猴', '牛'],
  34. good: ['鼠', '虎', '蛇'],
  35. avoid: ['马', '羊', '鸡']
  36. }
  37. },
  38. '牛': {
  39. name: '牛',
  40. emoji: '🐮',
  41. personality: '踏实稳重,勤劳努力,值得信赖',
  42. loveStyle: '专一深情,默默付出',
  43. advantage: '勤奋踏实、责任心强、值得依靠',
  44. weakness: '有时固执己见、不够浪漫',
  45. luckyColor: '黄色、绿色',
  46. luckyNumber: '1、9',
  47. compatibility: {
  48. best: ['鼠', '蛇', '鸡'],
  49. good: ['牛', '兔', '猪'],
  50. avoid: ['马', '羊', '龙']
  51. }
  52. },
  53. '虎': {
  54. name: '虎',
  55. emoji: '🐯',
  56. personality: '勇敢自信,充满激情,领导力强',
  57. loveStyle: '热情主动,保护欲强',
  58. advantage: '勇敢果断、充满魅力、正义感强',
  59. weakness: '容易冲动、有时过于强势',
  60. luckyColor: '橙色、蓝色',
  61. luckyNumber: '1、3、4',
  62. compatibility: {
  63. best: ['马', '狗', '猪'],
  64. good: ['龙', '羊'],
  65. avoid: ['蛇', '猴']
  66. }
  67. },
  68. '兔': {
  69. name: '兔',
  70. emoji: '🐰',
  71. personality: '温柔善良,优雅细腻,懂得生活',
  72. loveStyle: '温柔体贴,浪漫优雅',
  73. advantage: '温柔善良、审美出众、善解人意',
  74. weakness: '有时过于敏感、缺乏安全感',
  75. luckyColor: '粉色、白色',
  76. luckyNumber: '3、4、9',
  77. compatibility: {
  78. best: ['羊', '狗', '猪'],
  79. good: ['虎', '龙', '蛇'],
  80. avoid: ['鸡', '鼠']
  81. }
  82. },
  83. '龙': {
  84. name: '龙',
  85. emoji: '🐲',
  86. personality: '自信大方,富有理想,魅力十足',
  87. loveStyle: '浪漫大气,懂得制造惊喜',
  88. advantage: '自信魅力、理想远大、慷慨大方',
  89. weakness: '有时过于自我、不够耐心',
  90. luckyColor: '金色、银色',
  91. luckyNumber: '1、6、7',
  92. compatibility: {
  93. best: ['鼠', '猴', '鸡'],
  94. good: ['虎', '兔', '蛇'],
  95. avoid: ['狗', '龙']
  96. }
  97. },
  98. '蛇': {
  99. name: '蛇',
  100. emoji: '🐍',
  101. personality: '智慧深沉,神秘优雅,洞察力强',
  102. loveStyle: '深情专一,神秘诱人',
  103. advantage: '智慧深邃、优雅迷人、直觉敏锐',
  104. weakness: '有时过于冷静、不易亲近',
  105. luckyColor: '红色、黄色',
  106. luckyNumber: '2、8、9',
  107. compatibility: {
  108. best: ['牛', '鸡'],
  109. good: ['龙', '兔', '羊'],
  110. avoid: ['虎', '猪']
  111. }
  112. },
  113. '马': {
  114. name: '马',
  115. emoji: '🐴',
  116. personality: '热情开朗,积极乐观,充满活力',
  117. loveStyle: '热烈奔放,追求自由',
  118. advantage: '热情开朗、活力四射、乐观向上',
  119. weakness: '有时缺乏耐心、容易三分钟热度',
  120. luckyColor: '红色、紫色',
  121. luckyNumber: '2、3、7',
  122. compatibility: {
  123. best: ['虎', '羊', '狗'],
  124. good: ['龙', '蛇', '猴'],
  125. avoid: ['鼠', '牛', '马']
  126. }
  127. },
  128. '羊': {
  129. name: '羊',
  130. emoji: '🐑',
  131. personality: '温和善良,富有同情心,艺术气质',
  132. loveStyle: '温柔依赖,需要呵护',
  133. advantage: '温柔善良、富有创意、同情心强',
  134. weakness: '有时过于依赖、优柔寡断',
  135. luckyColor: '绿色、红色',
  136. luckyNumber: '3、4、9',
  137. compatibility: {
  138. best: ['兔', '马', '猪'],
  139. good: ['蛇', '猴', '鸡'],
  140. avoid: ['牛', '狗']
  141. }
  142. },
  143. '猴': {
  144. name: '猴',
  145. emoji: '🐵',
  146. personality: '聪明机智,活泼开朗,适应力强',
  147. loveStyle: '幽默风趣,善于讨喜',
  148. advantage: '聪明机智、幽默风趣、多才多艺',
  149. weakness: '有时过于浮躁、不够专注',
  150. luckyColor: '白色、蓝色',
  151. luckyNumber: '1、7、8',
  152. compatibility: {
  153. best: ['鼠', '龙'],
  154. good: ['牛', '兔', '马'],
  155. avoid: ['虎', '猪']
  156. }
  157. },
  158. '鸡': {
  159. name: '鸡',
  160. emoji: '🐔',
  161. personality: '自信独立,追求完美,时尚品味',
  162. loveStyle: '忠诚专一,追求完美',
  163. advantage: '自信独立、追求完美、有品味',
  164. weakness: '有时过于挑剔、爱面子',
  165. luckyColor: '金色、棕色',
  166. luckyNumber: '5、7、8',
  167. compatibility: {
  168. best: ['牛', '龙', '蛇'],
  169. good: ['羊', '猴', '猪'],
  170. avoid: ['兔', '鸡', '狗']
  171. }
  172. },
  173. '狗': {
  174. name: '狗',
  175. emoji: '🐶',
  176. personality: '忠诚可靠,正直善良,责任感强',
  177. loveStyle: '忠诚专一,保护欲强',
  178. advantage: '忠诚可靠、正直善良、责任心强',
  179. weakness: '有时过于固执、容易焦虑',
  180. luckyColor: '红色、绿色',
  181. luckyNumber: '3、4、9',
  182. compatibility: {
  183. best: ['虎', '兔', '马'],
  184. good: ['蛇', '猴', '猪'],
  185. avoid: ['龙', '羊', '鸡']
  186. }
  187. },
  188. '猪': {
  189. name: '猪',
  190. emoji: '🐷',
  191. personality: '真诚善良,乐观豁达,享受生活',
  192. loveStyle: '真诚浪漫,包容大度',
  193. advantage: '真诚善良、乐观豁达、宽容大度',
  194. weakness: '有时过于天真、容易受骗',
  195. luckyColor: '黄色、灰色',
  196. luckyNumber: '2、5、8',
  197. compatibility: {
  198. best: ['虎', '兔', '羊'],
  199. good: ['鼠', '龙', '鸡'],
  200. avoid: ['蛇', '猴', '猪']
  201. }
  202. }
  203. }
  204. /**
  205. * 根据公历年份计算生肖
  206. * @param {Number} year - 公历年份
  207. * @returns {String} 生肖名称
  208. */
  209. export function getZodiacByYear(year) {
  210. // 1900年是鼠年,以此为基准计算
  211. const baseYear = 1900
  212. const index = (year - baseYear) % 12
  213. return ZODIACS[index]
  214. }
  215. /**
  216. * 根据生日计算生肖
  217. * 注意:这里简化处理,实际应该考虑农历新年
  218. * @param {String} birthday - 生日,格式:YYYY-MM-DD
  219. * @returns {String} 生肖名称
  220. */
  221. export function getZodiacByBirthday(birthday) {
  222. const year = parseInt(birthday.split('-')[0])
  223. const month = parseInt(birthday.split('-')[1])
  224. // 简化处理:2月4日前算上一年的生肖
  225. let zodiacYear = year
  226. if (month === 1 || (month === 2 && parseInt(birthday.split('-')[2]) < 4)) {
  227. zodiacYear = year - 1
  228. }
  229. return getZodiacByYear(zodiacYear)
  230. }
  231. /**
  232. * 获取生肖emoji
  233. * @param {String} zodiac - 生肖名称
  234. * @returns {String} emoji
  235. */
  236. export function getZodiacEmoji(zodiac) {
  237. return ZODIAC_EMOJIS[zodiac] || '🐷'
  238. }
  239. /**
  240. * 获取生肖详细信息
  241. * @param {String} zodiac - 生肖名称
  242. * @returns {Object} 生肖详细信息
  243. */
  244. export function getZodiacInfo(zodiac) {
  245. return ZODIAC_TRAITS[zodiac] || ZODIAC_TRAITS['猪']
  246. }
  247. /**
  248. * 计算两个生肖的配对指数
  249. * @param {String} zodiac1 - 生肖1
  250. * @param {String} zodiac2 - 生肖2
  251. * @returns {Object} 配对结果 {level: 'best'|'good'|'normal'|'avoid', score: 85}
  252. *
  253. * 注意:基于传统生肖配对理论,仅供参考
  254. */
  255. export function getZodiacCompatibility(zodiac1, zodiac2) {
  256. const info = ZODIAC_TRAITS[zodiac1]
  257. if (!info) return {
  258. level: 'normal',
  259. score: 65,
  260. desc: '需要了解更多信息',
  261. disclaimer: '仅供参考,真正的契合需要双方共同努力'
  262. }
  263. if (info.compatibility.best.includes(zodiac2)) {
  264. return {
  265. level: 'best',
  266. score: Math.floor(Math.random() * 8) + 85, // 85-92(避免100%)
  267. desc: '根据传统理论,相处较为融洽',
  268. disclaimer: '配对仅供参考,感情需要经营'
  269. }
  270. } else if (info.compatibility.good.includes(zodiac2)) {
  271. return {
  272. level: 'good',
  273. score: Math.floor(Math.random() * 12) + 70, // 70-81
  274. desc: '互相欣赏,可以和谐相处',
  275. disclaimer: '配对仅供参考,感情需要经营'
  276. }
  277. } else if (info.compatibility.avoid.includes(zodiac2)) {
  278. return {
  279. level: 'avoid',
  280. score: Math.floor(Math.random() * 15) + 50, // 50-64
  281. desc: '可能需要更多磨合和包容',
  282. disclaimer: '配对仅供参考,感情需要经营'
  283. }
  284. } else {
  285. return {
  286. level: 'normal',
  287. score: Math.floor(Math.random() * 10) + 60, // 60-69
  288. desc: '各有特色,需要互相理解',
  289. disclaimer: '配对仅供参考,感情需要经营'
  290. }
  291. }
  292. }
  293. /**
  294. * 获取今日运势
  295. * @param {String} zodiac - 生肖名称
  296. * @returns {Object} 今日运势
  297. *
  298. * 注意:当前版本为示例数据,建议接入专业API或建立专家数据库
  299. * 推荐API:聚合数据、天行数据、阿凡提数据
  300. */
  301. export function getTodayFortune(zodiac) {
  302. // ⚠️ 警告:当前为模拟数据,仅供演示
  303. // TODO: 接入专业API或后端数据库
  304. const fortunes = ['较好', '平稳', '一般']
  305. const randomIndex = Math.floor(Math.random() * fortunes.length)
  306. // 生成相对保守的分数(避免极端值)
  307. const generateScore = () => Math.floor(Math.random() * 20) + 70 // 70-89
  308. const yiList = ['保持微笑', '积极社交', '主动沟通', '关心他人']
  309. const jiList = ['过度焦虑', '冲动决定', '熬夜晚睡', '情绪化']
  310. return {
  311. overall: fortunes[randomIndex],
  312. love: generateScore(),
  313. career: generateScore(),
  314. wealth: generateScore(),
  315. health: generateScore(),
  316. tips: `根据传统理论建议:${yiList[Math.floor(Math.random() * yiList.length)]},避免${jiList[Math.floor(Math.random() * jiList.length)]}(仅供参考)`,
  317. source: 'local_demo', // 标记数据来源
  318. disclaimer: '此数据为示例,建议接入专业API'
  319. }
  320. }
  321. export default {
  322. getZodiacByYear,
  323. getZodiacByBirthday,
  324. getZodiacEmoji,
  325. getZodiacInfo,
  326. getZodiacCompatibility,
  327. getTodayFortune,
  328. ZODIACS,
  329. ZODIAC_EMOJIS
  330. }