refactor: 创建统一 API 封装层,前端不再直接调用 invoke

- 新增 src/api.ts,按职责分为 MusicApi/AudioApi/DeviceApi/DownloadApi/AppApi 五个命名空间
- 替换 15 个文件中所有 invoke 调用为 API 层方法
- 后端接口变更只需修改 api.ts 一处,便于后期迭代维护
This commit is contained in:
2026-05-29 22:02:42 +08:00
parent 68f29c8ea8
commit e40f82cc51
19 changed files with 302 additions and 116 deletions

View File

@ -145,7 +145,7 @@ defineOptions({ name: 'DiscoverView' });
import { ref, computed, onMounted, onActivated, watch, nextTick } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { invoke } from '@tauri-apps/api/core';
import { MusicApi } from '../api';
import { usePlayerStore } from '../stores/player';
import SongListItem from '../components/SongListItem.vue';
import { normalizeSong, type Song } from '../utils/song';
@ -231,7 +231,7 @@ function onInputChange() {
}
suggestTimer = setTimeout(async () => {
try {
const jsonStr: string = await invoke('search_suggest', { query: { keyword: keyword.value.trim() } });
const jsonStr: string = await MusicApi.searchSuggest(keyword.value.trim());
const data = JSON.parse(jsonStr);
const all = data.result?.allMatch || [];
suggestions.value = all.map((m: any) => m.keyword).slice(0, 8);
@ -254,7 +254,7 @@ async function loadHotTags() {
hotTags.value = cached;
} else {
try {
const json = await invoke('get_hot_search');
const json = await MusicApi.getHotSearch();
const data = JSON.parse(json as string);
hotTags.value = (data.data || []).slice(0, 12);
pageCacheSet('discover_hotTags', hotTags.value);
@ -317,8 +317,8 @@ async function fetchTabResults(type: number) {
loading.value = true;
cacheError.value = false;
try {
const jsonStr: string = await invoke('cloudsearch', {
query: { keyword: lastSearchKeyword.value, searchType: type, limit: 30 }
const jsonStr: string = await MusicApi.cloudsearch({
keyword: lastSearchKeyword.value, searchType: type, limit: 30
});
const data = JSON.parse(jsonStr);
const result = data.result || {};