123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- <script lang="ts" setup>
- /**
- * @Name: index.vue
- * @Description: 竞品监控
- * @Author: Cheney
- */
- import { RefreshRight, Search } from '@element-plus/icons-vue';
- import VerticalDivider from '/src/components/VerticalDivider/index.vue';
- import DataTable from './component/DataTable.vue';
- import { useTableHeight } from '/@/utils/useTableHeight';
- import { useResponse } from '/@/utils/useResponse';
- import * as api from './api';
- import { useTemplateRef } from 'vue';
- import { DictionaryStore } from '/@/stores/dictionary';
- const { data: staticData } = DictionaryStore();
- const titleContainer: Ref<HTMLElement | null> = useTemplateRef('titleContainer');
- const queryContainer: Ref<HTMLElement | null> = useTemplateRef('queryContainer');
- const { tableHeight } = useTableHeight(titleContainer, queryContainer);
- const tableRef: Ref<any> = useTemplateRef('table');
- const formInline = reactive<any>({
- country: '',
- brand: '',
- group: '',
- status: '',
- shop: '',
- asin: '',
- scoreNumber: '-',
- commentNumber: '-',
- displayScore: '-'
- });
- provide('query-parameter', formInline);
- const groupOptions: any = ref([]);
- const brandsOptions: any = ref([]);
- const shopsOptions: any = ref([]);
- provide('groupOptions', groupOptions);
- provide('brandsOptions', brandsOptions);
- provide('shopOptions', shopsOptions);
- const statusOptions = [
- { label: '正常', value: 1 },
- { label: '失败', value: 2 },
- { label: '暂停', value: 3 },
- { label: '下架', value: 10 }
- ]
- onBeforeMount(() => {
- fetchGroupOptions();
- fetchBrandsOptions();
- fetchShopsOptions();
- });
- async function fetchGroupOptions() {
- const res = await useResponse(api.getGroupOptions);
- groupOptions.value = res.data;
- }
- async function fetchBrandsOptions() {
- const res = await useResponse(api.getBrandsOptions);
- brandsOptions.value = res.data;
- }
- async function fetchShopsOptions() {
- const res = await useResponse(api.getShopsOptions);
- shopsOptions.value = res.data;
- }
- const btnLoading = ref(false);
- async function handleQuery() {
- btnLoading.value = true;
- await tableRef.value?.fetchList(true);
- btnLoading.value = false;
- }
- function resetParameter() {
- for (const key in formInline) {
- formInline[key] = '';
- }
- handleQuery();
- }
- </script>
- <template>
- <div class="p-5">
- <el-card class="h-full" style="color: rgba(0, 0, 0, 0.88);">
- <div ref="titleContainer" class="text-xl font-semibold pb-5">竞品监控</div>
- <!-- 查询条件 -->
- <div ref="queryContainer" class="flex justify-between">
- <div class="flex flex-1">
- <div class="w-full whitespace-nowrap">
- <el-row :gutter="20" style="margin-bottom: 16px;">
- <el-col :span="4">
- <div class="flex items-center">
- <span class="mr-2">国 家</span>
- <el-select v-model="formInline.country" clearable placeholder="请选择国家">
- <el-option v-for="item in staticData.country_code" :key="item.value" :label="item.label"
- :value="item.value" />
- </el-select>
- </div>
- </el-col>
- <el-col :span="5">
- <div class="flex items-center">
- <span class="mr-2">品 牌</span>
- <el-select v-model="formInline.brand" clearable placeholder="请选择品牌">
- <el-option v-for="item in brandsOptions" :label="item.brand" :value="item.brand" />
- </el-select>
- </div>
- </el-col>
- <el-col :span="5">
- <div class="flex items-center">
- <span class="mr-2">分 组</span>
- <el-select v-model="formInline.group" clearable placeholder="请选择分组">
- <el-option v-for="item in groupOptions" :label="item.tag" :value="item.tag" />
- </el-select>
- </div>
- </el-col>
- <el-col :span="4">
- <div class="flex items-center">
- <span class="mr-2">状 态</span>
- <el-select v-model="formInline.status" clearable placeholder="请选择状态">
- <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
- :value="item.value" />
- </el-select>
- </div>
- </el-col>
- <el-col :span="6" class="flex">
- <div class="flex items-center">
- <span class="mr-2">店 铺</span>
- <el-input v-model="formInline.shop" clearable placeholder="请输入店铺" />
- </div>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="6" class="flex">
- <div class="flex items-center">
- <span class="mr-2">亚马逊显示评分人数</span>
- <el-input-number v-model="formInline.scoreNumber" :min="0" placeholder="请输入">
- </el-input-number>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="flex items-center">
- <span class="mr-2">亚马逊显示评论人数</span>
- <el-input-number v-model="formInline.commentNumber" :min="0" placeholder="请输入">
- </el-input-number>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="flex items-center">
- <span class="mr-2">亚马逊显示评分</span>
- <el-input-number v-model="formInline.displayScore" :min="0" placeholder="请输入">
- </el-input-number>
- </div>
- </el-col>
- <el-col :span="6">
- <div class="flex items-center">
- <span class="mr-2">ASIN</span>
- <el-input v-model="formInline.asin" clearable placeholder="请输入ASIN"></el-input>
- </div>
- </el-col>
- </el-row>
- </div>
- </div>
- <VerticalDivider />
- <div class="flex flex-col items-end">
- <el-button :icon="Search" :loading="btnLoading" class="mb-4" type="primary" @click="handleQuery">
- 查 询
- </el-button>
- <el-button :icon="RefreshRight" color="#ECECF1C9" style="width: 88px; color: #3c3c3c;"
- @click="resetParameter">
- 重 置
- </el-button>
- </div>
- </div>
- <el-divider ref="dividerContainer" style="margin: 20px 0 12px 0;" />
- <div :style="{ height: tableHeight + 'px' }">
- <DataTable ref="table" />
- </div>
- </el-card>
- </div>
- </template>
- <style scoped>
- </style>
|