从零搭建一款PC页面编辑器PC-Dooring

简介: 没有太多时间做PC端搭建化项目, 好在搭建平台很多原理都是通用的, 所以早在去年我就开发好了面向PC端的编辑器PC-Dooring, 虽然在设计上还有些不足(在后面的内容中会提到) , 但是基本模型已经实现, 接下来就和大家一起分享一下具体的实现.

网络异常,图片无法展示
|



之前一直忙着调研lowcode平台和开发以下两个项目:



没有太多时间做PC端搭建化项目, 好在搭建平台很多原理都是通用的, 所以早在去年我就开发好了面向PC端的编辑器PC-Dooring, 虽然在设计上还有些不足(在后面的内容中会提到) , 但是基本模型已经实现, 接下来就和大家一起分享一下具体的实现.


为了保证文章整体的逻辑性和条理性, 我将可视化搭建平台的具体的实现划分为了以下几个部分:


  • PC编辑器效果展示
  • 整体技术架构
  • 可视化搭建技术实现方式
  • 编辑器核心思路
  • 编辑器架构模型
  • 如何开发标准物料组件
  • 编辑器后期规划


PC编辑器效果展示



网络异常,图片无法展示
|



在上面的演示中, 组件库方式和H5-Dooring类似, 只不过组件库笔者采用了PC端专属的组件库antd, 所以我们可以将antd支持的任何组件集成进PC-Dooring.


整体技术架构



整体技术架构和H5-Dooring类非常相似, 也是遵循笔者的产品设计哲学—— 不要让用户思考. 降低一切拖拽复杂度, 采用智能网格的交互模式来实现(这种设计方式有一定的局限, 仅供大家参考, 当然也可以使用V6.Dooring的自由布局模式). 整体架构如下图所示:

网络异常,图片无法展示
|


由上图我们可以看出编辑器主要分为如下几个部分:


  • 组件物料
  • 画布区
  • 属性编辑区
  • 功能辅助
  • 其他


目前组件物料主要实现了基础组件, 可视化组件媒体组件, 其他类的组件实现也类似, 技术整体实现我们会在下面介绍.


可视化搭建技术实现方式



网络异常,图片无法展示
|


前端框架我们还是使用的React, 当然大家也可以使用Vue3.0, 原理都是相通的, 不同插件之间也提供了多框架的支持. 编辑器核心的一环就是组件拖拽, 这里笔者使用了社区比较强大且稳定的库react-dnd, 其拖拽分为两个部分, 一个是从组件区拖拽到画布区, 另一个是画布区内部组件的自由拖拽. 我们可以用原生H5的拖放API来实现第一部分的功能, 本质是将拖动源携带的数据传到画布制定区域, 目标源监听事件拿到携带的数据动态渲染出实际的组件. 过程如下:


网络异常,图片无法展示
|


当然深入研究过react-dnd的朋友都知道, 以上两个功能通过react-dnd都可以实现, 大家可以参考它的官网react-dnd官网学习研究具体实现流程, 也可以直接参考PC-Dooring源码.


至于组件库, 我们可以采用任何我们熟悉的组件库, 比如antd, element, zant等, 组件物料需要遵循我们约定的DSL协议, 这里大家可以参考工业级协议标准odata规范. 有了一定的规范, 我们就可以包装标准的组件物料从而集成第三方组件库了.


至于功能辅助模块和状态管理, 我们可以采用如mobx, redux, dva等来实现, 最终目的就是让编辑器不同部分能相互关联, 实时更新组件状态, 以及数据回传能力.


编辑器核心思路



编辑器核心实现思路笔者之前也分析了几个现有方案, 发现字节魔方的思路很贴切, 这里附上一个原理图:


网络异常,图片无法展示
|


核心就是通过编辑器产生的有效词法数据, 让渲染器能解析渲染成可用的HTML页面.


编辑器整体架构模型



编辑器整体架构模型主要是为了让大家全局的了解可视化编辑器的实现思路, 以及未来的规划方向, 笔者做了一个基本的草图, 如下:


网络异常,图片无法展示
|


如何开发标准物料组件



开发标准组件物料需要遵循我们编辑器内部的数据协议和组件开发规范, 在PC-Dooring中开发组件主要由以下几部分组成:


  • 组件代码
  • schema定义
  • template定义


组件代码就是组件内部具体的实现, 如下案例:

importReact, { memo } from'react';
import { ITextConfig } from'./schema';
importlogofrom'@/assets/text.png';
constText=memo((props: ITextConfig& { isTpl: boolean }) => {
const { align, text, fontSize, color, lineHeight, isTpl } =props;
return (
<>      {isTpl? (
<div><imgsrc={logo} alt=""></img></div>      ) : (
<divstyle={{ color, textAlign: align, fontSize, lineHeight }}>{text}</div>      )}
</>  );
});
exportdefaultText;

schema定义了组件的属性约束, 可编辑项类型以及默认值, 如下:

