拖拽批量上传的图片 vue2

vue-simple-uploader实现多文件/文件夹以及可拖拽上传 阅读详情
<template>
    <div>
        <a-modal
            centered
            title="批量上传图片"
            v-model="dataVisible"
            :keyboard="false"
            class="img-modal"
            :mask-closable="maskClosable"
            ref="imgModal"
            @cancel="closemodel"
        >
            <div class="many_pic">
                <input type="file" v-show="false" class="img-file-input" ref="fileInput" multiple :accept="accept" @change="addImg2"/>
                <div class="drag_upload_items" :class="changeclass" style="position: relative">
                    <a-upload-dragger
                        :accept="fileAccept"
                        v-show="showupload"
                        name="file"
                        :multiple="true"
                        :before-upload="()=>false"
                        @change="handleChange"
                        :show-upload-list="false"
                    >
                        <div class="ant-upload-drag-icon">
                            <img  src="~@assets/images/pic_view/drag.png" alt="">
                            <a-button style="height: 31px;width: 111px;font-size: 14px" shape="round" type="primary">添加图片</a-button>
                        </div>
                    </a-upload-dragger>

                    <ul class="img-list" v-if="imgListShow">
                        <li class="img-li" v-for="({ src }, index) in imgList" :key="index">
                            <div class="img-li-inner">
                                <div class="img-wrapper" @mousedown.prevent="dragStart($event, index)" ref="imgWrapperList">
                                    <img class="img" :src="src" ref="imgList"/>
                                    <div class="img-del-btn-wrapper">
                                        <a-button class="img-del-btn" size="small" type="danger" title="删除图片" @click="delImg(index)" @mousedown.stop>删除图片</a-button>
                                    </div>
                                    <div class="img-name">{{items[index] && items[index].supplierPartId}}</div>
                                </div>
                            </div>
                        </li>

                        <li class="img-li">
                            <a-button class="img-add-btn" @click="addImgTip" title="上传图片" v-show="!showupload">
                                <a-icon type="plus" style="font-size: 21px;color: #3D97D4;font-weight: 400"/>
                                添加图片
                            </a-button>
                        </li>
                    </ul>

                    <a-spin style="position: absolute;top: 50%;left: 50%" size="large" v-show="loadings"/>
                </div>

            </div>

            <template #footer>
                <a-button title="保存" type="primary" @click="save" class="footer-btn">保存</a-button>
                <a-button title="清空" class="form-right-btn empty" @click="clearimglist">清空</a-button>
            </template>
        </a-modal>
        <div class="drag-img-outer" v-show="dragShow" ref="dragObj">
            <div class="drag-img-inner">
                <img class="drag-img" :src="dragSrc"/>
            </div>
        </div>
    </div>
</template>

<script>
import ModalMixin from "@/mixins/ModalMixin";
import BaseMsg from "@/tools/BaseMsg";

const getElementToPageTop = element => {
    const { offsetParent, offsetTop } = element;
    return offsetParent ? (getElementToPageTop(offsetParent) + offsetTop) : offsetTop;
};
const getElementToPageLeft = element => {
    const { offsetParent, offsetLeft } = element;
    return offsetParent ? (getElementToPageLeft(offsetParent) + offsetLeft) : offsetLeft;
};
const MODAL_DIALOG_SELECTOR = "[role=dialog]";

