| <template> | 
|   <div v-if="show"> | 
|     <el-form label-position="top" class="widget-config"> | 
|       <template v-if="['button', 'button-dropdown'].indexOf(data.type)>=0"> | 
|         <el-form-item label="按钮名称"> | 
|           <el-input v-model="data.label" type="text"></el-input> | 
|         </el-form-item> | 
|         <el-form-item label="图标"> | 
|           <el-input v-model="data.options.icon" type="text" style="width:68.5%"></el-input> | 
|   | 
|           <el-popover ref="icon-popover" placement="bottom" title="选择图标" width="1230" trigger="click" popper-class="select-icon"> | 
|             <el-button slot="reference" style="width:30%" @click.native="selectIcon">选择</el-button> | 
|             <el-scrollbar :noresize="false" :native="false" wrap-class="scrollbar-wrap"> | 
|               <keep-alive> | 
|                 <select-icon @onSelectIcon="(icon)=>{onSelectIcon(icon)}"></select-icon> | 
|               </keep-alive> | 
|             </el-scrollbar> | 
|             <el-footer style="padding-top:10px;border-top:1px solid #f3f3f3;text-align:right;"> | 
|               <el-button type="primary" @click="()=>{$refs['icon-popover'].doClose();}">关闭</el-button> | 
|             </el-footer> | 
|           </el-popover> | 
|         </el-form-item> | 
|         <el-form-item label="权限点名称"> | 
|           <el-input v-model="data.options.authNode" type="text"></el-input> | 
|         </el-form-item> | 
|   | 
|         <el-row :gutter="10"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="按钮类型"> | 
|               <el-select v-model="data.options.type"> | 
|                 <el-option value="default">default</el-option> | 
|                 <el-option value="primary">primary</el-option> | 
|                 <el-option value="success">success</el-option> | 
|                 <el-option value="warning">warning</el-option> | 
|                 <el-option value="danger">danger</el-option> | 
|                 <el-option value="info">info</el-option> | 
|                 <el-option value="text">text</el-option> | 
|               </el-select> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item label="朴素"> | 
|               <el-switch v-model="data.options.plain"> | 
|               </el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="data.options.authNode && data.options.authNode.indexOf('import')>=0" :gutter="10"> | 
|           <el-col :span="16"> | 
|             <el-form-item label="导入API地址"> | 
|               <el-input v-model="data.options.url" type="text"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="8"> | 
|             <el-form-item label="关联模板ID"> | 
|               <el-input v-model.number="data.options.importInfo_Id" controls-position="right"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="data.options.authNode && data.options.authNode.indexOf('export')>=0" :gutter="10"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="关联模板ID"> | 
|               <el-input v-model.number="data.options.exportInfo_Id" controls-position="right"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="data.type==='button-dropdown'" :gutter="10"> | 
|           <el-col :span="24"> | 
|             <el-form-item label="下拉框项"> | 
|               <draggable :list="data.options.options" :options="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}" tag="ul"> | 
|                 <li v-for="(item, index) in data.options.options" :key="index"> | 
|                   <el-input v-model="item.label" style="width:110px;" size="mini" placeholder="按钮名称"></el-input> | 
|                   <el-input v-model="item.authNode" style="width:90px;" size="mini" placeholder="动作名称"></el-input> | 
|                   <i class="drag-item el-icon-yrt-yidong1" style="font-size: 16px;margin: 0 5px;cursor: move;"></i> | 
|                   <el-button circle plain type="danger" size="mini" icon="el-icon-minus" style="padding: 4px;margin-left: 5px;" @click="handleOptionsRemove(index)"></el-button> | 
|                 </li> | 
|               </draggable> | 
|               <div style="margin-left: 22px;"> | 
|                 <el-button type="text" @click="data.options.options.push({label: null, authNode: null})">添加选项</el-button> | 
|               </div> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-form-item label="key"> | 
|           <el-input v-model="data.key" type="text"></el-input> | 
|         </el-form-item> | 
|       </template> | 
|       <template v-if="['button-group'].indexOf(data.type)>=0"> | 
|         <el-form-item label="按钮分组名称"> | 
|           <el-input v-model="data.label" type="text"></el-input> | 
|         </el-form-item> | 
|         <el-form-item label="包含按钮数"> | 
|           {{ data.buttons.length }} 个 | 
|         </el-form-item> | 
|       </template> | 
|   | 
|       <template v-if="data.type == 'grid'"> | 
|         <el-form-item label="栅格间隔"> | 
|           <el-input v-model.number="data.options.gutter" type="number"></el-input> | 
|         </el-form-item> | 
|         <el-form-item label="tab分组名"> | 
|           <el-input v-model="data.tabGroupName"></el-input> | 
|         </el-form-item> | 
|         <el-form-item label="列配置项"> | 
|           <draggable :list="data.columns" :options="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}" tag="ul"> | 
|             <li v-for="(item, index) in data.columns" :key="index"> | 
|               <i class="drag-item el-icon-yrt-yidong1" style="font-size: 16px;margin: 0 5px;cursor: move;"></i> | 
|               <el-input v-model.number="item.span" placeholder="栅格值" size="mini" style="width: 100px;" type="number"></el-input> | 
|               <el-button circle plain type="danger" size="mini" icon="el-icon-minus" style="padding: 4px;margin-left: 5px;" @click="handleOptionsRemove(index)"></el-button> | 
|             </li> | 
|           </draggable> | 
|           <div style="margin-left: 22px;"> | 
|             <el-button type="text" @click="handleAddColumn">添加列</el-button> | 
|           </div> | 
|         </el-form-item> | 
|         <el-form-item label="水平排列方式"> | 
|           <el-select v-model="data.options.justify"> | 
|             <el-option value="start" label="左对齐"></el-option> | 
|             <el-option value="end" label="右对齐"></el-option> | 
|             <el-option value="center" label="居中"></el-option> | 
|             <el-option value="space-around" label="两侧间隔相等"></el-option> | 
|             <el-option value="space-between" label="两端对齐"></el-option> | 
|           </el-select> | 
|         </el-form-item> | 
|         <el-form-item label="垂直排列方式"> | 
|           <el-select v-model="data.options.align"> | 
|             <el-option value="top" label="顶部对齐"></el-option> | 
|             <el-option value="middle" label="居中"></el-option> | 
|             <el-option value="bottom" label="底部对齐"></el-option> | 
|           </el-select> | 
|         </el-form-item> | 
|       </template> | 
|       <template v-if="data.type == 'detail-grid'"> | 
|   | 
|         <el-row :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="关联子表名" required> | 
|               <el-input v-model="data.subTableView"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item label="子表主键字段名" required> | 
|               <el-input v-model="data.options.idField"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|         <el-row :gutter="3"> | 
|           <el-col :span="6"> | 
|             <el-form-item label="分页大小"> | 
|               <el-input v-model.number="data.options.pageSize"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="18"> | 
|             <el-form-item label="子表排序方式"> | 
|               <el-input v-model="orderBy"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="标题名称"> | 
|               <el-input v-model="data.options.title"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|           <!-- <el-col :span="12"> | 
|             <el-form-item label="文件夹名"> | 
|               <el-input v-model="data.folder"></el-input> | 
|             </el-form-item> | 
|           </el-col> --> | 
|         </el-row> | 
|   | 
|         <el-row :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="是否带有纵向边框"> | 
|               <el-switch v-model="data.options.border"> | 
|               </el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item label="显示求和行"> | 
|               <el-switch v-model="data.options.showSumField" active-text="是" inactive-text="否"> | 
|               </el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-form-item label="表格尺寸"> | 
|           <el-select v-model="data.options.size"> | 
|             <el-option value="medium">medium</el-option> | 
|             <el-option value="small">small</el-option> | 
|             <el-option value="mini">mini</el-option> | 
|           </el-select> | 
|         </el-form-item> | 
|         <el-form-item label="表格最大高度"> | 
|           <el-input v-model.number="data.options['max-height']"> | 
|             <template slot="append">px</template> | 
|           </el-input> | 
|         </el-form-item> | 
|         <el-form-item label="分页大小"> | 
|           <el-input v-model.number="data.options.pageSize"> | 
|           </el-input> | 
|         </el-form-item> | 
|         <el-form-item label="默认打开页面索引(默认为1)"> | 
|           <el-input v-model.number="data.options.pageIndex"> | 
|           </el-input> | 
|         </el-form-item> | 
|       </template> | 
|       <template v-if="data.type == 'inline-group'"> | 
|         <el-form-item label="标题"> | 
|           <el-input v-model="data.label"></el-input> | 
|         </el-form-item> | 
|         <el-form-item label="tab分组名"> | 
|           <el-input v-model="data.tabGroupName"></el-input> | 
|         </el-form-item> | 
|       </template> | 
|       <template v-if="data.type == 'splitter-group'"> | 
|         <el-form-item label="标题"> | 
|           <el-input v-model="data.label"></el-input> | 
|         </el-form-item> | 
|         <el-form-item label="tab分组名"> | 
|           <el-input v-model="data.tabGroupName"></el-input> | 
|         </el-form-item> | 
|       </template> | 
|       <template v-if="isFieldType(data.type)"> | 
|         <el-row :gutter="15"> | 
|           <el-col :span="12"> | 
|             <el-form-item v-if="isFieldType(data.type)" label="标题"> | 
|               <el-input v-model="data.label"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item v-if="isFieldType(data.type) && data.options" label="显示标题"> | 
|               <el-switch v-model="data.options.noLabel" :active-value="false" :inactive-value="true"></el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item v-if="isFieldType(data.type)" label="输入框类型"> | 
|               <el-select v-model="data.type" placeholder="请选择" @change="($event)=>{dataTypeChange($event, data);}"> | 
|                 <el-option v-for="(item, index) in basicComponents" :key="index" :label="item.label" :value="item.type"> | 
|                 </el-option> | 
|               </el-select> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item label="数据类型"> | 
|               <el-select v-model="data.options.dataType" placeholder="请选择"> | 
|                 <el-option v-for="(item, index) in dataTypeList" :key="index" :label="item" :value="item"> | 
|                 </el-option> | 
|               </el-select> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item v-if="isFieldType(data.type)" label="是否只读"> | 
|               <el-switch v-model="data.options.readonly" :active-value="true" :inactive-value="false"></el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item v-if="isFieldType(data.type)" label="绑定字段"> | 
|               <el-input v-model="data.options.prop"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="data.type==='table-select'"> | 
|           <el-col :span="24"> | 
|             <el-form-item label="接口地址"> | 
|               <el-input v-model="data.options.url"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="data.type==='table-select'"> | 
|           <el-col :span="24"> | 
|             <el-form-item label="查询字段"> | 
|               <el-input v-model="data.options.searchFields" :rows="2" type="textarea"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="data.type==='table-select'"> | 
|           <el-col :span="24"> | 
|             <el-form-item label="表格字段定义"> | 
|               <el-row v-for="(item, index) in data.options.columns" :key="index"> | 
|                 <el-col :span="11"> | 
|                   <el-input v-model="item.prop" placeholder="字段英文名" class="col-param"></el-input> | 
|                 </el-col> | 
|                 <el-col :span="8"> | 
|                   <el-input v-model="item.label" placeholder="字段中文名" class="col-param"></el-input> | 
|                 </el-col> | 
|                 <el-col :span="5"> | 
|                   <el-input v-model.number="item.width" placeholder="宽度" class="col-param"></el-input> | 
|                 </el-col> | 
|               </el-row> | 
|               <el-button type="text" @click="(e)=>{data.options.columns.push({})}">添加字段</el-button> | 
|               <el-button type="text" @click="(e)=>{data.options.columns.pop()}">删除字段</el-button> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item v-if="Object.keys(data.options).indexOf('width')>=0" label="输入框宽度"> | 
|               <el-input v-model="data.options.width"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col v-if="Object.keys(data.options).indexOf('placeholder')>=0" :span="12"> | 
|             <el-form-item label="占位内容"> | 
|               <el-input v-model="data.options.placeholder"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="Object.keys(data.options).indexOf('styles')>=0" :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="字体大小"> | 
|               <el-input-number v-model.number="data.options.styles.fontSize" :min="0" :step="1" controls-position="right" class="w-110"></el-input-number> px | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item label="行高"> | 
|               <el-input-number v-model.number="data.options.styles.lineHeight" :min="0" :step="1" controls-position="right" class="w-110"></el-input-number> px | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="标题宽度"> | 
|               <el-input-number v-model.number="data.options['label-width']" :min="0" :step="1" controls-position="right" class="w-120"></el-input-number> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item label="无外边距"> | 
|               <el-switch v-model="data.options.noMargin"></el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-form-item v-if="Object.keys(data.options).indexOf('size')>=0" label="大小"> | 
|           宽度: | 
|           <el-input v-model.number="data.options.size.width" style="width: 90px;" type="number"></el-input> | 
|           高度: | 
|           <el-input v-model.number="data.options.size.height" style="width: 90px;" type="number"></el-input> | 
|         </el-form-item> | 
|   | 
|         <el-form-item v-if="Object.keys(data.options).indexOf('inline')>=0" label="布局方式"> | 
|           <el-radio-group v-model="data.options.inline"> | 
|             <el-radio-button :label="false">块级</el-radio-button> | 
|             <el-radio-button :label="true">行内</el-radio-button> | 
|           </el-radio-group> | 
|         </el-form-item> | 
|         <el-form-item v-if="Object.keys(data.options).indexOf('showInput')>=0" label="显示输入框"> | 
|           <el-switch v-model="data.options.showInput"></el-switch> | 
|         </el-form-item> | 
|   | 
|         <el-row v-if="data.type=='upload-image'" :gutter="3"> | 
|           <el-col :span="24"> | 
|             <el-form-item label="服务器地址"> | 
|               <el-input v-model="data.options.serverAction"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="data.type=='upload-image'" :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="是否多图"> | 
|               <el-switch v-model="data.options.multiple"></el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item label="上次最大数"> | 
|               <el-input-number v-model="data.options.max" :min="0" :max="10" :step="1" controls-position="right" class="w-120"></el-input-number> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|         <el-row v-if="data.type=='upload-image'" :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="文件列表类型"> | 
|               <el-select v-model="data.options.listType" placeholder="请选择"> | 
|                 <el-option label="picture-card" value="picture-card"></el-option> | 
|                 <el-option label="picture" value="picture"></el-option> | 
|                 <el-option label="text" value="text"></el-option> | 
|               </el-select> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row v-if="data.type=='select' || data.type=='tree'" :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="是否多选"> | 
|               <el-switch v-model="data.options.multiple" @change="handleSelectMuliple"></el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item label="下拉框主键字段"> | 
|               <el-input v-model="data.options.keyProp"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-form-item v-if="Object.keys(data.options).indexOf('allowHalf')>=0" label="允许半选"> | 
|           <el-switch v-model="data.options.allowHalf"> | 
|           </el-switch> | 
|         </el-form-item> | 
|         <el-form-item v-if="Object.keys(data.options).indexOf('showAlpha')>=0" label="支持透明度选择"> | 
|           <el-switch v-model="data.options.showAlpha"> | 
|           </el-switch> | 
|         </el-form-item> | 
|   | 
|         <el-row :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item v-if="Object.keys(data.options).indexOf('showLabel')>=0" label="是否显示标签"> | 
|               <el-switch v-model="data.options.showLabel"> | 
|               </el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="12"> | 
|             <el-form-item v-if="data.type=='tree'" label="仅选择叶节点"> | 
|               <el-switch v-model="data.options.onlySelectLeaf"> | 
|               </el-switch> | 
|             </el-form-item> | 
|             <el-form-item v-if="data.type=='select'" label="可搜索"> | 
|               <el-switch v-model="data.options.filterable"> | 
|               </el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-form-item v-if="Object.keys(data.options).indexOf('options')>=0" label="选项"> | 
|           <el-radio-group v-model="data.options.remote" size="mini" style="margin-bottom:10px;"> | 
|             <el-radio-button :label="'bindDropdown'">下拉框ID</el-radio-button> | 
|             <el-radio-button :label="false">静态数据</el-radio-button> | 
|             <el-radio-button :label="true">远端数据</el-radio-button> | 
|           </el-radio-group> | 
|           <template v-if="data.options.remote===true"> | 
|             <div> | 
|               <el-input v-model="data.options.remoteFunc" size="mini" style=""> | 
|                 <template slot="prepend">远端方法</template> | 
|               </el-input> | 
|               <el-input v-model="data.options.props.value" size="mini" style=""> | 
|                 <template slot="prepend">值</template> | 
|               </el-input> | 
|               <el-input v-model="data.options.props.label" size="mini" style=""> | 
|                 <template slot="prepend">标签</template> | 
|               </el-input> | 
|             </div> | 
|           </template> | 
|           <template v-else-if="data.options.remote==='bindDropdown'"> | 
|             <el-input v-model.number="data.options.dropdown_Id" type="number" size="mini"> | 
|               <template slot="prepend">关联下拉框ID</template> | 
|             </el-input> | 
|           </template> | 
|           <template v-else> | 
|             <template v-if="data.type=='radio' || (data.type=='select'&&!data.options.multiple)"> | 
|               <el-radio-group v-model="data.options.defaultValue"> | 
|                 <draggable :list="data.options.options" :options="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}" tag="ul"> | 
|                   <li v-for="(item, index) in data.options.options" :key="index"> | 
|                     <el-radio :label="item.value" style="margin-right: 5px;"> | 
|                       <el-input v-model="item.value" style="width:90px;" size="mini"></el-input> | 
|                       <el-input v-model="item.label" style="width:90px;" size="mini"></el-input> | 
|                       <!-- <input v-model="item.value"/> --> | 
|                     </el-radio> | 
|                     <i class="drag-item el-icon-yrt-yidong1" style="font-size: 16px;margin: 0 5px;cursor: move;"></i> | 
|                     <el-button circle plain type="danger" size="mini" icon="el-icon-minus" style="padding: 4px;margin-left: 5px;" @click="handleOptionsRemove(index)"></el-button> | 
|                   </li> | 
|                 </draggable> | 
|               </el-radio-group> | 
|             </template> | 
|   | 
|             <template v-if="data.type=='checkbox' || (data.type=='select' && data.options.multiple)"> | 
|               <el-checkbox-group v-model="data.options.defaultValue"> | 
|   | 
|                 <draggable :list="data.options.options" :options="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}" tag="ul"> | 
|                   <li v-for="(item, index) in data.options.options" :key="index"> | 
|                     <el-checkbox :label="item.value" style="margin-right: 5px;"> | 
|                       <el-input v-model="item.value" :style="{'width': data.options.showLabel? '90px': '190px' }" size="mini"></el-input> | 
|                       <el-input v-if="data.options.showLabel" v-model="item.label" style="width:100px;" size="mini"></el-input> | 
|                     </el-checkbox> | 
|                     <i class="drag-item el-icon-yrt-yidong1" style="font-size: 16px;margin: 0 5px;cursor: move;"></i> | 
|                     <el-button circle plain type="danger" size="mini" icon="el-icon-minus" style="padding: 4px;margin-left: 5px;" @click="handleOptionsRemove(index)"></el-button> | 
|   | 
|                   </li> | 
|                 </draggable> | 
|               </el-checkbox-group> | 
|             </template> | 
|             <div style="margin-left: 22px;"> | 
|               <el-button type="text" @click="handleAddOption">添加选项</el-button> | 
|             </div> | 
|           </template> | 
|   | 
|         </el-form-item> | 
|   | 
|         <el-form-item v-if="Object.keys(data.options).indexOf('defaultValue')>=0 && (['textarea', 'input', 'rate', 'color', 'switch', 'radio', 'tree', 'date', 'select'].indexOf(data.type)>=0)" label="默认值"> | 
|           <el-input v-if="data.type=='textarea'" v-model="data.options.defaultValue" :rows="5" type="textarea"></el-input> | 
|           <template v-if="['input', 'radio', 'switch', 'tree', 'date', 'select'].indexOf(data.type)>=0"> | 
|             <el-input v-if="['byte', 'int32', 'int64', 'float'].indexOf(data.options.dataType)>=0" v-model.number="data.options.defaultValue"></el-input> | 
|             <el-input v-else v-model="data.options.defaultValue"></el-input> | 
|           </template> | 
|           <el-rate v-if="data.type == 'rate'" v-model="data.options.defaultValue" :max="data.options.max" :allow-half="data.options.allowHalf" style="display:inline-block;vertical-align: middle;"></el-rate> | 
|           <el-button v-if="data.type == 'rate'" type="text" style="display:inline-block;vertical-align: middle;margin-left: 10px;" @click="data.options.defaultValue=0">清空</el-button> | 
|           <el-color-picker v-if="data.type == 'color'" v-model="data.options.defaultValue" :show-alpha="data.options.showAlpha"></el-color-picker> | 
|         </el-form-item> | 
|   | 
|         <template v-if="data.type == 'time' || data.type == 'date'"> | 
|           <el-row :gutter="3"> | 
|             <el-col :span="8"> | 
|               <el-form-item v-if="data.type == 'date'" label="显示类型"> | 
|                 <el-select v-model="data.options.type"> | 
|                   <el-option value="year"></el-option> | 
|                   <el-option value="month"></el-option> | 
|                   <el-option value="date"></el-option> | 
|                   <el-option value="dates"></el-option> | 
|                   <!-- <el-option value="week"></el-option> --> | 
|                   <el-option value="datetime"></el-option> | 
|                   <el-option value="datetimerange"></el-option> | 
|                   <el-option value="daterange"></el-option> | 
|                 </el-select> | 
|               </el-form-item> | 
|             </el-col> | 
|             <el-col :span="16"> | 
|               <el-form-item label="格式"> | 
|                 <el-select v-model="data.options.format" style="width:100%;"> | 
|                   <el-option label="yyyy-MM-dd" value="yyyy-MM-dd"></el-option> | 
|                   <el-option label="yyyy-MM-dd HH:mm:ss" value="yyyy-MM-dd HH:mm:ss"></el-option> | 
|                   <el-option label="HH:mm:ss" value="HH:mm:ss"></el-option> | 
|                   <el-option label="HH:mm" value="HH:mm"></el-option> | 
|                 </el-select> | 
|               </el-form-item> | 
|             </el-col> | 
|           </el-row> | 
|           <el-row v-if="data.type === 'time'" :gutter="10"> | 
|             <el-col :span="12"> | 
|               <el-form-item label="范围选择"> | 
|                 <el-switch v-model="data.options.isRange"> | 
|                 </el-switch> | 
|               </el-form-item> | 
|             </el-col> | 
|             <el-col :span="12"> | 
|               <el-form-item label="固定时间选择模式"> | 
|                 <el-switch v-model="data.options.fixedTimeSelect"> | 
|                 </el-switch> | 
|               </el-form-item> | 
|             </el-col> | 
|           </el-row> | 
|   | 
|           <el-form-item v-if="data.type == 'date'" label="是否获取时间戳"> | 
|             <el-switch v-model="data.options.timestamp"> | 
|             </el-switch> | 
|           </el-form-item> | 
|           <el-form-item v-if="data.options.isRange || data.options.type=='datetimerange' || data.options.type=='daterange'" label="结束时间占位内容"> | 
|             <el-input v-model="data.options.endPlaceholder"></el-input> | 
|           </el-form-item> | 
|           <el-row v-if="data.type === 'time'" :gutter="10"> | 
|             <el-col :span="8"> | 
|               <el-form-item label="开始时间"> | 
|                 <el-input v-model="data.options.start"></el-input> | 
|               </el-form-item> | 
|             </el-col> | 
|             <el-col :span="8"> | 
|               <el-form-item label="结束时间"> | 
|                 <el-input v-model="data.options.end"></el-input> | 
|               </el-form-item> | 
|             </el-col> | 
|             <el-col :span="8"> | 
|               <el-form-item label="步长"> | 
|                 <el-input v-model="data.options.step"></el-input> | 
|               </el-form-item> | 
|             </el-col> | 
|           </el-row> | 
|           <el-form-item v-if="data.type=='time' && Object.keys(data.options).indexOf('isRange')>=0" label="默认值"> | 
|             <el-time-picker v-if="!data.options.isRange" key="1" v-model="data.options.defaultValue" :arrow-control="data.options.arrowControl" :value-format="data.options.format" style="width: 100%;"> | 
|             </el-time-picker> | 
|             <el-time-picker v-if="data.options.isRange" key="2" v-model="data.options.defaultValue" :arrow-control="data.options.arrowControl" :value-format="data.options.format" is-range style="width: 100%;"> | 
|             </el-time-picker> | 
|           </el-form-item> | 
|         </template> | 
|   | 
|         <template v-if="data.type=='imgupload'"> | 
|           <el-form-item label="最大上传数"> | 
|             <el-input v-model.number="data.options.length" type="number"></el-input> | 
|           </el-form-item> | 
|           <el-form-item :required="true" label="Domain"> | 
|             <el-input v-model="data.options.domain"></el-input> | 
|           </el-form-item> | 
|           <el-form-item :required="true" label="获取七牛Token方法"> | 
|             <el-input v-model="data.options.tokenFunc"></el-input> | 
|           </el-form-item> | 
|         </template> | 
|   | 
|         <template v-if="data.type=='blank'"> | 
|           <el-form-item label="绑定数据类型"> | 
|             <el-select v-model="data.options.defaultType"> | 
|               <el-option value="String" label="字符"></el-option> | 
|               <el-option value="Object" label="对象"></el-option> | 
|               <el-option value="Array" label="数组"></el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|         </template> | 
|   | 
|         <el-form-item v-if="data.type=='tree'" label="ajax请求参数"> | 
|           <el-input v-model="currentAjaxParams" :rows="3" type="textarea"></el-input> | 
|         </el-form-item> | 
|   | 
|         <el-row v-if="['byte', 'int32', 'float', 'decimal'].indexOf(data.options.dataType)>=0" :gutter="3"> | 
|           <el-col :span="12"> | 
|             <el-form-item label="格式化"> | 
|               <el-select v-model="data.options.formatter"> | 
|                 <el-option label="[清空]" value=""></el-option> | 
|                 <el-option label="YYYY-MM-DD" value="YYYY-MM-DD"></el-option> | 
|                 <el-option label="YYYY-MM-DD HH:mm:ss" value="YYYY-MM-DD HH:mm:ss"></el-option> | 
|                 <el-option label="¥#.00" value="¥#.00"></el-option> | 
|                 <el-option label="#" value="#"></el-option> | 
|                 <el-option label="#.#" value="#.#"></el-option> | 
|                 <el-option label="#.##" value="#.##"></el-option> | 
|                 <el-option label="#.###" value="#.###"></el-option> | 
|                 <el-option label="#.####" value="#.####"></el-option> | 
|                 <el-option label="#.0" value="#.0"></el-option> | 
|                 <el-option label="#.00" value="#.00"></el-option> | 
|                 <el-option label="#.000" value="#.000"></el-option> | 
|                 <el-option label="#.0000" value="#.0000"></el-option> | 
|               </el-select> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-row :gutter="10"> | 
|           <el-col :span="16"> | 
|             <el-form-item label="数据绑定Key"> | 
|               <el-input v-model="data.key"></el-input> | 
|             </el-form-item> | 
|           </el-col> | 
|           <el-col :span="8"> | 
|             <el-form-item label="扩展字段"> | 
|               <el-switch v-model="data.options.isExpandField"> | 
|               </el-switch> | 
|             </el-form-item> | 
|           </el-col> | 
|         </el-row> | 
|   | 
|         <el-form-item label="操作属性"> | 
|           <el-checkbox v-if="Object.keys(data.options).indexOf('readonly')>=0" v-model="data.options.readonly">完全只读</el-checkbox> | 
|           <el-checkbox v-if="Object.keys(data.options).indexOf('disabled')>=0" v-model="data.options.disabled">禁用 </el-checkbox> | 
|           <el-checkbox v-if="Object.keys(data.options).indexOf('editable')>=0" v-model="data.options.editable">文本框可输入</el-checkbox> | 
|           <el-checkbox v-if="Object.keys(data.options).indexOf('clearable')>=0" v-model="data.options.clearable">显示清除按钮</el-checkbox> | 
|           <el-checkbox v-if="Object.keys(data.options).indexOf('arrowControl')>=0" v-model="data.options.arrowControl">使用箭头进行时间选择</el-checkbox> | 
|         </el-form-item> | 
|         <el-form-item label="校验"> | 
|           <div> | 
|             <el-checkbox v-model="data.options.required">必填</el-checkbox> | 
|           </div> | 
|           <el-select v-model="data.options.ruleType" size="mini"> | 
|             <el-option value="string" label="字符串"></el-option> | 
|             <el-option value="number" label="数字"></el-option> | 
|             <el-option value="boolean" label="布尔值"></el-option> | 
|             <el-option value="integer" label="整数"></el-option> | 
|             <el-option value="float" label="浮点数"></el-option> | 
|             <el-option value="url" label="URL地址"></el-option> | 
|             <el-option value="email" label="邮箱地址"></el-option> | 
|             <el-option value="hex" label="十六进制"></el-option> | 
|           </el-select> | 
|   | 
|           <div v-if="Object.keys(data.options).indexOf('pattern')>=0"> | 
|             <el-input v-model.lazy="data.options.pattern" size="mini" style=" width: 240px;" placeholder="填写正则表达式"></el-input> | 
|           </div> | 
|         </el-form-item> | 
|         <template v-if="data.type=='switch'"> | 
|   | 
|           <el-row :gutter="3"> | 
|             <el-col :span="12"> | 
|               <el-form-item label="打开时的文字描述"> | 
|                 <el-input v-model="data.options['active-text']"></el-input> | 
|               </el-form-item> | 
|             </el-col> | 
|             <el-col :span="12"> | 
|               <el-form-item label="关闭时的文字描述"> | 
|                 <el-input v-model="data.options['inactive-text']"></el-input> | 
|               </el-form-item> | 
|             </el-col> | 
|           </el-row> | 
|   | 
|           <!--设置值--> | 
|           <template v-if="['byte', 'int32', 'float'].indexOf(data.options.dataType)>=0"> | 
|             <el-row :gutter="3"> | 
|               <el-col :span="12"> | 
|                 <el-form-item label="打开时的值number"> | 
|                   <el-input v-model.number="data.options['active-value']"></el-input> | 
|                 </el-form-item> | 
|               </el-col> | 
|               <el-col :span="12"> | 
|                 <el-form-item label="关闭时的值number"> | 
|                   <el-input v-model.number="data.options['inactive-value']"></el-input> | 
|                 </el-form-item> | 
|               </el-col> | 
|             </el-row> | 
|           </template> | 
|           <template v-else> | 
|             <el-row :gutter="3"> | 
|               <el-col :span="12"> | 
|                 <el-form-item label="打开时的值"> | 
|                   <el-input v-model="data.options['active-value']"></el-input> | 
|                 </el-form-item> | 
|               </el-col> | 
|               <el-col :span="12"> | 
|                 <el-form-item label="关闭时的值"> | 
|                   <el-input v-model="data.options['inactive-value']"></el-input> | 
|                 </el-form-item> | 
|               </el-col> | 
|             </el-row> | 
|           </template> | 
|         </template> | 
|       </template> | 
|     </el-form> | 
|   </div> | 
| </template> | 
|   | 
| <script> | 
| import Draggable from "vuedraggable"; | 
| import SelectIcon from "./select-icon.vue"; | 
|   | 
| export default { | 
|   components: { | 
|     Draggable, | 
|     SelectIcon | 
|   }, | 
|   props: { | 
|     data: { | 
|       type: Object, | 
|       default: () => { | 
|         return {}; | 
|       } | 
|     }, | 
|     basicComponents: { | 
|       type: Array, | 
|       default: () => [] | 
|     } | 
|   }, | 
|   data() { | 
|     return { | 
|       // 验证规则 | 
|       validator: { | 
|         type: null, | 
|         required: null, | 
|         pattern: null, | 
|         range: null, | 
|         length: null | 
|       }, | 
|       // 非字段类型 | 
|       noFieldType: ["grid", "detail-grid", "inline-group", "splitter-group", "button", "button-group"], | 
|       // 数据类型 | 
|       dataTypeList: ["string", "byte", "int32", "int64", "bool", "float", "decimal", "date", "datetime", "time"] | 
|     }; | 
|   }, | 
|   computed: { | 
|     show() { | 
|       if (this.data && Object.keys(this.data).length > 0) { | 
|         return true; | 
|       } | 
|       return false; | 
|     }, | 
|     // tree Ajax加载属性 | 
|     currentAjaxParams: { | 
|       get: function() { | 
|         var params = this.data.ajaxParams; | 
|         if (params) { | 
|           return JSON.stringify(params, 0, 2); | 
|         } else { | 
|           return ""; | 
|         } | 
|       }, | 
|       set: function(val) { | 
|         try { | 
|           this.data.ajaxParams = JSON.parse(val); | 
|           this.$message.success("json格式正确"); | 
|         } catch (error) { | 
|           this.$message.error("数据结构不正确,不是有效的json格式," + error.message); | 
|         } | 
|       } | 
|     }, | 
|     // 排序方式 | 
|     orderBy: { | 
|       get: function() { | 
|         return JSON.stringify(this.data.options.orderBy); | 
|       }, | 
|       set: function(val) { | 
|         try { | 
|           const orderBy = JSON.parse(val); | 
|           this.$set(this.data.options, "orderBy", orderBy); | 
|           this.$message.success("列表排序方式格式正确"); | 
|         } catch (error) { | 
|           this.$message.error("列表排序方式不是有效的JSON格式"); | 
|         } | 
|       } | 
|     } | 
|   }, | 
|   watch: { | 
|     "data.options.isRange": function(val) { | 
|       if (typeof val !== "undefined") { | 
|         if (val) { | 
|           this.data.options.defaultValue = null; | 
|         } else { | 
|           if (Object.keys(this.data.options).indexOf("defaultValue") >= 0) { | 
|             this.data.options.defaultValue = ""; | 
|           } | 
|         } | 
|       } | 
|     }, | 
|     "data.options.required": function(val) { | 
|       if (val) { | 
|         this.validator.required = { | 
|           required: true, | 
|           message: `${this.data.label}必须填写` | 
|         }; | 
|       } else { | 
|         this.validator.required = null; | 
|       } | 
|   | 
|       this.$nextTick(() => { | 
|         this.generateRule(); | 
|       }); | 
|     }, | 
|     "data.options.ruleType": function(val) { | 
|       if (!this.show) { | 
|         return false; | 
|       } | 
|   | 
|       if (val && val !== "string") { | 
|         this.validator.type = { | 
|           type: val, | 
|           message: this.data.label + "格式不正确" | 
|         }; | 
|       } else { | 
|         this.validator.type = null; | 
|       } | 
|   | 
|       this.generateRule(); | 
|     }, | 
|     "data.options.pattern": function(val) { | 
|       if (!this.show) { | 
|         return false; | 
|       } | 
|   | 
|       var evil = function(fn) { | 
|         // 一个变量指向Function,防止有些前端编译工具报错 | 
|         var Fn = Function; | 
|         return new Fn("return " + fn)(); | 
|       }; | 
|       if (val) { | 
|         this.validator.pattern = { | 
|           pattern: evil(val), | 
|           message: this.data.label + "格式不匹配" | 
|         }; | 
|       } else { | 
|         this.validator.pattern = null; | 
|       } | 
|   | 
|       this.generateRule(); | 
|     } | 
|   }, | 
|   methods: { | 
|     // 判断是字段类型 | 
|     isFieldType(type) { | 
|       return this.noFieldType.indexOf(type) < 0; | 
|     }, | 
|     handleOptionsRemove(index) { | 
|       if (this.data.type === "grid") { | 
|         this.data.columns.splice(index, 1); | 
|       } else { | 
|         this.data.options.options.splice(index, 1); | 
|       } | 
|     }, | 
|     handleAddOption() { | 
|       if (this.data.options.showLabel) { | 
|         this.data.options.options.push({ | 
|           value: "新选项", | 
|           label: "新选项" | 
|         }); | 
|       } else { | 
|         this.data.options.options.push({ | 
|           value: "新选项" | 
|         }); | 
|       } | 
|     }, | 
|     handleAddColumn() { | 
|       this.data.columns.push({ | 
|         span: "", | 
|         fields: [] | 
|       }); | 
|     }, | 
|     generateRule() { | 
|       this.data.rules = []; | 
|       Object.keys(this.validator).forEach(key => { | 
|         if (this.validator[key]) { | 
|           this.data.rules.push(this.validator[key]); | 
|         } | 
|       }); | 
|       if (!this.data.rules.length) { | 
|         delete this.data.rules; | 
|       } | 
|     }, | 
|     handleSelectMuliple(value) { | 
|       if (value) { | 
|         if (this.data.options.defaultValue) { | 
|           this.data.options.defaultValue = [this.data.options.defaultValue]; | 
|         } else { | 
|           this.data.options.defaultValue = []; | 
|         } | 
|       } else { | 
|         if (this.data.options.defaultValue.length > 0) { | 
|           this.data.options.defaultValue = this.data.options.defaultValue[0]; | 
|         } else { | 
|           this.data.options.defaultValue = ""; | 
|         } | 
|       } | 
|     }, | 
|     // 编辑框类型改变 | 
|     dataTypeChange(selectVal, data) { | 
|       const item = this.basicComponents.find(item => { | 
|         return item.type === selectVal; | 
|       }); | 
|       let customJson = {}; | 
|       // 表格下拉框时设置默认参数 | 
|       if (item.type === "table-select") { | 
|         // 仓库默认值 | 
|         if (data.options.prop === "storageName") { | 
|           customJson = { | 
|             columns: [ | 
|               { | 
|                 prop: "storageCode", | 
|                 label: "仓库编号", | 
|                 width: 100 | 
|               }, | 
|               { | 
|                 prop: "storageName", | 
|                 label: "仓库名称", | 
|                 width: 150 | 
|               } | 
|             ], | 
|             url: "/api/basicInfo/base/storage/getList", | 
|             searchFields: "storage_Id,storageCode,storageName" | 
|           }; | 
|         } else if (data.options.prop === "consignorName") { | 
|           // 货主默认值 | 
|           customJson = { | 
|             columns: [ | 
|               { | 
|                 prop: "consignorCode", | 
|                 label: "货主编号", | 
|                 width: 100 | 
|               }, | 
|               { | 
|                 prop: "consignorName", | 
|                 label: "货主名称", | 
|                 width: 150 | 
|               } | 
|             ], | 
|             url: "/api/basicInfo/base/consignor/getList", | 
|             searchFields: "consignor_Id,consignorCode,consignorName" | 
|           }; | 
|         } else if (data.options.prop === "productName") { | 
|           // 物料默认值 | 
|           customJson = { | 
|             columns: [ | 
|               { | 
|                 prop: "productCode", | 
|                 label: "物料编号", | 
|                 width: 100 | 
|               }, | 
|               { | 
|                 prop: "productName", | 
|                 label: "物料名称", | 
|                 width: 150 | 
|               } | 
|             ], | 
|             url: "/api/basicInfo/base/productInfo/getList", | 
|             searchFields: "product_Id,productCode,productModel,productName,productSpec" | 
|           }; | 
|         } | 
|       } | 
|       const options = Object.assign( | 
|         {}, | 
|         item.options, | 
|         { | 
|           prop: data.options.prop | 
|         }, | 
|         customJson | 
|       ); | 
|       data.options = JSON.parse(JSON.stringify(options)); | 
|       if (["date", "datetime", "time"].indexOf(item.type) >= 0) { | 
|         data.options.dataType = item.type; | 
|       } else { | 
|         data.options.dataType = "string"; | 
|       } | 
|     }, | 
|     // 选择图标 | 
|     selectIcon() {}, | 
|     onSelectIcon(icon) { | 
|       this.data.options.icon = icon; | 
|       this.$message.success("选择成功!"); | 
|       this.findRef("icon-popover").doClose(); | 
|     } | 
|   } | 
| }; | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
| .widget-config { | 
|   .col-param { | 
|     /deep/ .el-input__inner { | 
|       padding: 0 5px; | 
|     } | 
|   } | 
|   /deep/ .el-input__inner { | 
|     padding: 0 5px; | 
|   } | 
|   /deep/ .el-input-number .el-input__inner { | 
|     padding-left: 5px; | 
|     padding-right: 40px; | 
|   } | 
|   /deep/ .el-form-item { | 
|     margin-bottom: 0px; | 
|   } | 
| } | 
| </style> |