From 1a9da726497cbd244e71ec8ce0133a67fb285080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B2=85?= <907037276@qq.com> Date: Wed, 30 Sep 2026 09:52:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AD=A6=E7=94=9F=E7=AB=AFAI?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2createMission=E7=AD=89=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3401=EF=BC=9Aaxios=E6=8B=A6=E6=88=AA=E5=99=A8?= =?UTF-8?q?=E5=AF=B9=E5=A4=96=E9=83=A8=E7=BB=9D=E5=AF=B9=E5=9C=B0=E5=9D=80?= =?UTF-8?q?(AI=E6=9C=8D=E5=8A=A1)=E4=B8=8D=E5=86=8D=E6=90=BA=E5=B8=A6?= =?UTF-8?q?=E6=9C=AC=E7=B3=BB=E7=BB=9FAuthorization=EF=BC=8CAI=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=8C=89=E8=87=AA=E8=BA=ABtoken=E4=BD=93=E7=B3=BB?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E4=BC=9A=E6=8B=92=E7=BB=9D=E4=B8=BB=E7=B3=BB?= =?UTF-8?q?=E7=BB=9FJWT=E5=AF=BC=E8=87=B4=E8=AF=AF=E6=8A=A5=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=BF=87=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/request.js | 313 ++++++++++++++++++++++--------------------- 1 file changed, 158 insertions(+), 155 deletions(-) diff --git a/src/utils/request.js b/src/utils/request.js index 680a56a..9221f79 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,29 +1,29 @@ -import axios from "axios"; -import { ElNotification, ElMessageBox, ElMessage, ElLoading } from "element-plus"; -import { getToken } from "@/utils/auth"; -import errorCode from "@/utils/errorCode"; -import { tansParams, blobValidate } from "@/utils/ruoyi"; -import cache from "@/plugins/cache"; -import { saveAs } from "file-saver"; +import axios from "axios"; +import { ElNotification, ElMessageBox, ElMessage, ElLoading } from "element-plus"; +import { getToken } from "@/utils/auth"; +import errorCode from "@/utils/errorCode"; +import { tansParams, blobValidate } from "@/utils/ruoyi"; +import cache from "@/plugins/cache"; +import { saveAs } from "file-saver"; import useUserStore from "@/store/modules/user"; import { isTrainingReviewPreviewRequest } from "@/utils/trainingReviewPreview"; - -let downloadLoadingInstance; -// 是否显示重新登录 -export let isRelogin = { show: false }; - -axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"; -// 创建axios实例 -const service = axios.create({ - // axios中请求配置有baseURL选项,表示请求URL公共部分 - baseURL: import.meta.env.VITE_APP_BASE_API, - // baseURL: "https://szyx.sztzjy.com:8042/", - // baseURL:'http://192.168.2.13:9868/', - // 超时 - timeout: 100000, -}); -// request拦截器 -service.interceptors.request.use( + +let downloadLoadingInstance; +// 是否显示重新登录 +export let isRelogin = { show: false }; + +axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"; +// 创建axios实例 +const service = axios.create({ + // axios中请求配置有baseURL选项,表示请求URL公共部分 + baseURL: import.meta.env.VITE_APP_BASE_API, + // baseURL: "https://szyx.sztzjy.com:8042/", + // baseURL:'http://192.168.2.13:9868/', + // 超时 + timeout: 100000, +}); +// request拦截器 +service.interceptors.request.use( (config) => { if (isTrainingReviewPreviewRequest(config)) { const error = new Error("任务评阅预览为只读模式,不能修改学生作答"); @@ -31,104 +31,107 @@ service.interceptors.request.use( return Promise.reject(error); } // 是否需要设置 token - const isToken = (config.headers || {}).isToken === false; - // 是否需要防止数据重复提交 - const isRepeatSubmit = (config.headers || {}).repeatSubmit === false; - if (getToken() && !isToken) { - config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改 - } - // get请求映射params参数 - if (config.method === "get" && config.params) { - let url = config.url + "?" + tansParams(config.params); - url = url.slice(0, -1); - config.params = {}; - config.url = url; - } - if (!isRepeatSubmit && (config.method === "post" || config.method === "put")) { - const requestObj = { - url: config.url, - data: typeof config.data === "object" ? JSON.stringify(config.data) : config.data, - time: new Date().getTime(), - }; - const sessionObj = cache.session.getJSON("sessionObj"); - if (sessionObj === undefined || sessionObj === null || sessionObj === "") { - cache.session.setJSON("sessionObj", requestObj); - } else { - } - } - return config; - }, - (error) => { - console.log(error); - Promise.reject(error); - } -); -// 响应拦截器 -service.interceptors.response.use( - (res) => { - // 未设置状态码则默认成功状态 - const code = res.data.code || 200; - // console.log(code); - // 获取错误信息 - const msg = errorCode[code] || res.data.msg || errorCode["default"]; - // 二进制数据则直接返回 - if (res.request.responseType === "blob" || res.request.responseType === "arraybuffer") { - return res.data; - } - if (code === 401) { - if (!isRelogin.show) { - isRelogin.show = true; - ElMessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" }) - .then(() => { - isRelogin.show = false; - useUserStore() - .logOut() - .then(() => { - location.href = "/index"; - }); - }) - .catch(() => { - isRelogin.show = false; - }); - } - return Promise.reject("无效的会话,或者会话已过期,请重新登录。"); - } else if (code === 500) { - ElMessage({ message: msg, type: "error" }); - return Promise.reject(new Error(msg)); - } else if (code === 601) { - ElMessage({ message: msg, type: "warning" }); - return Promise.reject(new Error(msg)); + const isToken = (config.headers || {}).isToken === false; + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false; + // 外部服务(绝对地址,如 AI 服务)不携带本系统 token: + // 第三方按自己的 token 体系校验 Authorization,带上本系统 JWT 反而会被判 401 + const isExternalUrl = /^https?:\/\//i.test(config.url); + if (getToken() && !isToken && !isExternalUrl) { + config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // get请求映射params参数 + if (config.method === "get" && config.params) { + let url = config.url + "?" + tansParams(config.params); + url = url.slice(0, -1); + config.params = {}; + config.url = url; + } + if (!isRepeatSubmit && (config.method === "post" || config.method === "put")) { + const requestObj = { + url: config.url, + data: typeof config.data === "object" ? JSON.stringify(config.data) : config.data, + time: new Date().getTime(), + }; + const sessionObj = cache.session.getJSON("sessionObj"); + if (sessionObj === undefined || sessionObj === null || sessionObj === "") { + cache.session.setJSON("sessionObj", requestObj); + } else { + } + } + return config; + }, + (error) => { + console.log(error); + Promise.reject(error); + } +); +// 响应拦截器 +service.interceptors.response.use( + (res) => { + // 未设置状态码则默认成功状态 + const code = res.data.code || 200; + // console.log(code); + // 获取错误信息 + const msg = errorCode[code] || res.data.msg || errorCode["default"]; + // 二进制数据则直接返回 + if (res.request.responseType === "blob" || res.request.responseType === "arraybuffer") { + return res.data; + } + if (code === 401) { + if (!isRelogin.show) { + isRelogin.show = true; + ElMessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" }) + .then(() => { + isRelogin.show = false; + useUserStore() + .logOut() + .then(() => { + location.href = "/index"; + }); + }) + .catch(() => { + isRelogin.show = false; + }); + } + return Promise.reject("无效的会话,或者会话已过期,请重新登录。"); + } else if (code === 500) { + ElMessage({ message: msg, type: "error" }); + return Promise.reject(new Error(msg)); + } else if (code === 601) { + ElMessage({ message: msg, type: "warning" }); + return Promise.reject(new Error(msg)); } else if (code !== 200) { if (!res.config?.skipErrorMessage) { ElNotification.error({ title: msg }); } return Promise.reject(new Error(msg)); - } else { - return Promise.resolve(res.data); - } - }, + } else { + return Promise.resolve(res.data); + } + }, (error) => { console.log("err" + error); let { message } = error; const serverMessage = String(error?.response?.data?.msg || "").trim(); - if (message == "Network Error") { - message = "后端接口连接异常"; - } else if (message.includes("timeout")) { - message = "系统接口请求超时"; - } else if (message.includes("Request failed with status code")) { - if (message.includes("401")) { - ElMessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" }) - .then(() => { - isRelogin.show = true; - useUserStore() - .logOut() - .then(() => { - location.href = "/login"; - }); - }) - .catch(() => { - isRelogin.show = false; - }); + if (message == "Network Error") { + message = "后端接口连接异常"; + } else if (message.includes("timeout")) { + message = "系统接口请求超时"; + } else if (message.includes("Request failed with status code")) { + if (message.includes("401")) { + ElMessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" }) + .then(() => { + isRelogin.show = true; + useUserStore() + .logOut() + .then(() => { + location.href = "/login"; + }); + }) + .catch(() => { + isRelogin.show = false; + }); } else if (message.includes("code 400")) { if (!error.config?.skipErrorMessage) { ElMessage({ message: serverMessage || "请求参数不符合要求", type: "error" }); @@ -136,45 +139,45 @@ service.interceptors.response.use( error.message = serverMessage || "请求参数不符合要求"; } } - message = "系统接口" + message.substr(message.length - 3) + "异常"; - } - // ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) - return Promise.reject(error); - } -); - -// 通用下载方法 -export function download(url, params, filename, config) { - downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)" }); - return service - .post(url, params, { - transformRequest: [ - (params) => { - return tansParams(params); - }, - ], - headers: { "Content-Type": "application/x-www-form-urlencoded" }, - responseType: "blob", - ...config, - }) - .then(async (data) => { - const isBlob = blobValidate(data); - if (isBlob) { - const blob = new Blob([data]); - saveAs(blob, filename); - } else { - const resText = await data.text(); - const rspObj = JSON.parse(resText); - const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode["default"]; - ElMessage.error(errMsg); - } - downloadLoadingInstance.close(); - }) - .catch((r) => { - console.error(r); - ElMessage.error("下载文件出现错误,请联系管理员!"); - downloadLoadingInstance.close(); - }); -} - -export default service; + message = "系统接口" + message.substr(message.length - 3) + "异常"; + } + // ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) + return Promise.reject(error); + } +); + +// 通用下载方法 +export function download(url, params, filename, config) { + downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)" }); + return service + .post(url, params, { + transformRequest: [ + (params) => { + return tansParams(params); + }, + ], + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + responseType: "blob", + ...config, + }) + .then(async (data) => { + const isBlob = blobValidate(data); + if (isBlob) { + const blob = new Blob([data]); + saveAs(blob, filename); + } else { + const resText = await data.text(); + const rspObj = JSON.parse(resText); + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode["default"]; + ElMessage.error(errMsg); + } + downloadLoadingInstance.close(); + }) + .catch((r) => { + console.error(r); + ElMessage.error("下载文件出现错误,请联系管理员!"); + downloadLoadingInstance.close(); + }); +} + +export default service;