export default {
    data() {
        return {
            imgType: ["image/jpeg", "image/png"],
            imgList: [],
            dragShow: false,
            dragSrc: "",
            dragSpeed: 10,
            dragMouseX: null,
            dragMouseY: null,
            dragIndex: null,
            showupload:true,
            changeflag:true,
            items:[],
            hasup:0,
            fileType: ["image/jpeg", "image/png", "image/jpg"],
            loadings:false,
        }
    },
    computed: {
        imgListShow() {
            return this.imgList && this.imgList.length > 0;
        },
        accept() {
            return this.imgType.join(',');
        },
        maxCount() {
            return this.items ? (this.items.length > 10 ? 10 : this.items.length) : 0;
        },
        changeclass(){
            let changeclass = this.changeflag ? "changeclass": ""
            return changeclass
        },
        fileAccept() {
            return this.fileType.length === 0 ? "*" : this.fileType.join(",");
        },
    },
    methods: {
        getItems(e){
            this.items = e
            this.showupload = true
            this.changeflag = true;
            this.hasup = 0;
        },
        //第二种新增
        addImg2({ target: { files, value } }) {
            if (!value) {
                return;
            }
            this.addImg(files)
        },

        // 新增图片
        addImg(files) {
            const { error } = BaseMsg;
            if (files && files.length > 0) {
                const promises = [];
                const length = files.length > this.maxCount ? this.maxCount : files.length;
                for (let i = 0; i < length; i++) {
                    const file = files[i];
                    const { type, size, name } = file;
                    if (!this.imgType.includes(type)) {
                        error('请选择JPG或PNG格式图片');
                        return;
                    }
                    const MAX_FILE_NAME_LENGTH = 128;
                    if (name.length > MAX_FILE_NAME_LENGTH) {
                        error(`文件名称不能超过${MAX_FILE_NAME_LENGTH}个字符`);
                        return;
                    }
                    if (size < 10240) {
                        error('图片需大于10KB');
                        return;
                    }
                    const formData = new FormData();
                    formData.append('reapPicUrl', file);
                    this.loadings = true
                    applyReapPicV2(
                        formData
                    ).then(({data}) => {
                        this.imgList.push({MD5Name:data.md5Name,src:data.url})
                    }).finally(()=> this.loadings = false)
                }
                //Promise.all(promises).then(imgList => this.imgList.push(...imgList));
            }
        },
        // 删除图片
        delImg(index) {
            this.imgList.splice(index, 1);
            if(this.imgList.length ===0){
                this.showupload = true;
                this.changeflag = true;
            }
        },
        save() {
            if (!this.imgListShow) {
                BaseMsg.error("至少上传一张图片");
                return;
            }
            const itemIdList = this.items.map(({ itemId,supplierOrderId }) => ({itemId,supplierOrderId}));
            const fileList = this.imgList.map(e => ({ MD5Name: e.MD5Name }));
            const mergedArray = [];
            let size_sum = 0
            if(itemIdList.length > fileList.length){
                itemIdList.forEach((e,index)=>{
                    if(index < fileList.length){
                        const reapPicUrl = fileList[index];
                        mergedArray.push({ ...reapPicUrl, ...e });
                        //size_sum += reapPicUrl.size
                    }else{
                        const reapPicUrl = fileList[fileList.length -1];
                        mergedArray.push({ ...reapPicUrl, ...e });
                        //size_sum += reapPicUrl.size
                    }
                })
            }else{
                fileList.forEach((reapPicUrl, index) => {
                    const objB = itemIdList[index];
                    mergedArray.push({ ...reapPicUrl, ...objB });
                    //size_sum += reapPicUrl.size
                });
            }

            if(size_sum > 20971520){
                BaseMsg.error("图片总大小超过20M")
            }



            let param = {
                "reapPicApplyReqVOS":mergedArray
            }
            BaseMsg.confirm({
                content: "确认保存?",
                onOk: () => batchBuyerApplyReapPic(
                    param
                ).then(({data}) => {
                    this.$emit("ok");
                    BaseMsg.success("已保存");
                    this.$emit("manyImg",data)
                    this.close();
                })
            });
        },
        show() {
            this.imgList = [];
        },
        addImgTip() {
            if (this.imgList.length < this.maxCount) {
                const { fileInput } = this.$refs;
                if (fileInput) {
                    fileInput.value = "";
                    fileInput.click();
                }
            } else {
                BaseMsg.info("图片文件数不能大于选中的商品数量(一次最多10张)");
            }
        },
        // 开始拖动
        dragStart({ currentTarget, pageX, pageY }, index) {
            const { imgList, dragObj, imgModal } = this.$refs;
            const { src, width, height } = imgList?.[index];
            this.dragSrc = src;
            const pageLeft = getElementToPageLeft(currentTarget);
            const pageTop = getElementToPageTop(currentTarget);
            const imgModalDialog = imgModal.$el.querySelector(MODAL_DIALOG_SELECTOR);
            const { scrollTop, scrollLeft } = imgModalDialog;
            // edge浏览器和其他浏览器不一致
            const bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            const bodyScrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
            dragObj.style.left = `${pageLeft - scrollLeft}px`;
            dragObj.style.top = `${pageTop - scrollTop}px`;
            dragObj.style.width = `${width}px`;
            dragObj.style.height = `${height}px`;
            this.dragShow = true;
            this.dragMouseX = pageX - bodyScrollLeft + scrollLeft - pageLeft;
            this.dragMouseY = pageY - bodyScrollTop + scrollTop - pageTop;
            this.dragIndex = index;
            document.addEventListener("mousemove", this.drag);
            document.addEventListener("mouseup", this.dragEnd);
        },
        // 拖动
        drag($event) {
            debugger
            $event.preventDefault();
            const { $refs: { dragObj, imgModal }, dragMouseX, dragMouseY } = this;
            const { pageX, pageY } = $event;
            const imgModalDialog = imgModal.$el.querySelector(MODAL_DIALOG_SELECTOR);
            const { scrollTop, scrollLeft } = imgModalDialog;
            // edge浏览器和其他浏览器不一致
            const bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            const bodyScrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
            const { offsetHeight } = dragObj;
            const { clientHeight } = document.documentElement;
            const left = pageX - bodyScrollLeft - dragMouseX;
            const top = pageY - bodyScrollTop - dragMouseY;
            // 拖动到边缘
            if (top <= 5) {
                imgModalDialog.scrollTop = scrollTop - this.dragSpeed;
                if (top <= -40) {
                    if (this.dragSpeed < 100) {
                        this.dragSpeed++;
                    }
                } else {
                    this.dragSpeed = 10;
                }
            } else if (top + offsetHeight >= clientHeight - 5) {
                imgModalDialog.scrollTop = scrollTop + this.dragSpeed;
                if (top + offsetHeight >= clientHeight + 40) {
                    if (this.dragSpeed < 100) {
                        this.dragSpeed++;
                    }
                } else {
                    this.dragSpeed = 10;
                }
            } else {
                this.dragSpeed = 10;
            }
            dragObj.style.left = `${left}px`;
            dragObj.style.top = `${top}px`;
        },
        // 拖动结束
        dragEnd($event) {
            $event.preventDefault();
            document.removeEventListener("mousemove", this.drag);
            document.removeEventListener("mouseup", this.dragEnd);
            const { imgWrapperList, dragObj, imgModal } = this.$refs;
            if (dragObj) {
                const { offsetLeft, offsetTop, clientHeight, clientWidth } = dragObj;
                if (imgWrapperList) {
                    let column = 1;
                    let row = 1;
                    const ROW_COUNT = 5;
                    const imgModalDialog = imgModal.$el.querySelector(MODAL_DIALOG_SELECTOR);
                    const { scrollTop, scrollLeft } = imgModalDialog;
                    for (const verticalIndex in imgWrapperList) {
                        if (verticalIndex > 0 && verticalIndex % ROW_COUNT == 0) {
                            const imgWrapper = imgWrapperList[verticalIndex];
                            const top = getElementToPageTop(imgWrapper) - scrollTop;
                            const dragBottom = offsetTop + clientHeight;
                            const imgMiddle = top + imgWrapper.clientHeight / 2;
                            if (dragBottom < imgMiddle) {
                                column = (+verticalIndex) / ROW_COUNT;
                                break;
                            }
                            const tempColumn = Math.floor((imgWrapperList.length - 1) / ROW_COUNT);
                            if (verticalIndex == tempColumn * ROW_COUNT) {
                                column = tempColumn + 1;
                            }
                        }
                    }
                    for (const horizontalIndex in imgWrapperList) {
                        if (horizontalIndex >= ROW_COUNT) {
                            break;
                        }
                        if (horizontalIndex > 0) {
                            const imgWrapper = imgWrapperList[horizontalIndex];
                            const left = getElementToPageLeft(imgWrapper) - scrollLeft;
                            const dragRight = offsetLeft + clientWidth;
                            const imgMiddle = left + imgWrapper.clientWidth / 2;
                            if (dragRight < imgMiddle) {
                                row = +horizontalIndex;
                                break;
                            }
                            if (horizontalIndex == imgWrapperList.length - 1) {
                                row = imgWrapperList.length;
                            } else if (horizontalIndex == ROW_COUNT - 1) {
                                row = ROW_COUNT;
                            }
                        }
                    }
                    let newIndex = (column - 1) * ROW_COUNT + row - 1;
                    if (newIndex >= this.imgList.length) {
                        newIndex = this.imgList.length - 1;
                    }
                    const { dragIndex } = this;
                    const [oldImg] = this.imgList.splice(dragIndex, 1);
                    this.imgList.splice(newIndex, 0, oldImg);
                }
            }
            this.dragShow = false;
        },
        handleChange({file}){
            this.hasup++
            if(this.hasup > 10){
                BaseMsg.error("单次最多可选择10张图片")
            }
            else if(10 > this.hasup && this.hasup > this.maxCount){
                return false
            }else{
                let a = [file]
                this.addImg(a)
                this.showupload = false
                this.changeflag = false;
            }
        },
        closemodel(){
            this.hasup = 0
        },
        clearimglist(){
            this.showupload = true
            this.changeflag = true;
            this.hasup = 0;
            this.imgList = [];
        }
    },
    mounted() {
        const { dragObj } = this.$refs;
        if (dragObj) {
            document.body.appendChild(dragObj);
        }
    },
    beforeDestroy() {
        const { dragObj } = this.$refs;
        if (dragObj) {
            document.body.removeChild(dragObj);
        }
        document.removeEventListener("mousemove", this.drag);
        document.removeEventListener("mouseup", this.dragEnd);
    }
};
</script>

