表单试卷零代码搭建平台正式上线,支持源码部署

news2024/11/17 10:58:25

hi, 大家好, 我是徐小夕. 

之前一直在社区分享零代码&低代码的技术实践,也陆陆续续设计并开发了多款可视化搭建产品,比如:

  • H5-Dooring(页面可视化搭建平台)

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

  • 橙子6试卷(表单搭建引擎)

  • Nocode/WEP 文档知识引擎

最近终于设计出了橙子试卷商业模式的最终方案, 我会在接下来的内容中和大家介绍。

橙子试卷主要用于可视化的搭建表单, 试卷等场景, 让不懂技术的人也能拖拽式创建自己的表单和试卷.

ad5b584d111c8314926683863ce3d8a1.png

上线测试了2个月,目前已经有500+用户使用,也做了很多使用的表单问卷模板:

c3039f64b49134031aa9e48a8b723661.png

为了让更多个体和中小企业能拥有自己的表单问卷搭建系统,我最近设计了私有化部署服务,提供源码授权 + 技术培训,价格定位在4999元,如果感兴趣可以在文章末尾联系交流。

接下来和大家分享一下橙子试卷的技术架构和技术实现, 如果你也在调研零代码, 低代码, 或者表单引擎等技术, 那么这篇文章也许可以给你带来一些灵感.

f4049844634a8f480a5ab273e439648e.png

体验地址: https://turntip.cn/form-engine

文末会附技术交流wx, 感兴趣的朋友可以加入交流讨论.

技术栈

之前在开发 H5-dooring 零代码搭建平台时我采用的是React技术栈, 因为用 react 写复杂逻辑会更顺手, 好在 vue3 也支持了函数式的写法, 也提供了 hooks 机制,  让我们写逻辑驱动的应用更加方便, 所以橙子试卷 采用了国内最流行的 vue3 作为前端框架. 具体技术栈如下:

  • Vue3 前端框架

  • Vite 工程化工具

  • Typescript 类型加强

  • arco-design 精美的前端UI库

  • pinia 状态管理库

  • axios 请求库

  • json schema 数据存储规范

  • xijs 面向业务场景的js工具库

  • vue-echarts 数据分析图表库

  • koa2 服务端数据支持

  • koa-jwt 基于koa封装的jwt鉴权库

当然还有一些第三方组件这里就不一一介绍了. 我们的核心在于从零完整设计一套 MVP 的零代码搭建引擎, 所以后端部分, 大家可以替换成自己熟悉的 java, go, python 等语言.

技术架构

38d2772a97007c9778e61949580150e9.png

因为零代码表单引擎设计的核心是如何构造一套低成本且可扩展的组件库, 并快速应用到实际业务场景, 所以设计的核心就包括如下部分:

  • 可扩展的组件库系统

  • 灵活的拖拽搭建模式

  • 统一标准的DSL数据结构和数据规范

  • 一套可插拔的分析管理系统

接下来我会详细介绍这几块的技术实现, 当然实现思想和技术栈无关, 我们仍然可以把它应用到不同的技术体系中.

具体功能实现

1. 构造可扩展的组件库系统

d001bfc639f82e761b537d078e1f7b1a.png

因为我们的搭建场景是问卷, 试卷, 微页面, 所以组件库会围绕表单来扩展, 比如常用的:

  • 文本, 图片

  • 单选, 多选, 图片选择

  • 下拉框

  • 文本输入框

  • 文件上传

  • 电子签名

  • 评分

等等, 这些组件当然不能满足所有客户的业务场景, 所以我们要设计一种可扩展组件库, 并且开发成本较低的方案.

我们可以参考常见的低代码平台的设计思路:

2a06ff91c607812539010cbd98e4dc80.png

简言之就是把核心UI和逻辑作为组件的主文件, 同时暴露标准的 的 可配置属性和可配置逻辑.

之所以强调“标准”, 是为了让不同组件能共用一套属性配置引擎,  从而让组件二开的成本大大降低(专注于组件的开发, 而不是配置的兼容).

ac91dd947d55d358508d822f511b9896.png

其次为了尽可能让组件的配置更灵活, 我们需要提供一套标准的组件默认属性, 让用户可以根据默认属性来配置自己的个性化的样式, 那么我们的组件就需要这么来设计:

d3efa11a89ee7264a764c44417274e82.png

这里以橙子试卷文本组件给大家举个例子.

文本组件的主文件:

