detail.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <template>
  2. <CommonTopBanner title="志愿者详情">
  3. <SimplePageContentLoader :loader="infoLoader">
  4. <Construction text="现在是接口缺少部分数据" />
  5. <FlexCol v-if="infoLoader.content.value" gap="gap.md" padding="padding.md">
  6. <BackgroundBox
  7. backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxLarge.png"
  8. :backgroundCutBorder="32"
  9. :backgroundCutBorderSize="36"
  10. :padding="40"
  11. direction="row"
  12. align="center"
  13. >
  14. <Avatar
  15. :src="infoLoader.content.value.image"
  16. :size="200"
  17. />
  18. <Width :width="60" />
  19. <FlexCol gap="gap.md">
  20. <H3>{{ infoLoader.content.value.name }}</H3>
  21. <FlexRow align="center" gap="gap.md">
  22. <Text text="个人等级" fontConfig="contentText" />
  23. <Tag :text="infoLoader.content.value.level + '级'" />
  24. </FlexRow>
  25. <FlexRow align="center" gap="gap.md">
  26. <Text text="加入村庄" fontConfig="contentText" />
  27. <Tag :text="(infoLoader.content.value.villageName as string)" />
  28. </FlexRow>
  29. <Divider />
  30. <FlexRow align="center" gap="gap.md">
  31. <Text text="贡献乡源光" fontConfig="contentText" />
  32. <Text :text="infoLoader.content.value.points" fontConfig="lightGoldTitle" />
  33. </FlexRow>
  34. </FlexCol>
  35. </BackgroundBox>
  36. <FlexRow wrap justify="space-around" gap="gap.md">
  37. <BackgroundBox
  38. v-for="(item, k) in infoGrids"
  39. :key="k"
  40. backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxMid.png"
  41. :backgroundCutBorder="32"
  42. :backgroundCutBorderSize="36"
  43. :padding="24"
  44. :innerStyle="{ width: 'calc(50% - 58rpx)' }"
  45. direction="row"
  46. align="center"
  47. gap="gap.md"
  48. >
  49. <Image :src="item.logo" :radius="20" width="100" height="100" mode="aspectFill" />
  50. <FlexCol>
  51. <Text :text="item.label" fontConfig="lightImportantTitle" />
  52. <FlexRow align="center" gap="gap.sm">
  53. <Text :text="item.value" fontConfig="lightGoldTitle" :fontSize="60" />
  54. <Text :text="item.unit" fontConfig="contentText" />
  55. </FlexRow>
  56. </FlexCol>
  57. </BackgroundBox>
  58. </FlexRow>
  59. <HomeTitle title="最新动态" />
  60. <FlexCol gap="gap.lg">
  61. <FlexRow
  62. v-for="item in activityLoader.content.value" :key="item.id"
  63. backgroundColor="background.tertiary"
  64. radius="radius.md"
  65. :padding="[20, 30]"
  66. gap="gap.lg"
  67. align="center"
  68. >
  69. <Avatar
  70. :url="item.head"
  71. :size="80"
  72. :round="false"
  73. :radius="10"
  74. />
  75. <Text :text="item.content" fontConfig="contentText" :innerStyle="{ flex: 1 }" />
  76. </FlexRow>
  77. </FlexCol>
  78. </FlexCol>
  79. </SimplePageContentLoader>
  80. </CommonTopBanner>
  81. </template>
  82. <script setup lang="ts">
  83. import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
  84. import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
  85. import FlexCol from '@/components/layout/FlexCol.vue';
  86. import BackgroundBox from '@/components/display/block/BackgroundBox.vue';
  87. import Text from '@/components/basic/Text.vue';
  88. import Avatar from '@/components/display/Avatar.vue';
  89. import Image from '@/components/basic/Image.vue';
  90. import FlexRow from '@/components/layout/FlexRow.vue';
  91. import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
  92. import SimplePageContentLoader from '@/components/loader/SimplePageContentLoader.vue';
  93. import VillageApi from '@/api/inhert/VillageApi';
  94. import H3 from '@/components/typography/H3.vue';
  95. import Tag from '@/components/display/Tag.vue';
  96. import Divider from '@/components/display/Divider.vue';
  97. import { computed } from 'vue';
  98. import HomeTitle from '@/common/components/parts/HomeTitle.vue';
  99. import Width from '@/components/layout/space/Width.vue';
  100. import Construction from '@/common/components/Construction.vue';
  101. const { querys } = useLoadQuerys({
  102. id: 0,
  103. }, () => {
  104. infoLoader.reload();
  105. });
  106. const infoLoader = useSimpleDataLoader(async () => {
  107. return (await VillageApi.getVolunteerInfoByIdAdmin(querys.value.id));
  108. });
  109. const infoGrids = computed(() => {
  110. return [
  111. {
  112. label: '累计发文',
  113. unit: '/篇',
  114. logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconPosts.png',
  115. value: infoLoader.content.value?.userId as number,
  116. },
  117. {
  118. label: '点赞/评论',
  119. unit: '/次',
  120. value: infoLoader.content.value?.userId as number,
  121. logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconLikes.png',
  122. },
  123. {
  124. label: '乡源果累计',
  125. unit: '/个',
  126. value: infoLoader.content.value?.userId as number,
  127. logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconFruts.png',
  128. },
  129. {
  130. label: '已关注村社',
  131. unit: '/个',
  132. value: infoLoader.content.value?.userId as number,
  133. logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconFollows.png',
  134. },
  135. ];
  136. });
  137. const activityLoader = useSimpleDataLoader(async () => {
  138. return [
  139. {
  140. id: 1,
  141. head: 'https://mn.wenlvti.net/app_static/minnan/images/test/ImageTest1.png',
  142. content: '测试数据,没有接口!:福泽乡里 为全村加成+10%乡源果,可持续24小时',
  143. levelText: '一级',
  144. },
  145. {
  146. id: 2,
  147. head: 'https://mn.wenlvti.net/app_static/minnan/images/test/ImageTest2.png',
  148. content: '福泽乡里 为全村加成+10%乡源果,可持续24小时',
  149. levelText: '五级',
  150. },
  151. {
  152. id: 3,
  153. head: 'https://mn.wenlvti.net/app_static/minnan/images/test/ImageTest3.png',
  154. content: '福泽乡里 为全村加成+10%乡源果,可持续24小时',
  155. levelText: '十级',
  156. },
  157. ];
  158. });
  159. </script>