You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
3.0 KiB

2 months ago
import axios from 'axios'
/** 与后台管理分开存储,专用于移动端核销页 */
export const H5_TOKEN_KEY = 'szkp_h5_verify_token'
/** 短入口码URL 参数 v= */
export const VERIFY_PORTAL_CODE_KEY = 'szkp_verify_portal_code'
/** 旧版长 UUIDURL 参数 portal=),仅兼容历史链接 */
export const VERIFY_PORTAL_LEGACY_TOKEN_KEY = 'szkp_verify_portal_legacy_token'
/** admin后台超级管理员核销portal活动专用账号 */
export const VERIFY_AUTH_MODE_KEY = 'szkp_verify_auth_mode'
const baseURL = (import.meta.env.VITE_API_BASE_URL as string | undefined) ?? 'http://127.0.0.1:8000/api'
/** 生产环境后台 SPA 挂在 /admin/,须带 BASE_URL否则会跳到 /h5/ 的 uni-app 与核销页冲突 */
export function verifyLoginAbsoluteUrl(): string {
1 month ago
return buildUnifiedActivityVerifyLoginUrl()
2 months ago
}
1 month ago
/** 活动核销:全平台统一入口链接(不在 URL 上区分活动),活动由 6 位数字口令区分 */
export function buildUnifiedActivityVerifyLoginUrl(): string {
const pathname = window.location.pathname || ''
const subPath = pathname.includes('/m/verify') ? 'm/verify/login' : 'h5/verify/login'
const base = import.meta.env.BASE_URL || '/'
const normalized = base.endsWith('/') ? base : `${base}/`
return `${window.location.origin}${normalized}${subPath}`
}
2 months ago
export function buildVerifyLoginUrlWithPortal(): string {
const code = localStorage.getItem(VERIFY_PORTAL_CODE_KEY)
const legacy = localStorage.getItem(VERIFY_PORTAL_LEGACY_TOKEN_KEY)
const pathname = window.location.pathname || ''
const subPath = pathname.includes('/m/verify') ? 'm/verify/login' : 'h5/verify/login'
const base = import.meta.env.BASE_URL || '/'
const normalized = base.endsWith('/') ? base : `${base}/`
const u = new URL(`${window.location.origin}${normalized}${subPath}`)
if (code) {
u.searchParams.set('v', code)
} else if (legacy) {
u.searchParams.set('portal', legacy)
}
return u.toString()
}
/** 管理端展示的独立核销链接(短码 v= */
export function buildVerifyPortalPublicUrl(portalCode: string): string {
const base = import.meta.env.BASE_URL || '/'
const normalized = base.endsWith('/') ? base : `${base}/`
const u = new URL(`${window.location.origin}${normalized}h5/verify/login`)
u.searchParams.set('v', String(portalCode).toLowerCase().trim())
return u.toString()
}
export const h5Http = axios.create({
baseURL,
timeout: 20000,
})
h5Http.interceptors.request.use((config) => {
const token = localStorage.getItem(H5_TOKEN_KEY)
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
})
h5Http.interceptors.response.use(
(res) => res,
(error) => {
const status = error?.response?.status
if (status === 401 || status === 403) {
localStorage.removeItem(H5_TOKEN_KEY)
const path = window.location.pathname || ''
if (path.includes('/h5/verify') || path.includes('/m/verify')) {
1 month ago
window.location.replace(buildUnifiedActivityVerifyLoginUrl())
2 months ago
}
}
return Promise.reject(error)
},
)