|
|
@@ -542,6 +542,11 @@
|
|
|
@change="search"
|
|
|
/>
|
|
|
</template>
|
|
|
+ <template #qps_limit="{ record }">
|
|
|
+ <a-link @click="openQpsModal(record)">
|
|
|
+ {{ record.qps_limit > 0 ? record.qps_limit : '不限' }}
|
|
|
+ </a-link>
|
|
|
+ </template>
|
|
|
<template #hourly_calls_limit="{ record }">
|
|
|
<a-tag
|
|
|
bordered
|
|
|
@@ -621,6 +626,33 @@
|
|
|
</template>
|
|
|
</a-table>
|
|
|
</a-card>
|
|
|
+
|
|
|
+ <a-modal
|
|
|
+ v-model:visible="qpsModalVisible"
|
|
|
+ title="设置账号 QPS"
|
|
|
+ :confirm-loading="qpsSaving"
|
|
|
+ @ok="saveQpsLimit"
|
|
|
+ @cancel="closeQpsModal"
|
|
|
+ >
|
|
|
+ <a-form :model="qpsForm" layout="vertical">
|
|
|
+ <a-form-item label="账号">
|
|
|
+ {{ qpsAccount?.company || qpsAccount?.name }}
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item label="QPS 限制">
|
|
|
+ <a-input-number
|
|
|
+ v-model="qpsForm.qps_limit"
|
|
|
+ :min="0"
|
|
|
+ :precision="0"
|
|
|
+ :step="1"
|
|
|
+ placeholder="0 表示不限制"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
+ </a-form-item>
|
|
|
+ </a-form>
|
|
|
+ <a-typography-text type="secondary">
|
|
|
+ 设置为 0 时不限制该账号 QPS。
|
|
|
+ </a-typography-text>
|
|
|
+ </a-modal>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -675,6 +707,12 @@
|
|
|
const showColumns = ref<Column[]>([]);
|
|
|
|
|
|
const size = ref<SizeProps>('mini');
|
|
|
+ const qpsModalVisible = ref(false);
|
|
|
+ const qpsSaving = ref(false);
|
|
|
+ const qpsAccount = ref<TkPoolRecord | null>(null);
|
|
|
+ const qpsForm = reactive({
|
|
|
+ qps_limit: 0,
|
|
|
+ });
|
|
|
|
|
|
const basePagination: Pagination = {
|
|
|
current: 1,
|
|
|
@@ -730,6 +768,13 @@
|
|
|
align: 'right',
|
|
|
width: 200,
|
|
|
},
|
|
|
+ {
|
|
|
+ title: 'QPS 限制',
|
|
|
+ dataIndex: 'qps_limit',
|
|
|
+ slotName: 'qps_limit',
|
|
|
+ align: 'right',
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
{
|
|
|
title: '小时调用',
|
|
|
slotName: 'hourly_calls_limit',
|
|
|
@@ -878,6 +923,47 @@
|
|
|
router.push({ name: 'updateCookies' });
|
|
|
};
|
|
|
|
|
|
+ const openQpsModal = (record: TkPoolRecord) => {
|
|
|
+ qpsAccount.value = record;
|
|
|
+ qpsForm.qps_limit = Math.max(
|
|
|
+ 0,
|
|
|
+ Math.trunc(Number(record.qps_limit) || 0)
|
|
|
+ );
|
|
|
+ qpsModalVisible.value = true;
|
|
|
+ };
|
|
|
+
|
|
|
+ const closeQpsModal = () => {
|
|
|
+ qpsModalVisible.value = false;
|
|
|
+ qpsAccount.value = null;
|
|
|
+ qpsForm.qps_limit = 0;
|
|
|
+ };
|
|
|
+
|
|
|
+ const saveQpsLimit = async () => {
|
|
|
+ if (!qpsAccount.value) return;
|
|
|
+
|
|
|
+ qpsSaving.value = true;
|
|
|
+ try {
|
|
|
+ const { data } = await TkUpdateAccount({
|
|
|
+ id: qpsAccount.value.id,
|
|
|
+ name: 'qps_limit',
|
|
|
+ val: Math.max(0, Math.trunc(Number(qpsForm.qps_limit) || 0)),
|
|
|
+ });
|
|
|
+ const msg = data.msg || '更新成功!';
|
|
|
+ if (data.success) {
|
|
|
+ Message.success(msg);
|
|
|
+ closeQpsModal();
|
|
|
+ search();
|
|
|
+ } else {
|
|
|
+ Message.error(msg);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ Message.error('更新失败');
|
|
|
+ } finally {
|
|
|
+ qpsSaving.value = false;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
const billView = async (data: TkPoolRecord) => {
|
|
|
router.push({
|
|
|
name: 'taobao_bill_dailys',
|