memberLevel.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <template>
  2. <view class="member-level">
  3. <!-- 用户会员信息 -->
  4. <view class="user-wrap">
  5. <view class="user-info">
  6. <up-image class="avatar" :fade="false" :src="userLevel.icon" width="96rpx" height="96rpx"
  7. shape="circle"></up-image>
  8. <view class="level-wrap">
  9. <text class="name">V{{userLevel.id}} {{levelStr[userLevel.id]}}守护</text>
  10. <view class="progress-wrap">
  11. <view class="progress-value">
  12. <view class="total" :style="{ width: calcWidth(userLevel.energy,userLevel.energyMax+1) }"></view>
  13. </view>
  14. <view class="progress-score">
  15. <text class="cur-val">{{ userLevel.energy }}</text>/{{ userLevel.energyMax + 1 }}分
  16. </view>
  17. </view>
  18. <view class="level-desc">
  19. 再累计能量 <text class="level-text">{{ userLevel.diffLevelEnergy }}分 </text>即可升级到
  20. {{levelStr[Number(userLevel.id) + 1]}}等级
  21. </view>
  22. </view>
  23. </view>
  24. <slot></slot>
  25. </view>
  26. <!-- 树信息 -->
  27. <view class="tree-info">
  28. <view class="info-text">
  29. <template v-if="treeData.farmName && treeData.farmName.length > 5">
  30. <view>{{treeData.farmName.slice(0,4)}}</view>
  31. <text>{{treeData.farmName.slice(4)}}</text>
  32. </template>
  33. <view v-else>{{treeData.farmName}}</view>
  34. </view>
  35. <view class="info-text">
  36. <view>{{treeData.age}}年{{ treeData.age > 9 ? "老树" : "树龄" }}</view>
  37. <text class="text">{{ treeData.pz }}</text>
  38. </view>
  39. <view class="info-text">
  40. <view>{{treeData.phenologyName}}</view>
  41. <text class="text">气候适宜-{{ treeData.howTxt || "果园采摘" }}</text>
  42. </view>
  43. </view>
  44. </view>
  45. </template>
  46. <script setup>
  47. import TREE from '@/api/tree.js'
  48. import {
  49. ref,
  50. watch
  51. } from "vue";
  52. const props = defineProps({
  53. treeData: {
  54. type: Object,
  55. defalut: {},
  56. },
  57. });
  58. function calcWidth(energy,energyMax){
  59. let total = (energy / energyMax) * 100
  60. if(total>100){
  61. total = 100
  62. }
  63. return total + '%'
  64. }
  65. const levelStr = {
  66. 0: "平民",
  67. 1: "青铜",
  68. 2: "白银",
  69. 3: "赤金",
  70. 4: "星勋",
  71. };
  72. const userLevel = ref({})
  73. watch(
  74. () => props.treeData,
  75. (newValue) => {
  76. userLevel.value = {
  77. ...newValue.buyList[0].level,
  78. energy: newValue.buyList[0].energy,
  79. icon: newValue.buyList[0].icon
  80. }
  81. }
  82. );
  83. </script>
  84. <style lang="scss" scoped>
  85. @import "@/static/style/mixin.scss";
  86. .member-level {
  87. position: relative;
  88. &::before{
  89. content: '';
  90. position: absolute;
  91. top: -20rpx;
  92. width: 100%;
  93. height: 474rpx;
  94. background-image: linear-gradient(180deg,#008DFD,transparent);
  95. }
  96. .user-wrap {
  97. display: flex;
  98. border-radius: 70rpx 0 0 70rpx;
  99. padding: 16rpx 20rpx;
  100. margin: 0 0 10rpx 24rpx;
  101. position: relative;
  102. width: calc(100% - 24rpx);
  103. box-sizing: border-box;
  104. backdrop-filter: blur(14rpx);
  105. background-image: linear-gradient(90deg, rgba(255, 255, 255, 0.4), transparent);
  106. .user-info {
  107. width: 100%;
  108. display: flex;
  109. .avatar {
  110. border: 2rpx solid #fff;
  111. border-radius: 50%;
  112. }
  113. .level-wrap {
  114. line-height: 32rpx;
  115. width: 55%;
  116. margin-left: 20rpx;
  117. .name {
  118. color: #fff;
  119. font-family: 'PangMenZhengDao';
  120. }
  121. .progress-wrap {
  122. font-size: 20rpx;
  123. color: rgba(0, 0, 0, 0.8);
  124. display: flex;
  125. align-items: center;
  126. justify-content: space-between;
  127. .progress-value {
  128. width: calc(100% - 140rpx);
  129. height: 16rpx;
  130. background: #E7E7E7;
  131. border-radius: 40rpx;
  132. border: 2rpx solid #fff;
  133. .total {
  134. width: 80%;
  135. height: 100%;
  136. border-radius: 20rpx;
  137. background-image: linear-gradient(120deg, #FDE492, #FB9C03);
  138. }
  139. }
  140. .cur-val {
  141. font-size: 26rpx;
  142. font-weight: 500;
  143. color: #fff;
  144. }
  145. }
  146. .level-desc {
  147. font-size: 20rpx;
  148. color: rgba(0, 0, 0, 0.84);
  149. .level-text {
  150. color: #fff;
  151. }
  152. }
  153. }
  154. }
  155. }
  156. .tree-info {
  157. width: 95%;
  158. height: 160rpx;
  159. box-sizing: border-box;
  160. padding: 0 50rpx 20rpx;
  161. @include ossBg("treePage/tree-info-bg.png");
  162. display: flex;
  163. justify-content: space-around;
  164. align-items: center;
  165. font-size: 28rpx;
  166. font-weight: 500;
  167. margin: auto;
  168. position: relative;
  169. z-index: 2;
  170. .info-text {
  171. text-align: center;
  172. line-height: 32rpx;
  173. font-family: 'SMILEYSANS';
  174. position: relative;
  175. .text {
  176. font-size: 22rpx;
  177. }
  178. }
  179. .info-text+.info-text {
  180. &::before {
  181. content: '';
  182. position: absolute;
  183. left: -34rpx;
  184. top: 14rpx;
  185. width: 1rpx;
  186. height: 38rpx;
  187. background: rgba(0, 0, 0, 0.26);
  188. }
  189. }
  190. }
  191. }
  192. </style>