mirror of
https://github.com/Ssl1S/json-schema-editor-vue.git
synced 2025-12-30 01:37:55 +08:00
140 lines
2.8 KiB
Vue
140 lines
2.8 KiB
Vue
<template>
|
|
<div id="app">
|
|
<div class="title">
|
|
<a href="https://github.com/zyqwst/json-schema-editor-vue" target="_blank">json-schema-editor-vue</a> Preview
|
|
</div>
|
|
<div class="desc">
|
|
<div>A json-schema editor of high efficient and easy-to-use, base on Vue.
|
|
<a @click="visible = true">import json</a>
|
|
</div>
|
|
</div>
|
|
<div class="container">
|
|
<codemirror class="code" v-model="jsonStr" :readOnly="false"/>
|
|
<json-schema-editor class="schema" :value="tree" disabledType lang="zh_CN" custom/>
|
|
</div>
|
|
<a-modal v-model="visible" title="import json" width="800px" height="600x" @ok="handleImportJson">
|
|
<div class="code-container">
|
|
<codemirror class="code" v-model="importJson" :readOnly="false"/>
|
|
</div>
|
|
</a-modal>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import Codemirror from './components/Codemirror.vue'
|
|
import GenerateSchema from 'generate-schema'
|
|
export default {
|
|
name: 'App',
|
|
components: { Codemirror },
|
|
computed: {
|
|
jsonStr: {
|
|
get: function () {
|
|
return JSON.stringify(this.tree, null, 2)
|
|
},
|
|
set: function (newVal) {
|
|
this.tree = JSON.parse(newVal)
|
|
}
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
importJson: '',
|
|
visible: false,
|
|
tree:
|
|
{
|
|
"root": {
|
|
"type": "object",
|
|
"title": "条件",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"title": "名称",
|
|
"maxLength": 10,
|
|
"minLength": 2
|
|
},
|
|
"appId": {
|
|
"type": "integer",
|
|
"title": "应用ID"
|
|
},
|
|
"credate": {
|
|
"type": "string",
|
|
"title": "创建日期",
|
|
"format": "date"
|
|
}
|
|
},
|
|
"required": [
|
|
"name",
|
|
"appId",
|
|
"credate"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
handleImportJson () {
|
|
const t = GenerateSchema.json(JSON.parse(this.importJson))
|
|
delete t.$schema
|
|
this.tree.root = t
|
|
this.visible = false
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<style>
|
|
*{
|
|
padding:0;
|
|
margin:0;
|
|
box-sizing: border-box;
|
|
}
|
|
.title{
|
|
text-align: center;
|
|
font-size: 40px;
|
|
font-weight: bold;
|
|
height:100px;
|
|
line-height: 100px;
|
|
}
|
|
.desc{
|
|
padding:20px;
|
|
width:80vw;
|
|
min-width:800px;
|
|
margin:auto;
|
|
padding: 0 3em;
|
|
font-size: 1.2em;
|
|
}
|
|
.container{
|
|
display: flex;
|
|
padding:20px;
|
|
width:80vw;
|
|
min-width:800px;
|
|
justify-content:center;
|
|
height: calc(100vh - 150px);
|
|
margin:auto;
|
|
}
|
|
.code-container{
|
|
max-height: 600px;
|
|
overflow: auto;
|
|
}
|
|
.schema{
|
|
margin-left: 20px;
|
|
width:50%;
|
|
height: 100%;
|
|
overflow-y: auto;
|
|
overflow-x:hidden;
|
|
border:1px solid rgba(0,0,0,.1);
|
|
border-radius: 8px;
|
|
padding: 12px;
|
|
}
|
|
.CodeMirror {
|
|
height: 100% !important;
|
|
}
|
|
.vue-codemirror{
|
|
flex:1;
|
|
margin: 0 24px;
|
|
border: 1px solid rgba(0,0,0,.1);
|
|
min-height:300px;
|
|
overflow: auto;
|
|
border-radius: 6px;
|
|
}
|
|
</style>
|