Skip to content

Commit e62c81b

Browse files
committed
🐞 fix: 修复电台未加载全部节目
1 parent 984fdb3 commit e62c81b

File tree

6 files changed

+59
-55
lines changed

6 files changed

+59
-55
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
</div>
77
<br /> -->
88

9+
# SPlayer
10+
11+
> 一个简约的音乐播放器
12+
913
![main](/screenshots/SPlayer.jpg)
1014

1115
## 说明

src/components/List/SongList.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
alignItems: 'center',
3333
justifyContent: 'space-between',
3434
}"
35-
:class="music.getPlaySongData?.id === item?.id ? 'songs play' : 'songs'"
35+
:class="Number(music.getPlaySongData?.id) === Number(item?.id) ? 'songs play' : 'songs'"
3636
hoverable
3737
@click="checkCanClick(data, item, songsIndex + index)"
3838
@dblclick.stop="playSong(data, item, songsIndex + index)"
@@ -190,7 +190,7 @@
190190
</div>
191191
<!-- 更新日期 -->
192192
<n-text v-if="type === 'dj' && item.updateTime" class="update hidden" depth="3">
193-
{{ getTimestampTime(item.updateTime, false) }}
193+
{{ djFormatDate(item.updateTime) }}
194194
</n-text>
195195
<!-- 播放量 -->
196196
<n-text v-if="type === 'dj' && item.playCount" class="count hidden" depth="3">
@@ -273,7 +273,7 @@ import { setCloudDel } from "@/api/cloud";
273273
import { addSongToPlayList } from "@/api/playlist";
274274
import { siteData, siteSettings, musicData, siteStatus } from "@/stores";
275275
import { initPlayer, fadePlayOrPause, addSongToNext } from "@/utils/Player";
276-
import { getTimestampTime } from "@/utils/timeTools";
276+
import { djFormatDate } from "@/utils/timeTools";
277277
278278
const router = useRouter();
279279
const music = musicData();

