From 4d6b25bf2f8ef337bf7bf9b22a31b0bade6abd18 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 24 八月 2026 09:26:12 +0800
Subject: [PATCH] opo维护
---
utils/request.js | 190 ++++++++++++++++++++++++++---------------------
1 files changed, 105 insertions(+), 85 deletions(-)
diff --git a/utils/request.js b/utils/request.js
index 8249b77..5297f3a 100644
--- a/utils/request.js
+++ b/utils/request.js
@@ -1,81 +1,87 @@
+import getConfig from "./config.js";
+const { baseURL } = getConfig();
// @/utils/request.js
+let isRedirectingToLogin = false;
-/**
- * 鏄剧ずToast鎻愮ず锛堝吋瀹箄view-plus锛�
- * @param {string} message 鎻愮ず鍐呭
- */
+// 鍏ㄥ眬 SSO 澶勭悊鏍囪锛堟寕杞藉埌 uni 涓婏紝渚夸簬璺ㄦā鍧楀叡浜級
+uni.__isSSOHandling = false;
+
const showToast = (message) => {
if (uni.$u?.toast) {
uni.$u.toast(message);
} else {
- uni.showToast({
- title: message,
- icon: "none",
- });
+ uni.showToast({ title: message, icon: "none" });
}
};
+console.log(baseURL,'baseURL1');
-// 鍩虹閰嶇疆 - 浠庣幆澧冨彉閲忎腑鑾峰彇baseURL
const config = {
- baseURL: "/api", // 浣跨敤鐜鍙橀噺涓殑閰嶇疆
+ baseURL: baseURL,
timeout: 60000,
header: {
"Content-Type": "application/json",
"X-Business-System": "medical-system",
},
- // 鏂板閰嶇疆椤�
- loginPage: "/pages/login/Login", // 鐧诲綍椤佃矾寰�
- tokenExpiredCode: 401, // 鍚庣杩斿洖鐨凾oken杩囨湡鐘舵�佺爜
- noPermissionCode: 403, // 鏃犳潈闄愮姸鎬佺爜
- // 娣诲姞鐧藉悕鍗曢厤缃紙涓嶉渶瑕佹牎楠宼oken鐨勬帴鍙o級
- whiteList: [
- "/login", // 鐧诲綍鎺ュ彛
- // '/dingtalk/auth/login', // 閽夐拤鎺堟潈鐧诲綍鎺ュ彛
- // '/dingtalk/auth/bind' // 閽夐拤鎺堟潈鐧诲綍缁戝畾鎺ュ彛
- ],
+ loginPage: "/pages/login/Login",
+ tokenExpiredCode: 401,
+ noPermissionCode: 403,
+ whiteList: ["/login", "/getToken", "/GiLink/getCode"],
};
-/**
- * 妫�鏌ヨ姹傛槸鍚﹀湪鐧藉悕鍗曚腑
- * @param {string} url 璇锋眰URL
- */
const isInWhiteList = (url) => {
- // 鎻愬彇鐩稿璺緞锛堢Щ闄aseURL锛夊苟蹇界暐鏌ヨ鍙傛暟
const relativeUrl = url.replace(config.baseURL, "").split("?")[0];
return config.whiteList.some((path) => {
- // 澶勭悊閫氶厤绗︽儏鍐�
- if (path.endsWith("/")) {
- return relativeUrl.startsWith(path);
- }
- // 绮剧‘鍖归厤璺緞
+ if (path.endsWith("/")) return relativeUrl.startsWith(path);
return relativeUrl === path;
});
};
-/**
- * 璺宠浆鍒扮櫥褰曢〉
- */
const navigateToLogin = () => {
- uni.redirectTo({
- url:
- config.loginPage +
- "?redirect=" +
- encodeURIComponent(getCurrentPagePath()),
- });
+ // SSO 澶勭悊涓紝涓嶉噸澶嶈烦杞�
+ if (isRedirectingToLogin || uni.__isSSOHandling) {
+ console.log("姝e湪璺宠浆鐧诲綍椤垫垨SSO澶勭悊涓紝璺宠繃");
+ return;
+ }
+
+ isRedirectingToLogin = true;
+
+ const pages = getCurrentPages();
+ const currentPage = pages[pages.length - 1];
+ const isLoginPage =
+ currentPage &&
+ currentPage.route &&
+ currentPage.route.includes("login/Login");
+
+ if (isLoginPage) {
+ console.log("褰撳墠宸插湪鐧诲綍椤碉紝涓嶈烦杞�");
+ isRedirectingToLogin = false;
+ return;
+ }
+
+ console.log("璺宠浆鍒扮櫥褰曢〉");
+ setTimeout(() => {
+ uni.redirectTo({
+ url:
+ config.loginPage +
+ "?redirect=" +
+ encodeURIComponent(getCurrentPagePath()),
+ success: () => {
+ console.log("璺宠浆鐧诲綍椤垫垚鍔�");
+ isRedirectingToLogin = false;
+ },
+ fail: () => {
+ console.log("璺宠浆鐧诲綍椤靛け璐�");
+ isRedirectingToLogin = false;
+ },
+ });
+ }, 100);
};
-/**
- * 鑾峰彇褰撳墠椤甸潰璺緞锛堢敤浜庣櫥褰曞悗璺冲洖锛�
- */
const getCurrentPagePath = () => {
const pages = getCurrentPages();
return pages[pages.length - 1]?.route || "";
};
-/**
- * 妫�鏌oken鏄惁杩囨湡
- * @param {number} statusCode HTTP鐘舵�佺爜
- */
const checkTokenExpired = (statusCode) => {
if (statusCode === config.tokenExpiredCode) {
showToast("鐧诲綍宸茶繃鏈燂紝璇烽噸鏂扮櫥褰�");
@@ -85,72 +91,95 @@
return false;
};
-/**
- * 璇锋眰鎷︽埅鍣�
- */
const requestInterceptor = (options) => {
const token = uni.getStorageSync("token");
- // 濡傛灉璇锋眰鍦ㄧ櫧鍚嶅崟涓紝鐩存帴鏀捐
if (isInWhiteList(options.url)) {
+ console.log("鐧藉悕鍗曟帴鍙o紝璺宠繃token鏍¢獙:", options.url);
return options;
}
- // 濡傛灉鏈櫥褰曚笖涓嶆槸鐧藉悕鍗曟帴鍙o紝璺宠浆鐧诲綍
- // console.log(token,'token');
-
if (!token) {
+ const pages = getCurrentPages();
+ const currentPage = pages[pages.length - 1];
+ const isLoginPage =
+ currentPage &&
+ currentPage.route &&
+ (currentPage.route.includes("login/Login") ||
+ currentPage.route.includes("login/DingTalkLogin"));
+
+ if (isLoginPage) {
+ console.log("褰撳墠鏄櫥褰曢〉锛屽厑璁告棤token璇锋眰");
+ return options;
+ }
+
+ console.log("鏈櫥褰曚笖涓嶅湪鐧诲綍椤碉紝璺宠浆鍒扮櫥褰曢〉");
navigateToLogin();
throw new Error("鏈櫥褰�");
}
- // 娣诲姞Token鍒癏eader
options.header = {
...options.header,
Authorization: `Bearer ${token}`,
};
-
return options;
};
-/**
- * 鍝嶅簲鎷︽埅鍣�
- */
const responseInterceptor = (response) => {
const { statusCode, data } = response;
-
- // Token杩囨湡澶勭悊
- if (checkTokenExpired(statusCode)) {
- return Promise.reject(data);
- }
-
- // 鏃犳潈闄愬鐞�
+ if (checkTokenExpired(statusCode)) return Promise.reject(data);
if (statusCode === config.noPermissionCode) {
showToast("鏃犳潈闄愯闂�");
return Promise.reject(data);
}
-
- // 鍏朵粬閿欒鐘舵�佺爜
if (statusCode !== 200) {
showToast(`璇锋眰澶辫触: ${statusCode}`);
return Promise.reject(data);
}
-
- // 鎺ュ彛鑷畾涔夐敊璇爜澶勭悊锛堝亣璁綿ata.code涓�0琛ㄧず鎴愬姛锛�
if (data?.code !== 200) {
showToast(data?.msg || "鎿嶄綔澶辫触");
return Promise.reject(data);
}
-
- return data; // 杩斿洖瀹為檯涓氬姟鏁版嵁
+ return data;
};
-/**
- * 鏍稿績璇锋眰鏂规硶
- */
+// 鎸傝捣璇锋眰闃熷垪锛氳璇佹湭瀹屾垚鏃舵殏瀛樿姹傦紝瀹屾垚鍚庢壒閲忛噸璇�
+const pendingQueue = []
+let pendingTimer = null
+
+function flushPending() {
+ clearInterval(pendingTimer)
+ pendingTimer = null
+ const q = pendingQueue.splice(0)
+ q.forEach(({ options, resolve, reject }) => {
+ request(options).then(resolve).catch(reject)
+ })
+}
+
+function pendRequest(options) {
+ return new Promise((resolve, reject) => {
+ pendingQueue.push({ options, resolve, reject })
+ if (!pendingTimer) {
+ const maxWait = 15000
+ const startTime = Date.now()
+ pendingTimer = setInterval(() => {
+ if (!uni.__authPending || Date.now() - startTime > maxWait) {
+ flushPending()
+ }
+ }, 100)
+ }
+ })
+}
+
const request = async (options) => {
try {
- // 鍚堝苟閰嶇疆
+ // 鉁� 璁よ瘉鎸傝捣妫�鏌ュ繀椤诲湪 URL 鎷兼帴涔嬪墠
+ // 淇濆瓨鍘熷 options锛岄噸璇曟椂閬垮厤 baseURL 鍙犲姞
+ const token = uni.getStorageSync("token");
+ if (!token && uni.__authPending && !isInWhiteList(options.url)) {
+ return pendRequest({ ...options }); // 浼犲叆鍘熷 options 鐨勫壇鏈�
+ }
+
options = {
...config,
...options,
@@ -158,16 +187,11 @@
header: { ...config.header, ...options.header },
};
- // 璇锋眰鎷︽埅
options = await requestInterceptor(options);
-
- // 鍙戣捣璇锋眰
return new Promise((resolve, reject) => {
uni.request({
...options,
- success: (res) => {
- resolve(responseInterceptor(res));
- },
+ success: (res) => resolve(responseInterceptor(res)),
fail: (err) => {
showToast("缃戠粶閿欒锛岃閲嶈瘯");
reject(err);
@@ -179,7 +203,6 @@
}
};
-// 蹇嵎鏂规硶灏佽
const http = {
get(url, data = {}, options = {}) {
return request({ url, data, method: "GET", ...options });
@@ -193,7 +216,6 @@
delete(url, data = {}, options = {}) {
return request({ url, data, method: "DELETE", ...options });
},
- // 鏂板锛氫笂浼犳枃浠舵柟娉�
upload(url, filePath, name = "file", formData = {}) {
return request({
url,
@@ -206,7 +228,5 @@
},
};
-// 鎸傝浇鍒板叏灞�
uni.$uapi = http;
-
export default http;
--
Gitblit v1.9.3