From 5a152d6912b84f745a9534cf0bcc1108f06fb973 Mon Sep 17 00:00:00 2001 From: wangchengming <15110151257@163.com> Date: Tue, 16 Sep 2025 21:54:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5ppt=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 + .env.production | 2 + src/api/pptAnalysis.js | 12 +- src/utils/requestAnalysis.js | 152 +++++++++++++++++++++++ src/views/mediaLibrary/importPrice.vue | 7 +- src/views/mediaMap/index.vue | 4 +- src/views/mediaTool/geoConvertIndex.vue | 11 +- src/views/mediaTool/pptAnalysisIndex.vue | 145 +++++++++++---------- src/views/outdoorMedia/index.vue | 4 +- vite.config.js | 8 +- 10 files changed, 265 insertions(+), 82 deletions(-) create mode 100644 src/utils/requestAnalysis.js diff --git a/.env.development b/.env.development index 7b4c4e1..1471aa8 100644 --- a/.env.development +++ b/.env.development @@ -6,3 +6,5 @@ VITE_APP_ENV = 'development' # 媒介管理系统/开发环境 VITE_APP_BASE_API = '/dev-api' + +VITE_APP_Analysis_API = '/ppt-analysis-api' \ No newline at end of file diff --git a/.env.production b/.env.production index 4f702e7..94517e1 100644 --- a/.env.production +++ b/.env.production @@ -6,6 +6,8 @@ VITE_APP_ENV = 'production' # 媒介管理系统/生产环境 VITE_APP_BASE_API = '/prod-api' + +VITE_APP_Analysis_API = '/ppt-analysis-api' # 是否在打包时开启压缩,支持 gzip 和 brotli VITE_BUILD_COMPRESS = gzip \ No newline at end of file diff --git a/src/api/pptAnalysis.js b/src/api/pptAnalysis.js index 0f2e724..5a9ef79 100644 --- a/src/api/pptAnalysis.js +++ b/src/api/pptAnalysis.js @@ -1,9 +1,9 @@ -import request from '@/utils/request' +import request from '@/utils/requestAnalysis' // 上传PPT分析文件 export function uploadPPTAnalysisFile(query) { return request({ - url: '/upload', + url: '/api/upload', method: 'post', data: query, timeout: 300000, // 300秒 = 5分钟,根据文件大小调整 @@ -16,7 +16,7 @@ export function uploadPPTAnalysisFile(query) { // 获取PPT分析任务分页列表 export function pptAnalysisTaskPageList(query) { return request({ - url: '/tasks', + url: '/api/tasks', method: 'get', params: query }) @@ -25,7 +25,7 @@ export function pptAnalysisTaskPageList(query) { // 获取PPT分析统计 export function pptAnalysisStatistics(query) { return request({ - url: '/statistics', + url: '/api/statistics', method: 'get', params: query }) @@ -34,7 +34,7 @@ export function pptAnalysisStatistics(query) { // 删除PPT分析任务 export function deletePPTAnalysisTask(taskId) { return request({ - url: '/tasks/' + taskId, + url: '/api/tasks/' + taskId, method: 'DELETE' }) } @@ -42,7 +42,7 @@ export function deletePPTAnalysisTask(taskId) { // 导出PPT分析报告 export function exportPPTAnalysisReport(taskId) { return request({ - url: '/export/' + taskId, + url: '/api/export/' + taskId, method: 'get', responseType: 'blob' }) diff --git a/src/utils/requestAnalysis.js b/src/utils/requestAnalysis.js new file mode 100644 index 0000000..2c48021 --- /dev/null +++ b/src/utils/requestAnalysis.js @@ -0,0 +1,152 @@ +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' + +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_Analysis_API, + // 超时 + timeout: 10000 +}) + +// request拦截器 +service.interceptors.request.use(config => { + // 是否需要设置 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 requestSize = Object.keys(JSON.stringify(requestObj)).length // 请求数据大小 + const limitSize = 5 * 1024 * 1024 // 限制存放数据5M + if (requestSize >= limitSize) { + console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。') + return config + } + const sessionObj = cache.session.getJSON('sessionObj') + if (sessionObj === undefined || sessionObj === null || sessionObj === '') { + cache.session.setJSON('sessionObj', requestObj) + } else { + const s_url = sessionObj.url // 请求地址 + const s_data = sessionObj.data // 请求数据 + const s_time = sessionObj.time // 请求时间 + const interval = 1000 // 间隔时间(ms),小于此时间视为重复提交 + if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { + const message = '数据正在处理,请勿重复提交' + console.warn(`[${s_url}]: ` + message) + return Promise.reject(new Error(message)) + } else { + cache.session.setJSON('sessionObj', requestObj) + } + } + } + return config +}, error => { + console.log(error) + Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use(res => { + // 未设置状态码则默认成功状态 + 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 + 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) { + ElNotification.error({ title: msg }) + return Promise.reject('error') + } else { + return Promise.resolve(res.data) + } + }, + error => { + console.log('err' + 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) + "异常" + } + 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 diff --git a/src/views/mediaLibrary/importPrice.vue b/src/views/mediaLibrary/importPrice.vue index dcc0b4c..c34912b 100644 --- a/src/views/mediaLibrary/importPrice.vue +++ b/src/views/mediaLibrary/importPrice.vue @@ -39,12 +39,12 @@ const mediaType = ref(null) const docUploadList = ref([]) // 自定义上传文件资料 -const requestDocUpload = (options) => { +const requestDocUpload = (options) => { proxy.$modal.loading('正在上传文件,请耐心等待...') const { file } = options var formData = new FormData(); formData.append('mediaType', mediaType.value); - formData.append('file', file); + formData.append('file', file); importPriceByExcel(formData).then(res => { if (res.code == 200) { proxy.$modal.msgSuccess("导入成功") @@ -54,6 +54,9 @@ const requestDocUpload = (options) => { proxy.$modal.closeLoading() proxy.$modal.msgError(res.msg); } + }).catch(error => { + proxy.$modal.closeLoading() + proxy.$modal.msgError(res.msg); }) } //自定义上传文件资料校验 diff --git a/src/views/mediaMap/index.vue b/src/views/mediaMap/index.vue index 8b456c3..0f6f377 100644 --- a/src/views/mediaMap/index.vue +++ b/src/views/mediaMap/index.vue @@ -627,8 +627,8 @@ const renderMassMarks = () => { mediaByMap(queryParams.value).then(res => { if (res.code == 200) { res.data.forEach(itemPoint => { - if (itemPoint.businessType == 1) points.value.push({ "lnglat": [itemPoint.x, itemPoint.y], "mediaId": itemPoint.mediaId, "style": 0 }) - if (itemPoint.businessType == 2) points.value.push({ "lnglat": [itemPoint.x, itemPoint.y], "mediaId": itemPoint.mediaId, "style": 1 }) + if (itemPoint.dataScopeDeptId == 220) points.value.push({ "lnglat": [itemPoint.x, itemPoint.y], "mediaId": itemPoint.mediaId, "style": 0 }) + if (itemPoint.dataScopeDeptId == 219) points.value.push({ "lnglat": [itemPoint.x, itemPoint.y], "mediaId": itemPoint.mediaId, "style": 1 }) }); } }).then(res => { diff --git a/src/views/mediaTool/geoConvertIndex.vue b/src/views/mediaTool/geoConvertIndex.vue index 0c5e125..49d9fd8 100644 --- a/src/views/mediaTool/geoConvertIndex.vue +++ b/src/views/mediaTool/geoConvertIndex.vue @@ -178,10 +178,10 @@ const addBusGeoConvertTask = () => { } // 开始执行 const handleStartTask = (row) => { - // if (row.state == 1) { - // proxy.$modal.msgSuccess("任务已经开始,请等待...") - // return - // } + if (row.state == 1) { + proxy.$modal.msgSuccess("任务已经开始,请等待...") + return + } startBusGeoConvert({ id: row.id }).then(res => { if (res.code == 200) { getTaskRecordPageList() @@ -192,8 +192,7 @@ const handleStartTask = (row) => { // 结果操作 const handleResultOption = (row) => { - if (row.progress == '0') { - + if (row.state !== 2) { return } exportBusGeoConvert({ id: row.id }).then(res => { diff --git a/src/views/mediaTool/pptAnalysisIndex.vue b/src/views/mediaTool/pptAnalysisIndex.vue index b6db618..12394c5 100644 --- a/src/views/mediaTool/pptAnalysisIndex.vue +++ b/src/views/mediaTool/pptAnalysisIndex.vue @@ -27,76 +27,63 @@
使用统计
-
- - {{ detailForm.mediaName }} - -
- - {{ detailForm.mediaCategoryStr }} -
- {{ detailForm.displayFormStr }} + {{ detailForm.analysis_statistics.unique_tools }}
- {{ detailForm.mediaSize }} + {{ detailForm.analysis_statistics.total_images }}
- {{ detailForm.provinceName }} + {{ detailForm.task_statistics.completed_tasks }}
- - {{ detailForm.address }} + + {{ detailForm.task_statistics.failed_tasks }} -
- - {{ detailForm.advantages }} - -
+
- {{ detailForm.advantages }} - -
- - {{ detailForm.advantages }} + {{ detailForm.analysis_statistics.adobe_images }}
-
任务记录
+
+ 任务记录 + + + +
- - + + + + - @@ -113,14 +100,17 @@