<template>
  <div
    :class="{
      text: true,
      justify: editorStore.data[index].align == 'justify',
      [editorStore.data[index].animation]: true,
    }"
    :style="{
      paddingTop: editorStore.data[index].padding[0] + 'px',
      paddingRight: editorStore.data[index].padding[1] + 'px',
      paddingBottom: editorStore.data[index].padding[2] + 'px',
      paddingLeft: editorStore.data[index].padding[3] + 'px',
      color: editorStore.data[index].titleColor,
      fontSize: editorStore.data[index].titleSize + 'px',
      fontWeight: editorStore.data[index].titleWeight,
      textAlign: editorStore.data[index].align,
      animationDelay: editorStore.data[index].delay,
      animationIterationCount: editorStore.data[index].number,
      cursor: 'pointer',
    }"
    @click="jump(editorStore.data[index].link)"
  >
    {{ editorStore.data[index].titleText }}
  </div>
</template>

<script setup lang="ts">
import { useEditorStore } from "@/store";

const editorStore = useEditorStore();

const jump = (link: string) => {
  window.location.href = link;
};

defineProps(["index"]);
</script>

文本组件的可配置属性:

export default class Text {
    component: TextPropType;
    constructor(id: string) {
        this.component = {
            component: 'text',
            type:'editor.text',
            id,
            check: true,
            titleText: 'https://turntip.cn/form-engine',
            titleColor: 'black',
            titleSize:16,
            titleWeight:'500',
            padding: [0, 0, 0, 0],
            margin: [10, 10, 10, 10],
            animation:'',
            direction: 'center',
            link:'https://turntip.cn/formManager',
            delay:2,
            attrbite: [
                {
                    name: 'editor.titleText',
                    field: 'titleText',
                    component: 'textarea'
                },
                {
                    name: 'editor.padding',
                    field: 'padding',
                    component: "padding",
                    props: {
                        min: 0,
                        type:'padding'
                    }
                },
                {
                    name: 'editor.margin',
                    field: 'margin',
                    component: "padding",
                    props: {
                        min: 0,
                        type:'margin'
                    }
                },
            ]
        }
    }

}

通过这种方式, 我们只需要根据业务需求实现自己的组件, 编写组件可配置的属性json, 即可通过配置引擎来动态生成组件的可编辑面板, 从而让非技术人员轻松编辑组件.

通过以上的方式, 我们可以轻松开发各种自定义的组件, 提供给用户使用:

4dd58a26e18324eeb9022ec36f539fb5.gif

2. 灵活的拖拽搭建模式

b11c95db936b7b423971d3f75d4f253c.gif

对于表单场景, 我们不需要特别复杂的布局交互, 所以这里我才用拖拽排序来实现页面的搭建, 同时支持组件快捷复制和删除.

目前 vue3 的比较成熟的拖拽组件有:

  • vuedraggable

  • vue3-draggable-resizable

这里选择vuedraggable 来实现拖拽排序, 并对其进行上层封装, 实现体验更好的组件搭建排序效果.

当然还有很多优秀的拖拽库, 如果大家对vue3-draggable-resizable 感兴趣, 也可以试试, 它支持网格布局和自由布局, 可以实现更自由的布局搭建效果:

f44956ddb82db9ab30d645ba030a45c2.gif

3. 统一标准的DSL数据结构和数据规范

在组件库设计中我们为了统一管理和维护组件和组件的属性配置, 需要定义统一化的 DSL 结构, 这个结构包含了组件的如下信息:

  • 组件元数据

  • 位置信息

  • 样式信息

  • 事件 / 交互

  • 埋点定义(高级配置)

后4个都好理解, 这里介绍一下组件元数据, 它的价值在于定义组件的基本信息:

  • 组件类型

  • 组件名称

  • 图标

  • 初始化数据

  • 组件路径 (高级, 可选)

  • 状态 / 版本 (高级, 可选)

通过对 元信息 的定义, 我们可以很方便的建立更系统的组件库, 比如支持组件分类, 组件版本切换, 组件加载(通过路径元信息来加载远程组件).

所以我们需要尽可能规范统一的定义组件的通用规则和自定义规范, 以便让不同组件都遵行统一的规则来实现零代码搭建引擎的设计.

这里还是以橙子试卷为例子, 来介绍一下我们统一的DSL:

8ebb3885264fab1718a86c4fd1af6200.png

首先我们看看文本的元信息:

{
    name: 'editor.text', // 组件名称
    component: IconLanguage, // 组件图标
    type: 'text' // 组件类型
}

这是一个简单的元信息, 它可以帮我们快速识别组件, 并为画布提供组件更具体的渲染信息, 不同组件都通过统一的配置来定义, 可以让我们的渲染器更加高效的渲染组件, 并降低组件维护成本.

在介绍组件的内容中我已经介绍了组件接受的 json 配置结构, 这里分享一个由多个组件组成的完整页面的 DSL 结构和实际代码:

46e4fc5b0557c37283b11480340a0f33.png

案例代码:

