daily-fortune.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <view class="daily-fortune-page">
  3. <view v-if="loading" class="loading-state"><text>加载中...</text></view>
  4. <view v-else-if="error" class="error-state"><text class="error-text">{{ error }}</text></view>
  5. <view v-else-if="fortune" class="content">
  6. <view class="date-banner">
  7. <text class="date-text">{{ fortune.date || todayStr }}</text>
  8. <text class="date-lunar" v-if="fortune.lunarDate">{{ fortune.lunarDate }}</text>
  9. </view>
  10. <view class="info-card" v-if="fortune.fiveElements">
  11. <view class="card-title-bar"><text class="card-title">今日五行</text></view>
  12. <view class="five-elements-display">
  13. <text class="fe-main">{{ fortune.fiveElements.main || '' }}</text>
  14. <text class="fe-detail" v-if="fortune.fiveElements.detail">{{ fortune.fiveElements.detail }}</text>
  15. </view>
  16. </view>
  17. <view class="info-card" v-if="fortune.auspicious && fortune.auspicious.length > 0">
  18. <view class="card-title-bar auspicious-bar"><text class="card-title">宜</text></view>
  19. <view class="item-tags">
  20. <view v-for="(item, idx) in fortune.auspicious" :key="idx" class="tag-item good">
  21. <text class="tag-text">{{ item }}</text>
  22. </view>
  23. </view>
  24. </view>
  25. <view class="info-card" v-if="fortune.inauspicious && fortune.inauspicious.length > 0">
  26. <view class="card-title-bar inauspicious-bar"><text class="card-title">忌</text></view>
  27. <view class="item-tags">
  28. <view v-for="(item, idx) in fortune.inauspicious" :key="idx" class="tag-item bad">
  29. <text class="tag-text">{{ item }}</text>
  30. </view>
  31. </view>
  32. </view>
  33. <view class="info-card" v-if="fortune.familyAdvice">
  34. <view class="card-title-bar"><text class="card-title">家庭建议</text></view>
  35. <view class="advice-content"><text class="advice-text">{{ fortune.familyAdvice }}</text></view>
  36. </view>
  37. <view class="info-card" v-if="fortune.focusMember">
  38. <view class="card-title-bar"><text class="card-title">今日关注</text></view>
  39. <view class="focus-member-card">
  40. <text class="focus-name">{{ fortune.focusMember.name }}</text>
  41. <text class="focus-tip">{{ fortune.focusMember.tip }}</text>
  42. <view v-if="fortune.focusMember.wuxingTip" class="focus-wuxing">
  43. <text class="wuxing-tip-text">{{ fortune.focusMember.wuxingTip }}</text>
  44. </view>
  45. </view>
  46. </view>
  47. </view>
  48. </view>
  49. </template>
  50. <script>
  51. export default {
  52. data: function() { return { fortune: null, loading: false, error: null, todayStr: '' } },
  53. onLoad: function() {
  54. var now = new Date()
  55. this.todayStr = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0') + '-' + String(now.getDate()).padStart(2, '0')
  56. this.loadDailyFortune()
  57. },
  58. methods: {
  59. loadDailyFortune: function() {
  60. var self = this
  61. self.loading = true; self.error = null
  62. self.$store.dispatch('tianpan/loadDailyFortune', { date: self.todayStr })
  63. .then(function(data) { self.fortune = data })
  64. .catch(function(e) { self.error = e.message || '加载失败' })
  65. .finally(function() { self.loading = false })
  66. },
  67. goBack: function() { uni.navigateBack() }
  68. }
  69. }
  70. </script>
  71. <style scoped>
  72. .daily-fortune-page { min-height: 100vh; background: #F3F4F6; }
  73. .nav-right { width: 40px; }
  74. .loading-state, .error-state { padding: 60px 20px; display: flex; justify-content: center; align-items: center; }
  75. .error-text { color: #EF4444; font-size: 14px; }
  76. .content { padding: 12px; }
  77. .date-banner { background: linear-gradient(135deg, #F97316, #FB923C); border-radius: 12px; padding: 20px; margin-bottom: 12px; text-align: center; }
  78. .date-text { font-size: 22px; font-weight: bold; color: #FFF; display: block; }
  79. .date-lunar { font-size: 13px; color: rgba(255,255,255,0.8); display: block; margin-top: 4px; }
  80. .info-card { background: #FFF; border-radius: 12px; padding: 16px; margin-bottom: 12px; }
  81. .card-title-bar { margin-bottom: 12px; border-bottom: 1px solid #F3F4F6; padding-bottom: 8px; display: flex; align-items: center; }
  82. .auspicious-bar .card-title { color: #10B981; font-size: 15px; font-weight: bold; }
  83. .inauspicious-bar .card-title { color: #EF4444; font-size: 15px; font-weight: bold; }
  84. .card-title { font-size: 15px; font-weight: bold; color: #1F2937; }
  85. .five-elements-display { text-align: center; padding: 8px 0; }
  86. .fe-main { font-size: 28px; font-weight: bold; color: #F97316; display: block; }
  87. .fe-detail { font-size: 13px; color: #9CA3AF; display: block; margin-top: 4px; }
  88. .item-tags { display: flex; flex-wrap: wrap; gap: 8px; }
  89. .tag-item { padding: 6px 14px; border-radius: 16px; }
  90. .tag-item.good { background: #DCFCE7; }
  91. .tag-item.bad { background: #FEE2E2; }
  92. .tag-text { font-size: 13px; }
  93. .tag-item.good .tag-text { color: #166534; }
  94. .tag-item.bad .tag-text { color: #991B1B; }
  95. .advice-content { padding: 4px 0; }
  96. .advice-text { font-size: 14px; color: #374151; line-height: 1.7; }
  97. .focus-member-card { display: flex; flex-direction: column; }
  98. .focus-name { font-size: 16px; font-weight: bold; color: #F97316; margin-bottom: 4px; }
  99. .focus-tip { font-size: 13px; color: #374151; line-height: 1.5; }
  100. .focus-wuxing { margin-top: 8px; background: #FFF7ED; border-radius: 8px; padding: 8px; }
  101. .wuxing-tip-text { font-size: 12px; color: #9CA3AF; }
  102. </style>