feat(admin): 订阅绑定按钮防重复提交(JS disable-on-submit)

This commit is contained in:
萝卜
2026-03-15 17:29:41 +08:00
parent 7dd508e84d
commit dbe90c1703
3 changed files with 89 additions and 1 deletions

View File

@@ -22,6 +22,27 @@
} }
} }
// 通用:表单提交后禁用按钮,避免运营重复点击造成重复请求
// 用法form 标记 data-action="disable-on-submit"。
(function () {
var forms = document.querySelectorAll('form[data-action="disable-on-submit"]');
if (!forms || forms.length === 0) {
return;
}
forms.forEach(function (form) {
form.addEventListener('submit', function () {
try {
var btns = form.querySelectorAll('button, input[type="submit"]');
btns.forEach(function (b) {
b.disabled = true;
// 尽量不改文案(避免影响断言/文案口径);只做禁用
});
} catch (e) {}
});
});
})();
// 续费缺订阅治理订单详情页“绑定订阅ID”输入框小交互增强 // 续费缺订阅治理订单详情页“绑定订阅ID”输入框小交互增强
// - 输入后按 Enter 直接提交 // - 输入后按 Enter 直接提交
// - 自动聚焦,减少点击 // - 自动聚焦,减少点击

View File

@@ -315,7 +315,7 @@
$attachBack = $back; $attachBack = $back;
} }
@endphp @endphp
<form method="post" action="/admin/platform-orders/{{ $attachOrderId }}/attach-subscription" class="inline-form" onsubmit="return confirm('确认将该订阅绑定到目标订单?');"> <form method="post" action="/admin/platform-orders/{{ $attachOrderId }}/attach-subscription" class="inline-form" data-action="disable-on-submit" onsubmit="return confirm('确认将该订阅绑定到目标订单?');">
@csrf @csrf
<input type="hidden" name="site_subscription_id" value="{{ $subscription->id }}"> <input type="hidden" name="site_subscription_id" value="{{ $subscription->id }}">
@if($attachBack !== '') @if($attachBack !== '')

View File

@@ -0,0 +1,67 @@
<?php
namespace Tests\Feature;
use App\Models\Merchant;
use App\Models\Plan;
use App\Models\SiteSubscription;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AdminSiteSubscriptionIndexAttachOrderIdShouldMarkBindFormDisableOnSubmitTest extends TestCase
{
use RefreshDatabase;
protected function loginAsPlatformAdmin(): void
{
$this->seed();
$this->post('/admin/login', [
'email' => 'platform.admin@demo.local',
'password' => 'Platform@123456',
])->assertRedirect('/admin');
}
public function test_index_should_mark_bind_form_disable_on_submit(): void
{
$this->loginAsPlatformAdmin();
$merchant = Merchant::query()->firstOrFail();
$plan = Plan::query()->create([
'code' => 'sub_index_disable_on_submit_plan',
'name' => '订阅列表绑定按钮防重复提交测试套餐',
'billing_cycle' => 'monthly',
'price' => 10,
'list_price' => 10,
'status' => 'active',
'sort' => 10,
'published_at' => now(),
]);
SiteSubscription::query()->create([
'merchant_id' => $merchant->id,
'plan_id' => $plan->id,
'status' => 'active',
'source' => 'manual',
'subscription_no' => 'SS_DISABLE_ON_SUBMIT_0001',
'plan_name' => $plan->name,
'billing_cycle' => $plan->billing_cycle,
'period_months' => 1,
'amount' => 10,
'starts_at' => now()->subDays(1),
'ends_at' => now()->addDays(10),
'snapshot' => [],
'meta' => [],
]);
$orderId = 12345;
$res = $this->get('/admin/site-subscriptions?attach_order_id=' . $orderId . '&attach_back=%2Fadmin%2Fplatform-orders%2F1');
$res->assertOk();
$html = (string) $res->getContent();
$this->assertStringContainsString('data-action="disable-on-submit"', $html);
}
}