From c5feb505850f8cc45cdeb307ce7758e469154a96 Mon Sep 17 00:00:00 2001 From: CzBiX Date: Fri, 2 Oct 2020 18:10:25 +0800 Subject: [PATCH] Add remote QB support --- README.md | 5 ++- screenshot/CORS-settings.png | Bin 0 -> 22051 bytes src/Api.ts | 28 ++++++++++++--- src/App.vue | 26 ++++++++++---- src/components/LoginForm.vue | 61 ++++++++++++++++++++------------- src/locale/en.ts | 1 + src/locale/index.ts | 2 +- src/store/config.ts | 17 +++++++-- src/store/index.ts | 4 +++ src/store/types.ts | 1 + tests/unit/store/index.spec.ts | 1 + 11 files changed, 106 insertions(+), 40 deletions(-) create mode 100644 screenshot/CORS-settings.png diff --git a/README.md b/README.md index 9252875..6bb389c 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,8 @@ Languages: English, 中文 [TODO](https://github.com/CzBiX/qb-web/projects/2) -## Download - -[Releases](https://github.com/CzBiX/qb-web/releases/latest) +## How to use +see: [Wiki](https://github.com/CzBiX/qb-web/wiki/How-to-use) ## Install diff --git a/screenshot/CORS-settings.png b/screenshot/CORS-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..70218de07e5615ff539719ddc949998d1bed0616 GIT binary patch literal 22051 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 literal 0 HcmV?d00001 diff --git a/src/Api.ts b/src/Api.ts index 8aa8103..7fb68ce 100644 --- a/src/Api.ts +++ b/src/Api.ts @@ -2,18 +2,36 @@ import Axios, { AxiosInstance, AxiosResponse } from 'axios'; import { RssNode, RssRule, SearchPlugin, ApiCategory, SearchTaskResponse } from '@/types'; -class Api { +const apiEndpoint = 'api/v2'; +class Api { private axios: AxiosInstance; constructor() { this.axios = Axios.create({ - baseURL: 'api/v2', + baseURL: apiEndpoint, + withCredentials: true, }); this.axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; } + private normalizeBaseUrl(baseUrl?: string) { + if (!baseUrl) { + return apiEndpoint; + } + + if (!baseUrl.endsWith('/')) { + baseUrl += '/'; + } + + return baseUrl + apiEndpoint; + } + + public changeBaseUrl(baseUrl: string) { + this.axios.defaults.baseURL = this.normalizeBaseUrl(baseUrl); + } + public getAppVersion() { return this.axios.get('/app/version'); } @@ -22,12 +40,13 @@ class Api { return this.axios.get('/app/webapiVersion'); } - public login(params: any) { + public login(params: any, baseUrl?: string) { const data = new URLSearchParams(params); return this.axios.post('/auth/login', data, { validateStatus(status) { return status === 200 || status === 403; }, + baseURL: this.normalizeBaseUrl(baseUrl), }).then(Api.handleResponse); } @@ -330,4 +349,5 @@ class Api { } } -export default new Api(); +const api = new Api(); +export default api; diff --git a/src/App.vue b/src/App.vue index 09a664e..bafa6ea 100644 --- a/src/App.vue +++ b/src/App.vue @@ -75,6 +75,8 @@ import api from './Api'; import Component from 'vue-class-component'; import { Watch } from 'vue-property-decorator'; import { MainData } from './types'; +import { Config } from './store/config'; +import Api from './Api'; let appWrapEl: HTMLElement; @@ -98,6 +100,7 @@ let appWrapEl: HTMLElement; 'mainData', 'rid', 'preferences', + 'needAuth', ]), ...mapGetters(['config']), }, @@ -106,11 +109,11 @@ let appWrapEl: HTMLElement; 'updateMainData', 'updatePreferences', 'setPasteUrl', + 'updateNeedAuth', ]), } }) export default class App extends Vue { - needAuth = false drawer = true drawerOptions = { showLogs: false, @@ -122,11 +125,13 @@ export default class App extends Vue { mainData!: MainData rid!: number preferences!: any - config!: any + config!: Config + needAuth!: boolean updateMainData!: (_: any) => void updatePreferences!: (_: any) => void setPasteUrl!: (_: any) => void + updateNeedAuth!: (_: boolean) => void get phoneLayout() { return this.$vuetify.breakpoint.xsOnly; @@ -159,13 +164,22 @@ export default class App extends Vue { } async getInitData() { + const href = location.href; + if (!this.config.baseUrl) { + if (href.includes("czbix.github.io") || href.includes("localhost")) { + this.updateNeedAuth(true); + return; + } else { + Api.changeBaseUrl(href); + } + } else { + Api.changeBaseUrl(this.config.baseUrl); + } + try { await this.getMainData(); } catch (e) { - if (e.response.status === 403) { - this.needAuth = true; - } - + this.updateNeedAuth(true); return; } diff --git a/src/components/LoginForm.vue b/src/components/LoginForm.vue index e5e7aac..3a1315d 100644 --- a/src/components/LoginForm.vue +++ b/src/components/LoginForm.vue @@ -21,11 +21,17 @@ @keyup.enter.capture="submit" v-bind="{ [`grid-list-${$vuetify.breakpoint.name}`]: true }" > + @@ -36,7 +42,6 @@ @click:append="showPassword = !showPassword" :label="$t('password')" :type="showPassword ? 'text' : 'password'" - :rules="[v => !!v || $t('msg.item_is_required', { item: $t('password') })]" required /> @@ -63,56 +68,64 @@ diff --git a/src/locale/en.ts b/src/locale/en.ts index 984f97c..dfaff16 100644 --- a/src/locale/en.ts +++ b/src/locale/en.ts @@ -99,6 +99,7 @@ export default { reannounced: 'Reannounced', rechecking: 'Rechecking…', dht_nodes: '%{smart_count} node |||| %{smart_count} nodes', + base_url: 'Base URL', }, msg: { diff --git a/src/locale/index.ts b/src/locale/index.ts index 9b85e81..70453a8 100644 --- a/src/locale/index.ts +++ b/src/locale/index.ts @@ -30,7 +30,7 @@ function matchLocale() { export const defaultLocale = matchLocale() function updateLocale() { - let locale: LocaleKey | undefined = loadConfig()['locale']; + let locale = loadConfig()['locale'] as LocaleKey; if (!locale) { locale = defaultLocale; diff --git a/src/store/config.ts b/src/store/config.ts index 9ef6e9c..d4be7b7 100644 --- a/src/store/config.ts +++ b/src/store/config.ts @@ -5,7 +5,22 @@ import { ConfigState, ConfigPayload } from './types'; const configKey = 'qb-config'; +export interface Config { + baseUrl: string | null; + updateInterval: number; + pageOptions: any; + filter: { + state: string | null; + category: string | null; + site: string | null; + query: string | null; + }; + locale: string | null; + darkMode: string | null; +} + const defaultConfig = { + baseUrl: null, updateInterval: 2000, pageOptions: { itemsPerPage: 50, @@ -20,8 +35,6 @@ const defaultConfig = { darkMode: null, }; -export type Config = typeof defaultConfig - function saveConfig(obj: any) { localStorage.setItem(configKey, JSON.stringify(obj)); } diff --git a/src/store/index.ts b/src/store/index.ts index 9e47e5c..b9e4bcc 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -27,6 +27,7 @@ const store = new Vuex.Store({ mainData: undefined, preferences: null, pasteUrl: null, + needAuth: false, }, mutations: { /* eslint-disable no-param-reassign */ @@ -60,6 +61,9 @@ const store = new Vuex.Store({ const { url } = payload; state.pasteUrl = url; }, + updateNeedAuth(state, payload) { + state.needAuth = payload; + }, /* eslint-enable no-param-reassign */ }, getters: { diff --git a/src/store/types.ts b/src/store/types.ts index 262f2db..1f6fbc9 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -6,6 +6,7 @@ export interface RootState { mainData?: MainData; preferences: any; pasteUrl: string | null; + needAuth: boolean; } export interface SearchEnginePage { diff --git a/tests/unit/store/index.spec.ts b/tests/unit/store/index.spec.ts index 71f2241..90bb4d0 100644 --- a/tests/unit/store/index.spec.ts +++ b/tests/unit/store/index.spec.ts @@ -13,6 +13,7 @@ const emtpyState: RootState = { mainData: undefined, preferences: null, pasteUrl: null, + needAuth: false, }; const mockState = mock(emtpyState);