Merge remote-tracking branch 'origin/master' into dev-QQq

fix/exam-question-access-material-excel-delete-draft
qinzhenpen 2 weeks ago
commit 36052437c3

@ -1,29 +1,29 @@
import axios from "axios"; import axios from "axios";
import { ElNotification, ElMessageBox, ElMessage, ElLoading } from "element-plus"; import { ElNotification, ElMessageBox, ElMessage, ElLoading } from "element-plus";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import errorCode from "@/utils/errorCode"; import errorCode from "@/utils/errorCode";
import { tansParams, blobValidate } from "@/utils/ruoyi"; import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from "@/plugins/cache"; import cache from "@/plugins/cache";
import { saveAs } from "file-saver"; import { saveAs } from "file-saver";
import useUserStore from "@/store/modules/user"; import useUserStore from "@/store/modules/user";
import { isTrainingReviewPreviewRequest } from "@/utils/trainingReviewPreview"; import { isTrainingReviewPreviewRequest } from "@/utils/trainingReviewPreview";
let downloadLoadingInstance; let downloadLoadingInstance;
// 是否显示重新登录 // 是否显示重新登录
export let isRelogin = { show: false }; export let isRelogin = { show: false };
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"; axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios实例 // 创建axios实例
const service = axios.create({ const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分 // axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: import.meta.env.VITE_APP_BASE_API, baseURL: import.meta.env.VITE_APP_BASE_API,
// baseURL: "https://szyx.sztzjy.com:8042/", // baseURL: "https://szyx.sztzjy.com:8042/",
// baseURL:'http://192.168.2.13:9868/', // baseURL:'http://192.168.2.13:9868/',
// 超时 // 超时
timeout: 100000, timeout: 100000,
}); });
// request拦截器 // request拦截器
service.interceptors.request.use( service.interceptors.request.use(
(config) => { (config) => {
if (isTrainingReviewPreviewRequest(config)) { if (isTrainingReviewPreviewRequest(config)) {
const error = new Error("任务评阅预览为只读模式,不能修改学生作答"); const error = new Error("任务评阅预览为只读模式,不能修改学生作答");
@ -31,104 +31,107 @@ service.interceptors.request.use(
return Promise.reject(error); return Promise.reject(error);
} }
// 是否需要设置 token // 是否需要设置 token
const isToken = (config.headers || {}).isToken === false; const isToken = (config.headers || {}).isToken === false;
// 是否需要防止数据重复提交 // 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false; const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
if (getToken() && !isToken) { // 外部服务(绝对地址,如 AI 服务)不携带本系统 token:
config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改 // 第三方按自己的 token 体系校验 Authorization,带上本系统 JWT 反而会被判 401
} const isExternalUrl = /^https?:\/\//i.test(config.url);
// get请求映射params参数 if (getToken() && !isToken && !isExternalUrl) {
if (config.method === "get" && config.params) { config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
let url = config.url + "?" + tansParams(config.params); }
url = url.slice(0, -1); // get请求映射params参数
config.params = {}; if (config.method === "get" && config.params) {
config.url = url; let url = config.url + "?" + tansParams(config.params);
} url = url.slice(0, -1);
if (!isRepeatSubmit && (config.method === "post" || config.method === "put")) { config.params = {};
const requestObj = { config.url = url;
url: config.url, }
data: typeof config.data === "object" ? JSON.stringify(config.data) : config.data, if (!isRepeatSubmit && (config.method === "post" || config.method === "put")) {
time: new Date().getTime(), const requestObj = {
}; url: config.url,
const sessionObj = cache.session.getJSON("sessionObj"); data: typeof config.data === "object" ? JSON.stringify(config.data) : config.data,
if (sessionObj === undefined || sessionObj === null || sessionObj === "") { time: new Date().getTime(),
cache.session.setJSON("sessionObj", requestObj); };
} else { const sessionObj = cache.session.getJSON("sessionObj");
} if (sessionObj === undefined || sessionObj === null || sessionObj === "") {
} cache.session.setJSON("sessionObj", requestObj);
return config; } else {
}, }
(error) => { }
console.log(error); return config;
Promise.reject(error); },
} (error) => {
); console.log(error);
// 响应拦截器 Promise.reject(error);
service.interceptors.response.use( }
(res) => { );
// 未设置状态码则默认成功状态 // 响应拦截器
const code = res.data.code || 200; service.interceptors.response.use(
// console.log(code); (res) => {
// 获取错误信息 // 未设置状态码则默认成功状态
const msg = errorCode[code] || res.data.msg || errorCode["default"]; const code = res.data.code || 200;
// 二进制数据则直接返回 // console.log(code);
if (res.request.responseType === "blob" || res.request.responseType === "arraybuffer") { // 获取错误信息
return res.data; const msg = errorCode[code] || res.data.msg || errorCode["default"];
} // 二进制数据则直接返回
if (code === 401) { if (res.request.responseType === "blob" || res.request.responseType === "arraybuffer") {
if (!isRelogin.show) { return res.data;
isRelogin.show = true; }
ElMessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" }) if (code === 401) {
.then(() => { if (!isRelogin.show) {
isRelogin.show = false; isRelogin.show = true;
useUserStore() ElMessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" })
.logOut() .then(() => {
.then(() => { isRelogin.show = false;
location.href = "/index"; useUserStore()
}); .logOut()
}) .then(() => {
.catch(() => { location.href = "/index";
isRelogin.show = false; });
}); })
} .catch(() => {
return Promise.reject("无效的会话,或者会话已过期,请重新登录。"); isRelogin.show = false;
} else if (code === 500) { });
ElMessage({ message: msg, type: "error" }); }
return Promise.reject(new Error(msg)); return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
} else if (code === 601) { } else if (code === 500) {
ElMessage({ message: msg, type: "warning" }); ElMessage({ message: msg, type: "error" });
return Promise.reject(new Error(msg)); 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) { } else if (code !== 200) {
if (!res.config?.skipErrorMessage) { if (!res.config?.skipErrorMessage) {
ElNotification.error({ title: msg }); ElNotification.error({ title: msg });
} }
return Promise.reject(new Error(msg)); return Promise.reject(new Error(msg));
} else { } else {
return Promise.resolve(res.data); return Promise.resolve(res.data);
} }
}, },
(error) => { (error) => {
console.log("err" + error); console.log("err" + error);
let { message } = error; let { message } = error;
const serverMessage = String(error?.response?.data?.msg || "").trim(); const serverMessage = String(error?.response?.data?.msg || "").trim();
if (message == "Network Error") { if (message == "Network Error") {
message = "后端接口连接异常"; message = "后端接口连接异常";
} else if (message.includes("timeout")) { } else if (message.includes("timeout")) {
message = "系统接口请求超时"; message = "系统接口请求超时";
} else if (message.includes("Request failed with status code")) { } else if (message.includes("Request failed with status code")) {
if (message.includes("401")) { if (message.includes("401")) {
ElMessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" }) ElMessageBox.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" })
.then(() => { .then(() => {
isRelogin.show = true; isRelogin.show = true;
useUserStore() useUserStore()
.logOut() .logOut()
.then(() => { .then(() => {
location.href = "/login"; location.href = "/login";
}); });
}) })
.catch(() => { .catch(() => {
isRelogin.show = false; isRelogin.show = false;
}); });
} else if (message.includes("code 400")) { } else if (message.includes("code 400")) {
if (!error.config?.skipErrorMessage) { if (!error.config?.skipErrorMessage) {
ElMessage({ message: serverMessage || "请求参数不符合要求", type: "error" }); ElMessage({ message: serverMessage || "请求参数不符合要求", type: "error" });
@ -136,45 +139,45 @@ service.interceptors.response.use(
error.message = serverMessage || "请求参数不符合要求"; error.message = serverMessage || "请求参数不符合要求";
} }
} }
message = "系统接口" + message.substr(message.length - 3) + "异常"; message = "系统接口" + message.substr(message.length - 3) + "异常";
} }
// ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) // ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
return Promise.reject(error); return Promise.reject(error);
} }
); );
// 通用下载方法 // 通用下载方法
export function download(url, params, filename, config) { export function download(url, params, filename, config) {
downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)" }); downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)" });
return service return service
.post(url, params, { .post(url, params, {
transformRequest: [ transformRequest: [
(params) => { (params) => {
return tansParams(params); return tansParams(params);
}, },
], ],
headers: { "Content-Type": "application/x-www-form-urlencoded" }, headers: { "Content-Type": "application/x-www-form-urlencoded" },
responseType: "blob", responseType: "blob",
...config, ...config,
}) })
.then(async (data) => { .then(async (data) => {
const isBlob = blobValidate(data); const isBlob = blobValidate(data);
if (isBlob) { if (isBlob) {
const blob = new Blob([data]); const blob = new Blob([data]);
saveAs(blob, filename); saveAs(blob, filename);
} else { } else {
const resText = await data.text(); const resText = await data.text();
const rspObj = JSON.parse(resText); const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode["default"]; const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
ElMessage.error(errMsg); ElMessage.error(errMsg);
} }
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}) })
.catch((r) => { .catch((r) => {
console.error(r); console.error(r);
ElMessage.error("下载文件出现错误,请联系管理员!"); ElMessage.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}); });
} }
export default service; export default service;

Loading…
Cancel
Save