From fa1b3e5d3ace333459ae73013a69ffa79a18757f Mon Sep 17 00:00:00 2001 From: lizhenhua <1075222162@qq.com> Date: Thu, 10 Jul 2025 16:11:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=A2=E6=88=B7=E6=89=80?= =?UTF-8?q?=E6=8F=90=E5=9F=BA=E7=A1=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/http/api/rent-facility/line.ts | 11 ++ src/http/api/utils/request.js | 200 +++++++++++++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 src/http/api/rent-facility/line.ts create mode 100644 src/http/api/utils/request.js diff --git a/src/http/api/rent-facility/line.ts b/src/http/api/rent-facility/line.ts new file mode 100644 index 0000000..59deedd --- /dev/null +++ b/src/http/api/rent-facility/line.ts @@ -0,0 +1,11 @@ +import { get, post } from '../../index' + +export const exportNewBuy = (params) => { + return post('/material-mall/equipmentConfig/export', params) +} + +export const getdeviceInfo = (params) => { + return post('/material-mall/equipmentConfig/getdeviceInfo', params) +} + + diff --git a/src/http/api/utils/request.js b/src/http/api/utils/request.js new file mode 100644 index 0000000..b9fb08b --- /dev/null +++ b/src/http/api/utils/request.js @@ -0,0 +1,200 @@ +import axios from 'axios' +import { Notification, MessageBox, Message, Loading } from 'element-ui' +import store from '@/store' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { tansParams, blobValidate } from '@/utils/bonus' +import cache from '@/plugins/cache' +import { saveAs } from 'file-saver' +import { decryptWithSM4, encryptWithSM4, hashWithSM3AndSalt } from '@/utils/sm' +import router from '@/router' + +const systemConfig = JSON.parse(localStorage.getItem('systemConfig')) || { + requestConfig: { encryptRequest: false, checkIntegrity: false, encryptResponse: false } +}; + +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: process.env.VUE_APP_BASE_API, + // 超时 + timeout: 10000 +}) + +// request 拦截器 +service.interceptors.request.use(config => { + // 提取 headers 和方法 + const headers = config.headers || {} + const { + isToken = true, + encryptRequest = true, + checkIntegrity = true, + encryptResponse = true, + repeatSubmit = false + } = headers + + // 设置请求头 + //入参加密 + config.headers['encryptRequest'] = systemConfig.requestConfig.encryptRequest && encryptRequest ? 'true' : 'false' + // 数据完整性校验 + config.headers['checkIntegrity'] = systemConfig.requestConfig.checkIntegrity && checkIntegrity ? 'true' : 'false' + //回参是否加密 + config.headers['encryptResponse'] = systemConfig.requestConfig.encryptResponse && encryptResponse ? 'true' : 'false' + + const isRepeatSubmit = repeatSubmit + // 处理 Token + 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')) { + let data = typeof config.data === 'object' ? JSON.stringify(config.data) : config.data + let contentType = config.headers['Content-Type'] + if (contentType.includes('application/json') && typeof data !== 'undefined') { + // 加密数据 + if (systemConfig.requestConfig.encryptRequest && encryptRequest) { + console.log(data); + console.log(hashWithSM3AndSalt(data)); + config.data = encryptWithSM4(data+"|"+hashWithSM3AndSalt(data)) + } + } + // 检查请求数据大小 + const requestSize = JSON.stringify({ url: config.url, data: data, time: Date.now() }).length + const limitSize = 1000 * 1024 * 1024 // 限制存放数据 5MB + + if (requestSize >= limitSize) { + console.warn(`[${config.url}]: 请求数据大小超出允许的5MB限制,无法进行防重复提交验证。`) + return config + } + // 防止重复提交 + const sessionObj = cache.session.getJSON('sessionObj') || {} + const requestObj = { url: config.url, data: data, time: Date.now() } + + if (sessionObj.data === requestObj.data && requestObj.time - sessionObj.time < 0 && sessionObj.url === requestObj.url) { + console.warn(`[${sessionObj.url}]: 数据正在处理,请勿重复提交`) + return Promise.reject(new Error('数据正在处理,请勿重复提交')) + } + cache.session.setJSON('sessionObj', requestObj) + } + return config +}, error => { + console.error(error) + return Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use(res => { + if (res.headers.encryptresponse && !res.data.hasOwnProperty('code')) { + res.data = JSON.parse(decryptWithSM4(res.data)) + } + // 未设置状态码则默认成功状态 + const code = res.data.code || 200 + // 获取错误信息 + 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 + // MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { + // confirmButtonText: '重新登录', + // cancelButtonText: '取消', + // type: 'warning' + // }).then(() => { + // isRelogin.show = false + // store.dispatch('LogOut').then(() => { + // location.href = process.env.VUE_APP_BASE_API == '/dev-api' ? '/index' : '/iws/glweb/index' + // }) + // }).catch(() => { + // isRelogin.show = false + // }) + if (process.env.VUE_APP_BASE_API == '/iws/jxhzb-api') { + Message({ message: '无效的会话,或者会话已过期,请重新登录。', type: 'error' }) + setTimeout(() => { + // 关闭页面 + window.close() + }, 1500) + } else { + store.dispatch('LogOut').then(() => { + router.push({ path: '/login' }) + Message({ message: '无效的会话,或者会话已过期,请重新登录。', type: 'error' }) + }) + } + } + } else if (code === 500) { + Message({ message: msg, type: 'error' }) + return Promise.reject(new Error(msg)) + } else if (code === 601) { + Message({ message: msg, type: 'warning' }) + return Promise.reject('error') + } else if (code !== 200) { + Notification.error({ title: msg }) + return Promise.reject('error') + } else { + return res.data + } + }, + error => { + let { message } = error + if (message == 'Network Error') { + message = '后端接口连接异常' + } else if (message.includes('timeout')) { + message = '系统接口请求超时' + } else if (message.includes('Request failed with status code')) { + message = '系统接口' + message.substr(message.length - 3) + '异常' + } + Message({ message: message, type: 'error', duration: 5 * 1000 }) + return Promise.reject(error) + } +) + +// 通用下载方法 +export function download(url, params, filename, config) { + downloadLoadingInstance = Loading.service({ + text: '正在下载数据,请稍候', + spinner: 'el-icon-loading', + 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', encryptResponse: false}, + 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'] + Message.error(errMsg) + } + downloadLoadingInstance.close() + }).catch((r) => { + console.error(r) + Message.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close() + }) +} + +export default service