从零实现Dooring低代码印章组件

news2024/11/19 15:21:09

上一篇文章和大家分享了低代码平台组件间通信方案的几种实现:

  • 低代码平台组件间通信方案复盘

今天继续和大家分享一下比较有意思的可视化印章组件的实现.

802c96707f3d036246a5486e7188b286.png

你将收获

  • 低代码组件的基本设计模式

  • 印章组件的设计原理(canvas相关)

  • 如何快速将任意组件集成到低代码平台

正文

低代码组件的基本设计模式

我们都知道任何低代码或者零代码搭建产品都非常注重底层搭建协议(schema), 这些产品通常会设计一套向上兼容且可扩展的 DSL 结构, 来实现页面元件的标准化配置, 并支持元件的向上扩展:

e530212189645a272166b3564f6ef2b4.png

在设计 H5-Dooring 可视化搭建平台前, 我也参考了很多标准化软件数据协议, 给我启发最大的就是 ODATA 规范, 具体设计细节可以参考我之前的文章:

  • Dooring无代码搭建平台技术演进之路

之所以要介绍低代码的 schema 设计, 是因为低代码组件的设计与开发需要依赖 schema 的定义, 为了满足低代码组件能被用户实时编辑, 其基本的组成类似如下:

c76507abff6f05ee9c467e77ddbb9105.png

我们只需要在写普通组件的基础上加一个 schema 文件即可, 这里以Dooring组件来举一个例子:

// 组件代码tsx
import styles from './index.less';
import React, { memo, useState } from 'react';
import { IHeaderConfig } from './schema';

const Header = memo((props: IHeaderConfig) => {
  const { cpName, bgColor, logo, height } = props;

  return (
    <header className={styles.header} style={{ backgroundColor: bgColor, height: height + 'px' }}>
      <div className={styles.logo}>
        H5-dooring
      </div>
    </header>
  );
});

export default Header;


// 组件样式
.header {
    box-sizing: content-box;
    padding: 3px 12px;
    background-color: #000;
    .logo {
      max-width: 160px;
      overflow: hidden;
      img {
        height: 100%;
        object-fit: contain;
      }
    }
  }

// 组件schema
const Header = {
      editData: [
        ...baseConfig,
        {
          key: 'bgColor',
          name: 背景色,
          type: 'Color',
        },
        {
          key: 'height',
          name: 高,
          type: 'Number',
        },
        {
          key: 'logo',
          name: 'logo',
          type: 'Upload',
          isCrop: false,
          cropRate: 1000 / 618,
        }
      ],
      config: {
        ...baseDefault,
        bgColor: 'rgba(245,245,245,1)',
        logo: [
          {
            uid: '001',
            name: 'image.png',
            status: 'done',
            url: 'http://cdn.dooring.cn/dr/logo.ff7fc6bb.png',
          },
        ],
        height: 50,
      },
    };
    
export default Header;

在初步了解了低代码组件的设计模式之后, 我们接下来就来实现一下低代码印章组件的实现.

印章组件的设计原理

2ca2900f7f4a28f779c92efb76f3ca23.png

我们由上图可以看出, 一个印章组件包含如下几个部分:

5aa8dcbe406af116fdf066a4d239f2e6.png

对于印章的绘制, 我们可以采用 canvas 或者 svg 来实现, 这里我采用 canvas 来实现, 首先我们需要定义组件可以对外暴露的属性, 以便在低代码平台中可以让用户来自定义, 这里我直接列出基本的配置:

16c04feb581edacdfd9844b3bd47f8aa.png

接下来我们就来实现一下吧!

1. 绘制印章边框

let canvas = dom; 
let context = canvas.getContext('2d') as any;

// 初始化
canvas.width= w0;
canvas.height = w0;

// 绘制印章边框   
let width=canvas.width/2;
let height=canvas.height/2;
context.lineWidth= lineWidth;
context.strokeStyle= color;
context.beginPath();
context.arc(width, height, width - lineWidth, 0, Math.PI*2);
context.stroke();

由上面代码可知我们用 canvasarc 方法来创建一个圆形边框.

2. 绘制五角星

创建一个五角星形状. 该五角星的中心坐标为(x0, y0),中心到顶点的距离为 radius, rotate=0 时一个顶点在对称轴上

