diff --git a/.env.test b/.env.test index 1ab81b8..66bcd42 100644 --- a/.env.test +++ b/.env.test @@ -1,4 +1,5 @@ VITE_USE_MOCK=false +VITE_APP_BASE=/ VITE_PROXY_TARGET= # VITE_API_BASE_URL=http://8.138.234.141/ingress VITE_API_BASE_URL= diff --git a/nginx/default.conf.template b/nginx/default.conf.template index 82d0204..6d026d0 100644 --- a/nginx/default.conf.template +++ b/nginx/default.conf.template @@ -20,6 +20,21 @@ server { try_files $uri =404; } + location ^~ /hotel-staff-h5/assets/ { + rewrite ^/hotel-staff-h5/(.*)$ /$1 break; + expires 30d; + add_header Cache-Control "public, immutable"; + try_files $uri =404; + } + + location = /hotel-staff-h5 { + return 301 /hotel-staff-h5/; + } + + location ^~ /hotel-staff-h5/ { + try_files $uri $uri/ /index.html; + } + location /auth/ { proxy_pass ${BACKEND_GATEWAY}/auth/; proxy_http_version 1.1; diff --git a/src/api/request.ts b/src/api/request.ts index aee8942..f74d6c4 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -8,6 +8,11 @@ const http = axios.create({ timeout: 15000 }) +export type RequestError = Error & { + cause?: unknown + toastShown?: boolean +} + let isRedirectingToLogin = false const authExpiredTexts = ['请求令牌已过期', '令牌已过期', 'token已过期', 'Token已过期', 'invalid_token'] @@ -20,6 +25,13 @@ const getHeader = (headers: unknown, key: string) => { const hasBearerAuthorization = (headers: unknown) => getHeader(headers, 'Authorization').startsWith('Bearer ') +const createRequestError = (message: string, cause?: unknown, toastShown = false) => { + const requestError = new Error(message) as RequestError + requestError.cause = cause + requestError.toastShown = toastShown + return requestError +} + const isAuthExpired = (status?: number, code?: unknown, message = '', hasBearerToken = false) => { const normalizedCode = String(code || '') return ( @@ -32,7 +44,7 @@ const redirectToLogin = (message: string) => { clearAuthStorage() window.dispatchEvent(new Event(AUTH_EXPIRED_EVENT)) - if (isRedirectingToLogin || window.location.pathname.endsWith('/login')) return + if (isRedirectingToLogin || window.location.pathname.endsWith('/login')) return false isRedirectingToLogin = true showToast(message || '登录已失效,请重新登录') @@ -46,6 +58,7 @@ const redirectToLogin = (message: string) => { } }) }) + return true } http.interceptors.request.use((config) => { @@ -65,9 +78,10 @@ http.interceptors.response.use( } const message = payload.msg || payload.message || '请求失败' if (isAuthExpired(response.status, payload.code, message, hasBearerAuthorization(response.config.headers))) { - redirectToLogin(message) + const toastShown = redirectToLogin(message) + return Promise.reject(createRequestError(message, undefined, toastShown)) } - return Promise.reject(new Error(message)) + return Promise.reject(createRequestError(message)) } return payload }, @@ -81,11 +95,11 @@ http.interceptors.response.use( hasBearerAuthorization(error.config?.headers) ) ) { - redirectToLogin(message) - return Promise.reject(error) + const toastShown = redirectToLogin(message) + return Promise.reject(createRequestError(message, error, toastShown)) } showToast(message) - return Promise.reject(error) + return Promise.reject(createRequestError(message, error, true)) } ) diff --git a/src/views/events/EventListView.vue b/src/views/events/EventListView.vue index 1f2a311..4ca1d36 100644 --- a/src/views/events/EventListView.vue +++ b/src/views/events/EventListView.vue @@ -53,6 +53,7 @@ onMounted(() => loadEvents(true))
事件管理
查看门店通知、弹窗提醒和正在生效的运营事件。