0 Star 0 Fork 0

SweetJ / x-render

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

x-render | 基于Antd Vue的表单表格设计器

简介

x-render 是基于 Vue2AntdVue 1.7开发的可视化表单设计工具, 适用于 各种流程引擎、动态表单及常用表单项目,大大节省你的开发时间;设计器布局参考f-render项目,样式使用less作为开发语言,主要功能是能通过简单操作来生成配置表单,生成可保存的JSON数据,并能将JSON还原成表单,使表单开发更简单更快速。

特性

  • 可视化配置页面
  • 提供栅格布局
  • 布局嵌套使用
  • 提供预览、保存、生成json、生成可执行代码等操作
  • 支持表单验证
  • 快速获取表单数据
  • 自定义组件插入
  • 自定义插槽
  • 组件插槽

组件

  • XForm 表单设计器(基于可视化操作快速设计出表单页面,生成配置json或页面)

  • XRenderForm  表单构建器(根据设计器中获取的配置json数据,快速构建出表单页面)

  • XTable 表格设计器(基于可视化操作快速设计出表格页面,生成配置json或页面)

  • XRenderTable 表格构建器(根据设计器中获取的配置json数据,快速构建出表格页面)

引入组件

// 在main.js引入
import XRender from 'x-render'
Vue.use(XRender)

使用组件

  • 表单组件
<template>
  <x-render-form
    ref="xRenderForm"
    v-model="formData"
    v-bind="formConfig"
    @form-submit="formSubmitHandler"
    @change="formChangeHandler"
    @form-change="formDataChangeHandler"
    @custom-event="customEventHandler"
  ></x-render-form>
</template>

<script>
export default {
  name: 'XRenderForm',
  data() {
    return {
      // 表单数据
      formData: {}
    }
  },
  computed:{
      formConfig:{
        get(){
            return '{formconfig}'
        }
      }
  },
  methods: {
     /**
     *  表单提交事件
     * @param formData {Object} 表单数据
     */
    formSubmitHandler(formData){
        // todo ajax提交数据
    },
    /**
    *  表单发生变化事件
    * @param type {String} 组件类型
    * @param prop {String} 组件属性
    * @param value {[String|Number|Object|boolean]} 组件值
    * @param attrs {Object} 组件属性集合
    * @param formItem{Object} 属性集合
    */
    formChangeHandler({type,prop,value,attrs,formItem}){
        // todo 事件操作
        //  展示/隐藏表单项  this.$refs.xRenderForm.showComponents('prop','prop1') |  this.$refs.xRenderForm.hideComponents('prop','prop1')
        //  启用/禁用表单项  this.$refs.xRenderForm.enabledComponents('prop','prop1') |  this.$refs.xRenderForm.disabledComponents('prop','prop1')
    },
   /**
    * 表单数据发送变化事件
    * @param formData {Object} 表单数据
    */
    formDataChangeHandler(formData){
        // todo 事件操作
    },
   /**
    *  自定义事件统一处理
    * @param type {String} 组件类型
    * @param prop {String} 组件属性
    * @param value {[String|Number|Object|boolean]} 组件值
    * @param attrs {Object} 组件属性集合
    * @param formItem{Object} 属性集合
    * @param association{Object} 关联属性集合
    */
    customEventHandler({type,prop,value,attrs,formItem,association}){
          // todo 自定义事件操作
    }
  }
}
</script>
  • 表格组件
<template>
  <ant-table
    ref="antTable"
    :dataSource="dataSource"
    :loading="loading"
    v-bind="tableConfig"
    @table-change="tableChangeHandler"
    @table-page-change="pageChangeHandler"
    @table-selected="tableRowSelectedHandler"
  ></ant-table>
</template>

