Coder Social home page Coder Social logo

woai3c / visual-drag-demo Goto Github PK

View Code? Open in Web Editor NEW
4.9K 4.9K 1.5K 14.93 MB

一个低代码(可视化拖拽)教学项目

Home Page: https://woai3c.github.io/visual-drag-demo

License: MIT License

JavaScript 28.15% HTML 9.77% Vue 55.84% CSS 4.19% SCSS 1.98% Shell 0.07%

visual-drag-demo's Introduction

一个低代码平台的前端部分,靠拖拉拽生成页面。

功能点

这是本项目具有的功能点,如果想了解详情请参考本项目的四篇文档,每个功能点都有不同程度的描述以及动图帮助你理解。

  1. 编辑器
  2. 自定义组件(文本、图片、矩形、圆形、直线、星形、三角形、按钮、表格、组合)
  3. 接口请求(通过接口请求组件数据)
  4. 组件联动
  5. 拖拽
  6. 删除组件、调整图层层级
  7. 放大缩小
  8. 撤消、重做
  9. 组件属性设置
  10. 吸附
  11. 预览、保存代码
  12. 绑定事件
  13. 绑定动画
  14. 拖拽旋转
  15. 复制粘贴剪切
  16. 多个组件的组合和拆分
  17. 锁定组件
  18. 网格线

在线 DEMO

文档

开发

安装

npm i

运行

npm run dev

打包

npm run build

License

MIT

赞助

visual-drag-demo's People

Contributors

huanganfree avatar justjokee avatar leoyongyuan avatar lvpangpang avatar namewjp avatar q664171689 avatar ricardo-zhong avatar woai3c avatar yi-tuan avatar zengpai avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

visual-drag-demo's Issues

eventBus.$emit的move事件参数错误

Bug原因:move事件一直用最开始点击Shape的坐标作为比较坐标。举个例子:当我点击了Shape之后,在开始坐标的右边一直移动,无论是左移还是右移,当前鼠标坐标curX-startX会永远大于0,即move事件会认为,Shape在向右移动
image
解决办法:move事件每次比较时,都应该用上一次鼠标移动的坐标作为比较坐标
image

calculateTop 函数的疑问

calculateTop 函数代码如下:

function calculateTop(style, curPositon, proportion, needLockProportion, pointInfo) {
    const { symmetricPoint, curPoint } = pointInfo
    let rotatedcurPositon = calculateRotatedPointCoordinate(curPositon, curPoint, -style.rotate)
    let rotatedTopMiddlePoint = calculateRotatedPointCoordinate({
        x: curPoint.x,
        y: rotatedcurPositon.y,
    }, curPoint, style.rotate)
  
    // 勾股定理
    let newHeight = Math.sqrt((rotatedTopMiddlePoint.x - symmetricPoint.x) ** 2 + (rotatedTopMiddlePoint.y - symmetricPoint.y) ** 2)
    
    if (newHeight > 0) {
        const newCenter = {
            x: rotatedTopMiddlePoint.x - (rotatedTopMiddlePoint.x - symmetricPoint.x) / 2,
            y: rotatedTopMiddlePoint.y + (symmetricPoint.y - rotatedTopMiddlePoint.y) / 2,
        }

        let width = style.width
        // 因为调整的是高度 所以只需根据锁定的比例调整宽度即可
        if (needLockProportion) {
            width = newHeight * proportion
        }
        
        style.width = width
        style.height = Math.round(newHeight)
        style.top = Math.round(newCenter.y - (newHeight / 2))
        style.left = Math.round(newCenter.x - (style.width / 2))
    }
}

我不太理解的是这里为什么要以 curPoint 为圆心旋转,感觉这里应该以 center 为圆心更好,理由如下:当拖拽 top 点的时候,我们需要忽略非 top 方向的拖拽。拖拽前是以 center 为圆心的,拖拽后我们仍然以 center 为圆心就可以求出相应旋转前的坐标位置,具体到代码如下(暂时忽略锁影响,另外我发现 top 点可以拖到 bottom 点以下,不太清楚是不是设计如此,如果算 bug 的话可以加上 symmetricPoint.y > rotatedTopMiddlePoint.y 的判断,而且勾股定理 newHeight 不可能为负数,这个判断是多余的):

