Merge remote-tracking branch 'origin/huangzhenbao-admin'

This commit is contained in:
not-like-juvenile
2026-03-18 17:14:05 +08:00
676 changed files with 25158 additions and 46646 deletions

View File

@@ -1,4 +1,4 @@
import { AkReqUploadOptions, AkReqOptions, AkReqResponse, AkReqError } from './interface.uts';
import { AkReqUploadOptions, AkReqOptions, AkReqResponse, AkReqError } from './interface.uts';
import { SUPA_URL } from '@/ak/config.uts';
// token 持久化 key
@@ -7,6 +7,29 @@ const REFRESH_TOKEN_KEY = 'akreq_refresh_token';
const EXPIRES_AT_KEY = 'akreq_expires_at';
// 优化:用静态变量缓存 token只有 set/clear 时同步 storage
// Web 端(H5)由于多账号联调需要,开启单 Tab 隔离的储流sessionStorage
function setAuthStore(key : string, value : any) {
// #ifdef H5
sessionStorage.setItem(key, String(value));
return;
// #endif
uni.setStorageSync(key, value);
}
function getAuthStore(key : string) : any | null {
// #ifdef H5
return sessionStorage.getItem(key);
// #endif
return uni.getStorageSync(key);
}
function removeAuthStore(key : string) {
// #ifdef H5
sessionStorage.removeItem(key);
return;
// #endif
uni.removeStorageSync(key);
}
let _accessToken : string | null = null;
let _refreshToken : string | null = null;
let _expiresAt : number | null = null;
@@ -16,25 +39,25 @@ export class AkReq {
_accessToken = token;
_refreshToken = refreshToken;
_expiresAt = expiresAt;
uni.setStorageSync(ACCESS_TOKEN_KEY, token);
uni.setStorageSync(REFRESH_TOKEN_KEY, refreshToken);
uni.setStorageSync(EXPIRES_AT_KEY, expiresAt);
setAuthStore(ACCESS_TOKEN_KEY, token);
setAuthStore(REFRESH_TOKEN_KEY, refreshToken);
setAuthStore(EXPIRES_AT_KEY, expiresAt);
}
static getToken() : string | null {
if (_accessToken != null) return _accessToken;
const t = uni.getStorageSync(ACCESS_TOKEN_KEY) as string | null;
const t = getAuthStore(ACCESS_TOKEN_KEY) as string | null;
_accessToken = t;
return t;
}
static getRefreshToken() : string | null {
if (_refreshToken != null) return _refreshToken;
const t = uni.getStorageSync(REFRESH_TOKEN_KEY) as string | null;
const t = getAuthStore(REFRESH_TOKEN_KEY) as string | null;
_refreshToken = t;
return t;
} static getExpiresAt() : number | null {
const val = _expiresAt;
if (val != null) return val;
const t = uni.getStorageSync(EXPIRES_AT_KEY) as number | null;
const t = getAuthStore(EXPIRES_AT_KEY) as number | null;
_expiresAt = t;
return t;
}
@@ -42,9 +65,9 @@ export class AkReq {
_accessToken = null;
_refreshToken = null;
_expiresAt = null;
uni.removeStorageSync(ACCESS_TOKEN_KEY);
uni.removeStorageSync(REFRESH_TOKEN_KEY);
uni.removeStorageSync(EXPIRES_AT_KEY);
removeAuthStore(ACCESS_TOKEN_KEY);
removeAuthStore(REFRESH_TOKEN_KEY);
removeAuthStore(EXPIRES_AT_KEY);
} // 判断 token 是否即将过期提前5分钟刷新
static isTokenExpiring() : boolean {
const expiresAt = this.getExpiresAt();
@@ -94,10 +117,7 @@ export class AkReq {
if (accessToken !== null && refreshTokenNew !== null && expiresAt !== null) {
this.setToken(accessToken, refreshTokenNew, expiresAt);
return true;
} else {
this.clearToken();
return false;
}
} else { this.clearToken(); uni.$emit('AUTH_SESSION_EXPIRED', { reason: 'refresh_failed' }); return false; }
} catch (e) {
this.clearToken();
return false;
@@ -118,7 +138,8 @@ export class AkReq {
// 统一 header自动带上 Authorization/Content-Type/Accept
let headers = options.headers ?? ({} as UTSJSONObject);
const token = this.getToken();
if (token != null && token != "") {
const existAuth = headers['Authorization'] ?? headers['authorization'];
if ((token != null && token != "") && (existAuth == null)) {
headers = Object.assign({}, headers, { Authorization: `Bearer ${token}` }) as UTSJSONObject;
}
let contentType = options.contentType ?? '';
@@ -246,6 +267,8 @@ export class AkReq {
// 全局处理 401 未授权:在非 refresh 场景下,清理 token。
// 测试模式下不强制跳登录页,避免影响任意跳转调试。
if ((finalRes.status === 401) && (skipRefresh !== true)) {
uni.$emit('AUTH_SESSION_EXPIRED', { reason: '401' });
try {
this.clearToken();
uni.showToast({ title: '未授权或登录已过期,请重新登录', icon: 'none' });