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.110.64: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 } // 非200状态码:构造错误对象,确保 catch 块能正确读取 message const error = new Error(response.data?.message || '请求失败') error.statusCode = response.statusCode error.data = response.data return Promise.reject(error) }, (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