-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
-
-
@@ -155,8 +182,7 @@ body {
margin-top: -44px;
position: absolute;
- .zm-top-menu.n-menu.n-menu--horizontal
- .n-menu-item-content {
+ .zm-top-menu.n-menu.n-menu--horizontal .n-menu-item-content {
padding: 0 12px;
}
}
@@ -200,13 +226,16 @@ body {
flex: 1;
padding: 6px;
}
+ }
+ #wpSongDetail {
+
}
#wpPlayingList {
- position: absolute;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
+ // position: absolute;
+ // left: 0;
+ // top: 0;
+ // right: 0;
+ // bottom: 0;
#playingList {
position: absolute;
diff --git a/src/assets/images/disk.png b/src/assets/images/disk.png
new file mode 100644
index 0000000..2b1319c
Binary files /dev/null and b/src/assets/images/disk.png differ
diff --git a/src/assets/images/needle.png b/src/assets/images/needle.png
new file mode 100644
index 0000000..6bf0e66
Binary files /dev/null and b/src/assets/images/needle.png differ
diff --git a/src/assets/svgs/ArrowMaximize24Regular.svg b/src/assets/svgs/ArrowMaximize24Regular.svg
new file mode 100644
index 0000000..2e838bc
--- /dev/null
+++ b/src/assets/svgs/ArrowMaximize24Regular.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/ArrowMaximizeVertical24Regular.svg b/src/assets/svgs/ArrowMaximizeVertical24Regular.svg
new file mode 100644
index 0000000..d077e62
--- /dev/null
+++ b/src/assets/svgs/ArrowMaximizeVertical24Regular.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/ArrowMinimize24Regular.svg b/src/assets/svgs/ArrowMinimize24Regular.svg
new file mode 100644
index 0000000..17ad685
--- /dev/null
+++ b/src/assets/svgs/ArrowMinimize24Regular.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/ArrowMinimizeVertical24Regular.svg b/src/assets/svgs/ArrowMinimizeVertical24Regular.svg
new file mode 100644
index 0000000..0e2007f
--- /dev/null
+++ b/src/assets/svgs/ArrowMinimizeVertical24Regular.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/ChevronDown.svg b/src/assets/svgs/ChevronDown.svg
new file mode 100644
index 0000000..3eac07a
--- /dev/null
+++ b/src/assets/svgs/ChevronDown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/ChevronUp.svg b/src/assets/svgs/ChevronUp.svg
new file mode 100644
index 0000000..e80ee20
--- /dev/null
+++ b/src/assets/svgs/ChevronUp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/store/index.js b/src/store/index.js
index e3aea71..c86635a 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -4,6 +4,7 @@ export default createStore({
state: {
// appVersion: "0.0.1",
// debugStr: "测试debug字符",
+ showSongDetail: false, //是否显示歌曲详情
settings: {
currentRoute: "/discover/recommend", //当前路由
songId: 0, //歌曲id
@@ -11,8 +12,6 @@ export default createStore({
playMode: 0, //播放模式:0-3,顺序,循环,单曲,随机。
lastPlayed: [], //最近播放
playingList: [], //当前播放
- tArr: [], //测试数组
- ts: "", //测试字符
},
caches: {},
theme: {
diff --git a/src/views/common/SongDetail.vue b/src/views/common/SongDetail.vue
new file mode 100644
index 0000000..9a65d46
--- /dev/null
+++ b/src/views/common/SongDetail.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/common/SongInfo.vue b/src/views/common/SongInfo.vue
index ce8d6b6..34b59cb 100644
--- a/src/views/common/SongInfo.vue
+++ b/src/views/common/SongInfo.vue
@@ -7,17 +7,19 @@ import {
toRefs,
toRaw,
} from "vue";
-import {useStore} from 'vuex'
-import { NAvatar } from "naive-ui";
+import { useStore } from "vuex";
+import { NAvatar, NIcon } from "naive-ui";
import pubsub from "pubsub-js";
-import { getSongDetial } from "@/network/song";
-import dayjs from 'dayjs'
-import 'dayjs/locale/zh-cn'
-import duration from 'dayjs/plugin/duration'
+import { getSongDetial, getLyric } from "@/network/song";
+import dayjs from "dayjs";
+import "dayjs/locale/zh-cn";
+import duration from "dayjs/plugin/duration";
import ArtistsSpan from "@/components/ArtistsSpan.vue";
+import svgArrowMin from "@/assets/svgs/ArrowMinimize24Regular.svg";
+import svgArrowMax from "@/assets/svgs/ArrowMaximize24Regular.svg";
-const store = useStore()
-const showInfo = ref(false);
+const store = useStore();
+const showInfo = ref(true);
const info = reactive({
name: "",
artists: [],
@@ -26,7 +28,7 @@ const info = reactive({
mv: 0,
});
-//#region 取得歌曲信息
+//#region 取得歌曲信息、歌词
const songInfo = (id, im) => {
getSongDetial(id)
.then((res) => {
@@ -36,17 +38,37 @@ const songInfo = (id, im) => {
info.album = res.data.songs[0].al;
info.duration = res.data.songs[0].dt;
info.mv = res.data.songs[0].mv;
- currTime.value = '00:00'
- totalTime.value = zpTime(info.duration)
- if(im){
- const p = {...{
+ currTime.value = "00:00";
+ totalTime.value = zpTime(info.duration);
+ if (im) {
+ const p = {
+ ...{
+ id,
+ date: Date.now(),
+ },
+ ...toRaw(info),
+ };
+ store.commit("savePlayed", p);
+ store.commit("addToPlayingList", p);
+ console.log("savePlayed");
+ }
+ pubsub.publish("zp.songInfo", {
+ ...{
id,
date: Date.now(),
- }, ...toRaw(info)}
- store.commit('savePlayed', p)
- store.commit('addToPlayingList', p)
- console.log('savePlayed');
- }
+ },
+ ...toRaw(info),
+ });
+ })
+ .catch((err) => {});
+};
+const songLyric = (id) => {
+ getLyric(id)
+ .then((res) => {
+ if (res.data.code == 200)
+ pubsub.publish("zp.lyric", res.data.lrc.lyric );
+ else
+ pubsub.publish("zp.lyric", null);
})
.catch((err) => {});
};
@@ -56,22 +78,23 @@ const songInfo = (id, im) => {
let totalTime = ref("03:13");
let currTime = ref("00:03");
-dayjs.extend(duration)
+dayjs.extend(duration);
function zpTime(time) {
- return dayjs.duration(time).format('mm:ss')
+ return dayjs.duration(time).format("mm:ss");
}
// totalTime.value = zpTime(12345)
const psToken = pubsub.subscribe("zp", (msg, data) => {
switch (msg) {
case "zp.getSongInfo":
songInfo(data.id, data.im);
+ songLyric(data.id);
break;
case "zp.hideSongInfo":
- showInfo.value = false
+ showInfo.value = false;
break;
case "zp.progress":
- totalTime.value = zpTime(data.total * 1000)
- currTime.value = zpTime(data.progress * 1000)
+ totalTime.value = zpTime(data.total * 1000);
+ currTime.value = zpTime(data.progress * 1000);
break;
}
});
@@ -80,25 +103,40 @@ onUnmounted(() => {
pubsub.unsubscribe(psToken);
});
//#endregion
+
+const toggleSongDetail = () => {
+ console.log(
+ "显示/隐藏歌曲详细界面,包括歌词、模拟唱机以及其他操作。"
+ );
+ pubsub.publish("zp.toggleSongDetail");
+};
-
+
+
![]()
+
+
+
+
+
+
-
{{ info.name }}
+
+ {{ info.name }}
+
-
-
{{ currTime }}/
{{ totalTime }}
+
+ {{ currTime }}/{{ totalTime }}
@@ -116,14 +154,54 @@ export default {};
align-items: center;
margin-left: 12px;
+ .wp-img {
+ --radius: 4px;
+
+ position: relative;
+ border: 1px #eee solid;
+ border-radius: var(--radius);
+ cursor: pointer;
+
+ &:hover {
+ .wp-icon {
+ display: flex;
+ }
+ }
+
+ .img {
+ border-radius: var(--radius);
+ }
+
+ .wp-icon {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 42px;
+ height: 42px;
+ color: #fff;
+ background-color: rgba(255, 255, 255, 0.1);
+ border-radius: var(--radius);
+ -webkit-backdrop-filter: blur(2px);
+ backdrop-filter: blur(2px);
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 33px;
+
+ display: none;
+ }
+ }
+
.song {
padding-left: 6px;
display: flex;
flex-direction: column;
+ cursor: pointer;
.w-song {
display: flex;
align-items: center;
- .song-name{
+ .song-name {
// flex: 1;
.text-el-line-normal();
}