From a2b7224b904c29016d760fd67af9a3f6b85bf0f7 Mon Sep 17 00:00:00 2001 From: sunlian Date: Wed, 28 Aug 2024 09:55:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sunlian --- scenario/MusicPlayerOnline/README_zh.md | 87 +++++++++ .../src/main/ets/manager/PlayerManager.ets | 17 ++ .../src/main/ets/manager/ServerConstants.ets | 7 +- .../entry/src/main/ets/model/AudioItem.ets | 1 + .../entry/src/main/ets/pages/Index.ets | 177 +++++++----------- .../entry/src/main/ets/view/PlayerDetail.ets | 71 +++---- .../base/media/folder_badge_plus.png | Bin 0 -> 577 bytes .../src/main/resources/base/media/heart.png | Bin 0 -> 1136 bytes .../main/resources/base/media/heart_fill.png | Bin 0 -> 757 bytes .../base/media/ic_public_comments.png | Bin 492 -> 0 bytes .../resources/base/media/ic_public_favor.png | Bin 899 -> 0 bytes .../resources/base/media/ic_public_share.png | Bin 448 -> 0 bytes 12 files changed, 196 insertions(+), 164 deletions(-) create mode 100644 scenario/MusicPlayerOnline/entry/src/main/resources/base/media/folder_badge_plus.png create mode 100644 scenario/MusicPlayerOnline/entry/src/main/resources/base/media/heart.png create mode 100644 scenario/MusicPlayerOnline/entry/src/main/resources/base/media/heart_fill.png delete mode 100644 scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_comments.png delete mode 100644 scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_favor.png delete mode 100644 scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_share.png diff --git a/scenario/MusicPlayerOnline/README_zh.md b/scenario/MusicPlayerOnline/README_zh.md index cfd937c08..21d852e58 100644 --- a/scenario/MusicPlayerOnline/README_zh.md +++ b/scenario/MusicPlayerOnline/README_zh.md @@ -16,6 +16,93 @@ 1)运行应用手工测试,检查应用是否正确运行及内容是否正确 2)通过DevEco 测试框架自动化执行测试套并查看结果和测试log +### 功能列表 + +#### 已开发功能: + 1. 首页 + 1.1 未登录【推荐歌单】:内容由服务器控制 + 1.2 登录状态的【推荐歌单】:最近播放、我的收藏,由服务器控制 + 1.3 登录状态的【我的歌单】 + 1.4 点击歌单播放,弹窗提示 + 1.5 播放状态条 + 1.5.1 封面图片及动画 + 1.5.2 歌名及歌手 + 1.5.3 播放/暂停按钮 + 1.5.4 播放进度条(围绕播放按钮的环形) + 1.5.5 播放列表按钮 + 1.6 搜索框 (未实现功能) + 1.7 设置按钮 (未实现功能) + 1.8 登录/登出按钮 (目前使用固定测试账号) + 1.9 登录用户名显示及动画 + 1.10 登录状态下播放记录,用于展示在最近播放歌单 + 1.11 下拉刷新 + + 2.播放详情页 + 2.1 歌单标题 + 2.2 收起播放详情按钮 + 2.3 加入歌单按钮 (未实现功能) + 2.4 歌曲封面及动画 + 2.5 歌名 + 2.6 歌手 + 2.7 收藏按钮 (目前仅展示,只能在网页端收藏) + 2.8 播放进度条 + 2.9 已播放时间 + 2.10 歌曲时长 + 2.11 播放模式切换按钮 + 2.12 上一首按钮 + 2.13 播放/暂停按钮 + 2.14 下一首按钮 + 2.15 播放列表按钮 + 2.16 点击播放详情中间区域切换:封面动画<->歌词,歌词界面标题展示歌名和歌手,不展示歌单名 + + 3. 播放列表页 + 3.1 播放列表名称 + 3.2 歌曲列表 + 3.2.1 歌曲封面图片 + 3.2.2 歌曲名称 + 3.2.3 歌手名称 + 3.3 播放中歌曲背景高亮 + 3.4 点击歌曲换歌 + + 4.其他 + 4.1 播放列表界面,按返回键回到首页及动画 + 4.2 播放详情界面,按返回键回到首页及动画 + 4.3 播放详情时打开播放列表,按返回键回到播放详情 + 4.4 播放列表数据刷新动画 + 4.5 后台播放 + 4.6 登录状态持久化:重启设备后保持登录状态 + +#### 计划功能: + 1. 首页搜索歌曲 + 2. 搜索歌曲展示 + 3. 搜索歌曲展示页点击播放 + 4. 歌曲详情页收藏/取消收藏功能 + 5. 歌单 + 5.1 从歌曲详情页加入创建并加入歌单 + 5.2 从歌曲详情页加入已有歌单 + 5.3 删除歌单 + 5.4 从歌单删除歌曲 + 5.5 歌单改名 + 6. 登录注册页面 + 7. 每日推荐歌单 + 8. 播放模式 + 9. 进度条拖动 + 10. 其他设置 + 11. 歌词 + 12. 桌面播放卡片 + 13. 歌曲分类及搜索 + 14. 其他平台歌曲推荐、播放 + +#### 未计划功能: + 1. 社交(用户信息,好友,分享,评论) + 2. 数据分析(统计播放历史、排行榜、歌曲偏好等) + 3. 修改密码,忘记密码,手机号注册等 + 4. 安全(传输加密) + +#### 已开发用例 + 详见用例文档:[ohosTest.md](ohosTest.md) + + ### 效果预览 | 主页 | 播放详情 | 播放列表 | 未登录 | diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets index b90cff91c..5bd7ac91c 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets @@ -29,6 +29,7 @@ export default class PlayerManager { private isSeek: boolean = false; private avPlayer: media.AVPlayer | undefined = undefined; private list: AudioItem[] = []; + private favourList: AudioItem[] = []; private currentTime: number = 0; private currentDuration: number = 0; private item: AudioItem = new AudioItem('', '', ''); @@ -165,6 +166,14 @@ export default class PlayerManager { } Logger.info(this.tag, 'Play :' + this.listPosition.toString()); this.item = this.list[this.listPosition] + let isFavor = false; + for (let favorItem of this.favourList) { + if (this.item.id === favorItem.id) { + isFavor = true; + break; + } + } + this.item.isFavor = isFavor; this.avPlayerLive(ServerConstants.PLAY_SONG_URL + this.item.id); } @@ -257,6 +266,14 @@ export default class PlayerManager { this.avPlayer.url = url; } + clearFavourList() { + this.favourList = []; + } + + setFavourList(list: AudioItem[]) { + this.favourList = list; + } + record_recent() { let loginCookie: string | undefined = AppStorage.get('loginCookie'); if (loginCookie === '' || loginCookie === undefined) { diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets index 32dfd686e..3679cae61 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets @@ -29,6 +29,10 @@ export default class ServerConstants { * custom list URL */ static readonly CUSTOM_LIST_URL = this.SERVER_HOST + 'get_playlists/'; + /** + * custom list URL + */ + static readonly RECOMMEND_LIST_URL = this.SERVER_HOST + 'get_recommend_playlists/'; /** * English songs URL */ @@ -74,9 +78,6 @@ export default class ServerConstants { /** * PLAYER LIST */ - static readonly LIST_DEFAULT_ALL = '全部歌曲'; - static readonly LIST_DEFAULT_ENG = '英文歌曲'; - static readonly LIST_DEFAULT_RECENT = '最近播放'; static readonly LIST_SONG_COUNT = '首'; /** * PLAYER LOGIN diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/model/AudioItem.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/model/AudioItem.ets index cf2a9fe8a..86c0a50d8 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/model/AudioItem.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/model/AudioItem.ets @@ -22,6 +22,7 @@ export default class AudioItem { artist: string = ''; id: string = '0' isPlaying: boolean = false; + isFavor: boolean = false; constructor(title: string, artist: string, id:string) { this.title = title; diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets index c768e0a77..4806896b5 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets @@ -24,6 +24,7 @@ import PlayListData from '../model/PlayListData'; import PlayerDetail from '../view/PlayerDetail'; import emitter from '@ohos.events.emitter'; import prompt from '@ohos.promptAction'; +import PlayerManager from '../manager/PlayerManager'; PersistentStorage.persistProp('loginCookie', ''); PersistentStorage.persistProp('loginName', ServerConstants.LOGIN_INFO_NO); @@ -31,7 +32,8 @@ PersistentStorage.persistProp('loginName', ServerConstants.LOGIN_INFO_NO); @Entry @Component struct Index { - @State playLists: PlayListData[] = [] + private PlayerManager: PlayerManager = AppStorage.get('PlayerManager') as PlayerManager; + @State recommendPlayLists: PlayListData[] = [] @State customPlayLists: PlayListData[] = [] @State isShowPlayerDetail: boolean = false; @State isShowPlayList: boolean = false; @@ -59,7 +61,7 @@ struct Index { aboutToAppear(): void { let loginName: string | undefined = AppStorage.get('loginName'); - this.getListFromServer(); + this.getRecommendListFromServer(); if (loginName != ServerConstants.LOGIN_INFO_NO) { this.loginInfo = loginName + ServerConstants.LOGIN_INFO_DONE; this.loginButton = ServerConstants.LOGIN_BUTTON_OUT; @@ -150,19 +152,19 @@ struct Index { .width('90%') .margin(12) - Grid() { - ForEach(this.playLists, (item: PlayListData) => { - GridItem() { - PlayListItem({ item }) - } - .transition({ type: TransitionType.All, opacity: 0 }) - }) + Scroll() { + Row() { + ForEach(this.recommendPlayLists, (item: PlayListData) => { + PlayListItem({ item }).margin(12) + .transition({ type: TransitionType.All, opacity: 0 }) + }) + } + .margin(12) } - .margin(12) - .columnsTemplate('1fr 1fr 1fr') - .columnsGap(8) - .rowsGap(12) - .width('90%') + .scrollable(ScrollDirection.Horizontal) + .scrollBar(BarState.Off) + .edgeEffect(EdgeEffect.Spring) + .width('100%') Row() { Text($r('app.string.my_list')) @@ -201,7 +203,7 @@ struct Index { .margin({ bottom: 72 }) }.onRefreshing(() => { setTimeout(() => { - this.getListFromServer(); + this.getRecommendListFromServer(); if (this.loginInfo != ServerConstants.LOGIN_INFO_NO) { this.getCustomListFromServer(); } else { @@ -277,102 +279,6 @@ struct Index { } } - getListFromServer() { - animateTo({ duration: 2000 }, () => { - this.playLists = []; - }) - try { - this.httpRequest.request(ServerConstants.ALL_SONGS_URL, (err: Error, data: http.HttpResponse) => { - if (!err) { - console.info('HttpResponse Result:' + data.result); - let aPlayingList: AudioItem[] = Array(); - const jsonObject: object = JSON.parse(data.result as string); - Object.keys(jsonObject).forEach((key) => { - aPlayingList.push(new AudioItem(jsonObject[key].name, jsonObject[key].singer, jsonObject[key].id)); - }); - animateTo({ duration: 1000 }, () => { - this.playLists.push(new PlayListData(ServerConstants.LIST_DEFAULT_ALL, $r('app.media.icon'), aPlayingList.length + ServerConstants.LIST_SONG_COUNT, - aPlayingList, '')); - }) - console.info('HttpResponse code:' + data.responseCode); - console.info('HttpResponse type:' + JSON.stringify(data.resultType)); - console.info('HttpResponse header:' + JSON.stringify(data.header)); - console.info('HttpResponse cookies:' + data.cookies); - - } else { - console.info('HttpResponse error:' + JSON.stringify(err)); - } - }); - } catch (err) { - console.info('HttpRequest error:' + JSON.stringify(err)); - } - try { - this.httpRequest.request(ServerConstants.ENGLISH_SONGS_URL, (err: Error, data: http.HttpResponse) => { - if (!err) { - console.info('HttpResponse Result:' + data.result); - let aPlayingList: AudioItem[] = Array(); - const jsonObject: object = JSON.parse(data.result as string); - Object.keys(jsonObject).forEach((key) => { - aPlayingList.push(new AudioItem(jsonObject[key].name, jsonObject[key].singer, jsonObject[key].id)); - }); - animateTo( - {duration: 1000}, - () => { - this.playLists.push(new PlayListData(ServerConstants.LIST_DEFAULT_ENG, $r('app.media.icon'), aPlayingList.length + ServerConstants.LIST_SONG_COUNT, - aPlayingList, '')); - }) - console.info('HttpResponse code:' + data.responseCode); - console.info('HttpResponse type:' + JSON.stringify(data.resultType)); - console.info('HttpResponse header:' + JSON.stringify(data.header)); - console.info('HttpResponse cookies:' + data.cookies); - } else { - console.info('HttpResponse error:' + JSON.stringify(err)); - } - }); - } catch (err) { - console.info('HttpRequest error:' + JSON.stringify(err)); - } - if (this.loginInfo != ServerConstants.LOGIN_INFO_NO) { - let loginCookie: string | undefined = AppStorage.get('loginCookie'); - if (loginCookie === '' || loginCookie === undefined) { - return; - } - try { - this.httpRequest.request(ServerConstants.RECENT_SONGS_URL, - { - method: http.RequestMethod.GET, - header: { - 'Cookie': loginCookie - } - }, - (err: Error, data: http.HttpResponse) => { - if (!err) { - console.info('HttpResponse Recent Result:' + data.result); - let aPlayingList: AudioItem[] = Array(); - const jsonObject: object = JSON.parse(data.result as string); - Object.keys(jsonObject).forEach((key) => { - aPlayingList.push(new AudioItem(jsonObject[key].name, jsonObject[key].singer, jsonObject[key].id)); - }); - animateTo( - {duration: 1000}, - () => { - this.playLists.push(new PlayListData(ServerConstants.LIST_DEFAULT_RECENT, $r('app.media.icon'), aPlayingList.length + ServerConstants.LIST_SONG_COUNT, - aPlayingList, '')); - }) - console.info('HttpResponse code:' + data.responseCode); - console.info('HttpResponse type:' + JSON.stringify(data.resultType)); - console.info('HttpResponse header:' + JSON.stringify(data.header)); - console.info('HttpResponse cookies:' + data.cookies); - } else { - console.info('HttpResponse error:' + JSON.stringify(err)); - } - }); - } catch (err) { - console.info('HttpRequest error:' + JSON.stringify(err)); - } - } - } - logout() { AppStorage.setOrCreate('loginName', ServerConstants.LOGIN_INFO_NO); AppStorage.setOrCreate('loginCookie', ''); @@ -381,7 +287,7 @@ struct Index { this.loginButton = ServerConstants.LOGIN_BUTTON_IN; this.loginInfo = ServerConstants.LOGIN_INFO_NO; }) - this.getListFromServer(); + this.getRecommendListFromServer(); //TODO request logout from server } @@ -428,7 +334,7 @@ struct Index { animateTo({ duration: 2000 }, () => { this.loginButton = ServerConstants.LOGIN_BUTTON_OUT; }) - this.getListFromServer(); + this.getRecommendListFromServer(); this.getCustomListFromServer(); } else { console.info('HttpResponse error:' + JSON.stringify(err)); @@ -456,6 +362,51 @@ struct Index { this.loginButtonClickable = true; } + getRecommendListFromServer() { + animateTo({ duration: 2000 }, () => { + this.recommendPlayLists = []; + this.PlayerManager.clearFavourList(); + }) + try { + this.httpRequest.request(ServerConstants.RECOMMEND_LIST_URL, + { + method: http.RequestMethod.GET, + header: { + 'Cookie': AppStorage.get('loginCookie') + } + }, + (err: Error, data: http.HttpResponse) => { + if (!err) { + console.info('HttpResponse getRecommendListFromServer Result:' + data.result); + const jsonObject: object = JSON.parse(data.result as string); + Object.keys(jsonObject).forEach((key) => { + let aPlayingList: AudioItem[] = Array(); + Object.keys(jsonObject[key]).forEach((key2) => { + aPlayingList.push(new AudioItem(jsonObject[key][key2].name, jsonObject[key][key2].singer, jsonObject[key][key2].id)); + }); + animateTo( + { duration: 1000 }, + () => { + this.recommendPlayLists.push(new PlayListData(key, $r('app.media.icon'), aPlayingList.length + ServerConstants.LIST_SONG_COUNT, + aPlayingList, '')); + }) + if (key === '我的收藏') { + this.PlayerManager.setFavourList(aPlayingList); + } + }); + console.info('HttpResponse code:' + data.responseCode); + console.info('HttpResponse type:' + JSON.stringify(data.resultType)); + console.info('HttpResponse header:' + JSON.stringify(data.header)); + console.info('HttpResponse cookies:' + data.cookies); + } else { + console.info('HttpResponse error:' + JSON.stringify(err)); + } + }); + } catch (err) { + console.info('HttpRequest error:' + JSON.stringify(err)); + } + } + getCustomListFromServer() { animateTo({ duration: 2000 }, () => { this.customPlayLists = []; diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerDetail.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerDetail.ets index 14e199bb3..6c171a567 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerDetail.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerDetail.ets @@ -28,15 +28,15 @@ import AudioItem from '../model/AudioItem'; export default struct PlayerDetail { private tag: string = 'PlayerDetail'; private PlayerManager: PlayerManager = AppStorage.get('PlayerManager') as PlayerManager; - @State item:AudioItem = this.PlayerManager.getItem(); + @State item: AudioItem = this.PlayerManager.getItem(); @State listTitle: string = this.PlayerManager.getListTitle(); - @State durationTime: number= 0; + @State durationTime: number = 0; @State currentTime: number = 0; // 当前时间 @State state: string = this.PlayerManager.getState(); // 播放状态 @State rotateAngle: number = 0; @State subCurrentIndex: number = 0; @State lrcIndex: number = 0 - @State lrc: LrcLine[]= []; + @State lrc: LrcLine[] = []; @State contentSwitch: boolean = true; @Link isShowPlayList: boolean; @Link isShowPlayerDetail: boolean; @@ -74,9 +74,9 @@ export default struct PlayerDetail { this.currentTime = eventData.data.currentTime; this.durationTime = eventData.data.currentDuration; let newLrcIndex = Math.floor(this.currentTime * this.lrc.length / this.durationTime); - if (newLrcIndex !== this.lrcIndex){ + if (newLrcIndex !== this.lrcIndex) { this.lrcIndex = newLrcIndex; - this.scroller.scrollToIndex(this.lrcIndex-5, true) + this.scroller.scrollToIndex(this.lrcIndex - 5, true) } } }); @@ -135,27 +135,16 @@ export default struct PlayerDetail { Text(this.item.title).fontSize('18fp') .maxLines(1) .id('detail_title2') - Row() { - Text(this.item.artist).fontSize('14fp') - .fontColor('#a0a0a0') - .id('detail_title3') - Text('关注') - .fontSize('14fp') - .borderRadius('8vp') - .backgroundColor('#22a0a0a0') - .margin('4vp') - .padding({ right: '4vp', left: '4vp' }) - Image($r('app.media.ic_public_arrow_right_grey')) - .width('8vp') - .height('16vp') - } + Text(this.item.artist).fontSize('14fp') + .fontColor('#a0a0a0') + .id('detail_title3') } } .justifyContent(FlexAlign.Center) .height('60vp') .width('70%') - Image($r('app.media.ic_public_share')) + Image($r('app.media.folder_badge_plus')) .height('32vp') .width('32vp') } @@ -183,38 +172,24 @@ export default struct PlayerDetail { Column() { Text(this.item.title).fontSize('18fp') .id('detail_title4') - Row() { - Text(this.item.artist).fontSize('16fp') - .fontColor('#303030') - .id('detail_title5') - Text('关注') - .fontSize('14fp') - .fontColor('#303030') - .backgroundColor('#f0f0f0') - .borderRadius('6vp') - .padding({ left: '4vp', right: '4vp' }) - } + Text(this.item.artist).fontSize('16fp') + .fontColor('#303030') + .id('detail_title5') }.alignItems(HorizontalAlign.Start) Blank() Stack() { - Image($r('app.media.ic_public_favor')) - .width('36vp') - .height('36vp') - Text('100w+').fontSize('10fp') - .backgroundColor('#ffffff') - .margin({ left: '24vp' }) + if (this.item.isFavor) { + Image($r('app.media.heart_fill')) + .width('36vp') + .height('36vp') + } else { + Image($r('app.media.heart')) + .width('36vp') + .height('36vp') + } }.alignContent(Alignment.Top) .margin({ right: '8vp' }) - - Stack() { - Image($r('app.media.ic_public_comments')) - .width('36vp') - .height('36vp') - Text('10w+').fontSize('10fp') - .backgroundColor('#ffffff') - .margin({ left: '24vp' }) - }.alignContent(Alignment.Top) } .width('80%') .justifyContent(FlexAlign.SpaceBetween) @@ -303,10 +278,10 @@ export default struct PlayerDetail { .justifyContent(FlexAlign.Center) Row() { - Text(CommonUtils.formatTime(this.currentTime/1000)).fontSize('12fp') + Text(CommonUtils.formatTime(this.currentTime / 1000)).fontSize('12fp') .id('detail_time_current') Text('无损').fontSize('12fp') - Text(CommonUtils.formatTime(this.durationTime/1000)).fontSize('12fp') + Text(CommonUtils.formatTime(this.durationTime / 1000)).fontSize('12fp') .id('detail_time_duration') }.width('80%') .justifyContent(FlexAlign.SpaceBetween) diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/folder_badge_plus.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/folder_badge_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..a171098c83118ba771b202fa4e0b4738064e88f6 GIT binary patch literal 577 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 z206rholMMtn0 Zz`rL^Qc_agy(|C#002ovPDHLkV1gX9sfPdn diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_share.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_share.png deleted file mode 100644 index 66bd6cca909550f4d0714e6bb1e113ef56d1e479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 448 zcmV;x0YCnUP)Px$dPzhq9VyMO?ubyushD1ZxRy;4!}8I~L0C z&bSC3VFoX8S_qb~iJ!wrYAaaA^%lWB+#e^wO{9u;iw?0nt`=Ryb6mg)zK(myE11P= z9Cc;g{$4YKc|62BeCPw7yIlmAv0jw2-50!u;7L)>t1dbIk9=4Kckuvk@o|*whgFbu zkk-Vtoo*e)XiqVXEgX-U{a^*rdJGlE-Yz=-)B}97#K$XHhJV@w*AT5=Y5``jKPm~5 zRGi+#|H588(+qhHQ-~Dv-zswHeI-E_-(Y-NyVDT7z~^G7U?w0dxzC9SW5y=_4mKKs zXNak?3YrSi!$`E|B%#c(9e<{RtB9$Z9{$EY4r Date: Wed, 28 Aug 2024 10:02:01 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sunlian --- .../entry/src/main/ets/manager/ServerConstants.ets | 2 ++ scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets | 2 +- scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayList.ets | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets index 3679cae61..5e7b5c0bc 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets @@ -79,6 +79,8 @@ export default class ServerConstants { * PLAYER LIST */ static readonly LIST_SONG_COUNT = '首'; + static readonly LIST_SONG_NO_PLAYING = '没有播放'; + static readonly LIST_SONG_FAVOURITE = '我的收藏'; /** * PLAYER LOGIN */ diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets index 4806896b5..a94dae7f9 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets @@ -390,7 +390,7 @@ struct Index { this.recommendPlayLists.push(new PlayListData(key, $r('app.media.icon'), aPlayingList.length + ServerConstants.LIST_SONG_COUNT, aPlayingList, '')); }) - if (key === '我的收藏') { + if (key === ServerConstants.LIST_SONG_FAVOURITE) { this.PlayerManager.setFavourList(aPlayingList); } }); diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayList.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayList.ets index a21a1aebe..b53042aec 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayList.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayList.ets @@ -22,7 +22,7 @@ import ServerConstants from '../manager/ServerConstants'; @Component export default struct PlayList { @State playingList: AudioItem[] = Array(); - @State listTitle: string = '没有播放' + @State listTitle: string = ServerConstants.LIST_SONG_NO_PLAYING; private playerManager: PlayerManager = AppStorage.get('PlayerManager') as PlayerManager; aboutToAppear() { -- Gitee