diff --git a/client/src/api.ts b/client/src/api.ts index 2e9dfa0..a196ad1 100644 --- a/client/src/api.ts +++ b/client/src/api.ts @@ -60,6 +60,8 @@ http.interceptors.response.use( ) { err.config._retried = true if (await refreshAccessToken()) return http(err.config) + // 刷新失败但 refresh token 还在,说明只是网络问题:保留登录,下次请求再试 + if (hasLogin()) return Promise.reject(err) } switch (err.response.status) { case 401: // 未授权 @@ -277,7 +279,7 @@ export const Submission = { username?: string user_id?: number flag?: string | null - zone?: string + zone?: string | null task_id?: number task_type?: string score_min?: number @@ -553,7 +555,11 @@ export const TaskAssets = { ).data }, async deleteChallenge(display: number, name: string) { - return (await http.delete(`/assets/challenge/${display}/${name}`)).data + return ( + await http.delete( + `/assets/challenge/${display}/${encodeURIComponent(name)}`, + ) + ).data }, async listTutorial(display: number): Promise { return (await http.get(`/assets/tutorial/${display}`)).data @@ -573,6 +579,10 @@ export const TaskAssets = { ).data }, async deleteTutorial(display: number, name: string) { - return (await http.delete(`/assets/tutorial/${display}/${name}`)).data + return ( + await http.delete( + `/assets/tutorial/${display}/${encodeURIComponent(name)}`, + ) + ).data }, } diff --git a/client/src/components/ai/PromptHistoryPanel.vue b/client/src/components/ai/PromptHistoryPanel.vue index 304d7a8..fa05257 100644 --- a/client/src/components/ai/PromptHistoryPanel.vue +++ b/client/src/components/ai/PromptHistoryPanel.vue @@ -210,8 +210,15 @@ function selectItem(item: HistoryViewItem) { }) } +// 加载中又要求刷新(比如自动提交了新代码、换了任务),等这次完成后再加载一次 +let reloadAfter = false + async function load(force = true) { - if (!props.taskId || loading.value) return + if (!props.taskId) return + if (loading.value) { + reloadAfter = true + return + } if (!force && loadedTaskId === props.taskId) return loading.value = true try { @@ -230,6 +237,10 @@ async function load(force = true) { loadedTaskId = props.taskId } finally { loading.value = false + if (reloadAfter) { + reloadAfter = false + load(true) + } } } diff --git a/client/src/components/editor/Toolbar.vue b/client/src/components/editor/Toolbar.vue index fa6e01e..8c10636 100644 --- a/client/src/components/editor/Toolbar.vue +++ b/client/src/components/editor/Toolbar.vue @@ -107,9 +107,13 @@ function handleLogin() { } async function handleLogout() { - await Account.logout() - user.username = "" - user.role = Role.Normal + // token 已经先清掉了,退出请求失败(比如断网)界面也要显示为已退出 + try { + await Account.logout() + } finally { + user.username = "" + user.role = Role.Normal + } }