src/utils/Player.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ export const initPlayer = async (playNow = false) => {
4242
const { playList } = music;
4343
// 当前播放歌曲数据
4444
const playSongData = music.getPlaySongData;
45-
// 若为电台则更改 id
46-
playSongData.id = playMode === "dj" ? playSongData.mainTrackId : playSongData.id;
4745
// 是否为本地歌曲
4846
const isLocalSong = playSongData?.path ? true : false;
4947
console.log("当前为本地歌曲");

src/utils/formatData.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,7 @@ const formatData = (data, type = "playlist", noTracks = false) => {
112112
// dj
113113
case "dj":
114114
return {
115-
id: v.id || v.vid,
116-
mainTrackId: v.mainTrackId,
115+
id: v.mainTrackId || v.id || v.vid,
117116
name: v.name,
118117
creator: v.dj,
119118
count: v.programCount,

src/utils/timeTools.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,31 @@ export const getCommentTime = (t) => {
106106
}${userDate.getDate()}${UH}:${Um}`;
107107
}
108108
};
109+
110+
/**
111+
* 电台时间戳格式化
112+
* @param {number} timestamp - 要格式化的时间戳(毫秒)
113+
* @returns {string} - 格式化后的日期描述
114+
*/
115+
export const djFormatDate = (timestamp) => {
116+
const now = new Date();
117+
const targetDate = new Date(timestamp);
118+
const timeDiff = now - targetDate;
119+
const oneDay = 24 * 60 * 60 * 1000; // 一天的毫秒数
120+
const daysDiff = Math.floor(timeDiff / oneDay);
121+
// 数字补零
122+
const formatNumber = (num) => {
123+
return num < 10 ? `0${num}` : num;
124+
};
125+
if (daysDiff === 0) {
126+
return "今日";
127+
} else if (daysDiff === 1) {
128+
return "昨日";
129+
} else if (daysDiff <= 7) {
130+
return `${daysDiff}天前`;
131+
} else if (targetDate.getFullYear() === now.getFullYear() - 1) {
132+
return `${targetDate.getFullYear()}-${formatNumber(targetDate.getMonth() + 1)}`;
133+
} else {
134+
return `${formatNumber(targetDate.getMonth() + 1)}-${formatNumber(targetDate.getDate())}`;
135+
}
136+
};

src/views/List/dj.vue

Lines changed: 23 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,6 @@
171171
<Transition name="fade" mode="out-in">
172172
<div v-if="!searchValue" class="song-list">
173173
<SongList :data="djData" type="dj" />
174-
<!-- 分页 -->
175-
<Pagination
176-
v-if="djData?.length"
177-
:totalCount="totalCount"
178-
:pageNumber="pageNumber"
179-
@pageNumberChange="pageNumberChange"
180-
/>
181174
</div>
182175
<SongList v-else-if="searchData?.length" :data="searchData" type="dj" />
183176
<n-empty
@@ -209,7 +202,7 @@
209202
import { NIcon } from "naive-ui";
210203
import { useRouter } from "vue-router";
211204
import { storeToRefs } from "pinia";
212-
import { siteData, siteSettings } from "@/stores";
205+
import { siteData } from "@/stores";
213206
import { getDjDetail, getDjProgram, likeDj } from "@/api/dj";
214207
import { fuzzySearch } from "@/utils/helper";
215208
import { isLogin } from "@/utils/auth";
@@ -221,20 +214,17 @@ import SvgIcon from "@/components/Global/SvgIcon";
221214
222215
const router = useRouter();
223216
const data = siteData();
224-
const settings = siteSettings();
225217
const { userLikeData } = storeToRefs(data);
226-
const { loadSize } = storeToRefs(settings);
227218
228219
// 电台数据
229220
const djId = ref(router.currentRoute.value.query.id);
230-
const pageNumber = ref(Number(router.currentRoute.value.query?.page) || 1);
231221
const djDetail = ref(null);
232222
const djData = ref(null);
233223
234224
// 模糊搜索数据
225+
const loadingMsg = ref(null);
235226
const searchValue = ref(null);
236227
const searchData = ref([]);
237-
const totalCount = ref(0);
238228
239229
// 图标渲染
240230
const renderIcon = (icon) => {
@@ -267,23 +257,36 @@ const getDjDetailData = async (id) => {
267257
const detail = await getDjDetail(id);
268258
// 基础信息
269259
djDetail.value = formatData(detail.data, "dj")[0];
260+
// 获取节目
261+
await getDjProgramData(djId.value, djDetail.value?.count);
270262
} catch (error) {
271263
console.error("获取电台信息出错:", error);
272264
$message.error("获取电台信息出现错误");
273265
}
274266
};
275267
276268
// 获取电台全部节目
277-
const getDjProgramData = async (id, limit = loadSize.value, offset = 0) => {
269+
const getDjProgramData = async (id, count) => {
278270
try {
271+
if (count === 0) return (djData.value = "empty");
272+
// 是否为超大歌单
273+
if (count >= 500) {
274+
loadingMsg.value = $message.loading("该电台节目数量过多,请稍等", {
275+
duration: 0,
276+
});
277+
}
278+
// 循环获取
279+
let offset = 0;
279280
djData.value = [];
280-
const result = await getDjProgram(id, limit, offset);
281-
console.log(result);
282-
// 数据总数
283-
totalCount.value = result.count;
284-
if (totalCount.value === 0) return (djData.value = "empty");
285-
// 处理数据
286-
djData.value = formatData(result.programs, "dj");
281+
while (count === null || offset < count) {
282+
const result = await getDjProgram(id, 500, offset);
283+
const djDetail = formatData(result.programs, "dj");
284+
djData.value = djData.value.concat(djDetail);
285+
offset += 500;
286+
}
287+
// 关闭加载提示
288+
loadingMsg.value?.destroy();
289+
loadingMsg.value = null;
287290
} catch (error) {
288291
console.error("获取电台节目错误:", error);
289292
$message.error("获取电台节目出现错误");
@@ -330,36 +333,8 @@ const likeOrDislike = debounce(async (id) => {
330333
}
331334
}, 300);
332335
333-
// 页数变化
334-
const pageNumberChange = (page) => {
335-
router.push({
336-
path: "/dj",
337-
query: { id: djId.value, page },
338-
});
339-
};
340-
341-
// 监听路由变化
342-
watch(
343-
() => router.currentRoute.value,
344-
async (val) => {
345-
if (val.name === "dj") {
346-
// 更改参数
347-
pageNumber.value = Number(val.query?.page) || 1;
348-
djId.value = val.query?.id;
349-
// 调用接口
350-
await getDjDetailData(djId.value);
351-
await getDjProgramData(
352-
djId.value,
353-
loadSize.value,
354-
(pageNumber.value - 1) * settings.loadSize,
355-
);
356-
}
357-
},
358-
);
359-
360336
onMounted(async () => {
361337
await getDjDetailData(djId.value);
362-
await getDjProgramData(djId.value, loadSize.value, (pageNumber.value - 1) * settings.loadSize);
363338
});
364339
</script>
365340

0 commit comments

Comments
 (0)