<style lang="less" scoped>
@import "~@assets/less/base-mixin.less";
.img-modal{
    .img-file-tip{
        color: @main-color;
        font-size: 14px;
        margin-bottom: 10px;
    }
    .img-list{
        .clearfix;
        margin: 10px -5px;
        .img-li{
            float: left;
            padding: 5px;
            width: 132px;
            height: 132px;
            margin: 0 5px;
            .img-li-inner{
                border: 1px solid #DDD;
                .radius(5px);
                padding: 5px;
                cursor: pointer;
                .img-wrapper{
                    height: 0;
                    padding-bottom: 100%;
                    display: block;
                    position: relative;
                    text-align: center;
                    .img{
                        position: absolute;
                        top: 0;
                        left: 0;
                        width: 100%;
                        height: 100%;
                    }
                    .img-del-btn-wrapper{
                        position: absolute;
                        top: 0;
                        left: 0;
                        width: 100%;
                        height: 100%;
                        .opacity(0);
                        .baseTransition;
                        .img-del-btn{
                            display: inline-block;
                            vertical-align: middle;
                            z-index: 2;
                        }
                        &::before{
                            content: "";
                            height: 100%;
                            display: inline-block;
                            vertical-align: middle;
                        }
                    }
                    .img-name {
                        position: absolute;
                        bottom: 0;
                        left: 0;
                        right: 0;
                        color: #FFF;
                        background-color: @main-color;
                        padding: 2px 0;
                    }
                }
                &:hover .img-wrapper{
                    &::before{
                        content: "";
                        position: absolute;
                        top: 0;
                        left: 0;
                        width: 100%;
                        height: 100%;
                        background-color: rgba(0, 0, 0, 0.1);
                        z-index: 1;
                    }
                    .img-del-btn-wrapper{
                        .opacity(1);
                    }
                }
            }
        }
    }
}
.drag-img-outer{
    position: fixed;
    overflow: hidden;
    z-index: 9999;
    .opacity(0.7);
    .drag-img-inner{
        width: 100%;
        height: $width;
        .drag-img{
            width: 100%;
            height: $width;
        }
    }
}
.many_pic{
    min-height: 313px;
    width: 100%;
    display: flex;
    flex-direction: column;
    .drag_upload_items{
        flex: 1;
        display: flex;
        span{
            display: block;
            width: 322px;
            height: 173px;
        }
    }

}

