WinePairing.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <template>
  2. <div v-if="winePairing" class="wine-pairing">
  3. <div class="bg-purple-50 border border-purple-200 rounded-lg p-4">
  4. <!-- 酒水信息卡片 -->
  5. <div class="bg-white rounded-lg p-4 border border-purple-300 mb-3">
  6. <div class="flex items-center justify-between mb-3">
  7. <div class="flex items-center gap-2">
  8. <span class="text-2xl">{{ getWineIcon(winePairing.type) }}</span>
  9. <div>
  10. <h5 class="font-bold text-purple-800">{{ winePairing.name }}</h5>
  11. <p class="text-xs text-gray-600">{{ getWineTypeText(winePairing.type) }}</p>
  12. </div>
  13. </div>
  14. <div v-if="winePairing.alcoholContent" class="text-right">
  15. <div class="text-sm font-bold text-purple-600">{{ winePairing.alcoholContent }}</div>
  16. <div class="text-xs text-gray-500">酒精度</div>
  17. </div>
  18. </div>
  19. <!-- 风味描述 -->
  20. <div class="mb-3">
  21. <p class="text-sm text-gray-700 italic">"{{ winePairing.flavor }}"</p>
  22. <p v-if="winePairing.origin" class="text-xs text-gray-500 mt-1">产地:{{ winePairing.origin }}</p>
  23. </div>
  24. <!-- 搭配理由 -->
  25. <div class="bg-purple-100 rounded-lg p-3 mb-3">
  26. <h6 class="text-xs font-bold text-purple-700 mb-1">🎯 搭配理由</h6>
  27. <p class="text-xs text-purple-800">{{ winePairing.reason }}</p>
  28. </div>
  29. <!-- 侍酒建议 -->
  30. <div class="grid grid-cols-2 gap-3 text-xs">
  31. <div class="bg-blue-50 rounded p-2 border border-blue-200">
  32. <div class="flex items-center gap-1 mb-1">
  33. <span>🌡️</span>
  34. <span class="font-bold text-blue-700">侍酒温度</span>
  35. </div>
  36. <p class="text-blue-800">{{ winePairing.servingTemperature }}</p>
  37. </div>
  38. <div v-if="winePairing.glassType" class="bg-amber-50 rounded p-2 border border-amber-200">
  39. <div class="flex items-center gap-1 mb-1">
  40. <span>🥂</span>
  41. <span class="font-bold text-amber-700">推荐酒杯</span>
  42. </div>
  43. <p class="text-amber-800">{{ winePairing.glassType }}</p>
  44. </div>
  45. </div>
  46. </div>
  47. <!-- 小贴士 -->
  48. <div class="bg-yellow-100 border border-yellow-300 rounded-lg p-3">
  49. <div class="flex items-start gap-2">
  50. <span class="text-yellow-600 text-sm">💡</span>
  51. <div>
  52. <h6 class="text-xs font-bold text-yellow-700 mb-1">品鉴小贴士</h6>
  53. <p class="text-xs text-yellow-800">{{ getWineTip(winePairing.type) }}</p>
  54. </div>
  55. </div>
  56. </div>
  57. </div>
  58. </div>
  59. </template>
  60. <script setup lang="ts">
  61. import type { WinePairing } from '@/types'
  62. interface Props {
  63. winePairing: WinePairing | undefined
  64. }
  65. defineProps<Props>()
  66. const getWineIcon = (type: string): string => {
  67. const iconMap: Record<string, string> = {
  68. red_wine: '🍷',
  69. white_wine: '🥂',
  70. beer: '🍺',
  71. sake: '🍶',
  72. tea: '🍵',
  73. cocktail: '🍸',
  74. spirits: '🥃',
  75. non_alcoholic: '🥤'
  76. }
  77. return iconMap[type] || '🍷'
  78. }
  79. const getWineTypeText = (type: string): string => {
  80. const typeMap: Record<string, string> = {
  81. red_wine: '红酒',
  82. white_wine: '白酒',
  83. beer: '啤酒',
  84. sake: '清酒',
  85. tea: '茶饮',
  86. cocktail: '鸡尾酒',
  87. spirits: '烈酒',
  88. non_alcoholic: '无酒精饮品'
  89. }
  90. return typeMap[type] || '酒水'
  91. }
  92. const getWineTip = (type: string): string => {
  93. const tipMap: Record<string, string> = {
  94. red_wine: '红酒建议提前30分钟开瓶醒酒,让酒体充分接触空气,释放更丰富的香气。',
  95. white_wine: '白酒应冰镇后饮用,开瓶后尽快享用以保持最佳口感和香气。',
  96. beer: '啤酒最佳饮用温度为4-6°C,倒酒时应倾斜酒杯,形成适量泡沫。',
  97. sake: '清酒可温饮或冷饮,温饮时加热至40-50°C,能更好地体现酒的层次感。',
  98. tea: '茶水温度不宜过高,85°C左右最佳,可以多次冲泡,每次品味不同层次。',
  99. cocktail: '鸡尾酒应现调现饮,注意冰块的使用和装饰的搭配。',
  100. spirits: '烈酒可纯饮或加冰,小口品尝,感受酒体的复杂层次。',
  101. non_alcoholic: '无酒精饮品同样注重温度和新鲜度,可根据个人喜好调整甜度。'
  102. }
  103. return tipMap[type] || '适量饮用,品味生活。'
  104. }
  105. </script>
  106. <style scoped>
  107. .wine-pairing {
  108. @apply transition-all duration-300;
  109. }
  110. </style>