通用元配置文件

完整例子:





 














// /src/shared/meta/company/Department.js
module.exports = {
    entityName: 'department',    
    columnsDef: [{
            prop: 'name',
            label: '部门名称',
            width: 240,
            filter: true,
            input: { type: 'text', rule: 'required' }
        },
        {
            prop: 'memo',
            label: '备注',
            width: 150,
            input: 'text'
        }
    ]
}

格式

元配置文件其就是一个js文件,可导出的变量有:

变量名说明类型可选默认值可选值
pageAdminComponent组件名string可选table-admintable-admin
tree-admin
自定义组件名
entityName实体名(MongoDB集合名)string必填--
queryEntityName查询使用的表名(mysql下,查询和增删的表名可能不一样)string可选默认等同于entityName-
columnsDef列定义array[object]必填--
filterType查询区触发方式string可选immediatelyclick:按钮点击,immediately:立刻响应
primaryKey主键名string可选_id
pageSize每页记录数int可选20-
showAdd显示新增按钮boolean可选true-
editable是否可编辑(双击)boolean可选true-
showRemove显示删除按钮boolean可选true-
showPagination显示分页栏boolean可选true-
showIndexCol显示索引列boolean可选true-
showFilter显示查询区boolean可选true-
showSummary显示表尾合计行boolean可选false-
loadDatas预加载数据object可选-
data存放loadDatas加载的数据object可选-{}
filterConditions内置数据过滤条件object{k:v}可选--
methods.filterCheck过滤条件检查(提交前)Function(filterConditions)/Object可选--
sorted默认排序object{k:v}可选--
hook前端hook函数object{k:f}可选--
remarks备注说明array[string]可选--
  • filterType 如果数据量大的情况下使用‘按钮点击’触发查询
  • primaryKey 用于mysql数据库时定义:修改,删除时使用的主键名;mongodb默认为_id

columnsDef

列定义:用来定义数据表格的显示,以及新增,编辑,查询等选项

列定义:是个数组,每个成员是个对象,对象格式为

变量名说明类型可选默认值
prop属性名string必须-
label标签string必须-
hidden是否隐藏boolean可选false
width列宽int可选-
filter是否可查询boolean可选false
index创建索引Boolean/object可选false
add可新增boolean可选true
edit可编辑boolean可选true
input输入方式string 或 object可选-
autoRef自动关联boolean可选true
formatter内容格式化string or Function(row, column, cellValue, index)可选-
download是否可下载(当input.type=='file'时用到)boolean可选false
hook前端函数定义object可选-
serverHook后端元配置参数object可选-

serverHook

  • 如果后端元配置文件里面有只有简单函数,不会导入后端的机密配件文件,可以放入此处
  • 如果配置了文件形式的后代元配置文件,优先启用文件的,此处配置会无效

filter

定义该字段是否可在界面查询

  • filter:true,则在页面查询条件区会显示一个文本输入框,默认表示:模糊查询
  • 如果是要显示下拉菜单,则:filter为{type:'select',optins:[{label:'启用',value:true},{label:'禁用',value:false}]}
  • 如果下拉菜单的内容来自后台,filter为{type:'select',optins:[],ajax:{详细说明}}
  • filter.method='equal' 精确查询
  • filter.method='between' 区间查询

filter.type

说明
scope显示两个文本输入框 必须:filter.method='between'
dateScope显示日期范围输入框,必须:filter.method='between'
dateTimeScope显示日期时间范围输入框,必须:filter.method='between'
radio显示单选输入框
cascader显示级联下来菜单

index

在MongoDB下,将在系统每次启动时,自动创建该字段索引,不会重复创建

  • 当字段定义了filter,最好也定一下index,否则数据量一大,查询将会很慢
  • index ==true ,相当于{sortOrder:1}的简写,定义升序索引
  • index=={options:{unique:true}},指明创建降序且唯一索引
  • index=={sortOrder:-1,options:{unique:true}},指明创建降序且唯一索引

WARNING

暂时不支持创建多个字段的组合索引

formatter

格式化单元格的内容;formatter可以有三个值: Function :函数 'download' :显示下载链接 只用于 input.type=='file' 'imagePreview' :图片预览 只用于input.type=='file'

例子:格式化true,false为可读的文字表示

    
    {
            prop: 'disabled',
            label: '状态',
            width: 80,
            input: { default: false, rule: 'required', type: 'select', options: [{ label: '启用', value: false }, { label: '禁用', value: true }] },
            formatter:function (row, column,cellValue) {
                         return cellValue? "禁用" : "启用"
                      }
     }  

例子:当上传的是apk文件时,formatter设置为'download',在列表里会自动显示下载链接

        {
        prop: 'apkFile',
        label: 'APK文件',
        width: 200,
        filter: false,
        input: {hidden:true, type: 'file', savePath: 'apk', fileName: CommonUtils.dateTimeFileName, ext: "apk"},
        edit:true,
        formatter:'download'
      } 
      }