.img-add-btn{
    width: 122px;
    height: 122px;
    color: #3D97D4;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}
/deep/ .ant-modal-body .ant-upload-drag{
    background-color: #fff;
}
.drag_icon{
    width: 132px;
    height: 13px;
    font-size: 12px;
    font-family: Microsoft YaHei;
    font-weight: 300;
    color: #999999;
}
.ant-upload-drag-icon{
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    align-items: center;
    height: 80%;
    img {
        width: 31px;
        height: 26px;
    }
}

.changeclass{
    justify-content: center;
    align-items: center;
}

</style>
前端Vue图片上传组件支持单个文件多个文件上传 自定义上传数量 预览删除图片 图片压缩 前端Vue图片上传组件支持单个文件多个文件上传 自定义上传数量 预览删除图片 图片压缩, 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin?console.log('图片上传数组 = ' + JSON.stringify(this.imgList));console.log('图片上传数组 = ' + JSON.stringify(this.imgList));title: '上传进度: ' + res.progress + '%' 阅读详情

相关推荐

vue elementui 实现图片上传后拖拽排序功能

vue elementui 实现图片上传后拖拽排序功能。 1、主要技术栈 vue、elementui、vuedraggable 2、需求分析 产品的要求就是多图上传完后,可以对图片列表进行拖拽排序。本身elementui的el-...

醉逍遥neo的博客 2万+

【vue2+element-ui】el-upload封装多图上传组件

【vue2+element-ui】el-upload封装成可动态限制上传的图片数量、大小,支持删除、显示提示语的组件

XujiRe的博客 1163

vue拖拽上传文件实践

最近有一个上传文件的需求,后来琢磨了半天,上网查找资料,最后终于做出来了。 组件编写 首先,写一个简单的拖拽页面。 <div class="upload"> 拖拽上传 </div> 给一点样式 .upload { margin: 100px auto; width: 400px; height: 400px; border: 2px dashed ...

Guan'Blog 3135

Vue项目中利用webpack的require.context实现批量引入/导入图片

前端项目中难免会有需要几十种icon或者png等类型的图片的情况,如果一个个import未免太过繁琐。使用webpack的 require.context实现vue项目中的批量导入引入图片等静态资源

楚楚梦厦的博客 2375

用Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能

用Vue2实现移动端图片上传、压缩、拖拽删除功能图片上传图片压缩添加拖拽排序、拖拽到指定位置删除功能 之前在公司开发过一段时间的移动端H5页面,有个功能就是要上传图片+压缩。参考了一下网上的方法,外加自己摸索的过程,最终实现了这个功能。后面在家闲的时候又加多了个长按选中图片,并且可以拖拽到指定位置删除的功能。 github地址:代码地址 下面直接进入正题: 图片上传 图片上传用的是HTML的input标签实现的。核心就是把获取到的文件通过FileReader转换成图片,代码如下: <input typ

小瓶邪的博客 1176

图片上传+拖动排序(vue2+elementUI+vuedraggable)

vue2+elementUI+vuedraggable图片上传后可拖曳排序,可放大查看原图和删除图片。拖曳图片改变图片排序。

v-uploader - 基于 Vue2 简洁易用,可批量、拖拽的文件上传插件

v-uploader 基于 Vue2 简洁易用,可批量、拖拽的文件上传插件 Demo、文档 请浏览 English site 国内站点 插件预览 单文件上传带图片预览模式 批量上传,支持拖拽模式 插件安装 npm i v-uploader --save 复制代码在项目入口文件 main.js 中引用插件 import Vue from 'vue' import vUploade...

weixin_34367845的博客 1037

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解)

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解) 大家好,我是菌菌巧乐兹,励志用最简单的语言来讲解程序知识点。

