diff --git a/src/api/enterpriseLibrary/tool/tool.js b/src/api/enterpriseLibrary/tool/tool.js index a2b4e8a..2f5c1d6 100644 --- a/src/api/enterpriseLibrary/tool/tool.js +++ b/src/api/enterpriseLibrary/tool/tool.js @@ -39,7 +39,7 @@ export function delDataAPI(data) { /* 工器具库->查询详情 */ export function getDetailDataAPI(params) { return request({ - url: '/smartBid/mainDatabase/tool/getDetailData', + url: '/smartBid/mainDatabase/tool/detailData', method: 'GET', params }) diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index bb87292..68b8ac5 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -176,3 +176,40 @@ aside { margin-bottom: 10px; } } + +// 下载加载提示样式优化 +::v-deep .download-loading-mask { + .el-loading-spinner { + margin-top: -30px; + + .el-loading-text { + color: #409EFF; + font-size: 16px; + font-weight: 500; + margin-top: 15px; + letter-spacing: 0.5px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + } + + .circular { + width: 50px; + height: 50px; + } + + .path { + stroke: #409EFF; + stroke-width: 3.5; + } + + .el-icon-loading { + font-size: 50px; + color: #409EFF; + } + } + + // 背景渐变效果 + .el-loading-mask { + backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + } +} diff --git a/src/components/TableModel2/index.vue b/src/components/TableModel2/index.vue index 31ca6e2..fa4135f 100644 --- a/src/components/TableModel2/index.vue +++ b/src/components/TableModel2/index.vue @@ -198,6 +198,11 @@ export default { type: [Number, String], default: 600 }, + // 是否自动加载数据 默认自动加载 + autoLoad: { + type: Boolean, + default: true + }, }, computed: { /* 根据操作栏控制表头是否显示 */ @@ -322,7 +327,10 @@ export default { this.$set(this.queryParams, key, this.sendParams[key]) } } - this.getTableList() + // 根据 autoLoad 属性决定是否自动加载数据 + if (this.autoLoad) { + this.getTableList() + } }, updated() { // 若需要自适应最小宽度,可启用下行;当前使用固定宽度 handleColWidth diff --git a/src/utils/download.js b/src/utils/download.js index aba2d53..0db7128 100644 --- a/src/utils/download.js +++ b/src/utils/download.js @@ -1,3 +1,9 @@ +import axios from 'axios' +import { Loading, Message } from 'element-ui' +import { getToken } from '@/utils/auth' +import { blobValidate } from '@/utils/bonus' +import { saveAs } from 'file-saver' + // 下载blob文件 export const downloadFile = ({ fileData, fileType, fileName }) => { const blob = new Blob([fileData], { @@ -24,3 +30,79 @@ export const downloadFileByUrl = (url) => { URL.revokeObjectURL(link.href) document.body.removeChild(link) } + +/** + * 通用文件下载方法(带加载提示) + * @param {string} path - 下载路径 + * @param {string} defaultFileName - 默认文件名(可选,如果响应头没有文件名则使用此名称) + * @param {string} loadingText - 加载提示文本(可选,默认为'正在下载文件,请稍候...') + * @returns {Promise} - 返回 Promise + */ +export const downloadFileWithLoading = (path, defaultFileName = '文件.xlsx', loadingText = '正在下载文件,请稍候...') => { + const baseURL = process.env.VUE_APP_BASE_API + const url = path.startsWith('http') ? path : `${baseURL}/${path}` + + // 显示下载中提示(优化样式) + const downloadLoadingInstance = Loading.service({ + lock: true, // 锁定屏幕,防止用户操作 + text: loadingText, + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.1)', // 稍微降低透明度,更柔和 + customClass: 'download-loading-mask' // 自定义样式类 + }) + + return axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { + 'Authorization': 'Bearer ' + getToken(), + 'encryptResponse':false + } + }).then((res) => { + // 验证是否为blob格式 + const isBlob = blobValidate(res.data) + if (isBlob) { + // 从响应头获取文件名,如果没有则使用默认名称 + const fileName = res.headers['download-filename'] + ? decodeURIComponent(res.headers['download-filename']) + : defaultFileName + + // 创建blob并下载 + const blob = new Blob([res.data], { + type: res.data.type || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + }) + saveAs(blob, fileName) + Message.success('文件下载成功') + return Promise.resolve(fileName) + } else { + // 如果不是blob,尝试解析错误信息 + return printErrMsg(res.data) + } + }).catch((error) => { + console.error('文件下载失败:', error) + Message.error('文件下载失败,请稍后重试') + return Promise.reject(error) + }).finally(() => { + // 关闭加载提示 + if (downloadLoadingInstance) { + downloadLoadingInstance.close() + } + }) +} + +/** + * 打印错误信息 + * @param {Blob} data - 错误响应的blob数据 + */ +async function printErrMsg(data) { + try { + const resText = await data.text() + const rspObj = JSON.parse(resText) + Message.error(rspObj.msg || '下载失败,请稍后重试') + return Promise.reject(new Error(rspObj.msg || '下载失败')) + } catch (e) { + Message.error('下载失败,请稍后重试') + return Promise.reject(e) + } +} diff --git a/src/views/common/ImportExcelDialog.vue b/src/views/common/ImportExcelDialog.vue new file mode 100644 index 0000000..089e0f1 --- /dev/null +++ b/src/views/common/ImportExcelDialog.vue @@ -0,0 +1,410 @@ + + + + + diff --git a/src/views/enterpriseLibrary/technical/components/LeftType.vue b/src/views/enterpriseLibrary/technical/components/LeftType.vue index 920a22f..044785a 100644 --- a/src/views/enterpriseLibrary/technical/components/LeftType.vue +++ b/src/views/enterpriseLibrary/technical/components/LeftType.vue @@ -57,14 +57,14 @@ export default { watch: { value(newVal) { if (newVal) { - this.activeCategory = newVal + this.activeCategory = parseInt(newVal) } }, immediate: true }, mounted() { if (this.value) { - this.activeCategory = this.value; + this.activeCategory = parseInt(this.value); } }, created() { diff --git a/src/views/enterpriseLibrary/technical/components/RightTable.vue b/src/views/enterpriseLibrary/technical/components/RightTable.vue index ce7a055..a0918eb 100644 --- a/src/views/enterpriseLibrary/technical/components/RightTable.vue +++ b/src/views/enterpriseLibrary/technical/components/RightTable.vue @@ -2,13 +2,13 @@
+ :columnsList="columnsList" :request-api="listAPI" :sendParams="sendParams" :autoLoad="false">