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

历史:

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

前言:

之前本来打算用直接拿之前做的vue2版本改改就发的,但考虑到现在主流都是vue3了,所以从这篇文章开始使用vue3来写,以及最后的demo也使用vue3

考虑到之前发的一些点过于分散,这篇开始打算就从头开始写这个功能,每篇最后发个本篇的示例demo

主要技术栈:vue3+vite+pinia+less+typescript

目录:

  1. 项目创建及模块定义,简单实现拖拽新增
  2. 组件点击拖拽移动
  3. 新增第一个自定义组件-HPText(文本组件)
  4. 新增HPText组件的菜单,组件菜单设置时组件动态变化
  5. 框选组件,批量移动
  6. 引入lodop,打印预览
  7. 待定...

正文:

创建vue3+vite项目

这个不用多说了,不属于本系列的范围

项目目录

最后项目创建后的目录大概长这样

定义设计页面viewport

<script setup lang="ts">
import {ref,h,resolveComponent} from 'vue'
import {QYComponent} from "../../../domains/qy-component.ts";const edit = ref(null)
const page = ref({height: 560,width: 944,
})const widgetStore = ref<QYComponent[]>([])const 测试数据 = [{uuid:'123',attr: {x: 10,y: 10,width: 90,height: 20,},
}]const dropToAddCom = (ev) => {ev.preventDefault()const rest = edit.value.getBoundingClientRect();测试数据[0].attr.x = Math.round(ev.clientX - rest.x)测试数据[0].attr.y = Math.round(ev.clientY - rest.y)widgetStore.value = [...测试数据];
}const dragOver = (ev) => {ev.preventDefault()
}const handleMouseDown = (ev) => {}</script><template><div class="holder" id="viewport" ref="viewport" data-type="viewport"><div:style="{height: page.height + 'px',width: page.width + 'px'}"ref="edit"class="screen"@dragover.prevent="dragOver"@drop="dropToAddCom($event)"><!-- 组件 --><divv-for="(moduleData,index) in widgetStore":style="{position: 'absolute',top: `${moduleData.attr.y}px`,left: `${moduleData.attr.x}px`,width: `${moduleData.attr.width}px`,height:`${moduleData.attr.height}px`}"><component:is="input":com="moduleData"></component></div></div></div>
</template><style scoped>
.holder {position: relative;width: 100%;display: flex;justify-content: left;overflow: auto;font-size: 0;border: 1px solid #f5f5f5;border-width: 0 1px;background-image: linear-gradient(45deg, #f5f5f5 25%, transparent 0, transparent 75%, #f5f5f5 0),linear-gradient(45deg, #f5f5f5 25%, transparent 0, transparent 75%, #f5f5f5 0);background-position: 0 0, 13px 13px;background-size: 26px 26px;
}.screen {margin: 20px;transform-origin: center top;position: relative;box-shadow: 0 0 5px 1px #cccccc;background-color: #ffffff;background-repeat: no-repeat;
}.wrapper {margin: 20px;position: relative;
}
</style>

定义组件列表components-panel

<script setup lang="ts">
import {ref} from 'vue'const dragStart = (ev) => {}
</script><template><div class="component-main" style="display: flex;flex-direction: column"><div style="margin: 5px;background: lightskyblue;color: white":draggable="true"@dragstart="dragStart($event)">文本</div></div>
</template><style scoped>
.component-main {border-radius: 5px;height: 100%;width: 200px;overflow-x: hidden;overflow-y: auto;
}
</style>

修改App.vue

<script setup lang="ts">
import viewport from './components/print-designer/viewport/index.vue'
import componentsPanel from './components/print-designer/components-panel/index.vue'</script><template><div class="main" data-theme="qy-designer"><components-panel/><viewport/></div>
</template><style scoped>
.main {display: flex;flex-direction: row;width: 100%;height: 100%;user-select: none;
}
</style>

效果

注:这里使用的技术点因为已经在第一篇讲了,所以这里就不再赘述了

demo示例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

速盾:cdn加速js

