From 983a2ea5faa730d4508606385b72b1aafa2a5511 Mon Sep 17 00:00:00 2001 From: hajimi Date: Sun, 2 Aug 2026 01:08:59 +0800 Subject: [PATCH] fix: load custom channels on home page --- uniapp/src/pages/channel/channel-manage.vue | 44 ++++++++++++++------- uniapp/src/pages/index/index.vue | 38 +++++++++++++++++- 2 files changed, 66 insertions(+), 16 deletions(-) diff --git a/uniapp/src/pages/channel/channel-manage.vue b/uniapp/src/pages/channel/channel-manage.vue index 02b38ce..3122d95 100644 --- a/uniapp/src/pages/channel/channel-manage.vue +++ b/uniapp/src/pages/channel/channel-manage.vue @@ -104,6 +104,16 @@ const loadData = async () => { } } catch (e) { console.log('获取用户频道配置失败=>', e) + const cachedIds = uni.getStorageSync(CHANNEL_STORAGE_KEY) + if (Array.isArray(cachedIds)) { + const cateMap = new Map(allCate.map((c: any) => [String(c.id), c])) + myChannels.value = cachedIds + .map((id: any) => cateMap.get(String(id))) + .filter(Boolean) + .map((item: any) => ({ ...item, fixed: false })) + filterRecommend() + return + } } } else { const cachedIds = uni.getStorageSync(CHANNEL_STORAGE_KEY) @@ -140,7 +150,7 @@ const filterRecommend = () => { : [] } -const toggleEdit = () => { +const toggleEdit = async () => { if (!isEditing.value && !userStore.isLogin) { uni.showModal({ title: '提示', @@ -155,7 +165,8 @@ const toggleEdit = () => { return } if (isEditing.value && changed.value) { - saveChannels() + const saved = await saveChannels() + if (!saved) return changed.value = false } isEditing.value = !isEditing.value @@ -170,7 +181,7 @@ const handleMyChannelClick = (index: number) => { changed.value = true } else { activeIndex.value = index - saveAndBack(index) + void saveAndBack(index) } } @@ -182,31 +193,36 @@ const handleAddChannel = (item: any) => { changed.value = true } -const saveChannels = () => { +const saveChannels = async () => { const channelIds = myChannels.value.filter(c => c.id).map(c => c.id) - if (userStore.isLogin) { - setUserChannels({ channel_ids: channelIds }).catch((e: any) => { - console.log('保存频道配置失败=>', e) - uni.showToast({ title: '保存失败', icon: 'none' }) - }) - } else { + try { + if (userStore.isLogin) { + await setUserChannels({ channel_ids: channelIds }) + } uni.setStorageSync(CHANNEL_STORAGE_KEY, channelIds) + return true + } catch (e) { + console.log('保存频道配置失败=>', e) + uni.showToast({ title: '保存失败', icon: 'none' }) + return false } } -const saveAndBack = (selectIndex?: number) => { +const saveAndBack = async (selectIndex?: number) => { if (changed.value) { - saveChannels() + const saved = await saveChannels() + if (!saved) return + changed.value = false } uni.$emit('channelChanged', { - channels: changed.value ? [...myChannels.value] : null, + channels: [...myChannels.value], selectIndex: selectIndex ?? -1 }) uni.navigateBack() } const handleBack = () => { - saveAndBack() + void saveAndBack() } onLoad(() => { diff --git a/uniapp/src/pages/index/index.vue b/uniapp/src/pages/index/index.vue index c423f75..d7c2fa1 100644 --- a/uniapp/src/pages/index/index.vue +++ b/uniapp/src/pages/index/index.vue @@ -133,6 +133,7 @@ import { onLoad, onShow, onUnload } from '@dcloudio/uni-app' import { computed, ref } from 'vue' import { getArticleList, getArticleCate } from '@/api/news' import { getMatchList } from '@/api/match' +import { getUserChannels } from '@/api/user' import { resolveShortLink } from '@/api/share' import { getLocalMatchDate } from '@/utils/match-time' import { useUserStore } from '@/stores/user' @@ -170,6 +171,8 @@ const MY_CHANNEL = { channelKey: '__mychannel__' } +const CHANNEL_STORAGE_KEY = 'user_my_channels' +const allArticleChannels = ref([]) const articleChannels = ref([]) const allChannels = ref([]) const currentChannel = ref(0) @@ -228,11 +231,42 @@ const findChannelIndexById = (id: any) => { }) } +const restoreChannelsByIds = (channels: any[], channelIds: any[]) => { + const channelMap = new Map((channels || []).map((item: any) => [String(item.id), item])) + return (channelIds || []) + .map((id: any) => channelMap.get(String(id))) + .filter(Boolean) +} + const loadChannels = async () => { try { - articleChannels.value = (await getArticleCate()) || [] + const userChannelsPromise = userStore.isLogin + ? getUserChannels().catch((error: any) => { + console.log('获取用户频道配置失败=>', error) + return null + }) + : Promise.resolve(null) + const [allChannelsData, userChannelsData] = await Promise.all([getArticleCate(), userChannelsPromise]) + const categoryList = allChannelsData || [] + allArticleChannels.value = categoryList + const cachedIds = uni.getStorageSync(CHANNEL_STORAGE_KEY) + + if (userStore.isLogin && Array.isArray((userChannelsData as any)?.channel_ids)) { + const channelIds = (userChannelsData as any).channel_ids + uni.setStorageSync(CHANNEL_STORAGE_KEY, channelIds) + articleChannels.value = restoreChannelsByIds(categoryList, channelIds) + } else if (userStore.isLogin && Array.isArray(cachedIds)) { + articleChannels.value = restoreChannelsByIds(categoryList, cachedIds) + } else if (!userStore.isLogin) { + articleChannels.value = Array.isArray(cachedIds) + ? restoreChannelsByIds(categoryList, cachedIds) + : categoryList + } else { + articleChannels.value = [] + } } catch (error) { console.log('获取分类失败=>', error) + allArticleChannels.value = [] articleChannels.value = [] } finally { syncAllChannels() @@ -346,7 +380,7 @@ const getArticleAuthor = (item: any) => { } const getArticleCategoryName = (item: any) => { - return articleChannels.value.find((channel) => String(channel.id) === String(item?.cid))?.name || '体育' + return allArticleChannels.value.find((channel) => String(channel.id) === String(item?.cid))?.name || '体育' } const formatRelativeTime = (time: string) => {