vue2 + Lodop 制作可视化设计页面 实现打印设计功能(一)

前言:

        此功能的来源来自于当时需要制作一个便于客户操作的打印设计功能,然后就有了这个项目。这个帖子主要是用于分享与谈论,相互学习。

目标:

  1. 能在vue页面中拖拽组件
  2. 支持批量操作拖动
  3. 通过拖拽组件列表里的组件到page进行添加
  4. 实现多种组件,如文本,图片,表格,网格等
  5. 便于扩展组件
  6. 页面中的单位统一,实现所见即所得
  7. 等等

当全部功能整理完毕后,会把此demo开源

目前效果:

设计

设计页面

预览

预览图片

实现:

组件在页面中的显示与拖拽移动位置

显示主要是使用了在page这个div上相对定位(position: relative;),里面的组件使用绝对定位(position: absolute;)使用top和left来绑定x坐标与y坐标即可。

这里使用了vue中的component标签来v-for动态生成组件,这个具体的后面会说明

<component
          :is="moduleData.type"
          :com="moduleData"
          :class="[moduleData.isSelect && moduleData.config.isChildren? 'active':'']"
          :data-title="moduleData.type"
          :key="moduleData.uuid"
          :val="moduleData"
          class="layer"
        ></component>

拖拽移动主要使用了@mousedown获取点击的元素是否是组件,(这个我就是通过在组件html原始上绑定data-xxx属性来判断的)如果是组件就给组件元素或者在页面上绑定一个mousemove事件(这里选择的是在页面上绑定),当鼠标mouseup时移除事件即可

关键代码:

    handleMouseDown(e){

              // 如果没有选中组件 在画布上点击时需要调用 e.preventDefault() 防止触发 drop 事件
              if(recursionGetSelectCom(this.$vptd.state.page.tempItems).length===0)
                e.preventDefault()


              var target = this.selectTarget(e.target)
              //判断是不是选中了组件,如果是组件不向下执行
              if (target) {
                e.stopPropagation()
                e.preventDefault()
                var uuid = target.getAttribute('data-uuid')
                // 设置选中元素
                this.$vptd.commit('select', {
                  uuid: uuid,
                })
                // 绑定移动事件:除背景图以外的元件才能移动
                let element = recursionGetSelectCom(this.$vptd.state.page.tempItems).filter(i=>i.uuid===uuid)

                if (element.length > 0 && element[0].config.dragable) {
                  //绑定选中com事件
                  this.initmovement(e,element[0]) // 参见 mixins
                  return
                }
              }


              this.hideArea()
              // 获取编辑器的位移信息,每次点击时都需要获取一次。主要是为了方便开发时调试用。
              const rectInfo = this.$refs.edit.getBoundingClientRect()
              this.editorX = rectInfo.x
              this.editorY = rectInfo.y

              const startX = e.clientX
              const startY = e.clientY
              this.start.x = startX - this.editorX
              this.start.y = startY - this.editorY
              // 展示选中区域
              this.isShowArea = true

              const move = (moveEvent) => {
                this.width = Math.abs(moveEvent.clientX - startX)
                this.height = Math.abs(moveEvent.clientY - startY)
                if (moveEvent.clientX < startX) {
                  this.start.x = moveEvent.clientX - this.editorX
                }

                if (moveEvent.clientY < startY) {
                  this.start.y = moveEvent.clientY - this.editorY
                }
              }

              const up = (e) => {
                document.removeEventListener('mousemove', move)
                document.removeEventListener('mouseup', up)

                if (e.clientX === startX && e.clientY === startY) {
                  console.log("鼠标未移动,取消选中")
                  this.$vptd.commit('setSelectElement', [])
                }else {
                  //获取选中的组件然后给选中组件中的isSelect值进行改变
                  console.log("鼠标框选")
                  this.$vptd.commit('setSelectElement', this.getSelectArea())
                }

                this.hideArea()
              }

              document.addEventListener('mousemove', move)
              document.addEventListener('mouseup', up)
            },

通过拖拽组件列表里的组件到page进行添加

其中主要是用了@dragstart与@drop与@dragover方法

组件列表:html

<div class="item"
           :key="index"
           :draggable="true"
           @dragstart="dragStart($event, index)"
           @click="(e) => {addTempItem(e,item)}">
        <span :style="{fontWeight:item.config.isEdit? 'bold':'',fontStyle:item.config.isEdit? '':'italic'}">{{ item.title }}</span>
      </div>

