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 @@
+
+