function calculateTop(style, curPosition, proportion, pointInfo) {
  const { symmetricPoint, center } = pointInfo;
  // 先获取旋转前 curPosition 对应坐标
  const beforeRotateCurPosition = calculateRotatedPointCoordinate(curPosition, center, -style.rotate);
  // 忽略 x 轴的偏移,计算 y 轴上对应点
  const beforeRotateTopPoint = { x: center.x, y: beforeRotateCurPosition.y };
  // 计算旋转后的坐标
  const afterRotateTopPoint = calculateRotatedPointCoordinate(beforeRotateTopPoint, center, style.rotate);  

  if (symmetricPoint.y > afterRotateTopPoint.y) {
    const newHeight = Math.sqrt((afterRotateTopPoint.x - symmetricPoint.x) ** 2 + (afterRotateTopPoint.y - symmetricPoint.y) ** 2);
    const centerPoint = getCenterPoint(afterRotateTopPoint, symmetricPoint);

    style.height = Math.round(newHeight);
    style.top = Math.round(centerPoint.y - (newHeight / 2));
    style.left = Math.round(centerPoint.x - (style.width / 2));
  }
}

实际测试发现以 curPoint 和 center 旋转 y 坐标只相差 1 不到,基本看不出区别,希望能够说下这里以 curPoint 旋转的原因。

轮主可以考虑下建议啊

功能很全面了,赞!,更新的也很及时啊,大赞!

框选多个组建后,还需要组合才能一起移动,太麻烦了,可以考虑一下框选后组件们一起动吗?

组件成组后,来个组内移动的小功能会更赞啊,在没有拆分组的情况下可以组内元素进行位移,这样在页面结构复杂的时候混很方便,不用在拆分重组,元素过多的时候或拥挤的时候,框选并不舒适哦。

最后再来个鸟瞰图就更棒了,在画布大小过大的时候(1920x1200)情况下,是看不全页面的,有了鸟瞰图方便太多了!

shape每一条边的middle point 拉伸时产生偏移问题

初始化如下图:

23632A9AB3B0BA1DF0FB38BCD083078F

元素top初始值是175,如图所示bottom拖拽一下,按理来说top值应该始终为175不变,但是有时候会产生正负几个像素的偏差(如果一次没出现,就让元素失焦再选中,重复几次),经测试其它点均有此问题

9C421EB84CA339ED4682AA3EE5975673

这样就会给人呈现元素突然位移抖一下的现象,是否各种矩阵计算导致了center值或者height值出现了偏差?

组合功能的问题

如果要组合的组件中,已经存在组合数据,为什么要拆分呀,不能直接组合嵌套吗?

两处代码疑似有误

  1. 图中红框两行代码是否重复
    image
    2.Shape.vue里的getPointStyle(point)中mraginLeft三元表达式的判断两种结果都是-4px
    image

关于键盘粘贴问题

我将此项目嵌套我当前项目中,只要打开工艺图页面,不做任何操作,然后关闭后,进入"其他页面"粘贴内容时一直提示‘请选择组件’,我怎么才能让这个粘贴事件不影响我这个"其他页面"呢

VText组件v-html失效的疑问

我VText组件中看到这样一句话

this.element.propValue = e.target.innerHTML || ' '

很容易理解,在用户清空文本的情况下保留一个空格,但是实际测试的过程中有一些异常,异常的步骤如下:

  1. 拖拽一个 VText 组件,清空里面的内容。
  2. 触发 blur 事件,之后双击 VText 组件(可以看到有一个空格,是正常情况)
  3. 再次清空 VText 组件
  4. 再次触发 blur 事件,之后双击 VText 组件,发现并没有空格

一句话总结就是连续清空两次 VText 组件,v-html 并不会渲染。
解决的办法很简单,在 blur 的时候赋值一个新值,watch 传入的 element 变化,使用 innerHTML 手动赋值。
但我比较好奇这里的 v-html 为什么会在连续清除两次后会失效,如果你知道原因,请告诉我,不胜感激。

怎么动态生成自定义组件

实际开发左侧矩形图片等元素是接口返回的,那怎么动态生成矩形图片等自定义组件呢,现在是有一个类型就去新建一个.vue文件

组件拆分和组件赋值以及生成页面预览遇到的问题

你好,作者大佬,首先感谢你贡献,让我免于开除....,最近在使用的时候发现几个问题
1.操作方式:拖动两个组件,选中后组合并复制,拆分第二次组合的组件,会消失,并在原组件上生成一个新的;
原因应该是拖动后的复制组件,被拆分后几个组件使用的是第一次的坐标
2.我在原有的组件基础上加了echart图表,如果echart给动态赋过数据后,那么执行撤回和重做的操作会使echart变成空白
原因应该是赋值的操作没有添加入快照中,需要将赋值这一步加入记录,但是我在赋值的时候加入了添加快照的方法,好像不生效
3.如果将画布大小设置为19201080,scale为60%,我将预览的页面大小设置为19201080,scale为100%,页面中组件会位置在左侧,那如果生成的大屏页面怎么做到完全贴合呢
大佬,我应该是个菜鸡了,这几个问题,我研究了两天,改了总是有bug,期望你的回复,谢谢,感谢大佬的贡献

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.