国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

從零實現Dooring低代碼印章組件

開發 前端
我們都知道任何低代碼或者零代碼搭建產品都非常注重底層搭建協議(schema), 這些產品通常會設計一套向上兼容且可擴展的 ??DSL?? 結構, 來實現頁面元件的標準化配置,

今天繼續和大家分享一下比較有意思的可視化印章組件的實現.

圖片

你將收獲

  • 低代碼組件的基本設計模式
  • 印章組件的設計原理(canvas相關)
  • 如何快速將任意組件集成到低代碼平臺

低代碼組件的基本設計模式

我們都知道任何低代碼或者零代碼搭建產品都非常注重底層搭建協議(schema), 這些產品通常會設計一套向上兼容且可擴展的 DSL 結構, 來實現頁面元件的標準化配置, 并支持元件的向上擴展:

圖片

在設計 H5-Dooring? 可視化搭建平臺前, 我也參考了很多標準化軟件數據協議, 給我啟發最大的就是 ODATA 規范, 具體設計細節可以參考我之前的文章:

  • Dooring無代碼搭建平臺技術演進之路

之所以要介紹低代碼的 schema? 設計, 是因為低代碼組件的設計與開發需要依賴 schema 的定義, 為了滿足低代碼組件能被用戶實時編輯, 其基本的組成類似如下:

圖片

我們只需要在寫普通組件的基礎上加一個 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;

在初步了解了低代碼組件的設計模式之后, 我們接下來就來實現一下低代碼印章組件的實現.

印章組件的設計原理

圖片

我們由上圖可以看出, 一個印章組件包含如下幾個部分:

圖片

對于印章的繪制, 我們可以采用 canvas? 或者 svg? 來實現, 這里我采用 canvas 來實現, 首先我們需要定義組件可以對外暴露的屬性, 以便在低代碼平臺中可以讓用戶來自定義, 這里我直接列出基本的配置:

圖片

接下來我們就來實現一下吧!

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();

由上面代碼可知我們用 canvas? 的 arc 方法來創建一個圓形邊框.

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();
}

在基本的印章實現之后, 我們來接收屬性配置:

圖片

對于低代碼的 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;

快速將任意組件集成到低代碼平臺

在上面的分析實現中我們可以發現, 只需要把普通組件按照屬性對外暴露出來, 并按照 Dooring? 的 schema 定義模式來描述出來, 普通組件就可以立馬變成低代碼組件, 并自動生成組件配置面板:

圖片

具體的 schema 描述我在文檔中做了詳細的介紹, 大家感興趣可以參考一下:

? 圖片 ?

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2022-06-30 07:48:06

Dooring低代碼零代碼

2023-01-08 17:55:30

LowCodeDooring

2023-07-26 08:24:49

接口javapython

2021-06-22 14:47:19

electronDooring架構

2021-10-28 08:42:31

Dooring表單設計器數據可視化

2023-02-08 00:46:44

Dooring低代碼復盤

2023-01-31 07:47:14

Dooring低代碼輔助設計

2022-08-31 08:32:22

數據可視化項目nocode

2023-06-07 07:23:09

Dooring專業版開發神器

2021-08-26 05:15:22

圖片編輯器 H5-DooringMitu-Doorin

2021-04-12 08:31:53

PC-Dooring項目PC端搭建

2025-05-15 01:00:00

2022-06-02 09:09:27

前端React低代碼編輯器

2023-01-05 07:39:28

2023-09-28 08:00:53

2020-06-05 14:48:11

零代碼低代碼開發

2021-09-24 16:30:28

無代碼低代碼機器學習

2025-03-13 11:09:47

2020-11-11 08:04:34

低代碼

2020-09-24 11:46:03

Promise
點贊
收藏

51CTO技術棧公眾號

