多维表数据设置面板完成
This commit is contained in:
		| @@ -66,6 +66,7 @@ | ||||
|              v-else-if="currentType === 'video'"/> | ||||
|       <AiDvPartyOrg style="width: 100%; height: 100%;" v-else-if="currentType === 'partyOrg'" :instance="instance"/> | ||||
|       <!-- <ai-sprite v-else-if="/building/.test(currentType)" v-bind="data" is3D @init="mods[currentType]"/> --> | ||||
|       <ai-dv-plot v-else-if="currentType=='plot'"/> | ||||
|     </ai-dv-panel> | ||||
|   </div> | ||||
| </template> | ||||
| @@ -81,6 +82,7 @@ import AiSwiper from './AiSwiper.vue' | ||||
| import AiDvDisplay from "./layout/AiDvDisplay/AiDvDisplay"; | ||||
| import AiDvPanel from "./layout/AiDvPanel/AiDvPanel"; | ||||
| import AiDvSummary from "./layout/AiDvSummary/AiDvSummary"; | ||||
| import AiDvPlot from "./layout/AiDvPlot/AiDvPlot.vue"; | ||||
|  | ||||
| Vue.use(scrollBoard) | ||||
|  | ||||
| @@ -88,6 +90,7 @@ export default { | ||||
|   name: 'AiDvRender', | ||||
|   props: ['data', 'index', 'theme', 'instance'], | ||||
|   components: { | ||||
|     AiDvPlot, | ||||
|     // AiSprite, | ||||
|     AiDvSummary, | ||||
|     AiDvDisplay, | ||||
| @@ -118,8 +121,7 @@ export default { | ||||
|       deep: true, handler() { | ||||
|         if (this.currentType == 'map') { | ||||
|           this.renderMap() | ||||
|         } | ||||
|         if (this.currentType === 'AiDvTable') { | ||||
|         } else if (this.currentType === 'AiDvTable') { | ||||
|           this.dvTableConfig = this.data[this.data.dataType].map((v, i) => { | ||||
|             return { | ||||
|               color: this.data.config[i] ? (this.data.config[i].color || '') : '', | ||||
|   | ||||
							
								
								
									
										44
									
								
								components/layout/AiDvPlot/AiDvPlot.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								components/layout/AiDvPlot/AiDvPlot.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| <template> | ||||
|   <section class="AiDvPlot"> | ||||
|     <ai-select class="plotPicker" v-model="current" :select-list="options"/> | ||||
|     <div ref="DvPlot"/> | ||||
|   </section> | ||||
| </template> | ||||
| <script> | ||||
| export default { | ||||
|   name: "AiDvPlot", | ||||
|   props: { | ||||
|     options: {default: () => []} | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       current: 0 | ||||
|     } | ||||
|   }, | ||||
|   methods: {}, | ||||
| } | ||||
| </script> | ||||
| <style scoped lang="scss"> | ||||
| .AiDvPlot { | ||||
|   position: relative; | ||||
|   height: 100%; | ||||
|  | ||||
|   :deep(.plotPicker) { | ||||
|     position: absolute; | ||||
|     right: 12px; | ||||
|     top: -10px; | ||||
|  | ||||
|     .el-select { | ||||
|       .el-input__inner { | ||||
|         background: #218ffd1a; | ||||
|         border: 1px solid #1F66AD; | ||||
|         color: #2FC5FF; | ||||
|       } | ||||
|  | ||||
|       .el-input__suffix { | ||||
|         color: #2FC5FF !important; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @@ -6,14 +6,11 @@ | ||||
|           <span class="layoutTitle fill">标记点设置</span> | ||||
|           <el-button type="text" icon="iconfont iconAdd" @click="handleMapMarker()">添加</el-button> | ||||
|         </div> | ||||
|         <div class="layout-config__item" v-for="(item,i) in markers" :key="i"> | ||||
|           <label v-text="item.label"/> | ||||
|           <div class="layout-config__item--right"> | ||||
|             <el-input :value="[item.lat,item.lng].join(',')" readonly size="small"/> | ||||
|             <el-button type="text" icon="el-icon-edit" @click="handleMapMarker(item,i)"/> | ||||
|             <el-button type="text" icon="el-icon-delete" @click="removeMapMarker(i)"/> | ||||
|           </div> | ||||
|         </div> | ||||
|         <config-item v-for="(item,i) in markers" :key="i" :label="item.label"> | ||||
|           <el-input :value="[item.lat,item.lng].join(',')" readonly size="small"/> | ||||
|           <el-button type="text" icon="el-icon-edit" @click="handleMapMarker(item,i)"/> | ||||
|           <el-button type="text" icon="el-icon-delete" @click="removeMapMarker(i)"/> | ||||
|         </config-item> | ||||
|       </ai-fold> | ||||
|       <ai-fold title="标记点连线"> | ||||
|         <ai-dialog-btn :modal="false" dialog-title="设置标记点连线" :customFooter="false" @onConfirm="savePolylines" | ||||
| @@ -27,120 +24,103 @@ | ||||
|         </ai-dialog-btn> | ||||
|       </ai-fold> | ||||
|     </template> | ||||
|     <div class="layout-config__group" v-else-if="!['hik','dahua'].includes(options.monitorType)"> | ||||
|       <h2>基础设置</h2> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>数据类型</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" v-model="options.dataType" placeholder="请选择数据类型"> | ||||
|             <el-option | ||||
|                 v-for="item in dataTypes" | ||||
|                 :key="item.value" | ||||
|                 :label="item.label" | ||||
|                 :value="item.value"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|     <template v-else-if="options.type=='plot'"> | ||||
|       <ai-fold v-for="(chart,i) in options.charts" :key="i" :title="chart.title"> | ||||
|         <config-item label="图表名"> | ||||
|           <el-input size="small" v-model="chart.title"/> | ||||
|         </config-item> | ||||
|         <config-item label="图表类型"> | ||||
|           <ai-select v-model="chart.chart" :select-list="charts"/> | ||||
|         </config-item> | ||||
|         <config-item label="数据类型"> | ||||
|           <ai-select v-model="chart.dataType" placeholder="请选择数据类型" :select-list="dataTypes"/> | ||||
|         </config-item> | ||||
|         <config-item v-if="chart.dataType=='dynamicData'" label="数据源"> | ||||
|           <ai-select v-model="chart.sourceDataId" placeholder="请选择数据源" :select-list="sourceData" | ||||
|                      :prop="{label:'description'}"/> | ||||
|         </config-item> | ||||
|         <div class="layout-config__code" v-else-if="chart.dataType === 'staticData'"> | ||||
|           <ai-dialog-btn :modal="false" dialog-title="编辑器" :customFooter="false" | ||||
|                          @confirm="chart.data=JSON.parse(json)" | ||||
|                          @open="json=JSON.stringify(chart.data||null)"> | ||||
|             <code-editor slot="btn" readonly :value="JSON.stringify(chart.data)" lang="json" theme="github" | ||||
|                          width="100%" height="250"/> | ||||
|             <code-editor v-model="json" lang="json" theme="github" width="100%" height="440"/> | ||||
|           </ai-dialog-btn> | ||||
|         </div> | ||||
|       </div> | ||||
|         <config-item label="接口地址" v-else-if="chart.dataType=='apiData'"> | ||||
|           <el-input size="mini" v-model="chart.api"/> | ||||
|         </config-item> | ||||
|       </ai-fold> | ||||
|       <el-button type="text" icon="el-icon-plus" @click="options.charts.push({title:'新图表'})">添加图表</el-button> | ||||
|     </template> | ||||
|     <div class="layout-config__group" v-else-if="['hik','dahua'].includes(options.monitorType)"> | ||||
|       <h2>基础设置</h2> | ||||
|       <config-item label="视频地址"> | ||||
|         <el-input size="mini" v-model="options.src"/> | ||||
|       </config-item> | ||||
|     </div> | ||||
|     <div class="layout-config__group" v-else> | ||||
|       <h2>基础设置</h2> | ||||
|       <config-item label="数据类型"> | ||||
|         <ai-select v-model="options.dataType" placeholder="请选择数据类型" :select-list="dataTypes"/> | ||||
|       </config-item> | ||||
|       <div class="layout-config__code" v-if="options.dataType === 'staticData'"> | ||||
|         <el-button @click="showEditor" class="layout-config__code--btn" title="编辑" type="text" | ||||
|                    icon="iconfont iconjdq_led_edit"></el-button> | ||||
|         <code-editor readonly :value="JSON.stringify(options.staticData, null, 2)" lang="json" theme="github" | ||||
|                      width="100%" height="250"></code-editor> | ||||
|         <ai-dialog-btn :modal="false" dialog-title="编辑器" :customFooter="false" @onConfirm="onConfirm" | ||||
|                        @open="showEditor"> | ||||
|           <code-editor slot="btn" readonly :value="JSON.stringify(options.staticData)" lang="json" theme="github" | ||||
|                        width="100%" height="250"/> | ||||
|           <code-editor v-model="json" lang="json" theme="github" width="100%" height="440"/> | ||||
|         </ai-dialog-btn> | ||||
|       </div> | ||||
|       <template v-else-if="options.dataType === 'dynamicData'"> | ||||
|         <div class="layout-config__item"> | ||||
|           <label>数据源</label> | ||||
|           <div class="layout-config__item--right"> | ||||
|             <el-select size="mini" v-model="options.sourceDataId" placeholder="请选择数据源" @change="onDataChange"> | ||||
|               <el-option | ||||
|                   v-for="item in sourceData" | ||||
|                   :key="item.id" | ||||
|                   :label="item.description" | ||||
|                   :value="item.id"> | ||||
|               </el-option> | ||||
|             </el-select> | ||||
|           </div> | ||||
|         </div> | ||||
|       </template> | ||||
|       <template v-else> | ||||
|         <div class="layout-config__item"> | ||||
|           <label>接口地址</label> | ||||
|           <div class="layout-config__item--right"> | ||||
|             <el-input size="mini" v-model="options.api" @blur="onApiChange"></el-input> | ||||
|           </div> | ||||
|         </div> | ||||
|       </template> | ||||
|       <config-item v-else-if="options.dataType === 'dynamicData'" label="数据源"> | ||||
|         <ai-select v-model="options.sourceDataId" placeholder="请选择数据源" :select-list="sourceData" | ||||
|                    :prop="{label:'description'}" @change="onDataChange"/> | ||||
|       </config-item> | ||||
|       <config-item label="接口地址" v-else> | ||||
|         <el-input size="mini" v-model="options.api" @change="onApiChange"/> | ||||
|       </config-item> | ||||
|     </div> | ||||
|     <div class="layout-config__group" v-if="options.monitorType === 'hik' || options.monitorType === 'dahua'"> | ||||
|       <h2>基础设置</h2> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>视频地址</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-input size="mini" v-model="options.src"></el-input> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="layout-config__group" | ||||
|          v-if="options.dataType !== 'staticData' && options.type === 'monitor' &&['cmcc','slw'].includes(options.monitorType)"> | ||||
|     <div v-if="options.dataType!='staticData'&&options.type=='monitor'&&['cmcc','slw'].includes(options.monitorType)" | ||||
|          class="layout-config__group"> | ||||
|       <h2>字段设置</h2> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>监控视频</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" v-model="options.moniterId" placeholder="请选择监控视频" @change="onMoniterId"> | ||||
|             <el-option | ||||
|                 v-for="(item, index) in monitorList" | ||||
|                 :key="index" | ||||
|                 :label="item.name" | ||||
|                 :value="item.id"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|         </div> | ||||
|       </div> | ||||
|       <config-item label="监控视频"> | ||||
|         <el-select size="mini" v-model="options.moniterId" placeholder="请选择监控视频" @change="onMoniterId"> | ||||
|           <el-option | ||||
|               v-for="(item, index) in monitorList" | ||||
|               :key="index" | ||||
|               :label="item.name" | ||||
|               :value="item.id"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|     </div> | ||||
|     <div class="layout-config__group" | ||||
|          v-if="options.dataType !== 'staticData' && options.type !== 'monitor' && keys.length && options.type !== 'table'"> | ||||
|     <div v-if="options.dataType!='staticData'&& keys.length &&!['table','monitor','map','plot'].includes(options.type)" | ||||
|          class="layout-config__group"> | ||||
|       <h2>字段设置</h2> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>X轴设置</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" v-model="options.dataX" placeholder="请选择X轴" @change="onChooseChange"> | ||||
|             <el-option | ||||
|                 v-for="(item, index) in keys" | ||||
|                 :key="index" | ||||
|                 :label="item" | ||||
|                 :value="item"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>Y轴设置</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" multiple :multiple-limit="options.type.indexOf('pie') > -1 ? 1 : 100" | ||||
|                      v-model="options.dataY" collapse-tags placeholder="请选择Y轴" | ||||
|                      @change="onChooseChange"> | ||||
|             <el-option | ||||
|                 v-for="(item, index) in keys" | ||||
|                 :key="index" | ||||
|                 :label="item" | ||||
|                 :value="item"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|         </div> | ||||
|       </div> | ||||
|       <config-item label="X轴设置"> | ||||
|         <el-select size="mini" v-model="options.dataX" placeholder="请选择X轴" @change="onChooseChange"> | ||||
|           <el-option | ||||
|               v-for="(item, index) in keys" | ||||
|               :key="index" | ||||
|               :label="item" | ||||
|               :value="item"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|       <config-item label="Y轴设置"> | ||||
|         <el-select size="mini" multiple :multiple-limit="options.type.indexOf('pie') > -1 ? 1 : 100" | ||||
|                    v-model="options.dataY" collapse-tags placeholder="请选择Y轴" | ||||
|                    @change="onChooseChange"> | ||||
|           <el-option | ||||
|               v-for="(item, index) in keys" | ||||
|               :key="index" | ||||
|               :label="item" | ||||
|               :value="item"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|     </div> | ||||
|     <ai-dialog | ||||
|         append-to-body | ||||
|         :visible.sync="isShowEditor" | ||||
|         width="1000px" | ||||
|         class="layout-config__edit" | ||||
|         title="编辑器" | ||||
|         @onConfirm="onConfirm"> | ||||
|       <div> | ||||
|         <code-editor v-model="json" lang="json" theme="github" width="100%" height="440"></code-editor> | ||||
|       </div> | ||||
|     </ai-dialog> | ||||
|     <ai-dialog class="layout-config__edit" v-model="showMapEditor" title="设置地图标记点" append-to-body | ||||
|                @close="form={}" @confirm="saveMarker"> | ||||
|       <el-form :model="form" size="small" ref="mapMarker" label-width="120px"> | ||||
| @@ -173,6 +153,8 @@ import 'brace/snippets/json'; | ||||
| import 'brace/theme/github'; | ||||
| import 'brace/theme/monokai'; | ||||
| import AiDialogBtn from "dui/packages/layout/AiDialogBtn.vue"; | ||||
| import AiFold from "dui/packages/layout/AiFold.vue"; | ||||
| import charts from "../../../../../components/AiEchart/echartTpls"; | ||||
|  | ||||
| export default { | ||||
|   name: 'dataConfig', | ||||
| @@ -189,19 +171,18 @@ export default { | ||||
|     return { | ||||
|       dataTypes: [ | ||||
|         { | ||||
|           value: 'staticData', | ||||
|           id: 'staticData', | ||||
|           label: '静态数据' | ||||
|         }, | ||||
|         { | ||||
|           value: 'dynamicData', | ||||
|           id: 'dynamicData', | ||||
|           label: '动态数据' | ||||
|         }, | ||||
|         { | ||||
|           value: 'apiData', | ||||
|           id: 'apiData', | ||||
|           label: '接口' | ||||
|         } | ||||
|       ], | ||||
|       isShowEditor: false, | ||||
|       json: "", | ||||
|       sourceDataId: '', | ||||
|       sourceData: [], | ||||
| @@ -209,15 +190,28 @@ export default { | ||||
|       monitorList: [], | ||||
|       list: [], | ||||
|       showMapEditor: false, | ||||
|       form: {} | ||||
|       form: {}, | ||||
|       charts: Object.keys(charts).map((label, id) => ({id, label})) | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     markers: v => v.options.staticData?.markers || [] | ||||
|     markers: v => v.options.staticData?.markers || [], | ||||
|   }, | ||||
|   components: { | ||||
|     AiFold, | ||||
|     AiDialogBtn, | ||||
|     CodeEditor, | ||||
|     configItem: { | ||||
|       props: { | ||||
|         label: String | ||||
|       }, | ||||
|       render(h) { | ||||
|         return h('div', {class: 'layout-config__item'}, [ | ||||
|           h('label', this.label), | ||||
|           h('div', {class: 'layout-config__item--right fill'}, this.$slots.default) | ||||
|         ]) | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     if (this.options.type == "map" && Array.isArray(this.options.staticData)) {//处理历史数据,并更新最新数据结构 | ||||
| @@ -257,7 +251,6 @@ export default { | ||||
|   methods: { | ||||
|     showEditor() { | ||||
|       this.json = JSON.stringify(this.options.staticData, null, 2) | ||||
|       this.isShowEditor = true | ||||
|     }, | ||||
|  | ||||
|     onMoniterId(e) { | ||||
| @@ -383,7 +376,6 @@ export default { | ||||
|  | ||||
|     onConfirm() { | ||||
|       this.$set(this.options, 'staticData', JSON.parse(this.json)) | ||||
|       this.isShowEditor = false | ||||
|       this.$emit('change') | ||||
|     }, | ||||
|     handleMapMarker(v = {}, index) { | ||||
| @@ -448,18 +440,6 @@ export default { | ||||
|     .layout-config__code { | ||||
|       position: relative; | ||||
|       padding-left: 10px; | ||||
|  | ||||
|       .layout-config__code--btn { | ||||
|         position: absolute; | ||||
|         right: 0; | ||||
|         top: 0; | ||||
|         color: gray; | ||||
|         z-index: 111; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.8; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     & > h2 { | ||||
| @@ -476,7 +456,7 @@ export default { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .layout-config__item { | ||||
|   :deep(.layout-config__item) { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: space-between; | ||||
| @@ -494,26 +474,11 @@ export default { | ||||
|       text-align: right; | ||||
|     } | ||||
|  | ||||
|     .layout-config__item--right { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: flex-end; | ||||
|       width: 200px; | ||||
|       text-align: right; | ||||
|     } | ||||
|  | ||||
|     .el-select .el-tag { | ||||
|       color: #fff; | ||||
|       background: transparent; | ||||
|     } | ||||
|  | ||||
|     input { | ||||
|       background: #262C33; | ||||
|       font-size: 12px; | ||||
|       color: #fff; | ||||
|       border: 1px solid #030411; | ||||
|     } | ||||
|  | ||||
|     .el-input__icon { | ||||
|       color: #fff; | ||||
|     } | ||||
| @@ -550,8 +515,22 @@ export default { | ||||
|     color: #f46; | ||||
|   } | ||||
|  | ||||
|   .el-button + .el-button { | ||||
|   .el-button--text + .el-button--text { | ||||
|     margin-left: 0; | ||||
|   } | ||||
|  | ||||
|   input { | ||||
|     background: #262C33; | ||||
|     font-size: 12px; | ||||
|     color: #fff; | ||||
|     border: 1px solid #030411; | ||||
|   } | ||||
|   .layout-config__item--right { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: flex-end; | ||||
|     text-align: right; | ||||
|     margin-left: 30px; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -106,10 +106,12 @@ | ||||
|           <div class="layout-config__item" v-if="config.type !== 'AiDvTable'"> | ||||
|             <label>表格行数</label> | ||||
|             <div class="layout-config__item--right"> | ||||
|               <el-input-number size="mini" style="width: 232px" :min="0" v-model="config.rowNum" controls-position="right"></el-input-number> | ||||
|               <el-input-number size="mini" style="width: 232px" :min="0" v-model="config.rowNum" | ||||
|                                controls-position="right"></el-input-number> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="layout-config__item table-config" v-if="config.type === 'AiDvTable'" v-for="(item, index) in config.config" :key="index"> | ||||
|           <div class="layout-config__item table-config" v-if="config.type === 'AiDvTable'" | ||||
|                v-for="(item, index) in config.config" :key="index"> | ||||
|             <label>第{{ index + 1 }}列</label> | ||||
|             <div class="layout-config__item--right"> | ||||
|               <el-select size="mini" style="width: 80px;" v-model="item.align" placeholder="请选择" clearable> | ||||
| @@ -215,7 +217,7 @@ export default { | ||||
|   data() { | ||||
|     return { | ||||
|       borderList: ['border0', 'border1', 'border2', 'border3', 'border4', 'border5', 'border6', 'border7', 'border8', 'border9', 'border10', | ||||
|     'border11', 'border12', 'border13'],//边框待选项 | ||||
|         'border11', 'border12', 'border13'],//边框待选项 | ||||
|       summaryList: ['summary0', 'summary1', 'summary2', 'summary3', 'summary4', 'summary6', 'summary5', | ||||
|         'summary7', 'summary8', 'summary9', 'summary10', 'summary11', 'summary12', 'summary13', 'summary14', | ||||
|         'summary15', 'summary16', 'summary17', 'summary18'],//汇总待选项 | ||||
| @@ -239,9 +241,7 @@ export default { | ||||
|       width: 232px; | ||||
|  | ||||
|       :deep( .el-select ) { | ||||
|         width: 80px input { | ||||
|           width: 80px; | ||||
|         } | ||||
|         width: 80px; | ||||
|       } | ||||
|  | ||||
|       .el-select { | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| /** | ||||
|  * 大屏设计组件库,模板设置中心 | ||||
|  * | ||||
|  */ | ||||
| const components = [ | ||||
|   { | ||||
|     type: 'chart', | ||||
| @@ -454,6 +458,36 @@ const components = [ | ||||
|             dynamicData: [] | ||||
|           } | ||||
|         ] | ||||
|       }, | ||||
|       { | ||||
|         label: "多维图", | ||||
|         type: "plot", | ||||
|         list: [ | ||||
|           { | ||||
|             type: 'plot', | ||||
|             label: '多维图表', | ||||
|             title: '多维图表', | ||||
|             border: 'border0', | ||||
|             width: 500, | ||||
|             height: 300, | ||||
|             top: 0, | ||||
|             left: 0, | ||||
|             thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png', | ||||
|             charts: [ | ||||
|               { | ||||
|                 title: "饼状图统计", | ||||
|                 chart: "pieChart2", dataType: 'staticData', | ||||
|                 data: [ | ||||
|                   {name: '阿斯达', v1: 23, v2: 33}, | ||||
|                   {name: '水电费', v1: 12, v2: 34}, | ||||
|                   {name: '凡哥', v1: 67, v2: 25}, | ||||
|                   {name: '党费', v1: 98, v2: 85} | ||||
|                 ] | ||||
|               } | ||||
|             ], | ||||
|  | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user