Giter VIP home page Giter VIP logo

lljj-x / vue-json-schema-form Goto Github PK

View Code? Open in Web Editor NEW
2.0K 35.0 409.0 7.8 MB

基于Vue/Vue3,Json Schema 和 ElementUi/antd/iview3/naiveUi 等生成 HTML Form 表单,用于活动编辑器、h5编辑器、cms等数据配置;支持可视化生成表单Schema 。 Generate a form using Vue/Vue3, Json Schema and ElementUi/antdv/iview3/naiveUi

Home Page: https://form.lljj.me/

License: Apache License 2.0

JavaScript 65.98% CSS 2.06% Vue 30.46% HTML 0.82% Stylus 0.67%
vue jsonschema elementui json-schema form h5-editor antdv vue3 elementplus

vue-json-schema-form's Introduction

vue-json-schema-form

基于 Vue2 / Vue3、 JSON Schema 生成带完整校验的Form表单,你的 🌟 🌟 🌟 就是最大的支持

查看文档 - Playground - 可视化表单Schema生成器

ui框架支持

交流群

QQ群:146845780反应不及时🙄

使用问题请优先通过 Github issue 提交

如何启动相关编辑器页面

1、 安装依赖

yarn install

2、 同时运行 Playground/表单Schema生成器/活动编辑器

# Playground http://127.0.0.1:8800/
# 可视化表单Schema编辑器 http://127.0.0.1:8800/schema-generator.html
# (H5)活动编辑器 http://127.0.0.1:8800/vue-editor.html

yarn run demo:dev

3、 单个运行(指定entry编译更快)

# 只运行 Playground
yarn run demo:dev --dir=index

# 只运行 表单Schema生成器
yarn run demo:dev --dir=schema-generator

# 只运行(H5)活动编辑器
yarn run demo:dev --dir=vue-editor

说明

  • 遵循 JSON Schema 规范,只需要给定 JSON Schema,即可生成对应的form表单
  • 快速配置个性化ui视图和校验错误信息,可适配常用的ui库
  • 表单schema校验使用 ajv
  • 设计**和对schema解析索引参考 react-jsonschema-form

相关资料

JSON Schema | Vue

为何开发

在做前端可视化编辑时,为了解决数据配置表单的通用性,所以使用 JSON Schema 描述数据结构,动态生成表单。

这样做的好处除了解决在每个配置表单的重复工作,服务端也可以基于同一份schema保持和前端一致的校验规则,不过对于使用 vue elementUi并未找到合适库可以直接使用,所以在后面一段时间决定自己实现一个 。

问题或建议

有任何使用问题或者建议都可以通过 Github issue 提交给我

License

Apache-2.0

vue-json-schema-form's People

Contributors

billy54197 avatar dependabot[bot] avatar juken8104 avatar lljj-x avatar mice33 avatar rovast 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

vue-json-schema-form's Issues

建议:自定义field的那部分文档

我在看https://vue-json-schema-form.lljj.me/zh/guide/adv-config.html#%E8%87%AA%E5%AE%9A%E4%B9%89field的时候,尝试自己去配置一下demo,结果报没有加载“LinkImgField”这个组件的错误,我当时只是在我的父组件中import 了LinkImgField,但是没效果,我去翻查项目源代码,发现common文件夹下面有个“registerExtraElementComponent.js”文件,里面才是引入了LinkImgField这个组件,然后父组件import这个registerExtraElementComponent.js就行了,所以建议这个要在文档里面说明一下吧,没找到有如何引入LinkImgField的说明。

关于文件(图片)类型的jsonschema编写体验、表单面板的UI及交互体验的一点提议。

文件是比较特殊的类型,其中图片甚之。

目前图片类型json schema书写如下:

"imgUrl": {
    "title": "单个图片",
    "type": "string",
    "default": "http://img.alicdn.com/tfs/TB1vYlkdnZmx1VjSZFGXXax2XXa-468-644.jpg_320x5000q100.jpg_.webp",
    "ui:action": "https://run.mocky.io/v3/518d7af7-204f-45ab-9628-a6e121dab8ca",
    "ui:widget": "UploadWidget",
    "ui:btnText": "上传按钮文案配置"
}

表单面板展示如下:
image

提议1

  1. json schema编写支持图片的image类型。
  2. 表单面板支持input输入。
"imgUrl": {
    "title": "单个图片",
    "type": "image",
    "default": "http://img.alicdn.com/tfs/TB1vYlkdnZmx1VjSZFGXXax2XXa-468-644.jpg_320x5000q100.jpg_.webp",
    "ui:action": "https://run.mocky.io/v3/518d7af7-204f-45ab-9628-a6e121dab8ca"
}

image

提议2

以作者的活动编辑器来讲,文件的上传是否可以交到这一层(编辑器开发者、动态表单方案采纳者?)统一处理,而无需组件开发者重复填写ui:action地址。

<vue-form
    v-model="formData"
    :schema="schema"
    :beforeUpload="uploadCover"