组件列表:js

  methods: {
    // 添加组件
    addTempItem (e, item) {
      this.$vptd.dispatch('addTempItem', item)
    },
    dragStart (ev, index) {
      ev.dataTransfer.setData('index', index)
    }
  },

设计页面html

<div
        :style="{
          height: '100px',
          width: '100px',
    
          }"
        ref="edit"
        class="screen"
        @dragover.prevent="dragOver"
        @drop="dropToAddCom($event)"
        @mousedown="handleMouseDown"
      >
</div>

设计页面js

 dragOver(ev){
              ev.preventDefault()
            },
dropToAddCom(ev){
              ev.preventDefault()
              const rest = this.$refs.edit.getBoundingClientRect();
              this.$vptd.dispatch('addTempItemByIndex',
                { index : ev.dataTransfer.getData('index'),
                          x: Math.round(ev.clientX-rest.x),
                          y :Math.round(ev.clientY-rest.y)
                        })
            },

以上就是组件拖拽添加与在page上的拖拽设计,以上代码都不可直接使用,因为代码不全,仅仅能提供参考,或者自行修改也可

后续的更新等我忙完这段时间了补上。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/729162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网技术-第5章-物联网数据处理

目录 1.物联网数据特征 2.物联网数据处理 &#xff08;1&#xff09;数据清洗 &#xff08;2&#xff09;数据存储 &#xff08;3&#xff09;数据融合 &#xff08;4&#xff09;数据挖掘 3.大数据基本概念 4.云计算基本概念 &#xff08;1&#xff09;背景 &#xf…

leetcode 动态规划 (基础版) 下降路径最小和

题目&#xff1a; 题解&#xff1a; 这题和三角型路径和相似&#xff0c;但这题无法在像哪一题一样通过换一个方向逃避下标特判。所以这道题就写一个下标特判的方案。特殊的下标是每一行的第一个元素和最后一个元素&#xff0c;它们由头上的一个元素和左上和右上中的其中一个…

HTML(17)——圆角和盒子阴影

盒子模型——圆角 作用&#xff1a;设置元素的外边框为圆角 属性名&#xff1a;border-radius 属性值&#xff1a;数字px/百分比 也可以每个角设置不同的效果&#xff0c;从左上角顺时针开始赋值&#xff0c;没有取值的角与对角取值相同。 正圆 给正方形盒子设置圆角属性…

极验行为式验证码适配Harmony 鸿蒙SDK下载

现阶段&#xff0c;越来越多的开发者正在积极加入鸿蒙生态系统。随着更多开发者的参与&#xff0c;早在去年9月&#xff0c;极验就成为首批拥有鸿蒙NEXT内测版本和手机系统测试机会的验证码供应商。 为了提高各开发者及企业客户集成鸿蒙版本行为验4.0的效率&#xff0c;方便大家…

土壤墒情监测系统的工作原理

TH-TS600土壤墒情监测系统是一种能够实时、连续监测土壤湿度和水分状况的设备系统。以下是关于土壤墒情监测系统的详细介绍&#xff1a; 土壤墒情监测系统通常由以下几个部分组成&#xff1a;用于实时监测土壤湿度、温度等关键参数。传感器可以根据需要布置在不同的深度和位置…

OceanMind海睿思参与编写的《数据智能白皮书(2024年)》正式发布!

近日&#xff0c;由中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;牵头和组织&#xff0c;中新赛克海睿思作为TC601-WG16人工智能数据工作组合作伙伴参与编写的《数据智能白皮书&#xff08;2024年&#xff09;》正式发布。 中新赛克的卢云川、…

多波束测线问题

多波束测线问题 问题的背景是海洋测深技术&#xff0c;特别是涉及单波束测深和多波束测深系统。这些系统利用声波传播原理来测量水体深度。 单波束测深系统通过向海底发射声波信号并记录其返回时间来测量水深。该系统的特点是每次只有一个波束打到海底&#xff0c;因此数据分布…

秋招突击——6/17——复习{整理昨天的面试资料}——新作{删除链表倒数第n个节点}

文章目录 引言复习新作删除链表倒数第N个节点题目描述个人实现参考实现 总结 引言 主管面&#xff0c;面的很凄惨&#xff0c;不过无所谓了&#xff0c;我已经尽力了。上午都在整理的面经&#xff0c;没有复习算法&#xff0c;而且这两天要弄一下论文&#xff0c;二十号就要提…

小电流接地系统单向故障仿真分析

