You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
6.4 KiB
274 lines
6.4 KiB
<template>
|
|
<div class="search" v-show="show">
|
|
<h1><span>Search for</span> "{{ keywords }}"</h1>
|
|
<div class="result" v-if="result !== undefined">
|
|
<div class="row">
|
|
<div class="artists" v-if="result.hasOwnProperty('artist')">
|
|
<div class="section-title">Artists</div>
|
|
<div class="artists-list">
|
|
<div
|
|
class="artist"
|
|
v-for="artist in result.artist.artists.slice(0, 3)"
|
|
:key="artist.id"
|
|
>
|
|
<Cover
|
|
:url="artist.img1v1Url | resizeImage"
|
|
:showBlackShadow="true"
|
|
:hoverEffect="true"
|
|
:showPlayButton="true"
|
|
:type="`artist`"
|
|
:id="artist.id"
|
|
:size="128"
|
|
:playButtonSize="36"
|
|
:shadowMargin="8"
|
|
:radius="100"
|
|
/>
|
|
<div class="name">
|
|
<router-link :to="`/artist/${artist.id}`">{{
|
|
artist.name
|
|
}}</router-link>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="albums" v-if="result.hasOwnProperty('album')">
|
|
<div class="section-title">Albums</div>
|
|
<div class="albums-list">
|
|
<div
|
|
class="album"
|
|
v-for="album in result.album.albums.slice(0, 4)"
|
|
:key="album.id"
|
|
>
|
|
<div>
|
|
<Cover
|
|
:url="album.picUrl | resizeImage"
|
|
:showBlackShadow="true"
|
|
:hoverEffect="true"
|
|
:showPlayButton="true"
|
|
:type="`album`"
|
|
:id="album.id"
|
|
:size="128"
|
|
:playButtonSize="36"
|
|
:shadowMargin="8"
|
|
:radius="8"
|
|
/>
|
|
</div>
|
|
<div class="name">
|
|
<router-link :to="`/album/${album.id}`">{{
|
|
album.name
|
|
}}</router-link>
|
|
</div>
|
|
<div class="artist">
|
|
<router-link :to="`/artist/${album.artist.id}`">{{
|
|
album.artist.name
|
|
}}</router-link>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tracks" v-if="result.hasOwnProperty('song')">
|
|
<div class="section-title">Songs</div>
|
|
<TrackList :tracks="tracks" :type="'tracklist'" />
|
|
</div>
|
|
|
|
<div class="mvs" v-if="mvs !== null && mvs.length > 0">
|
|
<div class="section-title">MVs</div>
|
|
<MvRow class="mv-row" :mvs="mvs.slice(0, 5)" />
|
|
</div>
|
|
|
|
<div class="playlists" v-if="result.hasOwnProperty('playList')">
|
|
<div class="section-title">{{ $t("playlist") }}</div>
|
|
<div class="albums-list">
|
|
<div
|
|
class="album"
|
|
v-for="playlist in result.playList.playLists.slice(0, 12)"
|
|
:key="playlist.id"
|
|
>
|
|
<div>
|
|
<Cover
|
|
:url="playlist.coverImgUrl | resizeImage"
|
|
:showBlackShadow="true"
|
|
:hoverEffect="true"
|
|
:showPlayButton="true"
|
|
:type="`playlist`"
|
|
:id="playlist.id"
|
|
:size="128"
|
|
:playButtonSize="36"
|
|
:shadowMargin="8"
|
|
:radius="8"
|
|
/>
|
|
</div>
|
|
<div class="name">
|
|
<router-link :to="`/playlist/${playlist.id}`">{{
|
|
playlist.name
|
|
}}</router-link>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="no-results" v-else>
|
|
No Results
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { mapState } from "vuex";
|
|
import NProgress from "nprogress";
|
|
import { appendTrackToPlayerList } from "@/utils/play";
|
|
import { search } from "@/api/others";
|
|
|
|
import Cover from "@/components/Cover.vue";
|
|
import TrackList from "@/components/TrackList.vue";
|
|
import MvRow from "@/components/MvRow.vue";
|
|
|
|
export default {
|
|
name: "Search",
|
|
components: {
|
|
Cover,
|
|
TrackList,
|
|
MvRow,
|
|
},
|
|
data() {
|
|
return {
|
|
show: false,
|
|
result: {},
|
|
mvs: [],
|
|
type: 1,
|
|
limit: 30,
|
|
offset: 0,
|
|
};
|
|
},
|
|
computed: {
|
|
...mapState(["search"]),
|
|
keywords() {
|
|
return this.$route.query.keywords;
|
|
},
|
|
tracks() {
|
|
let tracks = this.result.song.songs.slice(0, 12);
|
|
return tracks;
|
|
},
|
|
},
|
|
methods: {
|
|
goToAlbum(id) {
|
|
this.$router.push({ name: "album", params: { id } });
|
|
},
|
|
playTrackInSearchResult(id) {
|
|
let track = this.tracks.find((t) => t.id === id);
|
|
appendTrackToPlayerList(track, true);
|
|
},
|
|
getData(keywords) {
|
|
search({ keywords: keywords, type: 1018 }).then((data) => {
|
|
this.result = data.result;
|
|
NProgress.done();
|
|
this.show = true;
|
|
});
|
|
search({ keywords: keywords, type: 1004 }).then((data) => {
|
|
this.mvs = data.result.mvs;
|
|
});
|
|
},
|
|
},
|
|
created() {
|
|
this.getData(this.$route.query.keywords);
|
|
},
|
|
beforeRouteUpdate(to, from, next) {
|
|
this.show = false;
|
|
next();
|
|
NProgress.start();
|
|
this.getData(to.query.keywords);
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
h1 {
|
|
margin-top: -10px;
|
|
margin-bottom: 0;
|
|
span {
|
|
color: rgba(0, 0, 0, 0.58);
|
|
}
|
|
}
|
|
|
|
.section-title {
|
|
font-weight: 600;
|
|
font-size: 22px;
|
|
color: rgba(0, 0, 0, 0.88);
|
|
margin-bottom: 16px;
|
|
margin-top: 46px;
|
|
}
|
|
|
|
.row {
|
|
display: flex;
|
|
}
|
|
|
|
.artists,
|
|
.albums {
|
|
flex: 1;
|
|
}
|
|
|
|
.artists-list {
|
|
display: flex;
|
|
padding-right: 48px;
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
.artist {
|
|
display: flex;
|
|
align-items: center;
|
|
flex-direction: column;
|
|
border-radius: 8px;
|
|
margin: {
|
|
left: 8px;
|
|
right: 24px;
|
|
}
|
|
.name {
|
|
margin-top: 8px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.albums-list {
|
|
display: flex;
|
|
.album {
|
|
img {
|
|
height: 128px;
|
|
border-radius: 8px;
|
|
}
|
|
border-radius: 8px;
|
|
margin: {
|
|
right: 14px;
|
|
left: 4px;
|
|
}
|
|
.name {
|
|
margin-top: 6px;
|
|
font-weight: 600;
|
|
color: rgba(0, 0, 0, 0.88);
|
|
font-size: 14px;
|
|
width: 128px;
|
|
display: -webkit-box;
|
|
-webkit-box-orient: vertical;
|
|
-webkit-line-clamp: 2;
|
|
overflow: hidden;
|
|
}
|
|
.artist {
|
|
font-size: 12px;
|
|
color: rgba(0, 0, 0, 0.68);
|
|
}
|
|
}
|
|
}
|
|
|
|
.no-results {
|
|
margin-top: 24px;
|
|
font-size: 24px;
|
|
}
|
|
|
|
.mvs {
|
|
.mv-row {
|
|
margin-top: -12px;
|
|
margin-bottom: -24px;
|
|
}
|
|
}
|
|
</style>
|