例子:当上传的是图片文件时,formatter设置为'imagePreview',在列表里会自动显示预览小图片

  
        {
        prop: 'imageFile',
        label: '图形文件',
        width: 200,
        filter: false,
        input: { type: 'file',rule:"required",savePath: 'images', fileName: CommonUtils.dateTimeFileName},
        edit:true,
        formatter:'imagePreview'        
      }

input

当input为'text',相当于{type:'text'}的简写

由于内置的UI组件采用的是Element-UI,所以很多具体配置方式将连接到Element-UI文档

input如果是对象,通用变量如下表:

变量名说明类型可选可选值
type输入组件string必选详解
default默认值string可选-
placeholder输入框占位文本string可选-
rule校验规则string或object必选
onChange数据改变Function(vm,newValue,oldValue)可选-
hidden隐藏bool可选-
其他根据type的不同值---

input.rule

rule 为string ,只有值:required,表示必选

rule 为 Function 表示为Element-ui的自定义校验规则函数

rule 为Array 表示为Element-ui的表单验证规则

详细内容请参考:Element-UI

input.onChange=Function(vm,newValue,oldValue)

用于当输入内容改变时的触发动作 vm vue对象

例如: 在黄色下拉选择框加一个监听:当选择为'黄色',动态显示黄色选择框 /src/shared/meta/example/Input.js










 













        {
            prop: 'select',
            label: '选择框',
            width: 150,
            input: {
                type: 'select',
                filterable: true,
                allowCreate: true,
                clearable: true,
                options: [{ label: '黄色', value: '黄色' }, { label: '白色', value: '白色' }],
                onChange: function(vm, newValue, oldValue) { vm.editColumnDefs.yellowselect.input.hidden = !(newValue == '黄色')  }
            },

        },
        {
            prop: 'yellowselect',
            label: '黄色选择框',
            width: 150,
            input: { hidden: true, type: 'select', options: [{ label: '淡黄', value: '淡黄' }, { label: '深黄', value: '深黄' }] }
        },

input.type可选值

TIP

input的所有类型都有例子,在:菜单:[样例-输入大全] ,对应配置文件:config/meta/example/Input.js

已经支持的Element-UI输入组件

可选值说明
text单行文本输入框
textarea多行文本输入框
number数字输入框
radioGroup单选框组
select下拉单选框
checkbox多选框
checkboxGroup多选框组
file文件上传
date日期选择
time时间选择
cascader级联选择器
tree树选择器

尚不支持的Element-UI组件:

  • InputNumber 计数器
  • Switch 开关
  • Slider 滑块
  • Rate 评分
  • ColorPicker 颜色选择器
  • Transfer 穿梭框

input.type=='number'

当input.type=='number' 还有下面额外的变量配置

变量名说明类型可选可选值
min最小值number可选false
max最大值number可选false

input.type=='select'

当input.type=='select' 还有下面额外的变量配置

变量名说明类型可选可选值
multiple是否多选boolean可选false
filterable是否可搜索boolean可选false
allowCreate是否允许用户创建新条目,需配合 filterable 使用boolean可选false
clearable单选时是否可以清空选项boolean可选false
options下拉选项array[{label:'选项名',value:'选项值'}]可选-
ajaxoptions动态填充object 详解可选-
default设置默认值string可选当multipe==true,$all表示默认选择所有

input.type=='radioGroup'

变量名说明类型可选
options选项array[{label:'选项名',value:'选项值'}]和ajax选其一
ajaxoptions动态填充object 详解和options选其一

input.type=='date'

变量名说明类型可选可选值默认值
subType类型string可选year/month/date/dates/ week/datetime/datetimerange/daterange 详解date
pickerOptions快捷选项object 详解可选
rangeSeparator选择范围时的分隔符string可选-'-'
startPlaceholder范围选择时开始日期的占位内容string可选
endPlaceholder范围选择时结束日期的占位内容string可选
format显示在输入框中的格式string可选-yyyy-MM-dd
valueFormat绑定值的格式,不指定则绑定值为 Date 对象string可选见:日期格式-
defaultValue默认显示的时间Date可选-yyyy-MM-dd
unlinkPanels在范围选择器里取消两个日期面板之间的联动boolean可选-false

input.type=='time'

变量名说明类型可选可选值默认值
isRange是否时间范围选择boolean可选-false
pickerOptions快捷选项object 详解可选
rangeSeparator选择范围时的分隔符string可选-'-'
startPlaceholder范围选择时开始日期的占位内容string可选
endPlaceholder范围选择时结束日期的占位内容string可选
format显示在输入框中的格式string可选-yyyy-MM-dd
valueFormat绑定值的格式,不指定则绑定值为 Date 对象string可选见:日期格式-
defaultValue默认显示的时间Date可选-yyyy-MM-dd

input.type=='file'

TIP

