Add SmartUp account pool parameter configuration
This commit is contained in:
@@ -370,6 +370,8 @@ export interface SetConcurrencyItem {
|
||||
account_name: string | null
|
||||
old_concurrency: number | null
|
||||
target_concurrency: number
|
||||
old_pool_mode?: boolean | null
|
||||
target_pool_mode?: boolean | null
|
||||
status: string
|
||||
message: string
|
||||
}
|
||||
@@ -414,7 +416,13 @@ export const websitesApi = {
|
||||
api.post<{ success: boolean; message: string; items: CleanupInvalidAccountsItem[] }>(`/api/websites/${id}/accounts/cleanup-invalid/preview`),
|
||||
cleanupExecute: (id: number) =>
|
||||
api.post<{ success: boolean; message: string; items: CleanupInvalidAccountsItem[] }>(`/api/websites/${id}/accounts/cleanup-invalid/execute`),
|
||||
setConcurrency: (id: number, data: { concurrency: number }) =>
|
||||
setConcurrency: (id: number, data: {
|
||||
concurrency: number
|
||||
configure_pool_mode?: boolean
|
||||
pool_mode?: boolean
|
||||
pool_mode_retry_count?: number
|
||||
pool_mode_retry_status_codes?: number[]
|
||||
}) =>
|
||||
api.post<{ success: boolean; message: string; items: SetConcurrencyItem[] }>(`/api/websites/${id}/accounts/set-concurrency`, data),
|
||||
syncUpstreamModels: (id: number) =>
|
||||
api.post<{ success: boolean; message: string; items: SyncUpstreamModelsItem[] }>(`/api/websites/${id}/accounts/sync-upstream-models`),
|
||||
|
||||
@@ -169,9 +169,9 @@
|
||||
text
|
||||
:disabled="!selectedWebsite"
|
||||
@click="openConcurrencyDialog"
|
||||
title="一键设置当前网站已导入账号的并发数"
|
||||
title="一键设置当前网站已导入账号的并发和上游池参数"
|
||||
>
|
||||
设置账号并发
|
||||
设置账号参数
|
||||
</el-button>
|
||||
<el-button
|
||||
size="small"
|
||||
@@ -894,10 +894,10 @@
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 设置账号并发数弹窗 -->
|
||||
<!-- 设置账号参数弹窗 -->
|
||||
<el-dialog
|
||||
v-model="concurrencyDialog"
|
||||
title="一键设置账号并发数"
|
||||
title="一键设置账号参数"
|
||||
width="850px"
|
||||
destroy-on-close
|
||||
>
|
||||
@@ -910,8 +910,8 @@
|
||||
style="margin-bottom: 15px;"
|
||||
>
|
||||
<div style="font-size: 13px; line-height: 1.5;">
|
||||
该操作将<strong>仅修改由 SmartUp 导入并绑定到当前网站的账号并发数</strong>,不会影响任何由目标站手工创建的其他账号。<br />
|
||||
如果目标站接口支持批量更新(bulk-update),系统将一次性批量设置;否则将自动退回至逐个请求更新模式。
|
||||
该操作将<strong>仅修改由 SmartUp 导入并绑定到当前网站的账号</strong>,不会影响任何由目标站手工创建的其他账号。<br />
|
||||
只设置并发时优先使用批量更新;启用上游池参数时会逐个合并账号凭据,避免覆盖已有 base_url / key 等字段。
|
||||
</div>
|
||||
</el-alert>
|
||||
|
||||
@@ -928,6 +928,42 @@
|
||||
请输入 1 到 1000 之间的并发值,推荐设置为 100。
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="上游池模式">
|
||||
<div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap">
|
||||
<el-switch
|
||||
v-model="configurePoolMode"
|
||||
active-text="写入上游池参数"
|
||||
inactive-text="不修改"
|
||||
/>
|
||||
<el-button size="small" text :disabled="!configurePoolMode" @click="applyPoolModePreset">套用保守预设</el-button>
|
||||
</div>
|
||||
<div style="font-size: 12px; color: var(--el-text-color-secondary); margin-top: 5px;">
|
||||
适用于账号背后是上游池/中转池的场景。保守预设:pool_mode=true,重试 1 次,状态码 429/502/503/529。
|
||||
</div>
|
||||
</el-form-item>
|
||||
<template v-if="configurePoolMode">
|
||||
<el-form-item label="启用 pool_mode">
|
||||
<el-switch v-model="poolModeEnabled" />
|
||||
</el-form-item>
|
||||
<el-form-item label="重试次数">
|
||||
<el-input-number
|
||||
v-model="poolModeRetryCount"
|
||||
:min="0"
|
||||
:max="10"
|
||||
style="width: 200px;"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="重试状态码">
|
||||
<el-input
|
||||
v-model="poolModeRetryStatusCodes"
|
||||
placeholder="429,502,503,529"
|
||||
style="max-width: 360px;"
|
||||
/>
|
||||
<div style="font-size: 12px; color: var(--el-text-color-secondary); margin-top: 5px;">
|
||||
用逗号或空格分隔。关闭 pool_mode 时会清空同账号重试状态码。
|
||||
</div>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
@@ -946,6 +982,13 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="target_concurrency" label="目标并发" width="110" align="center" />
|
||||
<el-table-column label="Pool Mode" width="120" align="center">
|
||||
<template #default="{ row }">
|
||||
<span v-if="row.target_pool_mode === true">开启</span>
|
||||
<span v-else-if="row.target_pool_mode === false">关闭</span>
|
||||
<span v-else class="text-muted">未修改</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="status" label="状态" width="100" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.status === 'success'" type="success" size="small">成功</el-tag>
|
||||
@@ -1236,6 +1279,10 @@ const concurrencyDialog = ref(false)
|
||||
const concurrencyExecuting = ref(false)
|
||||
const concurrencyHasExecuted = ref(false)
|
||||
const targetConcurrency = ref(100)
|
||||
const configurePoolMode = ref(true)
|
||||
const poolModeEnabled = ref(true)
|
||||
const poolModeRetryCount = ref(1)
|
||||
const poolModeRetryStatusCodes = ref('429,502,503,529')
|
||||
const concurrencyMessage = ref('')
|
||||
const concurrencyResults = ref<SetConcurrencyItem[]>([])
|
||||
|
||||
@@ -1986,18 +2033,43 @@ async function executeCleanup() {
|
||||
function openConcurrencyDialog() {
|
||||
if (!selectedWebsite.value) return
|
||||
targetConcurrency.value = 100
|
||||
applyPoolModePreset()
|
||||
concurrencyHasExecuted.value = false
|
||||
concurrencyResults.value = []
|
||||
concurrencyMessage.value = ''
|
||||
concurrencyDialog.value = true
|
||||
}
|
||||
|
||||
function applyPoolModePreset() {
|
||||
configurePoolMode.value = true
|
||||
poolModeEnabled.value = true
|
||||
poolModeRetryCount.value = 1
|
||||
poolModeRetryStatusCodes.value = '429,502,503,529'
|
||||
}
|
||||
|
||||
function parsePoolModeRetryStatusCodes() {
|
||||
const seen = new Set<number>()
|
||||
poolModeRetryStatusCodes.value
|
||||
.split(/[,\s]+/)
|
||||
.map(part => Number(part.trim()))
|
||||
.forEach(code => {
|
||||
if (Number.isInteger(code) && code >= 100 && code <= 599) {
|
||||
seen.add(code)
|
||||
}
|
||||
})
|
||||
return [...seen].sort((a, b) => a - b)
|
||||
}
|
||||
|
||||
async function submitSetConcurrency() {
|
||||
if (!selectedWebsite.value) return
|
||||
const retryStatusCodes = poolModeEnabled.value ? parsePoolModeRetryStatusCodes() : []
|
||||
const confirmMessage = configurePoolMode.value
|
||||
? `确认将当前网站中由 SmartUp 导入账号的并发数设置为 ${targetConcurrency.value},并写入上游池参数?`
|
||||
: `确认将当前网站中由 SmartUp 导入账号的并发数一键设置为 ${targetConcurrency.value}?`
|
||||
try {
|
||||
await ElMessageBox.confirm(
|
||||
`确认将当前网站中由 SmartUp 导入账号的并发数一键设置为 ${targetConcurrency.value}?`,
|
||||
'确认修改并发数',
|
||||
confirmMessage,
|
||||
'确认修改账号参数',
|
||||
{ type: 'warning' }
|
||||
)
|
||||
} catch {
|
||||
@@ -2007,7 +2079,11 @@ async function submitSetConcurrency() {
|
||||
concurrencyExecuting.value = true
|
||||
try {
|
||||
const res = await websitesApi.setConcurrency(selectedWebsite.value.id, {
|
||||
concurrency: targetConcurrency.value
|
||||
concurrency: targetConcurrency.value,
|
||||
configure_pool_mode: configurePoolMode.value,
|
||||
pool_mode: poolModeEnabled.value,
|
||||
pool_mode_retry_count: poolModeRetryCount.value,
|
||||
pool_mode_retry_status_codes: retryStatusCodes,
|
||||
})
|
||||
concurrencyMessage.value = res.data.message
|
||||
concurrencyResults.value = res.data.items
|
||||
|
||||
Reference in New Issue
Block a user