function create5star(context: any,sx: number,sy: number,radius: number,color: string,rotato: number){
        context.save();  
        context.fillStyle=color;  
        //移动坐标原点
        context.translate(sx,sy);  
        //旋转 
        context.rotate(Math.PI+rotato); 
        //创建路径 
        context.beginPath(); 
        let x = Math.sin(0);  
        let y= Math.cos(0);  
        let dig = Math.PI/5 *4;  
        for(let i = 0;i< 5;i++){
          //画五角星的五条边 
         let x = Math.sin(i*dig);  
         let y = Math.cos(i*dig);  
         context.lineTo(x*radius,y*radius);  
        }   
        context.closePath();  
        context.stroke();  
        context.fill();  
        context.restore();  
    }

3. 绘制印章名称

context.font = `${fontSize}px Helvetica`;
//设置文本的垂直对齐方式
context.textBaseline = 'middle';
//设置文本的水平对对齐方式
context.textAlign = 'center'; 
context.lineWidth=1;
context.fillStyle = color;
context.fillText(name,width,height+60);

4. 绘制环形印章单位

// 平移到此位置
context.translate(width,height);
    context.font = `${componySize}px Helvetica`
    let count = company.length;// 字数   
    let angle = 4*Math.PI/(3*(count - 1));// 字间角度   
    let chars = company.split("");   
    let c;
    for (let i = 0; i < count; i++){
        // 需要绘制的字符
        c = chars[i];   
        if(i==0)
            context.rotate(5*Math.PI/6);
        else
          context.rotate(angle);
        context.save(); 
        // 平移到此位置,此时字和x轴垂直 
        context.translate(90, 0);
        // 旋转90度,让字平行于x轴
        context.rotate(Math.PI/2);
        // 此点为字的中心点 
        context.fillText(c, 0, 20);  
        context.restore();             
    }

在基本的印章实现之后, 我们来接收属性配置:

26f30243ed7cfcfad0a389cb5b55b54a.png

对于低代码的 schema 配置, 这里以 H5-Dooring 的组件为例, 给大家分享一下:

import {
  IColorConfigType,
  IDataListConfigType,
  INumberConfigType,
  ISelectConfigType,
  TColorDefaultType,
  ISwitchConfigType,
  ITextConfigType,
  TNumberDefaultType,
  TTextDefaultType,
} from '@/core/FormComponents/types';
import { ICommonBaseType, baseConfig, baseDefault } from '../../common';
import intl from '@/utils/intl';

const t = intl();
export type TTextSelectKeyType = 'left' | 'right' | 'center';
export type TTextPosSelectKeyType = 'bottom' | 'top';
export type TTextFormatSelectKeyType = 'CODE128' | 'pharmacode'
export type TListEditData = Array<
  IColorConfigType | 
  IDataListConfigType | 
  INumberConfigType | 
  ISelectConfigType<TTextSelectKeyType> | 
  ISelectConfigType<TTextPosSelectKeyType> |
  ISelectConfigType<TTextFormatSelectKeyType> |
  ISwitchConfigType | 
  ITextConfigType 
>;
export interface IListConfig extends ICommonBaseType {
  width: TNumberDefaultType;
  compony: TTextDefaultType;
  componySize: TNumberDefaultType;
  text: TTextDefaultType;
  fontSize: TNumberDefaultType;
  color: TColorDefaultType;
  lineWidth: TNumberDefaultType;
  opacity: TNumberDefaultType;
}

export interface IListSchema {
  editData: TListEditData;
  config: IListConfig;
}

const List: IListSchema = {
  editData: [
    ...baseConfig,
    {
      key: 'width',
      name: t('dr.attr.sealSize'),
      type: 'Number',
    },
    {
      key: 'compony',
      name: t('dr.attr.componyName'),
      type: 'Text',
    },
    {
      key: 'componySize',
      name: t('dr.attr.componySize'),
      type: 'Number',
    },
    {
      key: 'text',
      name: t('dr.attr.sealUnit'),
      type: 'Text',
    },
    {
      key: 'fontSize',
      name: t('dr.attr.fontSize'),
      type: 'Number',
    },
    {
      key: 'color',
      name: t('dr.attr.color'),
      type: 'Color',
    },
    {
      key: 'lineWidth',
      name: t('dr.attr.lineWidth'),
      type: 'Number',
    },
    {
      key: 'opacity',
      name: t('dr.attr.opacity'),
      type: 'Number',
    },
  ],
  config: {
    ...baseDefault,
    cpName: 'Seal',
    width: 180,
    compony: 'Dooring零代码搭建平台',
    componySize: 18,
    text: 'H5-Dooring',
    fontSize: 14,
    color: 'rgba(240,0,0,1)',
    lineWidth: 6,
    opacity: 100
  },
};

