memberLevel.vue 5.2 KB

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