|
|
@@ -4,23 +4,44 @@
|
|
|
<a-card class="general-card" :title="$t('menu.pdd.list')">
|
|
|
<a-row>
|
|
|
<a-col :flex="1">
|
|
|
- <a-form :model="formModel" :label-col-props="{ span: 6 }" :wrapper-col-props="{ span: 18 }"
|
|
|
- label-align="left">
|
|
|
+ <a-form
|
|
|
+ :model="formModel"
|
|
|
+ :label-col-props="{ span: 6 }"
|
|
|
+ :wrapper-col-props="{ span: 18 }"
|
|
|
+ label-align="left"
|
|
|
+ >
|
|
|
<a-row :gutter="16">
|
|
|
<a-col :span="8">
|
|
|
<a-form-item field="name" label="账号名">
|
|
|
- <a-input v-model="formModel.name" placeholder="输入关键词搜索" />
|
|
|
+ <a-input
|
|
|
+ v-model="formModel.name"
|
|
|
+ placeholder="输入关键词搜索"
|
|
|
+ />
|
|
|
</a-form-item>
|
|
|
</a-col>
|
|
|
<a-col :span="8">
|
|
|
- <a-form-item field="lastTime" :label="$t('searchTable.form.lastTime')">
|
|
|
- <a-range-picker v-model="formModel.lastTime" style="width: 100%" />
|
|
|
+ <a-form-item
|
|
|
+ field="lastTime"
|
|
|
+ :label="$t('searchTable.form.lastTime')"
|
|
|
+ >
|
|
|
+ <a-range-picker
|
|
|
+ v-model="formModel.lastTime"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
</a-form-item>
|
|
|
</a-col>
|
|
|
<a-col :span="8">
|
|
|
- <a-form-item field="status" :label="$t('searchTable.form.status')">
|
|
|
- <a-select v-model="formModel.status" :options="statusOptions" :placeholder="$t('searchTable.form.selectDefault')
|
|
|
- " />
|
|
|
+ <a-form-item
|
|
|
+ field="status"
|
|
|
+ :label="$t('searchTable.form.status')"
|
|
|
+ >
|
|
|
+ <a-select
|
|
|
+ v-model="formModel.status"
|
|
|
+ :options="statusOptions"
|
|
|
+ :placeholder="
|
|
|
+ $t('searchTable.form.selectDefault')
|
|
|
+ "
|
|
|
+ />
|
|
|
</a-form-item>
|
|
|
</a-col>
|
|
|
</a-row>
|
|
|
@@ -48,57 +69,89 @@
|
|
|
</template>
|
|
|
{{ $t('searchTable.operation.create') }}
|
|
|
</a-button>
|
|
|
- <a-button type="outline" @click="handleRechargeAllOnlineAccountUsage">
|
|
|
+ <a-button
|
|
|
+ type="outline"
|
|
|
+ @click="handleRechargeAllOnlineAccountUsage"
|
|
|
+ >
|
|
|
重置账号当日分配权重
|
|
|
</a-button>
|
|
|
<a-button
|
|
|
type="primary"
|
|
|
status="warning"
|
|
|
:disabled="selectedRows.length === 0"
|
|
|
- @click="handleBatchUpdateBalance">
|
|
|
+ @click="handleBatchUpdateBalance"
|
|
|
+ >
|
|
|
批量更新余额 ({{ selectedRows.length }})
|
|
|
</a-button>
|
|
|
</a-space>
|
|
|
</a-col>
|
|
|
- <a-col :span="12" style="
|
|
|
+ <a-col
|
|
|
+ :span="12"
|
|
|
+ style="
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: end;
|
|
|
- ">
|
|
|
+ "
|
|
|
+ >
|
|
|
<a-tooltip :content="$t('searchTable.actions.refresh')">
|
|
|
- <div class="action-icon" @click="search"><icon-refresh size="18" /></div>
|
|
|
+ <div class="action-icon" @click="search"
|
|
|
+ ><icon-refresh size="18"
|
|
|
+ /></div>
|
|
|
</a-tooltip>
|
|
|
<a-dropdown @select="handleSelectDensity">
|
|
|
<a-tooltip :content="$t('searchTable.actions.density')">
|
|
|
- <div class="action-icon"><icon-line-height size="18" /></div>
|
|
|
+ <div class="action-icon"
|
|
|
+ ><icon-line-height size="18"
|
|
|
+ /></div>
|
|
|
</a-tooltip>
|
|
|
<template #content>
|
|
|
- <a-doption v-for="item in densityList" :key="item.value" :value="item.value"
|
|
|
- :class="{ active: item.value === size }">
|
|
|
+ <a-doption
|
|
|
+ v-for="item in densityList"
|
|
|
+ :key="item.value"
|
|
|
+ :value="item.value"
|
|
|
+ :class="{ active: item.value === size }"
|
|
|
+ >
|
|
|
<span>{{ item.name }}</span>
|
|
|
</a-doption>
|
|
|
</template>
|
|
|
</a-dropdown>
|
|
|
- <a-tooltip :content="$t('searchTable.actions.columnSetting')">
|
|
|
- <a-popover trigger="click" position="bl" @popup-visible-change="popupVisibleChange">
|
|
|
- <div class="action-icon"><icon-settings size="18" /></div>
|
|
|
+ <a-tooltip
|
|
|
+ :content="$t('searchTable.actions.columnSetting')"
|
|
|
+ >
|
|
|
+ <a-popover
|
|
|
+ trigger="click"
|
|
|
+ position="bl"
|
|
|
+ @popup-visible-change="popupVisibleChange"
|
|
|
+ >
|
|
|
+ <div class="action-icon"
|
|
|
+ ><icon-settings size="18"
|
|
|
+ /></div>
|
|
|
<template #content>
|
|
|
<div id="tableSetting">
|
|
|
- <div v-for="(item, index) in showColumns" :key="item.dataIndex" class="setting">
|
|
|
- <div style="
|
|
|
+ <div
|
|
|
+ v-for="(item, index) in showColumns"
|
|
|
+ :key="item.dataIndex"
|
|
|
+ class="setting"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ style="
|
|
|
margin-right: 4px;
|
|
|
cursor: move;
|
|
|
- ">
|
|
|
+ "
|
|
|
+ >
|
|
|
<icon-drag-arrow />
|
|
|
</div>
|
|
|
<div>
|
|
|
- <a-checkbox v-model="item.checked" @change="
|
|
|
- handleChange(
|
|
|
- $event,
|
|
|
- item as TableColumnData,
|
|
|
- index
|
|
|
- )
|
|
|
- ">
|
|
|
+ <a-checkbox
|
|
|
+ v-model="item.checked"
|
|
|
+ @change="
|
|
|
+ handleChange(
|
|
|
+ $event,
|
|
|
+ item as TableColumnData,
|
|
|
+ index
|
|
|
+ )
|
|
|
+ "
|
|
|
+ >
|
|
|
</a-checkbox>
|
|
|
</div>
|
|
|
<div class="title">
|
|
|
@@ -116,15 +169,25 @@
|
|
|
</a-col>
|
|
|
</a-row>
|
|
|
|
|
|
- <a-table row-key="id" :loading="loading" :pagination="pagination" :summary="true" summary-text="汇总"
|
|
|
- :columns="(cloneColumns as TableColumnData[])" :data="renderData" :bordered="{ headerCell: true }"
|
|
|
- :row-class="getRowClass" :size="size"
|
|
|
+ <a-table
|
|
|
+ row-key="id"
|
|
|
+ :loading="loading"
|
|
|
+ :pagination="pagination"
|
|
|
+ :summary="true"
|
|
|
+ summary-text="汇总"
|
|
|
+ :columns="(cloneColumns as TableColumnData[])"
|
|
|
+ :data="renderData"
|
|
|
+ :bordered="{ headerCell: true }"
|
|
|
+ :row-class="getRowClass"
|
|
|
+ :size="size"
|
|
|
v-model:selectedKeys="selectedRowKeys"
|
|
|
:row-selection="{
|
|
|
type: 'checkbox',
|
|
|
- showCheckedAll: true
|
|
|
+ showCheckedAll: true,
|
|
|
}"
|
|
|
- @page-change="onPageChange" @page-size-change="onPageSizeChange">
|
|
|
+ @page-change="onPageChange"
|
|
|
+ @page-size-change="onPageSizeChange"
|
|
|
+ >
|
|
|
<template #index="{ record }">
|
|
|
{{ record.id }}
|
|
|
</template>
|
|
|
@@ -132,8 +195,14 @@
|
|
|
<a-list-item-meta>
|
|
|
<template #title>
|
|
|
{{ record.company }}
|
|
|
- <a-tag color="blue" v-if="record.work_mode == 1">网站推广</a-tag>
|
|
|
- <a-tag color="orange" v-else-if="record.work_mode == 2">媒体导购</a-tag>
|
|
|
+ <a-tag color="blue" v-if="record.work_mode == 1"
|
|
|
+ >网站推广</a-tag
|
|
|
+ >
|
|
|
+ <a-tag
|
|
|
+ color="orange"
|
|
|
+ v-else-if="record.work_mode == 2"
|
|
|
+ >媒体导购</a-tag
|
|
|
+ >
|
|
|
<a-tag color="purple" v-else>爬虫</a-tag>
|
|
|
</template>
|
|
|
<template #description>
|
|
|
@@ -142,29 +211,71 @@
|
|
|
</a-list-item-meta>
|
|
|
</template>
|
|
|
<template #nodeName="{ record }">
|
|
|
- <a-tag color="gray">{{ record.end_point }} - {{ record.nodeName }} </a-tag>
|
|
|
+ <div>
|
|
|
+ <a-tag
|
|
|
+ :color="
|
|
|
+ record.proxyStatus === true ? 'green' : 'gray'
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <template v-if="record.proxyStatus === true" #icon>
|
|
|
+ <icon-check />
|
|
|
+ </template>
|
|
|
+ <template
|
|
|
+ v-else-if="record.proxyStatus === false"
|
|
|
+ #icon
|
|
|
+ >
|
|
|
+ <icon-stop />
|
|
|
+ </template>
|
|
|
+ {{ record.end_point }} - {{ record.nodeName }}
|
|
|
+ </a-tag>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<template #tags="{ record }">
|
|
|
- <a-tag v-if="record.parse_type" size="small" bordered color="blue">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.parse_type"
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color="blue"
|
|
|
+ >
|
|
|
{{ record.parse_type }}
|
|
|
</a-tag>
|
|
|
|
|
|
- <a-tag v-if="record.riskStrategy" size="small" bordered color="orange">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.riskStrategy"
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color="orange"
|
|
|
+ >
|
|
|
{{ record.riskStrategy }}-{{ record.launchScene }}
|
|
|
</a-tag>
|
|
|
- <a-tag v-if="record.riskCookie" size="small" bordered color="red">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.riskCookie"
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color="red"
|
|
|
+ >
|
|
|
{{ record.riskCookie }}
|
|
|
</a-tag>
|
|
|
</template>
|
|
|
<template #status="{ record }">
|
|
|
- <a-tag v-if="record.status" bordered color="green" @click="changeStatus(record.id, false)">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.status"
|
|
|
+ bordered
|
|
|
+ color="green"
|
|
|
+ @click="changeStatus(record.id, false)"
|
|
|
+ >
|
|
|
<template #icon>
|
|
|
<icon-check />
|
|
|
</template>
|
|
|
在线
|
|
|
</a-tag>
|
|
|
- <a-tag v-else bordered color="" @click="changeStatus(record.id, true)">
|
|
|
+ <a-tag
|
|
|
+ v-else
|
|
|
+ bordered
|
|
|
+ color=""
|
|
|
+ @click="changeStatus(record.id, true)"
|
|
|
+ >
|
|
|
<template #icon>
|
|
|
<icon-stop />
|
|
|
</template>
|
|
|
@@ -177,95 +288,201 @@
|
|
|
离线
|
|
|
</a-tag>
|
|
|
<template v-else>
|
|
|
- <a-tag v-if="record.cookie_status" bordered color="blue"
|
|
|
- @click="changeAttr(record.id, 'cookie_status', true)">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.cookie_status"
|
|
|
+ bordered
|
|
|
+ color="blue"
|
|
|
+ @click="
|
|
|
+ changeAttr(record.id, 'cookie_status', true)
|
|
|
+ "
|
|
|
+ >
|
|
|
正常
|
|
|
</a-tag>
|
|
|
- <a-tag v-else bordered color="" @click="changeAttr(record.id, 'cookie_status', true)">
|
|
|
+ <a-tag
|
|
|
+ v-else
|
|
|
+ bordered
|
|
|
+ color=""
|
|
|
+ @click="
|
|
|
+ changeAttr(record.id, 'cookie_status', true)
|
|
|
+ "
|
|
|
+ >
|
|
|
离线
|
|
|
</a-tag>
|
|
|
</template>
|
|
|
</template>
|
|
|
<template #actions="{ record }">
|
|
|
- <a-tag v-if="record.enable_parse" size="small" bordered color="red"
|
|
|
- @click="changeAttr(record.id, 'enable_parse', false)">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.enable_parse"
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color="red"
|
|
|
+ @click="changeAttr(record.id, 'enable_parse', false)"
|
|
|
+ >
|
|
|
转链
|
|
|
</a-tag>
|
|
|
- <a-tag v-else size="small" bordered color="" @click="changeAttr(record.id, 'enable_parse', true)">
|
|
|
+ <a-tag
|
|
|
+ v-else
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color=""
|
|
|
+ @click="changeAttr(record.id, 'enable_parse', true)"
|
|
|
+ >
|
|
|
转链
|
|
|
</a-tag>
|
|
|
- <span style="margin: 5px;">
|
|
|
- <a-tag v-if="record.enable_coupon" size="small" bordered color="orange"
|
|
|
- @click="changeAttr(record.id, 'enable_coupon', false)">
|
|
|
+ <span style="margin: 5px">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.enable_coupon"
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color="orange"
|
|
|
+ @click="
|
|
|
+ changeAttr(record.id, 'enable_coupon', false)
|
|
|
+ "
|
|
|
+ >
|
|
|
优惠券
|
|
|
</a-tag>
|
|
|
- <a-tag v-else size="small" bordered color=""
|
|
|
- @click="changeAttr(record.id, 'enable_coupon', true)">
|
|
|
+ <a-tag
|
|
|
+ v-else
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color=""
|
|
|
+ @click="
|
|
|
+ changeAttr(record.id, 'enable_coupon', true)
|
|
|
+ "
|
|
|
+ >
|
|
|
优惠券
|
|
|
</a-tag>
|
|
|
</span>
|
|
|
- <span style="margin: 5px;">
|
|
|
- <a-tag v-if="record.enable_sync_revenue" size="small" bordered color="blue"
|
|
|
- @click="changeAttr(record.id, 'enable_sync_revenue', false)">
|
|
|
+ <span style="margin: 5px">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.enable_sync_revenue"
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color="blue"
|
|
|
+ @click="
|
|
|
+ changeAttr(
|
|
|
+ record.id,
|
|
|
+ 'enable_sync_revenue',
|
|
|
+ false
|
|
|
+ )
|
|
|
+ "
|
|
|
+ >
|
|
|
同步收益
|
|
|
</a-tag>
|
|
|
- <a-tag v-else size="small" bordered color=""
|
|
|
- @click="changeAttr(record.id, 'enable_sync_revenue', true)">
|
|
|
+ <a-tag
|
|
|
+ v-else
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color=""
|
|
|
+ @click="
|
|
|
+ changeAttr(
|
|
|
+ record.id,
|
|
|
+ 'enable_sync_revenue',
|
|
|
+ true
|
|
|
+ )
|
|
|
+ "
|
|
|
+ >
|
|
|
同步收益
|
|
|
</a-tag>
|
|
|
</span>
|
|
|
- <span style="margin: 5px;">
|
|
|
- <a-tag v-if="record.enable_sync_order" size="small" bordered color="blue"
|
|
|
- @click="changeAttr(record.id, 'enable_sync_order', false)">
|
|
|
+ <span style="margin: 5px">
|
|
|
+ <a-tag
|
|
|
+ v-if="record.enable_sync_order"
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color="blue"
|
|
|
+ @click="
|
|
|
+ changeAttr(
|
|
|
+ record.id,
|
|
|
+ 'enable_sync_order',
|
|
|
+ false
|
|
|
+ )
|
|
|
+ "
|
|
|
+ >
|
|
|
同步订单
|
|
|
</a-tag>
|
|
|
- <a-tag v-else size="small" bordered color=""
|
|
|
- @click="changeAttr(record.id, 'enable_sync_order', true)">
|
|
|
+ <a-tag
|
|
|
+ v-else
|
|
|
+ size="small"
|
|
|
+ bordered
|
|
|
+ color=""
|
|
|
+ @click="
|
|
|
+ changeAttr(record.id, 'enable_sync_order', true)
|
|
|
+ "
|
|
|
+ >
|
|
|
同步订单
|
|
|
</a-tag>
|
|
|
</span>
|
|
|
</template>
|
|
|
<template #time="{ record }">
|
|
|
- <div style="color:gray;">
|
|
|
- <div>注册:{{ dayjs(record.create_time).format('MM-DD HH:mm') }}</div>
|
|
|
- <div>更新:{{ dayjs(record.last_time).format('MM-DD HH:mm') }}</div>
|
|
|
- <div v-if="dayjs().diff(dayjs(record.login_time), 'hours') < 48">
|
|
|
- 登录:{{ dayjs(record.login_time).format('MM-DD HH:mm') }}</div>
|
|
|
+ <div style="color: gray">
|
|
|
+ <div
|
|
|
+ >注册:{{
|
|
|
+ dayjs(record.create_time).format('MM-DD HH:mm')
|
|
|
+ }}</div
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ >更新:{{
|
|
|
+ dayjs(record.last_time).format('MM-DD HH:mm')
|
|
|
+ }}</div
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ v-if="
|
|
|
+ dayjs().diff(
|
|
|
+ dayjs(record.login_time),
|
|
|
+ 'hours'
|
|
|
+ ) < 48
|
|
|
+ "
|
|
|
+ >
|
|
|
+ 登录:{{
|
|
|
+ dayjs(record.login_time).format('MM-DD HH:mm')
|
|
|
+ }}</div
|
|
|
+ >
|
|
|
</div>
|
|
|
</template>
|
|
|
<template #action="{ record }">
|
|
|
- <a-button type="text" size="small" @click="openCookieModal(record)">
|
|
|
+ <a-button
|
|
|
+ type="text"
|
|
|
+ size="small"
|
|
|
+ @click="openCookieModal(record)"
|
|
|
+ >
|
|
|
更新cookie
|
|
|
</a-button>
|
|
|
</template>
|
|
|
<template #summary-cell="{ column, record }">
|
|
|
- <div style="margin:10px auto" v-if="column.slotName == 'hourly_calls_limit'">
|
|
|
+ <div
|
|
|
+ style="margin: 10px auto"
|
|
|
+ v-if="column.slotName == 'hourly_calls_limit'"
|
|
|
+ >
|
|
|
{{ numberFormat(record.current_hourly_calls) }}
|
|
|
</div>
|
|
|
- <div style="margin:10px auto" v-if="column.slotName == 'daily_calls_limit'">
|
|
|
+ <div
|
|
|
+ style="margin: 10px auto"
|
|
|
+ v-if="column.slotName == 'daily_calls_limit'"
|
|
|
+ >
|
|
|
{{ numberFormat(record.current_daily_calls) }}
|
|
|
</div>
|
|
|
|
|
|
-
|
|
|
- <template v-if="column.dataIndex == 'today_clickNum' ||
|
|
|
- column.dataIndex == 'today_orderNum' ||
|
|
|
- column.dataIndex == 'today_finishOrderNum' ||
|
|
|
- column.dataIndex == 'today_finishCosPrice'">
|
|
|
-
|
|
|
+ <template
|
|
|
+ v-if="
|
|
|
+ column.dataIndex == 'today_clickNum' ||
|
|
|
+ column.dataIndex == 'today_orderNum' ||
|
|
|
+ column.dataIndex == 'today_finishOrderNum' ||
|
|
|
+ column.dataIndex == 'today_finishCosPrice'
|
|
|
+ "
|
|
|
+ >
|
|
|
<div>{{ numberFormat(record[column.dataIndex]) }}</div>
|
|
|
</template>
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- <template v-if="column.dataIndex == 'today_cosPrice' ||
|
|
|
- column.dataIndex == 'today_finishCosFee' ||
|
|
|
- column.dataIndex == 'today_cosFee'">
|
|
|
-
|
|
|
+ <template
|
|
|
+ v-if="
|
|
|
+ column.dataIndex == 'today_cosPrice' ||
|
|
|
+ column.dataIndex == 'today_finishCosFee' ||
|
|
|
+ column.dataIndex == 'today_cosFee'
|
|
|
+ "
|
|
|
+ >
|
|
|
<div>{{ amountFormat(record[column.dataIndex]) }}</div>
|
|
|
</template>
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
</template>
|
|
|
<template #time_range="{ record }">
|
|
|
<WorkHourModel :record="record" @change="search" />
|
|
|
@@ -276,31 +493,58 @@
|
|
|
</a-tag>
|
|
|
</template>
|
|
|
<template #hourly_calls_limit="{ record }">
|
|
|
- <a-tag bordered
|
|
|
- :color="record.current_hourly_calls > record.hourly_calls_limit && record.hourly_calls_limit > 0 ? 'red' : ''">
|
|
|
+ <a-tag
|
|
|
+ bordered
|
|
|
+ :color="
|
|
|
+ record.current_hourly_calls >
|
|
|
+ record.hourly_calls_limit &&
|
|
|
+ record.hourly_calls_limit > 0
|
|
|
+ ? 'red'
|
|
|
+ : ''
|
|
|
+ "
|
|
|
+ >
|
|
|
{{ record.current_hourly_calls }} /
|
|
|
{{ record.hourly_calls_limit }}
|
|
|
</a-tag>
|
|
|
</template>
|
|
|
|
|
|
<template #daily_calls_limit="{ record }">
|
|
|
- <a-tag bordered
|
|
|
- :color="record.current_daily_calls > record.daily_calls_limit && record.daily_calls_limit > 0 ? 'red' : ''">
|
|
|
+ <a-tag
|
|
|
+ bordered
|
|
|
+ :color="
|
|
|
+ record.current_daily_calls >
|
|
|
+ record.daily_calls_limit &&
|
|
|
+ record.daily_calls_limit > 0
|
|
|
+ ? 'red'
|
|
|
+ : ''
|
|
|
+ "
|
|
|
+ >
|
|
|
{{ record.current_daily_calls }} /
|
|
|
{{ record.daily_calls_limit }}
|
|
|
</a-tag>
|
|
|
</template>
|
|
|
-
|
|
|
</a-table>
|
|
|
</a-card>
|
|
|
|
|
|
<!-- Cookie 更新 Modal -->
|
|
|
- <a-modal v-model:visible="cookieModalVisible" title="更新Cookie" @ok="handleCookieUpdate"
|
|
|
- @cancel="handleCookieCancel" :confirm-loading="cookieLoading">
|
|
|
+ <a-modal
|
|
|
+ v-model:visible="cookieModalVisible"
|
|
|
+ title="更新Cookie"
|
|
|
+ @ok="handleCookieUpdate"
|
|
|
+ @cancel="handleCookieCancel"
|
|
|
+ :confirm-loading="cookieLoading"
|
|
|
+ >
|
|
|
<a-form ref="cookieFormRef" :model="cookieFormData">
|
|
|
- <a-form-item field="cookie" label="Cookie" :rules="[{ required: true, message: '请输入Cookie' }]">
|
|
|
- <a-textarea v-model="cookieFormData.cookie" placeholder="请粘贴Cookie内容"
|
|
|
- :auto-size="{ minRows: 10, maxRows: 20 }" />
|
|
|
+ <a-form-item
|
|
|
+ field="cookie"
|
|
|
+ label="Cookie"
|
|
|
+ :rules="[{ required: true, message: '请输入Cookie' }]"
|
|
|
+ >
|
|
|
+ <a-textarea
|
|
|
+ v-model="cookieFormData.cookie"
|
|
|
+ placeholder="请粘贴Cookie内容"
|
|
|
+ :auto-size="{ minRows: 10, maxRows: 20 }"
|
|
|
+ />
|
|
|
</a-form-item>
|
|
|
</a-form>
|
|
|
</a-modal>
|
|
|
@@ -308,601 +552,629 @@
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
-import { useRouter, useRoute } from 'vue-router';
|
|
|
-import { computed, ref, reactive, watch, nextTick } from 'vue';
|
|
|
-import { useI18n } from 'vue-i18n';
|
|
|
-import dayjs from 'dayjs';
|
|
|
-import useLoading from '@/hooks/loading';
|
|
|
-import { queryPddPool, PddPoolRecord, PddPoolParams, PddUpdateAccountModel, PddUpdateAccount, UpdateCookieWithIdModel, updateCookiesWithId, rechargeAllOnlineAccountUsage } from '@/api/pdd';
|
|
|
-import { Pagination } from '@/types/global';
|
|
|
-import { Modal, Message } from '@arco-design/web-vue';
|
|
|
-import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface';
|
|
|
-import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
|
|
|
-import { FormInstance } from '@arco-design/web-vue/es/form';
|
|
|
-import cloneDeep from 'lodash/cloneDeep';
|
|
|
-import Sortable from 'sortablejs';
|
|
|
-import { numberFormat, amountFormat } from '@/utils/util';
|
|
|
-import WorkHourModel from './components/WorkHourModel.vue';
|
|
|
-
|
|
|
-type SizeProps = 'mini' | 'small' | 'medium' | 'large';
|
|
|
-type Column = TableColumnData & { checked?: true };
|
|
|
-
|
|
|
-const generateFormModel = () => {
|
|
|
- return {
|
|
|
- name: '',
|
|
|
- lastTime: [],
|
|
|
- status: '',
|
|
|
- show_hide: false,
|
|
|
- sort: 'status',
|
|
|
- order: 'descending',
|
|
|
+ import { useRouter, useRoute } from 'vue-router';
|
|
|
+ import { computed, ref, reactive, watch, nextTick } from 'vue';
|
|
|
+ import { useI18n } from 'vue-i18n';
|
|
|
+ import dayjs from 'dayjs';
|
|
|
+ import useLoading from '@/hooks/loading';
|
|
|
+ import {
|
|
|
+ queryPddPool,
|
|
|
+ PddPoolRecord,
|
|
|
+ PddPoolParams,
|
|
|
+ PddUpdateAccountModel,
|
|
|
+ PddUpdateAccount,
|
|
|
+ UpdateCookieWithIdModel,
|
|
|
+ updateCookiesWithId,
|
|
|
+ rechargeAllOnlineAccountUsage,
|
|
|
+ } from '@/api/pdd';
|
|
|
+ import { Pagination } from '@/types/global';
|
|
|
+ import { Modal, Message } from '@arco-design/web-vue';
|
|
|
+ import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface';
|
|
|
+ import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
|
|
|
+ import { FormInstance } from '@arco-design/web-vue/es/form';
|
|
|
+ import cloneDeep from 'lodash/cloneDeep';
|
|
|
+ import Sortable from 'sortablejs';
|
|
|
+ import { numberFormat, amountFormat } from '@/utils/util';
|
|
|
+ import WorkHourModel from './components/WorkHourModel.vue';
|
|
|
+
|
|
|
+ type SizeProps = 'mini' | 'small' | 'medium' | 'large';
|
|
|
+ type Column = TableColumnData & { checked?: true };
|
|
|
+
|
|
|
+ const generateFormModel = () => {
|
|
|
+ return {
|
|
|
+ name: '',
|
|
|
+ lastTime: [],
|
|
|
+ status: '',
|
|
|
+ show_hide: false,
|
|
|
+ sort: 'status',
|
|
|
+ order: 'descending',
|
|
|
+ };
|
|
|
};
|
|
|
-};
|
|
|
-const router = useRouter();
|
|
|
-const route = useRoute();
|
|
|
-
|
|
|
-
|
|
|
-const { loading, setLoading } = useLoading(true);
|
|
|
-const { t } = useI18n();
|
|
|
-const renderData = ref<PddPoolRecord[]>([]);
|
|
|
-const formModel = ref(generateFormModel());
|
|
|
-const cloneColumns = ref<Column[]>([]);
|
|
|
-const showColumns = ref<Column[]>([]);
|
|
|
-
|
|
|
-const size = ref<SizeProps>('small');
|
|
|
-
|
|
|
-// Cookie modal related data
|
|
|
-const cookieModalVisible = ref(false);
|
|
|
-const cookieLoading = ref(false);
|
|
|
-const cookieFormRef = ref<FormInstance>();
|
|
|
-const cookieFormData = ref<UpdateCookieWithIdModel>({
|
|
|
- id: 0,
|
|
|
- cookie: '',
|
|
|
-});
|
|
|
-const currentRecord = ref<PddPoolRecord | null>(null);
|
|
|
-
|
|
|
-// 行选择相关
|
|
|
-const selectedRowKeys = ref<(string | number)[]>([]);
|
|
|
-const selectedRows = ref<PddPoolRecord[]>([]);
|
|
|
-
|
|
|
-// 监听选中的行keys变化,同步更新选中的行数据
|
|
|
-watch(selectedRowKeys, (newKeys) => {
|
|
|
- selectedRows.value = renderData.value.filter(item => newKeys.includes(item.id));
|
|
|
-});
|
|
|
-
|
|
|
-const basePagination: Pagination = {
|
|
|
- current: 1,
|
|
|
- pageSize: 50,
|
|
|
- showPageSize: true,
|
|
|
- showTotal: true,
|
|
|
- pageSizeOptions: [10, 20, 50, 100, 200, 500]
|
|
|
-
|
|
|
-};
|
|
|
-const pagination = reactive({
|
|
|
- ...basePagination,
|
|
|
-});
|
|
|
-const densityList = computed(() => [
|
|
|
- {
|
|
|
- name: t('searchTable.size.mini'),
|
|
|
- value: 'mini',
|
|
|
- },
|
|
|
- {
|
|
|
- name: t('searchTable.size.small'),
|
|
|
- value: 'small',
|
|
|
- },
|
|
|
- {
|
|
|
- name: t('searchTable.size.medium'),
|
|
|
- value: 'medium',
|
|
|
- },
|
|
|
- {
|
|
|
- name: t('searchTable.size.large'),
|
|
|
- value: 'large',
|
|
|
- },
|
|
|
-]);
|
|
|
-
|
|
|
-const columns = computed<TableColumnData[]>(() => [
|
|
|
- {
|
|
|
- title: '#',
|
|
|
- dataIndex: 'index',
|
|
|
- slotName: 'index',
|
|
|
- width: 60,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '账号名',
|
|
|
- dataIndex: 'name',
|
|
|
- slotName: 'name',
|
|
|
- width: 250,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '',
|
|
|
- slotName: 'tags',
|
|
|
- width: 60,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '工作时间',
|
|
|
- dataIndex: 'time_range',
|
|
|
- slotName: 'time_range',
|
|
|
- align: 'right',
|
|
|
- width: 200,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '账户余额',
|
|
|
- dataIndex: 'draw_balance',
|
|
|
- slotName: 'draw_balance',
|
|
|
- align: 'right',
|
|
|
- width: 120,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '小时调用',
|
|
|
- slotName: 'hourly_calls_limit',
|
|
|
- dataIndex: 'current_hourly_calls',
|
|
|
- align: 'right',
|
|
|
- width: 120,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '当日调用',
|
|
|
- slotName: 'daily_calls_limit',
|
|
|
- dataIndex: 'current_daily_calls',
|
|
|
- align: 'right',
|
|
|
- width: 150,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '运行节点',
|
|
|
- slotName: 'nodeName',
|
|
|
- width: 120,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '状态',
|
|
|
- slotName: 'status',
|
|
|
- width: 100,
|
|
|
- },
|
|
|
- {
|
|
|
- title: 'Cookie状态',
|
|
|
- slotName: 'cookie_status',
|
|
|
- align: 'center',
|
|
|
- width: 100,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '分类',
|
|
|
- slotName: 'actions',
|
|
|
- width: 200,
|
|
|
- align: 'center',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '时间',
|
|
|
- slotName: 'time',
|
|
|
- width: 170,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '操作',
|
|
|
- slotName: 'action',
|
|
|
- width: 120,
|
|
|
- },
|
|
|
-]);
|
|
|
-
|
|
|
-const statusOptions = computed<SelectOptionData[]>(() => [
|
|
|
- {
|
|
|
- label: '全部',
|
|
|
- value: '',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '在线',
|
|
|
- value: 'online',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '下线',
|
|
|
- value: 'offline',
|
|
|
- },
|
|
|
-]);
|
|
|
-
|
|
|
-const getRowClass = (record: PddPoolRecord) => {
|
|
|
- return record.is_hide ? 'special-table-row' : '';
|
|
|
-};
|
|
|
-
|
|
|
-if (route.query.show_hide === '1') {
|
|
|
- formModel.value.show_hide = true;
|
|
|
-}
|
|
|
-
|
|
|
-const fetchData = async (
|
|
|
- params: PddPoolParams = {
|
|
|
+ const router = useRouter();
|
|
|
+ const route = useRoute();
|
|
|
+
|
|
|
+ const { loading, setLoading } = useLoading(true);
|
|
|
+ const { t } = useI18n();
|
|
|
+ const renderData = ref<PddPoolRecord[]>([]);
|
|
|
+ const formModel = ref(generateFormModel());
|
|
|
+ const cloneColumns = ref<Column[]>([]);
|
|
|
+ const showColumns = ref<Column[]>([]);
|
|
|
+
|
|
|
+ const size = ref<SizeProps>('small');
|
|
|
+
|
|
|
+ // Cookie modal related data
|
|
|
+ const cookieModalVisible = ref(false);
|
|
|
+ const cookieLoading = ref(false);
|
|
|
+ const cookieFormRef = ref<FormInstance>();
|
|
|
+ const cookieFormData = ref<UpdateCookieWithIdModel>({
|
|
|
+ id: 0,
|
|
|
+ cookie: '',
|
|
|
+ });
|
|
|
+ const currentRecord = ref<PddPoolRecord | null>(null);
|
|
|
+
|
|
|
+ // 行选择相关
|
|
|
+ const selectedRowKeys = ref<(string | number)[]>([]);
|
|
|
+ const selectedRows = ref<PddPoolRecord[]>([]);
|
|
|
+
|
|
|
+ // 监听选中的行keys变化,同步更新选中的行数据
|
|
|
+ watch(selectedRowKeys, (newKeys) => {
|
|
|
+ selectedRows.value = renderData.value.filter((item) =>
|
|
|
+ newKeys.includes(item.id)
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ const basePagination: Pagination = {
|
|
|
current: 1,
|
|
|
pageSize: 50,
|
|
|
- show_hide: false,
|
|
|
- sort: 'status',
|
|
|
- order: 'descending',
|
|
|
- getTotal: true,
|
|
|
- }
|
|
|
-) => {
|
|
|
+ showPageSize: true,
|
|
|
+ showTotal: true,
|
|
|
+ pageSizeOptions: [10, 20, 50, 100, 200, 500],
|
|
|
+ };
|
|
|
+ const pagination = reactive({
|
|
|
+ ...basePagination,
|
|
|
+ });
|
|
|
+ const densityList = computed(() => [
|
|
|
+ {
|
|
|
+ name: t('searchTable.size.mini'),
|
|
|
+ value: 'mini',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: t('searchTable.size.small'),
|
|
|
+ value: 'small',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: t('searchTable.size.medium'),
|
|
|
+ value: 'medium',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: t('searchTable.size.large'),
|
|
|
+ value: 'large',
|
|
|
+ },
|
|
|
+ ]);
|
|
|
+
|
|
|
+ const columns = computed<TableColumnData[]>(() => [
|
|
|
+ {
|
|
|
+ title: '#',
|
|
|
+ dataIndex: 'index',
|
|
|
+ slotName: 'index',
|
|
|
+ width: 60,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '账号名',
|
|
|
+ dataIndex: 'name',
|
|
|
+ slotName: 'name',
|
|
|
+ width: 250,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '',
|
|
|
+ slotName: 'tags',
|
|
|
+ width: 60,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '工作时间',
|
|
|
+ dataIndex: 'time_range',
|
|
|
+ slotName: 'time_range',
|
|
|
+ align: 'right',
|
|
|
+ width: 200,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '账户余额',
|
|
|
+ dataIndex: 'draw_balance',
|
|
|
+ slotName: 'draw_balance',
|
|
|
+ align: 'right',
|
|
|
+ width: 120,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '小时调用',
|
|
|
+ slotName: 'hourly_calls_limit',
|
|
|
+ dataIndex: 'current_hourly_calls',
|
|
|
+ align: 'right',
|
|
|
+ width: 120,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '当日调用',
|
|
|
+ slotName: 'daily_calls_limit',
|
|
|
+ dataIndex: 'current_daily_calls',
|
|
|
+ align: 'right',
|
|
|
+ width: 150,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '运行节点',
|
|
|
+ slotName: 'nodeName',
|
|
|
+ width: 120,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '状态',
|
|
|
+ slotName: 'status',
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: 'Cookie状态',
|
|
|
+ slotName: 'cookie_status',
|
|
|
+ align: 'center',
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '分类',
|
|
|
+ slotName: 'actions',
|
|
|
+ width: 200,
|
|
|
+ align: 'center',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '时间',
|
|
|
+ slotName: 'time',
|
|
|
+ width: 170,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ slotName: 'action',
|
|
|
+ width: 120,
|
|
|
+ },
|
|
|
+ ]);
|
|
|
+
|
|
|
+ const statusOptions = computed<SelectOptionData[]>(() => [
|
|
|
+ {
|
|
|
+ label: '全部',
|
|
|
+ value: '',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '在线',
|
|
|
+ value: 'online',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '下线',
|
|
|
+ value: 'offline',
|
|
|
+ },
|
|
|
+ ]);
|
|
|
+
|
|
|
+ const getRowClass = (record: PddPoolRecord) => {
|
|
|
+ return record.is_hide ? 'special-table-row' : '';
|
|
|
+ };
|
|
|
+
|
|
|
if (route.query.show_hide === '1') {
|
|
|
- params.show_hide = true;
|
|
|
+ formModel.value.show_hide = true;
|
|
|
}
|
|
|
|
|
|
- setLoading(true);
|
|
|
- try {
|
|
|
- const { data } = await queryPddPool(params);
|
|
|
- if (!data) return;
|
|
|
- // const { data } = await queryPddPool(params);
|
|
|
- renderData.value = data.list;
|
|
|
- pagination.current = data.page;
|
|
|
- pagination.total = data.count;
|
|
|
- } catch (err) {
|
|
|
- console.log(err);
|
|
|
- // you can report use errorHandler or other
|
|
|
- } finally {
|
|
|
- setLoading(false);
|
|
|
- }
|
|
|
-};
|
|
|
+ const fetchData = async (
|
|
|
+ params: PddPoolParams = {
|
|
|
+ current: 1,
|
|
|
+ pageSize: 50,
|
|
|
+ show_hide: false,
|
|
|
+ sort: 'status',
|
|
|
+ order: 'descending',
|
|
|
+ getTotal: true,
|
|
|
+ }
|
|
|
+ ) => {
|
|
|
+ if (route.query.show_hide === '1') {
|
|
|
+ params.show_hide = true;
|
|
|
+ }
|
|
|
|
|
|
-const changeItem = async (data: PddPoolRecord) => {
|
|
|
- router.push({ name: 'updateCookies' });
|
|
|
-};
|
|
|
+ setLoading(true);
|
|
|
+ try {
|
|
|
+ const { data } = await queryPddPool(params);
|
|
|
+ if (!data) return;
|
|
|
+ // const { data } = await queryPddPool(params);
|
|
|
+ renderData.value = data.list;
|
|
|
+ pagination.current = data.page;
|
|
|
+ pagination.total = data.count;
|
|
|
+ } catch (err) {
|
|
|
+ console.log(err);
|
|
|
+ // you can report use errorHandler or other
|
|
|
+ } finally {
|
|
|
+ setLoading(false);
|
|
|
+ }
|
|
|
+ };
|
|
|
|
|
|
-const billView = async (data: PddPoolRecord) => {
|
|
|
- router.push({ name: 'taobao_bill_dailys', query: { name: data.company } });
|
|
|
-};
|
|
|
+ const changeItem = async (data: PddPoolRecord) => {
|
|
|
+ router.push({ name: 'updateCookies' });
|
|
|
+ };
|
|
|
|
|
|
+ const billView = async (data: PddPoolRecord) => {
|
|
|
+ router.push({
|
|
|
+ name: 'taobao_bill_dailys',
|
|
|
+ query: { name: data.company },
|
|
|
+ });
|
|
|
+ };
|
|
|
|
|
|
-const changeStatus = async (id: number, val: any) => {
|
|
|
- const args = {
|
|
|
- id,
|
|
|
- name: 'status',
|
|
|
- val
|
|
|
- } as PddUpdateAccountModel;
|
|
|
+ const changeStatus = async (id: number, val: any) => {
|
|
|
+ const args = {
|
|
|
+ id,
|
|
|
+ name: 'status',
|
|
|
+ val,
|
|
|
+ } as PddUpdateAccountModel;
|
|
|
+
|
|
|
+ Modal.confirm({
|
|
|
+ title: '确认提示',
|
|
|
+ content: '确定要更改状态吗?',
|
|
|
+ okText: '确认',
|
|
|
+ cancelText: '取消',
|
|
|
+ async onOk() {
|
|
|
+ setLoading(true);
|
|
|
+
|
|
|
+ try {
|
|
|
+ const { data } = await PddUpdateAccount(args);
|
|
|
+ console.log(data, data.msg);
|
|
|
+ const msg = data.msg || '更新成功!';
|
|
|
+ if (data.success) {
|
|
|
+ Message.success(msg);
|
|
|
+ search();
|
|
|
+ } else {
|
|
|
+ Message.error(data.msg);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ setLoading(false);
|
|
|
+ },
|
|
|
+ });
|
|
|
+ };
|
|
|
|
|
|
+ const changeAttr = async (id: number, name: string, val: any) => {
|
|
|
+ const args = {
|
|
|
+ id,
|
|
|
+ name,
|
|
|
+ val,
|
|
|
+ } as PddUpdateAccountModel;
|
|
|
+
|
|
|
+ Modal.confirm({
|
|
|
+ title: '确认提示',
|
|
|
+ content: '确定要更改状态吗?',
|
|
|
+ okText: '确认',
|
|
|
+ cancelText: '取消',
|
|
|
+ async onOk() {
|
|
|
+ setLoading(true);
|
|
|
+ try {
|
|
|
+ const { data } = await PddUpdateAccount(args);
|
|
|
+ console.log(data, data.msg);
|
|
|
+ const msg = data.msg || '更新成功!';
|
|
|
+ if (data.success) {
|
|
|
+ Message.success(msg);
|
|
|
+ search();
|
|
|
+ } else {
|
|
|
+ Message.error(data.msg);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ setLoading(false);
|
|
|
+ },
|
|
|
+ });
|
|
|
+ };
|
|
|
|
|
|
- Modal.confirm({
|
|
|
- title: '确认提示',
|
|
|
- content: '确定要更改状态吗?',
|
|
|
- okText: '确认',
|
|
|
- cancelText: '取消',
|
|
|
- async onOk() {
|
|
|
- setLoading(true);
|
|
|
+ const search = () => {
|
|
|
+ fetchData({
|
|
|
+ ...basePagination,
|
|
|
+ ...formModel.value,
|
|
|
+ } as unknown as PddPoolParams);
|
|
|
+ };
|
|
|
+ const onPageChange = (current: number) => {
|
|
|
+ fetchData({
|
|
|
+ ...basePagination,
|
|
|
+ ...formModel.value,
|
|
|
+ current,
|
|
|
+ } as unknown as PddPoolParams);
|
|
|
+ };
|
|
|
|
|
|
- try {
|
|
|
- const { data } = await PddUpdateAccount(args);
|
|
|
- console.log(data, data.msg);
|
|
|
- const msg = data.msg || '更新成功!';
|
|
|
- if (data.success) {
|
|
|
- Message.success(msg);
|
|
|
- search();
|
|
|
- } else {
|
|
|
- Message.error(data.msg);
|
|
|
- }
|
|
|
+ const onPageSizeChange = (current: number) => {
|
|
|
+ basePagination.pageSize = current;
|
|
|
+ pagination.pageSize = current;
|
|
|
+ fetchData({
|
|
|
+ ...basePagination,
|
|
|
+ ...formModel.value,
|
|
|
+ current: 1,
|
|
|
+ } as unknown as PddPoolParams);
|
|
|
+ };
|
|
|
|
|
|
- } catch (e) { console.log(e) }
|
|
|
- setLoading(false);
|
|
|
+ fetchData();
|
|
|
+ const reset = () => {
|
|
|
+ formModel.value = generateFormModel();
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleSelectDensity = (
|
|
|
+ val: string | number | Record<string, any> | undefined,
|
|
|
+ e: Event
|
|
|
+ ) => {
|
|
|
+ size.value = val as SizeProps;
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleChange = (
|
|
|
+ checked: boolean | (string | boolean | number)[],
|
|
|
+ column: Column,
|
|
|
+ index: number
|
|
|
+ ) => {
|
|
|
+ if (!checked) {
|
|
|
+ cloneColumns.value = showColumns.value.filter(
|
|
|
+ (item) => item.dataIndex !== column.dataIndex
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ cloneColumns.value.splice(index, 0, column);
|
|
|
}
|
|
|
- });
|
|
|
-};
|
|
|
-
|
|
|
-const changeAttr = async (id: number, name: string, val: any) => {
|
|
|
- const args = {
|
|
|
- id,
|
|
|
- name,
|
|
|
- val
|
|
|
- } as PddUpdateAccountModel;
|
|
|
-
|
|
|
- Modal.confirm({
|
|
|
- title: '确认提示',
|
|
|
- content: '确定要更改状态吗?',
|
|
|
- okText: '确认',
|
|
|
- cancelText: '取消',
|
|
|
- async onOk() {
|
|
|
- setLoading(true);
|
|
|
- try {
|
|
|
+ };
|
|
|
+
|
|
|
+ const exchangeArray = <T extends Array<any>>(
|
|
|
+ array: T,
|
|
|
+ beforeIdx: number,
|
|
|
+ newIdx: number,
|
|
|
+ isDeep = false
|
|
|
+ ): T => {
|
|
|
+ const newArray = isDeep ? cloneDeep(array) : array;
|
|
|
+ if (beforeIdx > -1 && newIdx > -1) {
|
|
|
+ // 先替换后面的,然后拿到替换的结果替换前面的
|
|
|
+ newArray.splice(
|
|
|
+ beforeIdx,
|
|
|
+ 1,
|
|
|
+ newArray.splice(newIdx, 1, newArray[beforeIdx]).pop()
|
|
|
+ );
|
|
|
+ }
|
|
|
+ return newArray;
|
|
|
+ };
|
|
|
+
|
|
|
+ const popupVisibleChange = (val: boolean) => {
|
|
|
+ if (val) {
|
|
|
+ nextTick(() => {
|
|
|
+ const el = document.getElementById(
|
|
|
+ 'tableSetting'
|
|
|
+ ) as HTMLElement;
|
|
|
+ const sortable = new Sortable(el, {
|
|
|
+ onEnd(e: any) {
|
|
|
+ const { oldIndex, newIndex } = e;
|
|
|
+ exchangeArray(cloneColumns.value, oldIndex, newIndex);
|
|
|
+ exchangeArray(showColumns.value, oldIndex, newIndex);
|
|
|
+ },
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
|
|
|
- const { data } = await PddUpdateAccount(args);
|
|
|
- console.log(data, data.msg);
|
|
|
+ // Cookie modal methods
|
|
|
+ const openCookieModal = (record: PddPoolRecord) => {
|
|
|
+ currentRecord.value = record;
|
|
|
+ cookieFormData.value = {
|
|
|
+ id: record.id,
|
|
|
+ cookie: '',
|
|
|
+ };
|
|
|
+ cookieModalVisible.value = true;
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleCookieUpdate = async () => {
|
|
|
+ const res = await cookieFormRef.value?.validate();
|
|
|
+ if (!res) {
|
|
|
+ cookieLoading.value = true;
|
|
|
+ try {
|
|
|
+ const { data } = await updateCookiesWithId(
|
|
|
+ cookieFormData.value
|
|
|
+ );
|
|
|
const msg = data.msg || '更新成功!';
|
|
|
if (data.success) {
|
|
|
Message.success(msg);
|
|
|
- search();
|
|
|
+ cookieModalVisible.value = false;
|
|
|
+ search(); // 刷新列表
|
|
|
} else {
|
|
|
Message.error(data.msg);
|
|
|
}
|
|
|
- } catch (e) { console.log(e) }
|
|
|
- setLoading(false);
|
|
|
+ } catch (err) {
|
|
|
+ console.error(err);
|
|
|
+ Message.error('更新失败');
|
|
|
+ } finally {
|
|
|
+ cookieLoading.value = false;
|
|
|
+ }
|
|
|
}
|
|
|
- });
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-const search = () => {
|
|
|
- fetchData({
|
|
|
- ...basePagination,
|
|
|
- ...formModel.value,
|
|
|
- } as unknown as PddPoolParams);
|
|
|
-};
|
|
|
-const onPageChange = (current: number) => {
|
|
|
- fetchData({
|
|
|
- ...basePagination,
|
|
|
- ...formModel.value,
|
|
|
- current
|
|
|
- } as unknown as PddPoolParams);
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-const onPageSizeChange = (current: number) => {
|
|
|
- basePagination.pageSize = current;
|
|
|
- pagination.pageSize = current;
|
|
|
- fetchData({
|
|
|
- ...basePagination,
|
|
|
- ...formModel.value,
|
|
|
- current: 1,
|
|
|
- } as unknown as PddPoolParams);
|
|
|
-};
|
|
|
-
|
|
|
-fetchData();
|
|
|
-const reset = () => {
|
|
|
- formModel.value = generateFormModel();
|
|
|
-};
|
|
|
-
|
|
|
-const handleSelectDensity = (
|
|
|
- val: string | number | Record<string, any> | undefined,
|
|
|
- e: Event
|
|
|
-) => {
|
|
|
- size.value = val as SizeProps;
|
|
|
-};
|
|
|
-
|
|
|
-const handleChange = (
|
|
|
- checked: boolean | (string | boolean | number)[],
|
|
|
- column: Column,
|
|
|
- index: number
|
|
|
-) => {
|
|
|
- if (!checked) {
|
|
|
- cloneColumns.value = showColumns.value.filter(
|
|
|
- (item) => item.dataIndex !== column.dataIndex
|
|
|
- );
|
|
|
- } else {
|
|
|
- cloneColumns.value.splice(index, 0, column);
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-const exchangeArray = <T extends Array<any>>(
|
|
|
- array: T,
|
|
|
- beforeIdx: number,
|
|
|
- newIdx: number,
|
|
|
- isDeep = false
|
|
|
-): T => {
|
|
|
- const newArray = isDeep ? cloneDeep(array) : array;
|
|
|
- if (beforeIdx > -1 && newIdx > -1) {
|
|
|
- // 先替换后面的,然后拿到替换的结果替换前面的
|
|
|
- newArray.splice(
|
|
|
- beforeIdx,
|
|
|
- 1,
|
|
|
- newArray.splice(newIdx, 1, newArray[beforeIdx]).pop()
|
|
|
- );
|
|
|
- }
|
|
|
- return newArray;
|
|
|
-};
|
|
|
-
|
|
|
-const popupVisibleChange = (val: boolean) => {
|
|
|
- if (val) {
|
|
|
- nextTick(() => {
|
|
|
- const el = document.getElementById(
|
|
|
- 'tableSetting'
|
|
|
- ) as HTMLElement;
|
|
|
- const sortable = new Sortable(el, {
|
|
|
- onEnd(e: any) {
|
|
|
- const { oldIndex, newIndex } = e;
|
|
|
- exchangeArray(cloneColumns.value, oldIndex, newIndex);
|
|
|
- exchangeArray(showColumns.value, oldIndex, newIndex);
|
|
|
- },
|
|
|
- });
|
|
|
- });
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-// Cookie modal methods
|
|
|
-const openCookieModal = (record: PddPoolRecord) => {
|
|
|
- currentRecord.value = record;
|
|
|
- cookieFormData.value = {
|
|
|
- id: record.id,
|
|
|
- cookie: '',
|
|
|
};
|
|
|
- cookieModalVisible.value = true;
|
|
|
-};
|
|
|
|
|
|
-const handleCookieUpdate = async () => {
|
|
|
- const res = await cookieFormRef.value?.validate();
|
|
|
- if (!res) {
|
|
|
- cookieLoading.value = true;
|
|
|
+ const updateBalance = async (record: PddPoolRecord) => {
|
|
|
+ const args = {
|
|
|
+ id: record.id,
|
|
|
+ name: 'balance',
|
|
|
+ } as PddUpdateAccountModel;
|
|
|
+
|
|
|
+ setLoading(true);
|
|
|
try {
|
|
|
- const { data } = await updateCookiesWithId(cookieFormData.value);
|
|
|
+ const { data } = await PddUpdateAccount(args);
|
|
|
+ console.log(data, data.msg);
|
|
|
const msg = data.msg || '更新成功!';
|
|
|
if (data.success) {
|
|
|
Message.success(msg);
|
|
|
- cookieModalVisible.value = false;
|
|
|
- search(); // 刷新列表
|
|
|
+ search();
|
|
|
} else {
|
|
|
Message.error(data.msg);
|
|
|
}
|
|
|
- } catch (err) {
|
|
|
- console.error(err);
|
|
|
- Message.error('更新失败');
|
|
|
- } finally {
|
|
|
- cookieLoading.value = false;
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
}
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-const updateBalance = async (record: PddPoolRecord) => {
|
|
|
- const args = {
|
|
|
- id: record.id,
|
|
|
- name: 'balance',
|
|
|
- } as PddUpdateAccountModel;
|
|
|
-
|
|
|
- setLoading(true);
|
|
|
- try {
|
|
|
- const { data } = await PddUpdateAccount(args);
|
|
|
- console.log(data, data.msg);
|
|
|
- const msg = data.msg || '更新成功!';
|
|
|
- if (data.success) {
|
|
|
- Message.success(msg);
|
|
|
- search();
|
|
|
- } else {
|
|
|
- Message.error(data.msg);
|
|
|
- }
|
|
|
-
|
|
|
- } catch (e) { console.log(e) }
|
|
|
- setLoading(false);
|
|
|
-};
|
|
|
+ setLoading(false);
|
|
|
+ };
|
|
|
|
|
|
-const handleCookieCancel = () => {
|
|
|
- cookieModalVisible.value = false;
|
|
|
- cookieFormData.value = {
|
|
|
- id: 0,
|
|
|
- cookie: '',
|
|
|
+ const handleCookieCancel = () => {
|
|
|
+ cookieModalVisible.value = false;
|
|
|
+ cookieFormData.value = {
|
|
|
+ id: 0,
|
|
|
+ cookie: '',
|
|
|
+ };
|
|
|
+ cookieFormRef.value?.resetFields();
|
|
|
};
|
|
|
- cookieFormRef.value?.resetFields();
|
|
|
-};
|
|
|
-
|
|
|
-const handleRechargeAllOnlineAccountUsage = async () => {
|
|
|
- Modal.confirm({
|
|
|
- title: '确认提示',
|
|
|
- content: '确定要重置所有账号当日分配权重吗?',
|
|
|
- okText: '确认',
|
|
|
- cancelText: '取消',
|
|
|
- async onOk() {
|
|
|
- setLoading(true);
|
|
|
- try {
|
|
|
- const data = await rechargeAllOnlineAccountUsage();
|
|
|
- console.log(data);
|
|
|
- if (data.code === 200) {
|
|
|
- Message.success(`重置成功!共处理 ${data.count} 个账号`);
|
|
|
- search(); // 刷新列表
|
|
|
- } else {
|
|
|
- Message.error(data.msg || '重置失败');
|
|
|
- }
|
|
|
- } catch (err) {
|
|
|
- console.error(err);
|
|
|
- Message.error('重置失败');
|
|
|
- } finally {
|
|
|
- setLoading(false);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
-};
|
|
|
|
|
|
-// 批量更新余额
|
|
|
-const handleBatchUpdateBalance = async () => {
|
|
|
- if (selectedRows.value.length === 0) {
|
|
|
- Message.warning('请先选择要更新的账号');
|
|
|
- return;
|
|
|
- }
|
|
|
+ const handleRechargeAllOnlineAccountUsage = async () => {
|
|
|
+ Modal.confirm({
|
|
|
+ title: '确认提示',
|
|
|
+ content: '确定要重置所有账号当日分配权重吗?',
|
|
|
+ okText: '确认',
|
|
|
+ cancelText: '取消',
|
|
|
+ async onOk() {
|
|
|
+ setLoading(true);
|
|
|
+ try {
|
|
|
+ const data = await rechargeAllOnlineAccountUsage();
|
|
|
+ console.log(data);
|
|
|
+ if (data.code === 200) {
|
|
|
+ Message.success(
|
|
|
+ `重置成功!共处理 ${data.count} 个账号`
|
|
|
+ );
|
|
|
+ search(); // 刷新列表
|
|
|
+ } else {
|
|
|
+ Message.error(data.msg || '重置失败');
|
|
|
+ }
|
|
|
+ } catch (err) {
|
|
|
+ console.error(err);
|
|
|
+ Message.error('重置失败');
|
|
|
+ } finally {
|
|
|
+ setLoading(false);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ });
|
|
|
+ };
|
|
|
|
|
|
- Modal.confirm({
|
|
|
- title: '确认提示',
|
|
|
- content: `确定要批量更新选中的 ${selectedRows.value.length} 个账号的可提现余额吗?`,
|
|
|
- okText: '确认',
|
|
|
- cancelText: '取消',
|
|
|
- async onOk() {
|
|
|
- setLoading(true);
|
|
|
- let successCount = 0;
|
|
|
- let failCount = 0;
|
|
|
- const total = selectedRows.value.length;
|
|
|
+ // 批量更新余额
|
|
|
+ const handleBatchUpdateBalance = async () => {
|
|
|
+ if (selectedRows.value.length === 0) {
|
|
|
+ Message.warning('请先选择要更新的账号');
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- try {
|
|
|
- // 串行执行每个账号的余额更新
|
|
|
- for (let i = 0; i < selectedRows.value.length; i += 1) {
|
|
|
- const record = selectedRows.value[i];
|
|
|
- try {
|
|
|
- const args = {
|
|
|
- id: record.id,
|
|
|
- name: 'balance',
|
|
|
- } as PddUpdateAccountModel;
|
|
|
-
|
|
|
- const { data } = await PddUpdateAccount(args);
|
|
|
- if (data.success) {
|
|
|
- successCount += 1;
|
|
|
- Message.info(`[${i + 1}/${total}] ${record.company} 更新成功`);
|
|
|
- } else {
|
|
|
+ Modal.confirm({
|
|
|
+ title: '确认提示',
|
|
|
+ content: `确定要批量更新选中的 ${selectedRows.value.length} 个账号的可提现余额吗?`,
|
|
|
+ okText: '确认',
|
|
|
+ cancelText: '取消',
|
|
|
+ async onOk() {
|
|
|
+ setLoading(true);
|
|
|
+ let successCount = 0;
|
|
|
+ let failCount = 0;
|
|
|
+ const total = selectedRows.value.length;
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 串行执行每个账号的余额更新
|
|
|
+ for (let i = 0; i < selectedRows.value.length; i += 1) {
|
|
|
+ const record = selectedRows.value[i];
|
|
|
+ try {
|
|
|
+ const args = {
|
|
|
+ id: record.id,
|
|
|
+ name: 'balance',
|
|
|
+ } as PddUpdateAccountModel;
|
|
|
+
|
|
|
+ const { data } = await PddUpdateAccount(args);
|
|
|
+ if (data.success) {
|
|
|
+ successCount += 1;
|
|
|
+ Message.info(
|
|
|
+ `[${i + 1}/${total}] ${
|
|
|
+ record.company
|
|
|
+ } 更新成功`
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ failCount += 1;
|
|
|
+ Message.error(
|
|
|
+ `[${i + 1}/${total}] ${
|
|
|
+ record.company
|
|
|
+ } 更新失败: ${data.msg}`
|
|
|
+ );
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
failCount += 1;
|
|
|
- Message.error(`[${i + 1}/${total}] ${record.company} 更新失败: ${data.msg}`);
|
|
|
+ console.error(
|
|
|
+ `更新账号 ${record.company} 失败:`,
|
|
|
+ e
|
|
|
+ );
|
|
|
+ Message.error(
|
|
|
+ `[${i + 1}/${total}] ${record.company} 更新失败`
|
|
|
+ );
|
|
|
}
|
|
|
- } catch (e) {
|
|
|
- failCount += 1;
|
|
|
- console.error(`更新账号 ${record.company} 失败:`, e);
|
|
|
- Message.error(`[${i + 1}/${total}] ${record.company} 更新失败`);
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // 显示总结信息
|
|
|
- if (successCount > 0) {
|
|
|
- Message.success(`批量更新完成!成功: ${successCount}, 失败: ${failCount}`);
|
|
|
- } else {
|
|
|
- Message.error(`批量更新失败!失败: ${failCount}`);
|
|
|
- }
|
|
|
+ // 显示总结信息
|
|
|
+ if (successCount > 0) {
|
|
|
+ Message.success(
|
|
|
+ `批量更新完成!成功: ${successCount}, 失败: ${failCount}`
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ Message.error(`批量更新失败!失败: ${failCount}`);
|
|
|
+ }
|
|
|
|
|
|
- // 清空选择并刷新列表
|
|
|
- selectedRowKeys.value = [];
|
|
|
- selectedRows.value = [];
|
|
|
- search();
|
|
|
- } catch (err) {
|
|
|
- console.error(err);
|
|
|
- Message.error('批量更新过程中发生错误');
|
|
|
- } finally {
|
|
|
- setLoading(false);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
-};
|
|
|
-
|
|
|
-watch(
|
|
|
- () => columns.value,
|
|
|
- (val) => {
|
|
|
- cloneColumns.value = cloneDeep(val);
|
|
|
- cloneColumns.value.forEach((item, index) => {
|
|
|
- item.checked = true;
|
|
|
+ // 清空选择并刷新列表
|
|
|
+ selectedRowKeys.value = [];
|
|
|
+ selectedRows.value = [];
|
|
|
+ search();
|
|
|
+ } catch (err) {
|
|
|
+ console.error(err);
|
|
|
+ Message.error('批量更新过程中发生错误');
|
|
|
+ } finally {
|
|
|
+ setLoading(false);
|
|
|
+ }
|
|
|
+ },
|
|
|
});
|
|
|
- showColumns.value = cloneDeep(cloneColumns.value);
|
|
|
- },
|
|
|
- { deep: true, immediate: true }
|
|
|
-);
|
|
|
+ };
|
|
|
+
|
|
|
+ watch(
|
|
|
+ () => columns.value,
|
|
|
+ (val) => {
|
|
|
+ cloneColumns.value = cloneDeep(val);
|
|
|
+ cloneColumns.value.forEach((item, index) => {
|
|
|
+ item.checked = true;
|
|
|
+ });
|
|
|
+ showColumns.value = cloneDeep(cloneColumns.value);
|
|
|
+ },
|
|
|
+ { deep: true, immediate: true }
|
|
|
+ );
|
|
|
</script>
|
|
|
|
|
|
<script lang="ts">
|
|
|
-export default {
|
|
|
- name: 'SearchTable',
|
|
|
-};
|
|
|
+ export default {
|
|
|
+ name: 'SearchTable',
|
|
|
+ };
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="less">
|
|
|
-.container {
|
|
|
- padding: 0 20px 20px 20px;
|
|
|
-}
|
|
|
-
|
|
|
-:deep(.arco-table-th) {
|
|
|
- &:last-child {
|
|
|
- .arco-table-th-item-title {
|
|
|
- margin-left: 16px;
|
|
|
+ .container {
|
|
|
+ padding: 0 20px 20px 20px;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.arco-table-th) {
|
|
|
+ &:last-child {
|
|
|
+ .arco-table-th-item-title {
|
|
|
+ margin-left: 16px;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-.action-icon {
|
|
|
- margin-left: 12px;
|
|
|
- cursor: pointer;
|
|
|
-}
|
|
|
+ .action-icon {
|
|
|
+ margin-left: 12px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
|
|
|
-.active {
|
|
|
- color: #0960bd;
|
|
|
- background-color: #e3f4fc;
|
|
|
-}
|
|
|
+ .active {
|
|
|
+ color: #0960bd;
|
|
|
+ background-color: #e3f4fc;
|
|
|
+ }
|
|
|
|
|
|
-.setting {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- width: 200px;
|
|
|
+ .setting {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ width: 200px;
|
|
|
|
|
|
- .title {
|
|
|
- margin-left: 12px;
|
|
|
- cursor: pointer;
|
|
|
+ .title {
|
|
|
+ margin-left: 12px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-:deep(.special-table-row td) {
|
|
|
- background-color: var(--color-warning-light-2) !important;
|
|
|
-}
|
|
|
+ :deep(.special-table-row td) {
|
|
|
+ background-color: var(--color-warning-light-2) !important;
|
|
|
+ }
|
|
|
</style>
|