| @@ -0,0 +1,326 @@ | |||||
| <template> | |||||
| <!-- 拖拽组件 DnD DragAndDrop --> | |||||
| <!-- 针对移动端draggable不生效的解决方案 父级元素定位必须为 position: relative; --> | |||||
| <!-- 属性 | |||||
| valueKey: 取值属性键名, 默认 value | |||||
| showMask: 是否显示遮罩层, 默认 false | |||||
| --> | |||||
| <!-- 标签参数 | |||||
| touchdraggable: 是否启用拖动, 默认 false | |||||
| touchdroppable: 是否允许放置, 默认 false | |||||
| touchdraggroup: 拖拽分组, 默认 空(不限制), 只有同种分组的允许相互拖拽 | |||||
| --> | |||||
| <!-- 事件 | |||||
| touchdragstart: 开始拖动, 参数(element: 拖动的元素) | |||||
| touchdrop: 结束放置, 参数(src_element: 被拖动的元素, dst_element: 放置的元素, src_data: 被拖动元素的数据, dst_data: 放置元素的数据) | |||||
| touchdropstart: 开始放置, 参数(src_element: 被拖动的元素, dst_element: 放置的元素, src_data: 被拖动元素的数据, dst_data: 放置元素的数据) | |||||
| touchdragcancel: 中止拖动, 参数(element: 拖动的元素) | |||||
| touchdragmotion: 拖动中(坐标改变), 参数(element: 拖动的元素) | |||||
| --> | |||||
| <!-- 插槽 | |||||
| default: 内部元素 | |||||
| mask: 遮罩层内部元素 | |||||
| --> | |||||
| <!-- 事例 | |||||
| <DnD class="preview-cover van-ellipsis" @touchdragstart="drag" @touchdrop="drop" :value="file.index" touchdraggable touchdroppable show-mask="1" value-key="value"> | |||||
| <template #mask>遮罩层内部元素</template> | |||||
| <div>内部元素</div> | |||||
| </DnD> | |||||
| --> | |||||
| <div class="root" | |||||
| @touchstart.stop="Drag($event)" | |||||
| @touchend.stop="Drop($event)" | |||||
| @touchcandel.stop="Cancel($event)" | |||||
| @touchmove.stop="Motion($event)" | |||||
| > | |||||
| <slot name="default"></slot> | |||||
| <div class="mask" v-if="maskVisible" :style="{top: `${maskY}px`, left: `${maskX}px`, 'background-color': maskColor, 'border-color': maskColor}"> | |||||
| <slot name="mask"></slot> | |||||
| </div> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| const STATE_NONE = 0; // 空闲状态 | |||||
| const STATE_START = 1; // 点击后等待完成长按状态 | |||||
| const STATE_DRAGGING = 2; // 长按状态完成, 进入拖拽状态 | |||||
| const HOLD_TIME_LIMIT = 200; // 从点击开始到可以允许拖拽间的最小时间间隔(模拟按住), 以区别于纯点击事件 | |||||
| const HOLD_POSITION_RANGE = 10/*px*/; // 从点击开始到可以允许拖拽间的最小时间间隔(模拟按住), 手指坐标距离开始点击坐标的范围限制, 以区别于手指纯滑动事件 | |||||
| const DRAGGABLE_NAME = 'touchdraggable'; // 允许拖动参数 | |||||
| const DROPPABLE_NAME = 'touchdroppable'; // 允许放置参数 | |||||
| const DRAGGROUP_NAME = 'touchdraggroup'; // 拖拽组名参数 | |||||
| const MASK_COLOR = 'rgba(0, 0, 0, 1)'; // 无放置目标时颜色 | |||||
| const MASK_DROP_COLOR = 'rgba(144,238,144, 1)'; // 有放置目标时颜色 | |||||
| const MASK_FORBID_COLOR = 'rgba(255,69,0, 1)'; // 禁止放置目标时颜色(放置到自身) | |||||
| export default { | |||||
| name: "DnD", | |||||
| props: ['valueKey', 'showMask', ], | |||||
| data() { | |||||
| return { | |||||
| data: null, // 拖动时存储的数据 | |||||
| state: STATE_NONE, // 当前拖拽状态 | |||||
| startX: -1, // 开始点击坐标(client) | |||||
| startY: -1, | |||||
| timerHandler: null, // 模拟按住的定时器 | |||||
| startTime: -1, // 开始点击时间 | |||||
| currentX: -1, // 当前触摸坐标(client) | |||||
| currentY: -1, | |||||
| element: null, // 被拖动的元素 | |||||
| dropElement: null, // 当前可放置的元素 | |||||
| startGlobalX: -1, // 开始点击坐标(page) | |||||
| startGlobalY: -1, | |||||
| maskX: 0, // 遮罩left = pageX - startGlobalX | |||||
| maskY: 0, // 遮罩top = pageY - startGlobalY | |||||
| maskColor: MASK_COLOR, // 遮罩提示颜色 | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| Drag(event) { | |||||
| if(!this.HasAttr(this.GetEventElement(event), DRAGGABLE_NAME)) | |||||
| return; | |||||
| if(this.state !== STATE_NONE) | |||||
| { | |||||
| console.error('Drag', 'Only support single finger!'); | |||||
| return; | |||||
| } | |||||
| this.UpdateMask(event); | |||||
| this.element = this.GetEventElement(event); | |||||
| [this.startX, this.startY] = this.GetEventPosition(event); | |||||
| this.currentX = this.startX; | |||||
| this.currentY = this.startY; | |||||
| this.StartHold(); | |||||
| }, | |||||
| Drop(event) { | |||||
| if(!this.HasAttr(this.GetEventElement(event), DROPPABLE_NAME)) | |||||
| return; | |||||
| if(this.state !== STATE_DRAGGING) | |||||
| { | |||||
| this.Reset(); | |||||
| return; | |||||
| } | |||||
| [this.currentX, this.currentY] = this.GetEventPosition(event); | |||||
| this.dropElement = this.GetCurrentPositionDropElement(event); | |||||
| this.UpdateMask(event, this.HasCurrentPositionDropElement(event)); | |||||
| if(this.dropElement) | |||||
| { | |||||
| this.Log('touchdrop', this.data, this.GetValue(this.dropElement)); | |||||
| this.$emit('touchdrop', this.element, this.dropElement, this.data, this.GetValue(this.dropElement)); | |||||
| } | |||||
| else | |||||
| { | |||||
| this.Log('touchcancel -> touchend'); | |||||
| this.$emit('touchdragcancel', this.element); | |||||
| } | |||||
| this.Reset(); | |||||
| this.state = STATE_NONE; | |||||
| }, | |||||
| Motion(event) { | |||||
| if(this.state === STATE_NONE) | |||||
| { | |||||
| this.Reset(); | |||||
| return; | |||||
| } | |||||
| [this.currentX, this.currentY] = this.GetEventPosition(event); | |||||
| let dropElement = this.GetCurrentPositionDropElement(event); | |||||
| this.UpdateMask(event, this.HasCurrentPositionDropElement(event)); | |||||
| if(dropElement && this.dropElement !== dropElement) | |||||
| { | |||||
| this.Log('touchdropstart', this.dropElement, dropElement); | |||||
| this.$emit('touchdropstart', this.element, dropElement, this.data, this.GetValue(dropElement)); | |||||
| } | |||||
| this.dropElement = dropElement; | |||||
| this.$emit('touchdragmotion', this.element); | |||||
| }, | |||||
| Cancel(event) { | |||||
| if(this.state === STATE_DRAGGING) | |||||
| { | |||||
| this.Log('touchcancel -> touchcancel'); | |||||
| this.$emit('touchdragcancel', this.element); | |||||
| } | |||||
| this.Reset(); | |||||
| }, | |||||
| GetEventElement(event) { | |||||
| return event.target; | |||||
| }, | |||||
| GetEventPosition(event) { | |||||
| let x = event.changedTouches[0].clientX; | |||||
| let y = event.changedTouches[0].clientY; | |||||
| //this.Log('GetEventPosition', x, y); | |||||
| return [x, y]; | |||||
| }, | |||||
| GetEventViewportPosition(event) { | |||||
| let x = event.changedTouches[0].pageX; | |||||
| let y = event.changedTouches[0].pageY; | |||||
| //this.Log('GetEventViewportPosition', x, y); | |||||
| return [x, y]; | |||||
| }, | |||||
| GetElementByPosition(event, x, y) { | |||||
| let arr = document.elementsFromPoint(x, y); | |||||
| if(!arr) | |||||
| return null; | |||||
| let res = null; | |||||
| let srcEle = this.GetEventElement(event); | |||||
| for(let e of arr) | |||||
| { | |||||
| if(this.IsDroppable(srcEle, e)) | |||||
| { | |||||
| res = e; | |||||
| break; | |||||
| } | |||||
| } | |||||
| //this.Log('GetElementByPosition', res, x, y); | |||||
| return res; | |||||
| }, | |||||
| IsDroppable(srcElement, elememt) { | |||||
| let a = this.HasAttr(elememt, DROPPABLE_NAME); | |||||
| if(!a) | |||||
| return false; | |||||
| let e1 = srcElement.getAttribute(DRAGGROUP_NAME); | |||||
| let e2 = elememt.getAttribute(DRAGGROUP_NAME); | |||||
| return e1 == e2; | |||||
| }, | |||||
| Log(what, data) { | |||||
| //console.log(...arguments); | |||||
| //this.DEBUG(); | |||||
| }, | |||||
| StopHold() { | |||||
| if(null !== this.timerHandler) | |||||
| { | |||||
| clearTimeout(this.timerHandler); | |||||
| this.timerHandler = null; | |||||
| } | |||||
| }, | |||||
| StartHold() { | |||||
| this.StopHold(); | |||||
| this.state = STATE_START; | |||||
| this.startTime = Date.now(); | |||||
| this.timerHandler = setTimeout(this.WaitHold, HOLD_TIME_LIMIT); | |||||
| }, | |||||
| WaitHold() { | |||||
| this.timerHandler = null; | |||||
| if(this.state !== STATE_START) | |||||
| { | |||||
| this.Log('state cancel'); | |||||
| this.Reset(); | |||||
| return; | |||||
| } | |||||
| if(!this.CheckPosition()) | |||||
| { | |||||
| this.Log('CheckPosition cancel'); | |||||
| this.Reset(); | |||||
| return; | |||||
| } | |||||
| this.state = STATE_DRAGGING; | |||||
| this.Log('touchdragstart', this.value); | |||||
| this.data = this.GetValue(this.element); | |||||
| this.$emit('touchdragstart', this.element); | |||||
| }, | |||||
| Reset() { | |||||
| this.StopHold(); | |||||
| this.state = STATE_NONE; | |||||
| this.startTime = -1; | |||||
| this.startX = this.startY = -1; | |||||
| this.currentX = this.currentY = -1; | |||||
| this.data = null; | |||||
| this.element = null; | |||||
| this.startGlobalX = this.startGlobalY = -1; | |||||
| this.maskX = this.maskY = 0; | |||||
| this.maskColor = MASK_COLOR; | |||||
| this.dropElement = null; | |||||
| }, | |||||
| CheckPosition() { | |||||
| if(this.startX < 0 || this.startY < 0) | |||||
| return false; | |||||
| if(this.currentX < 0 || this.currentY < 0) | |||||
| return false; | |||||
| let deltaX = this.currentX - this.startX; | |||||
| let deltaY = this.currentY - this.startY; | |||||
| return deltaX * deltaX + deltaY * deltaY <= HOLD_POSITION_RANGE * HOLD_POSITION_RANGE; | |||||
| }, | |||||
| DEBUG() { | |||||
| console.log( | |||||
| `state: ${this.state} | |||||
| start: [${this.startX}, ${this.startY}] | |||||
| startTime: ${this.startTime} | |||||
| timerHandler: ${this.timerHandler} | |||||
| data: ${this.data} | |||||
| current: [${this.currentX}, ${this.currentY}] | |||||
| `); | |||||
| }, | |||||
| HasAttr(element, name) { | |||||
| let a = element.getAttribute(name); | |||||
| return a !== null && a !== undefined; | |||||
| }, | |||||
| GetValue(element) { | |||||
| return element.getAttribute(this._valueKey) | |||||
| }, | |||||
| UpdateMask(event, element) { | |||||
| let [x, y] = this.GetEventViewportPosition(event); | |||||
| if(this.startGlobalX < 0) | |||||
| { | |||||
| this.startGlobalX = x; | |||||
| } | |||||
| if(this.startGlobalY < 0) | |||||
| { | |||||
| this.startGlobalY = y; | |||||
| } | |||||
| this.maskX = x - this.startGlobalX; | |||||
| this.maskY = y - this.startGlobalY; | |||||
| this.maskColor = element > 0 ? MASK_DROP_COLOR : (element < 0 ? MASK_COLOR : MASK_FORBID_COLOR); | |||||
| }, | |||||
| GetCurrentPositionDropElement(event) { | |||||
| let element = this.GetElementByPosition(event, this.currentX, this.currentY); | |||||
| if(element && element !== this.GetEventElement(event)) | |||||
| return element; | |||||
| return null; | |||||
| }, | |||||
| HasCurrentPositionDropElement(event) { | |||||
| let element = this.GetElementByPosition(event, this.currentX, this.currentY); | |||||
| if(!element) | |||||
| return -1; | |||||
| if(element === this.GetEventElement(event)) | |||||
| return 0; | |||||
| return 1; | |||||
| }, | |||||
| }, | |||||
| computed: { | |||||
| _valueKey() { | |||||
| return this.valueKey || 'value'; | |||||
| }, | |||||
| maskVisible() { | |||||
| return !!this.showMask && this.state === STATE_DRAGGING; | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| .root { | |||||
| position: absolute; | |||||
| bottom: 0; | |||||
| top: 0; | |||||
| left: 0; | |||||
| right: 0; | |||||
| background: rgba(0, 0, 0, 0); | |||||
| overflow: visible; | |||||
| } | |||||
| .mask { | |||||
| position: absolute; | |||||
| top: 0; | |||||
| left: 0; | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| background: rgba(0, 0, 0, 1); | |||||
| z-index: 99; | |||||
| opacity: 0.6; | |||||
| border-width: 4px; | |||||
| border-style: solid; | |||||
| } | |||||
| </style> | |||||
| @@ -193,15 +193,6 @@ | |||||
| maxlength="50" | maxlength="50" | ||||
| autocomplete="off" | autocomplete="off" | ||||
| /> | /> | ||||
| <field-select | |||||
| v-model="form.sjly" | |||||
| label="数据来源" | |||||
| value-key="dictLabel" | |||||
| data-key="dictValue" | |||||
| placeholder="选择数据来源" | |||||
| remote-url="/open/zdzh/list/sjly" | |||||
| :on-remote-response="'data'" | |||||
| /> | |||||
| <FieldRadio | <FieldRadio | ||||
| v-model="form.sfbjtjjzzcy" | v-model="form.sfbjtjjzzcy" | ||||
| label="是否本集体经济组织成员" | label="是否本集体经济组织成员" | ||||
| @@ -218,6 +209,17 @@ | |||||
| remote-url="/open/zdzh/list/house_yes_no" | remote-url="/open/zdzh/list/house_yes_no" | ||||
| :on-remote-response="'data'" | :on-remote-response="'data'" | ||||
| /> | /> | ||||
| <field-select | |||||
| v-model="form.sjly" | |||||
| label="数据来源" | |||||
| value-key="dictLabel" | |||||
| data-key="dictValue" | |||||
| placeholder="选择数据来源" | |||||
| remote-url="/open/zdzh/list/sjly" | |||||
| :on-remote-response="'data'" | |||||
| /> | |||||
| <div v-if="showHzxx"> | <div v-if="showHzxx"> | ||||
| <p class="title" style="position:relative;padding-left:10px;line-height:20px;font-size: 16px;margin-left: 3%;margin-bottom: 5px;">户主专用信息</p> | <p class="title" style="position:relative;padding-left:10px;line-height:20px;font-size: 16px;margin-left: 3%;margin-bottom: 5px;">户主专用信息</p> | ||||
| @@ -73,7 +73,7 @@ | |||||
| <template #label> | <template #label> | ||||
| <p style="display: flex;align-items: center;margin-top: 10px;"><img src="../../assets/images/housesteadSurvey/list04.png" alt="" style="margin-right: 5px;">与户主关系:<span style="margin-left: auto;">{{yhzgxfy(item.yhzgx)}}</span> </p> | <p style="display: flex;align-items: center;margin-top: 10px;"><img src="../../assets/images/housesteadSurvey/list04.png" alt="" style="margin-right: 5px;">与户主关系:<span style="margin-left: auto;">{{yhzgxfy(item.yhzgx)}}</span> </p> | ||||
| <p style="display: flex;align-items: center;margin-top: 10px;"><img src="../../assets/images/housesteadSurvey/list04.png" alt="" style="margin-right: 5px;">证件号码:<span style="margin-left: auto;">{{item.zjhm}}</span> </p> | <p style="display: flex;align-items: center;margin-top: 10px;"><img src="../../assets/images/housesteadSurvey/list04.png" alt="" style="margin-right: 5px;">证件号码:<span style="margin-left: auto;">{{item.zjhm}}</span> </p> | ||||
| <p style="display: flex;align-items: center;margin-top: 5px;"><img src="../../assets/images/housesteadSurvey/list05.png" alt="" style="margin-right: 5px;">农户代码:<span style="margin-left: auto;">{{item.nhdm}}</span></p> | |||||
| <!--<p style="display: flex;align-items: center;margin-top: 5px;"><img src="../../assets/images/housesteadSurvey/list05.png" alt="" style="margin-right: 5px;">农户代码:<span style="margin-left: auto;">{{item.nhdm}}</span></p>--> | |||||
| </template> | </template> | ||||
| </van-cell> | </van-cell> | ||||
| <template #right> | <template #right> | ||||
| @@ -181,15 +181,6 @@ | |||||
| maxlength="50" | maxlength="50" | ||||
| autocomplete="off" | autocomplete="off" | ||||
| /> | /> | ||||
| <field-select | |||||
| v-model="form.sjly" | |||||
| label="数据来源" | |||||
| value-key="dictLabel" | |||||
| data-key="dictValue" | |||||
| placeholder="选择数据来源" | |||||
| remote-url="/open/zdzh/list/sjly" | |||||
| :on-remote-response="'data'" | |||||
| /> | |||||
| <FieldRadio | <FieldRadio | ||||
| v-model="form.sfbjtjjzzcy" | v-model="form.sfbjtjjzzcy" | ||||
| label="是否本集体经济组织成员" | label="是否本集体经济组织成员" | ||||
| @@ -206,8 +197,19 @@ | |||||
| remote-url="/open/zdzh/list/house_yes_no" | remote-url="/open/zdzh/list/house_yes_no" | ||||
| :on-remote-response="'data'" | :on-remote-response="'data'" | ||||
| /> | /> | ||||
| <field-select | |||||
| v-model="form.sjly" | |||||
| label="数据来源" | |||||
| value-key="dictLabel" | |||||
| data-key="dictValue" | |||||
| placeholder="选择数据来源" | |||||
| remote-url="/open/zdzh/list/sjly" | |||||
| :on-remote-response="'data'" | |||||
| /> | |||||
| <div v-if="showHzxx"> | <div v-if="showHzxx"> | ||||
| <p class="title" style="position:relative;padding-left:10px;line-height:20px;font-size: 16px;margin-left: 3%;margin-bottom: 5px;">户主专用信息</p> | |||||
| <p class="title" style="position:relative;padding-left:10px;line-height:20px;font-size: 16px;margin-left: 3%;margin-bottom: 5px;">户主扩展信息</p> | |||||
| <FieldRadio | <FieldRadio | ||||
| v-model="form.sfwbh" | v-model="form.sfwbh" | ||||
| @@ -50,7 +50,17 @@ | |||||
| </template> | </template> | ||||
| </van-field> | </van-field> | ||||
| <!-- @delete="deleteFile1"--> | <!-- @delete="deleteFile1"--> | ||||
| <van-uploader v-model="fileList" multiple :after-read="afterRead" @delete="deleteFile1" style="margin-top: 10PX" /> | |||||
| <van-uploader v-model="fileList" multiple :after-read="afterRead" @delete="deleteFile1" style="margin-top: 10PX"> | |||||
| <template #preview-cover="file"> | |||||
| <DnD class="van-ellipsis" @touchdragstart="drag" @touchdrop="drop" :value="file.index" touchdraggable touchdroppable show-mask="1"> | |||||
| <template #mask> | |||||
| <div class="preview-cover"> | |||||
| <img :src="file.url || file.content" class="van-image__img" style="object-fit: cover;"/> | |||||
| </div> | |||||
| </template> | |||||
| </DnD> | |||||
| </template> | |||||
| </van-uploader> | |||||
| <div style="border-top: 1px solid #ededed;margin-top: 10PX;"> | <div style="border-top: 1px solid #ededed;margin-top: 10PX;"> | ||||
| <van-field readonly input-align="right" :border="false" > | <van-field readonly input-align="right" :border="false" > | ||||
| @@ -94,8 +104,10 @@ | |||||
| import { commonUpload , openAdd } from "@/api/sunVillage_info/fixedAssets"; | import { commonUpload , openAdd } from "@/api/sunVillage_info/fixedAssets"; | ||||
| import Cookies from "js-cookie"; | import Cookies from "js-cookie"; | ||||
| import request from '@/utils/request' | import request from '@/utils/request' | ||||
| import DnD from "@/components/DnD"; | |||||
| export default { | export default { | ||||
| name: "certificateList", | name: "certificateList", | ||||
| components: {DnD}, | |||||
| data() { | data() { | ||||
| return { | return { | ||||
| showBuildTime:false, | showBuildTime:false, | ||||
| @@ -140,7 +152,11 @@ | |||||
| console.log(this.openPic) | console.log(this.openPic) | ||||
| var that = this; | var that = this; | ||||
| that.form.openFile = that.openFile2.join(',') | that.form.openFile = that.openFile2.join(',') | ||||
| that.form.openPic = that.openPic2.join(',') | |||||
| //that.form.openPic = that.openPic2.join(',') | |||||
| that.form.openPic = that.fileList | |||||
| .filter((x) => x.url && x.url.startsWith('/api')) | |||||
| .map((x) => x.url.substr(4)) | |||||
| .join(','); | |||||
| openAdd(that.form).then((r1) => { | openAdd(that.form).then((r1) => { | ||||
| if (r1.code == 200){ | if (r1.code == 200){ | ||||
| that.$notify({ type: 'success', message: '新增成功' }); | that.$notify({ type: 'success', message: '新增成功' }); | ||||
| @@ -172,20 +188,42 @@ | |||||
| }); | }); | ||||
| // 此时可以自行将文件上传至服务器 | // 此时可以自行将文件上传至服务器 | ||||
| if (file instanceof Array){//判断是否为数组,单张图片为array,多张为数组,数组返回true否则为false | if (file instanceof Array){//判断是否为数组,单张图片为array,多张为数组,数组返回true否则为false | ||||
| file.map(res=>{ | |||||
| this.openPic.push(res.file); | |||||
| let params1 = new FormData(); | |||||
| params1.append("file", res.file); | |||||
| commonUpload(params1).then((r1) => { | |||||
| this.openPic2.push(r1.fileName); | |||||
| if(false) // 顺序上传 | |||||
| { | |||||
| let SequenceUpload = (list, index) => { | |||||
| if(index >= list.length) | |||||
| return; | |||||
| let res = list[index]; | |||||
| this.openPic.push(res.file); | |||||
| let params1 = new FormData(); | |||||
| params1.append("file", res.file); | |||||
| commonUpload(params1).then((r1) => { | |||||
| this.openPic2.push(r1.fileName); | |||||
| res.url = '/api' + r1.fileName; | |||||
| SequenceUpload(list, index + 1); | |||||
| }) | |||||
| }; | |||||
| SequenceUpload(file, 0); | |||||
| } | |||||
| else | |||||
| { | |||||
| file.map(res=>{ | |||||
| this.openPic.push(res.file); | |||||
| let params1 = new FormData(); | |||||
| params1.append("file", res.file); | |||||
| commonUpload(params1).then((r1) => { | |||||
| this.openPic2.push(r1.fileName); | |||||
| res.url = '/api' + r1.fileName; | |||||
| }) | |||||
| }) | }) | ||||
| }) | |||||
| } | |||||
| }else{ | }else{ | ||||
| this.openPic.push(file); | this.openPic.push(file); | ||||
| let params1 = new FormData(); | let params1 = new FormData(); | ||||
| params1.append("file", file.file); | params1.append("file", file.file); | ||||
| commonUpload(params1).then((r1) => { | commonUpload(params1).then((r1) => { | ||||
| this.openPic2.push(r1.fileName); | this.openPic2.push(r1.fileName); | ||||
| file.url = '/api' + r1.fileName; | |||||
| }) | }) | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -205,7 +243,30 @@ | |||||
| } | } | ||||
| this.openFileList.push({name:file.file.name,type:type}) | this.openFileList.push({name:file.file.name,type:type}) | ||||
| this.openFile.push(file.file); | this.openFile.push(file.file); | ||||
| } | |||||
| }, | |||||
| drag(src_element) { | |||||
| //console.log("drag", event); | |||||
| }, | |||||
| drop(src_element, dst_element, srcData, dstData) { | |||||
| //console.log("drop", event); | |||||
| let srcIndex = parseInt(srcData); | |||||
| let index = parseInt(dstData); | |||||
| //console.log(srcIndex, index,this.fileList); | |||||
| if(srcIndex !== index) | |||||
| { | |||||
| let src = this.fileList[srcIndex]; | |||||
| if(srcIndex > index) | |||||
| { | |||||
| this.fileList.splice(srcIndex, 1); | |||||
| this.fileList.splice(index, 0, src); | |||||
| } | |||||
| else | |||||
| { | |||||
| this.fileList.splice(srcIndex, 1); | |||||
| this.fileList.splice(index, 0, src); | |||||
| } | |||||
| } | |||||
| }, | |||||
| }, | }, | ||||
| } | } | ||||
| </script> | </script> | ||||
| @@ -325,5 +386,17 @@ | |||||
| /deep/ .van-field__error-message{ | /deep/ .van-field__error-message{ | ||||
| display: none; | display: none; | ||||
| } | } | ||||
| .preview-cover { | |||||
| position: absolute; | |||||
| bottom: 0; | |||||
| top: 0; | |||||
| left: 0; | |||||
| right: 0; | |||||
| background: rgba(0, 0, 0, 0); | |||||
| } | |||||
| /deep/ .van-uploader__preview-image { | |||||
| overflow: visible; | |||||
| } | |||||
| } | } | ||||
| </style> | </style> | ||||
| @@ -50,7 +50,17 @@ | |||||
| </template> | </template> | ||||
| </van-field> | </van-field> | ||||
| <!-- @delete="deleteFile1"--> | <!-- @delete="deleteFile1"--> | ||||
| <van-uploader v-model="openPic" multiple :after-read="afterRead" @delete="deleteFile1" style="margin-top: 10PX" /> | |||||
| <van-uploader v-model="openPic" multiple :after-read="afterRead" @delete="deleteFile1" style="margin-top: 10PX" > | |||||
| <template #preview-cover="file"> | |||||
| <DnD class="van-ellipsis" @touchdragstart="drag" @touchdrop="drop" :value="file.index" touchdraggable touchdroppable show-mask="1"> | |||||
| <template #mask> | |||||
| <div class="preview-cover"> | |||||
| <img :src="file.url || file.content" class="van-image__img" style="object-fit: cover;"/> | |||||
| </div> | |||||
| </template> | |||||
| </DnD> | |||||
| </template> | |||||
| </van-uploader> | |||||
| <div style="border-top: 1px solid #ededed;margin-top: 10PX;"> | <div style="border-top: 1px solid #ededed;margin-top: 10PX;"> | ||||
| <van-field readonly input-align="right" :border="false" > | <van-field readonly input-align="right" :border="false" > | ||||
| @@ -94,8 +104,11 @@ | |||||
| import { commonUpload , openEdit , financePublicDetail } from "@/api/sunVillage_info/fixedAssets"; | import { commonUpload , openEdit , financePublicDetail } from "@/api/sunVillage_info/fixedAssets"; | ||||
| import Cookies from "js-cookie"; | import Cookies from "js-cookie"; | ||||
| import request from '@/utils/request' | import request from '@/utils/request' | ||||
| import DnD from "@/components/DnD"; | |||||
| export default { | export default { | ||||
| name: "certificateList", | name: "certificateList", | ||||
| components: {DnD}, | |||||
| data() { | data() { | ||||
| return { | return { | ||||
| showBuildTime:false, | showBuildTime:false, | ||||
| @@ -167,7 +180,11 @@ | |||||
| onSubmit(){ | onSubmit(){ | ||||
| var that = this; | var that = this; | ||||
| that.form.openFile = that.openFile2.join(',') | that.form.openFile = that.openFile2.join(',') | ||||
| that.form.openPic = that.openPic2.join(',') | |||||
| //that.form.openPic = that.openPic2.join(',') | |||||
| that.form.openPic = that.openPic | |||||
| .filter((x) => x.url && x.url.startsWith('/api')) | |||||
| .map((x) => x.url.substr(4)) | |||||
| .join(','); | |||||
| openEdit(that.form).then((r1) => { | openEdit(that.form).then((r1) => { | ||||
| if (r1.code == 200){ | if (r1.code == 200){ | ||||
| that.$notify({ type: 'success', message: '修改成功' }); | that.$notify({ type: 'success', message: '修改成功' }); | ||||
| @@ -197,18 +214,40 @@ | |||||
| duration: 0, | duration: 0, | ||||
| }); | }); | ||||
| if (file instanceof Array){//判断是否为数组,单张图片为array,多张为数组,数组返回true否则为false | if (file instanceof Array){//判断是否为数组,单张图片为array,多张为数组,数组返回true否则为false | ||||
| file.map(res=>{ | |||||
| let params1 = new FormData(); | |||||
| params1.append("file", res.file); | |||||
| commonUpload(params1).then((r1) => { | |||||
| this.openPic2.push(r1.fileName); | |||||
| if(false) // 顺序上传 | |||||
| { | |||||
| let SequenceUpload = (list, index) => { | |||||
| if(index >= list.length) | |||||
| return; | |||||
| let res = list[index]; | |||||
| this.openPic.push(res.file); | |||||
| let params1 = new FormData(); | |||||
| params1.append("file", res.file); | |||||
| commonUpload(params1).then((r1) => { | |||||
| this.openPic2.push(r1.fileName); | |||||
| res.url = '/api' + r1.fileName; | |||||
| SequenceUpload(list, index + 1); | |||||
| }) | |||||
| }; | |||||
| SequenceUpload(file, 0); | |||||
| } | |||||
| else | |||||
| { | |||||
| file.map(res => { | |||||
| let params1 = new FormData(); | |||||
| params1.append("file", res.file); | |||||
| commonUpload(params1).then((r1) => { | |||||
| this.openPic2.push(r1.fileName); | |||||
| res.url = '/api' + r1.fileName; | |||||
| }) | |||||
| }) | }) | ||||
| }) | |||||
| } | |||||
| }else{ | }else{ | ||||
| let params1 = new FormData(); | let params1 = new FormData(); | ||||
| params1.append("file", file.file); | params1.append("file", file.file); | ||||
| commonUpload(params1).then((r1) => { | commonUpload(params1).then((r1) => { | ||||
| this.openPic2.push(r1.fileName); | this.openPic2.push(r1.fileName); | ||||
| file.url = '/api' + r1.fileName; | |||||
| }) | }) | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -228,7 +267,30 @@ | |||||
| } | } | ||||
| this.openFile.push({name:file.file.name,type:type}) | this.openFile.push({name:file.file.name,type:type}) | ||||
| this.openFileList.push(file.file); | this.openFileList.push(file.file); | ||||
| } | |||||
| }, | |||||
| drag(src_element) { | |||||
| //console.log("drag", event); | |||||
| }, | |||||
| drop(src_element, dst_element, srcData, dstData) { | |||||
| //console.log("drop", event); | |||||
| let srcIndex = parseInt(srcData); | |||||
| let index = parseInt(dstData); | |||||
| //console.log(srcIndex, index,this.openPic); | |||||
| if(srcIndex !== index) | |||||
| { | |||||
| let src = this.openPic[srcIndex]; | |||||
| if(srcIndex > index) | |||||
| { | |||||
| this.openPic.splice(srcIndex, 1); | |||||
| this.openPic.splice(index, 0, src); | |||||
| } | |||||
| else | |||||
| { | |||||
| this.openPic.splice(srcIndex, 1); | |||||
| this.openPic.splice(index, 0, src); | |||||
| } | |||||
| } | |||||
| }, | |||||
| }, | }, | ||||
| } | } | ||||
| </script> | </script> | ||||
| @@ -348,5 +410,17 @@ | |||||
| /deep/ .van-field__error-message{ | /deep/ .van-field__error-message{ | ||||
| display: none; | display: none; | ||||
| } | } | ||||
| .preview-cover { | |||||
| position: absolute; | |||||
| bottom: 0; | |||||
| top: 0; | |||||
| left: 0; | |||||
| right: 0; | |||||
| background: rgba(0, 0, 0, 0); | |||||
| } | |||||
| /deep/ .van-uploader__preview-image { | |||||
| overflow: visible; | |||||
| } | |||||
| } | } | ||||
| </style> | </style> | ||||