import {
IColorConfigType,
INumberConfigType,
ISelectConfigType,
ITextConfigType,
TColorDefaultType,
TNumberDefaultType,
TSelectDefaultType,
TTextDefaultType,
} from'@/components/FormComponents/types';
exporttypeTTextSelectKeyType='left'|'right'|'center';
exporttypeTTextEditData=Array<ITextConfigType|IColorConfigType|INumberConfigType|ISelectConfigType<TTextSelectKeyType>>;
exportinterfaceITextConfig {
text: TTextDefaultType;
color: TColorDefaultType;
fontSize: TNumberDefaultType;
align: TSelectDefaultType<TTextSelectKeyType>;
lineHeight: TNumberDefaultType;
}
exportinterfaceITextSchema {
editData: TTextEditData;
config: ITextConfig;
}
constText: ITextSchema= {
editData: [
    {
key: 'text',
name: '文字',
type: 'Text',
    },
    {
key: 'color',
name: '标题颜色',
type: 'Color',
    },
    {
key: 'fontSize',
name: '字体大小',
type: 'Number',
    },
    {
key: 'align',
name: '对齐方式',
type: 'Select',
range: [
        {
key: 'left',
text: '左对齐',
        },
        {
key: 'center',
text: '居中对齐',
        },
        {
key: 'right',
text: '右对齐',
        },
      ],
    },
    {
key: 'lineHeight',
name: '行高',
type: 'Number',
    },
  ],
config: {
text: '我是文本',
color: 'rgba(60,60,60,1)',
fontSize: 18,
align: 'center',
lineHeight: 2,
  },
};
exportdefaultText;

template主要规定了组件在画布中展示的基本方式, 如下:

consttemplate= {
type: 'Text',
h: 20,
displayName: '文本组件',
};
exportdefaulttemplate;

当然大家也可以扩展其定义或者将schematemplate合并. 只要一个组件符合了以上约定, 都可以被我们编辑器所消费.


编辑器后期规划



PC编辑器目前仍存在一些问题没有很好的解决, 比如布局方式的局限性导致必须横向扩展很多组件才能满足不同用户的个性化需求, 其次就是组件联动机制, 需要统一数据中心来管理, 后面会在H5-Dooring 中展示具体的实现方式, 大家感兴趣也可以实现一下.

目前PC-Dooring已经在github上以MIT协议完全开源, 如果大家感兴趣,也可以贡献你的一份力量, 帮助社区解决更多问题.



目录
相关文章
|
1月前
|
Unix 编译器 Linux
1.8.5 PC的命令行编辑器
要在Windows上使用C编译器,需额外下载并安装Cygwin或MinGW等工具,以便通过命令行调用GCC。Cygwin模拟Linux环境,而MinGW直接运行于Windows命令提示符。建议使用文本编辑器编写源代码,并确保文件扩展名为.c。编译过程中将生成.obj或.asm等中间文件,这些文件通常不会被自动删除。
31 3
|
4月前
|
前端开发 JavaScript Java
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
|
4月前
|
JavaScript
文本----简单编写文章的方法(上),自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑
文本----简单编写文章的方法(上),自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑
|
5月前
|
前端开发 JavaScript Java
杨老师教你学会使用富文本编辑器KindEditor之添加页面设计
杨老师教你学会使用富文本编辑器KindEditor之添加页面设计
67 0
|
编译器
在HTML页面中引用Markdown编辑器(Editor.md)
在HTML页面中引用Markdown编辑器(Editor.md)
在HTML页面中引用Markdown编辑器(Editor.md)
|
存储 数据可视化 前端开发
这款国外开源框架, 让你轻松构建自己的页面编辑器
前段时间我一直在设计和研究低代码搭建平台,也开源了几款可视化编辑器框架,最近在 github 上发现了一款非常强大的基于自然流布局的页面搭建框架 GrapesJS,接下来我就带大家摸索一下这款框架。
603 0
|
移动开发 JSON 开发框架
基于React+Koa实现一个h5页面可视化编辑器-Dooring | 🏆 技术专题第三期征文
前段时间笔者一直忙于数据可视化方面的工作,比如如何实现拖拽式生成可视化大屏,如何定制可视化图表交互和数据导入方案等,这块需求在B端企业中应用非常大,所以非常有探索价值。
545 0
|
Web App开发 Java 索引
JSP 实用程序之简易页面编辑器
完整源码下载:http://pan.baidu.com/s/1bpkHNnp(百度云提供) 需求:提供一页面,放置“帮助”、“版权”文字内容,特点:静态页面,无须读数据库,只是应付字眼上频繁的修改;没有复杂的交互,无须 JavaScript;没有图片,不需要文件上传。
921 0
|
4月前
|
开发工具
vi编辑器,现在vi\vim是文本文件进行编辑的最佳选择,Vim是vi的加强的版本,兼容vi的所有指令,vim编辑器有三种工作模式,一开始进入的是命令模式,命令模式i是插入的意思,两下y+p复制内容
vi编辑器,现在vi\vim是文本文件进行编辑的最佳选择,Vim是vi的加强的版本,兼容vi的所有指令,vim编辑器有三种工作模式,一开始进入的是命令模式,命令模式i是插入的意思,两下y+p复制内容