From a9e5bb33e4c94afa8ddabcc929a8641adf4136f7 Mon Sep 17 00:00:00 2001 From: alger Date: Thu, 16 May 2024 18:54:30 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=B7=BB=E5=8A=A0eslint=20?= =?UTF-8?q?=E5=92=8C=20=E6=A1=8C=E9=9D=A2=E6=AD=8C=E8=AF=8D=EF=BC=88?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintignore | 13 + .eslintrc | 133 +++++++++ .prettierrc.js | 39 +++ app.js | 122 ++++---- electron/lyric.js | 37 +++ electron/preload.js | 19 +- package.json | 19 +- src/App.vue | 73 +++-- src/api/home.ts | 24 +- src/api/list.ts | 84 +++--- src/api/login.ts | 20 +- src/api/music.ts | 44 +-- src/api/mv.ts | 18 +- src/api/search.ts | 11 +- src/api/user.ts | 8 +- src/components/MusicList.vue | 56 ++-- src/components/PlaylistType.vue | 100 ++++--- src/components/RecommendAlbum.vue | 130 ++++----- src/components/RecommendSinger.vue | 112 ++++---- src/components/RecommendSonglist.vue | 45 ++- src/components/common/MPop.vue | 82 +++--- src/components/common/PlayBottom.vue | 11 +- src/components/common/SearchItem.vue | 63 ++--- src/components/common/SongItem.vue | 86 +++--- src/const/bar-const.ts | 4 +- src/electron.d.ts | 10 +- src/hooks/MusicHistoryHook.ts | 36 +-- src/hooks/MusicHook.ts | 207 +++++++++----- src/index.css | 2 +- src/layout/AppLayout.vue | 169 +++++------ src/layout/components/AppMenu.vue | 47 ++-- src/layout/components/MusicFull.vue | 99 +++---- src/layout/components/PlayBar.vue | 165 +++++------ src/layout/components/SearchBar.vue | 329 +++++++++++----------- src/layout/components/TitleBar.vue | 31 +- src/layout/components/index.ts | 6 +- src/layout/components/lrcFull.vue | 12 +- src/main.ts | 36 ++- src/router/home.ts | 2 +- src/router/index.ts | 21 +- src/shims-vue.d.ts | 11 +- src/store/index.ts | 117 ++++---- src/type/album.ts | 48 ++-- src/type/index.ts | 4 +- src/type/list.ts | 76 ++--- src/type/listDetail.ts | 406 +++++++++++++-------------- src/type/lyric.ts | 28 +- src/type/music.ts | 394 +++++++++++++------------- src/type/mv.ts | 160 +++++------ src/type/playlist.ts | 10 +- src/type/search.ts | 2 +- src/utils/index.ts | 69 +++-- src/utils/request.ts | 13 +- src/utils/request_mt.ts | 9 +- src/utils/request_music.ts | 19 +- src/views/history/index.vue | 32 ++- src/views/home/index.vue | 30 +- src/views/list/index.vue | 89 +++--- src/views/login/index.vue | 335 +++++++++++----------- src/views/lyric/index.vue | 182 ++++++++++++ src/views/mv/index.vue | 65 +++-- src/views/search/index.vue | 258 ++++++++--------- src/views/set/index.vue | 31 +- src/views/user/index.vue | 127 ++++----- vite.config.ts | 4 +- 65 files changed, 2724 insertions(+), 2320 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .prettierrc.js create mode 100644 electron/lyric.js create mode 100644 src/views/lyric/index.vue diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a832007 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,13 @@ +snapshot* +dist +lib +es +esm +node_modules +static +cypress +script/test/cypress +_site +temp* +static/ +!.prettierrc.js \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..c41d1c0 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,133 @@ +{ + "extends": [ + "plugin:@typescript-eslint/recommended", + "eslint-config-airbnb-base", + "@vue/typescript/recommended", + "plugin:vue/vue3-recommended", + "plugin:vue-scoped-css/base", + "plugin:prettier/recommended" + ], + "env": { + "browser": true, + "node": true, + "jest": true, + "es6": true + }, + "globals": { + "defineProps": "readonly", + "defineEmits": "readonly" + }, + "plugins": [ + "vue", + "@typescript-eslint", + "simple-import-sort" + ], + "parserOptions": { + "parser": "@typescript-eslint/parser", + "sourceType": "module", + "allowImportExportEverywhere": true, + "ecmaFeatures": { + "jsx": true + } + }, + "settings": { + "import/extensions": [ + ".js", + ".jsx", + ".ts", + ".tsx" + ] + }, + "rules": { + "no-console": "off", + "no-continue": "off", + "no-restricted-syntax": "off", + "no-plusplus": "off", + "no-param-reassign": "off", + "no-shadow": "off", + "guard-for-in": "off", + "import/extensions": "off", + "import/no-unresolved": "off", + "import/no-extraneous-dependencies": "off", + "import/prefer-default-export": "off", + "import/first": "off", // https://github.com/vuejs/vue-eslint-parser/issues/58 + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "vue/first-attribute-linebreak": 0, + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ], + "no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ], + "no-use-before-define": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/ban-types": "off", + "class-methods-use-this": "off", // 因为AxiosCancel必须实例化而能静态化所以加的规则,如果有办法解决可以取消 + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error" + }, + "overrides": [ + { + "files": [ + "*.vue" + ], + "rules": { + "vue/component-name-in-template-casing": [ + 2, + "kebab-case" + ], + "vue/require-default-prop": 0, + "vue/multi-word-component-names": 0, + "vue/no-reserved-props": 0, + "vue/no-v-html": 0, + "vue-scoped-css/enforce-style-type": [ + "error", + { + "allows": [ + "scoped" + ] + } + ] + } + }, + { + "files": [ + "*.ts", + "*.tsx" + ], // https://github.com/typescript-eslint eslint-recommended + "rules": { + "constructor-super": "off", // ts(2335) & ts(2377) + "getter-return": "off", // ts(2378) + "no-const-assign": "off", // ts(2588) + "no-dupe-args": "off", // ts(2300) + "no-dupe-class-members": "off", // ts(2393) & ts(2300) + "no-dupe-keys": "off", // ts(1117) + "no-func-assign": "off", // ts(2539) + "no-import-assign": "off", // ts(2539) & ts(2540) + "no-new-symbol": "off", // ts(2588) + "no-obj-calls": "off", // ts(2349) + "no-redeclare": "off", // ts(2451) + "no-setter-return": "off", // ts(2408) + "no-this-before-super": "off", // ts(2376) + "no-undef": "off", // ts(2304) + "no-unreachable": "off", // ts(7027) + "no-unsafe-negation": "off", // ts(2365) & ts(2360) & ts(2358) + "no-var": "error", // ts transpiles let/const to var, so no need for vars any more + "prefer-const": "error", // ts provides better types with const + "prefer-rest-params": "error", // ts provides better types with rest args over arguments + "prefer-spread": "error", // ts transpiles spread to apply, so no need for manual apply + "valid-typeof": "off" // ts(2367) + } + } + ] +} \ No newline at end of file diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..3c58064 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,39 @@ +module.exports = { + // 一行最多 120 字符.. + printWidth: 120, + // 使用 2 个空格缩进 + tabWidth: 2, + // 不使用缩进符,而使用空格 + useTabs: false, + // 行尾需要有分号 + semi: true, + // 使用单引号 + singleQuote: true, + // 对象的 key 仅在必要时用引号 + quoteProps: 'as-needed', + // jsx 不使用单引号,而使用双引号 + jsxSingleQuote: false, + // 末尾需要有逗号 + trailingComma: 'all', + // 大括号内的首尾需要空格 + bracketSpacing: true, + // jsx 标签的反尖括号需要换行 + jsxBracketSameLine: false, + // 箭头函数,只有一个参数的时候,也需要括号 + arrowParens: 'always', + // 每个文件格式化的范围是文件的全部内容 + rangeStart: 0, + rangeEnd: Infinity, + // 不需要写文件开头的 @prettier + requirePragma: false, + // 不需要自动在文件开头插入 @prettier + insertPragma: false, + // 使用默认的折行标准 + proseWrap: 'preserve', + // 根据显示样式决定 html 要不要折行 + htmlWhitespaceSensitivity: 'css', + // vue 文件中的 script 和 style 内不用缩进 + vueIndentScriptAndStyle: false, + // 换行符使用 lf + endOfLine: 'lf', +}; diff --git a/app.js b/app.js index 9d2d93a..74cf120 100644 --- a/app.js +++ b/app.js @@ -1,9 +1,10 @@ -const { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage } = require('electron') -const path = require('path') +const { app, BrowserWindow, ipcMain, Tray, Menu, globalShortcut, nativeImage } = require('electron'); +const path = require('path'); const Store = require('electron-store'); -const setJson = require('./electron/set.json') +const setJson = require('./electron/set.json'); +const { loadLyricWindow } = require('./electron/lyric'); -let mainWin = null +let mainWin = null; function createWindow() { mainWin = new BrowserWindow({ width: 1200, @@ -11,129 +12,132 @@ function createWindow() { frame: false, webPreferences: { nodeIntegration: true, + // contextIsolation: false, preload: path.join(__dirname, '/electron/preload.js'), }, - }) - const win = mainWin - win.setMinimumSize(1200, 780) + }); + const win = mainWin; + win.setMinimumSize(1200, 780); if (process.env.NODE_ENV === 'development') { - win.webContents.openDevTools({ mode: 'detach' }) - win.loadURL('http://localhost:4678/') + win.webContents.openDevTools({ mode: 'detach' }); + win.loadURL('http://localhost:4678/'); } else { - win.loadURL(`file://${__dirname}/dist/index.html`) + win.loadURL(`file://${__dirname}/dist/index.html`); } - const image = nativeImage.createFromPath(path.join(__dirname, 'public/icon.png')) - const tray = new Tray(image) + const image = nativeImage.createFromPath(path.join(__dirname, 'public/icon.png')); + const tray = new Tray(image); // 创建一个上下文菜单 const contextMenu = Menu.buildFromTemplate([ { label: '显示', click: () => { - win.show() + win.show(); }, }, { label: '退出', click: () => { - win.destroy() + win.destroy(); }, }, - ]) + ]); // 设置系统托盘图标的上下文菜单 - tray.setContextMenu(contextMenu) + tray.setContextMenu(contextMenu); // 当系统托盘图标被点击时,切换窗口的显示/隐藏 tray.on('click', () => { if (win.isVisible()) { - win.hide() + win.hide(); } else { - win.show() + win.show(); } - }) + }); - const set = store.get('set') + const set = store.get('set'); // store.set('set', setJson) if (!set) { - store.set('set', setJson) + store.set('set', setJson); } + + loadLyricWindow(ipcMain); } // 限制只能启动一个应用 -const gotTheLock = app.requestSingleInstanceLock() +const gotTheLock = app.requestSingleInstanceLock(); if (!gotTheLock) { - app.quit() + app.quit(); } -app.whenReady().then(createWindow) +app.whenReady().then(createWindow); -app.on('ready',()=>{ +app.on('ready', () => { globalShortcut.register('CommandOrControl+Alt+Shift+M', () => { if (mainWin.isVisible()) { - mainWin.hide() + mainWin.hide(); } else { - mainWin.show() + mainWin.show(); } - }) -}) + }); +}); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { - app.quit() + app.quit(); } -}) +}); app.on('will-quit', () => { - globalShortcut.unregisterAll() -}) + globalShortcut.unregisterAll(); +}); ipcMain.on('minimize-window', (event) => { - const win = BrowserWindow.fromWebContents(event.sender) - win.minimize() -}) + const win = BrowserWindow.fromWebContents(event.sender); + win.minimize(); +}); ipcMain.on('maximize-window', (event) => { - const win = BrowserWindow.fromWebContents(event.sender) + const win = BrowserWindow.fromWebContents(event.sender); if (win.isMaximized()) { - win.unmaximize() + win.unmaximize(); } else { - win.maximize() + win.maximize(); } -}) +}); ipcMain.on('close-window', (event) => { - const win = BrowserWindow.fromWebContents(event.sender) - win.destroy() -}) + const win = BrowserWindow.fromWebContents(event.sender); + win.destroy(); +}); -ipcMain.on('drag-start', (event, data) => { - const win = BrowserWindow.fromWebContents(event.sender) +ipcMain.on('drag-start', (event) => { + const win = BrowserWindow.fromWebContents(event.sender); win.webContents.beginFrameSubscription((frameBuffer) => { - event.reply('frame-buffer', frameBuffer) - }) -}) + event.reply('frame-buffer', frameBuffer); + }); +}); ipcMain.on('mini-tray', (event) => { - const win = BrowserWindow.fromWebContents(event.sender) - win.hide() -}) + const win = BrowserWindow.fromWebContents(event.sender); + win.hide(); +}); // 重启 ipcMain.on('restart', () => { - app.relaunch() - app.exit(0) -}) + app.relaunch(); + app.exit(0); +}); const store = new Store(); // 定义ipcRenderer监听事件 ipcMain.on('setStore', (_, key, value) => { - store.set(key, value) -}) + store.set(key, value); +}); ipcMain.on('getStore', (_, key) => { - let value = store.get(key) - _.returnValue = value || "" -}) \ No newline at end of file + const value = store.get(key); + _.returnValue = value || ''; +}); diff --git a/electron/lyric.js b/electron/lyric.js new file mode 100644 index 0000000..c38f9f6 --- /dev/null +++ b/electron/lyric.js @@ -0,0 +1,37 @@ +const { BrowserWindow } = require('electron'); + +let lyricWindow = null; + +const loadLyricWindow = (ipcMain) => { + lyricWindow = new BrowserWindow({ + width: 800, + height: 300, + frame: false, + show: false, + transparent: true, + webPreferences: { + nodeIntegration: true, + preload: `${__dirname}/preload.js`, + contextIsolation: false, + }, + }); + + ipcMain.on('open-lyric', () => { + if (process.env.NODE_ENV === 'development') { + lyricWindow.webContents.openDevTools({ mode: 'detach' }); + lyricWindow.loadURL('http://localhost:4678/#/lyric'); + } else { + lyricWindow.loadURL(`file://${__dirname}/dist/index.html/#/lyric`); + } + + lyricWindow.show(); + }); + + ipcMain.on('send-lyric', (e, data) => { + lyricWindow.webContents.send('receive-lyric', data); + }); +}; + +module.exports = { + loadLyricWindow, +}; diff --git a/electron/preload.js b/electron/preload.js index aa27375..4d5f489 100644 --- a/electron/preload.js +++ b/electron/preload.js @@ -1,4 +1,4 @@ -const { contextBridge, ipcRenderer } = require('electron') +const { contextBridge, ipcRenderer, app } = require('electron'); contextBridge.exposeInMainWorld('electronAPI', { minimize: () => ipcRenderer.send('minimize-window'), @@ -7,19 +7,22 @@ contextBridge.exposeInMainWorld('electronAPI', { dragStart: (data) => ipcRenderer.send('drag-start', data), miniTray: () => ipcRenderer.send('mini-tray'), restart: () => ipcRenderer.send('restart'), -}) + openLyric: () => ipcRenderer.send('open-lyric'), + sendLyric: (data) => ipcRenderer.send('send-lyric', data), +}); const electronHandler = { ipcRenderer: { setStoreValue: (key, value) => { - ipcRenderer.send("setStore", key, value) + ipcRenderer.send('setStore', key, value); }, getStoreValue(key) { - const resp = ipcRenderer.sendSync("getStore", key) - return resp + const resp = ipcRenderer.sendSync('getStore', key); + return resp; }, - } -} + }, + app, +}; -contextBridge.exposeInMainWorld('electron', electronHandler) \ No newline at end of file +contextBridge.exposeInMainWorld('electron', electronHandler); diff --git a/package.json b/package.json index b6035ec..6858498 100644 --- a/package.json +++ b/package.json @@ -11,18 +11,21 @@ "es": "vite && electron .", "start": "set NODE_ENV=development&&electron .", "e:b": "electron-builder --config ./electron.config.json", - "eb": "vite build && e:b" + "eb": "vite build && e:b", + "lint": "eslint --ext .vue,.js,.jsx,.ts,.tsx ./ --max-warnings 0" }, "dependencies": { "@tailwindcss/postcss7-compat": "^2.2.4", "@vue/runtime-core": "^3.3.4", "@vueuse/core": "^10.7.1", + "@vueuse/electron": "^10.9.0", "autoprefixer": "^9.8.6", "axios": "^0.21.1", "electron-store": "^8.1.0", "lodash": "^4.17.21", "naive-ui": "^2.34.4", "postcss": "^7.0.36", + "remixicon": "^4.2.0", "sass": "^1.35.2", "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.2.4", "vue": "^3.3.4", @@ -30,12 +33,22 @@ "vuex": "^4.1.0" }, "devDependencies": { - "@sicons/antd": "^0.10.0", - "@vicons/antd": "^0.10.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-vue": "^4.2.3", "@vue/compiler-sfc": "^3.3.4", + "@vue/eslint-config-typescript": "^12.0.0", "electron": "^28.0.0", "electron-builder": "^24.9.1", + "eslint": "^8.56.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-simple-import-sort": "^12.0.0", + "eslint-plugin-vue": "^9.21.1", + "eslint-plugin-vue-scoped-css": "^2.7.2", + "prettier": "^3.2.5", "typescript": "^4.3.2", "unplugin-auto-import": "^0.17.2", "unplugin-vue-components": "^0.26.0", diff --git a/src/App.vue b/src/App.vue index 66ba4c7..a059d87 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,37 +1,36 @@ - - - - - + + + + + diff --git a/src/api/home.ts b/src/api/home.ts index 7798fae..44ba9fd 100644 --- a/src/api/home.ts +++ b/src/api/home.ts @@ -1,9 +1,9 @@ -import request from "@/utils/request"; -import { IHotSinger } from "@/type/singer"; -import { ISearchKeyword, IHotSearch } from "@/type/search"; -import { IPlayListSort } from "@/type/playlist"; -import { IRecommendMusic } from "@/type/music"; -import { IAlbumNew } from "@/type/album"; +import { IAlbumNew } from '@/type/album'; +import { IRecommendMusic } from '@/type/music'; +import { IPlayListSort } from '@/type/playlist'; +import { IHotSearch, ISearchKeyword } from '@/type/search'; +import { IHotSinger } from '@/type/singer'; +import request from '@/utils/request'; interface IHotSingerParams { offset: number; @@ -16,30 +16,30 @@ interface IRecommendMusicParams { // 获取热门歌手 export const getHotSinger = (params: IHotSingerParams) => { - return request.get("/top/artists", { params }); + return request.get('/top/artists', { params }); }; // 获取搜索推荐词 export const getSearchKeyword = () => { - return request.get("/search/default"); + return request.get('/search/default'); }; // 获取热门搜索 export const getHotSearch = () => { - return request.get("/search/hot/detail"); + return request.get('/search/hot/detail'); }; // 获取歌单分类 export const getPlaylistCategory = () => { - return request.get("/playlist/catlist"); + return request.get('/playlist/catlist'); }; // 获取推荐音乐 export const getRecommendMusic = (params: IRecommendMusicParams) => { - return request.get("/personalized/newsong", { params }); + return request.get('/personalized/newsong', { params }); }; // 获取最新专辑推荐 export const getNewAlbum = () => { - return request.get("/album/newest"); + return request.get('/album/newest'); }; diff --git a/src/api/list.ts b/src/api/list.ts index bceb4fb..63d5aa3 100644 --- a/src/api/list.ts +++ b/src/api/list.ts @@ -1,42 +1,42 @@ -import request from "@/utils/request"; -import { IList } from "@/type/list"; -import type { IListDetail } from "@/type/listDetail"; - -interface IListByTagParams { - tag: string; - before: number; - limit: number; -} - -interface IListByCatParams { - cat: string; - offset: number; - limit: number; -} - -// 根据tag 获取歌单列表 -export function getListByTag(params: IListByTagParams) { - return request.get("/top/playlist/highquality", { params: params }); -} - -// 根据cat 获取歌单列表 -export function getListByCat(params: IListByCatParams) { - return request.get("/top/playlist", { - params: params, - }); -} - -// 获取推荐歌单 -export function getRecommendList(limit: number = 30) { - return request.get("/personalized", { params: { limit } }); -} - -// 获取歌单详情 -export function getListDetail(id: number | string) { - return request.get("/playlist/detail", { params: { id } }); -} - -// 获取专辑内容 -export function getAlbum(id: number | string) { - return request.get("/album", { params: { id } }); -} \ No newline at end of file +import { IList } from '@/type/list'; +import type { IListDetail } from '@/type/listDetail'; +import request from '@/utils/request'; + +interface IListByTagParams { + tag: string; + before: number; + limit: number; +} + +interface IListByCatParams { + cat: string; + offset: number; + limit: number; +} + +// 根据tag 获取歌单列表 +export function getListByTag(params: IListByTagParams) { + return request.get('/top/playlist/highquality', { params }); +} + +// 根据cat 获取歌单列表 +export function getListByCat(params: IListByCatParams) { + return request.get('/top/playlist', { + params, + }); +} + +// 获取推荐歌单 +export function getRecommendList(limit: number = 30) { + return request.get('/personalized', { params: { limit } }); +} + +// 获取歌单详情 +export function getListDetail(id: number | string) { + return request.get('/playlist/detail', { params: { id } }); +} + +// 获取专辑内容 +export function getAlbum(id: number | string) { + return request.get('/album', { params: { id } }); +} diff --git a/src/api/login.ts b/src/api/login.ts index 200cc69..d4c09de 100644 --- a/src/api/login.ts +++ b/src/api/login.ts @@ -1,46 +1,46 @@ -import request from "@/utils/request"; +import request from '@/utils/request'; // 创建二维码key // /login/qr/key export function getQrKey() { - return request.get("/login/qr/key"); + return request.get('/login/qr/key'); } // 创建二维码 // /login/qr/create export function createQr(key: any) { - return request.get("/login/qr/create", { params: { key: key, qrimg: true } }); + return request.get('/login/qr/create', { params: { key, qrimg: true } }); } // 获取二维码状态 // /login/qr/check export function checkQr(key: any) { - return request.get("/login/qr/check", { params: { key: key } }); + return request.get('/login/qr/check', { params: { key } }); } // 获取登录状态 // /login/status export function getLoginStatus() { - return request.get("/login/status"); + return request.get('/login/status'); } // 获取用户信息 // /user/account export function getUserDetail() { - return request.get("/user/account"); + return request.get('/user/account'); } // 退出登录 // /logout export function logout() { - return request.get("/logout"); + return request.get('/logout'); } // 手机号登录 // /login/cellphone export function loginByCellphone(phone: any, password: any) { - return request.post("/login/cellphone", { - phone: phone, - password: password, + return request.post('/login/cellphone', { + phone, + password, }); } diff --git a/src/api/music.ts b/src/api/music.ts index bf73f61..62708c4 100644 --- a/src/api/music.ts +++ b/src/api/music.ts @@ -1,22 +1,22 @@ -import { IPlayMusicUrl } from "@/type/music" -import { ILyric } from "@/type/lyric" -import request from "@/utils/request" -import requestMusic from "@/utils/request_music" -// 根据音乐Id获取音乐播放URl -export const getMusicUrl = (id: number) => { - return request.get("/song/url", { params: { id: id } }) -} - -// 获取歌曲详情 -export const getMusicDetail = (ids: Array) => { - return request.get("/song/detail", { params: { ids: ids.join(",")}}) -} - -// 根据音乐Id获取音乐歌词 -export const getMusicLrc = (id: number) => { - return request.get("/lyric", { params: { id: id } }) -} - -export const getParsingMusicUrl = (id: number) => { - return requestMusic.get("/music", { params: { id: id } }) -} +import { ILyric } from '@/type/lyric'; +import { IPlayMusicUrl } from '@/type/music'; +import request from '@/utils/request'; +import requestMusic from '@/utils/request_music'; +// 根据音乐Id获取音乐播放URl +export const getMusicUrl = (id: number) => { + return request.get('/song/url', { params: { id } }); +}; + +// 获取歌曲详情 +export const getMusicDetail = (ids: Array) => { + return request.get('/song/detail', { params: { ids: ids.join(',') } }); +}; + +// 根据音乐Id获取音乐歌词 +export const getMusicLrc = (id: number) => { + return request.get('/lyric', { params: { id } }); +}; + +export const getParsingMusicUrl = (id: number) => { + return requestMusic.get('/music', { params: { id } }); +}; diff --git a/src/api/mv.ts b/src/api/mv.ts index 76d854c..43d61a0 100644 --- a/src/api/mv.ts +++ b/src/api/mv.ts @@ -1,6 +1,6 @@ -import { IData } from '@/type' -import { IMvItem, IMvUrlData } from '@/type/mv' -import request from '@/utils/request' +import { IData } from '@/type'; +import { IMvItem, IMvUrlData } from '@/type/mv'; +import request from '@/utils/request'; // 获取 mv 排行 export const getTopMv = (limit: number) => { @@ -8,8 +8,8 @@ export const getTopMv = (limit: number) => { params: { limit, }, - }) -} + }); +}; // 获取 mv 数据 export const getMvDetail = (mvid: string) => { @@ -17,8 +17,8 @@ export const getMvDetail = (mvid: string) => { params: { mvid, }, - }) -} + }); +}; // 获取 mv 地址 export const getMvUrl = (id: Number) => { @@ -26,5 +26,5 @@ export const getMvUrl = (id: Number) => { params: { id, }, - }) -} + }); +}; diff --git a/src/api/search.ts b/src/api/search.ts index 1937faf..2a4683b 100644 --- a/src/api/search.ts +++ b/src/api/search.ts @@ -1,13 +1,12 @@ -import request from "@/utils/request" -import { ISearchDetail } from "@/type/search" +import request from '@/utils/request'; interface IParams { - keywords: string - type: number + keywords: string; + type: number; } // 搜索内容 export const getSearch = (params: IParams) => { return request.get('/cloudsearch', { params, - }) -} + }); +}; diff --git a/src/api/user.ts b/src/api/user.ts index 10b1e0e..7d9646f 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -1,17 +1,17 @@ -import request from "@/utils/request"; +import request from '@/utils/request'; // /user/detail export function getUserDetail(uid: number) { - return request.get("/user/detail", { params: { uid } }); + return request.get('/user/detail', { params: { uid } }); } // /user/playlist export function getUserPlaylist(uid: number) { - return request.get("/user/playlist", { params: { uid } }); + return request.get('/user/playlist', { params: { uid } }); } // 播放历史 // /user/record?uid=32953014&type=1 export function getUserRecord(uid: number, type: number = 0) { - return request.get("/user/record", { params: { uid, type } }); + return request.get('/user/record', { params: { uid, type } }); } diff --git a/src/components/MusicList.vue b/src/components/MusicList.vue index 5dcf378..0e3422b 100644 --- a/src/components/MusicList.vue +++ b/src/components/MusicList.vue @@ -5,12 +5,16 @@
{{ name }}
- -
- + +
+
- +
@@ -18,40 +22,42 @@ \ No newline at end of file + diff --git a/src/components/PlaylistType.vue b/src/components/PlaylistType.vue index 24ad79b..d01cefe 100644 --- a/src/components/PlaylistType.vue +++ b/src/components/PlaylistType.vue @@ -1,39 +1,37 @@ diff --git a/src/components/RecommendAlbum.vue b/src/components/RecommendAlbum.vue index 7362447..51a34f9 100644 --- a/src/components/RecommendAlbum.vue +++ b/src/components/RecommendAlbum.vue @@ -1,86 +1,86 @@ diff --git a/src/components/RecommendSinger.vue b/src/components/RecommendSinger.vue index 6bb5ccf..01b9117 100644 --- a/src/components/RecommendSinger.vue +++ b/src/components/RecommendSinger.vue @@ -1,85 +1,79 @@ diff --git a/src/components/RecommendSonglist.vue b/src/components/RecommendSonglist.vue index a607fa4..525143f 100644 --- a/src/components/RecommendSonglist.vue +++ b/src/components/RecommendSonglist.vue @@ -1,19 +1,10 @@ \ No newline at end of file + + + + + diff --git a/src/components/common/PlayBottom.vue b/src/components/common/PlayBottom.vue index c98a781..3907fdb 100644 --- a/src/components/common/PlayBottom.vue +++ b/src/components/common/PlayBottom.vue @@ -1,15 +1,16 @@ \ No newline at end of file + diff --git a/src/components/common/SearchItem.vue b/src/components/common/SearchItem.vue index 2a9ea6b..4157abc 100644 --- a/src/components/common/SearchItem.vue +++ b/src/components/common/SearchItem.vue @@ -1,15 +1,11 @@ \ No newline at end of file + diff --git a/src/components/common/SongItem.vue b/src/components/common/SongItem.vue index e87f06c..f95818b 100644 --- a/src/components/common/SongItem.vue +++ b/src/components/common/SongItem.vue @@ -1,27 +1,14 @@ \ No newline at end of file + diff --git a/src/layout/components/AppMenu.vue b/src/layout/components/AppMenu.vue index 54889a9..89cbaf2 100644 --- a/src/layout/components/AppMenu.vue +++ b/src/layout/components/AppMenu.vue @@ -8,13 +8,9 @@
-
+
- + {{ item.meta.title }}
@@ -24,44 +20,47 @@ \ No newline at end of file + diff --git a/src/layout/components/MusicFull.vue b/src/layout/components/MusicFull.vue index 4b5ba7b..d217846 100644 --- a/src/layout/components/MusicFull.vue +++ b/src/layout/components/MusicFull.vue @@ -1,33 +1,25 @@ @@ -53,20 +46,21 @@ \ No newline at end of file + + + + + diff --git a/src/layout/components/TitleBar.vue b/src/layout/components/TitleBar.vue index de7f3ca..020d232 100644 --- a/src/layout/components/TitleBar.vue +++ b/src/layout/components/TitleBar.vue @@ -5,9 +5,6 @@ - @@ -16,18 +13,14 @@ \ No newline at end of file + diff --git a/src/main.ts b/src/main.ts index 44f2be6..df2f7df 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,19 +1,17 @@ -import { createApp } from "vue"; -import App from "./App.vue"; - -import naive from "naive-ui"; -import "vfonts/Lato.css"; -import "vfonts/FiraCode.css"; - -// tailwind css -import "./index.css"; - -import router from "@/router"; - -import store from "@/store"; - -const app = createApp(App); -app.use(router); -app.use(store); -// app.use(naive); -app.mount("#app"); +import 'vfonts/Lato.css'; +import 'vfonts/FiraCode.css'; +// tailwind css +import './index.css'; +import 'remixicon/fonts/remixicon.css'; + +import { createApp } from 'vue'; + +import router from '@/router'; +import store from '@/store'; + +import App from './App.vue'; + +const app = createApp(App); +app.use(router); +app.use(store); +app.mount('#app'); diff --git a/src/router/home.ts b/src/router/home.ts index 32331ec..9abab66 100644 --- a/src/router/home.ts +++ b/src/router/home.ts @@ -57,5 +57,5 @@ const layoutRouter = [ }, component: () => import('@/views/user/index.vue'), }, -] +]; export default layoutRouter; diff --git a/src/router/index.ts b/src/router/index.ts index 9e60f74..d567221 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,6 +1,7 @@ -import { createRouter, createWebHashHistory } from 'vue-router' -import AppLayout from '@/layout/AppLayout.vue' -import homeRouter from '@/router/home' +import { createRouter, createWebHashHistory } from 'vue-router'; + +import AppLayout from '@/layout/AppLayout.vue'; +import homeRouter from '@/router/home'; const loginRouter = { path: '/login', @@ -11,7 +12,7 @@ const loginRouter = { icon: 'icon-Home', }, component: () => import('@/views/login/index.vue'), -} +}; const setRouter = { path: '/set', @@ -22,7 +23,7 @@ const setRouter = { icon: 'icon-Home', }, component: () => import('@/views/set/index.vue'), -} +}; const routes = [ { @@ -30,9 +31,13 @@ const routes = [ component: AppLayout, children: [...homeRouter, loginRouter, setRouter], }, -] + { + path: '/lyric', + component: () => import('@/views/lyric/index.vue'), + }, +]; export default createRouter({ - routes: routes, + routes, history: createWebHashHistory(), -}) +}); diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts index 919c762..3003049 100644 --- a/src/shims-vue.d.ts +++ b/src/shims-vue.d.ts @@ -1,5 +1,6 @@ -declare module '*.vue' { - import { DefineComponent } from 'vue' - const component: DefineComponent<{}, {}, any> - export default component -} \ No newline at end of file +declare module '*.vue' { + import { DefineComponent } from 'vue'; + + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/src/store/index.ts b/src/store/index.ts index 888f398..4ebf96d 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,20 +1,21 @@ -import { createStore } from 'vuex' -import { SongResult } from '@/type/music' -import { getMusicUrl, getParsingMusicUrl } from '@/api/music' -import homeRouter from '@/router/home' -import { getMusicProxyUrl } from '@/utils' -import { useMusicHistory } from '@/hooks/MusicHistoryHook' +import { createStore } from 'vuex'; + +import { getMusicUrl, getParsingMusicUrl } from '@/api/music'; +import { useMusicHistory } from '@/hooks/MusicHistoryHook'; +import homeRouter from '@/router/home'; +import { SongResult } from '@/type/music'; +import { getMusicProxyUrl } from '@/utils'; interface State { - menus: any[] - play: boolean - isPlay: boolean - playMusic: SongResult - playMusicUrl: string - user: any - playList: SongResult[] - playListIndex: number - setData: any + menus: any[]; + play: boolean; + isPlay: boolean; + playMusic: SongResult; + playMusicUrl: string; + user: any; + playList: SongResult[]; + playListIndex: number; + setData: any; } const state: State = { @@ -27,85 +28,79 @@ const state: State = { playList: [], playListIndex: 0, setData: null, -} +}; -const windowData = window as any +const windowData = window as any; -const musicHistory = useMusicHistory() +const musicHistory = useMusicHistory(); const mutations = { setMenus(state: State, menus: any[]) { - state.menus = menus + state.menus = menus; }, async setPlay(state: State, playMusic: SongResult) { - state.playMusic = playMusic - state.playMusicUrl = await getSongUrl(playMusic.id) - state.play = true - musicHistory.addMusic(playMusic) + state.playMusic = playMusic; + state.playMusicUrl = await getSongUrl(playMusic.id); + state.play = true; + musicHistory.addMusic(playMusic); }, setIsPlay(state: State, isPlay: boolean) { - state.isPlay = isPlay + state.isPlay = isPlay; }, setPlayMusic(state: State, play: boolean) { - state.play = play + state.play = play; }, setPlayList(state: State, playList: SongResult[]) { - state.playListIndex = playList.findIndex( - (item) => item.id === state.playMusic.id - ) - state.playList = playList + state.playListIndex = playList.findIndex((item) => item.id === state.playMusic.id); + state.playList = playList; }, async nextPlay(state: State) { if (state.playList.length === 0) { - state.play = true - return + state.play = true; + return; } - state.playListIndex = (state.playListIndex + 1) % state.playList.length - await updatePlayMusic(state) + state.playListIndex = (state.playListIndex + 1) % state.playList.length; + await updatePlayMusic(state); }, async prevPlay(state: State) { if (state.playList.length === 0) { - state.play = true - return + state.play = true; + return; } - state.playListIndex = - (state.playListIndex - 1 + state.playList.length) % state.playList.length - await updatePlayMusic(state) + state.playListIndex = (state.playListIndex - 1 + state.playList.length) % state.playList.length; + await updatePlayMusic(state); }, async setSetData(state: State, setData: any) { - state.setData = setData - windowData.electron.ipcRenderer.setStoreValue( - 'set', - JSON.parse(JSON.stringify(setData)) - ) + state.setData = setData; + windowData.electron.ipcRenderer.setStoreValue('set', JSON.parse(JSON.stringify(setData))); }, -} +}; const getSongUrl = async (id: number) => { - const { data } = await getMusicUrl(id) - let url = '' + const { data } = await getMusicUrl(id); + let url = ''; try { if (data.data[0].freeTrialInfo || !data.data[0].url) { - const res = await getParsingMusicUrl(id) - url = res.data.data.url + const res = await getParsingMusicUrl(id); + url = res.data.data.url; } } catch (error) { - console.error('error', error) + console.error('error', error); } - url = url ? url : data.data[0].url - return getMusicProxyUrl(url) -} + url = url || data.data[0].url; + return getMusicProxyUrl(url); +}; const updatePlayMusic = async (state: State) => { - state.playMusic = state.playList[state.playListIndex] - state.playMusicUrl = await getSongUrl(state.playMusic.id) - state.play = true - musicHistory.addMusic(state.playMusic) -} + state.playMusic = state.playList[state.playListIndex]; + state.playMusicUrl = await getSongUrl(state.playMusic.id); + state.play = true; + musicHistory.addMusic(state.playMusic); +}; const store = createStore({ - state: state, - mutations: mutations, -}) + state, + mutations, +}); -export default store +export default store; diff --git a/src/type/album.ts b/src/type/album.ts index eaaf239..c35a59b 100644 --- a/src/type/album.ts +++ b/src/type/album.ts @@ -4,30 +4,30 @@ export interface IAlbumNew { } export interface Album { - name: string - id: number - type: string - size: number - picId: number - blurPicUrl: string - companyId: number - pic: number - picUrl: string - publishTime: number - description: string - tags: string - company: string - briefDesc: string - artist: Artist - songs?: any - alias: string[] - status: number - copyrightId: number - commentThreadId: string - artists: Artist2[] - paid: boolean - onSale: boolean - picId_str: string + name: string; + id: number; + type: string; + size: number; + picId: number; + blurPicUrl: string; + companyId: number; + pic: number; + picUrl: string; + publishTime: number; + description: string; + tags: string; + company: string; + briefDesc: string; + artist: Artist; + songs?: any; + alias: string[]; + status: number; + copyrightId: number; + commentThreadId: string; + artists: Artist2[]; + paid: boolean; + onSale: boolean; + picId_str: string; } interface Artist2 { diff --git a/src/type/index.ts b/src/type/index.ts index 9978877..7847689 100644 --- a/src/type/index.ts +++ b/src/type/index.ts @@ -1,4 +1,4 @@ export interface IData { - code: number - data: T + code: number; + data: T; } diff --git a/src/type/list.ts b/src/type/list.ts index 745ed12..eda21d8 100644 --- a/src/type/list.ts +++ b/src/type/list.ts @@ -7,42 +7,42 @@ export interface IList { } export interface Playlist { - name: string - id: number - trackNumberUpdateTime: number - status: number - userId: number - createTime: number - updateTime: number - subscribedCount: number - trackCount: number - cloudTrackCount: number - coverImgUrl: string - coverImgId: number - description: string - tags: string[] - playCount: number - trackUpdateTime: number - specialType: number - totalDuration: number - creator: Creator - tracks?: any - subscribers: Subscriber[] - subscribed: boolean - commentThreadId: string - newImported: boolean - adType: number - highQuality: boolean - privacy: number - ordered: boolean - anonimous: boolean - coverStatus: number - recommendInfo?: any - shareCount: number - coverImgId_str?: string - commentCount: number - copywriter: string - tag: string + name: string; + id: number; + trackNumberUpdateTime: number; + status: number; + userId: number; + createTime: number; + updateTime: number; + subscribedCount: number; + trackCount: number; + cloudTrackCount: number; + coverImgUrl: string; + coverImgId: number; + description: string; + tags: string[]; + playCount: number; + trackUpdateTime: number; + specialType: number; + totalDuration: number; + creator: Creator; + tracks?: any; + subscribers: Subscriber[]; + subscribed: boolean; + commentThreadId: string; + newImported: boolean; + adType: number; + highQuality: boolean; + privacy: number; + ordered: boolean; + anonimous: boolean; + coverStatus: number; + recommendInfo?: any; + shareCount: number; + coverImgId_str?: string; + commentCount: number; + copywriter: string; + tag: string; } interface Subscriber { @@ -120,8 +120,8 @@ interface AvatarDetail { } interface Expert { - "2": string; - "1"?: string; + '2': string; + '1'?: string; } // 推荐歌单 diff --git a/src/type/listDetail.ts b/src/type/listDetail.ts index 5031b59..3653368 100644 --- a/src/type/listDetail.ts +++ b/src/type/listDetail.ts @@ -1,203 +1,203 @@ -export interface IListDetail { - code: number; - relatedVideos?: any; - playlist: Playlist; - urls?: any; - privileges: Privilege[]; - sharedPrivilege?: any; - resEntrance?: any; -} - -interface Privilege { - id: number; - fee: number; - payed: number; - realPayed: number; - st: number; - pl: number; - dl: number; - sp: number; - cp: number; - subp: number; - cs: boolean; - maxbr: number; - fl: number; - pc?: any; - toast: boolean; - flag: number; - paidBigBang: boolean; - preSell: boolean; - playMaxbr: number; - downloadMaxbr: number; - rscl?: any; - freeTrialPrivilege: FreeTrialPrivilege; - chargeInfoList: ChargeInfoList[]; -} - -interface ChargeInfoList { - rate: number; - chargeUrl?: any; - chargeMessage?: any; - chargeType: number; -} - -interface FreeTrialPrivilege { - resConsumable: boolean; - userConsumable: boolean; -} - -export interface Playlist { - id: number - name: string - coverImgId: number - coverImgUrl: string - coverImgId_str: string - adType: number - userId: number - createTime: number - status: number - opRecommend: boolean - highQuality: boolean - newImported: boolean - updateTime: number - trackCount: number - specialType: number - privacy: number - trackUpdateTime: number - commentThreadId: string - playCount: number - trackNumberUpdateTime: number - subscribedCount: number - cloudTrackCount: number - ordered: boolean - description: string - tags: string[] - updateFrequency?: any - backgroundCoverId: number - backgroundCoverUrl?: any - titleImage: number - titleImageUrl?: any - englishTitle?: any - officialPlaylistType?: any - subscribers: Subscriber[] - subscribed: boolean - creator: Subscriber - tracks: Track[] - videoIds?: any - videos?: any - trackIds: TrackId[] - shareCount: number - commentCount: number - remixVideo?: any - sharedUsers?: any - historySharedUsers?: any -} - -interface TrackId { - id: number; - v: number; - t: number; - at: number; - alg?: any; - uid: number; - rcmdReason: string; -} - -interface Track { - name: string; - id: number; - pst: number; - t: number; - ar: Ar[]; - alia: string[]; - pop: number; - st: number; - rt?: string; - fee: number; - v: number; - crbt?: any; - cf: string; - al: Al; - dt: number; - h: H; - m: H; - l?: H; - a?: any; - cd: string; - no: number; - rtUrl?: any; - ftype: number; - rtUrls: any[]; - djId: number; - copyright: number; - s_id: number; - mark: number; - originCoverType: number; - originSongSimpleData?: any; - single: number; - noCopyrightRcmd?: any; - mst: number; - cp: number; - mv: number; - rtype: number; - rurl?: any; - publishTime: number; - tns?: string[]; -} - -interface H { - br: number; - fid: number; - size: number; - vd: number; -} - -interface Al { - id: number; - name: string; - picUrl: string; - tns: any[]; - pic_str?: string; - pic: number; -} - -interface Ar { - id: number; - name: string; - tns: any[]; - alias: any[]; -} - -interface Subscriber { - defaultAvatar: boolean; - province: number; - authStatus: number; - followed: boolean; - avatarUrl: string; - accountStatus: number; - gender: number; - city: number; - birthday: number; - userId: number; - userType: number; - nickname: string; - signature: string; - description: string; - detailDescription: string; - avatarImgId: number; - backgroundImgId: number; - backgroundUrl: string; - authority: number; - mutual: boolean; - expertTags?: any; - experts?: any; - djStatus: number; - vipType: number; - remarkName?: any; - authenticationTypes: number; - avatarDetail?: any; - backgroundImgIdStr: string; - anchor: boolean; - avatarImgIdStr: string; - avatarImgId_str: string; -} +export interface IListDetail { + code: number; + relatedVideos?: any; + playlist: Playlist; + urls?: any; + privileges: Privilege[]; + sharedPrivilege?: any; + resEntrance?: any; +} + +interface Privilege { + id: number; + fee: number; + payed: number; + realPayed: number; + st: number; + pl: number; + dl: number; + sp: number; + cp: number; + subp: number; + cs: boolean; + maxbr: number; + fl: number; + pc?: any; + toast: boolean; + flag: number; + paidBigBang: boolean; + preSell: boolean; + playMaxbr: number; + downloadMaxbr: number; + rscl?: any; + freeTrialPrivilege: FreeTrialPrivilege; + chargeInfoList: ChargeInfoList[]; +} + +interface ChargeInfoList { + rate: number; + chargeUrl?: any; + chargeMessage?: any; + chargeType: number; +} + +interface FreeTrialPrivilege { + resConsumable: boolean; + userConsumable: boolean; +} + +export interface Playlist { + id: number; + name: string; + coverImgId: number; + coverImgUrl: string; + coverImgId_str: string; + adType: number; + userId: number; + createTime: number; + status: number; + opRecommend: boolean; + highQuality: boolean; + newImported: boolean; + updateTime: number; + trackCount: number; + specialType: number; + privacy: number; + trackUpdateTime: number; + commentThreadId: string; + playCount: number; + trackNumberUpdateTime: number; + subscribedCount: number; + cloudTrackCount: number; + ordered: boolean; + description: string; + tags: string[]; + updateFrequency?: any; + backgroundCoverId: number; + backgroundCoverUrl?: any; + titleImage: number; + titleImageUrl?: any; + englishTitle?: any; + officialPlaylistType?: any; + subscribers: Subscriber[]; + subscribed: boolean; + creator: Subscriber; + tracks: Track[]; + videoIds?: any; + videos?: any; + trackIds: TrackId[]; + shareCount: number; + commentCount: number; + remixVideo?: any; + sharedUsers?: any; + historySharedUsers?: any; +} + +interface TrackId { + id: number; + v: number; + t: number; + at: number; + alg?: any; + uid: number; + rcmdReason: string; +} + +interface Track { + name: string; + id: number; + pst: number; + t: number; + ar: Ar[]; + alia: string[]; + pop: number; + st: number; + rt?: string; + fee: number; + v: number; + crbt?: any; + cf: string; + al: Al; + dt: number; + h: H; + m: H; + l?: H; + a?: any; + cd: string; + no: number; + rtUrl?: any; + ftype: number; + rtUrls: any[]; + djId: number; + copyright: number; + s_id: number; + mark: number; + originCoverType: number; + originSongSimpleData?: any; + single: number; + noCopyrightRcmd?: any; + mst: number; + cp: number; + mv: number; + rtype: number; + rurl?: any; + publishTime: number; + tns?: string[]; +} + +interface H { + br: number; + fid: number; + size: number; + vd: number; +} + +interface Al { + id: number; + name: string; + picUrl: string; + tns: any[]; + pic_str?: string; + pic: number; +} + +interface Ar { + id: number; + name: string; + tns: any[]; + alias: any[]; +} + +interface Subscriber { + defaultAvatar: boolean; + province: number; + authStatus: number; + followed: boolean; + avatarUrl: string; + accountStatus: number; + gender: number; + city: number; + birthday: number; + userId: number; + userType: number; + nickname: string; + signature: string; + description: string; + detailDescription: string; + avatarImgId: number; + backgroundImgId: number; + backgroundUrl: string; + authority: number; + mutual: boolean; + expertTags?: any; + experts?: any; + djStatus: number; + vipType: number; + remarkName?: any; + authenticationTypes: number; + avatarDetail?: any; + backgroundImgIdStr: string; + anchor: boolean; + avatarImgIdStr: string; + avatarImgId_str: string; +} diff --git a/src/type/lyric.ts b/src/type/lyric.ts index 6ab350a..180fccc 100644 --- a/src/type/lyric.ts +++ b/src/type/lyric.ts @@ -1,14 +1,14 @@ -export interface ILyric { - sgc: boolean; - sfy: boolean; - qfy: boolean; - lrc: Lrc; - klyric: Lrc; - tlyric: Lrc; - code: number; -} - -interface Lrc { - version: number; - lyric: string; -} +export interface ILyric { + sgc: boolean; + sfy: boolean; + qfy: boolean; + lrc: Lrc; + klyric: Lrc; + tlyric: Lrc; + code: number; +} + +interface Lrc { + version: number; + lyric: string; +} diff --git a/src/type/music.ts b/src/type/music.ts index cd5b122..93bd8a1 100644 --- a/src/type/music.ts +++ b/src/type/music.ts @@ -1,197 +1,197 @@ -export interface IRecommendMusic { - code: number; - category: number; - result: SongResult[]; -} - -export interface SongResult { - id: number - type: number - name: string - copywriter?: any - picUrl: string - canDislike: boolean - trackNumberUpdateTime?: any - song: Song - alg: string - count?: number -} - -interface Song { - name: string; - id: number; - position: number; - alias: string[]; - status: number; - fee: number; - copyrightId: number; - disc: string; - no: number; - artists: Artist[]; - album: Album; - starred: boolean; - popularity: number; - score: number; - starredNum: number; - duration: number; - playedNum: number; - dayPlays: number; - hearTime: number; - ringtone: string; - crbt?: any; - audition?: any; - copyFrom: string; - commentThreadId: string; - rtUrl?: any; - ftype: number; - rtUrls: any[]; - copyright: number; - transName?: any; - sign?: any; - mark: number; - originCoverType: number; - originSongSimpleData?: any; - single: number; - noCopyrightRcmd?: any; - rtype: number; - rurl?: any; - mvid: number; - bMusic: BMusic; - mp3Url?: any; - hMusic: BMusic; - mMusic: BMusic; - lMusic: BMusic; - exclusive: boolean; - privilege: Privilege; -} - -interface Privilege { - id: number; - fee: number; - payed: number; - st: number; - pl: number; - dl: number; - sp: number; - cp: number; - subp: number; - cs: boolean; - maxbr: number; - fl: number; - toast: boolean; - flag: number; - preSell: boolean; - playMaxbr: number; - downloadMaxbr: number; - rscl?: any; - freeTrialPrivilege: FreeTrialPrivilege; - chargeInfoList: ChargeInfoList[]; -} - -interface ChargeInfoList { - rate: number; - chargeUrl?: any; - chargeMessage?: any; - chargeType: number; -} - -interface FreeTrialPrivilege { - resConsumable: boolean; - userConsumable: boolean; -} - -interface BMusic { - name?: any; - id: number; - size: number; - extension: string; - sr: number; - dfsId: number; - bitrate: number; - playTime: number; - volumeDelta: number; -} - -interface Album { - name: string; - id: number; - type: string; - size: number; - picId: number; - blurPicUrl: string; - companyId: number; - pic: number; - picUrl: string; - publishTime: number; - description: string; - tags: string; - company: string; - briefDesc: string; - artist: Artist; - songs: any[]; - alias: string[]; - status: number; - copyrightId: number; - commentThreadId: string; - artists: Artist[]; - subType: string; - transName?: any; - onSale: boolean; - mark: number; - picId_str: string; -} - -interface Artist { - name: string; - id: number; - picId: number; - img1v1Id: number; - briefDesc: string; - picUrl: string; - img1v1Url: string; - albumSize: number; - alias: any[]; - trans: string; - musicSize: number; - topicPerson: number; -} - -export interface IPlayMusicUrl { - data: Datum[]; - code: number; -} - -interface Datum { - id: number; - url: string; - br: number; - size: number; - md5: string; - code: number; - expi: number; - type: string; - gain: number; - fee: number; - uf?: any; - payed: number; - flag: number; - canExtend: boolean; - freeTrialInfo?: any; - level: string; - encodeType: string; - freeTrialPrivilege: FreeTrialPrivilege; - freeTimeTrialPrivilege: FreeTimeTrialPrivilege; - urlSource: number; -} - -interface FreeTimeTrialPrivilege { - resConsumable: boolean; - userConsumable: boolean; - type: number; - remainTime: number; -} - -interface FreeTrialPrivilege { - resConsumable: boolean; - userConsumable: boolean; -} +export interface IRecommendMusic { + code: number; + category: number; + result: SongResult[]; +} + +export interface SongResult { + id: number; + type: number; + name: string; + copywriter?: any; + picUrl: string; + canDislike: boolean; + trackNumberUpdateTime?: any; + song: Song; + alg: string; + count?: number; +} + +interface Song { + name: string; + id: number; + position: number; + alias: string[]; + status: number; + fee: number; + copyrightId: number; + disc: string; + no: number; + artists: Artist[]; + album: Album; + starred: boolean; + popularity: number; + score: number; + starredNum: number; + duration: number; + playedNum: number; + dayPlays: number; + hearTime: number; + ringtone: string; + crbt?: any; + audition?: any; + copyFrom: string; + commentThreadId: string; + rtUrl?: any; + ftype: number; + rtUrls: any[]; + copyright: number; + transName?: any; + sign?: any; + mark: number; + originCoverType: number; + originSongSimpleData?: any; + single: number; + noCopyrightRcmd?: any; + rtype: number; + rurl?: any; + mvid: number; + bMusic: BMusic; + mp3Url?: any; + hMusic: BMusic; + mMusic: BMusic; + lMusic: BMusic; + exclusive: boolean; + privilege: Privilege; +} + +interface Privilege { + id: number; + fee: number; + payed: number; + st: number; + pl: number; + dl: number; + sp: number; + cp: number; + subp: number; + cs: boolean; + maxbr: number; + fl: number; + toast: boolean; + flag: number; + preSell: boolean; + playMaxbr: number; + downloadMaxbr: number; + rscl?: any; + freeTrialPrivilege: FreeTrialPrivilege; + chargeInfoList: ChargeInfoList[]; +} + +interface ChargeInfoList { + rate: number; + chargeUrl?: any; + chargeMessage?: any; + chargeType: number; +} + +interface FreeTrialPrivilege { + resConsumable: boolean; + userConsumable: boolean; +} + +interface BMusic { + name?: any; + id: number; + size: number; + extension: string; + sr: number; + dfsId: number; + bitrate: number; + playTime: number; + volumeDelta: number; +} + +interface Album { + name: string; + id: number; + type: string; + size: number; + picId: number; + blurPicUrl: string; + companyId: number; + pic: number; + picUrl: string; + publishTime: number; + description: string; + tags: string; + company: string; + briefDesc: string; + artist: Artist; + songs: any[]; + alias: string[]; + status: number; + copyrightId: number; + commentThreadId: string; + artists: Artist[]; + subType: string; + transName?: any; + onSale: boolean; + mark: number; + picId_str: string; +} + +interface Artist { + name: string; + id: number; + picId: number; + img1v1Id: number; + briefDesc: string; + picUrl: string; + img1v1Url: string; + albumSize: number; + alias: any[]; + trans: string; + musicSize: number; + topicPerson: number; +} + +export interface IPlayMusicUrl { + data: Datum[]; + code: number; +} + +interface Datum { + id: number; + url: string; + br: number; + size: number; + md5: string; + code: number; + expi: number; + type: string; + gain: number; + fee: number; + uf?: any; + payed: number; + flag: number; + canExtend: boolean; + freeTrialInfo?: any; + level: string; + encodeType: string; + freeTrialPrivilege: FreeTrialPrivilege; + freeTimeTrialPrivilege: FreeTimeTrialPrivilege; + urlSource: number; +} + +interface FreeTimeTrialPrivilege { + resConsumable: boolean; + userConsumable: boolean; + type: number; + remainTime: number; +} + +interface FreeTrialPrivilege { + resConsumable: boolean; + userConsumable: boolean; +} diff --git a/src/type/mv.ts b/src/type/mv.ts index 0e0989e..f158be7 100644 --- a/src/type/mv.ts +++ b/src/type/mv.ts @@ -1,84 +1,84 @@ export interface IMvItem { - id: number - cover: string - name: string - playCount: number - briefDesc?: any - desc?: any - artistName: string - artistId: number - duration: number - mark: number - mv: IMvData - lastRank: number - score: number - subed: boolean - artists: Artist[] - transNames?: string[] - alias?: string[] + id: number; + cover: string; + name: string; + playCount: number; + briefDesc?: any; + desc?: any; + artistName: string; + artistId: number; + duration: number; + mark: number; + mv: IMvData; + lastRank: number; + score: number; + subed: boolean; + artists: Artist[]; + transNames?: string[]; + alias?: string[]; } export interface IMvData { - authId: number - status: number - id: number - title: string - subTitle: string - appTitle: string - aliaName: string - transName: string - pic4v3: number - pic16v9: number - caption: number - captionLanguage: string - style?: any - mottos: string - oneword?: any - appword: string - stars?: any - desc: string - area: string - type: string - subType: string - neteaseonly: number - upban: number - topWeeks: string - publishTime: string - online: number - score: number - plays: number - monthplays: number - weekplays: number - dayplays: number - fee: number - artists: Artist[] - videos: Video[] + authId: number; + status: number; + id: number; + title: string; + subTitle: string; + appTitle: string; + aliaName: string; + transName: string; + pic4v3: number; + pic16v9: number; + caption: number; + captionLanguage: string; + style?: any; + mottos: string; + oneword?: any; + appword: string; + stars?: any; + desc: string; + area: string; + type: string; + subType: string; + neteaseonly: number; + upban: number; + topWeeks: string; + publishTime: string; + online: number; + score: number; + plays: number; + monthplays: number; + weekplays: number; + dayplays: number; + fee: number; + artists: Artist[]; + videos: Video[]; } interface Video { - tagSign: TagSign - tag: string - url: string - duration: number - size: number - width: number - height: number - container: string - md5: string - check: boolean + tagSign: TagSign; + tag: string; + url: string; + duration: number; + size: number; + width: number; + height: number; + container: string; + md5: string; + check: boolean; } interface TagSign { - br: number - type: string - tagSign: string - resolution: number - mvtype: string + br: number; + type: string; + tagSign: string; + resolution: number; + mvtype: string; } interface Artist { - id: number - name: string + id: number; + name: string; } // { @@ -97,16 +97,16 @@ interface Artist { // } export interface IMvUrlData { - id: number - url: string - r: number - size: number - md5: string - code: number - expi: number - fee: number - mvFee: number - st: number - promotionVo: null | any - msg: string + id: number; + url: string; + r: number; + size: number; + md5: string; + code: number; + expi: number; + fee: number; + mvFee: number; + st: number; + promotionVo: null | any; + msg: string; } diff --git a/src/type/playlist.ts b/src/type/playlist.ts index 2412cc0..8846c85 100644 --- a/src/type/playlist.ts +++ b/src/type/playlist.ts @@ -6,11 +6,11 @@ export interface IPlayListSort { } interface SortCategories { - "0": string; - "1": string; - "2": string; - "3": string; - "4": string; + '0': string; + '1': string; + '2': string; + '3': string; + '4': string; } interface SortAll { diff --git a/src/type/search.ts b/src/type/search.ts index f61ba52..3716682 100644 --- a/src/type/search.ts +++ b/src/type/search.ts @@ -540,7 +540,7 @@ interface Song2 { } interface KsongInfos { - "347230": _347230; + '347230': _347230; } interface _347230 { diff --git a/src/utils/index.ts b/src/utils/index.ts index 54bda5a..8e94002 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,64 +1,61 @@ // 设置歌手背景图片 export const setBackgroundImg = (url: String) => { - return 'background-image:' + 'url(' + url + ')' -} + return `background-image:url(${url})`; +}; // 设置动画类型 export const setAnimationClass = (type: String) => { - return 'animate__animated ' + type -} + return `animate__animated ${type}`; +}; // 设置动画延时 export const setAnimationDelay = (index: number = 6, time: number = 50) => { - return 'animation-delay:' + index * time + 'ms' -} + return `animation-delay:${index * time}ms`; +}; -//将秒转换为分钟和秒 +// 将秒转换为分钟和秒 export const secondToMinute = (s: number) => { if (!s) { - return '00:00' + return '00:00'; } - let minute: number = Math.floor(s / 60) - let second: number = Math.floor(s % 60) - let minuteStr: string = - minute > 9 ? minute.toString() : '0' + minute.toString() - let secondStr: string = - second > 9 ? second.toString() : '0' + second.toString() - return minuteStr + ':' + secondStr -} + const minute: number = Math.floor(s / 60); + const second: number = Math.floor(s % 60); + const minuteStr: string = minute > 9 ? minute.toString() : `0${minute.toString()}`; + const secondStr: string = second > 9 ? second.toString() : `0${second.toString()}`; + return `${minuteStr}:${secondStr}`; +}; // 格式化数字 千,万, 百万, 千万,亿 export const formatNumber = (num: any) => { - num = num * 1 + num *= 1; if (num < 10000) { - return num + return num; } if (num < 100000000) { - return (num / 10000).toFixed(1) + '万' + return `${(num / 10000).toFixed(1)}万`; } - return (num / 100000000).toFixed(1) + '亿' -} -const windowData = window as any + return `${(num / 100000000).toFixed(1)}亿`; +}; +const windowData = window as any; export const getIsMc = () => { if (!windowData.electron) { - return false + return false; } if (windowData.electron.ipcRenderer.getStoreValue('set').isProxy) { - return true + return true; } - return false -} -const ProxyUrl = - import.meta.env.VITE_API_PROXY + '' || 'http://110.42.251.190:9856' + return false; +}; +const ProxyUrl = import.meta.env.VITE_API_PROXY || 'http://110.42.251.190:9856'; export const getMusicProxyUrl = (url: string) => { if (!getIsMc()) { - return url + return url; } - const PUrl = url.split('').join('+') - return `${ProxyUrl}/mc?url=${PUrl}` -} + const PUrl = url.split('').join('+'); + return `${ProxyUrl}/mc?url=${PUrl}`; +}; export const getImgUrl = computed(() => (url: string, size: string = '') => { - const bdUrl = 'https://image.baidu.com/search/down?url=' - const imgUrl = encodeURIComponent(`${url}?param=${size}`) - return `${bdUrl}${imgUrl}` -}) + const bdUrl = 'https://image.baidu.com/search/down?url='; + const imgUrl = encodeURIComponent(`${url}?param=${size}`); + return `${bdUrl}${imgUrl}`; +}); diff --git a/src/utils/request.ts b/src/utils/request.ts index d1c0bee..92a409f 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -1,8 +1,9 @@ -import axios from "axios"; -let baseURL = import.meta.env.VITE_API + ""; +import axios from 'axios'; + +const baseURL = `${import.meta.env.VITE_API}`; const request = axios.create({ - baseURL: baseURL, + baseURL, timeout: 10000, }); @@ -11,12 +12,12 @@ request.interceptors.request.use( (config) => { // 在请求发送之前做一些处理 // 在get请求params中添加timestamp - if (config.method === "get") { + if (config.method === 'get') { config.params = { ...config.params, timestamp: Date.now(), }; - let token = localStorage.getItem("token"); + const token = localStorage.getItem('token'); if (token) { config.params.cookie = token; } @@ -27,7 +28,7 @@ request.interceptors.request.use( (error) => { // 当请求异常时做一些处理 return Promise.reject(error); - } + }, ); export default request; diff --git a/src/utils/request_mt.ts b/src/utils/request_mt.ts index e1c7a4b..91ce7f3 100644 --- a/src/utils/request_mt.ts +++ b/src/utils/request_mt.ts @@ -1,7 +1,8 @@ -import axios from "axios"; -let baseURL = import.meta.env.VITE_API_MT + ""; +import axios from 'axios'; + +const baseURL = `${import.meta.env.VITE_API_MT}`; const request = axios.create({ - baseURL: baseURL, + baseURL, timeout: 10000, }); @@ -13,7 +14,7 @@ request.interceptors.request.use( (error) => { // 当请求异常时做一些处理 return Promise.reject(error); - } + }, ); export default request; diff --git a/src/utils/request_music.ts b/src/utils/request_music.ts index 8ab9474..733765d 100644 --- a/src/utils/request_music.ts +++ b/src/utils/request_music.ts @@ -1,19 +1,20 @@ -import axios from "axios" -let baseURL = import.meta.env.VITE_API_MUSIC + "" +import axios from 'axios'; + +const baseURL = `${import.meta.env.VITE_API_MUSIC}`; const request = axios.create({ - baseURL: baseURL, + baseURL, timeout: 10000, -}) +}); // 请求拦截器 request.interceptors.request.use( (config) => { - return config + return config; }, (error) => { // 当请求异常时做一些处理 - return Promise.reject(error) - } -) + return Promise.reject(error); + }, +); -export default request +export default request; diff --git a/src/views/history/index.vue b/src/views/history/index.vue index 66f3f67..757a360 100644 --- a/src/views/history/index.vue +++ b/src/views/history/index.vue @@ -1,10 +1,16 @@ \ No newline at end of file + diff --git a/src/views/home/index.vue b/src/views/home/index.vue index bb96fd3..a4ac9f4 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -1,27 +1,27 @@ \ No newline at end of file + diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 245961a..a876131 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,170 +1,165 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/views/lyric/index.vue b/src/views/lyric/index.vue new file mode 100644 index 0000000..aa2e2d9 --- /dev/null +++ b/src/views/lyric/index.vue @@ -0,0 +1,182 @@ + + + + + + + diff --git a/src/views/mv/index.vue b/src/views/mv/index.vue index 7e96381..5a6e368 100644 --- a/src/views/mv/index.vue +++ b/src/views/mv/index.vue @@ -5,10 +5,22 @@
-
+
- +
{{ formatNumber(item.playCount) }}
@@ -35,39 +47,39 @@ \ No newline at end of file +} + diff --git a/src/views/search/index.vue b/src/views/search/index.vue index 5203db0..a84bfcb 100644 --- a/src/views/search/index.vue +++ b/src/views/search/index.vue @@ -1,74 +1,63 @@ \ No newline at end of file + diff --git a/src/views/user/index.vue b/src/views/user/index.vue index 6831a22..3c222e9 100644 --- a/src/views/user/index.vue +++ b/src/views/user/index.vue @@ -1,89 +1,87 @@ @@ -222,5 +210,4 @@ const handlePlay = (item: any) => { } } } - - \ No newline at end of file + diff --git a/vite.config.ts b/vite.config.ts index 2341b94..c960c46 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import path from 'path' -import VueDevTools from 'vite-plugin-vue-devtools' +// import VueDevTools from 'vite-plugin-vue-devtools' import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { NaiveUiResolver } from 'unplugin-vue-components/resolvers' @@ -10,7 +10,7 @@ import { NaiveUiResolver } from 'unplugin-vue-components/resolvers' export default defineConfig({ plugins: [ vue(), - VueDevTools(), + // VueDevTools(), AutoImport({ imports: [ 'vue',