|
|
|
@ -7,13 +7,13 @@ import router from '@/router' |
|
|
|
import config from './config' |
|
|
|
import config from './config' |
|
|
|
import utils from './utils' |
|
|
|
import utils from './utils' |
|
|
|
import { useAppStore } from '@/store/app.js' |
|
|
|
import { useAppStore } from '@/store/app.js' |
|
|
|
import { showToast, showConfirmDialog, allowMultipleToast, setToastDefaultOptions } from 'vant'; |
|
|
|
import { showToast, showConfirmDialog, allowMultipleToast, setToastDefaultOptions } from 'vant' |
|
|
|
|
|
|
|
|
|
|
|
// 惰性获取 Pinia store(替代原 Vuex 的 import store from "@/store/index")
|
|
|
|
// 惰性获取 Pinia store(替代原 Vuex 的 import store from "@/store/index")
|
|
|
|
const appStore = () => useAppStore() |
|
|
|
const appStore = () => useAppStore() |
|
|
|
|
|
|
|
|
|
|
|
allowMultipleToast(); |
|
|
|
allowMultipleToast() |
|
|
|
setToastDefaultOptions({ forbidClick: true }); |
|
|
|
setToastDefaultOptions({ forbidClick: true }) |
|
|
|
|
|
|
|
|
|
|
|
const base = { |
|
|
|
const base = { |
|
|
|
baseUrl: config.baseUrl, |
|
|
|
baseUrl: config.baseUrl, |
|
|
|
@ -22,19 +22,19 @@ const base = { |
|
|
|
|
|
|
|
|
|
|
|
//关闭页面
|
|
|
|
//关闭页面
|
|
|
|
const closeWindow = () => { |
|
|
|
const closeWindow = () => { |
|
|
|
var userAgent = navigator.userAgent; |
|
|
|
var userAgent = navigator.userAgent |
|
|
|
if (userAgent.indexOf("Firefox") != -1 || userAgent.indexOf("Chrome") != -1) { |
|
|
|
if (userAgent.indexOf('Firefox') != -1 || userAgent.indexOf('Chrome') != -1) { |
|
|
|
window.location.href = "about:blank"; |
|
|
|
window.location.href = 'about:blank' |
|
|
|
window.close(); |
|
|
|
window.close() |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
window.opener = null; |
|
|
|
window.opener = null |
|
|
|
window.open("", "_self"); |
|
|
|
window.open('', '_self') |
|
|
|
window.close(); |
|
|
|
window.close() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 微信中关闭
|
|
|
|
// 微信中关闭
|
|
|
|
if (WeixinJSBridge) { |
|
|
|
if (WeixinJSBridge) { |
|
|
|
WeixinJSBridge.call('closeWindow'); |
|
|
|
WeixinJSBridge.call('closeWindow') |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -42,12 +42,12 @@ const closeWindow = () => { |
|
|
|
* 提示函数 |
|
|
|
* 提示函数 |
|
|
|
* 禁止点击蒙层、显示3秒后关闭 |
|
|
|
* 禁止点击蒙层、显示3秒后关闭 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
const toast = msg => { |
|
|
|
const toast = (msg) => { |
|
|
|
showToast({ |
|
|
|
showToast({ |
|
|
|
message: msg, |
|
|
|
message: msg, |
|
|
|
duration: 4000, |
|
|
|
duration: 4000, |
|
|
|
forbidClick: true |
|
|
|
forbidClick: true, |
|
|
|
}); |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -58,9 +58,9 @@ const toLogin = () => { |
|
|
|
router.replace({ |
|
|
|
router.replace({ |
|
|
|
path: '/liics/login', |
|
|
|
path: '/liics/login', |
|
|
|
query: { |
|
|
|
query: { |
|
|
|
redirect: router.currentRoute.fullPath |
|
|
|
redirect: router.currentRoute.fullPath, |
|
|
|
} |
|
|
|
}, |
|
|
|
}); |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -74,74 +74,74 @@ const errorHandle = (status, msg) => { |
|
|
|
case 401: |
|
|
|
case 401: |
|
|
|
// toLogin();
|
|
|
|
// toLogin();
|
|
|
|
// 清除token
|
|
|
|
// 清除token
|
|
|
|
toast('【401】当前会话超时,请刷新页面'); |
|
|
|
toast('【401】当前会话超时,请刷新页面') |
|
|
|
appStore().del_token(); |
|
|
|
appStore().del_token() |
|
|
|
sessionStorage.removeItem('token'); |
|
|
|
sessionStorage.removeItem('token') |
|
|
|
break; |
|
|
|
break |
|
|
|
// 403 token过期
|
|
|
|
// 403 token过期
|
|
|
|
// 清除token并跳转登录页
|
|
|
|
// 清除token并跳转登录页
|
|
|
|
case 403: |
|
|
|
case 403: |
|
|
|
toast('【403】当前会话超时,请刷新页面'); |
|
|
|
toast('【403】当前会话超时,请刷新页面') |
|
|
|
// 清除token
|
|
|
|
// 清除token
|
|
|
|
appStore().del_token(); |
|
|
|
appStore().del_token() |
|
|
|
sessionStorage.removeItem('token'); |
|
|
|
sessionStorage.removeItem('token') |
|
|
|
setTimeout(() => { |
|
|
|
setTimeout(() => { |
|
|
|
// toLogin();
|
|
|
|
// toLogin();
|
|
|
|
}, 1000); |
|
|
|
}, 1000) |
|
|
|
break; |
|
|
|
break |
|
|
|
// 404请求不存在
|
|
|
|
// 404请求不存在
|
|
|
|
case 404: |
|
|
|
case 404: |
|
|
|
toast('哎呦~404了~休息一下'); |
|
|
|
toast('哎呦~404了~休息一下') |
|
|
|
break; |
|
|
|
break |
|
|
|
case 408: |
|
|
|
case 408: |
|
|
|
toast('【408】请求超时'); |
|
|
|
toast('【408】请求超时') |
|
|
|
break; |
|
|
|
break |
|
|
|
case 500: |
|
|
|
case 500: |
|
|
|
toast('【500】当前网络不给力,请检查你的网络设置'); |
|
|
|
toast('【500】当前网络不给力,请检查你的网络设置') |
|
|
|
break; |
|
|
|
break |
|
|
|
case 503: |
|
|
|
case 503: |
|
|
|
toast('【503】当前服务器不可用,请稍后重试'); |
|
|
|
toast('【503】当前服务器不可用,请稍后重试') |
|
|
|
break; |
|
|
|
break |
|
|
|
// 其他错误,直接抛出错误提示
|
|
|
|
// 其他错误,直接抛出错误提示
|
|
|
|
default: |
|
|
|
default: |
|
|
|
toast(`连接错误${msg}`); |
|
|
|
toast(`连接错误${msg}`) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 请求超时时间
|
|
|
|
// 请求超时时间
|
|
|
|
axios.defaults.timeout = base.timeout; |
|
|
|
axios.defaults.timeout = base.timeout |
|
|
|
|
|
|
|
|
|
|
|
//设置默认请求头
|
|
|
|
//设置默认请求头
|
|
|
|
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
|
|
|
|
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
|
|
|
|
axios.defaults.headers.post['Content-Type'] = 'application/json'; |
|
|
|
axios.defaults.headers.post['Content-Type'] = 'application/json' |
|
|
|
|
|
|
|
|
|
|
|
// 请求拦截器
|
|
|
|
// 请求拦截器
|
|
|
|
axios.interceptors.request.use( |
|
|
|
axios.interceptors.request.use( |
|
|
|
config => { |
|
|
|
(config) => { |
|
|
|
// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
|
|
|
|
// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
|
|
|
|
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
|
|
|
|
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
|
|
|
|
const token = appStore().token; |
|
|
|
const token = appStore().token |
|
|
|
// console.log("https===token:", token)
|
|
|
|
// console.log("https===token:", token)
|
|
|
|
token && (config.headers.token = token); |
|
|
|
token && (config.headers.token = token) |
|
|
|
return config; |
|
|
|
return config |
|
|
|
}, |
|
|
|
}, |
|
|
|
error => { |
|
|
|
(error) => { |
|
|
|
return Promise.reject(error); |
|
|
|
return Promise.reject(error) |
|
|
|
}) |
|
|
|
}, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// 响应拦截器
|
|
|
|
// 响应拦截器
|
|
|
|
axios.interceptors.response.use( |
|
|
|
axios.interceptors.response.use( |
|
|
|
// 请求成功
|
|
|
|
// 请求成功
|
|
|
|
(res) => { |
|
|
|
(res) => { |
|
|
|
if (res.data.code === 10001) { |
|
|
|
if (res.data.code === 10001) { |
|
|
|
appStore().del_token(); |
|
|
|
appStore().del_token() |
|
|
|
sessionStorage.removeItem("token"); // 删除已经失效或过期的token(不删除也可以,因为登录后覆盖)
|
|
|
|
sessionStorage.removeItem('token') // 删除已经失效或过期的token(不删除也可以,因为登录后覆盖)
|
|
|
|
|
|
|
|
|
|
|
|
// 如果没有展示返回头部的话去掉弹窗按钮
|
|
|
|
// 如果没有展示返回头部的话去掉弹窗按钮
|
|
|
|
if (appStore().notitle === '1') { |
|
|
|
if (appStore().notitle === '1') { |
|
|
|
toast('当前会话已结束,请刷新页面或关闭页面重新进入'); |
|
|
|
toast('当前会话已结束,请刷新页面或关闭页面重新进入') |
|
|
|
return Promise.resolve(res); |
|
|
|
return Promise.resolve(res) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
showConfirmDialog({ |
|
|
|
showConfirmDialog({ |
|
|
|
@ -150,47 +150,50 @@ axios.interceptors.response.use( |
|
|
|
confirmButtonText: '取消', |
|
|
|
confirmButtonText: '取消', |
|
|
|
cancelButtonText: '确认', |
|
|
|
cancelButtonText: '确认', |
|
|
|
confirmButtonColor: '#000000', |
|
|
|
confirmButtonColor: '#000000', |
|
|
|
cancelButtonColor: '#000000' |
|
|
|
cancelButtonColor: '#000000', |
|
|
|
}).then(() => { |
|
|
|
}) |
|
|
|
|
|
|
|
.then(() => { |
|
|
|
// on cancel (现在是右边的取消按钮)
|
|
|
|
// on cancel (现在是右边的取消按钮)
|
|
|
|
// utils.closeWindow();
|
|
|
|
// utils.closeWindow();
|
|
|
|
// router.replace({
|
|
|
|
// router.replace({
|
|
|
|
// path: '/404' // 到登录页重新获取token
|
|
|
|
// path: '/404' // 到登录页重新获取token
|
|
|
|
// })
|
|
|
|
// })
|
|
|
|
}).catch(() => { |
|
|
|
}) |
|
|
|
|
|
|
|
.catch(() => { |
|
|
|
// on confirm (现在是左边的确认按钮)
|
|
|
|
// on confirm (现在是左边的确认按钮)
|
|
|
|
//确认重新刷新页面获取token
|
|
|
|
//确认重新刷新页面获取token
|
|
|
|
// window.location.reload();
|
|
|
|
// window.location.reload();
|
|
|
|
utils.AppReloadHtml(); |
|
|
|
utils.AppReloadHtml() |
|
|
|
}); |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
return Promise.resolve(res); |
|
|
|
return Promise.resolve(res) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
res.status === 200 ? Promise.resolve(res) : Promise.reject(res); |
|
|
|
res.status === 200 ? Promise.resolve(res) : Promise.reject(res) |
|
|
|
|
|
|
|
|
|
|
|
return res |
|
|
|
return res |
|
|
|
}, |
|
|
|
}, |
|
|
|
// 服务器状态码不是200的情况
|
|
|
|
// 服务器状态码不是200的情况
|
|
|
|
// 请求失败
|
|
|
|
// 请求失败
|
|
|
|
async error => { |
|
|
|
async (error) => { |
|
|
|
const { |
|
|
|
const { response } = error |
|
|
|
response |
|
|
|
|
|
|
|
} = error; |
|
|
|
|
|
|
|
if (response) { |
|
|
|
if (response) { |
|
|
|
//过滤排队接口弹窗问题
|
|
|
|
//过滤排队接口弹窗问题
|
|
|
|
if (response.config.url.indexOf('HumanChat/queueNumbers') != -1 || response.config.url.indexOf('HumanChat/msgCallBack') != -1) { |
|
|
|
if ( |
|
|
|
return Promise.reject(response); |
|
|
|
response.config.url.indexOf('HumanChat/queueNumbers') != -1 || |
|
|
|
|
|
|
|
response.config.url.indexOf('HumanChat/msgCallBack') != -1 |
|
|
|
|
|
|
|
) { |
|
|
|
|
|
|
|
return Promise.reject(response) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (response.data.code === 10001) { |
|
|
|
if (response.data.code === 10001) { |
|
|
|
appStore().del_token(); |
|
|
|
appStore().del_token() |
|
|
|
sessionStorage.removeItem("token"); // 删除已经失效或过期的token(不删除也可以,因为登录后覆盖)
|
|
|
|
sessionStorage.removeItem('token') // 删除已经失效或过期的token(不删除也可以,因为登录后覆盖)
|
|
|
|
|
|
|
|
|
|
|
|
// 如果没有展示返回头部的话去掉弹窗按钮
|
|
|
|
// 如果没有展示返回头部的话去掉弹窗按钮
|
|
|
|
if (appStore().notitle === '1') { |
|
|
|
if (appStore().notitle === '1') { |
|
|
|
toast('当前会话已结束,请刷新页面或关闭页面重新进入'); |
|
|
|
toast('当前会话已结束,请刷新页面或关闭页面重新进入') |
|
|
|
return Promise.reject(response); |
|
|
|
return Promise.reject(response) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
showConfirmDialog({ |
|
|
|
showConfirmDialog({ |
|
|
|
@ -199,41 +202,45 @@ axios.interceptors.response.use( |
|
|
|
confirmButtonText: '取消', |
|
|
|
confirmButtonText: '取消', |
|
|
|
cancelButtonText: '确认', |
|
|
|
cancelButtonText: '确认', |
|
|
|
confirmButtonColor: '#000000', |
|
|
|
confirmButtonColor: '#000000', |
|
|
|
cancelButtonColor: '#000000' |
|
|
|
cancelButtonColor: '#000000', |
|
|
|
}).then(() => { |
|
|
|
}) |
|
|
|
|
|
|
|
.then(() => { |
|
|
|
// on cancel (现在是右边的取消按钮)
|
|
|
|
// on cancel (现在是右边的取消按钮)
|
|
|
|
// utils.closeWindow();
|
|
|
|
// utils.closeWindow();
|
|
|
|
// router.replace({
|
|
|
|
// router.replace({
|
|
|
|
// path: '/404' // 到登录页重新获取token
|
|
|
|
// path: '/404' // 到登录页重新获取token
|
|
|
|
// })
|
|
|
|
// })
|
|
|
|
}).catch(() => { |
|
|
|
}) |
|
|
|
|
|
|
|
.catch(() => { |
|
|
|
// on confirm (现在是左边的确认按钮)
|
|
|
|
// on confirm (现在是左边的确认按钮)
|
|
|
|
//确认重新刷新页面获取token
|
|
|
|
//确认重新刷新页面获取token
|
|
|
|
// window.location.reload();
|
|
|
|
// window.location.reload();
|
|
|
|
utils.AppReloadHtml(); |
|
|
|
utils.AppReloadHtml() |
|
|
|
}); |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
return Promise.reject(response); |
|
|
|
return Promise.reject(response) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 请求已发出,但是不在2xx的范围
|
|
|
|
// 请求已发出,但是不在2xx的范围
|
|
|
|
errorHandle(response.status, response.statusText); |
|
|
|
errorHandle(response.status, response.statusText) |
|
|
|
return Promise.reject(response); |
|
|
|
return Promise.reject(response) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
// 处理断网的情况
|
|
|
|
// 处理断网的情况
|
|
|
|
// eg:请求超时或断网时,更新state的network状态
|
|
|
|
// eg:请求超时或断网时,更新state的network状态
|
|
|
|
// network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
|
|
|
|
// network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
|
|
|
|
// 关于断网组件中的刷新重新获取数据,会在断网组件中说明
|
|
|
|
// 关于断网组件中的刷新重新获取数据,会在断网组件中说明
|
|
|
|
// store.commit('changeNetwork', false);
|
|
|
|
// store.commit('changeNetwork', false);
|
|
|
|
if (error?.message?.includes('timeout')) { // 判断请求异常信息中是否含有超时timeout字符串
|
|
|
|
if (error?.message?.includes('timeout')) { |
|
|
|
toast('请求超时,稍后重试!'); |
|
|
|
// 判断请求异常信息中是否含有超时timeout字符串
|
|
|
|
return Promise.reject(error); |
|
|
|
toast('请求超时,稍后重试!') |
|
|
|
|
|
|
|
return Promise.reject(error) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
toast('当前网络不给力,请检查你的网络设置'); |
|
|
|
toast('当前网络不给力,请检查你的网络设置') |
|
|
|
return Promise.reject(error); |
|
|
|
return Promise.reject(error) |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* get方法,对应get请求 |
|
|
|
* get方法,对应get请求 |
|
|
|
@ -242,16 +249,17 @@ axios.interceptors.response.use( |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
export function Get(url, params) { |
|
|
|
export function Get(url, params) { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
url = base.baseUrl + url; |
|
|
|
url = base.baseUrl + url |
|
|
|
|
|
|
|
|
|
|
|
axios.get(url, QS.stringify(params)) |
|
|
|
axios |
|
|
|
.then(res => { |
|
|
|
.get(url, QS.stringify(params)) |
|
|
|
resolve(res.data); |
|
|
|
.then((res) => { |
|
|
|
|
|
|
|
resolve(res.data) |
|
|
|
}) |
|
|
|
}) |
|
|
|
.catch(err => { |
|
|
|
.catch((err) => { |
|
|
|
reject(err.status) |
|
|
|
reject(err.status) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}); |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -261,19 +269,19 @@ export function Get(url, params) { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
export function Post(url, params) { |
|
|
|
export function Post(url, params) { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
url = base.baseUrl + url; |
|
|
|
url = base.baseUrl + url |
|
|
|
|
|
|
|
console.log('url', url, base); |
|
|
|
axios.post(url, params) |
|
|
|
axios |
|
|
|
.then(res => { |
|
|
|
.post(url, params) |
|
|
|
resolve(res.data); |
|
|
|
.then((res) => { |
|
|
|
|
|
|
|
resolve(res.data) |
|
|
|
}) |
|
|
|
}) |
|
|
|
.catch(err => { |
|
|
|
.catch((err) => { |
|
|
|
reject(err.status) |
|
|
|
reject(err.status) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}); |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* post方法,对应post请求 |
|
|
|
* post方法,对应post请求 |
|
|
|
* @param {String} url [请求的url地址] |
|
|
|
* @param {String} url [请求的url地址] |
|
|
|
@ -281,24 +289,24 @@ export function Post(url, params) { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
export function fetchPost(url, params) { |
|
|
|
export function fetchPost(url, params) { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
url = base.baseUrl + url; |
|
|
|
url = base.baseUrl + url |
|
|
|
|
|
|
|
|
|
|
|
axios.post(url, params, { |
|
|
|
axios |
|
|
|
|
|
|
|
.post(url, params, { |
|
|
|
headers: { |
|
|
|
headers: { |
|
|
|
'Content-Type': 'application/json', |
|
|
|
'Content-Type': 'application/json', |
|
|
|
token: appStore().token |
|
|
|
token: appStore().token, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}) |
|
|
|
}) |
|
|
|
.then(res => { |
|
|
|
.then((res) => { |
|
|
|
resolve(res.data); |
|
|
|
resolve(res.data) |
|
|
|
}) |
|
|
|
}) |
|
|
|
.catch(err => { |
|
|
|
.catch((err) => { |
|
|
|
reject(err.status) |
|
|
|
reject(err.status) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}); |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* post方法,对应post请求 上传图片专用 |
|
|
|
* post方法,对应post请求 上传图片专用 |
|
|
|
* @param {String} url [请求的url地址] |
|
|
|
* @param {String} url [请求的url地址] |
|
|
|
@ -306,24 +314,25 @@ export function fetchPost(url, params) { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
export function upLoadImgHttp(url, params) { |
|
|
|
export function upLoadImgHttp(url, params) { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
url = base.baseUrl + url; |
|
|
|
url = base.baseUrl + url |
|
|
|
const instance = axios.create({ |
|
|
|
const instance = axios.create({ |
|
|
|
withCredentials: true, |
|
|
|
withCredentials: true, |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
instance.post(url, params, { |
|
|
|
instance |
|
|
|
|
|
|
|
.post(url, params, { |
|
|
|
headers: { |
|
|
|
headers: { |
|
|
|
'Content-Type': 'multipart/form-data', |
|
|
|
'Content-Type': 'multipart/form-data', |
|
|
|
token: appStore().token |
|
|
|
token: appStore().token, |
|
|
|
} |
|
|
|
}, |
|
|
|
}) |
|
|
|
}) |
|
|
|
.then(res => { |
|
|
|
.then((res) => { |
|
|
|
resolve(res.data); |
|
|
|
resolve(res.data) |
|
|
|
}) |
|
|
|
}) |
|
|
|
.catch(err => { |
|
|
|
.catch((err) => { |
|
|
|
reject(err.status) |
|
|
|
reject(err.status) |
|
|
|
}) |
|
|
|
}) |
|
|
|
}); |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -334,42 +343,41 @@ export function upLoadImgHttp(url, params) { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
export function fetchImageData(url, params, options = {}) { |
|
|
|
export function fetchImageData(url, params, options = {}) { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
url = base.baseUrl + url; |
|
|
|
url = base.baseUrl + url |
|
|
|
|
|
|
|
|
|
|
|
const { |
|
|
|
const { timeout = 10000 } = options |
|
|
|
timeout = 10000 |
|
|
|
|
|
|
|
} = options; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const instance = axios.create({ |
|
|
|
const instance = axios.create({ |
|
|
|
timeout, |
|
|
|
timeout, |
|
|
|
withCredentials: true, |
|
|
|
withCredentials: true, |
|
|
|
}); |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
instance.post(url, params, { |
|
|
|
instance |
|
|
|
|
|
|
|
.post(url, params, { |
|
|
|
headers: { |
|
|
|
headers: { |
|
|
|
'Content-Type': 'application/json', |
|
|
|
'Content-Type': 'application/json', |
|
|
|
token: appStore().token |
|
|
|
token: appStore().token, |
|
|
|
} |
|
|
|
}, |
|
|
|
}) |
|
|
|
}) |
|
|
|
.then(res => { |
|
|
|
.then((res) => { |
|
|
|
// 检查响应格式
|
|
|
|
// 检查响应格式
|
|
|
|
if (res.data.code !== 0) { |
|
|
|
if (res.data.code !== 0) { |
|
|
|
reject(new Error(res.data.msg || 'Request failed')); |
|
|
|
reject(new Error(res.data.msg || 'Request failed')) |
|
|
|
return; |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const imageData = res.data.data; |
|
|
|
const imageData = res.data.data |
|
|
|
if (!imageData || !imageData.content) { |
|
|
|
if (!imageData || !imageData.content) { |
|
|
|
reject(new Error('Invalid response: missing image content')); |
|
|
|
reject(new Error('Invalid response: missing image content')) |
|
|
|
return; |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 验证文件扩展名是否为图片格式
|
|
|
|
// 验证文件扩展名是否为图片格式
|
|
|
|
const validImageExts = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp']; |
|
|
|
const validImageExts = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp'] |
|
|
|
const fileExt = imageData.fileNameExt?.toLowerCase(); |
|
|
|
const fileExt = imageData.fileNameExt?.toLowerCase() |
|
|
|
if (!validImageExts.includes(fileExt)) { |
|
|
|
if (!validImageExts.includes(fileExt)) { |
|
|
|
reject(new Error(`Unsupported image format: ${fileExt}`)); |
|
|
|
reject(new Error(`Unsupported image format: ${fileExt}`)) |
|
|
|
return; |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
resolve({ |
|
|
|
resolve({ |
|
|
|
@ -378,13 +386,13 @@ export function fetchImageData(url, params, options = {}) { |
|
|
|
fileNameExt: imageData.fileNameExt, |
|
|
|
fileNameExt: imageData.fileNameExt, |
|
|
|
content: imageData.content, |
|
|
|
content: imageData.content, |
|
|
|
// 构建完整的data URL
|
|
|
|
// 构建完整的data URL
|
|
|
|
dataUrl: `data:image/${fileExt};base64,${imageData.content}` |
|
|
|
dataUrl: `data:image/${fileExt};base64,${imageData.content}`, |
|
|
|
}); |
|
|
|
}) |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
.catch((err) => { |
|
|
|
|
|
|
|
reject(err) |
|
|
|
|
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
.catch(err => { |
|
|
|
|
|
|
|
reject(err); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -392,10 +400,10 @@ export function fetchImageData(url, params, options = {}) { |
|
|
|
* @deprecated 使用 fetchImageData 替代 |
|
|
|
* @deprecated 使用 fetchImageData 替代 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
export function fetchImageStream(url, params, options = {}) { |
|
|
|
export function fetchImageStream(url, params, options = {}) { |
|
|
|
return fetchImageData(url, params, options).then(imageData => { |
|
|
|
return fetchImageData(url, params, options).then((imageData) => { |
|
|
|
// 将base64转换为blob以保持兼容性
|
|
|
|
// 将base64转换为blob以保持兼容性
|
|
|
|
return base64ToBlob(imageData.content, `image/${imageData.fileNameExt}`); |
|
|
|
return base64ToBlob(imageData.content, `image/${imageData.fileNameExt}`) |
|
|
|
}); |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -407,17 +415,17 @@ export function fetchImageStream(url, params, options = {}) { |
|
|
|
export function base64ToBlob(base64Data, contentType = 'image/png') { |
|
|
|
export function base64ToBlob(base64Data, contentType = 'image/png') { |
|
|
|
try { |
|
|
|
try { |
|
|
|
// 解码base64数据
|
|
|
|
// 解码base64数据
|
|
|
|
const byteCharacters = atob(base64Data); |
|
|
|
const byteCharacters = atob(base64Data) |
|
|
|
const byteNumbers = new Array(byteCharacters.length); |
|
|
|
const byteNumbers = new Array(byteCharacters.length) |
|
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < byteCharacters.length; i++) { |
|
|
|
for (let i = 0; i < byteCharacters.length; i++) { |
|
|
|
byteNumbers[i] = byteCharacters.charCodeAt(i); |
|
|
|
byteNumbers[i] = byteCharacters.charCodeAt(i) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const byteArray = new Uint8Array(byteNumbers); |
|
|
|
const byteArray = new Uint8Array(byteNumbers) |
|
|
|
return new Blob([byteArray], { type: contentType }); |
|
|
|
return new Blob([byteArray], { type: contentType }) |
|
|
|
} catch (error) { |
|
|
|
} catch (error) { |
|
|
|
throw new Error(`Failed to convert base64 to blob: ${error.message}`); |
|
|
|
throw new Error(`Failed to convert base64 to blob: ${error.message}`) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -429,37 +437,33 @@ export function base64ToBlob(base64Data, contentType = 'image/png') { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
export function downloadFile(url, params, options = {}) { |
|
|
|
export function downloadFile(url, params, options = {}) { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
url = base.baseUrl + url; |
|
|
|
url = base.baseUrl + url |
|
|
|
|
|
|
|
|
|
|
|
const { |
|
|
|
const { timeout = 30000, responseType = 'blob', method = 'POST' } = options |
|
|
|
timeout = 30000, |
|
|
|
|
|
|
|
responseType = 'blob', |
|
|
|
|
|
|
|
method = 'POST' |
|
|
|
|
|
|
|
} = options; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const config = { |
|
|
|
const config = { |
|
|
|
url, |
|
|
|
url, |
|
|
|
method, |
|
|
|
method, |
|
|
|
headers: { |
|
|
|
headers: { |
|
|
|
'Content-Type': 'application/json', |
|
|
|
'Content-Type': 'application/json', |
|
|
|
token: appStore().token |
|
|
|
token: appStore().token, |
|
|
|
}, |
|
|
|
}, |
|
|
|
responseType, |
|
|
|
responseType, |
|
|
|
timeout |
|
|
|
timeout, |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (method.toUpperCase() === 'POST') { |
|
|
|
if (method.toUpperCase() === 'POST') { |
|
|
|
config.data = params; |
|
|
|
config.data = params |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
config.params = params; |
|
|
|
config.params = params |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
axios(config) |
|
|
|
axios(config) |
|
|
|
.then(res => { |
|
|
|
.then((res) => { |
|
|
|
resolve(res.data); |
|
|
|
resolve(res.data) |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
.catch((err) => { |
|
|
|
|
|
|
|
reject(err) |
|
|
|
|
|
|
|
}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
.catch(err => { |
|
|
|
|
|
|
|
reject(err); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|