From eaca9cc0cacf52c3ae88e6ae8fe6e3fdb88480cc Mon Sep 17 00:00:00 2001
From: hyingbo <1363390067@qq.com>
Date: 星期五, 30 五月 2025 17:38:17 +0800
Subject: [PATCH] 添加文件上传下载功能

---
 src/views/base/FileDownAndImport.vue             |  178 +++++++++++++++++++++++++++++
 src/views/base/modules/file/FileImportModule.vue |  152 +++++++++++++++++++++++++
 2 files changed, 330 insertions(+), 0 deletions(-)

diff --git a/src/views/base/FileDownAndImport.vue b/src/views/base/FileDownAndImport.vue
new file mode 100644
index 0000000..c6ae250
--- /dev/null
+++ b/src/views/base/FileDownAndImport.vue
@@ -0,0 +1,178 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鏂囦欢鍚嶇О">
+              <j-input placeholder="璇疯緭鍏ユ枃浠跺悕绉�" v-model="queryParam.fileName"></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd()" type="primary" icon="import">涓婁紶</a-button>
+
+      <a-table
+        ref="table"
+        size="middle"
+
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleDownload(record)">涓嬭浇</a>
+          <a-divider type="vertical" />
+          <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record.id)">
+              <a>鍒犻櫎</a>
+            </a-popconfirm>
+        </span>
+      </a-table>
+    </div>
+    <file-import-module ref="fileImportModule" @ok="getTreeDataByApi" />
+  </a-card>
+</template>
+
+<script>
+
+import '@/assets/less/TableExpand.less'
+import { mixinDevice } from '@/utils/mixin'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import { downFile } from '@/api/manage'
+import FileImportModule from '@views/base/modules/file/FileImportModule'
+
+export default {
+  name: 'FileDownAndImport',
+  mixins:[JeecgListMixin, mixinDevice],
+  components: {
+    FileImportModule
+  },
+  data () {
+    return {
+      description: '鏂囦欢鍒楄〃',
+      // 琛ㄥご
+      columns: [
+        {
+          title: '#',
+          dataIndex: '',
+          key:'rowIndex',
+          width:60,
+          align:"center",
+          customRender:function (t,r,index) {
+            return parseInt(index)+1;
+          }
+        },
+        {
+          title:'鏂囦欢鍚嶇О',
+          align:"center",
+          dataIndex: 'fileName'
+        },
+        {
+          title:'鏂囨。鍚庣紑',
+          align:"center",
+          dataIndex: 'fileSuffix'
+        },
+        {
+          title:'涓婁紶浜�',
+          align:"center",
+          dataIndex: 'createBy_dictText'
+        },
+        {
+          title:'涓婁紶鏃堕棿',
+          align:"center",
+          dataIndex: 'createTime'
+        },
+        {
+          title: '鎿嶄綔',
+          dataIndex: 'action',
+          align:"center",
+          fixed:"right",
+          width:147,
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      url: {
+        list: "/nc/doc/list",
+        delete: "/nc/doc/delete",
+        download: "/nc/doc/download",
+      },
+      dictOptions:{},
+      superFieldList:[],
+    }
+  },
+  created() {
+    this.getSuperFieldList();
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    },
+  },
+  methods: {
+    initDictConfig(){
+    },
+    handleOk() {
+      this.loadData();
+    },
+    getSuperFieldList(){
+      let fieldList=[];
+      fieldList.push({type:'string',value:'fileName',text:'鏂囦欢鍚嶇О',dictCode:''})
+      this.superFieldList = fieldList
+    },
+    // 涓嬭浇褰撳墠鍙抽敭閫変腑鏂囨。
+    handleDownload(record) {
+      const that = this
+      downFile(this.url.download, { id: record.id })
+        .then(res => {
+          if (!res) {
+            this.$message.warning('鏂囦欢涓嬭浇澶辫触')
+            return
+          } else {
+            let fileName = record.fileName  + "." + record.fileSuffix;
+            if (typeof window.navigator.msSaveBlob !== 'undefined') {
+              window.navigator.msSaveBlob(new Blob([res]), fileName);
+            } else {
+              let url = window.URL.createObjectURL(new Blob([res]));
+              let link = document.createElement('a');
+              link.style.display = 'none';
+              link.href = url;
+              link.setAttribute('download', fileName);
+              document.body.appendChild(link);
+              link.click()
+              document.body.removeChild(link) //涓嬭浇瀹屾垚绉婚櫎鍏冪礌
+              window.URL.revokeObjectURL(url) //閲婃斁鎺塨lob瀵硅薄
+            }
+          }
+        })
+    },
+    handleAdd() {
+      this.$refs.fileImportModule.upload();
+      this.$refs.fileImportModule.title="瀵煎叆"
+    },
+    getTreeDataByApi(){
+      this.loadData();
+    }
+  }
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/src/views/base/modules/file/FileImportModule.vue b/src/views/base/modules/file/FileImportModule.vue
new file mode 100644
index 0000000..a259c4c
--- /dev/null
+++ b/src/views/base/modules/file/FileImportModule.vue
@@ -0,0 +1,152 @@
+<template>
+  <a-modal :title="title" :visible="visible" @cancel="handleModalClose" :maskClosable="false">
+    <a-upload :multiple="true" :file-list="fileList" :remove="handleRemove" :before-upload="beforeUpload" >
+      <a-button type="primary" :disabled="uploading">
+        <a-icon type="import"/>
+        閫夊彇鏂囦欢
+      </a-button>
+    </a-upload>
+
+    <template slot="footer">
+      <a-button @click="handleModalClose">鍙栨秷</a-button>
+      <a-button
+        id="custom-upload-button"
+        type="primary"
+        :disabled="fileList.length === 0"
+        :loading="uploading"
+        @click="handleUpload"
+      >
+        纭
+      </a-button>
+    </template>
+
+  </a-modal>
+</template>
+
+<script>
+import JUpload from '@/components/jeecg/JUpload'
+import { getAction, postAction, uploadAction } from '@/api/manage'
+
+export default {
+  name: 'FileImportModule',
+  components: {
+    JUpload,
+  },
+  data() {
+    return {
+      visible: false,
+      title: '',
+      id:'',
+      fileList: [],
+      uploadParams: {},
+      uploading: false,
+      isUploadMultiple: true,
+      currentDeviceDocClassCode: 'SEND',
+      currentTitleAfterClass: '',
+
+      url: {
+        add: "/nc/doc/add",
+      }
+    }
+  },
+
+  created() {
+  },
+  methods: {
+
+    /**
+     * 閫夋嫨濂芥枃浠剁偣鍑荤‘瀹氬悗
+     * @param file 鏂囦欢瀵硅薄
+     */
+    beforeUpload(file) {
+      if (this.isUploadMultiple) {
+        if (!this.fileList.find(item => item.name === file.name)) this.fileList = [...this.fileList, file]
+      } else this.fileList.splice(0, 1, file)
+      return false
+    },
+
+    /**
+     * 鍒犻櫎鏂囦欢鍒楄〃椤规椂瑙﹀彂
+     * @param file 鏂囦欢瀵硅薄
+     */
+    handleRemove(file) {
+      const index = this.fileList.indexOf(file)
+      const newFileList = this.fileList.slice()
+      newFileList.splice(index, 1)
+      this.fileList = newFileList
+    },
+
+    // 鎺у埗鏂囦欢涓婁紶绐楀彛鍏抽棴骞舵竻绌烘枃浠跺垪琛�
+    handleModalClose() {
+      this.visible = false
+      this.fileList = []
+    },
+
+    upload(){
+      this.isUploadMultiple = true
+      this.visible = true
+    },
+    handleUpload() {
+      const { fileList, $notification, handleModalClose} = this
+      this.uploading = true
+      let uploadedFileCount = 0
+      let uploadSuccessFileCount = 0
+      if (this.fileList.length === 0) {
+        this.$message.info("璇蜂笂浼犳枃浠�")
+        this.uploading = false;
+      }
+      fileList.forEach((file, index) => {
+        const formData = new FormData()
+        formData.append('file', file)
+        uploadAction(this.url.add, formData).then(res => {
+          if (res.success) {
+            file.status = 'done'
+            uploadSuccessFileCount++
+            $notification.success({
+              message: '娑堟伅',
+              description: res.message
+            })
+          } else {
+            file.status = 'error'
+            $notification.error({
+              message: '娑堟伅',
+              description: res.message
+            })
+          }
+        })
+          .catch(err => {
+            file.status = 'error'
+          })
+          .finally(() => {
+            uploadedFileCount++
+            fileList.splice(index, 1, file)
+            if (uploadedFileCount === fileList.length) {
+              if (uploadSuccessFileCount > 0) {
+                this.$emit('ok')
+              }
+              // 褰撴枃浠跺叏閮ㄤ笂浼犲畬鎴愬悗
+              if (uploadSuccessFileCount === fileList.length) {
+                handleModalClose();
+              }
+              this.uploading = false
+            }
+          })
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+/deep/ .ant-btn-primary#custom-upload-button {
+  color: #fff;
+  background-color: #67C23A;
+  border-color: #67C23A;
+
+  &[disabled] {
+    color: rgba(0, 0, 0, 0.25);
+    background-color: #f5f5f5;
+    border-color: #d9d9d9;
+  }
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3