level-card.vue 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <script setup lang="ts">
  2. import { useUserStore } from '@/store'
  3. import { storeToRefs } from 'pinia'
  4. const props = withDefaults(
  5. defineProps<{
  6. isCurrent: boolean
  7. option?: any[]
  8. index?: number
  9. }>(),
  10. { isCurrent: false },
  11. )
  12. const userStore = useUserStore()
  13. const { userInfo } = storeToRefs(userStore)
  14. const percentage = computed(() => {
  15. const currentLevel = userInfo.value?.level?.level
  16. const targetLevel = props.option[props.index + 1]
  17. if (targetLevel) {
  18. return (userInfo.value?.level?.point / targetLevel.points) * 100
  19. }
  20. return 0
  21. })
  22. // 是否最高的等级
  23. const isMaxLevel = computed(() => {
  24. return userInfo.value?.level?.level === props.option?.[props.option.length - 1]?.memberLevel
  25. })
  26. // 是否高于当前等级
  27. const isHigherThanCurrent = computed(() => {
  28. return userInfo.value?.level?.level > props.option[props.index]?.memberLevel
  29. })
  30. // 是否低于当前等级
  31. const isLowerThanCurrent = computed(() => {
  32. return userInfo.value?.level?.level < props.option[props.index]?.memberLevel
  33. })
  34. </script>
  35. <template>
  36. <div class="w-full h-full box-border p-4 flex flex-col">
  37. <div class="flex justify-end pt-2">
  38. <div class="w-[66px] h-[26px] relative" v-if="isCurrent">
  39. <div class="w-[66px] h-[22px] left-0 absolute bg-[#3c556b] rounded-md"></div>
  40. <div
  41. class="left-[10px] top-0.25 absolute text-center text-[#dfdfdf] text-xs font-normal font-['PingFang_SC'] leading-relaxed"
  42. >
  43. 当前等级
  44. </div>
  45. </div>
  46. </div>
  47. <div class="flex-1"></div>
  48. <!-- {{ userInfo.level.point }}-->
  49. <!-- {{ userInfo.level.point }}-->
  50. <!-- {{ percentage }}-->
  51. <template v-if="userInfo">
  52. <template v-if="isHigherThanCurrent">
  53. <div class="text-[#61311b] text-xs font-normal font-['PingFang_SC'] leading-relaxed">
  54. <!-- 还差{{ props.option[props.index]?.points - userInfo.level.point }}积分升级-->
  55. 当前高于该等级
  56. </div>
  57. </template>
  58. <template v-else-if="isLowerThanCurrent">
  59. <div class="text-[#61311b] text-xs font-normal font-['PingFang_SC'] leading-relaxed">
  60. <!-- 还差{{ props.option[props.index]?.points - userInfo.level.point }}积分升级-->
  61. 距{{ option[index].memberLevelName }}还需{{
  62. option[index].points - userInfo.level.point
  63. }}积分
  64. </div>
  65. <wd-progress :percentage="(userInfo.level.point / option[index].points) * 100" hide-text />
  66. </template>
  67. <template v-else-if="isMaxLevel">
  68. <div class="text-[#61311b] text-xs font-normal font-['PingFang_SC'] leading-relaxed">
  69. 当前积分{{ userInfo.level.point }}
  70. </div>
  71. </template>
  72. <template v-else>
  73. <div class="text-[#61311b] text-xs font-normal font-['PingFang_SC'] leading-relaxed">
  74. 距{{ option[index + 1].memberLevelName }}还需{{
  75. option[index + 1].points - userInfo.level.point
  76. }}积分
  77. </div>
  78. <wd-progress :percentage="percentage" hide-text />
  79. </template>
  80. </template>
  81. </div>
  82. </template>