84 lines
2.2 KiB
JavaScript
84 lines
2.2 KiB
JavaScript
const luchRequest = require('luch-request')
|
|
const Request = luchRequest.default || luchRequest
|
|
const { generateSignatureHeaders } = require('./signature')
|
|
const store = require('../store/index')
|
|
|
|
const BASE_URL = 'http://192.168.101.5:8084/api'
|
|
|
|
const http = new Request({
|
|
baseURL: BASE_URL,
|
|
timeout: 15000,
|
|
header: {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
})
|
|
|
|
// 请求拦截器
|
|
http.interceptors.request.use(
|
|
(config) => {
|
|
// 注入 JWT token
|
|
const token = store.getToken()
|
|
if (token) {
|
|
config.header = config.header || {}
|
|
config.header.Authorization = 'Bearer ' + token
|
|
}
|
|
|
|
// 注入签名头
|
|
const method = (config.method || 'GET').toUpperCase()
|
|
const url = config.url || ''
|
|
const body = config.data
|
|
|
|
const signatureHeaders = generateSignatureHeaders(method, url, body)
|
|
config.header = config.header || {}
|
|
Object.assign(config.header, signatureHeaders)
|
|
|
|
return config
|
|
},
|
|
(error) => Promise.reject(error)
|
|
)
|
|
|
|
// 响应拦截器
|
|
http.interceptors.response.use(
|
|
(response) => {
|
|
// 直接返回 data,统一解包
|
|
if (response.statusCode === 200) {
|
|
return response.data
|
|
}
|
|
return response
|
|
},
|
|
(error) => {
|
|
// 401 处理:清除登录态,跳转登录页
|
|
if (error.statusCode === 401) {
|
|
store.clearLogin()
|
|
const pages = getCurrentPages()
|
|
const currentPage = pages[pages.length - 1]
|
|
if (currentPage && currentPage.route !== 'pages/login/login') {
|
|
uni.reLaunch({ url: '/pages/login/login' })
|
|
}
|
|
}
|
|
return Promise.reject(error)
|
|
}
|
|
)
|
|
|
|
/**
|
|
* 将 coverImage 字段值解析为完整图片 URL
|
|
* - /api/files/{id}/preview → 拼接 baseURL 后返回
|
|
* - 纯数字 → 构造 /files/{id}/preview 后拼接 baseURL
|
|
* - 其他 → 原样返回
|
|
*/
|
|
function resolveCoverUrl(coverImage) {
|
|
if (!coverImage) return ''
|
|
// 新格式:/api/files/{id}/preview
|
|
if (/^\/api\/files\/\d+\/preview$/.test(coverImage)) {
|
|
return BASE_URL + coverImage.substring(4) // 去掉 /api
|
|
}
|
|
// 旧格式:纯数字 ID
|
|
if (/^\d+$/.test(coverImage)) {
|
|
return BASE_URL + '/files/' + coverImage + '/preview'
|
|
}
|
|
return coverImage
|
|
}
|
|
|
|
module.exports = http
|
|
module.exports.resolveCoverUrl = resolveCoverUrl
|