/>
"imgUrl": {
    "title": "单个图片",
    "type": "image",
    "default": "http://img.alicdn.com/tfs/TB1vYlkdnZmx1VjSZFGXXax2XXa-468-644.jpg_320x5000q100.jpg_.webp"
}

这样的支持,对于可视化(组件化)中台来讲,组件开发者会轻松许多。

😃 盼回复~

schema的editor的安全问题考虑

如果Playgroudf是自己项目里的界面,schema的editor的安全问题考虑,editor是否可识别js或别的,会吗,这样的话自己的后端服务数据会有危险的吧?

表单使用inline的问题

当一个表单用来当做搜索条件的时候,一般用inline=true,这时候怎么添加两个横向跟在表单之后的重置和保存按钮?(或者说动态添加按钮),目前插件没有按钮的表单控件。

configTools的数据清理

可以将editor的中const components = getComponentsAndInitToolsConfig(configTools);
在其他位置进行数据初始化,放在editor的变量中进行初始化,存在点问题,不好新手理解

自定义表单控件field绑定到formData根节点

假设一个自定义省市区表单控件要绑定3个变量,分别是省市区,如果做才可以绑定省市区到formData的根节点?如下结构
{ "p":"广东省", "c":"佛山市", "d":"顺德区" }

新功能

  • 数组ui配置支持 $index 占位符

  • 所有的ui配置都放开支持表达式配置

  • array 类型,支持直接配置 ui:widget

  • 默认集成一个 upload widget组件

  • anyOf 做切换时不在移除已输入的相同字段

  • 支持布局,比如一行1、2、3个,同时支持 ui:width 参数配置单个item宽度,会自动加上padding right

  • labelPosition 不在top时,description显示样式调整为鼠标移上去提示

  • 修复默认formData和schema计算值相等时可能无法同步值问题

Todo: vue3 update

features:

  • 使用 composition api
  • render 函数换成使用 jsx
  • 独立核心 lib-utils,为单独 private package
  • lib-vue2-core - 为 vue2 基础版本,接收配置适配ui库,为单独 public package
  • lib-vue3-core - 为 vue3 基础版本,接收配置适配ui库,为单独 public package
  • lib-vue2-element - elementUi 版本,为单独 public package
  • lib-vue2-ivew3- iview3 Vue 版本,为单独 public package
  • lib-vue3-element - elementUi 版本,为单独 public package
  • lib-vue3-ant- ant Vue 版本,为单独 public package
  • 梳理下活动编辑器代码,丢弃旧的配置
  • 添加 onFormMounted emit,接收 当前ui库form组件实例,并更新文档
  • 添加getFormItem 配置,可以获取当前ui库formItem组件实例
  • vue3 props添加自动解包功能 必要性不大,算了
  • 核对一次文档,更新文档准确性

bugs

  • vue3 elementPlus labelPosition right 无法正确渲染 description
  • vue3 inline 布局异常

if else这个schema的新特性有没有计划加上去呢

目前有个需求,就是两个有enum属性的select框要进行联动,第一个select框改变了值,要让第二个select的可选内容改变,我目前想到的是schema中的if else属性来实现,不知大神还有没有其他办法。

vue3 动态赋值数组渲染报错

vue3数组用v-for的时候,如果一开始是空数组,然后异步再复制,渲染会报错。

往空数组里面推数据就这样了

image

-- 来自qq群

拖拽

有没有考虑支持拖拽啊

文档问题

有些属性,在你文档上我没看拿到,例如definitions,有没有交流群,QQ之类的呢,有问题也好交流,有些属性真不清楚是啥意思,
还有自定义Widget,只能支持原生的button吗,我如果要放置一个element button,应该怎么弄呢

20201216 TODO

  • Widget 组件 存在 enumOptions 配置,必须是 required 时才做默认选中
  • 考虑 配置 widget ref ,方便直接获取到 widget 组件实例
  • ui:hidden: false 文档错误问题

活动编辑器的draggable

活动编辑器的draggable
v-model的数组和draggable的子元素循环渲染的数组不应该是同一个吗?为什么分别是editComponentList和trueComponentList. 这个trueComponentList包含的editHeaderComponentList和editFooterComponentList的用意是什么呢?

活动编辑器的页面布局

活动编辑器的页面布局若不是流式布局,比如是flex布局,是不是就会有点复杂了?有什么好的建议吗

TODO: next-version

TODO

features:

  • #106
  • #107
  • #79
  • #84
  • 对 Widget 添加onChange props,接收parentData、rootFormData (可能打破jsonSchema)

DONE

features:

  • 不需要 适配多ui库后,默认会注册相同名称的全局组件,考虑同时支持 vue.use 安装,支持传入组件前缀以示区分
  • 已发布 支持 readonly 属性
  • 添加title回退到属性名配置 #54
  • 优化vue3 antd 默认color picker样式 #52

bugs:

  • vue3 elementPlus dateTimeRange 区间选择,数据回填默认值写入不成功,鼠标hover即可恢复,待查element源码确element 新版本已修复
  • 已发布 优化 upload 上传组件和bug解决 #50
  • #105
  • #104
  • 支持 slots配置 #84
  • 支持 emits的配置 #84

