|
@@ -1,4 +1,4 @@
|
|
|
-<script setup lang="ts">
|
|
|
+<script lang="ts" setup>
|
|
|
/**
|
|
|
* @Name: index.vue
|
|
|
* @Description: 搜索词-TopSearchTerm Table
|
|
@@ -15,6 +15,7 @@ import { ElMessage } from 'element-plus';
|
|
|
import dayjs from 'dayjs';
|
|
|
import enLocale from 'element-plus/es/locale/lang/en';
|
|
|
|
|
|
+
|
|
|
const router = useRouter();
|
|
|
const { tableData, total, currentPage, pageSize, handlePageChange } = usePagination(fetchTableData);
|
|
|
const marketplaceSelect = ref(marketplaceIdEnum[0].value); // 当前只有美国区 默认第一个为美国
|
|
@@ -59,7 +60,7 @@ function calculateLastWeek() {
|
|
|
const today = dayjs();
|
|
|
const lastSaturday = today.subtract(today.day() + 1, 'day'); // 上周六
|
|
|
const lastSunday = lastSaturday.subtract(6, 'day'); // 上周日
|
|
|
- return [lastSunday.format('YYYY-MM-DD'), lastSaturday.format('YYYY-MM-DD')];
|
|
|
+ return [ lastSunday.format('YYYY-MM-DD'), lastSaturday.format('YYYY-MM-DD') ];
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -90,7 +91,7 @@ async function fetchTableData() {
|
|
|
report_type: reportTypeSelect.value,
|
|
|
marketplace_Ids: marketplaceSelect.value,
|
|
|
date_start: date.value[0],
|
|
|
- date_end: date.value[1],
|
|
|
+ date_end: date.value[1]
|
|
|
};
|
|
|
try {
|
|
|
const response = await getTopSearchTermTable(query);
|
|
@@ -165,12 +166,12 @@ async function handleDownload() {
|
|
|
date_end: date.value[1],
|
|
|
search_term: searchTermInp.value,
|
|
|
marketplace_Ids: marketplaceSelect.value,
|
|
|
- report_type: reportTypeSelect.value,
|
|
|
+ report_type: reportTypeSelect.value
|
|
|
};
|
|
|
|
|
|
const response = await postDownload(body);
|
|
|
|
|
|
- const blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
|
|
|
+ const blob = new Blob([ response.data ], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
|
|
|
|
|
|
// 创建一个临时 URL
|
|
|
const url = window.URL.createObjectURL(blob);
|
|
@@ -181,7 +182,7 @@ async function handleDownload() {
|
|
|
|
|
|
// 设置文件名
|
|
|
const currentTime = dayjs().format('YYYY-MM-DD_HH_mm_ss');
|
|
|
- const filename = `TopSearchTerm_${currentTime}.xlsx`;
|
|
|
+ const filename = `TopSearchTerm_${ currentTime }.xlsx`;
|
|
|
|
|
|
link.setAttribute('download', filename);
|
|
|
|
|
@@ -219,12 +220,12 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
// 每三个合并为一个单元格
|
|
|
if (columnIndex >= 0 && columnIndex <= 4) {
|
|
|
if (rowIndex % 3 === 0) {
|
|
|
- return [3, 1]; // 跨越三行
|
|
|
+ return [ 3, 1 ]; // 跨越三行
|
|
|
} else {
|
|
|
- return [0, 0]; // 被合并的单元格
|
|
|
+ return [ 0, 0 ]; // 被合并的单元格
|
|
|
}
|
|
|
}
|
|
|
- return [1, 1];
|
|
|
+ return [ 1, 1 ];
|
|
|
}
|
|
|
</script>
|
|
|
|
|
@@ -233,120 +234,119 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
<el-divider>
|
|
|
<div class="font-bold text-xl">
|
|
|
<el-icon style="top: 3px">
|
|
|
- <DataAnalysis />
|
|
|
+ <DataAnalysis/>
|
|
|
</el-icon>
|
|
|
Top Search Term - Table
|
|
|
</div>
|
|
|
</el-divider>
|
|
|
</div>
|
|
|
- <el-card class="mx-3 mb-2.5" v-loading="tableLoading" style="border: none;">
|
|
|
+ <el-card v-loading="tableLoading" class="mx-3 mb-2.5" style="border: none;">
|
|
|
<!-- table筛选栏 -->
|
|
|
<div class="flex justify-between">
|
|
|
<div class="flex gap-5 flex-wrap">
|
|
|
<div>
|
|
|
<span class="font-medium mr-0.5">市场 </span>
|
|
|
- <el-select v-model="marketplaceSelect" @change="handleSelectChange" style="width: 90px">
|
|
|
+ <el-select v-model="marketplaceSelect" style="width: 90px" @change="handleSelectChange">
|
|
|
<el-option
|
|
|
- v-for="item in marketplaceOptions"
|
|
|
- :disabled="item.disabled"
|
|
|
- :key="item.value"
|
|
|
- :value="item.value"
|
|
|
- :label="item.label" />
|
|
|
+ v-for="item in marketplaceOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :disabled="item.disabled"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"/>
|
|
|
</el-select>
|
|
|
</div>
|
|
|
<div>
|
|
|
<span class="font-medium mr-0.5">报告类型 </span>
|
|
|
- <el-select v-model="reportTypeSelect" @change="handleSelectChange" style="width: 90px">
|
|
|
- <el-option label="周度" value="weekly" />
|
|
|
- <el-option label="月度" value="monthly" />
|
|
|
+ <el-select v-model="reportTypeSelect" style="width: 90px" @change="handleSelectChange">
|
|
|
+ <el-option label="周度" value="weekly"/>
|
|
|
+ <el-option label="月度" value="monthly"/>
|
|
|
</el-select>
|
|
|
</div>
|
|
|
<div>
|
|
|
<span class="font-medium mr-0.5">搜索词 </span>
|
|
|
<el-input
|
|
|
- v-model="searchTermInp"
|
|
|
- @keyup.enter="handleQueryChange"
|
|
|
- :prefix-icon="Search"
|
|
|
- placeholder="输入后回车查询"
|
|
|
- clearable
|
|
|
- @clear="handleSelectChange"
|
|
|
- style="width: 240px" />
|
|
|
+ v-model="searchTermInp"
|
|
|
+ :prefix-icon="Search"
|
|
|
+ clearable
|
|
|
+ placeholder="输入后回车查询"
|
|
|
+ style="width: 240px"
|
|
|
+ @clear="handleSelectChange"
|
|
|
+ @keyup.enter="handleQueryChange"/>
|
|
|
</div>
|
|
|
<div>
|
|
|
<span class="font-medium mr-0.5">ASIN </span>
|
|
|
<el-input
|
|
|
- v-model="asinInp"
|
|
|
- @keyup.enter="handleQueryChange"
|
|
|
- :prefix-icon="Search"
|
|
|
- placeholder="输入后回车查询"
|
|
|
- clearable
|
|
|
- @clear="handleSelectChange"
|
|
|
- style="width: 180px" />
|
|
|
+ v-model="asinInp"
|
|
|
+ :prefix-icon="Search"
|
|
|
+ clearable
|
|
|
+ placeholder="输入后回车查询"
|
|
|
+ style="width: 180px"
|
|
|
+ @clear="handleSelectChange"
|
|
|
+ @keyup.enter="handleQueryChange"/>
|
|
|
</div>
|
|
|
<div>
|
|
|
<span class="font-medium mr-0.5">报告日期 </span>
|
|
|
- <el-config-provider :locale="enLocale">
|
|
|
- <el-date-picker
|
|
|
- v-if="reportTypeSelect === 'weekly'"
|
|
|
- v-model="dateDimension"
|
|
|
- type="week"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- :format="`${date[0]} To ${date[1]}`"
|
|
|
- :popper-options="{ placement: 'bottom-end' }"
|
|
|
- :disabled-date="(time: Date) => time > new Date()"
|
|
|
- :clearable="false" />
|
|
|
+ <el-config-provider v-if="reportTypeSelect === 'weekly'" :locale="enLocale">
|
|
|
<el-date-picker
|
|
|
+ v-model="dateDimension"
|
|
|
+ :clearable="false"
|
|
|
+ :disabled-date="(time: Date) => time > new Date()"
|
|
|
+ :format="`${date[0]} To ${date[1]}`"
|
|
|
+ :popper-options="{ placement: 'bottom-end' }"
|
|
|
+ type="week"
|
|
|
+ value-format="YYYY-MM-DD"/>
|
|
|
+ </el-config-provider>
|
|
|
+ <el-date-picker
|
|
|
v-else
|
|
|
v-model="dateDimension"
|
|
|
- type="month"
|
|
|
- value-format="YYYY-MM"
|
|
|
+ :clearable="false"
|
|
|
+ :disabled-date="(time: Date) => time > new Date()"
|
|
|
:format="`${date[0]} To ${date[1]}`"
|
|
|
:popper-options="{ placement: 'bottom-end' }"
|
|
|
- :disabled-date="(time: Date) => time > new Date()"
|
|
|
- :clearable="false">
|
|
|
- <template #default> 123</template>
|
|
|
- </el-date-picker>
|
|
|
- </el-config-provider>
|
|
|
+ type="month"
|
|
|
+ value-format="YYYY-MM">
|
|
|
+ <!--<template #default> 123</template>-->
|
|
|
+ </el-date-picker>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="flex">
|
|
|
- <el-button type="primary" plain @click="handleJump" :icon="TopRight">搜索词管理</el-button>
|
|
|
+ <el-button :icon="TopRight" plain type="primary" @click="handleJump">搜索词管理</el-button>
|
|
|
<el-button
|
|
|
- type="success"
|
|
|
- plain
|
|
|
- @click="handleDownload"
|
|
|
- :icon="Download"
|
|
|
- round
|
|
|
- :loading="downloadLoading"
|
|
|
- :disabled="!tableData.length"
|
|
|
- >下载表格
|
|
|
+ :disabled="!tableData.length"
|
|
|
+ :icon="Download"
|
|
|
+ :loading="downloadLoading"
|
|
|
+ plain
|
|
|
+ round
|
|
|
+ type="success"
|
|
|
+ @click="handleDownload"
|
|
|
+ >下载表格
|
|
|
</el-button>
|
|
|
- <el-button @click="refreshTable" :icon="Refresh" circle></el-button>
|
|
|
+ <el-button :icon="Refresh" circle @click="refreshTable"></el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
<!-- table -->
|
|
|
- <el-card shadow="never" class="mt-5">
|
|
|
+ <el-card class="mt-5" shadow="never">
|
|
|
<div style="height: 100%; overflow: auto">
|
|
|
<el-table :data="tableData" :span-method="arraySpanMethod" height="920" stripe style="width: 100%">
|
|
|
<!-- 保持索引是1, 2, 3的顺序 不会收到合并单元格的影响 -->
|
|
|
- <el-table-column fixed type="index" width="50" :index="(index) => Math.floor(index / 3) + 1" />
|
|
|
- <el-table-column prop="searchTerm" label="搜索词" width="260">
|
|
|
+ <el-table-column :index="(index) => Math.floor(index / 3) + 1" fixed type="index" width="50"/>
|
|
|
+ <el-table-column label="搜索词" prop="searchTerm" width="260">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 3px">
|
|
|
- <Key />
|
|
|
+ <Key/>
|
|
|
</el-icon>
|
|
|
<span>搜索词</span>
|
|
|
</template>
|
|
|
<template #default="{ row }">
|
|
|
- <el-link :underline="false" target="_blank" style="color: #5a6fc0"
|
|
|
- >{{ row.searchTerm }}
|
|
|
+ <el-link :underline="false" style="color: #5a6fc0" target="_blank"
|
|
|
+ >{{ row.searchTerm }}
|
|
|
</el-link>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="searchFrequencyRank" label="搜索词搜索排名" align="center" width="150">
|
|
|
+ <el-table-column align="center" label="搜索词搜索排名" prop="searchFrequencyRank" width="150">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 4px">
|
|
|
- <Rank />
|
|
|
+ <Rank/>
|
|
|
</el-icon>
|
|
|
<span>搜索词搜索排名</span>
|
|
|
</template>
|
|
@@ -354,10 +354,10 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
<span class="font-medium">{{ row.searchFrequencyRank }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="clickShareSummary" label="点击分享率(SUM)" align="center" width="150">
|
|
|
+ <el-table-column align="center" label="点击分享率(SUM)" prop="clickShareSummary" width="150">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 4px">
|
|
|
- <Star />
|
|
|
+ <Star/>
|
|
|
</el-icon>
|
|
|
<span>点击分享率汇总</span>
|
|
|
</template>
|
|
@@ -365,10 +365,10 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
<span class="font-medium">{{ row.clickShareSummary }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="conversionShareSummary" label="转化分享率(SUM)" align="center" width="150">
|
|
|
+ <el-table-column align="center" label="转化分享率(SUM)" prop="conversionShareSummary" width="150">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 4px">
|
|
|
- <Star />
|
|
|
+ <Star/>
|
|
|
</el-icon>
|
|
|
<span>转化分享率汇总</span>
|
|
|
</template>
|
|
@@ -376,10 +376,10 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
<span class="font-medium">{{ row.conversionShareSummary }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="clickedAsin" label="Asin" align="center">
|
|
|
+ <el-table-column align="center" label="Asin" prop="clickedAsin">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 5px">
|
|
|
- <Goods />
|
|
|
+ <Goods/>
|
|
|
</el-icon>
|
|
|
<span>Asin</span>
|
|
|
</template>
|
|
@@ -395,16 +395,17 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
<!--</div>-->
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="clickedItemName" label="标题">
|
|
|
+ <el-table-column label="标题" prop="clickedItemName">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 5px">
|
|
|
- <Reading />
|
|
|
+ <Reading/>
|
|
|
</el-icon>
|
|
|
<span>标题</span>
|
|
|
</template>
|
|
|
<template #default="{ row }">
|
|
|
<div class="text-sm text-left">
|
|
|
- <el-tooltip class="box-item" effect="dark" :content="row.clickedItemName" placement="top" :show-after="500">
|
|
|
+ <el-tooltip :content="row.clickedItemName" :show-after="500" class="box-item" effect="dark"
|
|
|
+ placement="top">
|
|
|
<div class="tooltip-text">
|
|
|
{{ row.clickedItemName }}
|
|
|
</div>
|
|
@@ -412,10 +413,10 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="clickShareRank" label="点击分享率排名" align="center" width="150">
|
|
|
+ <el-table-column align="center" label="点击分享率排名" prop="clickShareRank" width="150">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 4px">
|
|
|
- <Medal />
|
|
|
+ <Medal/>
|
|
|
</el-icon>
|
|
|
<span>点击分享率排名</span>
|
|
|
</template>
|
|
@@ -425,10 +426,10 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
</el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="clickShare" align="center" label="点击分享率">
|
|
|
+ <el-table-column align="center" label="点击分享率" prop="clickShare">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 4px">
|
|
|
- <Pointer />
|
|
|
+ <Pointer/>
|
|
|
</el-icon>
|
|
|
<span>点击分享率</span>
|
|
|
</template>
|
|
@@ -436,10 +437,10 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
<span class="font-semibold">{{ row.clickShare }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="conversionShare" align="center" label="转化分享率">
|
|
|
+ <el-table-column align="center" label="转化分享率" prop="conversionShare">
|
|
|
<template #header>
|
|
|
<el-icon style="top: 2px; margin-right: 5px">
|
|
|
- <Switch />
|
|
|
+ <Switch/>
|
|
|
</el-icon>
|
|
|
<span>转化分享率</span>
|
|
|
</template>
|
|
@@ -451,12 +452,12 @@ function arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
|
</div>
|
|
|
<div class="mt-3.5 flex justify-end">
|
|
|
<el-pagination
|
|
|
- v-model:current-page="currentPage"
|
|
|
- v-model:page-size="pageSize"
|
|
|
- :page-sizes="[21, 42, 72, 102, 132, 162]"
|
|
|
- layout="sizes, prev, pager, next, total"
|
|
|
- :total="total"
|
|
|
- @change="handlePageChange" />
|
|
|
+ v-model:current-page="currentPage"
|
|
|
+ v-model:page-size="pageSize"
|
|
|
+ :page-sizes="[21, 42, 72, 102, 132, 162]"
|
|
|
+ :total="total"
|
|
|
+ layout="sizes, prev, pager, next, total"
|
|
|
+ @change="handlePageChange"/>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
</el-card>
|