<script>
export default {
  name: 'antTable',
  data() {
    return {
      // 数据源
      dataSource: [],
      // 表格加载状态
      loading:false
    }
  },
  computed:{
      tableConfig:{
        get(){
            return {tableConfig}
        }
      }
  },
  methods: {
   /**
    *  表格行选中事件
    * @param pagination {Object} 分页对象
    * @param filters {Array} 过滤配置
    * @param sorter {Array} 排序配置
    * @param dataSource {Array} 数据
    * @param instance {Object} table实例对象
    */
    tableChangeHandler({pagination, filters, sorter, dataSource, instance}){
        // todo 事件操作
    },
   /**
    *  表格行选中事件
    * @param selectedRowKeys {Array} 选中的keys
    * @param selectedRows {Array} 选中的行
    * @param instance {Object} table实例对象
    */
    tableRowSelectedHandler({selectedRowKeys, selectedRows, instance}){
        // todo 事件操作
    },
    /**
    *  表单发生变化事件
    * @param current {Number} 当前页
    * @param pageSize {Number} 页大小
    * @param instance {Object} table实例对象
    */
    pageChangeHandler({current, pageSize, instance}){
        // todo 事件操作
    },
    /**
    *  自定义获取数据源
    */
   async getDataSource(){
        // 修改分页配置  current: 当前页面;pageSize:页大小;pageSizeOptions:分页配置;total:数据总数
        // this.$refs.antTable.changePage({current, pageSize, pageSizeOptions, total })

        // 添加选中的行的主键key
        // this.$refs.antTable.addSelectedKeys([1,2,3,4])

        const dataSourceUrl = '${url}'
        // 使用nuxtjs/axios请求数据
       // const data = await this.$axios.$get( dataSourceUrl )
       const data = await this.$axios.$get( dataSourceUrl )
       this.dataSource.splice(0, this.dataSource.length, ...data)
    }
  },
  mounted(){
      // 获取数据
       this.getDataSource()
  }
}
</script>

自定义组件

  • 新增自定义组件 参考 example/components/CustomContainer组件

    1. attrs.js 组件属性
    2. CustomContainer.vue 组件
    3. CustomContainerDesign.vue 设计组件
    4. index.js 组件导出
    5. template.js 组件默认属性
  • 引入方式 参考 example/App.vue

<XForm
  :comps="comps"
  :loading="loading"
  height="calc(100vh - 52px)"
  @save="handleSave"
/>

// 自定义组件
import XRenderCustomContainer from './components/CustomContainer'

computed: {
  comps: {
    get() {
      return [XRenderCustomContainer]
    }
  }
}

表单属性 formItem 新增属性说明

如果prop为 user.name的形式将转换为 userName

  • formItem增加新的属性 xRawProp 存储原来的 user.name

  • formItem增加新的属性 xPropKeys 存储原来的 ['user','name']

  • formItem增加新的属性 xEnhanceProp = true 表示增强处理prop

  • 不支持数组

表单change事件

  • 表单change事件是各个组件发生变化,进行触发的事件统一处理

  • 表单change事件中各个组件传递的值各有不同,可查看各个组件,但传递的值固定属性为:

    {
        type: 组件类型
        prop: 组件属性
        value:组件值
        attrs: 组件属性集合
        formItem: formItem 属性集合
        event: 详细事件对象
    }

文件上传配置

  • 文件对象结构说明
{
	fileId: '文件主键',
	name:'文件名称',
	type:'文件类型,png、jpg,doc,xls,ppt'
	url:'文件路径,文件预览、下载的路径'
}
  • 使用文件上传组件,进行全局配置。在全局配置组件时,添加全局注入函数,如:

import Vue from 'vue'
import XRender from 'x-render'
import axios from 'axios'

function getFileItem (item) {
  const downloadUrl = ''
  return {
    fileId: item.fileInfoId,
    name: item.fileName,
    type: item.fileExtension,
    url: `${downloadUrl}?fileId=${item.fileId}`
  }
}

