| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- // src/utils/request.js
- import config from '@/config'
- import { getToken, removeToken } from '@/utils/auth'
- import { toast, showConfirm, tansParams } from '@/utils/common'
-
- const request = (configObj = {}) => {
- // 确保配置对象有效
- configObj.header = configObj.header || {};
-
- // 判断是否为公开API
- const isPublicApi = configObj.isToken === false ||
- configObj.url.includes('/novel/') ||
- configObj.url.includes('/chapter/') ||
- configObj.url.includes('/category/');
-
- // 获取token
- const token = getToken() || '';
-
- // 仅当token存在且不是公开API时才添加token
- if (token && !isPublicApi && configObj.header.isToken !== false) {
- configObj.header['Authorization'] = 'Bearer ' + token;
- } else if (isPublicApi) {
- // 明确设置公开API不携带token
- configObj.header.isToken = false;
- }
-
- // 完整URL处理
- let fullUrl = configObj.url;
- if (!fullUrl.startsWith('http')) {
- fullUrl = (configObj.baseUrl || config.baseUrl || '') + fullUrl;
- }
-
- return new Promise((resolve, reject) => {
- uni.request({
- method: configObj.method || 'get',
- url: fullUrl,
- data: configObj.data,
- params: configObj.params,
- header: configObj.header,
- success: (res) => {
- // 处理401认证失败
- if (res.statusCode === 401) {
- const errorMsg = res.data?.msg || '认证失败,请重新登录';
- console.warn('认证失败:', configObj.url, errorMsg);
-
- // 清除无效token
- removeToken();
-
- // 显示登录提示
- toast(errorMsg);
-
- // 跳转到登录页面
- setTimeout(() => {
- uni.navigateTo({ url: '/pages/login/index' });
- }, 1500);
-
- reject(new Error(errorMsg));
- return;
- }
- // 处理其他成功响应
- else if (res.statusCode >= 200 && res.statusCode < 300) {
- // 如果响应数据包含code字段,需要根据code判断业务状态
- if (res.data && typeof res.data.code !== 'undefined') {
- if (res.data.code === 200) {
- resolve(res.data);
- } else {
- const errorMsg = res.data.msg || `请求失败 (${res.data.code})`;
- toast(errorMsg);
- reject(new Error(errorMsg));
- }
- } else {
- // 没有code字段,直接返回数据
- resolve(res.data);
- }
- }
- // 处理其他错误
- else {
- const errorMsg = res.data?.msg || `请求失败 (${res.statusCode})`;
- toast(errorMsg);
- reject(new Error(errorMsg));
- }
- },
- fail: (err) => {
- let message = '网络连接异常';
- if (err.errMsg.includes('timeout')) message = '请求超时';
- toast(message);
- reject(err);
- }
- });
- });
- }
-
- // 添加便捷方法
- request.get = (url, params, config = {}) => {
- return request({
- url,
- params,
- method: 'get',
- ...config
- })
- }
-
- request.post = (url, data, config = {}) => {
- return request({
- url,
- data,
- method: 'post',
- ...config
- })
- }
-
- export default request
|