菌菌兹的博客 1669

使用 Vue 3 实现图片拖拽上传功能

前端开发中,用户体验是至关重要的,图像上传是许多 web 应用中经常需要的功能之一。为了提升用户的交互体验,拖拽上传功能可以减少用户的操作步骤,让用户能够更加直观地上传文件。本文将介绍如何使用 Vue 3 和其新的 Composition API (setup 语法糖) 实现一个简单的图片拖拽上传功能。以上就是使用 Vue 3 和 setup 语法糖实现图片拖拽上传功能的完整示例。通过以上步骤,你可以轻松地在你的前端应用中集成这个功能,大幅提高用户的交互体验。现在,我们需要安装额外的库,用于处理文件上传。

有我更精彩的博客 1978

设备树实践:从零构建一个嵌入式板级的设备树描述

本文详细介绍了如何从零开始为嵌入式Linux系统构建设备树(Device Tree),以i.MX6ULL处理器为例,涵盖硬件分析、设备树语法、外设配置及调试技巧。通过实践指导,帮助开发者掌握设备树编写,实现硬件与软件的高效对接,提升嵌入式开发效率。

plum99的博客 305

Linux下自动化解析q7签名文件的有效期与时间戳

本文详细介绍了在Linux环境下自动化解析q7签名文件有效期与时间戳的方法。通过编写高效脚本,开发者可以批量提取签名时间信息,验证签名有效性,并集成到CI/CD流程中。文章提供了完整的脚本实现,包括错误处理、批量处理功能,并解决了常见环境问题,特别适用于国产操作系统如UOS的开发场景。