基于Matlab/simulink的小电流接地系统单向故障仿真分析&#xff0c;涵盖了中性点不接地系统仿真和中性点经消弧线圈接地系统仿真模型。 在电力系统中&#xff0c;接地方式的选择至关重要。小电流接地系统&#xff0c;也称为非有效接地系统&#xff0c;在发生单相接地故障时&am…

OSPF被动接口配置(华为)

#交换设备 OSPF被动接口配置 一、基本概念 OSPF被动接口&#xff0c;也称为抑制接口&#xff0c;即将路由器某一接口配置为被动接口后&#xff0c;该接口不会再接受和发送OSPF报文 二、使用场景 在路由器与终端相近或者直接相连的一侧配置被动接口 因为OSPF会定期发送报文…

方舟云康亏损收窄:三年近10亿销售成本,平均付费及月活仍大幅承压

《港湾商业观察》施子夫 三度递表后&#xff0c;终于通过聆讯&#xff0c;方舟云康控股有限公司(以下简称&#xff0c;方舟云康)有望近期内挂牌港交所。方舟云康的国内运营主体为广州方舟云康信息科技集团有限公司、广州方舟医药有限公司。 值得关注的是&#xff0c;亏损的难…

每日一题——Python代码实现PAT乙级1082 射击比赛(举一反三+思想解读+逐步优化)四千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码分析 代码步骤 时间复杂度分析 空间复杂度分析 总结 我要更强 时…

Redis精要

一、什么是缓存击穿、缓存穿透、缓存雪崩&#xff1f; 缓存穿透 【针对大量非法访问的请求&#xff0c;缓存中没有&#xff0c;直接访问DB】 缓存穿透指的查询缓存和数据库中都不存在的数据&#xff0c;这样每次请求直接打到数据库&#xff0c;就好像缓存不存在 一样。 对于系…

华测监测预警系统2.2 UserEdit.aspx SQL注入致RCE漏洞复现(CVE-2023-5827)

0x01 产品简介 华测监测预警系统2.2是一套针对地质灾害监测预警的科学、完善平台,实现了地质灾害防治管理的科学化、信息化、标准化和可视化。该系统由上海华测导航技术有限公司开发,主要服务于山体滑坡、地裂缝等地质灾害的自动化预警。 0x02 漏洞概述 华测监测预警系统2…

Linux 之内存管理 -free 和 RSS/RES的意义

一、free -h 计算关系&#xff1a; available free buff/cache total used availbleshared 参数 说明 total 总计物理内存的大小 used 已使用的物理内存的大小 free 可用物理内存有多少 shared 多个进程共享的内存总额 buff/cache 写入和读取 磁盘内存缓冲区的大小 avail…

ECharts 雷达图案例001-自定义节点动画

ECharts 雷达图案例001-自定义节点动画 引言 在数据可视化的领域中&#xff0c;ECharts 提供了一种强大的工具来展示多维数据。本文将介绍如何使用 ECharts 创建一个自定义节点样式的雷达图&#xff0c;让数据展示更加生动和个性化。 效果预览 通过自定义节点样式&#xff…

进军韩国5G市场!移远通信5G模组RG500L-EU率先获得KT、LGU+认证

近日&#xff0c;移远通信工规级5G模组RG500L-EU再传喜讯&#xff0c;率先通过了韩国两大运营商KT和LGU的严格认证。​在此之前&#xff0c;该模组已顺利通过KC认证&#xff08;韩国法规认证&#xff09;&#xff0c;此次再获运营商认证表明&#xff0c;RG500L-EU已完全满足韩国…

服务器权限管理

我们linux服务器上有严格的权限等级&#xff0c;如果权限过高导致误操作会增加服务器的风险。所以对于了解linux系统中的各种权限及要给用户&#xff0c;服务等分配合理的权限十分重要。&#xff08;权限越大&#xff0c;责任越大&#xff09; 1.基本权限 U--user用户,G-group…

AI技术+前端的结合(实现图片识别功能)

随着人工智能技术的不断发展&#xff0c;AI在前端设计页面中的应用变得越来越普遍。比如&#xff1a;在电商平台上&#xff0c;可以利用对象检测技术实现商品的自动识别和分类&#xff1b;人脸识别&#xff1b;车辆检测&#xff1b;图片识别等等......其中一个显著的应用是在图…

Python-面向对象编程(超详细易懂)

面向对象编程&#xff08;oop&#xff09; 面向对象是Python最重要的特性&#xff0c;在Python中一切数据类型都是面向对象的。 面向对象的编程思想&#xff1a;按照真实世界客观事物的自然规律进行分析&#xff0c;客观世界中存在什么样的实体&#xff0c;构建的软件系统就存在…