CDN加速是一种将网站内容分布到全球各地的服务器上来提高网站访问速度和稳定性的技术手段。CDN即内容分发网络&#xff0c;其核心原理是将静态资源&#xff08;例如图片、CSS、JavaScript文件等&#xff09;缓存到离用户最近的服务器节点上&#xff0c;使用户可以更快地获取网站…

三相LCL滤波型PWM逆变器仿真设计

参考并网电流外环电容电流前馈内环的双闭环控制结构&#xff0c;在光伏和风力发电网侧变换器中的应用&#xff0c;可以显著提高系统的稳定性和效率。在并网电流外环中&#xff0c;通过检测电网电流并与其参考值进行比较&#xff0c;可以得到一个电流误差信号。这个电流误差信号…

MySQL基础查询与复杂查询

基础查询 1、查询用户信息&#xff0c;仅显示用户的姓名与手机号&#xff0c;用中文显示列名。中文显示姓名列与手机号列。 2、根据商品名称进行模糊查询&#xff0c;模糊查询需要可以走索引&#xff0c;需要给出explain语句。使用explain测试给出的查询语句&#xff0c;需要显…

程序员职业发展指南,如何选择适合自己的就业方向?

随着科技的发展和数字化时代的到来&#xff0c;程序员是IT行业中的热门职业。尤其是近几年移动互联网的迅速发展&#xff0c;IT人才更是紧缺&#xff0c;越来越多的人加入程序员这个行列。 从事程序员工作&#xff0c;如何接项目呢&#xff1f;YesPMP是一个专注于互联网外包的平…

【知识学习】阐述Unity3D中动画渲染的概念及使用方法示例

Unity3D中的卡通渲染&#xff08;Cartoon Rendering&#xff09;是一种渲染技术&#xff0c;它模仿传统手绘动画或漫画的视觉效果。这种渲染风格通常具有鲜明的颜色、清晰的轮廓线和简化的光影效果&#xff0c;常用于制作动画、游戏和其他视觉媒体。 卡通渲染的基本概念 轮廓…

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件 一 如何安装 Qualcomm Chromatix™ 摄像头校准工具二 如何使用 Qualcomm Chromatix™ tuning工具创建tuning项目2.1 创建工程前提依赖2.2 创建工程2.3 添加场景2.4 编辑区域触发器三 如何创建Tuning 树一 如何安装 Qualco…

postman教程-22-Newman结合Jenkins执行自动化测试

上一小节我们学习了Postman Newman运行集合生成测试报告的方法&#xff0c;本小节我们讲解一下Postman Newman结合Jenkins执行自动化测试的方法。 在软件开发过程中&#xff0c;持续集成&#xff08;CI&#xff09;是一种实践&#xff0c;旨在通过自动化的测试和构建过程来频繁…

【高等数学】一元函数积分及其应用:定积分与反常积分

文章目录 第一节. 定积分一. 定积分的概念1. 定义2. 定积分存在定理3. 定积分的几何意义与求解 二. 定积分的性质1. 不等式2. 中值定理 三. 积分上限&#xff08;为x&#xff09;函数1. 积分上限函数定义2. 积分函数求导3. 积分函数的奇偶性变化 四. 定积分的计算 第二节. 反常…

multiprocessing.Queue 多个进程生产和多个进程消费怎么处理

在这个示例中&#xff0c;我们创建了一个队列 q&#xff0c;并通过 multiprocessing.Manager().Queue() 来确保队列可以在多个进程之间共享。我们定义了 consumer 和 producer 函数&#xff0c;分别用于从队列中获取数据和向队列中放入数据。 在主进程中&#xff0c;我们创建了…

IPython的使用技I巧整理

IPython 是一个强大的交互式 Python 解释器&#xff0c;它提供了许多增强 Python 编程体验的特性。以下是一些 IPython 的使用技巧&#xff1a; 自动补全&#xff1a; 按下 Tab 键可以自动完成代码。 自动缩进&#xff1a; IPython 会自动缩进代码&#xff0c;保持代码格式整洁…