array类型无法使用"ui:options"的style

schema:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "title": "vjsf",
  "description": "vue-json-schema-form示例",
   "properties": {
        "listOfStrings": {
            "type": "array",
            "title": "A list of strings",
            "items": {
                "type": "string",
                "default": "bazinga"
            }
        }
}

ui-schema:

{
    "listOfStrings": {
        "ui:options": {
             "style": {
                    "boxShadow": "0 0 6px 2px #2b9939"
               }
        },
        "items": { ... }
    }
}

设置好后运行,这个listOfStrings的整体并没有带颜色的框出现,还有,设置"class"也无效

如何在自定义的提交button的监听事件里捕获ajv的表单验证提示?

代码如下:

<template>
  ....
   <div slot-scope="{}">
              <p>
                <el-button type="danger" @click="empty">清空</el-button>
                <el-button type="primary" @click="submit">提交</el-button>
              </p>
            </div>
  ....
</template>

<script>
...
methods: {
     submit() {
        // 这里我怎么验证this.formData?验证合格才post
        var validate = ?
        if (validate) {
           post_to_backend(this.formData).then((res) => {
               console.log("res :>> ", res)
           })
        }
      },
}
...
</script>

我发现如果不进行验证,就算表单不符合json schema,也一样会提交掉。

是否支持patternProperties或者相关功能

是否支持在schema中指定value的类型,而不指定key,比如:
{
“dict”: {
"xxx": "str1",
"yyy": "str2"
}
}
能不能支持这种数据的展示,用户动态去增加键值对。

Todo:vue3 antdv 相关适配

  • form validate,formItem validate 必须使用promise,这里要同时兼容promise和callback。
  • form model 参数不能自动解包,如 formData = ref(data),需要model = formData.value
  • input 等相关输入组件,v-model 不使用默认 modelValue update:modelValue 需要特殊转换。
  • formItem  只对子元素进行劫持,并监听 blur 和 change 事件,存在嵌套默认无法触发数据校验。
  • formItem 执行onFieldBlur触发校验, name为数组深度大于1,会导致执行多次执行validator
  • 使用时间戳number类型会导致moment无法格式化,需要string类型
  • datepicker时间日期选择iso时间会按本地时区使用,而非utc 0 时区
  • 检查所有upload组件默认fileList计算逻辑
  • vue3 playground 页Plugin has already been applied to target app ,检查重复安装
  • 处理antdv icon样式
  • 是否包装所有的antdv组件,或者提供包装方法,抹平非modelValue的差异性
  • 优化vue3 playground多ui框架切换体验
  • playground el- 配置调整为根据ui框架动态适配

希望vue-json-schema-form可以支持属性名做标题

首先,vue-json-schema-form是我在vue组件中遇到的最优秀的json-schema转换器,感谢作者的贡献。
目前就是在项目中使用的时候发现目前还不支持使用属性名做标题,针对json-schema文件比较大的情况,逐一配置title确实有点麻烦,希望可以增加一个配置支持属性名做标题,谢谢!

如果表单字段过多,能不能分组显示?

比如说,生成器中右侧的配置表单,这边是两个表单,但是如果这些数据是一个表单呢?
image
我在想您能否为大型表单提供一种分组的机制,类似于折叠面板或者tabs的实现,还是说有其他的方式展示大型表单?

英文版的可视化编辑器

hi,你好,感觉你的这个库做的很强大,想在一个更国际化的开源项目中推荐使用它来做可视化编辑界面。请问有计划提供英文版的可视化编辑器吗?包括schema-generator和活动编辑器。

$ref 嵌套的时候出现赋值错误

{
"$schema": "https://json-schema.org/draft-06/schema#",
"definitions": {
"FileHeader": {
"type": "object",
"required": [
"author",
"date",
"description",
"revMajor",
"revMinor"
],
"properties": {
"author": {
"type": "string",
"title": "作者"
}
},
"title": "文件头"
},
"Directory": {
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"$ref":"#/definitions/FileHeader"
}
},
"title": "目录"
}
},
"type": "object",
"anyOf": [
{
"$ref": "#/definitions/Directory"
}
]
}

这种作为schema的时候会

vue.runtime.esm.js?2b0e:1888 Error: please transfer a valid prop path to form item!
at getPropByPath (util.js?8122:80)
at VueComponent.fieldValue (form-item.js?3787:602)
at Watcher.get (vue.runtime.esm.js?2b0e:4479)
at Watcher.evaluate (vue.runtime.esm.js?2b0e:4584)
at VueComponent.computedGetter [as fieldValue] (vue.runtime.esm.js?2b0e:4836)
at VueComponent.mounted (form-item.js?3787:764)
at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854)
at callHook (vue.runtime.esm.js?2b0e:4219)
at Object.insert (vue.runtime.esm.js?2b0e:3139)
at invokeInsertHook (vue.runtime.esm.js?2b0e:6346)

vuedraggable

想学习一下,这个vuedraggable插件的比较详细的地址可以推荐一下吗

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.