|
@@ -1,18 +1,17 @@
|
|
|
import {
|
|
import {
|
|
|
BASE_API,
|
|
BASE_API,
|
|
|
MODE,
|
|
MODE,
|
|
|
- TIMEOUT,
|
|
|
|
|
- SUCCESS_CODE_LIST,
|
|
|
|
|
NOT_OAUTH_BASIC_TOKEN,
|
|
NOT_OAUTH_BASIC_TOKEN,
|
|
|
OAUTH_BASIC_TOKEN,
|
|
OAUTH_BASIC_TOKEN,
|
|
|
|
|
+ SUCCESS_CODE_LIST,
|
|
|
|
|
+ TIMEOUT,
|
|
|
} from './config'
|
|
} from './config'
|
|
|
-import { useUserStore } from '@/stores/modules/user'
|
|
|
|
|
|
|
+import { getToken } from './tokenProvider'
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* -------------------------------------------------------------------------- */
|
|
|
-/* 类型定义 */
|
|
|
|
|
|
|
+/* 类型 */
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
-/** 后端统一返回结构 */
|
|
|
|
|
export interface ApiResponse<T = any> {
|
|
export interface ApiResponse<T = any> {
|
|
|
code: number
|
|
code: number
|
|
|
msg: string
|
|
msg: string
|
|
@@ -35,38 +34,25 @@ export interface RequestConfig extends BaseOptions {
|
|
|
/* 核心 request */
|
|
/* 核心 request */
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
-/**
|
|
|
|
|
- * 默认请求:永远返回 ApiResponse<T>
|
|
|
|
|
- * - 白名单:不校验 code,但仍返回 ApiResponse<T>
|
|
|
|
|
- * - 非白名单:校验 code,不通过 reject(ApiResponse<T>)
|
|
|
|
|
- */
|
|
|
|
|
export function request<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {
|
|
export function request<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {
|
|
|
- const userStore = useUserStore()
|
|
|
|
|
-
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
uni.request({
|
|
uni.request({
|
|
|
url: resolveUrl(config.url),
|
|
url: resolveUrl(config.url),
|
|
|
- method: config.method || 'GET',
|
|
|
|
|
|
|
+ method: config.method ?? 'GET',
|
|
|
data: config.data,
|
|
data: config.data,
|
|
|
timeout: config.timeout ?? TIMEOUT,
|
|
timeout: config.timeout ?? TIMEOUT,
|
|
|
- header: buildHeaders(config.url, userStore, config.header),
|
|
|
|
|
|
|
+ header: buildHeaders(config.url, config.header),
|
|
|
|
|
|
|
|
success(res) {
|
|
success(res) {
|
|
|
const result = res.data as ApiResponse<T>
|
|
const result = res.data as ApiResponse<T>
|
|
|
|
|
|
|
|
- // 白名单接口:不校验 code,直接放行(仍返回 ApiResponse<T>)
|
|
|
|
|
|
|
+ // 白名单接口:不校验 code
|
|
|
if (isWhiteList(config.url)) {
|
|
if (isWhiteList(config.url)) {
|
|
|
return resolve(result)
|
|
return resolve(result)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 业务失败
|
|
// 业务失败
|
|
|
if (!SUCCESS_CODE_LIST.includes(result.code)) {
|
|
if (!SUCCESS_CODE_LIST.includes(result.code)) {
|
|
|
- if (!config.silent) {
|
|
|
|
|
- uni.showToast({
|
|
|
|
|
- title: result.msg || '业务错误',
|
|
|
|
|
- icon: 'none',
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
return reject(result)
|
|
return reject(result)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -74,10 +60,6 @@ export function request<T = any>(config: RequestConfig): Promise<ApiResponse<T>>
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
fail(err) {
|
|
fail(err) {
|
|
|
- uni.showToast({
|
|
|
|
|
- title: '网络异常',
|
|
|
|
|
- icon: 'none',
|
|
|
|
|
- })
|
|
|
|
|
reject(err)
|
|
reject(err)
|
|
|
},
|
|
},
|
|
|
})
|
|
})
|
|
@@ -85,27 +67,22 @@ export function request<T = any>(config: RequestConfig): Promise<ApiResponse<T>>
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 特殊接口:后端不包 ApiResponse,直接返回 T
|
|
|
|
|
- * - 不做 code 校验
|
|
|
|
|
- * - 适用于少量 legacy 接口
|
|
|
|
|
|
|
+ * 后端不包 ApiResponse 的接口
|
|
|
*/
|
|
*/
|
|
|
export function requestRaw<T = any>(config: RequestConfig): Promise<T> {
|
|
export function requestRaw<T = any>(config: RequestConfig): Promise<T> {
|
|
|
- const userStore = useUserStore()
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
uni.request({
|
|
uni.request({
|
|
|
url: resolveUrl(config.url),
|
|
url: resolveUrl(config.url),
|
|
|
- method: config.method || 'GET',
|
|
|
|
|
|
|
+ method: config.method ?? 'GET',
|
|
|
data: config.data,
|
|
data: config.data,
|
|
|
timeout: config.timeout ?? TIMEOUT,
|
|
timeout: config.timeout ?? TIMEOUT,
|
|
|
- header: buildHeaders(config.url, userStore, config.header),
|
|
|
|
|
|
|
+ header: buildHeaders(config.url, config.header),
|
|
|
|
|
+
|
|
|
success(res) {
|
|
success(res) {
|
|
|
resolve(res.data as T)
|
|
resolve(res.data as T)
|
|
|
},
|
|
},
|
|
|
|
|
+
|
|
|
fail(err) {
|
|
fail(err) {
|
|
|
- uni.showToast({
|
|
|
|
|
- title: '网络异常',
|
|
|
|
|
- icon: 'none',
|
|
|
|
|
- })
|
|
|
|
|
reject(err)
|
|
reject(err)
|
|
|
},
|
|
},
|
|
|
})
|
|
})
|
|
@@ -113,78 +90,43 @@ export function requestRaw<T = any>(config: RequestConfig): Promise<T> {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* -------------------------------------------------------------------------- */
|
|
|
-/* 默认 http(get / post 语法糖) */
|
|
|
|
|
|
|
+/* http 语法糖 */
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
const http = {
|
|
const http = {
|
|
|
- /**
|
|
|
|
|
- * 默认 get:返回 ApiResponse<T>
|
|
|
|
|
- */
|
|
|
|
|
get<T = any>(url: string, params?: any, options?: BaseOptions) {
|
|
get<T = any>(url: string, params?: any, options?: BaseOptions) {
|
|
|
- return request<T>({
|
|
|
|
|
- url,
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- data: params,
|
|
|
|
|
- ...options,
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ return request<T>({ url, method: 'GET', data: params, ...options })
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 默认 post:返回 ApiResponse<T>
|
|
|
|
|
- */
|
|
|
|
|
post<T = any>(url: string, data?: any, options?: BaseOptions) {
|
|
post<T = any>(url: string, data?: any, options?: BaseOptions) {
|
|
|
- return request<T>({
|
|
|
|
|
- url,
|
|
|
|
|
- method: 'POST',
|
|
|
|
|
- data,
|
|
|
|
|
- ...options,
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ return request<T>({ url, method: 'POST', data, ...options })
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 特殊接口 get:返回 T
|
|
|
|
|
- */
|
|
|
|
|
getRaw<T = any>(url: string, params?: any, options?: BaseOptions) {
|
|
getRaw<T = any>(url: string, params?: any, options?: BaseOptions) {
|
|
|
- return requestRaw<T>({
|
|
|
|
|
- url,
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- data: params,
|
|
|
|
|
- ...options,
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ return requestRaw<T>({ url, method: 'GET', data: params, ...options })
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 特殊接口 post:返回 T
|
|
|
|
|
- */
|
|
|
|
|
postRaw<T = any>(url: string, data?: any, options?: BaseOptions) {
|
|
postRaw<T = any>(url: string, data?: any, options?: BaseOptions) {
|
|
|
- return requestRaw<T>({
|
|
|
|
|
- url,
|
|
|
|
|
- method: 'POST',
|
|
|
|
|
- data,
|
|
|
|
|
- ...options,
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ return requestRaw<T>({ url, method: 'POST', data, ...options })
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export default http
|
|
export default http
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* -------------------------------------------------------------------------- */
|
|
|
-/* 工具函数 */
|
|
|
|
|
|
|
+/* 工具函数 */
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
function resolveUrl(url: string) {
|
|
function resolveUrl(url: string) {
|
|
|
- // 小程序环境:必须使用绝对路径
|
|
|
|
|
// #ifdef MP
|
|
// #ifdef MP
|
|
|
return BASE_API + url
|
|
return BASE_API + url
|
|
|
// #endif
|
|
// #endif
|
|
|
|
|
|
|
|
- // H5 环境:开发时允许走代理(相对路径)
|
|
|
|
|
// #ifdef H5
|
|
// #ifdef H5
|
|
|
if (MODE === 'development') return url
|
|
if (MODE === 'development') return url
|
|
|
return BASE_API + url
|
|
return BASE_API + url
|
|
|
// #endif
|
|
// #endif
|
|
|
|
|
|
|
|
- // 其他平台兜底
|
|
|
|
|
return BASE_API + url
|
|
return BASE_API + url
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -192,25 +134,20 @@ function isWhiteList(url: string) {
|
|
|
return ['/auth/oauth/token'].some((item) => url.includes(item))
|
|
return ['/auth/oauth/token'].some((item) => url.includes(item))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-function buildHeaders(
|
|
|
|
|
- url: string,
|
|
|
|
|
- userStore: ReturnType<typeof useUserStore>,
|
|
|
|
|
- extraHeader?: UniApp.RequestOptions['header']
|
|
|
|
|
-) {
|
|
|
|
|
|
|
+function buildHeaders(url: string, extraHeader?: UniApp.RequestOptions['header']) {
|
|
|
const headers: Record<string, any> = {
|
|
const headers: Record<string, any> = {
|
|
|
...(extraHeader || {}),
|
|
...(extraHeader || {}),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const access_token = userStore.access_token
|
|
|
|
|
|
|
+ const accessToken = getToken()
|
|
|
|
|
|
|
|
if (url.includes('auth/mobile/token/sms')) {
|
|
if (url.includes('auth/mobile/token/sms')) {
|
|
|
headers.Authorization = NOT_OAUTH_BASIC_TOKEN
|
|
headers.Authorization = NOT_OAUTH_BASIC_TOKEN
|
|
|
- // headers['TENANT-ID'] = '1'
|
|
|
|
|
} else if (url.includes('auth/oauth/token')) {
|
|
} else if (url.includes('auth/oauth/token')) {
|
|
|
headers.Authorization = OAUTH_BASIC_TOKEN
|
|
headers.Authorization = OAUTH_BASIC_TOKEN
|
|
|
headers['TENANT-ID'] = '1'
|
|
headers['TENANT-ID'] = '1'
|
|
|
- } else if (access_token) {
|
|
|
|
|
- headers.Authorization = `Bearer ${access_token}`
|
|
|
|
|
|
|
+ } else if (accessToken) {
|
|
|
|
|
+ headers.Authorization = `Bearer ${accessToken}`
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return headers
|
|
return headers
|