vue的ESLint 4格缩进 笔记

https://chatgpt.com/share/738c8560-5271-45c4-9de0-511fad862109 一&#xff0c;代码4格缩进设置 .eslintrc.js文件 module.exports { "rules": { "indent": ["error", 4] } }; 自动修复命令 npx eslint --fix "src/**/*.{…

作为图形渲染API,OpenGL和Direct3D的全方位对比。

当你在网页看到很多美轮美奂的图形效果&#xff0c;3D交互效果&#xff0c;你知道是如何实现的吗&#xff1f;当然是借助图形渲染API了&#xff0c;说起这个不就不得说两大阵营&#xff0c;OpenGL和Direct3D&#xff0c;贝格前端工场在本文对二者做个详细对比。 一、什么是图形…

springboot实习管理系统的设计与实现 LW +PPT+源码+讲解

第三章系统分析与设计 3.1 可行性分析 一个完整的系统&#xff0c;可行性分析是必须要有的&#xff0c;因为他关系到系统生存问题&#xff0c;对开发的意义进行分析&#xff0c;能否通过本系统来补充线下实习管理模式中的缺陷&#xff0c;去解决其中的不足等&#xff0c;通过对…

专业技术!最新氧化物异质结纳米制备技术

网盘 https://pan.baidu.com/s/1vjO2yLxm638YpnqDQmX7-g?pwd3at5 MOF衍生的B_A_B结构氧化物异质结及其制备方法和应用.pdf 二硫化钼-硫化镉纳米复合材料及其制备方法和应用.pdf 具有异质界面的耐辐照复合薄膜及其制备方法与应用.pdf 基于异质结双界面层纳米材料的复合介电薄膜…

MyBatis(10)实现一个简单的MyBatis插件

MyBatis是一款优秀的持久层框架&#xff0c;它支持自定义插件&#xff0c;通过插件可以拦截在MyBatis核心代码执行的某些点的方法调用&#xff0c;以实现特定功能&#xff0c;如查询数据的性能分析、修改SQL语句等。MyBatis 插件是基于Java动态代理实现的&#xff0c;主要通过实…

Linux系统安装桌面

适用于常见的Linux发行版&#xff0c;如CentOS和Ubuntu&#xff1a; 对于CentOS 7/8 安装X Window系统和桌面环境&#xff08;如MATE或GNOME&#xff09; 连接到ECS实例&#xff1a;首先&#xff0c;确保您已通过SSH客户端连接到您的ECS实例。 更新系统&#xff1a; sudo yu…

最新手动迁移WordPress方法

手动迁移WordPress网站主要步骤有&#xff1a;迁移文件、迁移数据库、修复数据库连接。 对于WordPress Installations&#xff0c;只有两个主要组件&#xff0c;您需要访问手动将安装迁移到新主机&#xff1a;文件和数据库。 迁移文件 将文件从旧主机迁移到新的最简单方法之…

如何发布jar包到maven中央仓库(2024年6月最新版含如何对原Jira系统内数据进行迁移)

1.准备工作 1.1 进入系统注册账号 https://central.sonatype.com/ 点击右上角 Sign-in登录 如果是首次登陆&#xff0c;需要点击Sign-Up注册账号 2.命名空间管理 2.1 注册Namespaces 点击右上角自己的账号->选中View Namespaces 进入命名空间列表后&#xff0c;点击…

【软考论文】项目背景及论文模版

目录 一、项目核心功能二、论文模板一、项目核心功能 二、论文模板 论文字数说明 总字数 2500 = 500 + 400 +400 * 3 + 300 背景:500 回答问题:400 三段论:1200 = 400 * 3 结论:300 ~ 400 摘要(<300字) 本人于2022年1月参与了某车厂的全渠道数字化精准营销平台项目,该…

Spring Boot中实现定时任务最常用的方法 @Scheduled 注解和 TaskScheduler 接口【包含详情代码】

Spring Boot中实现定时任务最常用的方法 Scheduled 注解和 TaskScheduler 接口【包含详情代码】 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中………