fix: 修复帮助内容加载、搜索滚动和账户同步的问题

- 完善帮助内容接口的响应校验,增加数据格式和范围验证
- 优化搜索页面的滚动位置管理,避免H5页面激活时的组件重建问题
- 增加账户切换时的定时器清理,防止内存泄漏和重复请求
This commit is contained in:
hujun
2026-10-08 17:43:53 +08:00
parent 71b3c25695
commit 25cb06b71c
9 changed files with 1317 additions and 39 deletions
+17 -9
View File
@@ -82,7 +82,8 @@
const targetId = ref(''); const targetItem = ref<FeedbackItem | null>(null); const targetLoading = ref(false); const targetError = ref('')
let detailRequest = 0
let visible = false; let generation = 0; let faqRequest = 0; let listRequest = 0; let page = 0
let owner = ''
let owner = ''; let accountTimer = 0
function stopAccountTimer() { if (accountTimer != 0) { clearInterval(accountTimer); accountTimer = 0 } }
const groups = computed((): HelpGroup[] => {
const results: HelpGroup[] = []
helpCategories.forEach((category: string) => {
@@ -122,8 +123,10 @@
if (!visible || ticket != generation) return false
const sessionToken = getSession()?.getString('token') ?? ''
if (sessionToken == token) return true
generation++; clearFeedback(); targetId.value = ''; owner = sessionToken; loggedIn.value = owner.length > 0
if (loggedIn.value) { restorePending(); reloadAfterAccountChange() }
generation++; faqRequest++; loading.value = false; errorMessage.value = ''; expanded.value = ''
clearFeedback(); targetId.value = ''; owner = sessionToken; loggedIn.value = owner.length > 0
if (loggedIn.value) restorePending()
reloadAfterAccountChange()
return false
}
reconcileAccount = () => { current(generation, owner) }
@@ -143,10 +146,12 @@
}
const load = async () => {
if (!visible || loading.value) return
const account = generation; const token = owner
if (!current(account, token)) return
const ticket = ++faqRequest
loading.value = true; errorMessage.value = ''
try { const items = await fetchHelpQuestions(); if (visible && ticket == faqRequest) questions.value = items }
catch (_error) { if (visible && ticket == faqRequest) errorMessage.value = '暂时无法加载帮助内容,请稍后重试' }
loading.value = true; errorMessage.value = ''; questions.value = []; expanded.value = ''
try { const items = await fetchHelpQuestions(); if (current(account, token) && ticket == faqRequest) questions.value = items }
catch (_error) { if (current(account, token) && ticket == faqRequest) errorMessage.value = '暂时无法加载帮助内容,请稍后重试' }
finally { if (ticket == faqRequest) loading.value = false }
}
async function loadFeedback(append: boolean) {
@@ -170,9 +175,11 @@
} finally { if (ticket == generation && request == listRequest) { feedbackLoading.value = false; loadingMore.value = false } }
}
function reloadFeedback() { loadFeedback(false) }
reloadAfterAccountChange = () => { reloadTarget(); reloadFeedback() }
reloadAfterAccountChange = () => { load(); if (tab.value == 'feedback') { reloadTarget(); reloadFeedback() } }
const loadMore = () => { loadFeedback(true) }
const changeTab = (value: string) => {
if (!visible) return
reconcileAccount()
tab.value = value
if (value == 'feedback') { reloadTarget(); reloadFeedback() } else if (questions.value.length == 0) load()
}
@@ -226,9 +233,10 @@
visible = true; generation++; const token = getSession()?.getString('token') ?? ''
if (token != owner) { if (owner.length > 0) targetId.value = ''; clearFeedback() }
owner = token; loggedIn.value = token.length > 0; restorePending(); load(); if (tab.value == 'feedback') { reloadTarget(); reloadFeedback() }
stopAccountTimer(); accountTimer = setInterval(() => { reconcileAccount() }, 1000)
})
onHide(() => { visible = false; generation++; faqRequest++; listRequest++; detailRequest++; targetItem.value = null; targetLoading.value = false; targetError.value = ''; loading.value = false; feedbackLoading.value = false; loadingMore.value = false; sending.value = false; records.value = [] })
onUnload(() => { visible = false; generation++; faqRequest++; clearFeedback() })
onHide(() => { visible = false; stopAccountTimer(); generation++; faqRequest++; listRequest++; detailRequest++; targetItem.value = null; targetLoading.value = false; targetError.value = ''; loading.value = false; feedbackLoading.value = false; loadingMore.value = false; sending.value = false; records.value = [] })
onUnload(() => { visible = false; stopAccountTimer(); generation++; faqRequest++; clearFeedback() })
</script>
<style>
.help-body { overflow: hidden; }