StatsBlock.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <!-- 数据统计 -->
  3. <SimplePageContentLoader :loader="statsLoader">
  4. <view v-if="statsLoader.content.value" class="d-flex flex-col justify-center mt-3 pt-3 pb-3 bg-light-page radius-base">
  5. <view class="d-flex flex-col">
  6. <StatsText
  7. :title="statsLoader.content.value[0].title"
  8. :data="statsLoader.content.value[0].datas"
  9. :type="statsLoader.content.value[0].type"
  10. />
  11. <view class="p-2">
  12. <HorizontalScrollText :text="statsText1" :fontSize="26" color="text.second" :outerStyle="{ height: '40rpx' }" />
  13. </view>
  14. </view>
  15. <view class="border-top-light-primary pt-2 mt-3"></view>
  16. <view class="d-flex flex-col">
  17. <StatsText
  18. :title="statsLoader.content.value[1].title"
  19. :data="statsLoader.content.value[1].datas"
  20. :type="statsLoader.content.value[1].type"
  21. />
  22. <view class="p-2">
  23. <HorizontalScrollText :text="statsText2" :fontSize="26" color="text.second" :outerStyle="{ height: '40rpx' }" />
  24. </view>
  25. </view>
  26. <view class="border-top-light-primary pt-2 mt-3"></view>
  27. <StatsText
  28. :title="statsLoader.content.value[2].title"
  29. :data="statsLoader.content.value[2].datas"
  30. :type="statsLoader.content.value[2].type"
  31. />
  32. <view class="border-top-light-primary pt-2 mt-3"></view>
  33. <StatsText
  34. :title="statsLoader.content.value[3].title"
  35. :data="statsLoader.content.value[3].datas"
  36. :type="statsLoader.content.value[3].type"
  37. />
  38. <view class="border-top-light-primary pt-2 mt-3"></view>
  39. <StatsText
  40. :title="statsLoader.content.value[4].title"
  41. :data="statsLoader.content.value[4].datas"
  42. :type="statsLoader.content.value[4].type"
  43. />
  44. </view>
  45. </SimplePageContentLoader>
  46. </template>
  47. <script setup lang="ts">
  48. import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
  49. import { navTo } from '@/components/utils/PageAction';
  50. import { ref } from 'vue';
  51. import { navCommonList } from '../article/common/CommonContent';
  52. import type { StatsTextItem } from '../parts/StatsText.vue';
  53. import type { IHomeCommonCategoryBlockStatsProps } from '../article/data/CommonCategoryDefine';
  54. import SimplePageContentLoader from '@/common/components/SimplePageContentLoader.vue';
  55. import StatsText from '../parts/StatsText.vue';
  56. import HorizontalScrollText from '@/components/typography/HorizontalScrollText.vue';
  57. import IndexContent from '@/api/introduction/IndexContent';
  58. const props = defineProps<IHomeCommonCategoryBlockStatsProps>()
  59. const statsText1 = ref('');
  60. const statsText2 = ref('');
  61. const statsLoader = useSimpleDataLoader(async () => {
  62. const data = (await IndexContent.getStats());
  63. let sumInheritor = 0;
  64. let sumProject = 0;
  65. const topLevelProject = data.ichData.find((p: any) => p.level_text == '人类非遗')?.total || 0;
  66. const secondLevelProject = data.ichData.find((p: any) => p.level_text == '国家级')?.total || 0;
  67. const thirdLevelProject = data.ichData.find((p: any) => p.level_text == '省级')?.total || 0;
  68. const forthLevelProject = data.ichData.find((p: any) => p.level_text == '市级')?.total || 0;
  69. const topLevelInheritor = data.inheritorData.find((p: any) => p.level_text == '国家级')?.total || 0;
  70. const secondLevelInheritor = data.inheritorData.find((p: any) => p.level_text == '省级')?.total || 0;
  71. const thirdLevelInheritor = data.inheritorData.find((p: any) => p.level_text == '市级')?.total || 0;
  72. const projects = (data.ichData as any[]).filter((p: any) => [ '人类非遗', '国家级', '省级', '市级' ].includes(p.level_text)).map((item: any) => {
  73. if (item.level_text != '人类非遗')
  74. sumProject += item.total;
  75. return {
  76. title: item.level_text,
  77. value: item.total,
  78. titleSuffix: '项',
  79. type: 'forth',
  80. onClick: () => navTo('/pages/article/data/list', { pageConfigName: 'intangible', tab: 0, level: item.level }),
  81. } as StatsTextItem
  82. });
  83. const inheritors = data.inheritorData.filter((p: any) => [ '国家级', '省级', '市级' ].includes(p.title)).map((item: any) => {
  84. sumInheritor += item.total;
  85. return {
  86. title: item.title,
  87. value: item.total,
  88. titleSuffix: '人',
  89. type: 'normal',
  90. onClick: () => navTo('/pages/inhert/inheritor/list', { level: item.level }),
  91. }
  92. });
  93. statsText1.value = `目前厦门市非遗项目市级以上共有 ${sumProject} 项,其中:国家级 ${secondLevelProject} 项(含 ${topLevelProject} 项为人类非遗)、省级 ${thirdLevelProject} 项、市级 ${forthLevelProject} 项。`;
  94. statsText2.value = `目前厦门市非遗传承人市级以上共有 ${sumInheritor} 人,其中:国家级 ${topLevelInheritor} 人、省级 ${secondLevelInheritor} 人、市级 ${thirdLevelInheritor} 人。`;
  95. const dataMap = {
  96. projects,
  97. inheritors,
  98. ichCenter: data.ichCenter.map((item: any) => {
  99. return {
  100. title: item.title,
  101. value: item.total,
  102. titleSuffix: '处',
  103. type: 'normal',
  104. onClick: () => navTo('/pages/article/data/list', { pageConfigName: 'seminar', tab: 0, region: item.id }),
  105. }
  106. }),
  107. historyData: data.historyData.map((item: any) => {
  108. return {
  109. title: item.title,
  110. value: item.total,
  111. titleSuffix: '处',
  112. onClick: () => {
  113. switch (item.title) {
  114. case '世界文化遗产':
  115. navCommonList({
  116. title: '世界文化遗产',
  117. modelId: 17,
  118. mainBodyColumnId: 310
  119. });
  120. break;
  121. case '传统村落':
  122. navTo('/pages/inhert/village/list');
  123. break;
  124. case '重点区域':
  125. navCommonList({
  126. title: '重点区域',
  127. modelId: 17,
  128. mainBodyColumnId: 283
  129. });
  130. break;
  131. }
  132. },
  133. }
  134. }),
  135. minnanCr: data.minnanCr.map((item: any) => {
  136. return {
  137. title: item.title,
  138. value: item.total,
  139. titleSuffix: '处',
  140. onClick: () => navTo('/pages/inhert/artifact/list', {
  141. level: item.level
  142. }),
  143. }
  144. }),
  145. } as Record<string, StatsTextItem[]>;
  146. return props.statsNameConfig.map((item: any) => {
  147. return {
  148. ...item,
  149. datas: dataMap[item.name],
  150. }
  151. });
  152. });
  153. </script>