diff --git a/webui/.eslintignore b/webui/.eslintignore index 2247d5f9..88bef34a 100644 --- a/webui/.eslintignore +++ b/webui/.eslintignore @@ -1,2 +1,3 @@ /build /dist +/dev-dist diff --git a/webui/.prettierignore b/webui/.prettierignore index 4875f84a..7163ffe0 100644 --- a/webui/.prettierignore +++ b/webui/.prettierignore @@ -1,5 +1,6 @@ /build /dist +/dev-dist /pnpm-lock.yaml auto-imports.d.ts components.d.ts diff --git a/webui/src/App.vue b/webui/src/App.vue index 373f747d..af1f79a4 100644 --- a/webui/src/App.vue +++ b/webui/src/App.vue @@ -5,7 +5,6 @@ import { NMessageProvider, } from 'naive-ui'; - const theme: GlobalThemeOverrides = { Spin: { color: '#fff', diff --git a/webui/src/api/bangumi.ts b/webui/src/api/bangumi.ts index 69ed9a21..d04fa2cb 100644 --- a/webui/src/api/bangumi.ts +++ b/webui/src/api/bangumi.ts @@ -1,137 +1,136 @@ -import type {BangumiAPI, BangumiRule} from '#/bangumi'; -import type {ApiSuccess} from '#/api'; - +import type { BangumiAPI, BangumiRule } from '#/bangumi'; +import type { ApiSuccess } from '#/api'; export const apiBangumi = { - /** - * 获取所有 bangumi 数据 - * @returns 所有 bangumi 数据 - */ - async getAll() { - const {data} = await axios.get('api/v1/bangumi/get/all'); - const result: BangumiRule[] = data.map((bangumi) => ( - { - ...bangumi, - filter: bangumi.filter.split(','), - rss_link: bangumi.rss_link.split(','), - } - )); - return result; - }, + /** + * 获取所有 bangumi 数据 + * @returns 所有 bangumi 数据 + */ + async getAll() { + const { data } = await axios.get('api/v1/bangumi/get/all'); + const result: BangumiRule[] = data.map((bangumi) => ({ + ...bangumi, + filter: bangumi.filter.split(','), + rss_link: bangumi.rss_link.split(','), + })); + return result; + }, - /** - * 获取指定 bangumiId 的规则 - * @param bangumiId bangumi id - * @returns 指定 bangumi 的规则 - */ - async getRule(bangumiId: number) { - const {data} = await axios.get( - `api/v1/bangumi/get/${bangumiId}` - ); - const result: BangumiRule = { - ...data, - filter: data.filter.split(','), - rss_link: data.rss_link.split(','), - } - return result; - }, + /** + * 获取指定 bangumiId 的规则 + * @param bangumiId bangumi id + * @returns 指定 bangumi 的规则 + */ + async getRule(bangumiId: number) { + const { data } = await axios.get( + `api/v1/bangumi/get/${bangumiId}` + ); + const result: BangumiRule = { + ...data, + filter: data.filter.split(','), + rss_link: data.rss_link.split(','), + }; + return result; + }, - /** - * 更新指定 bangumiId 的规则 - * @param bangumiId - 需要更新的 bangumi 的 id - * @param bangumiRule - * @returns axios 请求返回的数据 - */ - async updateRule(bangumiId: number, bangumiRule: BangumiRule) { - const rule: BangumiAPI = { - ...bangumiRule, - filter: bangumiRule.filter.join(','), - rss_link: bangumiRule.rss_link.join(','), - } - const post = omit(rule, ['id']) - const {data} = await axios.patch( - `api/v1/bangumi/update/${bangumiId}`, - post - ); - return data; - }, + /** + * 更新指定 bangumiId 的规则 + * @param bangumiId - 需要更新的 bangumi 的 id + * @param bangumiRule + * @returns axios 请求返回的数据 + */ + async updateRule(bangumiId: number, bangumiRule: BangumiRule) { + const rule: BangumiAPI = { + ...bangumiRule, + filter: bangumiRule.filter.join(','), + rss_link: bangumiRule.rss_link.join(','), + }; + const post = omit(rule, ['id']); + const { data } = await axios.patch( + `api/v1/bangumi/update/${bangumiId}`, + post + ); + return data; + }, - /** - * 删除指定 bangumiId 的数据库规则,会在重新匹配到后重建 - * @param bangumiId - 需要删除的 bangumi 的 id - * @param file - 是否同时删除关联文件。 - * @returns axios 请求返回的数据 - */ - async deleteRule(bangumiId: number | number[], file: boolean) { - let url = 'api/v1/bangumi/delete'; - let ids: undefined | number[]; + /** + * 删除指定 bangumiId 的数据库规则,会在重新匹配到后重建 + * @param bangumiId - 需要删除的 bangumi 的 id + * @param file - 是否同时删除关联文件。 + * @returns axios 请求返回的数据 + */ + async deleteRule(bangumiId: number | number[], file: boolean) { + let url = 'api/v1/bangumi/delete'; + let ids: undefined | number[]; - if (typeof bangumiId === 'number') { - url = `${url}/${bangumiId}`; - } else { - url = `${url}/many`; - ids = bangumiId; - } - - const {data} = await axios.delete(url, { - data: ids, - params: { - file, - }, - }); - return data; - }, - - /** - * 删除指定 bangumiId 的规则。如果 file 为 true,则同时删除关联文件。 - * @param bangumiId - 需要删除规则的 bangumi 的 id。 - * @param file - 是否同时删除关联文件。 - * @returns axios 请求返回的数据 - */ - async disableRule(bangumiId: number | number[], file: boolean) { - let url = 'api/v1/bangumi/disable'; - let ids: undefined | number[]; - - if (typeof bangumiId === 'number') { - url = `${url}/${bangumiId}`; - } else { - url = `${url}/many`; - ids = bangumiId; - } - - const {data} = await axios.delete(url, { - data: ids, - params: { - file, - }, - }); - return data; - }, - - /** - * 启用指定 bangumiId 的规则 - * @param bangumiId - 需要启用的 bangumi 的 id - */ - async enableRule(bangumiId: number) { - const {data} = await axios.get( - `api/v1/bangumi/enable/${bangumiId}` - ); - return data; - }, - - /** - * 重置所有 bangumi 数据 - */ - async resetAll() { - const {data} = await axios.get('api/v1/bangumi/reset/all'); - return data; - }, - - /** - * 刷新所有没有海报的 bangumi 海报 - */ - async refreshPoster() { - const {data} = await axios.get('api/v1/bangumi/refresh/poster/all'); - return data; + if (typeof bangumiId === 'number') { + url = `${url}/${bangumiId}`; + } else { + url = `${url}/many`; + ids = bangumiId; } + + const { data } = await axios.delete(url, { + data: ids, + params: { + file, + }, + }); + return data; + }, + + /** + * 删除指定 bangumiId 的规则。如果 file 为 true,则同时删除关联文件。 + * @param bangumiId - 需要删除规则的 bangumi 的 id。 + * @param file - 是否同时删除关联文件。 + * @returns axios 请求返回的数据 + */ + async disableRule(bangumiId: number | number[], file: boolean) { + let url = 'api/v1/bangumi/disable'; + let ids: undefined | number[]; + + if (typeof bangumiId === 'number') { + url = `${url}/${bangumiId}`; + } else { + url = `${url}/many`; + ids = bangumiId; + } + + const { data } = await axios.delete(url, { + data: ids, + params: { + file, + }, + }); + return data; + }, + + /** + * 启用指定 bangumiId 的规则 + * @param bangumiId - 需要启用的 bangumi 的 id + */ + async enableRule(bangumiId: number) { + const { data } = await axios.get( + `api/v1/bangumi/enable/${bangumiId}` + ); + return data; + }, + + /** + * 重置所有 bangumi 数据 + */ + async resetAll() { + const { data } = await axios.get('api/v1/bangumi/reset/all'); + return data; + }, + + /** + * 刷新所有没有海报的 bangumi 海报 + */ + async refreshPoster() { + const { data } = await axios.get( + 'api/v1/bangumi/refresh/poster/all' + ); + return data; + }, }; diff --git a/webui/src/api/check.ts b/webui/src/api/check.ts index a59a3a73..e05cebeb 100644 --- a/webui/src/api/check.ts +++ b/webui/src/api/check.ts @@ -6,5 +6,4 @@ export const apiCheck = { const { data } = await axios.get('api/v1/check/downloader'); return data; }, - -} \ No newline at end of file +}; diff --git a/webui/src/api/download.ts b/webui/src/api/download.ts index 29594559..909ed0d2 100644 --- a/webui/src/api/download.ts +++ b/webui/src/api/download.ts @@ -1,6 +1,6 @@ import type { BangumiAPI, BangumiRule } from '#/bangumi'; import type { RSS } from '#/rss'; -import type { ApiError, ApiSuccess } from '#/api'; +import type { ApiSuccess } from '#/api'; export const apiDownload = { /** @@ -10,14 +10,14 @@ export const apiDownload = { async analysis(rss_item: RSS) { const { data } = await axios.post( 'api/v1/rss/analysis', - rss_item + rss_item ); const result: BangumiRule = { - ...data, - filter: data.filter.split(','), - rss_link: data.rss_link.split(','), - } + ...data, + filter: data.filter.split(','), + rss_link: data.rss_link.split(','), + }; return result; }, @@ -30,7 +30,7 @@ export const apiDownload = { ...bangumiData, filter: bangumiData.filter.join(','), rss_link: bangumiData.rss_link.join(','), - } + }; const { data } = await axios.post( 'api/v1/rss/collect', postData @@ -44,10 +44,10 @@ export const apiDownload = { */ async subscribe(bangumiData: BangumiRule) { const postData: BangumiAPI = { - ...bangumiData, - filter: bangumiData.filter.join(','), - rss_link: bangumiData.rss_link.join(','), - } + ...bangumiData, + filter: bangumiData.filter.join(','), + rss_link: bangumiData.rss_link.join(','), + }; const { data } = await axios.post( 'api/v1/rss/subscribe', postData diff --git a/webui/src/api/log.ts b/webui/src/api/log.ts index b7492153..bf9baf5b 100644 --- a/webui/src/api/log.ts +++ b/webui/src/api/log.ts @@ -1,4 +1,4 @@ -import type { ApiSuccess } from "#/api"; +import type { ApiSuccess } from '#/api'; export const apiLog = { async getLog() { diff --git a/webui/src/api/program.ts b/webui/src/api/program.ts index d8ce5f0b..eea8e1bb 100644 --- a/webui/src/api/program.ts +++ b/webui/src/api/program.ts @@ -1,5 +1,4 @@ -import type { ApiSuccess } from "#/api"; - +import type { ApiSuccess } from '#/api'; export const apiProgram = { /** diff --git a/webui/src/api/rss.ts b/webui/src/api/rss.ts index c92b0889..9cd5d92b 100644 --- a/webui/src/api/rss.ts +++ b/webui/src/api/rss.ts @@ -14,32 +14,48 @@ export const apiRSS = { }, async delete(rss_id: number) { - const { data } = await axios.delete(`api/v1/rss/delete/${rss_id}`); + const { data } = await axios.delete( + `api/v1/rss/delete/${rss_id}` + ); return data!; }, async deleteMany(rss_list: number[]) { - const { data } = await axios.post(`api/v1/rss/delete/many`, rss_list); + const { data } = await axios.post( + `api/v1/rss/delete/many`, + rss_list + ); return data!; }, async disable(rss_id: number) { - const { data } = await axios.patch(`api/v1/rss/disable/${rss_id}`); + const { data } = await axios.patch( + `api/v1/rss/disable/${rss_id}` + ); return data!; }, async disableMany(rss_list: number[]) { - const { data } = await axios.post(`api/v1/rss/disable/many`, rss_list); + const { data } = await axios.post( + `api/v1/rss/disable/many`, + rss_list + ); return data!; }, async update(rss_id: number, rss: RSS) { - const { data } = await axios.patch(`api/v1/rss/update/${rss_id}`, rss); + const { data } = await axios.patch( + `api/v1/rss/update/${rss_id}`, + rss + ); return data!; }, async enableMany(rss_list: number[]) { - const { data } = await axios.post(`api/v1/rss/enable/many`, rss_list); + const { data } = await axios.post( + `api/v1/rss/enable/many`, + rss_list + ); return data!; }, @@ -49,7 +65,9 @@ export const apiRSS = { }, async refresh(rss_id: number) { - const { data } = await axios.get(`api/v1/rss/refresh/${rss_id}`); + const { data } = await axios.get( + `api/v1/rss/refresh/${rss_id}` + ); return data!; }, diff --git a/webui/src/api/search.ts b/webui/src/api/search.ts index 61f26591..0be88f79 100644 --- a/webui/src/api/search.ts +++ b/webui/src/api/search.ts @@ -1,37 +1,47 @@ -import { - Observable, -} from 'rxjs'; +import { Observable } from 'rxjs'; -import type { BangumiRule, BangumiAPI } from '#/bangumi'; +import type { BangumiAPI, BangumiRule } from '#/bangumi'; export const apiSearch = { /** * 番剧搜索接口是 Server Send 流式数据,每条是一个 Bangumi JSON 字符串, * 使用接口方式是监听连接消息后,转为 Observable 配合外层调用时 switchMap 订阅使用 */ - get(keyword: string, site = 'mikan'): Observable { - const bangumiInfo$ = new Observable(observer => { + get(keyword: string, site = 'mikan'): Observable { + const bangumiInfo$ = new Observable((observer) => { const eventSource = new EventSource( - `api/v1/search/bangumi?site=${site}&keywords=${encodeURIComponent(keyword)}`, - { withCredentials: true }, + `api/v1/search/bangumi?site=${site}&keywords=${encodeURIComponent( + keyword + )}`, + { withCredentials: true } ); - eventSource.onmessage = ev => { + eventSource.onmessage = (ev) => { try { const apiData: BangumiAPI = JSON.parse(ev.data); - const data: BangumiRule = { - ...apiData, - filter: apiData.filter.split(','), - rss_link: apiData.rss_link.split(','), - } + const data: BangumiRule = { + ...apiData, + filter: apiData.filter.split(','), + rss_link: apiData.rss_link.split(','), + }; observer.next(data); } catch (error) { - console.error('[/search/bangumi] Parse Error |', { keyword }, 'response:', ev.data) + console.error( + '[/search/bangumi] Parse Error |', + { keyword }, + 'response:', + ev.data + ); } }; - eventSource.onerror = ev => { - console.error('[/search/bangumi] Server Error |', { keyword }, 'error:', ev) + eventSource.onerror = (ev) => { + console.error( + '[/search/bangumi] Server Error |', + { keyword }, + 'error:', + ev + ); // 目前后端搜索完成关闭连接时会触发 error 事件,前端手动调用 close 不再自动重连 eventSource.close(); }; @@ -47,6 +57,5 @@ export const apiSearch = { async getProvider() { const { data } = await axios.get('api/v1/search/provider'); return data; - } + }, }; - diff --git a/webui/src/components/ab-add-rss.vue b/webui/src/components/ab-add-rss.vue index 67925e87..ee3b0d37 100644 --- a/webui/src/components/ab-add-rss.vue +++ b/webui/src/components/ab-add-rss.vue @@ -4,7 +4,7 @@ import type { BangumiRule } from '#/bangumi'; import type { RSS } from '#/rss'; import { rssTemplate } from '#/rss'; import { ruleTemplate } from '#/bangumi'; -import type { ApiError } from "#/api"; +import type { ApiError } from '#/api'; /** v-model show */ const show = defineModel('show', { default: false }); @@ -13,7 +13,7 @@ const message = useMessage(); const { getAll } = useBangumiStore(); const rss = ref(rssTemplate); -const rule = defineModel('rule', { default: ruleTemplate }) +const rule = defineModel('rule', { default: ruleTemplate }); const parserType = ['mikan', 'tmdb', 'parser']; const window = reactive({ @@ -147,12 +147,9 @@ async function subscribe() { >
- {{ $t('topbar.add.button') }} + {{ + $t('topbar.add.button') + }}
diff --git a/webui/src/components/ab-bangumi-card.vue b/webui/src/components/ab-bangumi-card.vue index fd5a0344..ec73e6d9 100644 --- a/webui/src/components/ab-bangumi-card.vue +++ b/webui/src/components/ab-bangumi-card.vue @@ -1,15 +1,15 @@ - - \ No newline at end of file + diff --git a/webui/src/components/ab-status-bar.vue b/webui/src/components/ab-status-bar.vue index d0caa4e7..e0932388 100644 --- a/webui/src/components/ab-status-bar.vue +++ b/webui/src/components/ab-status-bar.vue @@ -1,20 +1,20 @@ diff --git a/webui/src/components/basic/ab-checkbox.vue b/webui/src/components/basic/ab-checkbox.vue index e787cef4..5733c87f 100644 --- a/webui/src/components/basic/ab-checkbox.vue +++ b/webui/src/components/basic/ab-checkbox.vue @@ -1,16 +1,16 @@