{
    "id": "5137706621235472",
    "title": "2024前端笔试题",
    "author": "徐小夕",
    "desc": "页面描述",
    "icon": "",
    "bgColor": "",
    "bgImage": "",
    "isLogin": false,
    "data": [
        {
            "component": "sign",
            "type": "editor.sign",
            "id": "JelhSP",
            "check": false,
            "titleText": "请在此处签名",
            "titleColor": "black",
            "margin": [
                10,
                10,
                10,
                10
            ],
            "limit": 1,
            "btnColor": "#165DFF",
            "titleSize": 15,
            "titleWeight": "500",
            "analysis": ""
        },
        {
            "component": "math",
            "type": "editor.math",
            "id": "3-U9XA",
            "check": true,
            "titleText": "数学题目:5^9>\\pi",
            "titleColor": "#D41C1C",
            "options": [
                {
                    "label": "A",
                    "value": "苹果"
                },
                {
                    "label": "B",
                    "value": "香蕉"
                }
            ],
            "symbol": "A,B,C...",
            "direction": "horizontal",
            "optionsColor": "black",
            "analysis": "",
            "auto": "",
            "margin": [
                10,
                10,
                10,
                10
            ],
            "scores": 0,
            "required": false
        },
    ]
}

有了以上的统一 DSL 结构, 我们就可以轻松通过 JSON 来渲染页面, 同时也有更多的想象空间, 比如:

  • 通过DSL来实现跨端渲染搭建

  • 通过DSL来实现多人协作共享

  • 通过DSL来实现A出码能力

  • 通过AI学习DSL来批量自动化生产页面

4. 可插拔的分析管理系统

一个可视化零代码解决方案一定包含完整的用户使用链路, 即从搭建到投放再到信息收集的完整分析链路.

7912e937d711a4593323caa22bcf2e17.png

当然不同的公司业务分析需求不同, 所以需要支持纯粹的数据收集和流转, 以便供不同业务使用.

目前橙子试卷提供了一套完整的数据收集能力, 对于试卷场景, 也提供了自动打分机制, 可以一键分析数据情况:

312cf7f8a0538289cc95220f8c6bf45f.png

当然这都是可以基于自身规则自己二次开发的, 橙子试卷 只是提供了一套案例参考.

应用场景和价值

  • 帮助中小企业或者个体提供一套低成本零代码表单搭建解决方案,且不止于表单/试卷

  • 基于橙子试卷的最佳实践, 轻松扩展出更多的搭建业务场景

  • 开箱即用的组件和模版管理最佳实践, 积累和沉淀内部技术资产

  • 结合AIGC, 创造更强大的生产力工具

体验地址: https://turntip.cn/form-engine

技术交流:

e0b0c1010abacf90325f72c49cad29dd.jpeg

更多推荐

  • 新产品!可视化试卷搭建平台

  • 爆肝1000小时, Dooring零代码搭建平台3.5正式上线

  • 基于数据源驱动的跨组件通信最佳实践(低码篇)

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

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

相关文章

Facebook:数字社交的引领者与创新者

自2004年诞生以来&#xff0c;Facebook从一个校园网络项目迅速成长为全球最大的社交媒体平台&#xff0c;彻底改变了我们与世界互动的方式。作为数字社交的引领者和创新者&#xff0c;Facebook不仅在技术层面上不断突破&#xff0c;也在社会和文化领域留下了深刻的印记。本文将…

【代码随想录——图论——图论理论基础】

1. 图论理论基础 1.1 图的基本概念 二维坐标中&#xff0c;两点可以连成线&#xff0c;多个点连成的线就构成了图。 当然图也可以就一个节点&#xff0c;甚至没有节点&#xff08;空图&#xff09; 1.1.1 图的种类 有向图 加权有向图无权有向图 无向图 加权无向图无权无向…

LLM调优,大模型怎么学

背景 LLM Transparency Tool 是一个用于深入分析和理解大型语言模型&#xff08;LLM&#xff09;工作原理的工具&#xff0c;旨在增加这些复杂系统的透明度。它提供了一个交互式界面&#xff0c;用户可以通过它观察、分析模型对特定输入&#xff08;prompts&#xff09;的反应…

K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

前言 Redis 是在开发过程中经常用到的缓存中间件&#xff0c;为了考虑在生产环境中稳定性和高可用&#xff0c;Redis通常采用集群模式的部署方式。 在制定Redis集群的部署策略时&#xff0c;常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点&#xff0c;相较之下&#…

C语言 指针和数组——指针的算术运算

目录 指针的算术运算 指针加上一个整数 指针减去一个整数 指针相减 指针的关系比较运算 小结 指针的算术运算 指针加上一个整数 指针减去一个整数 指针相减 指针的关系比较运算 小结  指针变量 – 指针类型的变量&#xff0c;保存地址型数据  指针变量与其他类型…

vue中使用 json编辑器

<template><div class"stringTest"><vue-json-editorv-model"vstringData" //编辑器中的内容:showBtns"false" // 保存按钮mode"code"lang"zh":expanded-on-start"true"json-change&quo…