weixin_30872499的博客 519

图片拖拽上传

功能: 实现图片拖拽上传并能显示拖拽进去的图片 下面是html的页面内容(此例子是在vue中应用,有用到element ui的组件): <div class="aileft"> <div class="dragImg" @dragenter="dragEnter" @dragleave="dragLeave" @dragover...

Mazepk的博客 1494

[渗透测试实战篇-4] RCE漏洞组合拳突破Getshell全解析

本文深入解析RCE漏洞组合拳在渗透测试中的实战应用,通过SSRF、XXE等漏洞串联技术突破Getshell的全过程。文章详细介绍了Java和PHP环境下的漏洞利用差异,以及防御绕过与权限维持的实用技巧,为安全研究人员提供全面的实战指导。

weixin_29211309的博客 350

vue拖拽或点击上传图片

一、预览图 二、实现 点击上传思路:将input的type设置为“file”类型即可上传文件。隐藏该input框,同时点击按钮时,调取该input的点击上传功能。剩下的就是css优化页面了。 拖拽上传思路:通过给拖拽框dropbox绑定拖拽事件,当组件销毁时解绑事件。在拖拽结束,通过event.dataTransfer.files获取上传的文件信息。然后在对文件进行上传服务器操作。 接下来请允许我简单介绍一下各个组件: upload.vue封装了点击上传的逻辑,而进度条则没有做,后期可基于percent

Little_Fishs的博客 3482

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

jacke121的专栏 626

短信验证码逻辑漏洞学习——各种绕过姿势技巧

短信验证码逻辑漏洞学习——各种绕过姿势技巧

记录并分享学习安全的知识点.. 2556

antd vue3 图片上传组件扩展,支持多图上传 图片拖拽排序等

antd vue3 a-upload组件多图上传,图片拖拽排序 multiple=true

苦修的木鱼博客 1819

Python爬虫:实时交通流量数据爬取与路况分析

随着城市化进程的不断推进,交通流量的管理与预测已成为智能交通系统的重要研究方向。交通流量数据不仅为城市交通管理提供了科学依据,还为驾驶员提供了实时路况信息,帮助其做出更加合理的出行决策。通过爬虫技术,我们可以实时获取城市的交通流量数据,从而分析路况,优化交通管理。在这篇博客中,我们将介绍如何使用Python编写一个爬虫来爬取实时交通流量数据,分析道路的交通状况。我们将使用最新的技术工具来构建爬虫,包括。

2201_76125261的博客 1267

