FeatureWordTable.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: FeatureWordTable.vue
  4. * @Description: 反查关键词表格
  5. * @Author: Cheney
  6. */
  7. import { usePagination } from '/@/utils/usePagination';
  8. import { inject, onBeforeMount, onBeforeUnmount, ref, Ref } from 'vue';
  9. import { useElTableData } from '/@/utils/useElTableData';
  10. import * as api from '/@/views/featureWord/queryPage/api';
  11. import emitter from '/@/utils/emitter';
  12. const { tableData, total, currentPage, pageSize, handlePageChange } = usePagination(fetchTableData);
  13. const filter = inject<Ref>('filter');
  14. const loading = ref(false);
  15. emitter.on('QueryPage-query', () => {
  16. fetchTableData();
  17. });
  18. onBeforeMount(() => {
  19. pageSize.value = 20;
  20. });
  21. onBeforeUnmount(() => {
  22. emitter.all.clear();
  23. });
  24. async function fetchTableData() {
  25. const query = {
  26. search_term: filter.value.searchTerm,
  27. marketplace_Ids: filter.value.marketIds,
  28. report_type: filter.value.reportType,
  29. date_start: filter.value.reportDate[0],
  30. date_end: filter.value.reportDate[1],
  31. page: currentPage.value,
  32. limit: pageSize.value
  33. };
  34. await useElTableData(api.getFeatureWordData, query, tableData, total, loading);
  35. }
  36. function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
  37. if (columnIndex === 0) { // 只对 "特征词" 列进行处理
  38. const currentWord = tableData.value[rowIndex].feature_word;
  39. let rowspan = 1;
  40. // 计算有多少连续行具有相同的 feature_word, 包括最后一行
  41. while (rowIndex + rowspan < tableData.value.length &&
  42. tableData.value[rowIndex + rowspan].feature_word === currentWord) {
  43. rowspan++;
  44. }
  45. if (rowIndex === 0 || tableData.value[rowIndex - 1].feature_word !== currentWord) {
  46. return [ rowspan, 1 ];
  47. } else {
  48. return [ 0, 0 ];
  49. }
  50. }
  51. return [ 1, 1 ]; // 对其他列不做特殊处理
  52. }
  53. </script>
  54. <template>
  55. <el-card shadow="hover" style="border: none; margin-bottom: 10px">
  56. <el-descriptions title="/ 反查关键词 /"></el-descriptions>
  57. <el-card shadow="never">
  58. <el-table v-loading="loading" :data="tableData" :span-method="arraySpanMethod" height="800" stripe style="width: 100%">
  59. <el-table-column align="center" label="特征词" prop="feature_word">
  60. <template #default="{ row }">
  61. <span class="font-semibold">{{ row.feature_word }}</span>
  62. </template>
  63. </el-table-column>
  64. <el-table-column align="center" label="关键词" prop="searchTerm">
  65. <template #default="{ row }">
  66. <el-tooltip :content="row.searchTerm" :show-after="500" effect="dark" placement="top-start">
  67. <span class="font-semibold line-clamp-1 text-ellipsis">{{ row.searchTerm }}</span>
  68. </el-tooltip>
  69. </template>
  70. </el-table-column>
  71. <el-table-column align="center" label="权重值" prop="weight_value">
  72. <template #default="{ row }">
  73. <span class="font-semibold">{{ row.weight_value }}</span>
  74. </template>
  75. </el-table-column>
  76. <el-table-column align="center" label="搜索频次" prop="searchFrequencyRank">
  77. <template #default="{ row }">
  78. <span class="font-semibold">{{ row.searchFrequencyRank }}</span>
  79. </template>
  80. </el-table-column>
  81. <el-table-column align="center" label="点击分享" prop="clickShare">
  82. <template #default="{ row }">
  83. <span class="font-semibold">{{ row.clickShare }}</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column align="center" label="转化分享" prop="conversionShare">
  87. <template #default="{ row }">
  88. <span class="font-semibold">{{ row.conversionShare }}</span>
  89. </template>
  90. </el-table-column>
  91. </el-table>
  92. <div class="mt-3.5 flex justify-end">
  93. <el-pagination
  94. v-model:current-page="currentPage"
  95. v-model:page-size="pageSize"
  96. :page-sizes="[10, 20, 30, 50, 100, 200]"
  97. :total="total"
  98. layout="sizes, prev, pager, next, total"
  99. @change="handlePageChange"/>
  100. </div>
  101. </el-card>
  102. </el-card>
  103. </template>
  104. <style scoped>
  105. </style>