From c172f50f28cb37b982eb39a0a9a257cbc60b3a3e Mon Sep 17 00:00:00 2001
From: zhangherong <571457620@qq.com>
Date: 星期二, 18 三月 2025 18:04:53 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/components/jeecg/LxUpload.vue |  452 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 452 insertions(+), 0 deletions(-)

diff --git a/src/components/jeecg/LxUpload.vue b/src/components/jeecg/LxUpload.vue
new file mode 100644
index 0000000..6f47e6f
--- /dev/null
+++ b/src/components/jeecg/LxUpload.vue
@@ -0,0 +1,452 @@
+<template>
+  <div :id="containerId" style="position: relative">
+
+    <!--  ---------------------------- begin 鍥剧墖宸﹀彸鎹綅缃� ------------------------------------- -->
+    <div class="movety-container" :style="{top:top+'px',left:left+'px',display:moveDisplay}"
+         style="padding:0 8px;position: absolute;z-index: 91;height: 32px;width: 104px;text-align: center;">
+      <div :id="containerId+'-mover'" :class="showMoverTask?'uploadty-mover-mask':'movety-opt'"
+           style="margin-top: 12px">
+        <a @click="moveLast" style="margin: 0 5px;">
+          <a-icon type="arrow-left" style="color: #fff;font-size: 16px" />
+        </a>
+        <a @click="moveNext" style="margin: 0 5px;">
+          <a-icon type="arrow-right" style="color: #fff;font-size: 16px" />
+        </a>
+      </div>
+    </div>
+    <!--  ---------------------------- end 鍥剧墖宸﹀彸鎹綅缃� ------------------------------------- -->
+
+    <a-upload
+      name="file"
+      :multiple="multiple"
+      :action="uploadAction"
+      :headers="headers"
+      :data="{'biz':bizPath}"
+      :fileList="fileList"
+      :beforeUpload="doBeforeUpload"
+      @change="handleChange"
+      :disabled="disabled"
+      :listType="complistType"
+      @preview="handlePreview"
+      :class="{'uploadty-disabled':disabled}">
+      <template>
+        <div v-if="isImageComp">
+          <a-icon type="plus" />
+          <div class="ant-upload-text">{{ text }}</div>
+        </div>
+        <a-button v-else-if="buttonVisible">
+          <a-icon type="upload" />
+          {{ text }}
+        </a-button>
+      </template>
+    </a-upload>
+    <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
+      <img alt="example" style="width: 100%" :src="previewImage" />
+    </a-modal>
+  </div>
+</template>
+
+<script>
+
+import Vue from 'vue'
+import { ACCESS_TOKEN } from '@/store/mutation-types'
+import { getFileAccessHttpUrl } from '@/api/manage'
+
+const FILE_TYPE_ALL = 'all'
+const FILE_TYPE_IMG = 'image'
+const FILE_TYPE_TXT = 'file'
+const uidGenerator = () => {
+  return '-' + parseInt(Math.random() * 10000 + 1, 10)
+}
+const getFileName = (path) => {
+  if (path.lastIndexOf('\\') >= 0) {
+    let reg = new RegExp('\\\\', 'g')
+    path = path.replace(reg, '/')
+  }
+  return path.substring(path.lastIndexOf('/') + 1)
+}
+export default {
+  name: 'LXUpload',
+  data() {
+    return {
+      uploadAction: window._CONFIG['domianURL'] + '/eam/sysFiles/upload',
+      headers: {},
+      fileList: [],
+      newFileList: [],
+      uploadGoOn: true,
+      previewVisible: false,
+      //---------------------------- begin 鍥剧墖宸﹀彸鎹綅缃� -------------------------------------
+      previewImage: '',
+      containerId: '',
+      top: '',
+      left: '',
+      moveDisplay: 'none',
+      showMoverTask: false,
+      moverHold: false,
+      currentImg: ''
+      //---------------------------- end 鍥剧墖宸﹀彸鎹綅缃� -------------------------------------
+    }
+  },
+  props: {
+    text: {
+      type: String,
+      required: false,
+      default: '鐐瑰嚮涓婁紶'
+    },
+    fileType: {
+      type: String,
+      required: false,
+      default: FILE_TYPE_ALL
+    },
+    /*杩欎釜灞炴�х敤浜庢帶鍒舵枃浠朵笂浼犵殑涓氬姟璺緞*/
+    bizPath: {
+      type: String,
+      required: false,
+      default: 'temp'
+    },
+    value: {
+      type: [String, Array],
+      required: false
+    },
+    // update-begin- --- author:wangshuai ------ date:20190929 ---- for:Jupload缁勪欢澧炲姞鏄惁鑳藉鐐瑰嚮
+    disabled: {
+      type: Boolean,
+      required: false,
+      default: false
+    },
+    // update-end- --- author:wangshuai ------ date:20190929 ---- for:Jupload缁勪欢澧炲姞鏄惁鑳藉鐐瑰嚮
+    //姝ゅ睘鎬ц搴熷純浜�
+    triggerChange: {
+      type: Boolean,
+      required: false,
+      default: false
+    },
+    /**
+     * update -- author:lvdandan -- date:20190219 -- for:Jupload缁勪欢澧炲姞鏄惁杩斿洖url锛�
+     * true锛氫粎杩斿洖url
+     * false锛氳繑鍥瀎ileName filePath fileSize
+     */
+    // returnUrl: {
+    //   type: Boolean,
+    //   required: false,
+    //   default: true
+    // },
+    number: {
+      type: Number,
+      required: false,
+      default: 0
+    },
+    buttonVisible: {
+      type: Boolean,
+      required: false,
+      default: true
+    },
+    multiple: {
+      type: Boolean,
+      default: true
+    },
+    beforeUpload: {
+      type: Function
+    }
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler() {
+        let val = this.value
+        if (val instanceof Array) {
+          this.initFileListArr(val)
+        } else {
+          this.initFileList(val)
+        }
+      }
+    }
+  },
+  computed: {
+    isImageComp() {
+      return this.fileType === FILE_TYPE_IMG
+    },
+    complistType() {
+      return this.fileType === FILE_TYPE_IMG ? 'picture-card' : 'text'
+    }
+  },
+  created() {
+    const token = Vue.ls.get(ACCESS_TOKEN)
+    //---------------------------- begin 鍥剧墖宸﹀彸鎹綅缃� -------------------------------------
+    this.headers = { 'X-Access-Token': token }
+    this.containerId = 'container-ty-' + new Date().getTime()
+    //---------------------------- end 鍥剧墖宸﹀彸鎹綅缃� -------------------------------------
+  },
+
+  methods: {
+    initFileListArr(val) {
+      if (!val || val.length == 0) {
+        this.fileList = []
+        return
+      }
+      let fileList = []
+      for (var a = 0; a < val.length; a++) {
+        let url = getFileAccessHttpUrl(val[a].filePath)
+        fileList.push({
+          uid: uidGenerator(),
+          name: val[a].fileName,
+          status: 'done',
+          url: url,
+          response: {
+            status: 'history',
+            message: val[a].filePath
+          }
+        })
+      }
+      this.fileList = fileList
+    },
+    initFileList(paths) {
+      if (!paths || paths.length == 0) {
+        //return [];
+        // update-begin- --- author:os_chengtgen ------ date:20190729 ---- for:issues:326,Jupload缁勪欢鍒濆鍖朾ug
+        this.fileList = []
+        return
+        // update-end- --- author:os_chengtgen ------ date:20190729 ---- for:issues:326,Jupload缁勪欢鍒濆鍖朾ug
+      }
+      let fileList = []
+      let arr = paths.split(',')
+      for (var a = 0; a < arr.length; a++) {
+        let url = getFileAccessHttpUrl(arr[a])
+        fileList.push({
+          uid: uidGenerator(),
+          name: getFileName(arr[a]),
+          status: 'done',
+          url: url,
+          response: {
+            status: 'history',
+            message: arr[a]
+          }
+        })
+      }
+      this.fileList = fileList
+    },
+    doBeforeUpload(file) {
+      this.uploadGoOn = true
+      var fileType = file.type
+      if (this.fileType === FILE_TYPE_IMG) {
+        if (fileType.indexOf('image') < 0) {
+          this.$message.warning('璇蜂笂浼犲浘鐗�')
+          this.uploadGoOn = false
+          return false
+        }
+      }
+      // 鎵╁睍 beforeUpload 楠岃瘉
+      if (typeof this.beforeUpload === 'function') {
+        return this.beforeUpload(file)
+      }
+      return true
+    },
+    handleChange(info) {
+      console.log('--鏂囦欢鍒楄〃鏀瑰彉--')
+      if (!info.file.status && this.uploadGoOn === false) {
+        info.fileList.pop()
+      }
+      let fileList = info.fileList
+      if (info.file.status === 'done') {
+        if (this.number > 0) {
+          fileList = fileList.slice(-this.number)
+        }
+        if (info.file.response.success) {
+          fileList = fileList.map((file) => {
+            if (file.response) {
+              let reUrl = file.response.result.filePath;
+              file.url = getFileAccessHttpUrl(reUrl)
+            }
+            return file
+          })
+        }
+        //this.$message.success(`${info.file.name} 涓婁紶鎴愬姛!`);
+      } else if (info.file.status === 'error') {
+        this.$message.error(`${info.file.name} 涓婁紶澶辫触.`)
+      } else if (info.file.status === 'removed') {
+        this.handleDelete(info.file)
+      }
+      this.fileList = fileList
+      if (info.file.status === 'done' || info.file.status === 'removed') {
+        //returnUrl涓篺alse鏃惰繑鍥炴枃浠跺悕绉般�佹枃浠惰矾寰勫強鏂囦欢澶у皬
+        this.newFileList = []
+        for (var a = 0; a < fileList.length; a++) {
+          // update-begin-author:lvdandan date:20200603 for:銆怲ESTA-514銆戙�愬紑婧恑ssue銆戝涓枃浠跺悓鏃朵笂浼犳椂锛屾帶鍒跺彴鎶ラ敊
+          if (fileList[a].status === 'done') {
+            let fileJson = {
+              fileName: fileList[a].name,
+              filePath: fileList[a].response.result.filePath,
+              fileSize: fileList[a].size,
+              fileEncodeName: fileList[a].response.result.fileEncodeName,
+              fileSuffix: fileList[a].response.result.fileSuffix,
+            }
+            this.newFileList.push(fileJson)
+          } else {
+            return
+          }
+          // update-end-author:lvdandan date:20200603 for:銆怲ESTA-514銆戙�愬紑婧恑ssue銆戝涓枃浠跺悓鏃朵笂浼犳椂锛屾帶鍒跺彴鎶ラ敊
+        }
+        this.$emit('change', this.newFileList)
+      }
+    },
+    handleDelete(file) {
+      //濡傛湁闇�瑕佹柊澧� 鍒犻櫎閫昏緫
+      console.log(file)
+    },
+    handlePreview(file) {
+      if (this.fileType === FILE_TYPE_IMG) {
+        this.previewImage = file.url || file.thumbUrl
+        this.previewVisible = true
+      } else {
+        location.href = file.url
+      }
+    },
+    handleCancel() {
+      this.previewVisible = false
+    },
+    //---------------------------- begin 鍥剧墖宸﹀彸鎹綅缃� -------------------------------------
+    moveLast() {
+      //console.log(ev)
+      //console.log(this.fileList)
+      //console.log(this.currentImg)
+      let index = this.getIndexByUrl()
+      if (index == 0) {
+        this.$message.warn('鏈煡鐨勬搷浣�')
+      } else {
+        let curr = this.fileList[index].url
+        let last = this.fileList[index - 1].url
+        let arr = []
+        for (let i = 0; i < this.fileList.length; i++) {
+          if (i == index - 1) {
+            arr.push(curr)
+          } else if (i == index) {
+            arr.push(last)
+          } else {
+            arr.push(this.fileList[i].url)
+          }
+        }
+        this.currentImg = last
+        this.$emit('change', arr.join(','))
+      }
+    },
+    moveNext() {
+      let index = this.getIndexByUrl()
+      if (index == this.fileList.length - 1) {
+        this.$message.warn('宸插埌鏈�鍚巭')
+      } else {
+        let curr = this.fileList[index].url
+        let next = this.fileList[index + 1].url
+        let arr = []
+        for (let i = 0; i < this.fileList.length; i++) {
+          if (i == index + 1) {
+            arr.push(curr)
+          } else if (i == index) {
+            arr.push(next)
+          } else {
+            arr.push(this.fileList[i].url)
+          }
+        }
+        this.currentImg = next
+        this.$emit('change', arr.join(','))
+      }
+    },
+    getIndexByUrl() {
+      for (let i = 0; i < this.fileList.length; i++) {
+        if (this.fileList[i].url === this.currentImg || encodeURI(this.fileList[i].url) === this.currentImg) {
+          return i
+        }
+      }
+      return -1
+    }
+  },
+  mounted() {
+    const moverObj = document.getElementById(this.containerId + '-mover')
+    if (moverObj) {
+      moverObj.addEventListener('mouseover', () => {
+        this.moverHold = true
+        this.moveDisplay = 'block'
+      })
+      moverObj.addEventListener('mouseout', () => {
+        this.moverHold = false
+        this.moveDisplay = 'none'
+      })
+    }
+
+    let picList = document.getElementById(this.containerId) ? document.getElementById(this.containerId).getElementsByClassName('ant-upload-list-picture-card') : []
+    if (picList && picList.length > 0) {
+      picList[0].addEventListener('mouseover', (ev) => {
+        ev = ev || window.event
+        let target = ev.target || ev.srcElement
+        if ('ant-upload-list-item-info' == target.className) {
+          this.showMoverTask = false
+          let item = target.parentElement
+          this.left = item.offsetLeft
+          this.top = item.offsetTop + item.offsetHeight - 50
+          this.moveDisplay = 'block'
+          this.currentImg = target.getElementsByTagName('img')[0].src
+        }
+
+      })
+
+      picList[0].addEventListener('mouseout', (ev) => {
+        ev = ev || window.event
+        let target = ev.target || ev.srcElement
+        //console.log('绉婚櫎',target)
+        if ('ant-upload-list-item-info' == target.className) {
+          this.showMoverTask = true
+          setTimeout(() => {
+            if (this.moverHold === false) {
+              this.moveDisplay = 'none'
+            }
+          }, 100)
+        }
+        if ('ant-upload-list-item ant-upload-list-item-done' == target.className || 'ant-upload-list ant-upload-list-picture-card' == target.className) {
+          this.moveDisplay = 'none'
+        }
+      })
+      //---------------------------- end 鍥剧墖宸﹀彸鎹綅缃� -------------------------------------
+    }
+  },
+  model: {
+    prop: 'value',
+    event: 'change'
+  }
+}
+</script>
+
+<style lang="less">
+.uploadty-disabled {
+  .ant-upload-list-item {
+    .anticon-close {
+      display: none;
+    }
+
+    .anticon-delete {
+      display: none;
+    }
+  }
+
+  /*update-begin-author:taoyan date:2022-12-5 for: issues/4250 寤鸿JUpload缁勪欢锛宒isabled涓簍rue鐨勬椂鍊欎笂浼燽utton鑳藉鍙樼伆鎴栬�呭叾浠栨牱寮忓浘妗堬紝渚夸簬鐭ユ檽鏃犳硶鍐嶇偣鍑讳笂浼�*/
+
+  .ant-btn, .ant-upload-disabled {
+    cursor: not-allowed;
+    color: rgba(0, 0, 0, 0.25);
+    background-color: #f5f5f5;
+    border-color: #d9d9d9;
+  }
+
+  /*update-end-author:taoyan date:2022-12-5 for: issues/4250 寤鸿JUpload缁勪欢锛宒isabled涓簍rue鐨勬椂鍊欎笂浼燽utton鑳藉鍙樼伆鎴栬�呭叾浠栨牱寮忓浘妗堬紝渚夸簬鐭ユ檽鏃犳硶鍐嶇偣鍑讳笂浼�*/
+
+}
+
+//---------------------------- begin 鍥剧墖宸﹀彸鎹綅缃� -------------------------------------
+.uploadty-mover-mask {
+  background-color: rgba(0, 0, 0, 0.5);
+  opacity: .8;
+  color: #fff;
+  height: 28px;
+  line-height: 28px;
+}
+
+//---------------------------- end 鍥剧墖宸﹀彸鎹綅缃� -------------------------------------
+</style>
\ No newline at end of file

--
Gitblit v1.9.3