Java项目:基于SSM框架实现的网上医院预约挂号系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的网上医院预约挂号系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

后端之路(集合项目)——结合案例正式搭建项目

在前面学完java后端的Maven、spring boot、Mysql、Mybatis之后&#xff0c;我们现在就应该集合它们开始搭建一个项目试试手了 这里我还是跟着黑马程序员的步骤来走好每一步&#xff0c;也给各位讲清楚怎么弄 先看一下这个图&#xff0c;觉得太笼统不明白的话不着急&#xff0c…

【工具分享】WSL

文章目录 WSL介绍安装步骤 WSL介绍 WSL 是 “Windows Subsystem for Linux” 的缩写&#xff0c;它是微软在 Windows 10 和 Windows 11 中引入的一项功能&#xff0c;允许用户在不使用虚拟机的情况下直接在 Windows 上运行原生的 Linux 二进制应用。WSL 提供了一个兼容层&…

【JVM系列】内存泄漏

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

单目相机减速带检测以及测距

单目相机减速带检测以及测距项目是一个计算机视觉领域的应用&#xff0c;旨在使用一个摄像头&#xff08;单目相机&#xff09;来识别道路上的减速带&#xff0c;并进一步估计车辆与减速带之间的距离。这样的系统对于智能驾驶辅助系统&#xff08;ADAS&#xff09;特别有用&…

用python画蜡笔小新

代码地址: https://pan.quark.cn/s/6ae646d2fef3

ubuntu24.04LTS防火墙设置

Ubuntu24.04LTS开箱自带ufw&#xff0c;一定程度避免了开机下载ufw被攻击&#xff0c;excellent 转载aliyun教程 sudo ufw enbale可以启用并且开机自启(显示有效&#xff0c;未nmap实测) 教程3 转载自CSDN 完整格式如下&#xff1a; # 禁止IP连接端口 sudo ufw deny proto tc…

【Elasticsearch】Elasticsearch动态映射与静态映射详解

文章目录 &#x1f4d1;前言一、Elasticsearch 映射概述1.1 什么是映射&#xff1f;1.2 映射的分类 二、动态映射2.1 动态映射的定义2.2 动态映射的优点2.3 动态映射的缺点2.4 动态映射的应用场景2.5 动态映射的配置示例 三、静态映射3.1 静态映射的定义3.2 静态映射的优点3.3 …

小鹏MONA M03全球首秀:AI量化美学引领年轻潮流

在科技日新月异的今天&#xff0c;小鹏汽车再次以其前瞻性的设计理念和创新技术&#xff0c;引领了智能电动汽车行业的新一轮风潮。 作为小鹏汽车MONA系列的首款车型&#xff0c;小鹏MONA M03的Al量化美学设计受到了众多行业人士的广泛关注。7月3日下午&#xff0c;这款万众瞩目…

LVM负载均衡群集

一.群集基础概述 1.群集的类型 &#xff08;1&#xff09;负载均衡的群集&#xff1a;以提高应用系统的响应能力&#xff0c;尽可能处理更多的访问请求&#xff0c;减少延迟为目标&#xff0c;获得高并发的、高负载的整体性能。例如&#xff1a;“DNS轮询”&#xff0c;“应用…

【应届应知应会】SQL常用知识点50道

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;借他一双眼&#xff0c;愿这盛世如先生所愿 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凌七七~❤ 友情提供 目录 数据库的概念 (什么是数据库) RDBMS NOSQL 数据库的分类 …

应用于空气和液体抑菌的静态UVC LED抑菌模组-WH-UVC001-VO

WH-UVC001-VO是一款用于空气和液体抑菌的静态UVC LED抑菌模组。适用于带水箱、密闭的腔体结构。可安装于顶部、侧壁及底部&#xff0c;出光面符合IP65的防水要求&#xff0c;即使安装于水箱底部也不用担心漏水。 使用的UVC LED的波长范围为260-280nm&#xff0c;具有优良高效的…

矩阵优化递推式子

题目链接 对于f(n)3f(n−1)2f(n−2)2这种式子&#xff0c;先将右边拥有的项竖着列出来&#xff0c;不包括系数&#xff0c;再将这个竖列的下一项写出来&#xff0c;然后将右边的每一项按照左边顺序的等式写出来&#xff0c;然后我们将等式右边只保留系数&#xff0c;那么这些系…

HR人才测评,什么是观察能力,如何提高观察能力?

什么是观察能力&#xff1f; 观察能力是指一个人有计划有目的地去看、去听、去闻、去尝、去思考某种事物&#xff0c;在现实生活中&#xff0c;观察力强意味着人的感知能力强&#xff0c;感知能力强的人对某种信息的捕捉非常准确&#xff0c;其往往能凭借这种杰出的能力&#…