feat: 优化账户切换时的页面状态一致性,增加登录回跳校验和课程阅读新逻辑
- 增加账户状态监听定时器,页面切换时自动校验账户归属,避免跨账户操作 - 新增登录回跳路径校验函数,限制仅允许指定页面回跳,防止非法跳转 - 课程页改为整篇连续阅读,底部仅一次标记已读,兼容历史记录 - 完善助手、对比页、资料填写页等多处的账户状态校验逻辑,防止错版数据提交 - 优化账户资料请求逻辑,增加版本校验,避免旧请求覆盖新数据
This commit is contained in:
@@ -39,6 +39,7 @@
|
||||
import AppHeader from '@/components/AppHeader.uvue'
|
||||
import { usePageLayout } from '@/services/layout.uts'
|
||||
import { searchContent, ContentSearchResult } from '@/packages/content/services/search.uts'
|
||||
import { validateContentAppend } from '@/services/content.uts'
|
||||
const { pageStyle, contentStyle, bottomStyle } = usePageLayout()
|
||||
type SearchTab = { id: string, label: string }
|
||||
const tabs: SearchTab[] = [{ id: 'all', label: '全部' }, { id: 'news', label: '新闻' }, { id: 'lesson', label: '融资课堂' }]
|
||||
@@ -53,9 +54,11 @@
|
||||
const total = ref(0); const hasMore = ref(false); const loadingMore = ref(false); const moreError = ref('')
|
||||
let page = 1
|
||||
let requestVersion = 0
|
||||
let visible = false
|
||||
const resetResults = () => { requestVersion++; results.value = []; total.value = 0; hasMore.value = false; loadingMore.value = false; moreError.value = ''; searched.value = false; loading.value = false; errorMessage.value = ''; listVersion.value++ }
|
||||
const clearSearch = () => { keyword.value = ''; resetResults() }
|
||||
async function load(append: boolean) {
|
||||
if (!visible) return
|
||||
if (append && (loading.value || loadingMore.value || !hasMore.value)) return
|
||||
keyword.value = keyword.value.trim()
|
||||
if (keyword.value.length == 0) { clearSearch(); return }
|
||||
@@ -66,12 +69,13 @@
|
||||
try {
|
||||
const result = await searchContent(keyword.value, activeType.value, append ? page + 1 : 1)
|
||||
// 输入、切换分类或退出页面后,忽略旧请求,避免结果被覆盖。
|
||||
if (currentRequest != requestVersion) return
|
||||
if (!visible || currentRequest != requestVersion) return
|
||||
if (append) validateContentAppend(results.value.map((item: ContentSearchResult): string => item.type + ':' + item.id), result.items.map((item: ContentSearchResult): string => item.type + ':' + item.id))
|
||||
results.value = append ? results.value.concat(result.items) : result.items
|
||||
total.value = result.total; hasMore.value = result.hasMore
|
||||
if (append) page++
|
||||
} catch (err) {
|
||||
if (currentRequest == requestVersion) {
|
||||
if (visible && currentRequest == requestVersion) {
|
||||
const message = err instanceof Error ? err.message : '请检查网络连接后重试'
|
||||
if (append) moreError.value = message; else errorMessage.value = message
|
||||
}
|
||||
@@ -85,9 +89,9 @@
|
||||
const route = item.type == 'news' ? '/packages/content/article/article' : '/packages/content/lesson/lesson'
|
||||
uni.navigateTo({ url: route + '?id=' + encodeURIComponent(item.id) })
|
||||
}
|
||||
onShow(() => { if (searched.value) search() })
|
||||
onHide(() => { requestVersion++; loading.value = false; loadingMore.value = false })
|
||||
onUnload(() => { requestVersion++ })
|
||||
onShow(() => { visible = true; if (searched.value) search() })
|
||||
onHide(() => { visible = false; requestVersion++; loading.value = false; loadingMore.value = false })
|
||||
onUnload(() => { visible = false; requestVersion++ })
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
Reference in New Issue
Block a user