export default List;

快速将任意组件集成到低代码平台

在上面的分析实现中我们可以发现, 只需要把普通组件按照属性对外暴露出来, 并按照 Dooringschema 定义模式来描述出来, 普通组件就可以立马变成低代码组件, 并自动生成组件配置面板:

978b6f7583a3716e10354a762953acfc.png

具体的 schema 描述我在文档中做了详细的介绍, 大家感兴趣可以参考一下:

da4ddd3910d999dd1d57458a55473ba1.png

总结

后续我会继续和大家分享一下 H5-Dooring 低代码的更多实践和思考, 如果大家对可视化低代码感兴趣也可以参考我的低代码可视化专栏, 如果大家对图形学感兴趣, 也可以参考我的专栏100+前端几何学应用案例.

H5-dooring低代码

b23b13dd9adf8d727d470dbbfe012bbc.png
H5-dooring低代码

V6.Dooring可视化大屏搭建平台

47de17f58cfad4896c80d55416390f4c.png
V6.Dooring可视化大屏搭建平台

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

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

相关文章

雷鸟X2:开启可量产全彩MicroLED光波导AR眼镜新起点

从最近的AR眼镜新品来看&#xff0c;采用MicroLED光波导方案已经成为了明显的趋势&#xff0c;可见业内对于光学的大方向还是非常统一的。不仅如此&#xff0c;各个厂商都拿出自己最优的方案来进行探索和验证&#xff0c;比如有的看重“极轻”、有的看重“视觉”、有的看重“价…

使用Jenkins一键打包部署 SpringBoot应用

一般而言&#xff0c;一个项目部署的由&#xff1a;拉取代码->构建->测试->打包->部署等过程组成&#xff0c;如果我们经常需要部署项目&#xff0c;特别是在微服务时代&#xff0c;服务特别多的情况下&#xff0c;不停的测试打包部署&#xff0c;那估计得有个人一…

数学:一夜读罢头飞雪

文章目录引子代数&#xff0c;几何与分析数学之美微积分形式的统一之美伽罗华群论的深刻之美几何的形体之美公理与定理集合论的公理欧几里得几何公理算术公理实数系的公理系统数学攀登的路径数学的符号系统希腊字母表物理与数学推荐的数学读物参考链接引子 贺新郎读史 人猿相揖…

【阶段二】Python数据分析数据可视化工具使用05篇:统计直方图、面积图与箱型图

本篇的思维导图: 统计直方图 统计直方图(histogram)形状类似柱形图,却有着与柱形图完全不同的含义。统计直方图涉及统计学的概念,首先要从数据中找出它的最大值和最小值,然后确定一个区间,使其包含全部测量数据,将区间分成若干个小区间,统计测量结果出现在各…

详细讲解Linux PCI驱动框架分析

说明&#xff1a; Kernel版本&#xff1a;4.14 ARM64处理器 使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 从本文开始&#xff0c;将会针对PCIe专题来展开&#xff0c;涉及的内容包括&#xff1a; PCI/PCIe总线硬件&#xff1b; Linux PCI驱动核心框…

通俗理解Platt scaling/Platt缩放/普拉特缩放

一、引言 最近在读论文的时候接触到Platt scaling&#xff0c;有点不理解这个概念。然后好奇心比较重&#xff0c;就看了一些科普&#xff0c;并追根溯源调查了一下Platt scaling。最终搞懂了这个概念&#xff0c;写个博客记录一下。中文翻译有看到&#xff1a;普拉特缩放&…

通信原理与MATLAB(十一):QAM的调制解调

目录1.QAM的调制原理2.QAM的解调原理3.QAM代码4.结果图5.特点1.QAM的调制原理 QAM调制原理如下图所示&#xff0c;基带码元波形经过串并转换分成I、Q两路&#xff0c;然后再经过电平转换(00转换成-1,01转换成-3,10转换成1,11转换成3)&#xff0c;再与对应的载波相乘&#xff0…

scMDC:针对单细胞多模态数据进行聚类

目录摘要引言背景介绍单细胞数据聚类方法回顾ZINBscMDC摘要 单细胞多模态测序技术的发展是为了在同一细胞中同时分析不同模态的数据&#xff0c;它为在单细胞水平上联合分析多模态数据从而识别不同细胞类型提供了一个独特的机会。正确的聚类结果对于下游复杂生物功能研究至关重…

