Kaynağa Gözat

Merge branch 'wang' into test

WanGxC 9 ay önce
ebeveyn
işleme
9e846d12ec

+ 11 - 5
src/utils/useElTableData.ts

@@ -9,18 +9,24 @@ import { nextTick, Ref } from 'vue';
  * @param total El-Table数据的总条数
  * @param loading El-Table的loading状态
  */
-export async function useElTableData(apiFunction: Function, query: any, tableData: Ref, total: Ref, loading: Ref) {
-  loading.value = true;
+
+export async function useElTableData(apiFunction: Function, query: any, tableData: Ref<any[]>, total: Ref<number>, loading: Ref<boolean>) {
   try {
+    loading.value = true;
     const response = await apiFunction(query);
+    let responseData = response.data;
+    if (!Array.isArray(responseData)) {
+      responseData = [ responseData ];
+    }
     total.value = response.total;
-    tableData.value = response.data;
+    tableData.value = responseData;
+    return { success: true, data: responseData };
   } catch (error) {
-    console.log('error=>', error);
+    console.error('Error in useElTableData==> ', error);
+    return { success: false, error };
   } finally {
     loading.value = false;
     await nextTick();
-    // 触发窗口 resize 事件
     window.dispatchEvent(new Event('resize'));
   }
 }

+ 60 - 0
src/views/featureWord/queryPage/FeatureWordTable.vue

@@ -0,0 +1,60 @@
+<script lang="ts" setup>/**
+ * @Name: FeatureWordTable.vue
+ * @Description: 反查关键词表格
+ * @Author: Cheney
+ */
+
+import { usePagination } from '/@/utils/usePagination';
+import { inject, ref, Ref } from 'vue';
+import { useElTableData } from '/@/utils/useElTableData';
+import * as api from '/@/views/featureWord/queryPage/api';
+
+
+const { tableData, total, currentPage, pageSize, handlePageChange } = usePagination(fetchTableData);
+const filter = inject<Ref>('filter');
+const loading = ref(false);
+
+async function fetchTableData() {
+  const query = {
+    search_term: filter.value.searchTerm,
+    marketplace_Ids: filter.value.marketIds,
+    report_type: filter.value.reportType,
+    date_start: filter.value.reportDate[0],
+    date_end: filter.value.reportDate[1],
+    page: currentPage.value,
+    limit: pageSize.value
+  };
+  const { success, data } = await useElTableData(api.getTableData, query, tableData, total, loading);
+  console.log('(FeatureWordTable.vue: 28)=> data', data);
+  // tableData.value = data;
+}
+</script>
+
+<template>
+  <el-card shadow="hover" style="border: none; margin-bottom: 10px">
+    <el-descriptions title="/ 反查关键词 /"></el-descriptions>
+    <el-card shadow="never">
+      <el-table v-loading="loading" :data="tableData" height="800" stripe style="width: 100%">
+        <el-table-column align="center" label="特征词" prop="feature_word"></el-table-column>
+        <el-table-column align="center" label="权重值" prop="weight_value"></el-table-column>
+        <el-table-column align="center" label="关键词" prop="searchTerm"></el-table-column>
+        <el-table-column align="center" label="搜索频次" prop="searchFrequencyRank"></el-table-column>
+        <el-table-column align="center" label="点击分享" prop="clickShare"></el-table-column>
+        <el-table-column align="center" label="转化分享" prop="conversionShare"></el-table-column>
+      </el-table>
+      <div class="mt-3.5 flex justify-end">
+        <el-pagination
+            v-model:current-page="currentPage"
+            v-model:page-size="pageSize"
+            :page-sizes="[10, 20, 30, 50, 100, 200]"
+            :total="total"
+            layout="sizes, prev, pager, next, total"
+            @change="handlePageChange"/>
+      </div>
+    </el-card>
+  </el-card>
+</template>
+
+<style scoped>
+
+</style>

+ 39 - 20
src/views/featureWord/queryPage/WeightTable.vue

@@ -1,15 +1,9 @@
 <script lang="ts" setup>
-/**
- * @Name: weightTable.vue
- * @Description: 权重表格
- * @Author: Cheney
- */
-
 import { inject, onBeforeUnmount, Ref, ref } from 'vue';
 import { usePagination } from '/@/utils/usePagination';
-import { useElTableData } from '/@/utils/useElTableData';
 import * as api from './api';
 import emitter from '/@/utils/emitter';
+import { useElTableData } from '/@/utils/useElTableData';
 
 
 const { tableData, total, currentPage, pageSize, handlePageChange } = usePagination(fetchTableData);
@@ -24,9 +18,8 @@ onBeforeUnmount(() => {
   emitter.all.clear();
 });
 
-function fetchTableData() {
+async function fetchTableData() {
   const query = {
-    search_term: filter.value.searchTerm,
     marketplace_Ids: filter.value.marketIds,
     report_type: filter.value.reportType,
     date_start: filter.value.reportDate[0],
@@ -34,22 +27,48 @@ function fetchTableData() {
     page: currentPage.value,
     limit: pageSize.value
   };
-  useElTableData(api.getTableData, query, tableData, total, loading);
+  const { success, data } = await useElTableData(api.getTableData, query, tableData, total, loading);
+  tableData.value = data || [];
+  if (!success) {
+    return;
+  } else if (data && data.length > 0) {
+    tableData.value = tableData.value.flatMap(obj =>
+        Object.entries(obj).map(([ keyword, weight ]) => ({ keyword, weight }))
+    );
+  }
 }
 </script>
 
 <template>
   <el-card shadow="hover" style="border: none; margin-bottom: 10px">
-    <el-table v-loading="loading" :data="tableData" height="600" stripe style="width: 100%"></el-table>
-    <div class="mt-3.5 flex justify-end">
-      <el-pagination
-          v-model:current-page="currentPage"
-          v-model:page-size="pageSize"
-          :page-sizes="[10, 20, 30, 50, 100, 200]"
-          :total="total"
-          layout="sizes, prev, pager, next"
-          @change="handlePageChange"/>
-    </div>
+    <el-descriptions title="/ 特征词与权重 /">
+      <template #extra>
+        <el-button icon="Upload" plain round type="warning">上传文件</el-button>
+      </template>
+    </el-descriptions>
+    <el-card shadow="never">
+      <el-table v-loading="loading" :data="tableData" height="600" stripe style="width: 100%">
+        <el-table-column align="center" label="关键词" prop="keyword">
+          <template #default="{ row }">
+            <span class="font-semibold">{{ row.keyword }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="权重值" prop="weight">
+          <template #default="{ row }">
+            <span class="font-semibold">{{ row.weight }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="mt-3.5 flex justify-end">
+        <el-pagination
+            v-model:current-page="currentPage"
+            v-model:page-size="pageSize"
+            :page-sizes="[10, 20, 30, 50, 100, 200]"
+            :total="total"
+            layout="sizes, prev, pager, next, total"
+            @change="handlePageChange"/>
+      </div>
+    </el-card>
   </el-card>
 </template>
 

+ 1 - 1
src/views/featureWord/queryPage/api.ts

@@ -5,7 +5,7 @@ const apiPrefix = '/api/searchterm/';
 
 export function getTableData(query: any) {
   return request({
-    url: apiPrefix + 'featureword/',
+    url: apiPrefix + 'weightterm/',
     method: 'GET',
     params: query,
   });

+ 2 - 1
src/views/featureWord/queryPage/index.vue

@@ -12,6 +12,7 @@ import { onMounted, provide, ref, watch } from 'vue';
 import dayjs from 'dayjs';
 import _ from 'lodash';
 import enLocale from 'element-plus/es/locale/lang/en';
+import FeatureWordTable from '/@/views/featureWord/queryPage/FeatureWordTable.vue';
 
 const date = ref(calculateLastMonthFirstWeek());
 const dateRange = ref(date.value[0]);
@@ -49,7 +50,6 @@ function calculateLastMonthFirstWeek() {
  */
 function calculateDate() {
   if (filter.value.reportType === 'WEEKLY') {
-    console.log('dateRange.value=> ', dateRange.value);
     date.value[0] = dateRange.value;
     date.value[1] = dayjs(dateRange.value).add(6, 'day').format('YYYY-MM-DD');
   } else if (filter.value.reportType === 'MONTHLY') {
@@ -126,6 +126,7 @@ function handleDownload() {
       </div>
     </el-card>
     <WeightTable/>
+    <FeatureWordTable />
   </div>
 </template>
 

+ 1 - 1
src/views/searchTerm/analysisPage/QuerySummary.vue

@@ -113,7 +113,7 @@ function getSearchLink(searchRoot: any) {
             v-model:current-page="currentPage"
             v-model:page-size="pageSize"
             :page-sizes="[10, 20, 30, 50, 100, 200]"
-            layout="sizes, prev, pager, next"
+            layout="total, sizes, prev, pager, next"
             :total="total"
             @change="handlePageChange" />
       </div>

+ 1 - 1
src/views/searchTerm/rootWordManage/components/root-word-manage-table.vue

@@ -431,7 +431,7 @@ function handleResponse(response: any) {
           v-model:current-page="currentPage"
           v-model:page-size="pageSize"
           :page-sizes="[20, 40, 50, 100]"
-          layout="sizes, prev, pager, next"
+          layout="total, sizes, prev, pager, next"
           :total="total"
           @size-change="handleSizeChange"
           @current-change="handleCurrentChange" />

+ 57 - 54
src/views/searchTerm/targetingSearchTerm/index.vue

@@ -1,4 +1,4 @@
-<script setup lang="ts">
+<script lang="ts" setup>
 /**
  * @Name: index.vue
  * @Description: Targeting-SearchTerm 跳转页面
@@ -6,18 +6,19 @@
  */
 
 import { useRoute } from 'vue-router';
-import { targetingColumns, searchTermColumns } from './useColumns';
-import { reactive, ref, onBeforeMount } from 'vue';
+import { searchTermColumns, targetingColumns } from './useColumns';
+import { onBeforeMount, reactive, ref } from 'vue';
 import { storeToRefs } from 'pinia';
 import { usePublicData } from '/@/stores/publicData';
 import * as api from './api';
 import { debounce } from 'lodash';
 
+
 const publicData = usePublicData();
 const { dateRange } = storeToRefs(publicData);
 const route = useRoute();
 const { searchRoot } = route.query;
-const date = ref([dateRange.value[0], dateRange.value[1]]);
+const date = ref([ dateRange.value[0], dateRange.value[1] ]);
 const searchType = ref('BROAD');
 const targetingSearchRoot = ref('');
 const searchTermSearchRoot = ref('');
@@ -29,21 +30,21 @@ const targetingOptions: any = reactive({
   border: false,
   round: true,
   columnConfig: {
-    resizable: true,
+    resizable: true
   },
   toolbarConfig: {
     custom: true,
     slots: {
-      buttons: 'toolbar_buttons',
-    },
+      buttons: 'toolbar_buttons'
+    }
   },
   columns: targetingColumns,
-  data: [],
+  data: []
 });
 const targetingPage = reactive({
   total: 0,
   currentPage: 1,
-  pageSize: 15,
+  pageSize: 15
 });
 
 const searchTermOptions: any = reactive({
@@ -51,21 +52,21 @@ const searchTermOptions: any = reactive({
   border: false,
   round: true,
   columnConfig: {
-    resizable: true,
+    resizable: true
   },
   toolbarConfig: {
     custom: true,
     slots: {
-      buttons: 'toolbar_buttons',
-    },
+      buttons: 'toolbar_buttons'
+    }
   },
   columns: searchTermColumns,
-  data: [],
+  data: []
 });
 const searchTermPage = reactive({
   total: 0,
   currentPage: 1,
-  pageSize: 15,
+  pageSize: 15
 });
 
 onBeforeMount(() => {
@@ -85,17 +86,17 @@ function searchTermPageChange({ currentPage, pageSize }) {
 }
 
 const fetchTableData = debounce(
-  () => {
-    targetingPage.currentPage = 1;
-    targetingPage.pageSize = 15;
-    searchTermPage.currentPage = 1;
-    searchTermPage.pageSize = 15;
-    fetchTargetingData();
-    fetchSearchTermData();
-  },
-  500,
-  { leading: true, trailing: false }
-); // 首次调用立即执行,500毫秒内的后续调用不生效
+    () => {
+      targetingPage.currentPage = 1;
+      targetingPage.pageSize = 15;
+      searchTermPage.currentPage = 1;
+      searchTermPage.pageSize = 15;
+      fetchTargetingData();
+      fetchSearchTermData();
+    },
+    500,
+    { leading: true, trailing: false }  // 首次调用立即执行,500毫秒内的后续调用不生效
+);
 
 async function fetchTargetingData() {
   TargetingLoading.value = true;
@@ -107,7 +108,7 @@ async function fetchTargetingData() {
     limit: targetingPage.pageSize,
     search_root: targetingSearchRoot.value ? targetingSearchRoot.value : searchRoot,
     search_type: searchType.value, // BROAD, PHRASE, EXACT, AUTO
-    term_type: 'TARGETING', // TARGETING, SEARCHTERM
+    term_type: 'TARGETING' // TARGETING, SEARCHTERM
   };
   try {
     const response = await api.getTargetingData(query);
@@ -130,7 +131,7 @@ async function fetchSearchTermData() {
     limit: targetingPage.pageSize,
     search_root: searchTermSearchRoot.value ? searchTermSearchRoot.value : searchRoot,
     search_type: searchType.value,
-    term_type: 'SEARCHTERM',
+    term_type: 'SEARCHTERM'
   };
   try {
     const response = await api.getTargetingData(query);
@@ -156,7 +157,7 @@ async function fetchSearchTermData() {
     </el-divider>
   </div>
   <div class="py-2 px-2.5">
-    <el-card shadow="hover" style="border: none" body-class="flex justify-between">
+    <el-card body-class="flex justify-between" shadow="hover" style="border: none">
       <div class="flex flex-wrap gap-7">
         <div>
           <span class="font-medium mr-0.5">搜索词类型 </span>
@@ -170,27 +171,28 @@ async function fetchSearchTermData() {
         <div>
           <span class="font-medium mr-0.5">日期 </span>
           <el-date-picker
-            v-model="date"
-            type="daterange"
-            value-format="YYYY-MM-DD"
-            range-separator="To"
-            :disabled-date="(time: Date) => time > new Date()"
-            :popper-options="{ placement: 'bottom-end' }"
-            :clearable="false" />
+              v-model="date"
+              :clearable="false"
+              :disabled-date="(time: Date) => time > new Date()"
+              :popper-options="{ placement: 'bottom-end' }"
+              range-separator="To"
+              type="daterange"
+              value-format="YYYY-MM-DD"/>
         </div>
       </div>
-      <el-button type="primary" plain @click="fetchTableData" icon="search">查询</el-button>
+      <el-button icon="search" plain type="primary" @click="fetchTableData">查询</el-button>
     </el-card>
-    <el-card shadow="hover" class="mt-3" style="border: none" body-style="padding-top: 10px">
-      <div class="w-full overflow-hidden" style="height: 950px" v-loading="TargetingLoading">
+    <el-card body-style="padding-top: 10px" class="mt-3" shadow="hover" style="border: none">
+      <div v-loading="TargetingLoading" class="w-full overflow-hidden" style="height: 950px">
         <vxe-grid v-bind="targetingOptions">
           <template #toolbar_buttons>
             <span class="font-medium text-xl" style="color: #000000"> Targeting-关联关键词 </span>
-            <el-input v-model="targetingSearchRoot" placeholder="请输入关键词回车搜索" @change="fetchTargetingData" class="ml-5" style="width: 200px;"></el-input>
+            <el-input v-model="targetingSearchRoot" class="ml-5" placeholder="请输入关键词回车搜索" style="width: 200px;"
+                      @change="fetchTargetingData"></el-input>
           </template>
           <template v-for="col in targetingColumns" #[`${col.field}_default`]="{ row }">
             <div v-if="col.field === 'targeting'">
-              <el-tooltip effect="dark" :content="row.targeting" placement="top" :show-after="300">
+              <el-tooltip :content="row.targeting" :show-after="300" effect="dark" placement="top">
                 <div class="font-medium overflow-hidden whitespace-nowrap text-ellipsis">
                   {{ row.targeting }}
                 </div>
@@ -208,26 +210,27 @@ async function fetchSearchTermData() {
           </template>
           <template #pager>
             <vxe-pager
-              :layouts="['Sizes', 'PrevJump', 'PrevPage', 'Number', 'NextPage', 'NextJump', 'FullJump', 'Total']"
-              v-model:current-page="targetingPage.currentPage"
-              v-model:page-size="targetingPage.pageSize"
-              :total="targetingPage.total"
-              @page-change="targetingPageChange">
+                v-model:current-page="targetingPage.currentPage"
+                v-model:page-size="targetingPage.pageSize"
+                :layouts="['Sizes', 'PrevJump', 'PrevPage', 'Number', 'NextPage', 'NextJump', 'FullJump', 'Total']"
+                :total="targetingPage.total"
+                @page-change="targetingPageChange">
             </vxe-pager>
           </template>
         </vxe-grid>
       </div>
     </el-card>
-    <el-card shadow="hover" class="mt-3" style="border: none" body-style="padding-top: 10px">
-      <div class="w-full overflow-hidden" style="height: 950px" v-loading="searchTermLoading">
+    <el-card body-style="padding-top: 10px" class="mt-3" shadow="hover" style="border: none">
+      <div v-loading="searchTermLoading" class="w-full overflow-hidden" style="height: 950px">
         <vxe-grid v-bind="searchTermOptions">
           <template #toolbar_buttons>
             <span class="font-medium text-xl" style="color: #000000"> SearchTerm-相关搜索结果 </span>
-            <el-input v-model="searchTermSearchRoot" placeholder="请输入搜索词回车搜索" @change="fetchTargetingData" class="ml-5" style="width: 200px;"></el-input>
+            <el-input v-model="searchTermSearchRoot" class="ml-5" placeholder="请输入搜索词回车搜索" style="width: 200px;"
+                      @change="fetchTargetingData"></el-input>
           </template>
           <template v-for="col in searchTermColumns" #[`${col.field}_default`]="{ row }">
             <div v-if="col.field === 'searchTerm'">
-              <el-tooltip effect="dark" :content="row.searchTerm" placement="top" :show-after="300">
+              <el-tooltip :content="row.searchTerm" :show-after="300" effect="dark" placement="top">
                 <div class="font-medium overflow-hidden whitespace-nowrap text-ellipsis">
                   {{ row.searchTerm }}
                 </div>
@@ -245,11 +248,11 @@ async function fetchSearchTermData() {
           </template>
           <template #pager>
             <vxe-pager
-              :layouts="['Sizes', 'PrevJump', 'PrevPage', 'Number', 'NextPage', 'NextJump', 'FullJump', 'Total']"
-              v-model:current-page="searchTermPage.currentPage"
-              v-model:page-size="searchTermPage.pageSize"
-              :total="searchTermPage.total"
-              @page-change="searchTermPageChange">
+                v-model:current-page="searchTermPage.currentPage"
+                v-model:page-size="searchTermPage.pageSize"
+                :layouts="['Sizes', 'PrevJump', 'PrevPage', 'Number', 'NextPage', 'NextJump', 'FullJump', 'Total']"
+                :total="searchTermPage.total"
+                @page-change="searchTermPageChange">
             </vxe-pager>
           </template>
         </vxe-grid>

+ 1 - 1
src/views/searchTerm/topSearchTermRank/index.vue

@@ -222,7 +222,7 @@ function handleJump() {
           v-model:current-page="currentPage"
           v-model:page-size="pageSize"
           :page-sizes="[10, 20, 30, 50, 100, 200]"
-          layout="sizes, prev, pager, next"
+          layout="sizes, prev, pager, next, total"
           :total="total"
           @change="handlePageChange" />
       </div>

+ 1 - 1
src/views/searchTerm/topSearchTermTable/index.vue

@@ -454,7 +454,7 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
           v-model:current-page="currentPage"
           v-model:page-size="pageSize"
           :page-sizes="[21, 42, 72, 102, 132, 162]"
-          layout="sizes, prev, pager, next"
+          layout="sizes, prev, pager, next, total"
           :total="total"
           @change="handlePageChange" />
       </div>