上传文件组件没有用到Element-ui的Upload组件,而是重新编写的、使用H5的FormData的上传组件,FormData的好处是:异步上传、可和其他数据一并提交

  • 要使用上传组件,首先要在项目后端配置文件里设置下数据目录dataDir
  • 如果列定义里:定了了:download=true,则在表格会显示srcName链接,单击可下载文件
变量名说明类型可选可选值默认值
savePath文件上传后保存目录(相对dataDir)string必填--
fileName生成保存文件名的函数Funcion(oldName)必选--
ext文件扩展名要求string可选--

上传的文件会保存在: dataDir/savePath/fileName生成的文件名
对应字段的数据格式是: {path:'',md5:'',size:2234,name:'',srcName:''}

  • path 文件保存路径(包括文件名),相对dataDir
  • md5 文件md5值
  • size 文件大小,单位:字节
  • name 文件名
  • srcName 原文件名(上传时的文件名)

可以设置formatter为'download' 或者'imagePreview',分别用来表示表格里显示为图片预览还是下载链接

input.type=='cascader'

变量名说明类型可选默认值
options可选项数据源请看object必填-
props配置选项请看object必填-

input.type=='tree'

变量名说明类型可选默认值
data展示数据请看object必填-
props配置选项请看object必填-
renderContent节点定制渲染请看Function可选-
nodeKey唯一标识的属性请看String必须-
checkChange选中状态发生变化时的回调请看Function可须-
expandAll是否默认展开所有节点请看boolean可选-

        {
            prop: 'tree',
            label: '树',
            width: 200,
            input: {
                type: 'tree',
                data: provinceAndCityData,
                props: { label: 'label', children: 'city' },
                nodeKey: 'label'

            }
        }

input.ajax

通过input.ajax或filter.ajax获取的数据会设置到input.options或filer.options

变量名说明类型可选
path数据路径(配置文件的路径)string必选
label指定option的label为对象的某个属性值string必选
value指定option的value为对象的某个属性值string必选
params过滤参数object可选
projects过滤字段object可选

例子:

        {
            prop: 'select_ajax',
            label: '选择框(数据库)',
            width: 150,
            input:{type:'select',ajax:{path:'/company/Department',label:'name',value:'_id',projects:{_id:1,name:1}}]}
        }

上面的写法,在创建组件时,会自动从:/company/Department 路径的配置文件对应的数据库表里拉取数据,假设拿到数据:

[
 {_id:'1',name:'人力资源部'}, 
 {_id:'2',name:'财务部'},
 {_id:'3',name:'市场部'}
]

会转成如下数组

[
 {label:'人力资源部',value:'1'},
 {label:'财务部',value:'2'},
 {label:'市场部',value:'3'}
]

并设置到input.options

hook

前端hook方法

函数名说明类型返回
submitCheck在新增或修改的提交数据前Function(formData,vue) vue为编辑组件的vue对象formData
onShowAdd在打开新增窗口时Function(formData,vue)
onShowEdit在打开编辑窗口时Function(formData,vue) vue为编辑组件的vue对象
queryCheck在提交查询数据前Function(query,vue)query

例子:我们要把提交的数据的字段provinces改成数组

let hook={
 submitCheck:function(formData,vue) {
  formdata.provinces=formdata.provinces.split(",")
  return formdata
}

loadDatas && data

loadDatas用于需要从后端预先加载的数据放入data,一般用于格式化时需要把_id转为名称


格式:

属性名说明类型返回
name放入data的属性名stringformData
ajax从后端加载数据,同input.ajaxobject

例如:员工 所属的部门id值转为部门名称





















































 












//  /src/shared/company/Employee.js

let methods = {
    
    formatSex: function (row, column,cellValue) {
        return cellValue? "男" : "女"
    },
    formatDepartment:function(row, column,cellValue) {
        if(data.DepartmentList) {
          for (let item of data.DepartmentList) {
            if (cellValue == item._id) return item.name;
          }
        }

    }
};

let loadDatas = [{
    name: 'DepartmentList',
    ajax: {
        path: '/company/Department',
        projects:{_id:1,name:1}
    }
}]

let data = {}


module.exports = {
    entityName: 'employee',   
    loadDatas,
    data:data,
    columnsDef: [{
            prop: 'name',
            label: '姓名',
            width: 240,
            filter: true,
            input: { type: 'text', rule: 'required' },
            index:true
        },
        {
            prop: 'sex',
            label: '性别',
            width: 150,
            input:{type:'radioGroup',options:[{label:'男',value:true},{label:'女',value:false}]},
            formatter:methods.formatSex
        },   
        {
            prop: 'department',
            label: '部门',
            width: 150,
            input:{type:'select',ajax:{path:'/company/Department',label:'name',value:'_id',projects:{_id:1,name:1}}},
            formatter:methods.formatDepartment,
            autoRef:false
        },       
        {
            prop: 'memo',
            label: '备注',
            width: 150,
            input: 'text'
        }
    ]
}