diff --git a/electron/set.json b/electron/set.json index 851b12a..ef6e712 100644 --- a/electron/set.json +++ b/electron/set.json @@ -1,5 +1,5 @@ { - "version": "0.0.1", + "version": "1.3.0", "isProxy": false, "author": "alger" } diff --git a/package.json b/package.json index 5398666..c518e2d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "alger-music", - "version": "1.2.0", + "version": "1.3.0", "description": "这是一个用于音乐播放的应用程序。", "author": "Alger ", "main": "app.js", diff --git a/src/api/music.ts b/src/api/music.ts index 4de9430..bf73f61 100644 --- a/src/api/music.ts +++ b/src/api/music.ts @@ -7,6 +7,11 @@ export const getMusicUrl = (id: number) => { return request.get("/song/url", { params: { id: id } }) } +// 获取歌曲详情 +export const getMusicDetail = (ids: Array) => { + return request.get("/song/detail", { params: { ids: ids.join(",")}}) +} + // 根据音乐Id获取音乐歌词 export const getMusicLrc = (id: number) => { return request.get("/lyric", { params: { id: id } }) diff --git a/src/components/common/SongItem.vue b/src/components/common/SongItem.vue index 5d280a5..de49fb4 100644 --- a/src/components/common/SongItem.vue +++ b/src/components/common/SongItem.vue @@ -45,6 +45,7 @@ import { useStore } from 'vuex' import type { SongResult } from '@/type/music' import { getImgUrl } from '@/utils' +import { useMusicHistory } from '@/hooks/MusicHistoryHook' const props = withDefaults(defineProps<{ item: SongResult @@ -66,12 +67,15 @@ const isPlaying = computed(() => { const emits = defineEmits(['play']) +const musicHistory = useMusicHistory() + // 播放音乐 设置音乐详情 打开音乐底栏 const playMusicEvent = (item: any) => { store.commit('setPlay', item) store.commit('setIsPlay', true) store.state.playListIndex = 0 emits('play', item) + musicHistory.addMusic(item) } diff --git a/src/hooks/MusicHistoryHook.ts b/src/hooks/MusicHistoryHook.ts new file mode 100644 index 0000000..afe2f51 --- /dev/null +++ b/src/hooks/MusicHistoryHook.ts @@ -0,0 +1,39 @@ +// musicHistoryHooks +import { RemovableRef, useLocalStorage } from '@vueuse/core' +import type { SongResult } from '@/type/music' + +export const useMusicHistory = () => { + const musicHistory = useLocalStorage('musicHistory', []) + + const addMusic = (music: SongResult) => { + const index = musicHistory.value.findIndex((item) => item.id === music.id) + if (index !== -1) { + musicHistory.value[index].count = + (musicHistory.value[index].count || 0) + 1 + musicHistory.value.unshift(musicHistory.value.splice(index, 1)[0]) + } else { + musicHistory.value.unshift({ ...music, count: 1 }) + } + } + + const delMusic = (music: any) => { + const index = musicHistory.value.findIndex((item) => item.id === music.id) + if (index !== -1) { + musicHistory.value.splice(index, 1) + } + } + const musicList = ref(musicHistory.value) + watch( + () => musicHistory.value, + () => { + musicList.value = musicHistory.value + } + ) + + return { + musicHistory, + musicList, + addMusic, + delMusic, + } +} diff --git a/src/router/home.ts b/src/router/home.ts index 4b2d164..c7b62ad 100644 --- a/src/router/home.ts +++ b/src/router/home.ts @@ -39,6 +39,16 @@ const layoutRouter = [ }, component: () => import('@/views/mv/index.vue'), }, + { + path: '/history', + name: 'history', + mate: { + title: '历史', + keepAlive: true, + icon: 'icon-a-TicketStar', + }, + component: () => import('@/views/history/index.vue'), + }, { path: '/user', name: 'user', diff --git a/src/type/music.ts b/src/type/music.ts index c2b6922..cd5b122 100644 --- a/src/type/music.ts +++ b/src/type/music.ts @@ -1,196 +1,197 @@ -export interface IRecommendMusic { - code: number; - category: number; - result: SongResult[]; -} - -export interface SongResult { - id: number; - type: number; - name: string; - copywriter?: any; - picUrl: string; - canDislike: boolean; - trackNumberUpdateTime?: any; - song: Song; - alg: string; -} - -interface Song { - name: string; - id: number; - position: number; - alias: string[]; - status: number; - fee: number; - copyrightId: number; - disc: string; - no: number; - artists: Artist[]; - album: Album; - starred: boolean; - popularity: number; - score: number; - starredNum: number; - duration: number; - playedNum: number; - dayPlays: number; - hearTime: number; - ringtone: string; - crbt?: any; - audition?: any; - copyFrom: string; - commentThreadId: string; - rtUrl?: any; - ftype: number; - rtUrls: any[]; - copyright: number; - transName?: any; - sign?: any; - mark: number; - originCoverType: number; - originSongSimpleData?: any; - single: number; - noCopyrightRcmd?: any; - rtype: number; - rurl?: any; - mvid: number; - bMusic: BMusic; - mp3Url?: any; - hMusic: BMusic; - mMusic: BMusic; - lMusic: BMusic; - exclusive: boolean; - privilege: Privilege; -} - -interface Privilege { - id: number; - fee: number; - payed: number; - st: number; - pl: number; - dl: number; - sp: number; - cp: number; - subp: number; - cs: boolean; - maxbr: number; - fl: number; - toast: boolean; - flag: number; - preSell: boolean; - playMaxbr: number; - downloadMaxbr: number; - rscl?: any; - freeTrialPrivilege: FreeTrialPrivilege; - chargeInfoList: ChargeInfoList[]; -} - -interface ChargeInfoList { - rate: number; - chargeUrl?: any; - chargeMessage?: any; - chargeType: number; -} - -interface FreeTrialPrivilege { - resConsumable: boolean; - userConsumable: boolean; -} - -interface BMusic { - name?: any; - id: number; - size: number; - extension: string; - sr: number; - dfsId: number; - bitrate: number; - playTime: number; - volumeDelta: number; -} - -interface Album { - name: string; - id: number; - type: string; - size: number; - picId: number; - blurPicUrl: string; - companyId: number; - pic: number; - picUrl: string; - publishTime: number; - description: string; - tags: string; - company: string; - briefDesc: string; - artist: Artist; - songs: any[]; - alias: string[]; - status: number; - copyrightId: number; - commentThreadId: string; - artists: Artist[]; - subType: string; - transName?: any; - onSale: boolean; - mark: number; - picId_str: string; -} - -interface Artist { - name: string; - id: number; - picId: number; - img1v1Id: number; - briefDesc: string; - picUrl: string; - img1v1Url: string; - albumSize: number; - alias: any[]; - trans: string; - musicSize: number; - topicPerson: number; -} - -export interface IPlayMusicUrl { - data: Datum[]; - code: number; -} - -interface Datum { - id: number; - url: string; - br: number; - size: number; - md5: string; - code: number; - expi: number; - type: string; - gain: number; - fee: number; - uf?: any; - payed: number; - flag: number; - canExtend: boolean; - freeTrialInfo?: any; - level: string; - encodeType: string; - freeTrialPrivilege: FreeTrialPrivilege; - freeTimeTrialPrivilege: FreeTimeTrialPrivilege; - urlSource: number; -} - -interface FreeTimeTrialPrivilege { - resConsumable: boolean; - userConsumable: boolean; - type: number; - remainTime: number; -} - -interface FreeTrialPrivilege { - resConsumable: boolean; - userConsumable: boolean; -} +export interface IRecommendMusic { + code: number; + category: number; + result: SongResult[]; +} + +export interface SongResult { + id: number + type: number + name: string + copywriter?: any + picUrl: string + canDislike: boolean + trackNumberUpdateTime?: any + song: Song + alg: string + count?: number +} + +interface Song { + name: string; + id: number; + position: number; + alias: string[]; + status: number; + fee: number; + copyrightId: number; + disc: string; + no: number; + artists: Artist[]; + album: Album; + starred: boolean; + popularity: number; + score: number; + starredNum: number; + duration: number; + playedNum: number; + dayPlays: number; + hearTime: number; + ringtone: string; + crbt?: any; + audition?: any; + copyFrom: string; + commentThreadId: string; + rtUrl?: any; + ftype: number; + rtUrls: any[]; + copyright: number; + transName?: any; + sign?: any; + mark: number; + originCoverType: number; + originSongSimpleData?: any; + single: number; + noCopyrightRcmd?: any; + rtype: number; + rurl?: any; + mvid: number; + bMusic: BMusic; + mp3Url?: any; + hMusic: BMusic; + mMusic: BMusic; + lMusic: BMusic; + exclusive: boolean; + privilege: Privilege; +} + +interface Privilege { + id: number; + fee: number; + payed: number; + st: number; + pl: number; + dl: number; + sp: number; + cp: number; + subp: number; + cs: boolean; + maxbr: number; + fl: number; + toast: boolean; + flag: number; + preSell: boolean; + playMaxbr: number; + downloadMaxbr: number; + rscl?: any; + freeTrialPrivilege: FreeTrialPrivilege; + chargeInfoList: ChargeInfoList[]; +} + +interface ChargeInfoList { + rate: number; + chargeUrl?: any; + chargeMessage?: any; + chargeType: number; +} + +interface FreeTrialPrivilege { + resConsumable: boolean; + userConsumable: boolean; +} + +interface BMusic { + name?: any; + id: number; + size: number; + extension: string; + sr: number; + dfsId: number; + bitrate: number; + playTime: number; + volumeDelta: number; +} + +interface Album { + name: string; + id: number; + type: string; + size: number; + picId: number; + blurPicUrl: string; + companyId: number; + pic: number; + picUrl: string; + publishTime: number; + description: string; + tags: string; + company: string; + briefDesc: string; + artist: Artist; + songs: any[]; + alias: string[]; + status: number; + copyrightId: number; + commentThreadId: string; + artists: Artist[]; + subType: string; + transName?: any; + onSale: boolean; + mark: number; + picId_str: string; +} + +interface Artist { + name: string; + id: number; + picId: number; + img1v1Id: number; + briefDesc: string; + picUrl: string; + img1v1Url: string; + albumSize: number; + alias: any[]; + trans: string; + musicSize: number; + topicPerson: number; +} + +export interface IPlayMusicUrl { + data: Datum[]; + code: number; +} + +interface Datum { + id: number; + url: string; + br: number; + size: number; + md5: string; + code: number; + expi: number; + type: string; + gain: number; + fee: number; + uf?: any; + payed: number; + flag: number; + canExtend: boolean; + freeTrialInfo?: any; + level: string; + encodeType: string; + freeTrialPrivilege: FreeTrialPrivilege; + freeTimeTrialPrivilege: FreeTimeTrialPrivilege; + urlSource: number; +} + +interface FreeTimeTrialPrivilege { + resConsumable: boolean; + userConsumable: boolean; + type: number; + remainTime: number; +} + +interface FreeTrialPrivilege { + resConsumable: boolean; + userConsumable: boolean; +} diff --git a/src/views/history/index.vue b/src/views/history/index.vue new file mode 100644 index 0000000..0bf0906 --- /dev/null +++ b/src/views/history/index.vue @@ -0,0 +1,45 @@ + + + + + \ No newline at end of file diff --git a/src/views/list/index.vue b/src/views/list/index.vue index 4ffe5e1..8497c21 100644 --- a/src/views/list/index.vue +++ b/src/views/list/index.vue @@ -97,7 +97,7 @@ watch(