合并 test/aggressive-mode 到 main
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user