红桃一区二区三区| 亚洲不卡一区二区三区| 国产+人+亚洲| 91啦中文在线| 久久综合色播| jizz在线免费观看| 国产视频一区在线播放| 欧美国产视频在线观看| 日韩在线麻豆| 永久555www成人免费| www视频在线观看免费| 国产午夜精品一区二区三区视频| 国产一区免费观看| 美女久久久久| 不卡av电影在线观看| 日本乱理伦在线| 91国产丝袜在线播放| 国产经典视频一区| 91视频在线看| 欧美 国产 精品| 石原莉奈在线亚洲三区| 91亚洲人电影| 蜜桃一区二区三区| 九九热精品视频国产| 网友自拍亚洲| 亚洲国产精彩中文乱码av在线播放 | 香港三级日本三级a视频| 悠悠资源网久久精品| 热久久这里只有| jizz性欧美2| 欧美精品制服第一页| 91超碰碰碰碰久久久久久综合| 337p亚洲精品色噜噜| 免费在线观看黄色网| 欧美日韩一区二区三区四区| 在线视频国产日韩| 日韩黄色片在线| av午夜一区麻豆| 日韩国产精品毛片| 国产suv精品一区二区6| bt天堂新版中文在线地址| 国产精品一区二区男女羞羞无遮挡 | 特大黑人娇小亚洲女mp4| 麻豆成人久久精品二区三区红| 国产精品制服诱惑| 99riav1国产精品视频| 国产一区二区免费在线观看| 国内揄拍国内精品久久| 国内一区在线| 日韩精品1区2区3区| 欧美日韩综合久久| 久久国产夜色精品鲁鲁99| 亚洲免费av网| 久久亚洲综合色一区二区三区 | 成人手机视频在线| 精品一二三四区| 日本中文字幕在线视频观看| 丰满白嫩尤物一区二区| 免费在线观看的毛片| 综合久久久久久| 黄色在线免费观看大全| 欧美一区二区在线免费观看| 性爽视频在线| 欧美成人精品xxx| 国产videos久久| 成人av网站观看| 日本va欧美va精品| 欧美精品久久久久久久免费| 国产精品视频一二| 日本中文字幕一区二区有码在线| 欧美日韩成人一区| 国产成人精品一区二区三区免费| 欧美精品电影在线| 希岛爱理一区二区三区| 日韩三级电影| 久久综合国产精品| 亚洲а∨精品天堂在线| 欧美一二三四在线| 国产人与zoxxxx另类91| 国产日韩视频在线观看| 视频一区视频二区中文字幕| 日本一本二本在线观看| 欧美日韩中文在线| 亚洲女同av| 国产精品 欧美在线| 日日骚欧美日韩| 第四色亚洲色图| 日韩欧美123| 北条麻妃一区二区三区在线| http;//www.99re视频| 成人在线视频一区二区| 在线碰免费视频在线观看| 亚洲黄在线观看| 欧美精品乱码| 欧洲xxxxx| 精品日本美女福利在线观看| 超级碰碰久久| 91精品在线国产| 成人黄色在线看| aiai在线| 91成人在线视频| 精品中文字幕一区二区| 免费免费啪视频在线观看| 精品欧美一区二区在线观看| 久久1电影院| 中文字幕色一区二区| 亚洲亚洲人成综合网络| 天堂√8在线中文| 成人网在线免费看| 久久九九久精品国产免费直播| а√资源新版在线天堂| 国产极品jizzhd欧美| 成人美女视频在线观看18| 天堂影院在线| 欧美极品欧美精品欧美视频| 国产精品久久久久久久久久久新郎 | 精品视频在线观看免费观看| 国产精品乱码视频| 亚洲国产高清在线| 日韩高清中文字幕一区二区| 国产精选一区二区| 亚洲午夜在线观看视频在线| 亚洲人体在线| 中文字幕一区综合| 欧美精品久久久久久久多人混战| 女人av一区| 蜜臀久久99精品久久久酒店新书| 亚洲精品按摩视频| 亚洲国内自拍| 在线观看污网站| 5278欧美一区二区三区| 91麻豆成人久久精品二区三区| 久草在线资源站资源站| 国产精品视频福利| 精品日本美女福利在线观看| 女同久久另类99精品国产| 激情六月丁香婷婷| 日韩在线观看网站| 成人黄色av网站在线| 美女搞黄视频在线观看| 日韩色妇久久av| av不卡免费在线观看| 成年在线电影| 18+激情视频在线| 91高清在线视频| av片在线观看免费| 日韩欧美亚洲一区| 欧美日韩在线观看不卡| 青青草影院在线观看| 大陆极品少妇内射aaaaa| 国产欧美久久一区二区| 操91在线视频| 在线不卡国产精品| 国产日本一区二区三区| 国产精品啪视频| 性欧美视频videos6一9| 91精品久久久久久久久久入口 | 亚洲视频欧美视频| 日本成人激情视频| 美脚丝袜一区二区三区在线观看| 久久视频在线看| 亚洲一区二区免费| 最近看过的日韩成人| 亚洲欧洲日韩综合二区| 日本一区二区在线视频| av黄色在线网站| 丁香花在线影院观看在线播放| 欧美一级二级三级九九九| 日本一区二区精品视频| 日韩av高清在线看片| 青草网在线观看| 久久国产精品免费观看| 99久久久精品视频| 福利成人在线观看| 大陆精大陆国产国语精品| 9色精品在线| 99久久99久久久精品齐齐| 日韩不卡在线观看| 日韩在线视频国产| 一区二区三区天堂av| 欧美在线中文字幕| 亚洲一区二区三区精品视频| 伦理av在线| 亚洲欧洲精品一区| 日韩精品一区二区三区第95| 成人深夜在线观看| 国产精品18hdxxxⅹ在线| 黄页在线观看视频| 久久精品国产精品国产精品污 | 韩国版免费三体| 国产精品综合网站| 91久久精品一区二区三区| 久久精品三级| 97精品资源在线观看| www.日本视频| 久久综合久久久| 日韩视频在线一区| 欧美午夜视频在线观看| 狠狠狠色丁香婷婷综合激情| eeuss鲁片一区二区三区|