diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 9cf314e..3fd89c1 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -5,6 +5,7 @@ import AutoImport from 'unplugin-auto-import/vite'; import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'; import Components from 'unplugin-vue-components/vite'; import viteCompression from 'vite-plugin-compression'; +import VueDevTools from 'vite-plugin-vue-devtools'; export default defineConfig({ main: { @@ -23,7 +24,7 @@ export default defineConfig({ plugins: [ vue(), viteCompression(), - // VueDevTools(), + VueDevTools(), AutoImport({ imports: [ 'vue', diff --git a/package.json b/package.json index 6940cbe..e1d465e 100644 --- a/package.json +++ b/package.json @@ -21,40 +21,41 @@ "build:linux": "npm run build && electron-builder --linux" }, "dependencies": { - "@electron-toolkit/preload": "^3.0.0", - "@electron-toolkit/utils": "^3.0.0", + "@electron-toolkit/preload": "^3.0.1", + "@electron-toolkit/utils": "^4.0.0", "@unblockneteasemusic/server": "^0.27.8-patch.1", - "electron-store": "^8.1.0", + "electron-store": "^8.1.1", "electron-updater": "^6.1.7", "font-list": "^1.5.1", "netease-cloud-music-api-alger": "^4.25.0", - "vue-i18n": "9" + "vue-i18n": "11.1.2" }, "devDependencies": { + "@tailwindcss/vite": "^4.0.14", "@electron-toolkit/eslint-config": "^1.0.2", "@electron-toolkit/eslint-config-ts": "^2.0.0", "@electron-toolkit/tsconfig": "^1.0.1", "@rushstack/eslint-patch": "^1.10.3", "@tailwindcss/postcss7-compat": "^2.2.4", + "@typescript-eslint/eslint-plugin": "^8.26.1", + "@typescript-eslint/parser": "^8.26.1", + "@vue/eslint-config-typescript": "^13.0.0", "@types/howler": "^2.2.12", "@types/node": "^20.14.8", "@types/tinycolor2": "^1.4.6", - "@typescript-eslint/eslint-plugin": "^7.0.0", - "@typescript-eslint/parser": "^7.0.0", - "@vitejs/plugin-vue": "^5.0.5", - "@vue/compiler-sfc": "^3.5.0", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/compiler-sfc": "^3.5.13", "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^13.0.0", - "@vue/runtime-core": "^3.5.0", - "@vueuse/core": "^11.0.3", - "@vueuse/electron": "^11.0.3", + "@vue/runtime-core": "^3.5.13", + "@vueuse/core": "^13.0.0", + "@vueuse/electron": "^13.0.0", "animate.css": "^4.1.1", + "axios": "^1.8.3", "autoprefixer": "^10.4.20", - "axios": "^1.7.7", "cross-env": "^7.0.3", "electron": "^34.0.0", "electron-builder": "^25.1.8", - "electron-vite": "^2.3.0", + "electron-vite": "3.0.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^9.0.0", @@ -65,26 +66,24 @@ "eslint-plugin-vue-scoped-css": "^2.7.2", "howler": "^2.2.4", "lodash": "^4.17.21", - "marked": "^15.0.4", + "marked": "^15.0.7", "naive-ui": "^2.41.0", - "postcss": "^8.4.49", - "prettier": "^3.3.2", - "remixicon": "^4.2.0", - "sass": "^1.83.4", + "prettier": "^3.5.3", + "remixicon": "^4.6.0", + "sass": "^1.86.0", "tailwindcss": "^3.4.17", "tinycolor2": "^1.6.0", - "typescript": "^5.5.2", - "unplugin-auto-import": "^0.18.2", - "unplugin-vue-components": "^0.27.4", - "vfonts": "^0.1.0", - "vite": "^5.3.1", + "tunajs": "^1.0.15", + "typescript": "^5.8.2", + "unplugin-auto-import": "^19.1.1", + "unplugin-vue-components": "^28.4.1", + "vite": "^6.2.2", "vite-plugin-compression": "^0.5.1", - "vite-plugin-vue-devtools": "7.4.0", + "vite-plugin-vue-devtools": "7.7.2", "vue": "^3.5.13", "vue-router": "^4.5.0", - "vue-tsc": "^2.0.22", - "vuex": "^4.1.0", - "tunajs": "^1.0.15" + "vue-tsc": "^2.2.8", + "vuex": "^4.1.0" }, "build": { "appId": "com.alger.music", diff --git a/src/renderer/api/music.ts b/src/renderer/api/music.ts index 236f892..50bef20 100644 --- a/src/renderer/api/music.ts +++ b/src/renderer/api/music.ts @@ -91,7 +91,7 @@ export const likeSong = (id: number, like: boolean = true) => { // 获取用户喜欢的音乐列表 export const getLikedList = (uid: number) => { return request.get('/likelist', { - params: { uid } + params: { uid, noLogin: true } }); }; diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index 4e08703..7e15b09 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -2,6 +2,7 @@ // @ts-nocheck // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 +// biome-ignore lint: disable export {} /* prettier-ignore */ @@ -11,6 +12,8 @@ declare module 'vue' { NBadge: typeof import('naive-ui')['NBadge'] NButton: typeof import('naive-ui')['NButton'] NButtonGroup: typeof import('naive-ui')['NButtonGroup'] + NCarousel: typeof import('naive-ui')['NCarousel'] + NCarouselItem: typeof import('naive-ui')['NCarouselItem'] NCheckbox: typeof import('naive-ui')['NCheckbox'] NCheckboxGroup: typeof import('naive-ui')['NCheckboxGroup'] NConfigProvider: typeof import('naive-ui')['NConfigProvider'] diff --git a/src/renderer/components/RecommendSinger.vue b/src/renderer/components/RecommendSinger.vue deleted file mode 100644 index 737e2aa..0000000 --- a/src/renderer/components/RecommendSinger.vue +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - {{ t('comp.recommendSinger.title') }} - - - - - {{ item.name }} - - - - - - - - - {{ t('common.songCount', { count: item.musicSize }) }} - - - - - - - {{ item.name }} - - - - - - - - - - - - - diff --git a/src/renderer/components/PlaylistType.vue b/src/renderer/components/home/PlaylistType.vue similarity index 100% rename from src/renderer/components/PlaylistType.vue rename to src/renderer/components/home/PlaylistType.vue diff --git a/src/renderer/components/RecommendAlbum.vue b/src/renderer/components/home/RecommendAlbum.vue similarity index 100% rename from src/renderer/components/RecommendAlbum.vue rename to src/renderer/components/home/RecommendAlbum.vue diff --git a/src/renderer/components/RecommendSonglist.vue b/src/renderer/components/home/RecommendSonglist.vue similarity index 96% rename from src/renderer/components/RecommendSonglist.vue rename to src/renderer/components/home/RecommendSonglist.vue index 71d09cc..0e1e0ed 100644 --- a/src/renderer/components/RecommendSonglist.vue +++ b/src/renderer/components/home/RecommendSonglist.vue @@ -27,11 +27,10 @@ import { useI18n } from 'vue-i18n'; import { useStore } from 'vuex'; import { getRecommendMusic } from '@/api/home'; +import SongItem from '@/components/common/SongItem.vue'; import type { IRecommendMusic } from '@/type/music'; import { setAnimationClass, setAnimationDelay } from '@/utils'; -import SongItem from './common/SongItem.vue'; - const { t } = useI18n(); const store = useStore(); // 推荐歌曲 diff --git a/src/renderer/components/home/TopBanner.vue b/src/renderer/components/home/TopBanner.vue new file mode 100644 index 0000000..7304693 --- /dev/null +++ b/src/renderer/components/home/TopBanner.vue @@ -0,0 +1,236 @@ + + + + + + + + + + {{ t('comp.recommendSinger.title') }} + + + + + {{ item.name }} + + + + + + + + + + + {{ store.state.user?.nickname }} + + + + + + + {{ item.name }} + {{ t('common.songCount', { count: item.trackCount }) }} + + + + + + + + + {{ t('common.songCount', { count: item.musicSize }) }} + + + + + + + {{ item.name }} + + + + + + + + + + + + + + diff --git a/src/renderer/main.ts b/src/renderer/main.ts index f931e0d..94f0577 100644 --- a/src/renderer/main.ts +++ b/src/renderer/main.ts @@ -1,6 +1,3 @@ -import 'vfonts/Lato.css'; -import 'vfonts/FiraCode.css'; -// tailwind css import './index.css'; import 'animate.css'; import 'remixicon/fonts/remixicon.css'; diff --git a/src/renderer/utils/request.ts b/src/renderer/utils/request.ts index ed5eaeb..64aad76 100644 --- a/src/renderer/utils/request.ts +++ b/src/renderer/utils/request.ts @@ -75,7 +75,7 @@ request.interceptors.response.use( return response; }, async (error) => { - console.log('error', error); + console.error('error', error); const config = error.config as CustomAxiosRequestConfig; // 如果没有配置,直接返回错误 @@ -84,10 +84,10 @@ request.interceptors.response.use( } // 处理 301 状态码 - if (error.response?.status === 301) { + if (error.response?.status === 301 && config.params.noLogin !== true) { // 使用 store mutation 清除用户信息 store.commit('logout'); - console.log(`301 状态码,清除登录信息后重试第 ${config.retryCount} 次`); + console.error(`301 状态码,清除登录信息后重试第 ${config.retryCount} 次`, config); config.retryCount = 3; } @@ -98,7 +98,7 @@ request.interceptors.response.use( !NO_RETRY_URLS.includes(config.url as string) ) { config.retryCount++; - console.log(`请求重试第 ${config.retryCount} 次`); + console.error(`请求重试第 ${config.retryCount} 次`); // 延迟重试 await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY)); @@ -107,7 +107,7 @@ request.interceptors.response.use( return request(config); } - console.log(`重试${MAX_RETRIES}次后仍然失败`); + console.error(`重试${MAX_RETRIES}次后仍然失败`); return Promise.reject(error); } ); diff --git a/src/renderer/views/home/index.vue b/src/renderer/views/home/index.vue index cd5e251..7140a43 100644 --- a/src/renderer/views/home/index.vue +++ b/src/renderer/views/home/index.vue @@ -2,7 +2,7 @@ - + @@ -19,10 +19,10 @@
- {{ item.name }} - -
+ {{ item.name }} + +