Procházet zdrojové kódy

feat(淘宝账号池): 支持编辑账号 QPS 限制

在账号列表展示 QPS 限额并提供编辑弹窗,0 表示不限制;同步补充接口类型和更新结果类型。
dodo hold před 2 měsíci
rodič
revize
cfbed13ba7
2 změnil soubory, kde provedl 88 přidání a 1 odebrání
  1. 2 1
      src/api/taobao.ts
  2. 86 0
      src/views/taobao/list.vue

+ 2 - 1
src/api/taobao.ts

@@ -152,6 +152,7 @@ export interface TkPoolRecord {
 
     daily_income_limit: number;
     daily_calls_limit: number;
+    qps_limit: number;
     current_hourly_calls: number;
     hourly_calls_limit: number;
     current_daily_calls: number;
@@ -402,7 +403,7 @@ export function updateCookies(data: UpdateCookieModel) {
 
 export function TkUpdateAccount(data: TkUpdateAccountModel) {
     const url = ForwardAPI('/api/taobao/update');
-    return axios.post<UpdateConfigRes>(url, data);
+    return axios.post<FormRes>(url, data);
 }
 
 export function queryTkPool(data: TkPoolParams) {

+ 86 - 0
src/views/taobao/list.vue

@@ -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',