合并 test/aggressive-mode 到 main

This commit is contained in:
yml2213
2026-06-26 20:33:25 +08:00
22 changed files with 125901 additions and 64 deletions
@@ -1,6 +1,5 @@
<script setup lang="ts">
import { computed, ref } from 'vue'
import { useVirtualizer } from '@tanstack/vue-virtual'
import { computed } from 'vue'
import { useAccounts } from '@/composables/useAccounts'
import { useProducts } from '@/composables/useProducts'
@@ -15,21 +14,10 @@ const {
const { selectedProductName } = useProducts()
const parentRef = ref<HTMLElement | null>(null)
const allSelected = computed(() =>
accounts.value.length > 0 && selectedIndices.value.size === accounts.value.length
)
const virtualizer = useVirtualizer(
computed(() => ({
count: accounts.value.length,
getScrollElement: () => parentRef.value,
estimateSize: () => 48,
overscan: 5
}))
)
// 状态信息计算
const getStatusInfo = (name: string, selected: boolean) => {
const st = statusMap.value[name]
@@ -85,7 +73,7 @@ const getResultMessage = (name: string) => {
</label>
</div>
<div ref="parentRef" class="table-wrap">
<div class="table-wrap">
<table>
<thead>
<tr>
@@ -104,24 +92,23 @@ const getResultMessage = (name: string) => {
</tr>
<template v-else>
<tr
v-for="item in virtualizer.getVirtualItems()"
:key="String(item.key)"
:style="{ height: `${item.size}px` }"
v-for="(account, index) in accounts"
:key="account.name"
>
<td class="select-cell">
<label class="account-check" @click="toggleAccount(item.index)">
<div class="check-box" :class="{ checked: selectedIndices.has(item.index) }">
<span v-if="selectedIndices.has(item.index)">✓</span>
<label class="account-check" @click="toggleAccount(index)">
<div class="check-box" :class="{ checked: selectedIndices.has(index) }">
<span v-if="selectedIndices.has(index)">✓</span>
</div>
</label>
</td>
<td>
<div class="account-name">{{ accounts[item.index].name }}</div>
<div class="account-sub">{{ selectedIndices.has(item.index) ? '已加入任务' : '未选择' }}</div>
<div class="account-name">{{ account.name }}</div>
<div class="account-sub">{{ selectedIndices.has(index) ? '已加入任务' : '未选择' }}</div>
</td>
<td>
<span
v-if="accounts[item.index].cookie"
v-if="account.cookie"
class="status-badge status-success"
>
已加载
@@ -134,18 +121,18 @@ const getResultMessage = (name: string) => {
</span>
<span v-else>-</span>
</td>
<td>{{ getScore(accounts[item.index].name) }}</td>
<td>{{ getScore(account.name) }}</td>
<td class="status-td">
<span
class="status-badge"
:class="getStatusInfo(accounts[item.index].name, selectedIndices.has(item.index)).cls"
:class="getStatusInfo(account.name, selectedIndices.has(index)).cls"
>
{{ getStatusInfo(accounts[item.index].name, selectedIndices.has(item.index)).text }}
{{ getStatusInfo(account.name, selectedIndices.has(index)).text }}
</span>
</td>
<td>
<span class="account-sub" :title="getResultMessage(accounts[item.index].name)">
{{ getResultMessage(accounts[item.index].name) }}
<span class="account-sub" :title="getResultMessage(account.name)">
{{ getResultMessage(account.name) }}
</span>
</td>
</tr>
@@ -241,7 +228,7 @@ tbody tr:last-child td {
}
tbody tr {
transition: .1s;
transition: background-color .15s ease;
}
tbody tr:hover {
@@ -12,7 +12,8 @@ const formData = ref({
logLevel: 'info',
concurrency: 80,
attempts: 1,
retryStages: [] as RetryStage[]
retryStages: [] as RetryStage[],
seckillMode: 0
})
const open = async () => {
@@ -150,6 +151,23 @@ defineExpose({ open, close })
</div>
</div>
<!-- 抢购模式 -->
<div class="form-group">
<label class="form-label">抢购模式</label>
<select v-model.number="formData.seckillMode" class="form-select">
<option :value="0">标准模式(每次完整校验)</option>
<option :value="1">激进模式(复用校验结果)</option>
</select>
<div class="form-hint">
<template v-if="formData.seckillMode === 0">
标准模式:每次兑换都执行完整校验流程(CSRF→限制检查→预兑换→兑换)
</template>
<template v-else>
激进模式:第一轮完整校验,后续轮次跳过限制检查和预兑换,直接调用兑换接口
</template>
</div>
</div>
<!-- 重试间隔配置 -->
<div class="form-group">
<label class="form-label">重试间隔策略</label>