Vue 实现图片列表上传,拖拽排序,图片编辑(裁剪,马赛克,翻转等功能)上传用了element-ui组件可不用

Vue 实现图片列表上传,拖拽排序,图片编辑(裁剪,马赛克,翻转等功能)上传用了element-ui组件可不用1、相关插件2、组件如何使用3、效果展示4、imgUpload封装的组件代码 1、相关插件 1、 vue-cropper 裁剪,旋转,放大等功能 2、 vuedraggable 拖拽排序功能 3、element-ui,大家可以用 也可不用 我项目中用了,但是和图片编辑功能无关(但是和图片批量上传有关系,不过也可以自己封装图片上传功能) 2、组件如何使用 1、slot 插槽 自己定义上传图片按钮样式

weixin_40969001的博客 3278

把 SAP S/4HANA 中的 Maintain Email Templates 用好:从模板维护、语言变体、业务绑定到传输治理的完整实践

摘要:SAP邮件模板管理常被低估,实则关乎审批通知、业务提醒等关键输出。官方推荐通过复制标准模板实现自定义,而非直接修改标准内容,以保持核心稳定。模板维护涉及语言变体、业务绑定、数据传输等治理环节,需业务顾问与开发团队协作确保字段来源与渲染逻辑。实施时需注意Fiori配置、权限分配及传输管理,避免测试与生产环境差异。模板设计应平衡灵活性与复杂度,遵循分层测试策略(内容、数据、流程),并建立命名规范以维护资产清晰度。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 67

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

3分钟上手vue2-manage文件上传:从拖拽到预览的全流程实现

vue2-manage是一个基于Vue + Element UI构建的后台管理系统,提供了完整的文件上传功能模块,支持拖拽上传、图片预览、格式验证等核心功能。本文将带你快速掌握如何在vue2-manage项目中实现从文件选择到预览的全流程操作。 ## 快速了解vue2-manage的文件上传组件 vue2-manage采用Element UI的el-upload组件作为基础,在多个业务场景中实

gitblog_00531的博客 846

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Vue操作:实现拖拽及点击上传本地图片

实例:实现拖拽及上传图片 代码如下: <div id="leftContain" style="width: 90%;height: 90%"> <img id="img" class="img" align="center" src=""> <input type="file" @change="uploadImg($event)" ...

weixin_44221475的博客 3408

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

简化文件上传流程:学习如何封装Vue2拖拽上传组件

🖼文件拖拽上传功能现在已经随处可见,大家应该都用过了吧,那么它具体是怎么实现的大家有去了解过吗?今天我们一起来实现一下这个功能,并封装一个拖拽上传组件吧。

Twinkle_sone的博客 1458

vue-quill-editor图片大小的编辑,拖拽,上传视频

vue-quill-editor图片大小的编辑,拖拽,上传视频 在vue组件中注册和使用 <quill-editor v-model="formInline.viewConfig" :options="quillOption"></quill-editor> 在vue组件中引入配置文件 import quillConfig from '@/utils/quill-...

qq_20667737的博客 3870

vue脚手架-上传图片 图片拖拽(draggable)、更新(四)

目录: 一、拖拽 二、更新 先来看下效果,是不是你想要的吧~ 现在把第四张,拖拽到第二张的位置,是以插入的形式进行的哦 开始的时候,预备着就是做个上传、删除的功能,到了后面公司又新增了需求,要求拖拽来改变排序。于是我就想着像这种拖拽的应该会有个插件,然后就找到了这个插件 Vue.Draggable ,我是通过这个来了解draggable的。然后在网上也看了别人的例子,然后很多人的都是把显示图片 添加 删除那些都暴露了出来,意味着我之前写的代码都可能得重写,加上我实现得这个不是就是个上传功能的图片墙,当然

唯心所现,唯识所变 1725

vue上传多张图片,可删除、可拖拽位置

vue后台项目实现图片上传

guairena的博客 2171
上一篇: 点击比如切换按钮,图片所在div变成蓝色
下一篇: echart 折线图 拖拽节点
兔老大的胡萝卜
博客等级 码龄8年 105粉丝 336原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值