gate-lock.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <template>
  2. <view class="gate-lock">
  3. <view class="lock-card">
  4. <view class="lock-icon">🔒</view>
  5. <text class="gate-name">{{ gateData.name }}</text>
  6. <text class="gate-desc">{{ gateData.description }}</text>
  7. <view class="gate-reward" v-if="totalReward > 0">
  8. <text class="reward-text">通关奖励</text>
  9. <text class="reward-points" v-if="gateData.rewardPoints > 0">+{{ gateData.rewardPoints }} CF值</text>
  10. <text class="reward-energy" v-if="gateData.rewardEnergy > 0">+{{ gateData.rewardEnergy }}能量</text>
  11. </view>
  12. <button class="gate-btn" @click="goAction">{{ btnText }}</button>
  13. </view>
  14. </view>
  15. </template>
  16. <script>
  17. /**
  18. * 通关门禁锁定组件
  19. * props: gate - 当前锁定关卡对象 { gateType, name, description, icon, rewardPoints, rewardEnergy }
  20. * 根据 gateType 自动映射按钮文案和跳转目标
  21. */
  22. export default {
  23. props: {
  24. gate: {
  25. type: Object,
  26. default: function() { return {} }
  27. }
  28. },
  29. computed: {
  30. gateData: function() {
  31. var g = this.gate || {}
  32. return {
  33. gateType: g.gateType || '',
  34. name: g.name || '未知关卡',
  35. description: g.description || '',
  36. rewardPoints: g.rewardPoints || 0,
  37. rewardEnergy: g.rewardEnergy || 0
  38. }
  39. },
  40. totalReward: function() {
  41. return (this.gateData.rewardPoints || 0) + (this.gateData.rewardEnergy || 0)
  42. },
  43. btnText: function() {
  44. var map = {
  45. SELF_CHECK: '完成五维基础能量检测,解锁能量沙盘',
  46. INVITE_FAMILY: '邀请家人加入,解锁全家沙盘',
  47. CREATE_FAMILY_MEMBER: '创建孩子账号,解锁微行动',
  48. PURCHASE: '去商城逛逛',
  49. MEMBERSHIP: '查看会员方案',
  50. REPORT_UPLOAD: '上传健康报告'
  51. }
  52. return map[this.gateData.gateType] || '前往解锁'
  53. }
  54. },
  55. methods: {
  56. goAction: function() {
  57. var type = this.gateData.gateType
  58. var url = ''
  59. switch (type) {
  60. case 'SELF_CHECK':
  61. url = '/pages/family/self-check'
  62. break
  63. case 'INVITE_FAMILY':
  64. url = '/pages/profile-extra/family-members'
  65. break
  66. case 'CREATE_FAMILY_MEMBER':
  67. url = '/pages/profile-extra/family-members'
  68. break
  69. case 'PURCHASE':
  70. url = '/pages/shop/index/index'
  71. break
  72. case 'MEMBERSHIP':
  73. url = '/pages/membership/index'
  74. break
  75. case 'REPORT_UPLOAD':
  76. url = '/pages/health/report-upload'
  77. break
  78. }
  79. if (url) {
  80. uni.navigateTo({ url: url })
  81. }
  82. }
  83. }
  84. }
  85. </script>
  86. <style scoped>
  87. .gate-lock {
  88. margin: 20rpx 30rpx;
  89. }
  90. .lock-card {
  91. background: linear-gradient(135deg, #1A2A4A, #1E3A5F);
  92. border-radius: 24rpx;
  93. padding: 40rpx 30rpx;
  94. display: flex;
  95. flex-direction: column;
  96. align-items: center;
  97. text-align: center;
  98. }
  99. .lock-icon {
  100. font-size: 64rpx;
  101. margin-bottom: 16rpx;
  102. opacity: 0.8;
  103. }
  104. .gate-name {
  105. font-size: 32rpx;
  106. font-weight: bold;
  107. color: #8FC5E8;
  108. margin-bottom: 12rpx;
  109. }
  110. .gate-desc {
  111. font-size: 24rpx;
  112. color: rgba(143,197,232,0.7);
  113. margin-bottom: 20rpx;
  114. line-height: 1.5;
  115. }
  116. .gate-reward {
  117. display: flex;
  118. align-items: center;
  119. gap: 12rpx;
  120. margin-bottom: 24rpx;
  121. }
  122. .reward-text {
  123. font-size: 22rpx;
  124. color: rgba(143,197,232,0.5);
  125. }
  126. .reward-points, .reward-energy {
  127. font-size: 22rpx;
  128. padding: 4rpx 14rpx;
  129. border-radius: 16rpx;
  130. }
  131. .reward-points {
  132. color: #FFD700;
  133. background: rgba(255,215,0,0.12);
  134. }
  135. .reward-energy {
  136. color: #42A5F5;
  137. background: rgba(66,165,245,0.12);
  138. }
  139. .gate-btn {
  140. width: 70%;
  141. height: 80rpx;
  142. line-height: 80rpx;
  143. font-size: 28rpx;
  144. color: #fff;
  145. background: linear-gradient(135deg, #5B9BD5, #3A7CC2);
  146. border: none;
  147. border-radius: 40rpx;
  148. text-align: center;
  149. }
  150. .gate-btn:active {
  151. opacity: 0.8;
  152. }
  153. </style>