├── .gitignore ├── README.md ├── babel.config.js ├── jsconfig.json ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── api │ ├── album.js │ ├── comment.js │ ├── discover.js │ ├── login.js │ ├── message.js │ ├── music.js │ ├── playlist.js │ ├── radio.js │ ├── search.js │ ├── singer.js │ ├── songs.js │ ├── user.js │ └── video.js ├── assets │ ├── iconfont │ │ ├── iconfont.css │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ └── iconfont.woff2 │ ├── images │ │ ├── 20171122191630_ff8fef.webp │ │ ├── cover_play.png │ │ ├── loading.gif │ │ ├── logo_dark.png │ │ ├── logo_light.png │ │ ├── singer_300.png │ │ ├── song_300.png │ │ ├── vinyl-arm.png │ │ ├── vinyl-record.png │ │ └── wave.gif │ └── style │ │ └── common.less ├── components │ ├── app-add-playlist.vue │ ├── app-banner.vue │ ├── app-control.vue │ ├── app-header.vue │ ├── app-icon.vue │ ├── app-login.vue │ ├── app-mask.vue │ ├── app-more-actions.vue │ ├── app-more.vue │ ├── app-play-order.vue │ ├── app-progress.vue │ ├── app-search-box.vue │ ├── app-sidebar.vue │ ├── app-sound.vue │ └── library │ │ ├── music-comment.vue │ │ ├── music-dialog.vue │ │ ├── music-list.vue │ │ ├── music-message-box.vue │ │ ├── music-message.vue │ │ ├── music-mv-list.vue │ │ ├── music-play-count.vue │ │ ├── music-playlist-description.vue │ │ ├── music-playlist-list.vue │ │ ├── music-skeleton.vue │ │ ├── music-tabs.vue │ │ ├── music-title-child.vue │ │ ├── music-title.vue │ │ └── music-video-list.vue ├── hooks │ ├── useDraggable.js │ ├── useNumberSwitch.js │ ├── useProgress.js │ └── useSearch.js ├── main.js ├── plugin │ └── index.js ├── router │ └── index.js ├── store │ ├── index.js │ └── modules │ │ ├── playlist.js │ │ ├── song.js │ │ ├── user.js │ │ └── video.js ├── utils │ ├── bus.js │ ├── cookie.js │ ├── history.js │ ├── historyPlay.js │ ├── message-box.js │ ├── message.js │ ├── request.js │ ├── tidy.js │ ├── usePosition.js │ └── user.js └── views │ ├── Album │ ├── components │ │ ├── album-comment.vue │ │ └── album-list.vue │ └── index.vue │ ├── Audio │ └── index.vue │ ├── Audition │ └── index.vue │ ├── Comment │ └── index.vue │ ├── Discover │ ├── components │ │ ├── discover-mv.vue │ │ ├── discover-new-playlist.vue │ │ └── discover-new-song.vue │ └── index.vue │ ├── Layout.vue │ ├── Like │ ├── components │ │ ├── like-album.vue │ │ ├── like-song.vue │ │ └── like-video.vue │ └── index.vue │ ├── Local │ └── index.vue │ ├── Lyrics │ ├── components │ │ ├── lyrics-bac.vue │ │ ├── lyrics-disc.vue │ │ ├── lyrics-header.vue │ │ ├── lyrics-progress.vue │ │ ├── lyrics-songs.vue │ │ └── lyrics-video-visible.vue │ └── index.vue │ ├── Message │ ├── MessageAt │ │ └── index.vue │ ├── MessageComment │ │ └── index.vue │ ├── MessagePrivate │ │ ├── components │ │ │ ├── private-content.vue │ │ │ └── private-list.vue │ │ └── index.vue │ ├── MessageSystem │ │ └── index.vue │ ├── components │ │ └── message-notice.vue │ └── index.vue │ ├── Music │ ├── MusicAlbum │ │ ├── components │ │ │ ├── album-all-list.vue │ │ │ └── album-new-list.vue │ │ └── index.vue │ ├── MusicPicked │ │ ├── components │ │ │ ├── picked-exclusive.vue │ │ │ ├── picked-program.vue │ │ │ └── picked-radar.vue │ │ └── index.vue │ ├── MusicPlaylist │ │ ├── components │ │ │ ├── playlist-filters.vue │ │ │ └── playlist-list.vue │ │ └── index.vue │ ├── MusicRadio │ │ ├── components │ │ │ ├── radio-anchor.vue │ │ │ ├── radio-banner.vue │ │ │ ├── radio-hot.vue │ │ │ ├── radio-personality.vue │ │ │ └── radio-program.vue │ │ └── index.vue │ ├── MusicRanking │ │ ├── components │ │ │ ├── ranking-artist.vue │ │ │ ├── ranking-feature-list.vue │ │ │ └── ranking-general-list.vue │ │ └── index.vue │ ├── MusicSinger │ │ ├── components │ │ │ ├── singer-filters.vue │ │ │ └── singer-list.vue │ │ └── index.vue │ └── index.vue │ ├── Player │ ├── components │ │ ├── player-comment.vue │ │ ├── player-detail.vue │ │ ├── player-play-video.vue │ │ └── player-related.vue │ └── index.vue │ ├── Playlist │ ├── components │ │ ├── playlist-comment.vue │ │ └── playlist-list.vue │ └── index.vue │ ├── Radio │ ├── RadioPlaylist │ │ └── index.vue │ └── index.vue │ ├── Recently │ ├── components │ │ ├── recently-song.vue │ │ └── recently-video.vue │ └── index.vue │ ├── Search │ ├── components │ │ ├── search-album.vue │ │ ├── search-multi-match.vue │ │ ├── search-playlist.vue │ │ ├── search-singer.vue │ │ ├── search-songs.vue │ │ └── search-video.vue │ └── index.vue │ ├── Singer │ ├── components │ │ ├── singer-album.vue │ │ ├── singer-description.vue │ │ ├── singer-select.vue │ │ ├── singer-songs.vue │ │ └── singer-video.vue │ └── index.vue │ ├── User │ ├── UserHome │ │ ├── components │ │ │ ├── user-description.vue │ │ │ ├── user-like.vue │ │ │ └── user-playlist.vue │ │ └── index.vue │ └── index.vue │ └── Video │ ├── MvList │ ├── components │ │ ├── mv-new.vue │ │ ├── mv-official.vue │ │ └── mv-ranking.vue │ └── index.vue │ ├── VideoList │ ├── components │ │ └── video-tabs.vue │ └── index.vue │ └── index.vue └── vue.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
8 | 9 | ## Vue3 Music 10 | 11 | ### 项目简介 12 | 13 | 项目基于 Vue3 全家桶开发的 QQ 音乐播放器,项目界面模仿 QQ 音乐 Windows 客户端。 14 | 15 | 后端 API [Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 16 | 17 | 界面适配 PC+iPad;移动端未适配 18 | 19 | 如果觉得项目不错的话欢迎 star 20 | 21 | 项目线上地址[http://47.102.197.149](http://47.102.197.149) 22 | 23 | **注**: 24 | 25 | - 部分音乐由于版权问题无法播放 26 | - 频繁关/取关注歌手或用户会导致风控,解决方法是登录 PC 端网易云扫码验证解决 27 | - 雷达(电台)无法播放,请求接口提示无版权,有小伙伴有解决办法的欢迎 lssues 或 pull request 28 | - 评论区回复接口返回的数据太复杂,等有时间再做 29 | - 视频小窗目前只支持拖动位置,暂不支持暂停/播放/修改进度 30 | - **项目有任何问题或 bug 欢迎提出 lssues** 31 | 32 | ### 快速导航 33 | 34 | - [Vue3 Music](#Vue3Music) 35 | - [项目简介](#项目简介) 36 | - [快速上手](#快速上手) 37 | - [进度](#进度) 38 | - [技术栈](#技术栈) 39 | - [项目预览](#项目预览) 40 | - [如何贡献](#如何贡献) 41 | - [之后的方向](#之后的方向) 42 | - [鸣谢](#鸣谢) 43 | 44 | ### 快速上手 45 | 46 | 安装 47 | 48 | ``` 49 | $ git clone https://github.com/xyyfun/music.git 50 | $ cd vue-music 51 | $ npm install 52 | ``` 53 | 54 | 运行 55 | 56 | ``` 57 | $ npm run serve 58 | ``` 59 | 60 | 打包部署 61 | 62 | ``` 63 | $ npm run build 64 | ``` 65 | 66 | ### 进度 67 | 68 | - [x] 推荐页 69 | - [x] 音乐馆 70 | 71 | - [x] 精选 72 | - [x] 有声电台 73 | - [x] 排行 74 | - [x] 歌手 75 | - [x] 分类歌单 76 | - [x] 数字专辑 77 | 78 | - [x] 视频 79 | - [x] 视频/MV 播放 80 | - [ ] 雷达 81 | - [x] 我喜欢 82 | - [ ] 本地下载 83 | - [x] 最近播放 84 | - [ ] 试听列表 85 | - [x] 用户歌单 86 | - [x] 登录 87 | - [x] 用户 88 | 89 | - [x] 用户喜欢 90 | - [x] 用户歌单 91 | 92 | - [x] 歌词播放器 93 | - [x] 歌单详情 94 | - [x] 歌单/专辑/电台评论 95 | - [x] 播放列表 96 | - [x] 歌手详情 97 | - [x] 深色模式 98 | - [x] 搜索 99 | - [x] 通知 100 | - [x] 私信 101 | - [x] 评论 102 | - [x] @我 103 | - [x] 通知 104 | 105 | ### 技术栈 106 | 107 | - **_Vue3 全家桶_** 108 | - **_vueuse_** 第三方工具库 109 | - **_axios_** 请求工具 110 | - **_mitt_** 组件通信 111 | - **_vue-lazyload_** 图片懒加载 112 | - **_lodash_** 第三方工具库 113 | 114 | ### 项目预览 115 | 116 | 117 | | 浅色 | 深色 | 118 | |:------:|:------:| 119 | ||| 120 | ||| 121 | ||| 122 | ||| 123 | ||| 124 | ||| 125 | ||| 126 | ||| 127 | ||| 128 | 129 | ### 如何贡献 130 | 131 | 非常欢迎您的加入或提交一个[pull request](https://github.com/xyyfun/music/pulls) 132 | 133 | ### 之后的方向 134 | 135 | - 适配深色模式(已完成) 136 | - 根据当前用户网络状况加载对应大小预览图 137 | - 视频小窗(已完成) 138 | - 回复评论&楼层评论 139 | - 电台播放 140 | - ... 141 | 142 | ### 鸣谢 143 | 144 | 感谢[Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi)提供接口服务 145 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "esnext", 5 | "baseUrl": "./", 6 | "moduleResolution": "node", 7 | "paths": { 8 | "@/*": [ 9 | "src/*" 10 | ] 11 | }, 12 | "lib": [ 13 | "esnext", 14 | "dom", 15 | "dom.iterable", 16 | "scripthost" 17 | ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-music", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "@vueuse/core": "^9.13.0", 12 | "axios": "^1.3.4", 13 | "core-js": "^3.8.3", 14 | "less": "^4.1.3", 15 | "less-loader": "^11.1.0", 16 | "lodash": "^4.17.21", 17 | "mitt": "^3.0.0", 18 | "vue": "^3.2.13", 19 | "vue-lazyload": "^3.0.0-rc.2", 20 | "vue-router": "^4.1.6", 21 | "vuex": "^4.1.0" 22 | }, 23 | "devDependencies": { 24 | "@babel/core": "^7.12.16", 25 | "@babel/eslint-parser": "^7.12.16", 26 | "@vue/cli-plugin-babel": "~5.0.0", 27 | "@vue/cli-plugin-eslint": "~5.0.0", 28 | "@vue/cli-service": "~5.0.0", 29 | "eslint": "^7.32.0", 30 | "eslint-plugin-vue": "^8.0.3" 31 | }, 32 | "eslintConfig": { 33 | "root": true, 34 | "env": { 35 | "node": true 36 | }, 37 | "extends": [ 38 | "plugin:vue/vue3-essential", 39 | "eslint:recommended" 40 | ], 41 | "parserOptions": { 42 | "parser": "@babel/eslint-parser" 43 | }, 44 | "rules": {} 45 | }, 46 | "browserslist": [ 47 | "> 1%", 48 | "last 2 versions", 49 | "not dead", 50 | "not ie 11" 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyyfun/music/cf68bb624057b7118817f1dad001d7d2b40b9915/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |搜索 {{ keyword }}
6 |
{{ detail.name }}
8 |