form-create-designer插件搭建表单构建器 功能扩展

利用 codemirror 插件和 @form-create/designer 的API实现表单配置的导入导出功能

一、下载插件

// codemirror
	cnpm install vue-codemirror --save
// JSON校验器插件
	cnpm install jsonlint-mod --save

二、mian.js引入插件

	// 引入表单构建插件
	import Vue from 'vue'
	import formCreate from '@form-create/element-ui'
	import FcDesigner from '@form-create/designer'
	Vue.use(formCreate)
	Vue.use(FcDesigner)

	// 引入代码编辑器
	import jsonlint from 'jsonlint-mod';
	import {codemirror} from 'vue-codemirror'
	import 'codemirror/addon/lint/lint'
	import 'codemirror/addon/lint/json-lint'
	import 'codemirror/lib/codemirror.css'
	import 'codemirror/addon/lint/lint.css'
	import 'codemirror/addon/edit/matchbrackets.js'
	import 'codemirror/mode/javascript/javascript.js'

三、.vue 配置使用

<template>
  <div class="main">
    <div class="middle">
      <div class="tool">
        <!--功能按钮-->
        <el-row>
          <el-button icon="el-icon-download" type="primary" size="small" 
                     @click="handleDownloadRule()" round>生成表单JSON</el-button>
          <el-button icon="el-icon-upload2" type="success" size="small" 
                     @click="handleUploadRule()" round>导入表单JSON</el-button>
          <el-button icon="el-icon-download" type="primary" size="small" 
                     @click="handleDownloadOption()" round>生成表单配置</el-button>
          <el-button icon="el-icon-upload2" type="success" size="small" 
                     @click="handleUploadOption()" round>导入表单配置</el-button>
        </el-row>
      </div>
      <!--表单构建器-->
      <fc-designer class="form-build" ref="designer" style="height: 80vh;"/>
    </div>
	
    <!--对话框-->
    <el-dialog :title="dialogTitle" 
               :visible.sync="dialogState" 
               :close-on-click-modal="false" 
               append-to-body>
			 <codemirror v-model="codemirrorContent" 
						  :options="codemirrorOptions" 
						  style="height: 90%;text-align: left;border: 1px solid #ccc;">
			  </codemirror>
      <el-row v-if="dialogMenu">
        <el-button @click="dialogState = false">取 消</el-button>
        <el-button type="primary" @click="handleImport()">导 入</el-button>
      </el-row>
    </el-dialog>
  </div>
</template>
<script>
	import {codemirror} from 'vue-codemirror';
	export default {
	    beforeCreate() {
			// 开启JSON校验
	        // window.jsonlint = jsonlint
	    },
	    data() {
	        return {
	            dialogTitle: '', // 对话框标题
	            dialogState: false, // 对话框状态
	            dialogMenu: false, // 对话框菜单状态
				
	            // codemirror配置
	            codemirrorOptions: {
	                mode: "application/json",
	                theme: "default",
	                gutters: ['CodeMirror-lint-markers'],
	                tabSize: 2,
	                lint: true,
	                line: true,
	                lineNumbers: true,
	                matchBrackets: true,
	                lineWrapping: true,
	                styleActiveLine: true,
	                readOnly: false
	            },
	            // codemirror内容
	            codemirrorContent: null
	        }
	    },
	    components: {
	        codemirror
	    },
	    methods: {
	        // 导出表单JSON
	        handleDownloadRule(){
	            this.dialogTitle = "表单规则"
	            this.dialogState = true
	            this.dialogMenu = false
	
	            this.codemirrorOptions.readOnly = true
	            this.codemirrorContent = JSON.stringify(this.$refs.designer.getRule(),null, 2)
	        },
	        // 导出表单配置
	        handleDownloadOption(){
	            this.dialogTitle = "表单配置"
	            this.dialogState = true
	            this.dialogMenu = false
	
	            this.codemirrorOptions.readOnly = true
	            this.codemirrorContent = JSON.stringify(this.$refs.designer.getOption(), 
	                                                    null, 2)
	        },
	        // 导入表单JSON
	        handleUploadRule(){
	            this.dialogTitle = "导入表单规则"
	            this.dialogState = true
	            this.dialogMenu = true
	
	            this.codemirrorOptions.readOnly = false
	            this.codemirrorContent = JSON.stringify([], null, 2)
	        },
	        // 导入表单配置
	        handleUploadOption(){
	            this.dialogTitle = "导入表单配置"
	            this.dialogState = true
	            this.dialogMenu = true
	
	            this.codemirrorOptions.readOnly = false
	            this.codemirrorContent = JSON.stringify({}, null, 2)
	        },
	        // 配置导入
	        handleImport(){
	            try {
	                let content = JSON.parse(this.codemirrorContent)
	                if(this.dialogTitle == "导入表单规则"){
	                    this.$refs.designer.setRule(content)
	                }
	                if(this.dialogTitle == "导入表单配置"){
	                    this.$refs.designer.setOptions(content)
	                }
	                this.dialogState = false
	            } catch(e) {
	                alert('输入内容格式有误!')
	            }
	        }
	    }
	}

</script>

四、效果图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值