<template> <el-dialog id="jsonEditorBox" @opened="dialogOpen" :title='pageTitle' :visible.sync="dialogVisible" @closed="dialogClose" width="95%" :append-to-body='true' :close-on-click-modal='false'> <div id="jsonEditBox"> <div style="display:flex;"> <div class="editItemBox1"> <div class="editeTitleItem">配置</div> <div :id='ideditor1' style="width: 100%; height: 100%;"></div> </div> <div class="editItemBox2"> <div class="editeTitleItem">模拟数据</div> <div :id='ideditor2' style="width: 100%; height: 100%;"></div> </div> <div class="editItemBox3" id="sqlBox"> <div class="editeTitleItem">SQL</div> <el-input style="width: 100%; height: 100%;border:1px solid #1160f1" type="textarea" placeholder="请输入内容" v-model="textareaSql"> </el-input> </div> </div> <el-row :gutter="20"> <div class="buttonBox"> <div class="infopageItem"> <div class="pageItem"> <span>组件名称:{{elInfo.el}}</span> </div> <div class="pageItem"> <span>版本号:{{this.editDataAll.version}}</span> </div> <div class="pageItem"> <span>时间:{{this.editDataAll.update_time}}</span> </div> </div> <div class="button_hanlde"> <el-switch v-model="is_mock" active-text="模拟" inactive-text="正式"></el-switch> <el-button v-if="elInfo.el==='hsDyncFormComponent'" size='mini' plain type="success" @click='editAnyncColums'>修改表单</el-button> <el-button v-if="elInfo.el&&elInfo.el.includes('hsTable')" size='mini' plain type="success" @click='editTableColums'>修改表头</el-button> <el-button v-show="layout" size='mini' plain type="danger" @click='changControl(1)'>上一个</el-button> <el-button v-show="layout" size='mini' plain type="warning" @click='changControl(2)'>下一个</el-button> <el-button size='mini' plain type="success" @click='execSql'>模拟数据</el-button> <el-button size='mini' type="primary" @click='showView'>查看效果</el-button> <el-button size='mini' type="danger" @click="submitToDb">提交到数据库</el-button> <el-button size='mini' type="warning" @click='resetEdit'>撤销修改</el-button> <el-button size='mini' plain @click='lookPageLogView'>查看日志</el-button> <el-button size='mini' type="success" @click='downSql_'>另存</el-button> </div> </div> <div v-show="!lookPageLogVisible"> <template v-if='elInfo.el=="hsLineBar"||elInfo.el=="hsPie"||elInfo.el=="hsRadar"'> <hsLineBar :elInfo='elInfo' :initStyle='initStyle' :allSourceData="commonData"></hsLineBar> </template> <template v-if='elInfo.el==="hsCarousel"'> <hsCarousel :initStyle='initStyle' :allSourceData='commonData'></hsCarousel> </template> <template v-if='elInfo.el==="hsTable"'> <hsTable :initStyle='initStyle' :allSourceData='commonData'></hsTable> </template> <template v-if='elInfo.el==="hsSelectPlus"'> <hsSelectPlus :allSourceData="commonData"></hsSelectPlus> </template> </div> </el-row> </div> <lookPageLog @revertVersion='revertVersion_' :isrequest='isrequest' @showView='showViewLog' v-if="lookPageLogVisible" :elInfo='elInfo'/> <tbaleColumsSet v-model="dialogVisibleTbaleColums" :tableDataColums='tableDataColums' :allSourceData='allSourceData' :mockSourceData='mockSourceData' :elInfo='elInfo' :isEditColumns='isEditColumns' @submit='submitTbaleColumsSet' :isSubmitSuccessFlage='isSubmitSuccessFlage' /> <asyncFormPropSet v-model="dialogVisibleAsyncFormColumn" :asyncFormColumns='asyncFormColumns' @submit='asyncFormPropSubmit' :elInfo='elInfo' :controlType='controlType' /> <el-dialog title="布局类型选择" :visible.sync="tipAdminDialogVisible" width="50%" :append-to-body='true' :close-on-click-modal='false' > <span class="tipLayoutStyle">请选择保存布局的类型?</span> <span slot="footer" class="dialog-footer"> <el-button size="mini" type="primary" @click="submitConfig(0)">全局</el-button> <el-button size="mini" type="primary" @click="submitConfig(1)">强制并全局使用</el-button> <el-button size="mini" type="primary" @click="submitConfig(2)">个人</el-button> <el-button size="mini" @click="tipAdminDialogVisible = false">取 消</el-button> </span> </el-dialog> </el-dialog> </template> <script> import uuidv1 from 'uuid/v1' import mockData from './initDbConfigDataJson' import commonUtility from '../funTools/commonUtility' import request from '../funTools/request' import lookPageLog from './lookPageLog.vue' import asyncFormPropSet from './asyncFormPropSet.vue' import tbaleColumsSet from './tbaleColumsSet.vue' import 'jsoneditor/dist/jsoneditor.min.css' import jsoneditor from 'jsoneditor' // const lookPageLog = r => require.ensure([], () => r(require('./lookPageLog.vue')), 'lookPageLog') // const asyncFormPropSet = r => require.ensure([], () => r(require('./asyncFormPropSet.vue')), 'asyncFormPropSet') // const tbaleColumsSet = r => require.ensure([], () => r(require('./tbaleColumsSet.vue')), 'tbaleColumsSet') export default { components: { lookPageLog, asyncFormPropSet, tbaleColumsSet }, name: 'jsoneditor', props: { elInfo: { type: Object, default() { return {} } }, initStyle: { type: Object, default() { return {} } }, complatData: { type: Array, default() { return [] } }, value: Boolean, layout: {}, jsoneditorCloseAfter: { type: Function, default() { return () => {} } }, jsoneditorOpenAfter: { type: Function, default() { return () => {} } }, allSourceData: {}, controlType: {}, isEditColumns: {} }, watch: { value(val) { this.dialogVisible = val }, dialogVisible(val) { this.$emit('input', val) } }, data() { return { options: { mode: 'text', indentation: 2, search: false }, ideditor1: 'b' + uuidv1(), ideditor2: 'b' + uuidv1(), editor1: null, editor2: null, commonData: {}, copyJsoneditorData: null, pageTitle: '配置', dialogVisible: false, editDataAll: {}, lookPageLogVisible: false, isrequest: false, is_mock: true, textareaSql: '', dialogVisibleTbaleColums: false, mockSourceData: [], tableDataColums: [], dialogVisibleAsyncFormColumn: false, asyncFormColumns: [], isSubmitSuccessFlage: '', errorEdit: 0, tipAdminDialogVisible: false } }, methods: { submitConfig(num) { this.openTips('此操作将覆盖数据库中的数据, 是否继续?', this.submitData, num) }, getAppCodePageName() { const { db_name, is_mock, db_code } = commonUtility.parseUrlQueryString() const { appCode, pagename } = commonUtility.parseUrlQueryBIDyncAppcodePageName() return { appCode, pagename, db_name, db_code, is_mock } }, getPageLogFun(parm) { return request.getPageLog(parm) }, submitTbaleColumsSet(columnsConfig, flage) { const config = this.editor1.get() config.columnsConfig = columnsConfig this.editor1.set(config) const sql = this.textareaSql const data = { dbName: this.editDataAll.dbName, sAppCode: this.editDataAll.app_code, sPage: this.editDataAll.sPage, sControl: this.editDataAll.control_name, sConfig: config, // this.editor1.get(), sData: this.editor2.get(), sQuerySql: sql, elInfo: this.elInfo, is_mock: this.is_mock ? 1 : 0 } request.runSave(data).then(() => { this.$message.success('设置成功') if (flage === 'columnStyleSet') { this.isSubmitSuccessFlage = 'columnStyleSet' } else { this.isSubmitSuccessFlage = 'tbaleColumsSet' this.dialogVisibleTbaleColums = false } this.editor1.set(config) }) }, asyncFormPropSubmit(data) { const config = this.editor1.get() config.formColumn = data const datas = { config: config } this.saveData(datas).then(res => { this.dialogVisibleAsyncFormColumn = false this.editor1.set(datas.config) }) }, saveData(datas) { const data = { dbName: this.editDataAll.dbName, sAppCode: this.editDataAll.app_code, sPage: this.editDataAll.sPage, sControl: this.editDataAll.control_name, sConfig: datas.config || this.editor1.get(), sData: this.editor2.get(), sQuerySql: this.textareaSql, elInfo: this.elInfo, is_mock: this.is_mock ? 1 : 0 } return request.runSave(data) }, editAnyncColums() { this.dialogVisibleAsyncFormColumn = true const config = this.editor1.get() this.asyncFormColumns = config.formColumn }, editTableColums() { this.dialogVisibleTbaleColums = true const config = this.editor1.get() this.mockSourceData = this.editor2.get() if (config && config.columnsConfig && config.columnsConfig.length) { this.tableDataColums = [...config.columnsConfig] } else { this.tableDataColums = [{}] } this.tableDataColums.forEach((item, index) => { if (item.childs) { this.tableDataColums.splice(index, 1, ...item.childs) } }) }, // 折线图的模拟数据 getMockData(type) { return mockData[type] }, changControl(flage) { if (this.layout) { const list = this.layout.filter(item => item.isRequestControl) const currIndex = list.findIndex(item => item.control.position === this.elInfo.position) let nextIndex = 0 let target = null if (flage === 1) { // 上一个 if (currIndex === 0) { this.$message('已经是第一个了') return } nextIndex = currIndex - 1 target = list[nextIndex] } else { // 下一个 if (currIndex === list.length - 1) { this.$message('已经是最后个了') return } nextIndex = currIndex + 1 target = list[nextIndex] } this.elInfo = target.control this.getPageInfo(target.control) } }, lookPageLogView() { this.lookPageLogVisible = true this.isrequest = !this.isrequest }, showViewLog(data) { this.editor1.set(data.config) this.editor2.set(data.sourceData) this.textareaSql = data.sql || '' this.showView() }, revertVersion_(parm) { request.revertPageLog(parm).then(res => { this.getPageInfo() this.isrequest = !this.isrequest }) }, execSql() { const data = { sQuerySql: this.query_sql, dbName: this.editDataAll.dbName } request.execSql(data).then(res => { this.editor2.set(res) }) }, getPageInfo(info = this.elInfo) { const routeParams = this.getAppCodePageName() const { position, page, sAppCode } = info const app_code = sAppCode || routeParams.appCode || '' const sPage = page || routeParams.pagename const data = { sControl: position, sAppCode: app_code, sPage: sPage } request.getSql(data).then(data => { if (data && data.length) { this.editDataAll = data[0] const { app_code: app_code_, control_name, json_config, json_data, page_name, query_sql, is_mock } = this.editDataAll const appCode = app_code || app_code_ if (!app_code_ || app_code_ === 'undefined') { this.editDataAll.app_code = app_code } this.pageTitle = `配置: AppCode: <${appCode}>---page_name: <${page_name}>---control_name: <${control_name}>` const jsonData = { config: JSON.parse(json_config), sourceData: JSON.parse(json_data), sql: query_sql || '' } this.copyJsoneditorData = JSON.parse(JSON.stringify(jsonData)) this.setJson(jsonData) this.textareaSql = query_sql || '' this.is_mock = !!is_mock } else { this.initData() } }) }, downSql_() { const data = { dbName: this.editDataAll.dbName, sAppCode: this.editDataAll.app_code, sPage: this.editDataAll.sPage } request.downSql(data) }, dialogClose() { this.dialogVisible = false this.jsoneditorCloseAfter() }, dialogOpen() { this.revertVersion = false this.getPageInfo() this.jsoneditorOpenAfter() }, initData() { const AppCodePageOBj = this.getAppCodePageName() const app_code = AppCodePageOBj.appCode const page_name = AppCodePageOBj.pagename this.pageTitle = `配置: AppCode: <${app_code}>---page_name: <${page_name}>---control_name: <${this.elInfo.position}>` const mockdata = this.getMockData(this.elInfo.el) if (!mockdata) { this.$message.error(this.elInfo.el + '----请配置模拟数据!') this.setJson({ config: {}, sourceData: [] }) return } this.copyJsoneditorData = JSON.parse(JSON.stringify(mockdata)) this.setJson(mockdata) this.textareaSql = this.copyJsoneditorData.sql }, resetEdit() { this.openTips('是否确定撤销修改?', this.setOldJson) }, setOldJson() { this.setJson(this.copyJsoneditorData) }, submitToDb() { this.openTips('此操作将覆盖数据库中的数据, 是否继续?', this.submitData) }, openTips(message, fun, parm) { this.$confirm(message, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }) .then(() => { fun(parm) }) .catch((e) => { console.log(e) this.$message.error('已取消-请保证json格式的完整性!,最左边没有就配置为{},中间没有就配置为[]') }) }, submitData() { const editor1Config = this.editor1.get() const editor2Config = this.editor2.get() this.errorEdit = 2 let data_ = {} if (this.complatData.length) { const complatData = JSON.parse(JSON.stringify(this.complatData)) const index = complatData.findIndex(item => { return item.config.id === editor1Config.id }) complatData[index].config = editor1Config complatData[index].sourceData = editor2Config const sql = this.textareaSql const data = { dbName: this.editDataAll.dbName, sAppCode: this.editDataAll.app_code, sPage: this.editDataAll.sPage, sControl: this.editDataAll.control_name, sConfig: editor1Config, sData: complatData, sQuerySql: sql, elInfo: this.elInfo, is_mock: this.is_mock ? 1 : 0 } data_ = data } else { let app_code = this.editDataAll.app_code const routeParams = this.getAppCodePageName() if (app_code === 'undefined' || app_code === undefined || !app_code) { app_code = this.elInfo.sAppCode || routeParams.appCode } const sql = this.textareaSql const data = { dbName: this.editDataAll.dbName, sAppCode: app_code, sPage: this.editDataAll.sPage, sControl: this.editDataAll.control_name, sConfig: editor1Config, sData: editor2Config, sQuerySql: sql, elInfo: this.elInfo, is_mock: this.is_mock ? 1 : 0 } data_ = data } request.runSave(data_).then(() => { this.$message.success('设置成功') }) }, setJson(data) { const { config, sourceData } = JSON.parse(JSON.stringify(data)) if (!this.editor1) { this.drow(this.ideditor1, config, 'editor1') this.drow(this.ideditor2, sourceData, 'editor2') } else { this.editor1.set(config) this.editor2.set(sourceData) } }, showView() { this.lookPageLogVisible = false this.showEchart() }, showEchart() { const config = this.editor1.get() const sourceData = this.editor2.get() this.commonData = { config, sourceData } }, drow(el, json = {}, flage) { const container = document.getElementById(el) this[flage] = new jsoneditor(container, this.options) this[flage].set(json) } } } </script> <style scoped> .jsonEditorBox >>> .el-message-box{ background-color: #f6f6f9!important; color: #040404 !important; } .jsonEditorBox >>> .el-message-box__content{ color: #040404 !important; } .jsonEditorBox >>> .el-message-box > .el-button{ color: #040404 !important; background-color:#4a4d5d4f!important; } .buttonBox{ padding-top: 30px; padding-bottom: 20px; display: flex; } .editItemBox1{ flex:1; height: 400px; } .editItemBox2{ flex:1; height: 400px; } .editItemBox3{ flex:2; height: 400px; } .editeTitleItem{ text-align: center; font-weight: bold; font-family:"宋体" } .pageItem{ margin-right: 10px; display: flex; justify-content: center; align-items: center; } .infopageItem{ display: flex; } .button_hanlde{ position:absolute; right: 10px; } #sqlBox >>> .el-textarea__inner{ height: 400px; } .tipLayoutStyle{ text-align: center } </style>