index.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <route lang="json">
  2. { "style": { "navigationStyle": "custom" } }
  3. </route>
  4. <script setup lang="ts">
  5. import NavbarEvo from '@/components/navbar-evo.vue'
  6. import { NetImages } from '../../../../core/libs/net-images'
  7. import { getRidingOptions, getRidings } from '../../../../core/libs/requests'
  8. import PageHelperEvo from '@/components/page-helper-evo.vue'
  9. import dayjs from 'dayjs'
  10. import BottomAppBar from '@/components/bottom-app-bar.vue'
  11. import { useUserStore } from '@/store'
  12. import { storeToRefs } from 'pinia'
  13. const userStore = useUserStore()
  14. const { userInfo } = storeToRefs(userStore)
  15. const current = ref('')
  16. // const { data, run } = useRequest(() => ({}), { initialData: [] })
  17. const { data: ridingOptions, run: setRidingOptions } = useRequest(() => getRidingOptions(), {
  18. initialData: [],
  19. })
  20. const query = computed(() => (current.value ? { activityId: current.value } : {}))
  21. onLoad(async () => {
  22. await setRidingOptions()
  23. })
  24. onShareAppMessage(() => ({
  25. title: '骑行排行榜',
  26. }))
  27. onShareTimeline(() => ({
  28. title: '骑行排行榜',
  29. }))
  30. </script>
  31. <template>
  32. <div class="flex-grow flex flex-col bg-[length:100%]">
  33. <NavbarEvo transparent dark title="骑行榜"></NavbarEvo>
  34. <div class="aspect-[1.19/1] relative">
  35. <wd-img
  36. width="100%"
  37. custom-class="vertical-bottom"
  38. mode="widthFix"
  39. :src="NetImages.CyclingRankingsHeaderBg"
  40. ></wd-img>
  41. <div class="absolute bottom-60 left-7.25">
  42. <wd-picker
  43. v-model="current"
  44. :columns="[
  45. { label: '全部', value: '' },
  46. ...ridingOptions.map((it) => ({ label: it.name, value: it.id })),
  47. ]"
  48. use-default-slot
  49. >
  50. <div class="text-[white] text-sm font-normal font-['PingFang_SC'] leading-relaxed">
  51. <!-- {{ dayjs(year).format('YYYY') }}-->
  52. {{ ridingOptions.find((it) => it.id === current)?.name ?? '全部' }}
  53. <wd-icon name="arrow-down" size="12" class="text-[#ffffff]"></wd-icon>
  54. </div>
  55. </wd-picker>
  56. </div>
  57. </div>
  58. <PageHelperEvo
  59. class="flex-grow flex flex-col"
  60. :request="getRidings"
  61. :is-load-more="false"
  62. :query="query"
  63. >
  64. <template #default="{ source }">
  65. <div class="flex-grow relative bg-[linear-gradient(180deg,#EFEFEF_0.4%,#FFF_21.41%)]">
  66. <div class="absolute h-4 top--4 left-0 right-0 bg-[#EFEFEF] rounded-t-2xl"></div>
  67. <div class="flex justify-between">
  68. <template
  69. v-for="(it, i) in [
  70. ...source.list.slice(0, 3),
  71. ...Array.from({
  72. length: source?.list?.length < 3 ? 3 - source?.list?.length : 0,
  73. }).map(() => ({
  74. radeKmTotal: '0',
  75. avatar: '',
  76. memberStylistName: '暂无',
  77. })),
  78. ]"
  79. :key="i"
  80. >
  81. <div
  82. class="flex-1 py-2 relative"
  83. :class="`${i === 0 ? 'w-[143px] h-[141px] bg-white rounded-xl relative bottom-8 pt-4 order-1 ' : ''}`"
  84. :style="{ order: i === 0 ? 1 : i - 1 }"
  85. >
  86. <div
  87. class="text-center font-bold font-['D-DIN'] leading-relaxed"
  88. :class="`${i === 0 ? 'text-[#ef4343] text-2xl ' : 'text-black text-[22px]'}`"
  89. >
  90. <!-- 198.2 -->
  91. {{ it.radeKmTotal }}
  92. </div>
  93. <div
  94. class="text-center text-black/40 text-xs font-normal font-['PingFang_SC'] leading-relaxed"
  95. >
  96. 骑行里程km
  97. </div>
  98. <div class="absolute top--34 left-0 right-0 flex flex-col items-center gap-2">
  99. <div class="relative">
  100. <wd-img
  101. class="rounded-full border-2 border-solid border-[#c5cdd4] overflow-hidden"
  102. width="71"
  103. height="71"
  104. round
  105. :src="it.avatar || NetImages.DefaultAvatar"
  106. ></wd-img>
  107. <div
  108. class="absolute left-0"
  109. :class="{ 0: 'top--5', 1: 'top--0', 2: 'top--0' }[i]"
  110. >
  111. <wd-img
  112. width="76"
  113. mode="widthFix"
  114. :src="
  115. {
  116. 0: NetImages.RankingOne,
  117. 1: NetImages.RankingTwo,
  118. 2: NetImages.RankingThree,
  119. }[i]
  120. "
  121. ></wd-img>
  122. </div>
  123. </div>
  124. <div
  125. class="text-center text-white text-base font-normal font-['PingFang_SC'] leading-relaxed"
  126. >
  127. <!-- 苏小萌 -->
  128. {{ it.memberStylistName }}
  129. </div>
  130. </div>
  131. </div>
  132. </template>
  133. </div>
  134. <div class="flex flex-col gap-8 mt--14">
  135. <template v-for="(it, i) in source.list" :key="i">
  136. <div v-if="i > 2" class="flex items-center gap-2 px-7">
  137. <div
  138. class="text-center w-8 text-black/40 text-base font-bold font-['D-DIN-PRO'] leading-relaxed"
  139. >
  140. {{ i < 9 ? '0' + (i + 1) : i + 1 }}
  141. </div>
  142. <wd-img
  143. class="w-8 h-8 rounded-full"
  144. round
  145. :src="it.avatar || NetImages.DefaultAvatar"
  146. />
  147. <div
  148. class="text-center text-black/80 text-sm font-normal font-['PingFang_SC'] leading-relaxed"
  149. >
  150. {{ it.memberStylistName }}
  151. </div>
  152. <div class="flex-1"></div>
  153. <div>
  154. <div
  155. class="text-center text-black/80 text-xl font-bold font-['D-DIN'] leading-relaxed"
  156. >
  157. {{ it.radeKmTotal }}
  158. </div>
  159. <div
  160. class="text-center text-black/40 text-[10px] font-normal font-['PingFang_SC'] leading-relaxed"
  161. >
  162. 累计里程km
  163. </div>
  164. </div>
  165. </div>
  166. </template>
  167. </div>
  168. </div>
  169. <BottomAppBar fixed placeholder custom-class="p-0!">
  170. <div class="bg-gradient-to-b from-neutral-100 to-white shadow-inner">
  171. <div class="py-3 flex items-center gap-2 px-7">
  172. <div
  173. class="text-center w-8 text-black/40 text-base font-bold font-['D-DIN-PRO'] leading-relaxed"
  174. >
  175. <!-- {{ i < 9 ? '0' + (i + 1) : i + 1 }}-->
  176. {{
  177. source.list.findIndex((it) => it.memberStylistName === userInfo.nickname) === -1
  178. ? '-'
  179. : source.list.findIndex((it) => it.memberStylistName === userInfo.nickname) +
  180. 1 <
  181. 9
  182. ? '0' +
  183. (source.list.findIndex((it) => it.memberStylistName === userInfo.nickname) +
  184. 1)
  185. : source.list.findIndex((it) => it.memberStylistName === userInfo.nickname) +
  186. 1
  187. }}
  188. </div>
  189. <wd-img class="w-12 h-12 rounded-full" round :src="userInfo.avatar" />
  190. <div
  191. class="text-center text-black/80 text-sm font-normal font-['PingFang_SC'] leading-relaxed"
  192. >
  193. {{ userInfo.nickname ?? NetImages.DefaultAvatar }}
  194. </div>
  195. <div class="flex-1"></div>
  196. <div>
  197. <div
  198. class="text-center text-black/80 text-xl font-bold font-['D-DIN'] leading-relaxed"
  199. >
  200. <!-- {{ it.radeKmTotal }}-->
  201. {{
  202. source.list.find((it) => it.memberStylistName === userInfo.nickname)
  203. ?.radeKmTotal ?? 0
  204. }}
  205. </div>
  206. <div
  207. class="text-center text-black/40 text-[10px] font-normal font-['PingFang_SC'] leading-relaxed"
  208. >
  209. 累计里程km
  210. </div>
  211. </div>
  212. </div>
  213. </div>
  214. </BottomAppBar>
  215. </template>
  216. </PageHelperEvo>
  217. </div>
  218. </template>