detail.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <template>
  2. <CommonTopBanner title="志愿者详情">
  3. <SimplePageContentLoader :loader="infoLoader">
  4. <FlexCol v-if="infoLoader.content.value" gap="gap.md" padding="padding.md">
  5. <BackgroundBox
  6. backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxLarge.png"
  7. :backgroundCutBorder="32"
  8. :backgroundCutBorderSize="36"
  9. :padding="40"
  10. direction="row"
  11. align="center"
  12. >
  13. <Avatar
  14. :src="infoLoader.content.value.image"
  15. :size="200"
  16. />
  17. <Width :width="60" />
  18. <FlexCol gap="gap.md">
  19. <H3>{{ infoLoader.content.value.name }}</H3>
  20. <FlexRow align="center" gap="gap.md">
  21. <Text text="个人等级" fontConfig="contentText" />
  22. <Tag :text="(infoLoader.content.value.level || 0) + '级'" />
  23. </FlexRow>
  24. <FlexRow align="center" gap="gap.md">
  25. <Text text="加入村社" fontConfig="contentText" />
  26. <Tag :text="(infoLoader.content.value.villageName as string)" />
  27. </FlexRow>
  28. <Divider />
  29. <FlexRow align="center" gap="gap.md">
  30. <Text text="志愿者文化积分" fontConfig="contentText" />
  31. <Text :text="infoLoader.content.value.points || 0" fontConfig="lightGoldTitle" />
  32. </FlexRow>
  33. </FlexCol>
  34. </BackgroundBox>
  35. <FlexRow wrap justify="space-around" gap="gap.md">
  36. <BoxMid
  37. v-for="(item, k) in infoGrids"
  38. :key="k"
  39. :padding="24"
  40. :innerStyle="{ width: 'calc(50% - 76rpx)' }"
  41. direction="row"
  42. align="center"
  43. gap="gap.md"
  44. >
  45. <Image :src="item.logo" :radius="20" width="100" height="100" mode="aspectFill" />
  46. <FlexCol>
  47. <Text :text="item.label" fontConfig="lightImportantTitle" />
  48. <FlexRow align="center" gap="gap.sm">
  49. <Text :text="item.value" fontConfig="lightGoldTitle" :fontSize="60" />
  50. <Text :text="item.unit" fontConfig="contentText" />
  51. </FlexRow>
  52. </FlexCol>
  53. </BoxMid>
  54. </FlexRow>
  55. <HomeTitle title="最新动态" />
  56. <FlexCol gap="gap.lg">
  57. <Empty v-if="activityLoader.content.value?.length == 0" description="ta很懒,还没有任何动态" />
  58. <FlexRow
  59. v-for="item in activityLoader.content.value" :key="item.id"
  60. backgroundColor="background.tertiary"
  61. radius="radius.md"
  62. :padding="[20, 30]"
  63. gap="gap.lg"
  64. align="center"
  65. >
  66. <Avatar
  67. :url="infoLoader.content.value?.avatar || ''"
  68. :size="80"
  69. :round="false"
  70. :radius="10"
  71. />
  72. <Text :text="item.remark || '没有说明文字!'" fontConfig="contentText" :innerStyle="{ flex: 1 }" />
  73. </FlexRow>
  74. </FlexCol>
  75. </FlexCol>
  76. </SimplePageContentLoader>
  77. </CommonTopBanner>
  78. </template>
  79. <script setup lang="ts">
  80. import { computed } from 'vue';
  81. import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
  82. import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
  83. import FlexCol from '@/components/layout/FlexCol.vue';
  84. import BackgroundBox from '@/components/display/block/BackgroundBox.vue';
  85. import Text from '@/components/basic/Text.vue';
  86. import Avatar from '@/components/display/Avatar.vue';
  87. import Image from '@/components/basic/Image.vue';
  88. import FlexRow from '@/components/layout/FlexRow.vue';
  89. import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
  90. import SimplePageContentLoader from '@/components/loader/SimplePageContentLoader.vue';
  91. import VillageApi from '@/api/inhert/VillageApi';
  92. import H3 from '@/components/typography/H3.vue';
  93. import Tag from '@/components/display/Tag.vue';
  94. import Divider from '@/components/display/Divider.vue';
  95. import HomeTitle from '@/common/components/parts/HomeTitle.vue';
  96. import Width from '@/components/layout/space/Width.vue';
  97. import BoxMid from '@/common/components/box/BoxMid.vue';
  98. import TreeApi from '@/api/light/TreeApi';
  99. import Loadmore from '@/components/display/loading/Loadmore.vue';
  100. import Empty from '@/components/feedback/Empty.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?.collectCount as number || 0,
  116. },
  117. {
  118. label: '文化积分',
  119. unit: '/分',
  120. value: infoLoader.content.value?.points as number || 0,
  121. logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconLikes.png',
  122. },
  123. {
  124. label: '乡源果累计',
  125. unit: '/个',
  126. value: infoLoader.content.value?.fruittotal as number || 0,
  127. logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconFruts.png',
  128. },
  129. {
  130. label: '已关注村社',
  131. unit: '/个',
  132. value: infoLoader.content.value?.followVillageCount || 0,
  133. logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconFollows.png',
  134. },
  135. ];
  136. });
  137. const activityLoader = useSimpleDataLoader(async () => {
  138. return (await TreeApi.getFruitLogList({
  139. userId: querys.value.id,
  140. page: 1,
  141. pageSize: 6,
  142. })).list || [];
  143. });
  144. </script>