This commit is contained in:
2025-09-24 20:35:15 +08:00
parent 39679f7330
commit 8a458ff0a4
12033 changed files with 1537546 additions and 13292 deletions

View File

@@ -8,56 +8,84 @@ function buildUrl(path) {
return path;
return common_config.API_BASE_URL + (path.startsWith("/") ? path : "/" + path);
}
function parseJwtClaims(token) {
try {
const parts = String(token || "").split(".");
if (parts.length < 2)
return {};
const payload = JSON.parse(decodeURIComponent(escape(atob(parts[1].replace(/-/g, "+").replace(/_/g, "/")))));
return payload || {};
} catch (_) {
return {};
}
}
function buildAuthHeaders(base = {}) {
const headers = { ...base };
try {
const token = typeof common_vendor.index !== "undefined" ? common_vendor.index.getStorageSync("TOKEN") || "" : "";
if (token) {
headers["Authorization"] = `Bearer ${token}`;
const claims = parseJwtClaims(token);
if (claims && claims.shopId)
headers["X-Shop-Id"] = claims.shopId;
if (claims && claims.userId)
headers["X-User-Id"] = claims.userId;
}
} catch (_) {
}
return headers;
}
function requestWithFallback(options, candidates, idx, resolve, reject) {
const base = candidates[idx] || common_config.API_BASE_URL;
const url = options.url.replace(/^https?:\/\/[^/]+/, base);
common_vendor.index.request({ ...options, url, success: (res) => {
let url = options.url;
if (!/^https?:\/\//.test(url)) {
url = base + (url.startsWith("/") ? "" : "/") + url;
} else {
url = options.url.replace(/^https?:\/\/[^/]+/, base);
}
common_vendor.index.request({ ...options, url, dataType: "json", success: (res) => {
const { statusCode, data } = res;
if (statusCode >= 200 && statusCode < 300)
return resolve(data);
const msg = data && (data.message || data.error || data.msg) || "HTTP " + statusCode;
common_vendor.index.showToast({ title: msg, icon: "none" });
if (idx + 1 < candidates.length)
if (!options.__noRetry && statusCode >= 500 && idx + 1 < candidates.length) {
return requestWithFallback(options, candidates, idx + 1, resolve, reject);
}
reject(new Error(msg));
}, fail: (err) => {
if (idx + 1 < candidates.length)
if (!options.__noRetry && idx + 1 < candidates.length)
return requestWithFallback(options, candidates, idx + 1, resolve, reject);
reject(err);
} });
}
function get(path, params = {}) {
return new Promise((resolve, reject) => {
const headers = { "X-Shop-Id": common_config.SHOP_ID };
if (common_config.ENABLE_DEFAULT_USER && common_config.DEFAULT_USER_ID)
headers["X-User-Id"] = common_config.DEFAULT_USER_ID;
const headers = buildAuthHeaders({});
const options = { url: buildUrl(path), method: "GET", data: params, header: headers };
requestWithFallback(options, common_config.API_BASE_URL_CANDIDATES, 0, resolve, reject);
});
}
function post(path, body = {}) {
return new Promise((resolve, reject) => {
const headers = { "Content-Type": "application/json", "X-Shop-Id": common_config.SHOP_ID };
if (common_config.ENABLE_DEFAULT_USER && common_config.DEFAULT_USER_ID)
headers["X-User-Id"] = common_config.DEFAULT_USER_ID;
const headers = buildAuthHeaders({ "Content-Type": "application/json" });
const options = { url: buildUrl(path), method: "POST", data: body, header: headers };
const p = String(path || "");
if (p.includes("/api/auth/wxmp/login") || p.includes("/api/auth/sms/login") || p.includes("/api/auth/sms/send") || p.includes("/api/auth/password/login") || p.includes("/api/auth/register"))
options.__noRetry = true;
requestWithFallback(options, common_config.API_BASE_URL_CANDIDATES, 0, resolve, reject);
});
}
function put(path, body = {}) {
return new Promise((resolve, reject) => {
const headers = { "Content-Type": "application/json", "X-Shop-Id": common_config.SHOP_ID };
if (common_config.ENABLE_DEFAULT_USER && common_config.DEFAULT_USER_ID)
headers["X-User-Id"] = common_config.DEFAULT_USER_ID;
const headers = buildAuthHeaders({ "Content-Type": "application/json" });
const options = { url: buildUrl(path), method: "PUT", data: body, header: headers };
requestWithFallback(options, common_config.API_BASE_URL_CANDIDATES, 0, resolve, reject);
});
}
function del(path, body = {}) {
return new Promise((resolve, reject) => {
const headers = { "Content-Type": "application/json", "X-Shop-Id": common_config.SHOP_ID };
if (common_config.ENABLE_DEFAULT_USER && common_config.DEFAULT_USER_ID)
headers["X-User-Id"] = common_config.DEFAULT_USER_ID;
const headers = buildAuthHeaders({ "Content-Type": "application/json" });
const options = { url: buildUrl(path), method: "DELETE", data: body, header: headers };
requestWithFallback(options, common_config.API_BASE_URL_CANDIDATES, 0, resolve, reject);
});
@@ -91,9 +119,7 @@ function uploadWithFallback(options, candidates, idx, resolve, reject) {
}
function upload(path, filePath, formData = {}, name = "file") {
return new Promise((resolve, reject) => {
const header = { "X-Shop-Id": common_config.SHOP_ID };
if (common_config.ENABLE_DEFAULT_USER && common_config.DEFAULT_USER_ID)
header["X-User-Id"] = common_config.DEFAULT_USER_ID;
const header = buildAuthHeaders({});
const options = { url: buildUrl(path), filePath, name, formData, header };
uploadWithFallback(options, common_config.API_BASE_URL_CANDIDATES, 0, resolve, reject);
});