Vue.use(XRender, {
  viewPdf ({ fileId }) {
    const pdfUrl = ''
    return axios.get(pdfUrl,{fileId},
      {
        responseType: 'blob'
      }
    )
  },
  removeFile ({ fileId }) {
    const removeFileUrl = ''
    return axios.delete(`${removeFileUrl}${fileId}`)
  },
  uploadFile ({ file, value }) {
    const addFileUrl = ''
    const formData = new FormData()
    formData.append('file', file) // 添加file表单数据
    formData.append('fileName', file.name) // 添加file表单数据
    return new Promise((resolve) => {
      axios.post(addFileUrl, formData).then((item) => {
        resolve(getFileItem(item))
      })
    })
  },
  listFile ({ value }) {
    return new Promise((resolve) => {
      const listFileUrl = ''
      axios.get(`${listFileUrl}`).then((data) => {
        const arr = []
        for (const item of data) {
          arr.push(getFileItem(item))
        }
        resolve(arr)
      })
    })
  }
})

组件插槽

所有组件无论嵌套的层级,都可以进行使用插槽覆写,遵循以下规则:

  • 覆写插槽名称前缀未:XRender
  • 普通组件使用 prop进行确定组件,如果组件的propusername,则插槽名为:XRenderUsername
  • 布局组件使用layoutName进行确定组件,如果组件的layoutNameuserCard,则插槽名为:XRenderUserCard
<x-render-form>
  <div slot="XRenderUsername">username</div>
  <div slot="XRenderUserCard">userCard</div>
</x-render-form>

*详细代码查看libs/components/XRenderExtendSlot

XRenderForm说明

  • 属性
字段 类型 默认 注释
formOptions Array [] 表单配置数组
formData Object {} 表单数据
formProps Object {} 表单全局配置
  • 方法
方法 说明 类型
disabledComponents 禁用组件 禁用组件的字段prop 或者 layoutName -
enabledComponents 启用组件 启用组件的字段prop 或者 layoutName -
showComponents 显示组件 显示组件的字段prop 或者 layoutName -
hideComponents 隐藏组件 隐藏组件的字段prop 或者 layoutName -
clearValidate 清除验证 prop 字段 -
submitForm 提交form -
resetForm 重置form -
  • 事件
事件名称 说明 类型
form-submit 表单提交事件 formData {Object} 表单数据
form-change 表单数据变化事件 formData {Object} 表单数据
custom-event 自定义事件统一处理 type {String} 组件类型,prop {String} 组件属性,value {[String Number Object boolean]} 组件值,attrs {Object} 组件属性集合,formItem{Object} 属性集合,association{Object} 关联属性集合
change 表单组件发生变化事件 type {String} 组件类型,prop {String} 组件属性,value {[String Number Object boolean]} 组件值,attrs {Object} 组件属性集合,formItem{Object} 属性集合

XRenderTable说明

  • 属性
字段 类型 默认 注释
columns Array [] 列配置
tableProps Object {} 表格属性
tableBtns Array [] 按钮配置
dataSource Array [] 数据
loading Boolean false loading
  • 方法
方法 说明 类型
changePage 更改分页信息 current 当前页, pageSize 一页条数,pageSizeOptions 分页参数,total 总数
addSelectedKeys 添加选中的数据 selectedKeys[Array] 选中的数据
  • 事件 |事件名称|说明|类型| |:----|:---|-- | |table-change|表格发生变化事件|pagination {Object} 分页对象,filters {Array} 过滤配置,sorter {Array} 排序配置,dataSource {Array} 数据,instance {Object} table实例对象| |table-page-change|分页发生变化事件|current {Number} 当前页,pageSize {Number} 页大小,instance {Object} table实例对象| |table-selected|表格行选中事件|selectedRowKeys {Array} 选中的keys,selectedRows {Array} 选中的行,instance {Object} table实例对象|
MIT License Copyright (c) 2022 SweetJ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

x-render 是基于 Vue2 和 AntdVue 1.7开发的可视化表单设计工具, 适用于 各种流程引擎、动态表单及常用表单项目,大大节省你的开发时间 展开 收起
JavaScript 等 3 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
JavaScript
1
https://gitee.com/xuyh0817/x-render.git
git@gitee.com:xuyh0817/x-render.git
xuyh0817
x-render
x-render
master

搜索帮助