diff --git a/src/__tests__/components/MyHead.spec.ts b/src/__tests__/components/MyHead.spec.ts
index addd933..50d6649 100644
--- a/src/__tests__/components/MyHead.spec.ts
+++ b/src/__tests__/components/MyHead.spec.ts
@@ -69,4 +69,25 @@ describe('MyHead.vue', () => {
expect(ElMessage.success).toHaveBeenCalledWith('已退出登录')
expect(router.currentRoute.value.path).toBe('/login')
})
+
+ it('prevents repeated logout while request is pending', async () => {
+ let resolveLogout!: (value: any) => void
+ vi.mocked(logout).mockImplementation(
+ () => new Promise((resolve) => { resolveLogout = resolve }),
+ )
+ localStorage.setItem('isLoggedIn', 'true')
+ const wrapper = await mountAt('/study')
+
+ const first = wrapper.vm.handleLogout()
+ const second = wrapper.vm.handleLogout()
+ await Promise.resolve()
+
+ expect(logout).toHaveBeenCalledTimes(1)
+ expect(wrapper.vm.loggingOut).toBe(true)
+
+ resolveLogout({ code: 200 })
+ await Promise.all([first, second])
+
+ expect(wrapper.vm.loggingOut).toBe(false)
+ })
})
diff --git a/src/components/MyHead.vue b/src/components/MyHead.vue
index 2fc9d88..c6e2802 100644
--- a/src/components/MyHead.vue
+++ b/src/components/MyHead.vue
@@ -20,6 +20,7 @@
type="success"
plain
class="logout-btn"
+ :loading="loggingOut"
@click="handleLogout"
>
退出登录
@@ -28,7 +29,7 @@