所有页面未登录时, 被跳转到登录页面。
This commit is contained in:
179
common/request.js
Normal file
179
common/request.js
Normal file
@@ -0,0 +1,179 @@
|
||||
/**
|
||||
* 统一的 HTTP 请求封装
|
||||
* 自动添加 tenantId、token 等公共参数
|
||||
*/
|
||||
|
||||
import { getApiUrl } from './config.js'
|
||||
|
||||
/**
|
||||
* 获取 tenantId(从本地存储)
|
||||
*/
|
||||
function getTenantId() {
|
||||
try {
|
||||
return uni.getStorageSync('backend-tenant-id') || ''
|
||||
} catch (e) {
|
||||
console.error('获取 tenantId 失败:', e)
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 token(从本地存储)
|
||||
*/
|
||||
function getToken() {
|
||||
try {
|
||||
return uni.getStorageSync('backend-token') || ''
|
||||
} catch (e) {
|
||||
console.error('获取 token 失败:', e)
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 统一的请求方法
|
||||
* @param {Object} options - uni.request 的配置选项
|
||||
* @param {string} options.url - 请求地址(会自动使用 getApiUrl 处理)
|
||||
* @param {string} options.method - 请求方法,默认 'GET'
|
||||
* @param {Object} options.data - 请求数据
|
||||
* @param {Object} options.header - 请求头(会自动合并公共 header)
|
||||
* @param {number} options.timeout - 超时时间
|
||||
* @param {boolean} options.needTenantId - 是否需要添加 tenantId,默认 true
|
||||
* @param {boolean} options.needToken - 是否需要添加 token,默认 true
|
||||
* @returns {Promise} 请求结果
|
||||
*/
|
||||
export function request(options = {}) {
|
||||
const {
|
||||
url,
|
||||
method = 'GET',
|
||||
data = {},
|
||||
header = {},
|
||||
timeout = 10000,
|
||||
needTenantId = true,
|
||||
needToken = true,
|
||||
...restOptions
|
||||
} = options
|
||||
|
||||
// 处理 URL(自动添加 baseUrl)
|
||||
const fullUrl = url.startsWith('http') ? url : getApiUrl(url)
|
||||
|
||||
// 构建请求头
|
||||
const requestHeader = {
|
||||
'Content-Type': 'application/json',
|
||||
...header
|
||||
}
|
||||
|
||||
// 添加 token(如果需要)
|
||||
if (needToken) {
|
||||
const token = getToken()
|
||||
if (token) {
|
||||
requestHeader['Authorization'] = `Bearer ${token}`
|
||||
// 或者使用其他 header 名称,根据后端要求调整
|
||||
// requestHeader['X-Token'] = token
|
||||
}
|
||||
}
|
||||
|
||||
// 处理请求数据
|
||||
let requestData = { ...data }
|
||||
|
||||
// 添加 tenantId 到 X-Tenant-Id header
|
||||
// 技术方案:登录返回的 LoginResponse 中包含 tenantId,前端保存后自动添加到所有请求的 header 中
|
||||
if (needTenantId) {
|
||||
const tenantId = getTenantId()
|
||||
if (tenantId) {
|
||||
// 将 tenantId 放入 X-Tenant-Id header(适用于所有请求类型:GET、POST、PUT、DELETE)
|
||||
requestHeader['X-Tenant-Id'] = tenantId
|
||||
|
||||
// 添加日志,证明已发送 X-Tenant-Id header
|
||||
console.log('[Request] ✅ 已添加 X-Tenant-Id header:', {
|
||||
url: finalUrl,
|
||||
method: method.toUpperCase(),
|
||||
'X-Tenant-Id': tenantId,
|
||||
headers: { ...requestHeader }
|
||||
})
|
||||
} else {
|
||||
console.warn('[Request] ⚠️ 未找到 tenantId,请求可能失败。请确保已登录并获取到 tenantId')
|
||||
}
|
||||
}
|
||||
|
||||
// 发起请求
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.request({
|
||||
url: finalUrl,
|
||||
method: method.toUpperCase(),
|
||||
data: requestData,
|
||||
header: requestHeader,
|
||||
timeout,
|
||||
...restOptions,
|
||||
success: (res) => {
|
||||
// 请求成功时也输出日志,确认 header 已发送
|
||||
if (needTenantId && requestHeader['X-Tenant-Id']) {
|
||||
console.log('[Request] ✅ 请求成功,已发送 X-Tenant-Id:', {
|
||||
url: finalUrl,
|
||||
method: method.toUpperCase(),
|
||||
'X-Tenant-Id': requestHeader['X-Tenant-Id'],
|
||||
statusCode: res.statusCode
|
||||
})
|
||||
}
|
||||
resolve(res)
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('[Request] ❌ 请求失败:', {
|
||||
url: finalUrl,
|
||||
method: method.toUpperCase(),
|
||||
'X-Tenant-Id': requestHeader['X-Tenant-Id'] || '未设置',
|
||||
error: err
|
||||
})
|
||||
reject(err)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* GET 请求快捷方法
|
||||
*/
|
||||
export function get(url, data = {}, options = {}) {
|
||||
return request({
|
||||
url,
|
||||
method: 'GET',
|
||||
data,
|
||||
...options
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* POST 请求快捷方法
|
||||
*/
|
||||
export function post(url, data = {}, options = {}) {
|
||||
return request({
|
||||
url,
|
||||
method: 'POST',
|
||||
data,
|
||||
...options
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* PUT 请求快捷方法
|
||||
*/
|
||||
export function put(url, data = {}, options = {}) {
|
||||
return request({
|
||||
url,
|
||||
method: 'PUT',
|
||||
data,
|
||||
...options
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE 请求快捷方法
|
||||
*/
|
||||
export function del(url, data = {}, options = {}) {
|
||||
return request({
|
||||
url,
|
||||
method: 'DELETE',
|
||||
data,
|
||||
...options
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user