├── static ├── .gitkeep └── favicon.ico ├── logo ├── banner.png ├── 72px white.svg ├── 144px white.svg ├── 256px white.svg ├── 44.svg ├── 72.svg ├── 144.svg ├── 256.svg ├── 44px.svg ├── 72px.svg ├── 72px black.svg ├── 144px.svg ├── 144px black.svg ├── 256px logo.svg └── 256px black.svg ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── src ├── assets │ ├── logo.png │ ├── loading.gif │ ├── clock_ic.png │ ├── default_pic.jpg │ ├── icon_loading.png │ ├── list_sprite.png │ ├── sprite_play.png │ └── search_sprite.png ├── vue-shim.d.ts ├── style │ ├── utils.scss │ ├── _var.scss │ └── reset.scss ├── store │ ├── mutation-types.ts │ ├── index.ts │ ├── mutations.ts │ └── action.ts ├── config │ ├── api.ts │ ├── mixin.ts │ ├── utils.ts │ └── fetch.ts ├── service │ └── getData.ts ├── App.vue ├── main.ts ├── router │ └── index.ts ├── components │ ├── Swipe.vue │ ├── NavHeader.vue │ └── Player.vue └── pages │ ├── rank │ └── rank.vue │ ├── recommend │ └── recommend.vue │ └── search │ └── search.vue ├── dist ├── static │ ├── favicon.ico │ └── js │ │ ├── manifest.3aa985dad67cd32a3734.js │ │ ├── 1.4cf3c45af5c8c3684b6c.js │ │ ├── 1.4cf3c45af5c8c3684b6c.js.map │ │ ├── manifest.3aa985dad67cd32a3734.js.map │ │ ├── 0.8413109ca33965849bfc.js │ │ ├── app.ddbf42d99ac71f76e2fc.js │ │ └── 0.8413109ca33965849bfc.js.map └── index.html ├── index.html ├── tsconfig.json ├── LICENSE ├── .gitignore ├── package.json ├── README.md └── tslint.json /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /logo/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/logo/banner.png -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /src/assets/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/src/assets/loading.gif -------------------------------------------------------------------------------- /dist/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/dist/static/favicon.ico -------------------------------------------------------------------------------- /src/assets/clock_ic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/src/assets/clock_ic.png -------------------------------------------------------------------------------- /src/assets/default_pic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/src/assets/default_pic.jpg -------------------------------------------------------------------------------- /src/assets/icon_loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/src/assets/icon_loading.png -------------------------------------------------------------------------------- /src/assets/list_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/src/assets/list_sprite.png -------------------------------------------------------------------------------- /src/assets/sprite_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/src/assets/sprite_play.png -------------------------------------------------------------------------------- /src/vue-shim.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue'; 3 | export default Vue; 4 | } 5 | -------------------------------------------------------------------------------- /src/assets/search_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shenzekun/vue-qq-music/HEAD/src/assets/search_sprite.png -------------------------------------------------------------------------------- /src/style/utils.scss: -------------------------------------------------------------------------------- 1 | @mixin ellipsis { 2 | white-space: nowrap; 3 | overflow: hidden; 4 | text-overflow: ellipsis; 5 | } -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /src/style/_var.scss: -------------------------------------------------------------------------------- 1 | $color-primary:#31c27c; 2 | $header-background: $color-primary; 3 | $header-height: 44px; 4 | $logo-height: 25px; 5 | $body-background:#f4f4f4; 6 | $nav-item-height:40px; 7 | $nav-item-color:rgba(0,0,0,.6); 8 | $nav-item-active:$color-primary; -------------------------------------------------------------------------------- /src/store/mutation-types.ts: -------------------------------------------------------------------------------- 1 | // 缓存搜索历史 2 | export const SET_HISTORY_KEY = 'SET_HISTORY_KEY'; 3 | // 获取歌曲 4 | export const GET_SONG = 'GET_SONG'; 5 | // 显示 player 6 | export const SHOW_PLAYER = 'SHOW_PLAYER'; 7 | // 不显示 player 8 | export const CANCEL_PLAYER = 'CANCEL_PLAYER'; 9 | // 播放状态(true/false) 10 | export const SET_PLAYING_STATE = 'SET_PLAYING_STATE'; 11 | -------------------------------------------------------------------------------- /src/config/api.ts: -------------------------------------------------------------------------------- 1 | export const RECOMMEND_URL = 'https://shenzekun-qmusic-api.now.sh/'; 2 | export const TOPLIST_URL = 'https://shenzekun-qmusic-api.now.sh/top'; 3 | export const SEARCH_URL = 'https://shenzekun-qmusic-api.now.sh/search'; 4 | export const LYRICS_URL = 'https://shenzekun-qmusic-api.now.sh/lyrics'; 5 | export const HOTKEYS_URL = 'https://shenzekun-qmusic-api.now.sh/hotkey'; 6 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | vue-qq-music 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/store/index.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import mutations from './mutations'; 4 | import actions from './action'; 5 | Vue.use(Vuex); 6 | 7 | const state = { 8 | isShowPlayer: false, // 是否显示 player 9 | song: {}, // 歌的信息 10 | artist: '', // 歌的作者 11 | isPlay: false // 是否播放 12 | }; 13 | export default new Vuex.Store({ 14 | state, 15 | actions, 16 | mutations 17 | }); 18 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | vue-qq-music
-------------------------------------------------------------------------------- /src/config/mixin.ts: -------------------------------------------------------------------------------- 1 | const mixin = { 2 | filters: { 3 | dealNum(num) { 4 | return (num / 10000).toFixed(1) + '万'; 5 | }, 6 | formatTime(seconds) { 7 | let mins: any = Math.floor(seconds / 60); 8 | let secs: any = Math.floor(seconds % 60); 9 | if (mins < 10) { 10 | mins = '0' + mins; 11 | } 12 | if (secs < 10) { 13 | secs = '0' + secs; 14 | } 15 | return `${mins}:${secs}`; 16 | } 17 | } 18 | }; 19 | 20 | export default mixin; 21 | -------------------------------------------------------------------------------- /src/style/reset.scss: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | body { 6 | margin: 0; 7 | } 8 | 9 | h1, 10 | h2, 11 | h3 { 12 | margin: 0; 13 | font-weight: normal; 14 | } 15 | 16 | ul, 17 | ol { 18 | margin: 0; 19 | padding: 0; 20 | list-style: none; 21 | } 22 | 23 | a { 24 | text-decoration: none; 25 | -webkit-tap-highlight-color: transparent; // 这个属性只用于iOS (iPhone和iPad)。当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的灰色背景。要重设这个表现,你可以设置-webkit-tap-highlight-color为任何颜色 26 | user-select: none; //禁止用户选择 27 | } 28 | 29 | i { 30 | font-style: normal; 31 | } -------------------------------------------------------------------------------- /src/service/getData.ts: -------------------------------------------------------------------------------- 1 | import fetch from '../config/fetch'; 2 | import { RECOMMEND_URL, TOPLIST_URL, HOTKEYS_URL } from '../config/api'; 3 | import { searchUrl, lyricsUrl } from '../config/utils'; 4 | 5 | // 获取推荐 6 | export const recommendList = () => fetch(RECOMMEND_URL); 7 | 8 | // 获取排行榜 9 | export const rankList = () => fetch(TOPLIST_URL); 10 | 11 | // 获取热门搜索关键词 12 | export const hotList = () => fetch(HOTKEYS_URL); 13 | 14 | // 获取搜索内容 15 | export const searchList = (keyword, page?: number) => fetch(searchUrl(keyword, page)); 16 | 17 | // 获取歌词 18 | export const getLyrics = (songid: number) => fetch(lyricsUrl(songid)); 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "src/**/*" 4 | ], 5 | "exclude": [ 6 | "node_modules" 7 | ], 8 | "compilerOptions": { 9 | "allowSyntheticDefaultImports": true, 10 | "experimentalDecorators": true, 11 | "allowJs": true, 12 | "module": "esnext", 13 | "target": "es5", 14 | "moduleResolution": "node", 15 | "isolatedModules": true, 16 | "lib": [ 17 | "dom", 18 | "es5", 19 | "es2015.promise", 20 | "scripthost" 21 | ], 22 | "sourceMap": true, 23 | "pretty": true, 24 | "strictFunctionTypes": false, 25 | "importHelpers": true 26 | } 27 | } -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | 23 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue'; 4 | import App from './App.vue'; 5 | import router from './router/index'; 6 | import store from './store/'; 7 | import VueLazyload from 'vue-lazyload'; 8 | 9 | Vue.config.productionTip = false; 10 | 11 | Vue.use(VueLazyload, { 12 | preLoad: 1.3, 13 | error: require('./assets/default_pic.jpg'), 14 | loading: require('./assets/default_pic.jpg'), 15 | attempt: 1 16 | }); 17 | 18 | const init = new Vue({ 19 | router, 20 | store, 21 | components: { App }, 22 | template: '' 23 | }).$mount('#app'); 24 | -------------------------------------------------------------------------------- /src/config/utils.ts: -------------------------------------------------------------------------------- 1 | import { LYRICS_URL, SEARCH_URL } from './api'; 2 | 3 | // 歌url 4 | export function songUrl(id: number) { 5 | // return `http://ws.stream.qqmusic.qq.com/${id}.m4a?fromtag=46`; 6 | return `http://isure.stream.qqmusic.qq.com/C100${id}.m4a?fromtag=32`; 7 | } 8 | 9 | // 歌词 url 10 | export function lyricsUrl(songid: number) { 11 | return `${LYRICS_URL}?id=${songid}`; 12 | } 13 | 14 | // 相册 15 | export function albumCoverUrl(id: number) { 16 | return `https://y.gtimg.cn/music/photo_new/T002R150x150M000${id}.jpg`; 17 | } 18 | 19 | // 处理搜索的 url 20 | // @param {any} keyword 用户输入的数据 21 | // @param {number} [page=1] 页数默认为1 22 | export function searchUrl(keyword, page = 1) { 23 | return `${SEARCH_URL}?keyword=${keyword}&page=${page}`; 24 | } 25 | -------------------------------------------------------------------------------- /src/store/mutations.ts: -------------------------------------------------------------------------------- 1 | import { 2 | SET_HISTORY_KEY, 3 | GET_SONG, 4 | SHOW_PLAYER, 5 | CANCEL_PLAYER, 6 | SET_PLAYING_STATE 7 | } from './mutation-types'; 8 | import { Mutation, MutationTree } from 'vuex'; 9 | 10 | const mutations: MutationTree = { 11 | // 缓存搜索历史 12 | [SET_HISTORY_KEY](state, keyword) { 13 | localStorage.setItem('SET_HISTORY_KEY', keyword); 14 | }, 15 | // 获取歌曲 16 | [GET_SONG](state, payload) { 17 | state.song = payload; 18 | state.song.singer.forEach(singer => { 19 | state.artist = singer.name; 20 | }); 21 | }, 22 | // 显示 player 23 | [SHOW_PLAYER](state) { 24 | state.isShowPlayer = true; 25 | }, 26 | // 不显示 player 27 | [CANCEL_PLAYER](state) { 28 | state.isShowPlayer = false; 29 | }, 30 | // 播放状态(true/false) 31 | [SET_PLAYING_STATE](state, flag) { 32 | state.isPlay = flag; 33 | } 34 | }; 35 | 36 | export default mutations; 37 | -------------------------------------------------------------------------------- /src/store/action.ts: -------------------------------------------------------------------------------- 1 | import { 2 | SET_HISTORY_KEY, 3 | GET_SONG, 4 | SHOW_PLAYER, 5 | CANCEL_PLAYER, 6 | SET_PLAYING_STATE 7 | } from './mutation-types'; 8 | import { ActionTree, Action } from 'vuex'; 9 | 10 | const setLocalStorageData: Action = ({ commit }, payload) => { 11 | commit(SET_HISTORY_KEY, payload); 12 | }; 13 | 14 | const getSong: Action = ({ commit }, payload) => { 15 | commit(GET_SONG, payload); 16 | }; 17 | 18 | const showPlayer: Action = ({ commit }) => { 19 | commit(SHOW_PLAYER); 20 | }; 21 | 22 | const cancelPlayer: Action = ({ commit }) => { 23 | commit(CANCEL_PLAYER); 24 | }; 25 | 26 | const setPlayState: Action = ({ commit }, payload) => { 27 | commit(SET_PLAYING_STATE, payload); 28 | }; 29 | 30 | const actions: ActionTree = { 31 | setLocalStorageData, 32 | getSong, 33 | showPlayer, 34 | cancelPlayer, 35 | setPlayState 36 | }; 37 | export default actions; 38 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | // declare function require(moduleName: string): any; 2 | import Vue from 'vue'; 3 | import Router from 'vue-router'; 4 | import NavHeader from '../components/NavHeader.vue'; 5 | import App from '../App.vue'; 6 | import recommend from '../pages/recommend/recommend.vue'; 7 | 8 | // ts 按需加载需要@types/webpack-env 这个包 9 | const rank = r => require.ensure([], () => r(require('../pages/rank/rank')), 'rank'); 10 | const search = r => require.ensure([], () => r(require('../pages/search/search')), 'search'); 11 | 12 | Vue.use(Router); 13 | 14 | export default new Router({ 15 | routes: [ 16 | { 17 | path: '', 18 | component: recommend 19 | }, 20 | { 21 | path: '/', 22 | name: 'recommend', 23 | component: recommend 24 | }, 25 | { 26 | path: '/rank', 27 | name: 'rank', 28 | component: rank 29 | }, 30 | { 31 | path: '/search', 32 | name: 'search', 33 | component: search 34 | } 35 | ] 36 | }); 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | -------------------------------------------------------------------------------- /logo/72px white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /logo/144px white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /logo/256px white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/components/Swipe.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /logo/44.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /logo/72.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /logo/144.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /logo/256.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /dist/static/js/manifest.3aa985dad67cd32a3734.js: -------------------------------------------------------------------------------- 1 | !function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var i,u,f,s=0,l=[];s 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /logo/72px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /logo/72px black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /logo/144px.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /logo/144px black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /logo/256px logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /logo/256px black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /dist/static/js/1.4cf3c45af5c8c3684b6c.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],{"2RUC":function(t,s){},"6Vet":function(t,s,i){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var a=i("TToO"),n=i("7+uW"),e=i("c+8m"),o=i.n(e),l=i("DZ+H"),c=i("0Zxd"),r=function(t){function s(){var s=null!==t&&t.apply(this,arguments)||this;return s.rankList=null,s.isLoading=!0,s}return a.d(s,t),s.prototype.mounted=function(){var t=this;Object(c.c)().then(function(s){t.rankList=s.data.topList,t.isLoading=!1}).catch(function(t){console.log(t)})},s=a.c([o()({mixins:[l.a]})],s)}(n.default),d={render:function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"tab-contents"},[a("div",{directives:[{name:"show",rawName:"v-show",value:!t.isLoading,expression:"!isLoading"}],staticClass:"rank-view tab-content"},[a("ul",{staticClass:"toplist"},t._l(t.rankList,function(s){return a("li",{key:s.id,staticClass:"top-item"},[a("div",{staticClass:"top-item-media"},[a("a",{attrs:{href:"https://y.qq.com/w/toplist.html?ADTAG=myqq&from=myqq&channel=10007100&id="+s.id+"&type=top"}},[a("img",{directives:[{name:"lazy",rawName:"v-lazy",value:s.picUrl,expression:"item.picUrl"}]}),t._v(" "),a("span",{staticClass:"listen_count"},[a("i",{staticClass:"icon icon-listen"}),t._v(t._s(t._f("dealNum")(s.listenCount)))])])]),t._v(" "),a("a",{attrs:{href:"https://y.qq.com/w/toplist.html?ADTAG=myqq&from=myqq&channel=10007100&id="+s.id+"&type=top"}},[a("div",{staticClass:"top-item-info"},[a("h3",{staticClass:"top-item-title ellipsis"},[t._v(t._s(s.topTitle))]),t._v(" "),a("ul",{staticClass:"top-item-list"},t._l(s.songList,function(s,i){return a("li",{staticClass:"top-item-song"},[a("i",{staticClass:"song-index"},[t._v(t._s(i+1))]),t._v(" "),a("span",{staticClass:"song-name"},[t._v(t._s(s.songname))]),t._v("- "+t._s(s.singername)+"\n ")])}))])])])}))]),t._v(" "),a("div",{directives:[{name:"show",rawName:"v-show",value:t.isLoading,expression:"isLoading"}],staticClass:"loading"},[a("img",{attrs:{src:i("G/2H"),alt:""}}),t._v(" "),a("p",[t._v("正在加载中.....")])])])},staticRenderFns:[]};var m=i("VU/8")(r,d,!1,function(t){i("2RUC")},"data-v-f7e4c728",null);s.default=m.exports}}); 2 | //# sourceMappingURL=1.4cf3c45af5c8c3684b6c.js.map -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, 14 | 15 | // Various Dev Server settings 16 | host: 'localhost', // can be overwritten by process.env.HOST 17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 18 | autoOpenBrowser: false, 19 | errorOverlay: true, 20 | notifyOnErrors: true, 21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 22 | 23 | 24 | /** 25 | * Source Maps 26 | */ 27 | 28 | // https://webpack.js.org/configuration/devtool/#development 29 | devtool: 'cheap-module-eval-source-map', 30 | 31 | // If you have problems debugging vue-files in devtools, 32 | // set this to false - it *may* help 33 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 34 | cacheBusting: true, 35 | 36 | cssSourceMap: true 37 | }, 38 | 39 | build: { 40 | // Template for index.html 41 | index: path.resolve(__dirname, '../dist/index.html'), 42 | 43 | // Paths 44 | assetsRoot: path.resolve(__dirname, '../dist'), 45 | assetsSubDirectory: 'static', 46 | assetsPublicPath: './', 47 | 48 | /** 49 | * Source Maps 50 | */ 51 | 52 | productionSourceMap: true, 53 | // https://webpack.js.org/configuration/devtool/#production 54 | devtool: '#source-map', 55 | 56 | // Gzip off by default as many popular static hosts such as 57 | // Surge or Netlify already gzip all static assets for you. 58 | // Before setting to `true`, make sure to: 59 | // npm install --save-dev compression-webpack-plugin 60 | productionGzip: false, 61 | productionGzipExtensions: ['js', 'css'], 62 | 63 | // Run the build command with an extra argument to 64 | // View the bundle analyzer report after build finishes: 65 | // `npm run build --report` 66 | // Set to `true` or `false` to always turn it on or off 67 | bundleAnalyzerReport: process.env.npm_config_report 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-qq-music", 3 | "version": "1.0.0", 4 | "description": "vue 重构 qq音乐移动端", 5 | "author": "shenzekun <726664809@qq.com>", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "build": "node build/build.js", 11 | "analyz": "NODE_ENV=production npm_config_report=true npm run build" 12 | }, 13 | "dependencies": { 14 | "qs": "^6.5.1", 15 | "swiper": "^4.1.6", 16 | "vue": "^2.5.2", 17 | "vue-class-component": "^6.2.0", 18 | "vue-property-decorator": "^6.0.0", 19 | "vue-router": "^3.0.1", 20 | "vuex": "^3.0.1", 21 | "vuex-class": "^0.3.0" 22 | }, 23 | "devDependencies": { 24 | "@types/webpack-env": "^1.13.5", 25 | "autoprefixer": "^7.1.2", 26 | "babel": "^6.23.0", 27 | "babel-core": "^6.22.1", 28 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 29 | "babel-loader": "^7.1.3", 30 | "babel-plugin-syntax-jsx": "^6.18.0", 31 | "babel-plugin-transform-runtime": "^6.22.0", 32 | "babel-plugin-transform-vue-jsx": "^3.5.0", 33 | "babel-preset-env": "^1.3.2", 34 | "babel-preset-es2015": "^6.24.1", 35 | "babel-preset-stage-2": "^6.22.0", 36 | "chalk": "^2.3.1", 37 | "copy-webpack-plugin": "^4.4.2", 38 | "css-loader": "^0.28.10", 39 | "extract-text-webpack-plugin": "^3.0.0", 40 | "file-loader": "^1.1.10", 41 | "friendly-errors-webpack-plugin": "^1.6.1", 42 | "html-webpack-plugin": "^2.30.1", 43 | "node-notifier": "^5.1.2", 44 | "node-sass": "^4.7.2", 45 | "optimize-css-assets-webpack-plugin": "^3.2.0", 46 | "ora": "^1.2.0", 47 | "portfinder": "^1.0.13", 48 | "postcss-import": "^11.0.0", 49 | "postcss-loader": "^2.1.1", 50 | "postcss-url": "^7.3.1", 51 | "rimraf": "^2.6.0", 52 | "sass-loader": "^6.0.6", 53 | "semver": "^5.3.0", 54 | "shelljs": "^0.7.6", 55 | "ts-loader": "^3.5.0", 56 | "tslint": "^5.9.1", 57 | "tslint-config-standard": "^7.0.0", 58 | "tslint-loader": "^3.5.3", 59 | "typescript": "^2.7.2", 60 | "uglifyjs-webpack-plugin": "^1.0.0-rc.0", 61 | "url-loader": "^0.5.8", 62 | "vue-lazyload": "^1.2.1", 63 | "vue-loader": "^13.3.0", 64 | "vue-style-loader": "^3.0.1", 65 | "vue-template-compiler": "^2.5.2", 66 | "webpack": "3.6.0", 67 | "webpack-bundle-analyzer": "^2.11.0", 68 | "webpack-dev-server": "^2.11.2", 69 | "webpack-merge": "^4.1.2" 70 | }, 71 | "engines": { 72 | "node": ">= 6.0.0", 73 | "npm": ">= 3.0.0" 74 | }, 75 | "browserslist": [ 76 | "> 1%", 77 | "last 2 versions", 78 | "not ie <= 8" 79 | ] 80 | } 81 | -------------------------------------------------------------------------------- /src/config/fetch.ts: -------------------------------------------------------------------------------- 1 | export default async (url = '', data = {}, type = 'GET', method = 'fetch') => { 2 | // 将类型转化成全部大写 3 | type = type.toUpperCase(); 4 | 5 | if (type === 'GET') { 6 | let dataStr = ''; // 数据拼接字符串 7 | Object.keys(data).forEach(key => { 8 | dataStr += key + '=' + data[key] + '&'; 9 | }); 10 | 11 | if (dataStr !== '') { 12 | dataStr = dataStr.substr(0, dataStr.lastIndexOf('&')); 13 | url = url + '?' + dataStr; 14 | } 15 | } 16 | 17 | if (window.fetch && method === 'fetch') { 18 | const requestConfig: RequestInit = { 19 | method: type, 20 | headers: { 21 | Accept: 'application/json', 22 | 'Content-Type': 'application/json', 23 | 'Access-Control-Allow-Origin': '*' 24 | }, 25 | mode: 'cors', 26 | cache: 'force-cache' 27 | }; 28 | 29 | if (type === 'POST') { 30 | Object.defineProperty(requestConfig, 'body', { 31 | value: JSON.stringify(data) 32 | }); 33 | } 34 | 35 | try { 36 | const response = await fetch(url, requestConfig); 37 | const responseJson = await response.json(); 38 | return responseJson; 39 | } catch (error) { 40 | throw new Error(error); 41 | } 42 | } else { 43 | return new Promise((resolve, reject) => { 44 | let requestObj; 45 | // 浏览器是否支持XMLHttpRequest 46 | if ((window as any).XMLHttpRequest) { 47 | requestObj = new XMLHttpRequest(); 48 | } else { 49 | requestObj = new ActiveXObject('Microsoft.XMLHTTP'); 50 | } 51 | 52 | let sendData = ''; 53 | if (type === 'POST') { 54 | sendData = JSON.stringify(data); 55 | } 56 | 57 | requestObj.open(type, url, true); 58 | requestObj.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 59 | requestObj.send(sendData); 60 | 61 | requestObj.onreadystatechange = () => { 62 | if (requestObj.readyState === 4) { 63 | if (requestObj.status === 200) { 64 | let obj = requestObj.response; 65 | if (typeof obj !== 'object') { 66 | obj = JSON.parse(obj); 67 | } 68 | resolve(obj); 69 | } else { 70 | reject(requestObj); 71 | } 72 | } 73 | }; 74 | }); 75 | } 76 | }; 77 | -------------------------------------------------------------------------------- /src/components/NavHeader.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | > vue全家桶+typescript重构qq音乐移动端 6 | 7 | ## 预览(请在手机上观看) 8 | 9 | > 可能加载有点慢,服务器在国外🤣 ===> [QQ音乐🎵](http://shenzekun.cn/vue-qq-music/dist/index.html) 10 | 11 | 12 | ## 说明 13 | 14 | > 本项目是基于我的原生 js 项目[qq 音乐](https://github.com/shenzekun/QMusic)重构完成。在此期间,参考了一些vue与typescript的整合的教程,对我帮助挺大的,感谢写这些教程的作者们,在这里由衷的感谢!以下是参考的教程: 15 | 16 | 1. [vue + typescript 新项目起手式](https://segmentfault.com/a/1190000011744210#articleHeader12) 17 | 18 | 2. [Vue2.5+ Typescript 引入全面指南 - Vuex篇](https://segmentfault.com/a/1190000011864013) 19 | 20 | 21 | ## 安装方法 22 | 23 | 打开终端 ,输入: 24 | 25 | ```bash 26 | git clone git@github.com:shenzekun/vue-qq-music.git 27 | ``` 28 | 29 | 切换到克隆下来的文件夹: 30 | 31 | ```bash 32 | cd vue-qq-music 33 | ``` 34 | 35 | 然后输入: 36 | 37 | ```bash 38 | yarn 39 | ``` 40 | 41 | 然后运行 42 | 43 | ```bash 44 | npm run dev 45 | ``` 46 | 47 | 最后在浏览器中打开 http://localhost:8080/ 48 | 49 | ## 项目结构 50 | 51 | 使用[see-dirtree](https://github.com/shenzekun/see-dirtree) 显示目录树 52 | 53 | ``` 54 | vue-qq-music 55 | ├──LICENSE 56 | ├──README.md 57 | ├──index.html 58 | ├──package.json 59 | ├──tsconfig.json 60 | ├──tslint.json 61 | ├──yarn.lock 62 | ├──static 63 | ├──src 64 | │ ├──App.vue 65 | │ ├──main.ts 66 | │ ├──vue-shim.d.ts 67 | │ ├──style 68 | │ │ ├──_var.scss 69 | │ │ └──reset.scss 70 | │ ├──store 71 | │ │ ├──action.ts 72 | │ │ ├──index.ts 73 | │ │ ├──mutation-types.ts 74 | │ │ └──mutations.ts 75 | │ ├──service 76 | │ │ └──getData.ts 77 | │ ├──router 78 | │ │ └──index.ts 79 | │ ├──pages 80 | │ │ ├──search 81 | │ │ │ └──search.vue 82 | │ │ ├──recommend 83 | │ │ │ └──recommend.vue 84 | │ │ ├──rank 85 | │ │ │ └──rank.vue 86 | │ ├──config 87 | │ │ ├──api.ts 88 | │ │ ├──fetch.ts 89 | │ │ ├──mixin.ts 90 | │ │ └──utils.ts 91 | │ ├──components 92 | │ │ ├──NavHeader.vue 93 | │ │ ├──Player.vue 94 | │ │ └──Swipe.vue 95 | │ ├──assets 96 | │ │ ├──clock_ic.png 97 | │ │ ├──default_pic.jpg 98 | │ │ ├──favicon.ico 99 | │ │ ├──icon_loading.png 100 | │ │ ├──list_sprite.png 101 | │ │ ├──loading.gif 102 | │ │ ├──logo.png 103 | │ │ ├──search_sprite.png 104 | │ │ └──sprite_play.png 105 | ├──config 106 | │ ├──dev.env.js 107 | │ ├──index.js 108 | │ └──prod.env.js 109 | ├──build 110 | │ ├──build.js 111 | │ ├──check-versions.js 112 | │ ├──logo.png 113 | │ ├──utils.js 114 | │ ├──vue-loader.conf.js 115 | │ ├──webpack.base.conf.js 116 | │ ├──webpack.dev.conf.js 117 | │ └──webpack.prod.conf.js 118 | 119 | 16 directories, 48 files. 120 | ``` 121 | 122 | ## 使用的组件 123 | 124 | 1. [swiper](https://github.com/nolimits4web/swiper) 125 | 2. [vue-lazyload](https://github.com/hilongjw/vue-lazyload) -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint-config-standard", 3 | "globals": { 4 | "require": true 5 | }, 6 | "rules": { 7 | "arrow-return-shorthand": true, 8 | "callable-types": true, 9 | "class-name": true, 10 | "comment-format": [ 11 | true, 12 | "check-space" 13 | ], 14 | "curly": true, 15 | "deprecation": { 16 | "severity": "warn" 17 | }, 18 | "eofline": true, 19 | "forin": true, 20 | "import-blacklist": [ 21 | true, 22 | "rxjs", 23 | "rxjs/Rx" 24 | ], 25 | "import-spacing": true, 26 | "indent": [ 27 | true, 28 | "spaces" 29 | ], 30 | "interface-over-type-literal": true, 31 | "label-position": true, 32 | "max-line-length": [ 33 | true, 34 | 140 35 | ], 36 | "member-access": false, 37 | "member-ordering": [ 38 | true, 39 | { 40 | "order": [ 41 | "static-field", 42 | "instance-field", 43 | "static-method", 44 | "instance-method" 45 | ] 46 | } 47 | ], 48 | "no-arg": true, 49 | "no-bitwise": true, 50 | "no-console": [ 51 | true, 52 | "debug", 53 | "info", 54 | "time", 55 | "timeEnd", 56 | "trace" 57 | ], 58 | "no-construct": true, 59 | "no-debugger": true, 60 | "no-duplicate-super": true, 61 | "no-empty": false, 62 | "no-empty-interface": true, 63 | "no-eval": true, 64 | "no-inferrable-types": [ 65 | true, 66 | "ignore-params" 67 | ], 68 | "no-misused-new": true, 69 | "no-non-null-assertion": true, 70 | "no-shadowed-variable": true, 71 | "no-string-literal": false, 72 | "no-string-throw": true, 73 | "no-switch-case-fall-through": true, 74 | "no-trailing-whitespace": true, 75 | "no-unnecessary-initializer": true, 76 | "no-unused-expression": true, 77 | "no-use-before-declare": true, 78 | "no-var-keyword": true, 79 | "object-literal-sort-keys": false, 80 | "space-before-function-paren": ["error", "never"], 81 | "ter-indent": 4, 82 | "one-line": [ 83 | true, 84 | "check-open-brace", 85 | "check-catch", 86 | "check-else", 87 | "check-whitespace" 88 | ], 89 | "prefer-const": true, 90 | "quotemark": [ 91 | true, 92 | "single" 93 | ], 94 | "radix": true, 95 | "semicolon": [ 96 | true, 97 | "always" 98 | ], 99 | "triple-equals": [ 100 | true, 101 | "allow-null-check" 102 | ], 103 | "typedef-whitespace": [ 104 | true, 105 | { 106 | "call-signature": "nospace", 107 | "index-signature": "nospace", 108 | "parameter": "nospace", 109 | "property-declaration": "nospace", 110 | "variable-declaration": "nospace" 111 | } 112 | ], 113 | "typeof-compare": true, 114 | "unified-signatures": true, 115 | "variable-name": false, 116 | "whitespace": [ 117 | true, 118 | "check-branch", 119 | "check-decl", 120 | "check-operator", 121 | "check-separator", 122 | "check-type" 123 | ] 124 | } 125 | } -------------------------------------------------------------------------------- /src/pages/rank/rank.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 58 | 59 | 166 | -------------------------------------------------------------------------------- /src/pages/recommend/recommend.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 75 | 76 | 168 | -------------------------------------------------------------------------------- /dist/static/js/1.4cf3c45af5c8c3684b6c.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/pages/rank/rank.vue?5cc7","webpack:///./src/pages/rank/rank.vue?4c44","webpack:///./src/pages/rank/rank.vue"],"names":["_super","rank","_this","apply","this","arguments","rankList","isLoading","tslib_es6","prototype","mounted","Object","getData","then","res","data","topList","catch","err","console","log","vue_class_component_common_default","mixins","mixin","vue_esm","selectortype_template_index_0_src_pages_rank_rank","render","_vm","_h","$createElement","_c","_self","staticClass","directives","name","rawName","value","expression","_l","item","key","id","attrs","href","_v","_s","_f","listenCount","topTitle","song","index","songname","singername","src","__webpack_require__","alt","staticRenderFns","Component","normalizeComponent","pages_rank_rank","ssrContext","__webpack_exports__"],"mappings":"yMA0CA,SAAAA,GAHA,SAAAC,IAAA,IAAAC,EAAA,OAAAF,KAAAG,MAAAC,KAAAC,YAAAD,YAIIF,EAAAI,SAAW,KACXJ,EAAAK,WAAqB,IAWzB,OAbkCC,EAAA,EAAAP,EAAAD,GAG9BC,EAAAQ,UAAAC,QAAA,eAAAR,EAAAE,KACIO,OAAAC,EAAA,EAAAD,GACKE,KAAK,SAAAC,GACFZ,EAAKI,SAAWQ,EAAIC,KAAKC,QACzBd,EAAKK,WAAY,IAEpBU,MAAM,SAAAC,GACHC,QAAQC,IAAIF,MAVPjB,EAAIO,EAAA,GAHxBa,KACGC,QAASC,EAAA,MAEQtB,GAArB,CAAkCuB,EAAA,SCvClCC,GADiBC,OAFjB,WAA0B,IAAAC,EAAAvB,KAAawB,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,iBAA2BF,EAAA,OAAYG,aAAaC,KAAA,OAAAC,QAAA,SAAAC,OAAAT,EAAApB,UAAA8B,WAAA,eAA4EL,YAAA,0BAAsCF,EAAA,MAAWE,YAAA,WAAsBL,EAAAW,GAAAX,EAAA,kBAAAY,GAAsC,OAAAT,EAAA,MAAgBU,IAAAD,EAAAE,GAAAT,YAAA,aAAmCF,EAAA,OAAYE,YAAA,mBAA6BF,EAAA,KAAUY,OAAOC,KAAA,4EAAAJ,EAAAE,GAAA,eAAwGX,EAAA,OAAYG,aAAaC,KAAA,OAAAC,QAAA,SAAAC,MAAAG,EAAA,OAAAF,WAAA,kBAA4EV,EAAAiB,GAAA,KAAAd,EAAA,QAAyBE,YAAA,iBAA2BF,EAAA,KAAUE,YAAA,qBAA+BL,EAAAiB,GAAAjB,EAAAkB,GAAAlB,EAAAmB,GAAA,UAAAnB,CAAAY,EAAAQ,qBAAApB,EAAAiB,GAAA,KAAAd,EAAA,KAAgFY,OAAOC,KAAA,4EAAAJ,EAAAE,GAAA,eAAwGX,EAAA,OAAYE,YAAA,kBAA4BF,EAAA,MAAWE,YAAA,4BAAsCL,EAAAiB,GAAAjB,EAAAkB,GAAAN,EAAAS,aAAArB,EAAAiB,GAAA,KAAAd,EAAA,MAAuDE,YAAA,iBAA4BL,EAAAW,GAAAC,EAAA,kBAAAU,EAAAC,GAA6C,OAAApB,EAAA,MAAgBE,YAAA,kBAA4BF,EAAA,KAAUE,YAAA,eAAyBL,EAAAiB,GAAAjB,EAAAkB,GAAAK,EAAA,MAAAvB,EAAAiB,GAAA,KAAAd,EAAA,QAAqDE,YAAA,cAAwBL,EAAAiB,GAAAjB,EAAAkB,GAAAI,EAAAE,aAAAxB,EAAAiB,GAAA,KAAAjB,EAAAkB,GAAAI,EAAAG,YAAA,gDAAiHzB,EAAAiB,GAAA,KAAAd,EAAA,OAA2BG,aAAaC,KAAA,OAAAC,QAAA,SAAAC,MAAAT,EAAA,UAAAU,WAAA,cAA0EL,YAAA,YAAwBF,EAAA,OAAYY,OAAOW,IAAAC,EAAA,QAAAC,IAAA,MAAoD5B,EAAAiB,GAAA,KAAAd,EAAA,KAAAH,EAAAiB,GAAA,qBAEnlDY,oBCCjB,IAcAC,EAdAH,EAAA,OAcAI,CACAC,EACAlC,GATA,EAVA,SAAAmC,GACAN,EAAA,SAaA,kBAEA,MAUAO,EAAA,QAAAJ,EAAA","file":"static/js/1.4cf3c45af5c8c3684b6c.js","sourcesContent":["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport { TOPLIST_URL } from '../../config/api';\nimport mixin from '../../config/mixin';\nimport { rankList } from '../../service/getData';\n\n@Component({\n mixins: [mixin]\n})\nexport default class rank extends Vue {\n rankList = null;\n isLoading: boolean = true;\n mounted() {\n rankList()\n .then(res => {\n this.rankList = res.data.topList;\n this.isLoading = false;\n })\n .catch(err => {\n console.log(err);\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/pages/rank/rank.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"tab-contents\"},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.isLoading),expression:\"!isLoading\"}],staticClass:\"rank-view tab-content\"},[_c('ul',{staticClass:\"toplist\"},_vm._l((_vm.rankList),function(item){return _c('li',{key:item.id,staticClass:\"top-item\"},[_c('div',{staticClass:\"top-item-media\"},[_c('a',{attrs:{\"href\":\"https://y.qq.com/w/toplist.html?ADTAG=myqq&from=myqq&channel=10007100&id=\"+item.id+\"&type=top\"}},[_c('img',{directives:[{name:\"lazy\",rawName:\"v-lazy\",value:(item.picUrl),expression:\"item.picUrl\"}]}),_vm._v(\" \"),_c('span',{staticClass:\"listen_count\"},[_c('i',{staticClass:\"icon icon-listen\"}),_vm._v(_vm._s(_vm._f(\"dealNum\")(item.listenCount)))])])]),_vm._v(\" \"),_c('a',{attrs:{\"href\":\"https://y.qq.com/w/toplist.html?ADTAG=myqq&from=myqq&channel=10007100&id=\"+item.id+\"&type=top\"}},[_c('div',{staticClass:\"top-item-info\"},[_c('h3',{staticClass:\"top-item-title ellipsis\"},[_vm._v(_vm._s(item.topTitle))]),_vm._v(\" \"),_c('ul',{staticClass:\"top-item-list\"},_vm._l((item.songList),function(song,index){return _c('li',{staticClass:\"top-item-song\"},[_c('i',{staticClass:\"song-index\"},[_vm._v(_vm._s(index + 1))]),_vm._v(\" \"),_c('span',{staticClass:\"song-name\"},[_vm._v(_vm._s(song.songname))]),_vm._v(\"- \"+_vm._s(song.singername)+\"\\n \")])}))])])])}))]),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isLoading),expression:\"isLoading\"}],staticClass:\"loading\"},[_c('img',{attrs:{\"src\":require(\"../../assets/loading.gif\"),\"alt\":\"\"}}),_vm._v(\" \"),_c('p',[_vm._v(\"正在加载中.....\")])])])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-f7e4c728\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/rank/rank.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-f7e4c728\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!sass-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./rank.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!ts-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./rank.vue\"\nimport __vue_script__ from \"!!ts-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./rank.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-f7e4c728\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./rank.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-f7e4c728\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/rank/rank.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/manifest.3aa985dad67cd32a3734.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap ea0b14bda5f9c7ffb795"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","4","exports","module","l","e","installedChunkData","Promise","resolve","promise","reject","head","document","getElementsByTagName","script","createElement","type","charset","async","timeout","nc","setAttribute","src","p","0","1","2","3","setTimeout","onScriptComplete","onerror","onload","clearTimeout","chunk","Error","undefined","appendChild","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAA,SAAApB,GACA,IAAAqB,EAAAhB,EAAAL,GACA,OAAAqB,EACA,WAAAC,QAAA,SAAAC,GAA0CA,MAI1C,GAAAF,EACA,OAAAA,EAAA,GAIA,IAAAG,EAAA,IAAAF,QAAA,SAAAC,EAAAE,GACAJ,EAAAhB,EAAAL,IAAAuB,EAAAE,KAEAJ,EAAA,GAAAG,EAGA,IAAAE,EAAAC,SAAAC,qBAAA,WACAC,EAAAF,SAAAG,cAAA,UACAD,EAAAE,KAAA,kBACAF,EAAAG,QAAA,QACAH,EAAAI,OAAA,EACAJ,EAAAK,QAAA,KAEArB,EAAAsB,IACAN,EAAAO,aAAA,QAAAvB,EAAAsB,IAEAN,EAAAQ,IAAAxB,EAAAyB,EAAA,aAAAtC,EAAA,KAAwEuC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,wBAA4G1C,GAAA,MACpL,IAAAkC,EAAAS,WAAAC,EAAA,MAEA,SAAAA,IAEAf,EAAAgB,QAAAhB,EAAAiB,OAAA,KACAC,aAAAb,GACA,IAAAc,EAAA3C,EAAAL,GACA,IAAAgD,IACAA,GACAA,EAAA,OAAAC,MAAA,iBAAAjD,EAAA,aAEAK,EAAAL,QAAAkD,GAKA,OAfArB,EAAAgB,QAAAhB,EAAAiB,OAAAF,EAaAlB,EAAAyB,YAAAtB,GAEAL,GAIAX,EAAAuC,EAAAzC,EAGAE,EAAAwC,EAAAtC,EAGAF,EAAAyC,EAAA,SAAArC,EAAAsC,EAAAC,GACA3C,EAAA4C,EAAAxC,EAAAsC,IACAhD,OAAAmD,eAAAzC,EAAAsC,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMA3C,EAAAiD,EAAA,SAAA5C,GACA,IAAAsC,EAAAtC,KAAA6C,WACA,WAA2B,OAAA7C,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAyC,EAAAE,EAAA,IAAAA,GACAA,GAIA3C,EAAA4C,EAAA,SAAAO,EAAAC,GAAsD,OAAA1D,OAAAC,UAAAC,eAAAC,KAAAsD,EAAAC,IAGtDpD,EAAAyB,EAAA,KAGAzB,EAAAqD,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.3aa985dad67cd32a3734.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t4: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"static/js/\" + chunkId + \".\" + {\"0\":\"8413109ca33965849bfc\",\"1\":\"4cf3c45af5c8c3684b6c\",\"2\":\"f9ac7895012856401c90\",\"3\":\"ddbf42d99ac71f76e2fc\"}[chunkId] + \".js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"./\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ea0b14bda5f9c7ffb795"],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/0.8413109ca33965849bfc.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([0],{Jl48:function(t,s){},NcgL:function(t,s,e){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var i=e("TToO"),r=e("7+uW"),o=e("c+8m"),a=e.n(o),n=e("0Zxd"),c=e("NYxO"),l=(h("computed",c.e),h("computed",c.c),h("methods",c.b));h("methods",c.d);function h(t,s){function e(e,i){return Object(o.createDecorator)(function(r,o){r[t]||(r[t]={});var a,n=((a={})[o]=e,a);r[t][o]=void 0!==i?s(i,n)[o]:s(n)[o]})}return function(t,s){if("string"==typeof s){var i=s,r=t;return e(i,void 0)(r,i)}return e(t,function(t){var s=t&&t.namespace;if("string"==typeof s)return"/"!==s[s.length-1]?s+"/":s}(s))}}var d=e("qxKj"),u=e("EOM2"),p=e("DZ+H"),y=function(t){function s(){var s=null!==t&&t.apply(this,arguments)||this;return s.fetching=!1,s.isplay=!1,s.duration=s.song.interval,s.progress=0,s.elapsed=0,s.progressIntervalId=0,s.lyrics=[],s.index=0,s.LINE_HEIGHT=42,s.lyricIntervalId=0,s}return i.d(s,t),Object.defineProperty(s.prototype,"isShowPlayer",{get:function(){return this.$store.state.isShowPlayer},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"isPlay",{get:function(){return this.$store.state.isPlay},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"$audio",{get:function(){return this.$refs.audio},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"$progress",{get:function(){return this.$refs.$progress},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"$lyricsLines",{get:function(){return this.$refs.lyricsLines},enumerable:!0,configurable:!0}),s.prototype.created=function(){this.init()},s.prototype.mounted=function(){document.body.classList.add("noscroll")},s.prototype.init=function(){var t=this;this.fetching=!0,Object(n.a)(this.song.songid).then(function(t){return t.lyric}).then(function(s){t.index=0,t.lyrics=t.formatText(s).match(/^\[\d{2}:\d{2}.\d{2}\](.+)$/gm)}).catch(function(t){return console.error(t)}).then(function(){return t.fetching=!1})},s.prototype.onPlay=function(){if(this.isplay=!this.isplay,this.isplay){if(this.fetching)return;this.$audio.play(),this.setPlayState(!0),this.startLyrics(),this.startProgress()}else this.$audio.pause(),this.setPlayState(!1),this.pauseLyrics(),this.pauseProgress()},s.prototype.onEnd=function(){this.$audio.play(),this.restartProgress(),this.restartLyrics()},s.prototype.startLyrics=function(){this.pauseLyrics(),this.lyricIntervalId=setInterval(this.updateLyrics.bind(this),1e3)},s.prototype.pauseLyrics=function(){clearInterval(this.lyricIntervalId)},s.prototype.updateLyrics=function(){var t=this;if(this.$audio.ontimeupdate=function(s){for(var e=0,i=t.lyrics.length;et.getSeconds(t.lyrics[e])-.5&&(t.$lyricsLines.children[t.index].classList.remove("active"),t.$lyricsLines.children[e].classList.add("active"),t.index=e)},this.index>2){var s=-(this.index-2)*this.LINE_HEIGHT;this.$lyricsLines.style.transform="translateY("+s+"px)"}},s.prototype.resetLyrics=function(){this.pauseLyrics(),this.$lyricsLines.children[this.index].classList.remove("active"),this.index=0,this.$lyricsLines.style.transform="translateY(0)",this.lyrics.length&&this.$lyricsLines.children[this.index].classList.add("active")},s.prototype.restartLyrics=function(){this.resetLyrics(),this.startLyrics()},s.prototype.startProgress=function(){this.pauseProgress(),this.progressIntervalId=setInterval(this.updateProgress.bind(this),50)},s.prototype.pauseProgress=function(){clearInterval(this.progressIntervalId)},s.prototype.updateProgress=function(){this.elapsed+=.05,this.progress=this.elapsed/this.duration,this.$progress.style.transform="translateX("+(100*this.progress-100)+"%)"},s.prototype.resetProgress=function(t){this.pauseProgress();this.elapsed=0,this.progress=0,this.$progress.style.transform="translate(-100%)",t&&(this.duration=+t)},s.prototype.restartProgress=function(){this.resetProgress(),this.startProgress()},s.prototype.getAlbumCover=function(t){return Object(d.a)(t)},s.prototype.getSongUrl=function(t){return Object(d.d)(t)},s.prototype.exit=function(){this.cancelPlayer(),this.setPlayState(!1),document.body.classList.remove("noscroll")},s.prototype.getSeconds=function(t){return+t.replace(/^\[(\d{2}):(\d{2}\.\d{2}).*/,function(t,s,e){return 60*+s+parseFloat(+e)})},s.prototype.formatText=function(t){var s=document.createElement("div");return s.innerHTML=t,s.innerText},i.c([Object(u.Prop)(Object)],s.prototype,"song",void 0),i.c([Object(u.Prop)(String)],s.prototype,"artist",void 0),i.c([l("cancelPlayer")],s.prototype,"cancelPlayer",void 0),i.c([l("setPlayState")],s.prototype,"setPlayState",void 0),s=i.c([a()({mixins:[p.a]})],s)}(r.default),v={render:function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("transition",{attrs:{name:"show-transition"}},[e("div",{directives:[{name:"show",rawName:"v-show",value:t.isShowPlayer,expression:"isShowPlayer"}],class:{show:t.isShowPlayer},attrs:{id:"player"}},[e("div",{staticClass:"player-container"},[e("div",{staticClass:"player-header"},[e("img",{staticClass:"album-cover",attrs:{src:t.getAlbumCover(t.song.albummid),alt:"图片"}}),t._v(" "),e("div",{staticClass:"song-info"},[e("div",{staticClass:"song-name",domProps:{innerHTML:t._s(t.song.songname)}}),t._v(" "),e("div",{staticClass:"song-artist",domProps:{innerHTML:t._s(t.artist)}})]),t._v(" "),e("span",{staticClass:"icon-action icon-play",class:[t.isPlay?"icon-pause":"icon-play"],on:{click:t.onPlay}})]),t._v(" "),e("div",{staticClass:"player-lyrics"},[e("div",{ref:"lyricsLines",staticClass:"player-lyrics-lines"},[t._l(t.lyrics,function(s){return e("div",{directives:[{name:"show",rawName:"v-show",value:0!==t.lyrics.length,expression:"lyrics.length !== 0"}],staticClass:"player-lyrics-line"},[t._v(t._s(s.slice(10)))])}),t._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:t.fetching,expression:"fetching"}],staticClass:"player-lyrics-line"},[t._v("正在加载歌词,请等待...")])],2)]),t._v(" "),e("div",{staticClass:"player-footer"},[e("div",{staticClass:"icon-list",on:{click:t.exit}}),t._v(" "),e("div",{staticClass:"progress"},[e("div",{staticClass:"progress-time progress-elapsed"},[t._v(t._s(t._f("formatTime")(t.elapsed)))]),t._v(" "),e("div",{staticClass:"progress-bar"},[e("div",{ref:"$progress",staticClass:"progress-bar-progress"})]),t._v(" "),e("div",{staticClass:"progress-time progress-duration"},[t._v(t._s(t._f("formatTime")(t.song.interval)))])]),t._v(" "),e("div",{staticClass:"action"},[e("a",{staticClass:"btn-download",attrs:{href:"#"}},[t._v("下载这首歌")])])])]),t._v(" "),e("div",{staticClass:"player-background",style:{backgroundImage:"url("+t.getAlbumCover(t.song.albummid)+")"}}),t._v(" "),e("audio",{ref:"audio",attrs:{src:t.getSongUrl(t.song.songmid)},on:{ended:function(s){t.onEnd()}}})])])},staticRenderFns:[]};var g=e("VU/8")(y,v,!1,function(t){e("Jl48")},"data-v-b526c8f6",null).exports,f=function(t){function s(){var s=null!==t&&t.apply(this,arguments)||this;return s.hotkeys=null,s.data="",s.keyword="",s.getLastKeyword="",s.fetching=!1,s.isLoad=!0,s.page=1,s.isShowCancel=!1,s.isShowDelete=!1,s.isShowHistory=!1,s.isShowSearchResults=!1,s.songsObject={},s.searchResult=null,s.history=[],s.isGetHotKey=!1,s}return i.d(s,t),Object.defineProperty(s.prototype,"song",{get:function(){return this.$store.state.song},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"artist",{get:function(){return this.$store.state.artist},enumerable:!0,configurable:!0}),Object.defineProperty(s.prototype,"isShowPlayer",{get:function(){return this.$store.state.isShowPlayer},enumerable:!0,configurable:!0}),s.prototype.created=function(){var t=this;Object(n.b)().then(function(s){var e=s.data.hotkey;t.data=s.data,t.hotkeys=t.shuffle(e,6),t.isGetHotKey=!0})},s.prototype.mounted=function(){window.addEventListener("scroll",this.onScroll.bind(this)),this.history=localStorage.getItem("SET_HISTORY_KEY")?localStorage.getItem("SET_HISTORY_KEY").split(","):[]},s.prototype.enter=function(t){this.keyword?this.isShowDelete=!0:(this.isShowDelete=!1,this.reset()),13===t.keyCode&&(this.isShowHistory=!1,this.isShowSearchResults=!0,this.addHistory(this.keyword),this.search(this.keyword))},s.prototype.onClick=function(t){if(t.target.matches("#search")&&(this.isShowCancel=!0,this.isShowHistory=!0),t.target.matches(".search-cancel")&&(this.isShowCancel=!1,this.isShowDelete=!1,this.isShowHistory=!1,this.reset()),t.target.matches(".icon-delete")&&(this.isShowDelete=!1,this.reset()),t.target.matches(".record-delete")&&(this.history=[],this.setLocalStorageData(this.history)),t.target.matches(".icon .icon-close")){var s=this.history.indexOf(t.target.previousElementSibling.innerHTML);this.history.splice(s,1),this.setLocalStorageData(this.history)}(t.target.matches(".tag-keyword")||t.target.matches(".record-con"))&&(this.keyword=t.target.innerHTML,this.isShowDelete=!0,this.isShowCancel=!0,this.isShowHistory=!1,this.isShowSearchResults=!0,this.addHistory(this.keyword),this.search(this.keyword))},s.prototype.search=function(t,s){var e=this;void 0===t&&(t=""),""!==t&&(this.getLastKeyword===t&&this.songsObject[s||this.page]||(this.getLastKeyword!==t&&this.reset(),!this.fetching&&this.isLoad&&(this.getLastKeyword=t,this.loading(),Object(n.e)(t,s||this.page).then(function(t){e.page=t.data.song.curpage,e.songsObject[e.page]=t.data.song.list,e.searchResult?e.searchResult=e.searchResult.concat(t.data.song.list):e.searchResult=t.data.song.list,e.isLoad="no results"!==t.message}).then(function(){return e.accomplish()}).catch(function(t){console.log(t)}))))},s.prototype.onScroll=function(t){if(!this.isLoad)return window.removeEventListener("scroll",this.onScroll.bind(this));document.documentElement.clientHeight+pageYOffset>document.body.scrollHeight-100&&this.search(this.keyword,this.page+1)},s.prototype.accomplish=function(){this.fetching=!1},s.prototype.loading=function(){this.fetching=!0},s.prototype.reset=function(){this.page=1,this.isLoad=!0,this.songsObject={},this.searchResult=null},s.prototype.addHistory=function(t){-1===this.history.indexOf(t)&&(this.history.unshift(t),this.setLocalStorageData(this.history))},s.prototype.shuffle=function(t,s){for(var e=[],i=Math.min(s,t.length),r=0;r0&&t.isShowHistory?e("div",{staticClass:"record-keys"},[t._l(t.history,function(s){return e("li",[e("div",{staticClass:"record-main"},[e("span",{staticClass:"icon icon-clock"}),t._v(" "),e("span",{staticClass:"record-con ellipsis"},[t._v(t._s(s))]),t._v(" "),e("span",{staticClass:"icon icon-close"})])])}),t._v(" "),e("p",{staticClass:"record-delete"},[t._v("清除搜索记录")])],2):t._e(),t._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:t.isShowSearchResults,expression:"isShowSearchResults"}],staticClass:"search-results"},[e("div",{staticClass:"song-list"},t._l(t.searchResult,function(s){return e("div",{key:s.songid,staticClass:"song-item",on:{click:function(e){t.showPlayerDetail(s)}}},[e("i",{staticClass:"icon icon-music"}),t._v(" "),e("div",{staticClass:"song-name",domProps:{innerHTML:t._s(s.songname)}}),t._v(" "),e("div",{staticClass:"song-artist"},t._l(s.singer,function(s){return e("span",{domProps:{innerHTML:t._s(s.name+" ")}})}))])})),t._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:t.fetching,expression:"fetching"}],staticClass:"search-loading show"},[e("i",{staticClass:"loading-icon"}),t._v(" "),e("div",{staticClass:"loading-text"},[t._v("正在载入更多...")])]),t._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:!t.isLoad,expression:"!isLoad"}],staticClass:"search-loading show"},[e("div",{staticClass:"loading-done"},[t._v("已加载全部")])])]),t._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:!t.isShowHistory&&!t.isShowSearchResults,expression:"!isShowHistory && !isShowSearchResults"}],staticClass:"mod-search-result",attrs:{id:"hot-keys"}},[e("h3",{staticClass:"result-tit"},[t._v("热门搜索")]),t._v(" "),t.isGetHotKey?e("div",{staticClass:"result-tags"},[t.data.special_url?e("a",{staticClass:"tag tag-hot",attrs:{href:t.data.special_url}},[t._v(t._s(t.data.special_key))]):t._e(),t._v(" "),t._l(t.hotkeys,function(s){return e("div",{key:s.n,staticClass:"tag tag-keyword"},[t._v(t._s(s.k))])})],2):t._e(),t._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:!t.isGetHotKey,expression:"!isGetHotKey"}],staticClass:"search-loading show"},[e("i",{staticClass:"loading-icon"}),t._v(" "),e("div",{staticClass:"loading-text"},[t._v("正在加载...")])])])]),t._v(" "),t.isShowPlayer?e("player",{attrs:{song:t.song,artist:t.artist}}):t._e()],1)},staticRenderFns:[]};var w=e("VU/8")(f,m,!1,function(t){e("vUv8")},"data-v-253d69cc",null);s.default=w.exports},vUv8:function(t,s){}}); 2 | //# sourceMappingURL=0.8413109ca33965849bfc.js.map -------------------------------------------------------------------------------- /src/components/Player.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 262 | 263 | 442 | -------------------------------------------------------------------------------- /dist/static/js/app.ddbf42d99ac71f76e2fc.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([3],{"0Zxd":function(A,t,n){"use strict";var e=n("TToO"),i=this,a=function(A,t,n,a){return void 0===A&&(A=""),void 0===t&&(t={}),void 0===n&&(n="GET"),void 0===a&&(a="fetch"),e.b(i,void 0,void 0,function(){var i,s,r;return e.e(this,function(e){switch(e.label){case 0:if("GET"===(n=n.toUpperCase())&&(i="",Object.keys(t).forEach(function(A){i+=A+"="+t[A]+"&"}),""!==i&&(i=i.substr(0,i.lastIndexOf("&")),A=A+"?"+i)),!window.fetch||"fetch"!==a)return[3,6];s={method:n,headers:{Accept:"application/json","Content-Type":"application/json","Access-Control-Allow-Origin":"*"},mode:"cors",cache:"force-cache"},"POST"===n&&Object.defineProperty(s,"body",{value:JSON.stringify(t)}),e.label=1;case 1:return e.trys.push([1,4,,5]),[4,fetch(A,s)];case 2:return[4,e.sent().json()];case 3:return[2,e.sent()];case 4:throw r=e.sent(),new Error(r);case 5:return[3,7];case 6:return[2,new Promise(function(e,i){var a;a=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");var s="";"POST"===n&&(s=JSON.stringify(t)),a.open(n,A,!0),a.setRequestHeader("Content-type","application/x-www-form-urlencoded"),a.send(s),a.onreadystatechange=function(){if(4===a.readyState)if(200===a.status){var A=a.response;"object"!=typeof A&&(A=JSON.parse(A)),e(A)}else i(a)}})];case 7:return[2]}})})},s=n("2BbL"),r=n("qxKj");n.d(t,"d",function(){return o}),n.d(t,"c",function(){return c}),n.d(t,"b",function(){return u}),n.d(t,"e",function(){return l}),n.d(t,"a",function(){return d});var o=function(){return a(s.c)},c=function(){return a(s.e)},u=function(){return a(s.a)},l=function(A,t){return a(Object(r.c)(A,t))},d=function(A){return a(Object(r.b)(A))}},"2BbL":function(A,t,n){"use strict";n.d(t,"c",function(){return e}),n.d(t,"e",function(){return i}),n.d(t,"d",function(){return a}),n.d(t,"b",function(){return s}),n.d(t,"a",function(){return r});var e="https://shenzekun-qmusic-api.now.sh/",i="https://shenzekun-qmusic-api.now.sh/top",a="https://shenzekun-qmusic-api.now.sh/search",s="https://shenzekun-qmusic-api.now.sh/lyrics",r="https://shenzekun-qmusic-api.now.sh/hotkey"},"7Otq":function(A,t){A.exports="data:image/png;base64,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"},"DZ+H":function(A,t,n){"use strict";var e={filters:{dealNum:function(A){return(A/1e4).toFixed(1)+"万"},formatTime:function(A){var t=Math.floor(A/60),n=Math.floor(A%60);return t<10&&(t="0"+t),n<10&&(n="0"+n),t+":"+n}}};t.a=e},"G/2H":function(A,t){A.exports="data:image/gif;base64,R0lGODlhlgCWAMMAAPT09OXl5dzc3M3NzcXFxb29vbW1ta2trZ6enuzs7NTU1KampgAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAMACwAAAAAlgCWAAAEwBDISau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru987//AoHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7Xq/4LB4TC6bz+i0es1uu9/wuHxOr9vv+Lx+z+/7/4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uOWEQAh+QQFCgAMACwRABEAPQAzAAAE+ZDJSau9ONcgBiGFIRaCZp5nMBQH4r7IMQRobTOJUizvYhQDRYB2K2oSA0OvoEgYnydB4WWYQa8aRSs2cGK/Fi1iQSCCzxIx2Ys+B5TrNjpB4BXY8q+AdzDnvwRjA39nCS19hGB7CAWJYAoLCwqOXwNjfpRGgQd4mUVTnJ5QUwadojWBBqdPlqGrNwoxpq8aAZGYtEcHCyW5NVODviiWqsIpkbPGFS29yhmxjc4ZCcjSGVOT1hcBMdoYSrje3NHeFVPh2uPlFlPN6zgLB+8UlsHzDAYLydbcxfeB2e7tuidBHUFLAedN2WctHkEGBu/FsjcvELpyDKVFAAAh+QQFCgAMACwQAEMAOwBHAAAE/5AZxKq9OOvNez2HJ46khhhlqm4BUqwwLCBEbJfzcO+egii8oGaAEAiPFqIReSQUmc0nNKicUqXWGxGYvfl0XVsubGvVyLCECx1bhNgrwwK+KiAC9NQ2j6PxSwsofyMHc4MiTkuHHDNnixxujx12eJIajZYbC4aZGImdGC0voBeFCaQWPo6opqgVqq4fC6euRKukhZWoLYKudlyoCZu0qD69qHZgwYWKpAHDsUTHpHajrhO3nQkHfq7bCMqkwt3La97c1qgTBsTUCAvNoAoL5M7cBrruC9mZAtwH8ToRoIfPVYAJJwJaEoDQgEJJDBEgODCgXaYABeidUGBRUgIFCCknEhDQcVGCAXIkniAwQEC+RwIIhFR5wICBAvz4BFAwoEBKlbEYJAgQAQAh+QQFCgAMACxLAFMAPgA3AAAE/5DJSau9OGs6kNhgKGYFEoxouhmI6r7TcsA0miBGrYMCQuxATEcRLFJKCaNSpjQGEIVmcSgNGhbJqu6W0+qo3to1G349o2UYwZN+JRaL9qszkLvgdhU9n4KT+SB7gCFvM4MhJUSHGz1dixkJB1iPGiV1lBgKOJgYAX6cFwdsoBUlP6QUa46oDB0Hf6Sar6wSCp+0HQsntGu6tAwls6wJLAawnAILm7hwl6jECAe7qAPKBceUAqILiqQBJT7Yi98I0dOc5NHdmAkDojgfnAkKLAgLBfHZA/U4CuJtCQQoIHClHI4B58oQWLjQgEODBg8QEPDPC0SIBgoMUJAQUICPAQQqLooAACH5BAUKAAwALGUAFgAkAD0AAATIMCVGq704Y7XG1GBocUgnnmAyLMgRoPCVEGzxxXFglArukzZfLHFovYQwAg8JE7AGTBQRQYiepgWrKLEz3LSZAsIADomzZc2umsZMoW1ZURC/BBaLb10xrl/EbH4MU3SCDHcHhhRKgYIHeYp8ZIpiPYaIigxihYIBfZQInH6ek4Y7R4ICVJl4mUqidZ5oho+uoYqqjX4LiYoGkIavuAhwnQizgryZtaB6ccKGAwiWgnzFfqrXsauX3Ma6cbKKnuBt5MPacdmR0xEAIfkEBQoADAAsSwAIAAIAbQAABEUwMRlYFQzrzA6vEiOOU3lxCpMKiRC8ASvHsWDHbb5hVV+SI4mwROFsUkiVchNIJJqY5OrzA1qv2Ox1eGIpAgqbmMYCTSIAIfkEBQoADAAsQgAIABQAbgAABP8QyEkrCDbbkrQHh/BlAqGM1qAMaMUNXXsZwIDJBWvLwtIpootgQCAUDMiCILEgSIAAhHSKOOwSh8NEcDLkFIGbBHuIAbgfsvl80jBpFXTmTWpXmAWNvHLI6+0TBX5/FQFlH1AUOSMDQWNwHwRiNU4jBGsFk3ODEpx6lWOgHgMsEwGiGpkUAaUeCZBjrRpEd6gWB5oAthQDnhKXegu5NY4UCgi7ACurBgsIsoWiAwgcI9VP0BoEjqwtCqAJyXecwCjXxC0qW+IUJRMJvpuKwxaSEybedt8tp6bxGecMrPGwLVAxD0MmkGoRbsu/ejFeyWgUiF6hVvhagFLwsIK9GTLeFNgRyA+UEhmgFqa7IaBjuzYSGZq0WAHGL0CuKCpjd+aAlFIBOhag9m3QOReHNgwjkDQFzgvCENoykI0CvEJarGGq6nESSUaOWrZI+Oughn6dBrqphFajBLIaO+jUiMEmyhNcZ9nIm4HIHm8FEoWkavaDAKo0LRz+yMNAucaPvTlWi6hAZBRELlsiktjFis7z5qK4KlLGmTx/GTlJwNezhNYUvu5AEQCS4Eig2n4IoQjFYY+FFUFz58GQWlUaqGbgqEFB1gwHngZYEBxqMQHPRmAPzDE7bZ9Vqs+hPCECACH5BAUKAAwALDIACAA0AG4AAAT/EMhJq734qsy7x8FSfGR5GcZCmCypIIKABG2NJYshFbrtS4nDggaQCX62IGJAOayQLMUC8ZwUFtBSoICgWgaIhC0gGBAIPFThSBFwEQd2xagdFA7dfPcwIAIHeAgLTCAIGxwJCld5OQUDCgF+EwoGXSJyN0s3A5WWBQpiGW5TlyQJmnNvCAZ9HQEEU6ugJqdVAAqBfKEZCZx7A7u0XgBKKpIYo3CtPqeEUgTBFwmwggTHSaizHVKrmFABhqZccVkVL9cXAXgF0eVXHwILC4flFDgjrvLe9QBg+xZC/tVbcMADGFv8JBCA4SFFu3oyenQQkdCevIcWVFQEEpDEAXwJ/5XQ8wCropR5JujU4zKkxYGC36gZwLiNYYsEARQA6mJAoMcFNCf0ShNLECt0LMCBFJXnIwFICbmMxIAHabkgLTnImFoxBEwOV4JmOdjh3sYKXHxKAMM15MUOQqyWiyex0Nez/VBl4EIIL4AUcnEA9UuMYAcwS8/KSAwwHOGFbSeAu4vXIdhhfnHUtSBY7ly9F8BsPgtLLZ7ICQ0coAluMGGzexEw3riV1xTP5WBZBUMZ70sOpwlLCIGwjSCx5V745FKctGvO8nCXOzB6gmjhwwdlCI5dClIZvbvSuBO7b7kAdlLoWXfjLZJEi3KcUUDfzJ3IC2eXSMZHOtWsLAiAh/8xULxQHSIsQVMPHmrNMQU7CYFz4BeCoIYEF7gtdIB/NcCWwUIzPTZDBqIh941syBBkYhZCtIPVimM5RsEVHGahVAXgNEeYEBWohp0FC/lR248UvFAFeURSICEQKCVJgTwSSAFjRVUBUIB+P0oFQJNOTrAQMCN2aR0V8YhJwUG4mOnlEoCouYMhnLgJAINxujlFIuERCV4RCLjJHDFhinmbBNqJed0OE2Y2hRwy1FgObxVolCQONln3HHaVMIaDjhtpiMEAAPoFRqg9XrrRqGppJqogDRZBUaeskkDXlB6oA0eN8WyY3BSccqCOpD7gAkerHMBygIU3CHusjQkKIBYdfHsgexOoe8xHH31o5LLMWegtoke1UHUZCa0cRAAAIfkEBQoADAAsAAAAAAEAAQAABAKQRQAh+QQFCgAMACwAAAAAAQABAAAEApBFADsvKiAgfHhHdjAwfGIyMDNjMjdlNjdkOGExZDQzYTcyOGVjOWE1MWZkNjdjICov"},I1Xt:function(A,t){},"Q1J/":function(A,t){A.exports="data:image/jpeg;base64,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"},SDiI:function(A,t){},dr8W:function(A,t){},jQJI:function(A,t){},qxKj:function(A,t,n){"use strict";t.d=function(A){return"http://isure.stream.qqmusic.qq.com/C100"+A+".m4a?fromtag=32"},t.b=function(A){return e.b+"?id="+A},t.a=function(A){return"https://y.gtimg.cn/music/photo_new/T002R150x150M000"+A+".jpg"},t.c=function(A,t){void 0===t&&(t=1);return e.d+"?keyword="+A+"&page="+t};var e=n("2BbL")},x35b:function(A,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var e=n("7+uW"),i=n("TToO"),a=n("c+8m"),s=n.n(a),r=function(A){function t(){var t=null!==A&&A.apply(this,arguments)||this;return t.navConfig=[{name:"推荐",key:0,href:"/"},{name:"排行榜",key:1,href:"/rank"},{name:"搜索",key:2,href:"/search"}],t}return i.d(t,A),t=i.c([s.a],t)}(e.default),o={render:function(){var A=this,t=A.$createElement,n=A._self._c||t;return n("div",[A._m(0),A._v(" "),n("nav",{staticClass:"navbar"},[n("ul",{staticClass:"nav-list"},A._l(A.navConfig,function(t){return n("li",{key:t.key,staticClass:"nav-item"},[n("router-link",{attrs:{to:t.href,tag:"li","exact-active-class":"active"}},[A._v(A._s(t.name))])],1)}))])])},staticRenderFns:[function(){var A=this.$createElement,t=this._self._c||A;return t("header",{attrs:{id:"header"}},[t("img",{attrs:{src:n("7Otq"),alt:"qq音乐",id:"logo"}}),this._v(" "),t("a",{staticClass:"btn_download",attrs:{href:"javascript:;"}},[this._v("下载APP")])])}]};var c=n("VU/8")(r,o,!1,function(A){n("dr8W")},"data-v-25c9f94b",null).exports,u=function(A){function t(){return null!==A&&A.apply(this,arguments)||this}return i.d(t,A),t=i.c([s()({components:{NavHeader:c}})],t)}(e.default),l={render:function(){var A=this.$createElement,t=this._self._c||A;return t("div",{attrs:{id:"app"}},[t("nav-header"),this._v(" "),t("keep-alive",[t("router-view")],1)],1)},staticRenderFns:[]};var d=n("VU/8")(u,l,!1,function(A){n("SDiI")},null,null).exports,f=n("/ocq"),p=n("EOM2"),v=n("DNVT"),h=function(A){function t(){return null!==A&&A.apply(this,arguments)||this}return i.d(t,A),t.prototype.mounted=function(){new v.a(".swiper-container",{loop:!0,pagination:{el:".swiper-pagination"},autoplay:!0})},i.c([Object(p.Prop)({required:!0})],t.prototype,"lists",void 0),t=i.c([s.a],t)}(e.default),w={render:function(){var A=this.$createElement,t=this._self._c||A;return t("div",{staticClass:"swiper-container"},[t("div",{staticClass:"swiper-wrapper"},this._l(this.lists,function(A){return t("div",{key:A.id,staticClass:"swiper-slide"},[t("a",{attrs:{href:A.linkUrl}},[t("img",{attrs:{src:A.picUrl}})])])})),this._v(" "),t("div",{staticClass:"swiper-pagination"})])},staticRenderFns:[]};var g=n("VU/8")(h,w,!1,function(A){n("jQJI")},null,null).exports,m=n("0Zxd"),C=n("DZ+H"),B=function(A){function t(){var t=null!==A&&A.apply(this,arguments)||this;return t.radioList=null,t.songList=null,t.slider=null,t.isLoading=!0,t}return i.d(t,A),t.prototype.mounted=function(){var A=this;Object(m.d)().then(function(t){A.radioList=t.data.radioList,A.songList=t.data.songList,A.slider=t.data.slider,A.isLoading=!1}).catch(function(A){console.log(A)})},t=i.c([s()({components:{Swipe:g},mixins:[C.a]})],t)}(e.default),E={render:function(){var A=this,t=A.$createElement,e=A._self._c||t;return e("div",{staticClass:"tab-contents"},[e("div",{directives:[{name:"show",rawName:"v-show",value:!A.isLoading,expression:"!isLoading"}],staticClass:"rec-view tab-content"},[A.slider?e("swipe",{attrs:{lists:A.slider}}):A._e(),A._v(" "),e("div",{staticClass:"radios"},[e("h2",{staticClass:"title"},[A._v("电台")]),A._v(" "),e("div",{staticClass:"list"},A._l(A.radioList,function(t){return e("div",{key:t.radioid,staticClass:"list-item"},[e("div",{staticClass:"list-media"},[e("img",{directives:[{name:"lazy",rawName:"v-lazy",value:t.picUrl,expression:"radio.picUrl"}]}),A._v(" "),e("span",{staticClass:"icon icon_play"})]),A._v(" "),e("div",{staticClass:"list-info"},[A._v(A._s(t.Ftitle))])])}))]),A._v(" "),e("div",{staticClass:"playlists"},[e("h2",{staticClass:"title"},[A._v("热门歌单")]),A._v(" "),e("div",{staticClass:"list"},A._l(A.songList,function(t){return e("div",{key:t.id,staticClass:"list-item"},[e("a",{attrs:{href:"https://y.qq.com/w/taoge.html?ADTAG=myqq&from=myqq&channel=10007100&id="+t.id}},[e("div",{staticClass:"list-media"},[e("img",{directives:[{name:"lazy",rawName:"v-lazy",value:t.picUrl,expression:"list.picUrl"}]}),A._v(" "),e("span",{staticClass:"listen_count"},[e("span",{staticClass:"icon icon_listen"}),A._v(A._s(A._f("dealNum")(t.accessnum)))]),A._v(" "),e("span",{staticClass:"icon icon_play"})]),A._v(" "),e("div",{staticClass:"list-info"},[e("div",{staticClass:"list_tit"},[A._v(A._s(t.songListDesc))]),A._v(" "),e("div",{staticClass:"list-text"})])])])}))])],1),A._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:A.isLoading,expression:"isLoading"}],staticClass:"loading"},[e("img",{attrs:{src:n("G/2H"),alt:""}}),A._v(" "),e("p",[A._v("正在加载中.....")])])])},staticRenderFns:[]};var I=n("VU/8")(B,E,!1,function(A){n("I1Xt")},"data-v-19ab272f",null).exports;e.default.use(f.a);var x,T=new f.a({routes:[{path:"",component:I},{path:"/",name:"recommend",component:I},{path:"/rank",name:"rank",component:function(A){return n.e(1).then(function(){return A(n("6Vet"))}.bind(null,n)).catch(n.oe)}},{path:"/search",name:"search",component:function(A){return n.e(0).then(function(){return A(n("NcgL"))}.bind(null,n)).catch(n.oe)}}]}),L=n("NYxO"),y=((x={}).SET_HISTORY_KEY=function(A,t){localStorage.setItem("SET_HISTORY_KEY",t)},x.GET_SONG=function(A,t){A.song=t,A.song.singer.forEach(function(t){A.artist=t.name})},x.SHOW_PLAYER=function(A){A.isShowPlayer=!0},x.CANCEL_PLAYER=function(A){A.isShowPlayer=!1},x.SET_PLAYING_STATE=function(A,t){A.isPlay=t},x),Q={setLocalStorageData:function(A,t){(0,A.commit)("SET_HISTORY_KEY",t)},getSong:function(A,t){(0,A.commit)("GET_SONG",t)},showPlayer:function(A){(0,A.commit)("SHOW_PLAYER")},cancelPlayer:function(A){(0,A.commit)("CANCEL_PLAYER")},setPlayState:function(A,t){(0,A.commit)("SET_PLAYING_STATE",t)}};e.default.use(L.a);var H=new L.a.Store({state:{isShowPlayer:!1,song:{},artist:"",isPlay:!1},actions:Q,mutations:y}),b=n("cTzj"),N=n.n(b);e.default.config.productionTip=!1,e.default.use(N.a,{preLoad:1.3,error:n("Q1J/"),loading:n("Q1J/"),attempt:1});new e.default({router:T,store:H,components:{App:d},template:""}).$mount("#app")}},["x35b"]); 2 | //# sourceMappingURL=app.ddbf42d99ac71f76e2fc.js.map -------------------------------------------------------------------------------- /src/pages/search/search.vue: -------------------------------------------------------------------------------- 1 | 58 | 59 | 277 | 278 | 614 | -------------------------------------------------------------------------------- /dist/static/js/0.8413109ca33965849bfc.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./node_modules/vuex-class/lib/bindings.js","webpack:///./src/components/Player.vue?7aaf","webpack:///./src/components/Player.vue?b82f","webpack:///./src/components/Player.vue","webpack:///./src/pages/search/search.vue?4f6c","webpack:///./src/pages/search/search.vue?db07","webpack:///./src/pages/search/search.vue"],"names":["Action","createBindingHelper","vuex_esm","bindTo","mapFn","makeDecorator","map","namespace","Object","vue_class_component_common","componentOptions","key","_a","mapObject","undefined","a","b","proto","options","n","length","extractNamespace","_super","Player","_this","apply","this","arguments","fetching","isplay","duration","song","interval","progress","elapsed","progressIntervalId","lyrics","index","LINE_HEIGHT","lyricIntervalId","tslib_es6","defineProperty","prototype","$store","state","isShowPlayer","isPlay","$refs","audio","$progress","lyricsLines","created","init","mounted","document","body","classList","add","getData","songid","then","res","lyric","text","formatText","match","catch","err","console","error","onPlay","$audio","play","setPlayState","startLyrics","startProgress","pause","pauseLyrics","pauseProgress","onEnd","restartProgress","restartLyrics","setInterval","updateLyrics","bind","clearInterval","ontimeupdate","e","i","l","currentTime","getSeconds","$lyricsLines","children","remove","y","style","transform","resetLyrics","updateProgress","resetProgress","getAlbumCover","id","utils","getSongUrl","exit","cancelPlayer","line","replace","p1","p2","parseFloat","div","createElement","innerHTML","innerText","vue_property_decorator_umd","String","vue_class_component_common_default","mixins","mixin","vue_esm","selectortype_template_index_0_src_components_Player","render","_vm","_h","$createElement","_c","_self","attrs","name","directives","rawName","value","expression","class","show","staticClass","src","albummid","alt","_v","domProps","_s","songname","artist","on","click","ref","_l","list","slice","_f","href","backgroundImage","songmid","ended","$event","staticRenderFns","src_components_Player","__webpack_require__","normalizeComponent","components_Player","ssrContext","search","hotkeys","data","keyword","getLastKeyword","isLoad","page","isShowCancel","isShowDelete","isShowHistory","isShowSearchResults","songsObject","searchResult","history","isGetHotKey","hotkey","shuffle","window","addEventListener","onScroll","localStorage","getItem","split","enter","reset","keyCode","addHistory","onClick","target","matches","setLocalStorageData","indexOf","previousElementSibling","splice","loading","curpage","concat","message","accomplish","log","removeEventListener","documentElement","clientHeight","pageYOffset","scrollHeight","unshift","array","count","arr","len","Math","min","temp","random","floor","showPlayerDetail","showPlayer","getSong","components","selectortype_template_index_0_src_pages_search_search","modifiers","trim","type","placeholder","keyup","input","composing","blur","$forceUpdate","item","_e","special_url","special_key","k","search_Component","search_normalizeComponent","pages_search_search","__webpack_exports__"],"mappings":"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","file":"static/js/0.8413109ca33965849bfc.js","sourcesContent":["import { createDecorator } from 'vue-class-component';\nimport { mapState, mapGetters, mapActions, mapMutations } from 'vuex';\nexport var State = createBindingHelper('computed', mapState);\nexport var Getter = createBindingHelper('computed', mapGetters);\nexport var Action = createBindingHelper('methods', mapActions);\nexport var Mutation = createBindingHelper('methods', mapMutations);\nexport function namespace(namespace, helper) {\n function namespacedHelper(a, b) {\n if (typeof b === 'string') {\n var key = b;\n var proto = a;\n return helper(key, { namespace: namespace })(proto, key);\n }\n var type = a;\n var options = merge(b || {}, { namespace: namespace });\n return helper(type, options);\n }\n return namespacedHelper;\n}\nfunction createBindingHelper(bindTo, mapFn) {\n function makeDecorator(map, namespace) {\n return createDecorator(function (componentOptions, key) {\n if (!componentOptions[bindTo]) {\n componentOptions[bindTo] = {};\n }\n var mapObject = (_a = {}, _a[key] = map, _a);\n componentOptions[bindTo][key] = namespace !== undefined\n ? mapFn(namespace, mapObject)[key]\n : mapFn(mapObject)[key];\n var _a;\n });\n }\n function helper(a, b) {\n if (typeof b === 'string') {\n var key = b;\n var proto = a;\n return makeDecorator(key, undefined)(proto, key);\n }\n var namespace = extractNamespace(b);\n var type = a;\n return makeDecorator(type, namespace);\n }\n return helper;\n}\nfunction extractNamespace(options) {\n var n = options && options.namespace;\n if (typeof n !== 'string') {\n return undefined;\n }\n if (n[n.length - 1] !== '/') {\n return n + '/';\n }\n return n;\n}\nfunction merge(a, b) {\n var res = {};\n [a, b].forEach(function (obj) {\n Object.keys(obj).forEach(function (key) {\n res[key] = obj[key];\n });\n });\n return res;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vuex-class/lib/bindings.js\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport { songUrl, lyricsUrl, albumCoverUrl } from '../config/utils';\nimport { Action } from 'vuex-class';\nimport { Prop, Watch } from 'vue-property-decorator';\nimport mixin from '../config/mixin';\nimport { getLyrics } from '../service/getData';\n\n@Component({\n mixins: [mixin]\n})\nexport default class Player extends Vue {\n @Prop(Object) song;\n\n @Prop(String) artist;\n\n @Action('cancelPlayer') cancelPlayer;\n @Action('setPlayState') setPlayState;\n \n\n fetching = false; // 是否正在加载\n isplay = false; // 是否 play\n\n duration = this.song.interval; //持续时间\n progress = 0; //进度条\n elapsed = 0; //当前时间\n progressIntervalId = 0; // 进度条setInterval 返回的 id\n\n lyrics = []; //歌词\n index = 0; // 歌词页数\n LINE_HEIGHT = 42; // 歌词的高度\n lyricIntervalId = 0; // 歌词setInterval 返回的 id\n\n // 使用 ref 的问题 参考 https://github.com/vuejs/vue-class-component/issues/94\n // $refs: {\n // audio: HTMLAudioElement\n // }\n\n // 计算isShowPlayer\n get isShowPlayer() {\n return this.$store.state.isShowPlayer;\n }\n\n get isPlay() {\n return this.$store.state.isPlay;\n }\n\n get $audio() {\n return this.$refs.audio as HTMLAudioElement;\n }\n\n get $progress() {\n return this.$refs.$progress as HTMLDivElement;\n }\n\n get $lyricsLines() {\n return this.$refs.lyricsLines as HTMLDivElement;\n }\n\n created() {\n this.init();\n }\n\n mounted() {\n document.body.classList.add('noscroll');\n }\n\n // 初始化\n init() {\n this.fetching = true;\n getLyrics(this.song.songid)\n .then(res => res.lyric)\n .then(text => {\n this.index = 0;\n this.lyrics = this.formatText(text).match(/^\\[\\d{2}:\\d{2}.\\d{2}\\](.+)$/gm);\n })\n .catch(err => console.error(err))\n .then(() => (this.fetching = false));\n }\n\n // 播放音频\n onPlay() {\n this.isplay = !this.isplay;\n // 如果是 play\n if (this.isplay) {\n if (this.fetching) return;\n this.$audio.play();\n this.setPlayState(true);\n this.startLyrics();\n this.startProgress();\n } else { // 如果是 pause\n this.$audio.pause();\n this.setPlayState(false); // 设置 play 的状态\n this.pauseLyrics();\n this.pauseProgress();\n }\n }\n\n // 当一首歌播放结束的时候重新播放\n onEnd() {\n this.$audio.play();\n this.restartProgress();\n this.restartLyrics();\n }\n\n startLyrics() {\n this.pauseLyrics();\n this.lyricIntervalId = setInterval(this.updateLyrics.bind(this), 1000);\n }\n\n // 暂停歌词\n pauseLyrics() {\n clearInterval(this.lyricIntervalId);\n }\n\n //更新歌词\n updateLyrics() {\n let _this = this;\n this.$audio.ontimeupdate = function(e) {\n for (let i = 0, l = _this.lyrics.length; i < l; i++) {\n if (\n _this.$audio.currentTime /*当前播放的时间*/ >\n _this.getSeconds(_this.lyrics[i]) - 0.5\n ) {\n _this.$lyricsLines.children[_this.index].classList.remove('active');\n _this.$lyricsLines.children[i].classList.add('active');\n _this.index = i;\n }\n }\n };\n if (this.index > 2) {\n let y = -(this.index - 2) * this.LINE_HEIGHT;\n this.$lyricsLines.style.transform = `translateY(${y}px)`;\n }\n }\n\n // 重置歌词\n resetLyrics() {\n this.pauseLyrics();\n this.$lyricsLines.children[this.index].classList.remove('active');\n this.index = 0;\n this.$lyricsLines.style.transform = `translateY(0)`;\n if (this.lyrics.length) {\n this.$lyricsLines.children[this.index].classList.add('active');\n }\n }\n\n // 重新开始歌词\n restartLyrics() {\n this.resetLyrics();\n this.startLyrics();\n }\n\n // 启动进度条\n startProgress() {\n this.pauseProgress();\n this.progressIntervalId = setInterval(this.updateProgress.bind(this), 50);\n }\n\n // 暂停进度条\n pauseProgress() {\n clearInterval(this.progressIntervalId);\n }\n\n // 更新进度条\n updateProgress() {\n this.elapsed += 0.05;\n this.progress = this.elapsed / this.duration;\n this.$progress.style.transform = `translateX(${this.progress * 100 - 100}%)`;\n }\n\n //重置进度条\n resetProgress(duration?: number) {\n let $progress = this.pauseProgress();\n this.elapsed = 0;\n this.progress = 0;\n this.$progress.style.transform = 'translate(-100%)';\n if (duration) {\n this.duration = +duration;\n }\n }\n\n // 重新开始进度条\n restartProgress() {\n this.resetProgress();\n this.startProgress();\n }\n\n // 获取图片地址\n getAlbumCover(id: number) {\n return albumCoverUrl(id);\n }\n\n // 获取歌词的地址\n getSongUrl(id: number) {\n return songUrl(id);\n }\n\n //退出 player\n exit() {\n this.cancelPlayer();\n this.setPlayState(false);\n document.body.classList.remove('noscroll');\n }\n\n //获取秒数\n getSeconds(line) {\n return +line.replace(\n /^\\[(\\d{2}):(\\d{2}\\.\\d{2}).*/,\n (match, p1, p2) => +p1 * 60 + parseFloat(+p2)\n );\n }\n\n //格式化文本 类似[xx:xx.xx]xxxxx\n formatText(text) {\n let div = document.createElement('div');\n div.innerHTML = text;\n return div.innerText;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/Player.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"show-transition\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isShowPlayer),expression:\"isShowPlayer\"}],class:{show: _vm.isShowPlayer},attrs:{\"id\":\"player\"}},[_c('div',{staticClass:\"player-container\"},[_c('div',{staticClass:\"player-header\"},[_c('img',{staticClass:\"album-cover\",attrs:{\"src\":_vm.getAlbumCover(_vm.song.albummid),\"alt\":\"图片\"}}),_vm._v(\" \"),_c('div',{staticClass:\"song-info\"},[_c('div',{staticClass:\"song-name\",domProps:{\"innerHTML\":_vm._s(_vm.song.songname)}}),_vm._v(\" \"),_c('div',{staticClass:\"song-artist\",domProps:{\"innerHTML\":_vm._s(_vm.artist)}})]),_vm._v(\" \"),_c('span',{staticClass:\"icon-action icon-play\",class:[_vm.isPlay? 'icon-pause':'icon-play'],on:{\"click\":_vm.onPlay}})]),_vm._v(\" \"),_c('div',{staticClass:\"player-lyrics\"},[_c('div',{ref:\"lyricsLines\",staticClass:\"player-lyrics-lines\"},[_vm._l((_vm.lyrics),function(list){return _c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.lyrics.length !== 0),expression:\"lyrics.length !== 0\"}],staticClass:\"player-lyrics-line\"},[_vm._v(_vm._s(list.slice(10)))])}),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.fetching),expression:\"fetching\"}],staticClass:\"player-lyrics-line\"},[_vm._v(\"正在加载歌词,请等待...\")])],2)]),_vm._v(\" \"),_c('div',{staticClass:\"player-footer\"},[_c('div',{staticClass:\"icon-list\",on:{\"click\":_vm.exit}}),_vm._v(\" \"),_c('div',{staticClass:\"progress\"},[_c('div',{staticClass:\"progress-time progress-elapsed\"},[_vm._v(_vm._s(_vm._f(\"formatTime\")(_vm.elapsed)))]),_vm._v(\" \"),_c('div',{staticClass:\"progress-bar\"},[_c('div',{ref:\"$progress\",staticClass:\"progress-bar-progress\"})]),_vm._v(\" \"),_c('div',{staticClass:\"progress-time progress-duration\"},[_vm._v(_vm._s(_vm._f(\"formatTime\")(_vm.song.interval)))])]),_vm._v(\" \"),_c('div',{staticClass:\"action\"},[_c('a',{staticClass:\"btn-download\",attrs:{\"href\":\"#\"}},[_vm._v(\"下载这首歌\")])])])]),_vm._v(\" \"),_c('div',{staticClass:\"player-background\",style:({backgroundImage: 'url('+_vm.getAlbumCover(_vm.song.albummid)+')'})}),_vm._v(\" \"),_c('audio',{ref:\"audio\",attrs:{\"src\":_vm.getSongUrl(_vm.song.songmid)},on:{\"ended\":function($event){_vm.onEnd()}}})])])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-b526c8f6\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/Player.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-b526c8f6\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!sass-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./Player.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Player.vue\"\nimport __vue_script__ from \"!!ts-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Player.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-b526c8f6\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Player.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-b526c8f6\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Player.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport { hotList, searchList } from '../../service/getData';\n// import { mapState, mapMutations, mapActions } from 'vuex';\n// import * as actions from '../../store/action';\nimport { Action } from 'vuex-class';\nimport { Watch } from 'vue-property-decorator';\nimport Player from '../../components/Player.vue';\n\n@Component({\n components: {\n Player\n }\n})\nexport default class search extends Vue {\n hotkeys = null; //获取黑色的 hotkey\n data = ''; //获取红色的 hotkey\n keyword = ''; // 获取用户的搜索内容\n getLastKeyword = ''; // 获取用户上一次的搜索内容\n fetching = false; //正在 fetch\n isLoad = true; //能否继续加载数据\n page = 1; //默认页数为1\n isShowCancel = false; // 是否显示取消\n isShowDelete = false; // 是否显示取消\n isShowHistory = false; // 是否显示历史记录\n isShowSearchResults = false; //是否显示搜索结果\n songsObject = {}; // 存放歌曲,用来判断是否搜索改变了\n searchResult = null; //搜索结果\n history = []; // 放历史记录\n isGetHotKey = false // 是否获得 hotkey\n\n @Action('setLocalStorageData') setLocalStorageData;\n @Action('showPlayer') showPlayer;\n @Action('getSong') getSong;\n\n // 计算 song\n get song() {\n return this.$store.state.song;\n }\n\n // 计算artist\n get artist() {\n return this.$store.state.artist;\n }\n\n // 计算 isShowPlayer\n get isShowPlayer() {\n return this.$store.state.isShowPlayer;\n }\n\n created() {\n hotList().then(res => {\n let hotkey = res.data.hotkey;\n this.data = res.data;\n this.hotkeys = this.shuffle(hotkey, 6);\n this.isGetHotKey = true;\n });\n }\n\n mounted() {\n window.addEventListener('scroll', this.onScroll.bind(this));\n this.history = localStorage.getItem('SET_HISTORY_KEY')\n ? localStorage.getItem('SET_HISTORY_KEY').split(',')\n : [];\n }\n\n // 用户按 enter 时\n enter(e) {\n if (this.keyword) {\n this.isShowDelete = true;\n } else {\n this.isShowDelete = false;\n this.reset();\n }\n if (e.keyCode !== 13) return;\n this.isShowHistory = false;\n this.isShowSearchResults = true;\n this.addHistory(this.keyword);\n this.search(this.keyword);\n }\n\n // 点击事件\n onClick(e) {\n //如果点击到了输入按钮\n if (e.target.matches('#search')) {\n this.isShowCancel = true;\n this.isShowHistory = true;\n }\n\n //如果点击到了取消按钮\n if (e.target.matches('.search-cancel')) {\n this.isShowCancel = false;\n this.isShowDelete = false;\n this.isShowHistory = false;\n this.reset();\n }\n\n //如果点击到了删除按钮\n if (e.target.matches('.icon-delete')) {\n this.isShowDelete = false;\n this.reset();\n }\n\n // 如果匹配到了清除搜索记录\n if (e.target.matches('.record-delete')) {\n this.history = [];\n this.setLocalStorageData(this.history);\n }\n\n //如果匹配到了单条记录的删除按钮\n if (e.target.matches('.icon .icon-close')) {\n let index = this.history.indexOf(e.target.previousElementSibling.innerHTML);\n this.history.splice(index, 1);\n this.setLocalStorageData(this.history);\n }\n\n //如果点到了热门搜索的关键词或者点到了搜索记录的歌\n if (e.target.matches('.tag-keyword') || e.target.matches('.record-con')) {\n this.keyword = e.target.innerHTML;\n this.isShowDelete = true;\n this.isShowCancel = true;\n this.isShowHistory = false;\n this.isShowSearchResults = true;\n this.addHistory(this.keyword);\n this.search(this.keyword);\n }\n }\n\n // 搜索\n search(keyword, page?: number) {\n //刚进来时 keyword为 undefined ,因为没有 enter\n if (keyword === undefined) keyword = '';\n if (keyword === '') return;\n //如果已经搜索过,并且没有改动 keyword 那么直接返回\n if (this.getLastKeyword === keyword && this.songsObject[page || this.page]) return;\n if (this.getLastKeyword !== keyword) this.reset();\n if (this.fetching || !this.isLoad) return;\n this.getLastKeyword = keyword;\n this.loading();\n searchList(keyword, page || this.page)\n .then(res => {\n this.page = res.data.song.curpage;\n this.songsObject[this.page] = res.data.song.list;\n if (this.searchResult) {\n this.searchResult = this.searchResult.concat(res.data.song.list);\n } else {\n this.searchResult = res.data.song.list;\n }\n this.isLoad = res.message !== 'no results';\n })\n .then(() => this.accomplish())\n .catch(err => {\n console.log(err);\n });\n }\n\n // 滚动事件\n onScroll(e) {\n if (this.isLoad) {\n if (\n document.documentElement.clientHeight + pageYOffset >\n document.body.scrollHeight - 100\n ) {\n this.search(this.keyword, this.page + 1);\n }\n } else {\n return window.removeEventListener('scroll', this.onScroll.bind(this));\n }\n }\n\n // 全部渲染完成,没有歌了\n accomplish() {\n this.fetching = false;\n }\n\n // 显示正在加载动画\n loading() {\n this.fetching = true;\n }\n\n // 重置\n reset() {\n this.page = 1;\n this.isLoad = true;\n this.songsObject = {};\n this.searchResult = null;\n }\n\n // 添加历史\n addHistory(keyword) {\n let index = this.history.indexOf(keyword);\n if (index === -1) {\n this.history.unshift(keyword);\n this.setLocalStorageData(this.history);\n }\n }\n\n //洗牌\n shuffle(array, count: number) {\n let arr = [];\n let len = Math.min(count, array.length);\n for (let i = 0; i < len; i++) {\n let temp = array;\n let random = Math.floor(Math.random() * temp.length);\n arr[i] = temp[random];\n array.splice(random, 1);\n }\n return arr;\n }\n\n // 显示 player 的信息\n showPlayerDetail(list) {\n this.showPlayer();\n this.getSong({ ...list });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/pages/search/search.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"tab-contents\"},[_c('div',{staticClass:\"search-view tab-content\",on:{\"click\":function($event){_vm.onClick($event)}}},[_c('div',{staticClass:\"search-bar\"},[_c('div',{staticClass:\"input-wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.keyword),expression:\"keyword\",modifiers:{\"trim\":true}}],attrs:{\"type\":\"text\",\"id\":\"search\",\"placeholder\":\"搜索歌曲、歌单、专辑\"},domProps:{\"value\":(_vm.keyword)},on:{\"keyup\":function($event){_vm.enter($event)},\"input\":function($event){if($event.target.composing){ return; }_vm.keyword=$event.target.value.trim()},\"blur\":function($event){_vm.$forceUpdate()}}}),_vm._v(\" \"),_c('span',{staticClass:\"icon-search\"}),_vm._v(\" \"),_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isShowDelete),expression:\"isShowDelete\"}],staticClass:\"icon-delete\"},[_vm._v(\"删除\")])]),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isShowCancel),expression:\"isShowCancel\"}],staticClass:\"search-cancel\"},[_vm._v(\"取消\")])]),_vm._v(\" \"),(_vm.history.length > 0 && _vm.isShowHistory)?_c('div',{staticClass:\"record-keys\"},[_vm._l((_vm.history),function(item){return _c('li',[_c('div',{staticClass:\"record-main\"},[_c('span',{staticClass:\"icon icon-clock\"}),_vm._v(\" \"),_c('span',{staticClass:\"record-con ellipsis\"},[_vm._v(_vm._s(item))]),_vm._v(\" \"),_c('span',{staticClass:\"icon icon-close\"})])])}),_vm._v(\" \"),_c('p',{staticClass:\"record-delete\"},[_vm._v(\"清除搜索记录\")])],2):_vm._e(),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isShowSearchResults),expression:\"isShowSearchResults\"}],staticClass:\"search-results\"},[_c('div',{staticClass:\"song-list\"},_vm._l((_vm.searchResult),function(list){return _c('div',{key:list.songid,staticClass:\"song-item\",on:{\"click\":function($event){_vm.showPlayerDetail(list)}}},[_c('i',{staticClass:\"icon icon-music\"}),_vm._v(\" \"),_c('div',{staticClass:\"song-name\",domProps:{\"innerHTML\":_vm._s(list.songname)}}),_vm._v(\" \"),_c('div',{staticClass:\"song-artist\"},_vm._l((list.singer),function(artist){return _c('span',{domProps:{\"innerHTML\":_vm._s(artist.name+' ')}})}))])})),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.fetching),expression:\"fetching\"}],staticClass:\"search-loading show\"},[_c('i',{staticClass:\"loading-icon\"}),_vm._v(\" \"),_c('div',{staticClass:\"loading-text\"},[_vm._v(\"正在载入更多...\")])]),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.isLoad),expression:\"!isLoad\"}],staticClass:\"search-loading show\"},[_c('div',{staticClass:\"loading-done\"},[_vm._v(\"已加载全部\")])])]),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.isShowHistory && !_vm.isShowSearchResults),expression:\"!isShowHistory && !isShowSearchResults\"}],staticClass:\"mod-search-result\",attrs:{\"id\":\"hot-keys\"}},[_c('h3',{staticClass:\"result-tit\"},[_vm._v(\"热门搜索\")]),_vm._v(\" \"),(_vm.isGetHotKey)?_c('div',{staticClass:\"result-tags\"},[(_vm.data.special_url)?_c('a',{staticClass:\"tag tag-hot\",attrs:{\"href\":_vm.data.special_url}},[_vm._v(_vm._s(_vm.data.special_key))]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.hotkeys),function(hotkey){return _c('div',{key:hotkey.n,staticClass:\"tag tag-keyword\"},[_vm._v(_vm._s(hotkey.k))])})],2):_vm._e(),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.isGetHotKey),expression:\"!isGetHotKey\"}],staticClass:\"search-loading show\"},[_c('i',{staticClass:\"loading-icon\"}),_vm._v(\" \"),_c('div',{staticClass:\"loading-text\"},[_vm._v(\"正在加载...\")])])])]),_vm._v(\" \"),(_vm.isShowPlayer)?_c('player',{attrs:{\"song\":_vm.song,\"artist\":_vm.artist}}):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-253d69cc\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/search/search.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-253d69cc\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!sass-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./search.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!ts-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./search.vue\"\nimport __vue_script__ from \"!!ts-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./search.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-253d69cc\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./search.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-253d69cc\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/search/search.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} --------------------------------------------------------------------------------