From d5846fc94573f1c2156230d9cdf2da45e4e12c46 Mon Sep 17 00:00:00 2001 From: gerson <1405270578@qq.com> Date: 星期日, 09 二月 2025 16:43:09 +0800 Subject: [PATCH] 主题对接 --- src/utils/request.ts | 126 +++++++++++++++++++++++++++++++++-------- 1 files changed, 100 insertions(+), 26 deletions(-) diff --git a/src/utils/request.ts b/src/utils/request.ts index d0c51f8..6c8eace 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -1,41 +1,61 @@ -import type { AxiosInstance, AxiosRequestConfig } from 'axios'; +import type { AxiosInstance, AxiosRequestConfig, CreateAxiosDefaults } from 'axios'; import axios from 'axios'; import { ElMessage } from 'element-plus'; +import { NO_AUTH_API_LIST } from '../api/ai/chat'; +import { LOGIN_URL, TEL_LOGIN_URL } from '../api/ai/user'; +import { Logger } from '../model/logger/Logger'; import emitter from './mitt'; -import { debounce } from './util'; +import { debounce, decodeFormData } from './util'; import { AUTH_URL, MAIN_URL, SECONDARY_URL } from '/@/constants'; import { Local, LoginInfo, Session } from '/@/utils/storage'; +import { isSharePage } from '../stores/chatRoom'; // import JSONbig from 'json-bigint'; //#region ====================== 鍚庣 res.err_code ====================== export const enum ErrorCode { /** @description 鏉冮檺楠岃瘉澶辫触 */ + Message = 'MESSAGE', + /** @description 鍐呴儴閿欒 */ + Exception = 'EXCEPTION', + /** @description 鏃犳潈浣跨敤 */ Auth = 'AUTH', } //#endregion -const handleNoAuth = debounce(() => { +const emitNoAuth = () => { emitter.emit('logout'); emitter.emit('openLoginDlg'); +}; + +export const handleNormalAuth = () => { + const accessSession = Local.get(accessSessionKey); + if (!accessSession) { + emitter.emit('logout'); + emitter.emit('openLoginDlg'); + } + return !!accessSession; +}; +export const SESSION_KEY = 'hswatersession'; +export const handleNoAuth = debounce(() => { + emitNoAuth(); }); -const loginUrl = '/login'; const initRequestInterceptor = (request: AxiosInstance) => { // 娣诲姞璇锋眰鎷︽埅鍣� request.interceptors.request.use( (config) => { // 鑾峰彇鏈湴鐨� token const accessSession = Local.get(accessSessionKey); - if (accessSession) { // 灏� token 娣诲姞鍒拌姹傛姤鏂囧ご涓� - config.headers['hswatersession'] = accessSession; - } else { - if (config.url !== loginUrl) { + config.headers[SESSION_KEY] = accessSession; + } + if (!NO_AUTH_API_LIST.includes(config.url) && !isSharePage.value) { + if (!accessSession && config.url !== LOGIN_URL && config.url !== TEL_LOGIN_URL) { handleNoAuth(config.url); - throw '鏉冮檺楠岃瘉澶辫触'; } } + return config; }, (error) => { @@ -69,22 +89,25 @@ if (!serveData.json_ok) { switch (serveData?.err_code) { case ErrorCode.Auth: - if (res.config.url !== loginUrl) { + if (res.config.url !== LOGIN_URL && res.config.url !== TEL_LOGIN_URL && !isSharePage.value) { handleNoAuth(); throw '鏉冮檺楠岃瘉澶辫触'; } + break; + case ErrorCode.Exception: + const param = res.config.data ? `\n 璇锋眰鍙傛暟锛�${JSON.stringify(decodeFormData(res.config.data))}\n` : ''; + ElMessage.error('鍐呴儴閿欒锛�'); + Logger.error(`${res.config.url} 鍝嶅簲澶辫触${param}`, serveData?.json_msg && new Error(serveData?.json_msg)); + return res.data; } - const msg = serveData.json_msg ?? ''; - - const error = serveData?.err_code ? `${msg ? `銆�${serveData.err_code}銆慲 : serveData.err_code}` : ''; - const tip = error + msg || '璇锋眰澶辫触'; - ElMessage.error(tip); - const url = res.request.responseURL; - throw new Error(url + '\n' + tip); } return res.data; }, (error) => { + if (typeof error === 'string') { + // ElMessage.error(error); + return Promise.reject(error); + } // 澶勭悊鍝嶅簲閿欒 if (error.response) { if (error.response.status === 401) { @@ -106,18 +129,68 @@ ); }; // 閰嶇疆鏂板缓涓�涓� axios 瀹炰緥 -const createAxiosInstance = () => { +const createAxiosInstance = (option: Partial<CreateAxiosDefaults<any>> = {}) => { return axios.create({ baseURL: MAIN_URL, - timeout: 50000, - headers: { 'Content-Type': 'application/json;charset=utf-8 ' }, + timeout: 1200000, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + ...option, }); }; -const service = createAxiosInstance(); +const service = createAxiosInstance(); export const mainRequest = service; +//#region ====================== 娴佸搷搴旀暟鎹� ====================== +const streamInstance = createAxiosInstance({ + adapter: 'fetch', + responseType: 'stream', +}); +const decoder = new TextDecoder(); +const readStream = async (stream: ReadableStream, cb: (value) => void): Promise<any> => { + const reader = stream.getReader(); + let lastValue = ''; + const p = new Promise(async (resolve, reject) => { + let fullValue = ''; + while (1) { + const { done, value } = await reader.read(); + if (done) { + break; + } + // const txt = decoder.decode(Uint8Array.from([...lastValue, ...value])); + const txt = decoder.decode(value); + const txtArr = txt.split('\n'); + txtArr[0] = lastValue + txtArr[0]; + txtArr.forEach((value, index, array) => { + // 涓�鑸笉浼氬嚭鐜拌繛缁崲琛岋紝鍙彲鑳芥渶鍚庝竴涓槸鎹㈣ + if (index === array.length - 1) { + lastValue = value; + } else { + const decodeValue = decodeURIComponent(value); + fullValue += decodeValue; + cb(decodeValue); + } + }); + } + resolve(fullValue); + }); + return p; +}; + +export const streamReq = async (config: AxiosRequestConfig<any>, callback: (value) => void) => { + const response = await streamInstance(config); + const stream = response as unknown as ReadableStream; + return readStream(stream, (value) => { + const jsonValue = JSON.parse(value); + callback(jsonValue); + }); +}; +//#endregion + initRequestInterceptor(service); +initRequestInterceptor(streamInstance); export function secondaryRequest(config: AxiosRequestConfig<any>) { return service({ @@ -139,7 +212,7 @@ * @description 鍩熷悕鍓嶇紑 * 闃叉绫讳技浜� http://sqi.beng35.com/airp 鍜� http://sqi.beng35.com/test 鍏敤鍚屼竴涓� token 鎴� userInfo */ -export const getDomainPrefix = (win: Window) => { +export const getDomainPrefix = (win: Window = window) => { const subDomainName = win.location.pathname .split('/') .filter((item) => !!item) @@ -148,15 +221,17 @@ return domainPrefix; }; +export const domainPrefix = getDomainPrefix(window); + // token 閿畾涔� export const sessionName = 'access-session'; export const userName = 'userName'; export const getSessionKey = (win: Window) => { - return getDomainPrefix(win) + sessionName; + return sessionName; }; export const getUserNameKey = (win: Window) => { - return getDomainPrefix(win) + userName; + return userName; }; export const accessSessionKey = getSessionKey(window); @@ -165,8 +240,7 @@ export const refreshAccessTokenKey = `x-${accessSessionKey}`; // userInfo閿畾涔� -export const userInfoKey = getDomainPrefix(window) + 'userInfo'; - +export const userInfoKey ='userInfo'; // 鑾峰彇 token export const getSession = () => { return Local.get(accessSessionKey); -- Gitblit v1.9.3