JavaEE多线程-认识多线程

目录一、认识操作系统二、认识进程三、内存管理四、什么是线程(Thread)&#xff1f;五、为什么要有线程&#xff1f;六、进程和线程的关系一、认识操作系统 我们需要简单了解一下操作系统。 操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织…

【Python】sklearn机器学习之DBSCAN聚类

文章目录基本原理测试构造函数基本原理 DBSCAN算法是比较经典的聚类算法了&#xff0c;除了sklearn之外&#xff0c;open3d这种常用的点云模块也提供了DBSCAN算法的实现&#xff0c;例如Open3d数据滤波和点云分割。 和其他聚类算法相比&#xff0c;DBSCAN存在一种去中心化的特…

六、Gtk4-Widgets (3)

1 Open 信号 1.1 G_APPLICATION_HANDLES_OPEN flag 在上一节中&#xff0c;我们使用GtkTextView、GtkTextBuffer和GtkScrolledWindow创建了一个非常简单的编辑器。我们将为程序添加文件读取功能&#xff0c;并将其改进为文件查看器。 要给出文件名&#xff0c;最简单的方法是…

(软考)系统架构师大纲

考试要求&#xff1a; 掌握计算机硬软件与网络的基础知识;熟悉信息系统开发过程;理解信息系统开发标准、常用信息技术标准;熟悉主流的中间件和应用服务器平台;掌握软件系统建模、系统架构设计基本技术;熟练掌握信息安全技术、安全策略、安全管理知识;了解信息化、信息技术有关…

使用Vite搭建vue3+TS项目

vite简介 vite 是一个基于 Vue3 单文件组件的非打包开发服务器&#xff0c;它具有快速的冷启动&#xff0c;不需要等待打包操作&#xff1b;并且官网说是下一代的前端构建工具。 初始化项目 npm init vitelatest1.输入项目名称 2.选择Vue 3.选择TS 4.启动项目 5.项目启…

【阶段三】Python机器学习07篇:模型评估函数介绍(回归模型)

本篇的思维导图: 模型评估函数介绍(回归模型) 绝对误差与相对误差: 设Y表示实际值, 表示预测值,则称E为绝对误差(Absolute Error),计算公式如式所示: e为相对误差(Relative Error),计算公式如式所示:

Maven怎么写本地仓库没有的架包坐标

什么是jar包的坐标&#xff1f; 当我们使用Maven开发一个项目时&#xff0c;需要向项目中导入很多个jar包&#xff0c;这些jar包不需要我们自己一个个的导入&#xff0c;只需要在创建的项目中的pom.xml文件中写上需要的jar包的坐标&#xff0c;Maven就会去本地仓库找有没有这个…

黑马学ElasticSearch(一)

目录&#xff1a; &#xff08;1&#xff09;初识ES-什么是elasticsearch &#xff08;2&#xff09;初识ES-倒排索引 &#xff08;3&#xff09;ES与MySQL的概念对比 &#xff08;4&#xff09;安装ES &#xff08;1&#xff09;初识ES-什么是elasticseach 随着业务的发…

MYSQL8.0+远程连接|主从复制配置|各种错误(吐血整理)

目录 环境介绍 主机/从机文件配置 主机部分 从机部分 连接测试 报错踩坑|解决办法 写在前面&#xff1a;最近在做项目优化&#xff0c;看完黑马的mysql的主从复制后&#xff0c;准备着手来练练&#xff0c;没想到这入坑就是三四天的错&#xff0c;心情烦躁。如今已解决&a…

SpringCloud笔记 - Day1 概念注册中心负载均衡

https://www.bilibili.com/video/BV1LQ4y127n4 1. 微服务导学 异步通信可以大大提高服务的并发。 服务的异常定位&#xff1a; 分布式日志服务系统监控和链路追踪 自动化部署&#xff1a;Jenkins——docker——k8s——RANCHER 持续集成 2. 微服务导学2 微服务治理、异步通…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + RS-LiDAR-16 激光雷达测试

简介&#xff1a;介绍 RS-LiDAR-16 16线激光雷达 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;如何打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff1a;Melo…

类和对象2

static关键字 1.静态变量或方法不属于对象&#xff0c;但依赖类。 2.静态变量是全局变量&#xff0c;生命周期从类被加载后一直到程序结束 3.静态变量内存只存一份&#xff0c;在静态方法区存储&#xff08;静态方法区&#xff1a;静态变量&#xff0c;类信息&#xff08;方法…