-
-
+
请先登录后查看喜欢的音乐
-
加载中...
+
+
暂无喜欢的音乐
([]);
const loading = ref(true);
+const loadError = ref(false);
-async function loadData() {
+async function loadData(force = false) {
if (!userStore.isLoggedIn) {
loading.value = false;
return;
}
- const cached = pageCacheGet('favoriteSongs');
- if (cached) {
- songs.value = cached;
- loading.value = false;
- return;
+ if (!force) {
+ const cached = pageCacheGet('favoriteSongs');
+ if (cached) {
+ songs.value = cached;
+ loading.value = false;
+ loadError.value = false;
+ return;
+ }
}
loading.value = true;
try {
+ loadError.value = false;
const playlistJson: string = await MusicApi.userPlaylist(userStore.user!.userId);
const playlistData = JSON.parse(playlistJson);
const created = (playlistData.playlist || []).filter((p: any) => !p.subscribed);
@@ -85,6 +98,7 @@ async function loadData() {
pageCacheSet('favoriteSongs', songs.value);
} catch (e) {
console.error(e);
+ loadError.value = true;
} finally {
loading.value = false;
}
@@ -93,10 +107,14 @@ async function loadData() {
onMounted(loadData);
onActivated(() => {
- if (pageCacheIsStale('favoriteSongs')) loadData();
+ if (loadError.value) {
+ loadData(true);
+ } else if (pageCacheIsStale('favoriteSongs')) {
+ loadData();
+ }
});
-watch(isOnline, (val, old) => {
+watch(() => navigator.onLine, (val, old) => {
if (val && !old && userStore.isLoggedIn && songs.value.length === 0) {
pageCacheInvalidate('favoriteSongs');
loadData();
diff --git a/src/views/Home.vue b/src/views/Home.vue
index c86aa29..3f807e8 100644
--- a/src/views/Home.vue
+++ b/src/views/Home.vue
@@ -71,15 +71,37 @@
-
+
🎯 为你推荐
-
+
+
+
+
+
+
+
+
+
{{ pl.name }}
-
{{ pl.copywriter || '' }}
+
{{ pl.copywriter || pl.description || '' }}
@@ -88,12 +110,34 @@
📈 热门歌单
-
+
+
+
+
+
+
+
+
+
{{ pl.name }}
+
{{ pl.description || pl.copywriter }}
@@ -119,7 +163,11 @@ const userStore = useUserStore();
const { isOnline } = useOnlineStatus();
const rankPlaylists = ref
([]);
+const rankLoading = ref(false);
+const rankError = ref(false);
const recPlaylists = ref([]);
+const recLoading = ref(false);
+const recError = ref(false);
const todayStr = ref('');
const RANK_IDS = [3778678, 3779629, 19723756, 2884035];
@@ -160,6 +208,56 @@ function onFmCardClick() {
player.openRoamDrawer();
}
+async function fetchRankPlaylists() {
+ const cacheKey = 'home_rank';
+ const cached = pageCacheGet(cacheKey);
+ if (cached) {
+ rankPlaylists.value = cached;
+ return;
+ }
+ rankLoading.value = true;
+ rankError.value = false;
+ try {
+ const results = await Promise.allSettled(
+ RANK_IDS.map(id => MusicApi.getPlaylistDetail(id))
+ );
+ rankPlaylists.value = results
+ .filter(r => r.status === 'fulfilled')
+ .map((r: any) => {
+ const data = JSON.parse(r.value);
+ return data.playlist;
+ })
+ .filter(Boolean);
+ pageCacheSet(cacheKey, rankPlaylists.value);
+ } catch {
+ rankError.value = true;
+ } finally {
+ rankLoading.value = false;
+ }
+}
+
+async function fetchRecPlaylists() {
+ if (!userStore.isLoggedIn) return;
+ const cacheKey = 'home_rec';
+ const cached = pageCacheGet(cacheKey);
+ if (cached) {
+ recPlaylists.value = cached;
+ return;
+ }
+ recLoading.value = true;
+ recError.value = false;
+ try {
+ const json = await MusicApi.recommendResource();
+ const data = JSON.parse(json as string);
+ recPlaylists.value = data.recommend || [];
+ pageCacheSet(cacheKey, recPlaylists.value);
+ } catch {
+ recError.value = true;
+ } finally {
+ recLoading.value = false;
+ }
+}
+
async function loadData() {
const cached = pageCacheGet('home');
if (cached) {
@@ -168,26 +266,8 @@ async function loadData() {
return;
}
- const results = await Promise.allSettled(
- RANK_IDS.map(id => MusicApi.getPlaylistDetail(id))
- );
- rankPlaylists.value = results
- .filter(r => r.status === 'fulfilled')
- .map((r: any) => {
- const data = JSON.parse(r.value);
- return data.playlist;
- })
- .filter(Boolean);
-
- if (userStore.isLoggedIn) {
- try {
- const json = await MusicApi.recommendResource();
- const data = JSON.parse(json as string);
- recPlaylists.value = data.recommend || [];
- } catch { /* 忽略 */ }
- }
-
- pageCacheSet('home', { rankPlaylists: rankPlaylists.value, recPlaylists: recPlaylists.value });
+ fetchRankPlaylists();
+ fetchRecPlaylists();
}
onMounted(async () => {
@@ -201,9 +281,22 @@ onActivated(() => {
});
watch(isOnline, (val, old) => {
- if (val && !old && rankPlaylists.value.length === 0 && recPlaylists.value.length === 0) {
- pageCacheInvalidate('home');
- loadData();
+ if (val && !old) {
+ if (rankPlaylists.value.length === 0 && recPlaylists.value.length === 0) {
+ pageCacheInvalidate('home');
+ pageCacheInvalidate('home_rank');
+ pageCacheInvalidate('home_rec');
+ loadData();
+ } else {
+ if (rankError.value) {
+ pageCacheInvalidate('home_rank');
+ fetchRankPlaylists();
+ }
+ if (recError.value) {
+ pageCacheInvalidate('home_rec');
+ fetchRecPlaylists();
+ }
+ }
}
});
diff --git a/src/views/LocalMusic.vue b/src/views/LocalMusic.vue
index d23fbac..e141ee9 100644
--- a/src/views/LocalMusic.vue
+++ b/src/views/LocalMusic.vue
@@ -1,19 +1,37 @@
-
-
+
本地音乐
{{ songs.length }} 首
-
+
+
+
+
+
+
+
+
+ 请先添加要扫描的文件夹
-
加载中...
当前文件夹下没有音乐文件,支持 mp3、flac、wav、ogg、aac、m4a 格式
@@ -32,42 +50,46 @@
>
{{ formatFileSize(songs[index].fileSize) }}
-
-
-
-
-
-
-
-
+
-
-
-
确认删除
-
确定要删除「{{ deleteTarget?.name }}」吗?此操作不可撤销。
-
-
-