This commit is contained in:
owenchen committed 2026-10-14 18:50:17 +08:00
1 parent 3194f98ac0
commit e740ec77ec
24 files changed
+1561 -65

No files matched your search

+34 -10
View File
@@ -73,6 +73,21 @@ function getToken(): string {
return getJwtInfo()?.AccessToken ?? "";
}
/**
* 归一化后的 Authorization 头值:ASP.NET Core JWT 认证要求 "Bearer " 前缀,
* 存量令牌可能带也可能不带前缀,统一在这里补齐——
* 主拦截器与 uploadFile/downloadFile/上传队列等旁路通道共用这一个口径,
* 否则旁路裸发 token 会被后端 401(上传失败实测根因)。
* @returns 无令牌时返回空串(调用方据此不挂 Authorization 头)
*/
export function bearerAuth(): string {
const token = getToken();
if (!token) {
return "";
}
return token.startsWith("Bearer ") ? token : `Bearer ${token}`;
}
/**
* 认证失败统一收尾:必要时清登录态并跳登录页;
* 已经在登录页就不再跳,避免死循环
@@ -224,6 +239,18 @@ function detectBusinessException(data: any): string {
return "";
}
/**
* 静默提取业务异常消息(不弹提示):供批量传输通道使用——
* 上传队列的失败要落在任务行上逐条展示,不能每条弹一个模态。
* @returns 命中返回异常消息,未命中返回空串
*/
export function extractBusinessError(data: any): string {
if (!data || typeof data !== "object" || !data.SourceCode) {
return "";
}
return extractErrorMessage(data) || "业务处理失败";
}
// ==================== 全局配置(httpPlugin 注册用) ====================
const httpRequestConfig: RequestConfig = {
@@ -252,12 +279,9 @@ const httpInterceptor: RequestInterceptor = {
config.method = String(
config.method || "GET",
).toUpperCase() as RequestOptions["method"];
const token = getToken();
if (token) {
// ASP.NET Core JWT Bearer 认证要求 Authorization 带 "Bearer " 前缀(旧系统同)
config.header.Authorization = token.startsWith("Bearer ")
? token
: `Bearer ${token}`;
const auth = bearerAuth();
if (auth) {
config.header.Authorization = auth;
}
config.header.locale = backendLocale();
return config;
@@ -360,7 +384,7 @@ export interface UploadOptions {
export function uploadFile(options: UploadOptions): Promise<any> {
const { url, filePath, name = "file", formData, header = {} } = options;
const fullUrl = url.indexOf("http") === 0 ? url : baseUrl + url;
const token = getToken();
const auth = bearerAuth();
return new Promise((resolve, reject) => {
uni.uploadFile({
@@ -369,7 +393,7 @@ export function uploadFile(options: UploadOptions): Promise<any> {
name,
formData,
timeout,
header: token ? { Authorization: token, ...header } : header,
header: auth ? { Authorization: auth, ...header } : header,
success: (res) => {
if (res.statusCode < 200 || res.statusCode >= 300) {
const message = `上传失败[${res.statusCode}]`;
@@ -448,7 +472,7 @@ function timestamp(): string {
export async function downloadFile(options: DownloadOptions): Promise<void> {
const { url, method = "POST", data, filename, extension = "xlsx" } = options;
const fullUrl = url.indexOf("http") === 0 ? url : baseUrl + url;
const token = getToken();
const auth = bearerAuth();
const res = await new Promise<UniApp.RequestSuccessCallbackResult>(
(resolve, reject) => {
@@ -458,7 +482,7 @@ export async function downloadFile(options: DownloadOptions): Promise<void> {
data,
timeout,
responseType: "arraybuffer",
header: token ? { Authorization: token } : {},
header: auth ? { Authorization: auth } : {},
success: resolve,
fail: err => reject(new Error(err.errMsg || "下载失败")),
});