1、元数据管理
<h2>元数据</h2>
<ol>
<li>
<p>支持功能:</p>
<ul>
<li>查询</li>
<li>修改:</li>
<li>删除</li>
<li>导入元数据
导入表/视图至本地 元数据,注意元对象编码不能重复,推荐以“O_表名”来定义,且需要有主键</li>
<li>导出元数据脚本
导出数据元数据的结构脚本(元对象+字段),可以在生产等环境执行完成配置的转义,典型的用法是测试环境开发完成,导出元数据脚本至生产执行即可完成生产部署。</li>
<li>覆盖同步
小心使用,会把已配置的数据恢复至初始</li>
<li>增量同步
只增加缺失的字段,已经存在的不做任何处理,典型的应用场景:比如表增加了一个字段,则使用这个功能比较合适</li>
<li>复制元数据
可以把元对象O_user 快速的复制到o_user2上。</li>
</ul>
</li>
<li>字段说明</li>
</ol>
<table>
<thead>
<tr>
<th>字段</th>
<th>说明</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>ID</td>
<td>元对象系统中编号</td>
<td></td>
</tr>
<tr>
<td>编码</td>
<td>编码,需要唯一最好有意义</td>
<td></td>
</tr>
<tr>
<td>名称</td>
<td>对象名称,在编辑、新增会显示 新增XX,编辑XX</td>
</tr>
<tr>
<td>视图/数据表</td>
<td>元对象要么是视图要么是数据表</td>
</tr>
<tr>
<td>主键</td>
<td>每个元对象都需要主键</td>
<td>不支持联合</td>
</tr>
<tr>
<td>数据源</td>
<td>默认数据源即为我们配置的业务数据库</td>
<td>系统需要2个数据库 默认为业务数据库,Eova为系统配置参数数据库</td>
</tr>
<tr>
<td>是否单选</td>
<td>数据列表视图 单选/复选数据</td>
</tr>
<tr>
<td>显示行号</td>
<td>是否显示ID</td>
<td>未测试</td>
</tr>
<tr>
<td>是否初始加载</td>
<td>是否视图打开即要加载数据</td>
<td>目前统一都加载,后面又需求可以自行调整</td>
</tr>
<tr>
<td>是否安全模式</td>
<td>想表达的是安全模式表后端只接受配置的字段数据,未配置的即使前端送了也不处理</td>
</tr>
<tr>
<td>查询显示查询条件</td>
<td>存在查询条件的情况是否默认显示</td>
<td>不显示只是折叠了</td>
</tr>
<tr>
<td>业务过滤</td>
<td>对表数据过滤增加查询条件</td>
<td>如:lv>3 或者 WHERE (rid IN (SELECT id FROM bb_h.eova_role WHERE lv >= ${user.role.lv}) or rids is null) and is_delete=0 支持beetl数据绑定从用户session中提取参数绑定</td>
</tr>
<tr>
<td>默认排序</td>
<td>一般情况下配置:id desc</td>
<td>按id倒序,最新数据排第一页</td>
</tr>
<tr>
<td>业务拦截器</td>
<td>参考类:MetaObjectIntercept</td>
<td>这个就是我们要实现的业务了,比如用户表新增,其实是有业务的比增加前做数据判断,增加后有一定业务要处理,我们可以在此实现</td>
</tr>
<tr>
<td>依赖JS</td>
<td>此js是子定义的,会在对象的界面新增、修改等界面添加到末尾可以执行用户想执行的前端业务</td>
<td>举个例子:前面的初始是否加载,可以用此添加的js触发加载,或者新增界面有个自定义的需求或者校验函数</td>
</tr>
<tr>
<td>视图SQL</td>
<td>视图导入会把视图的sql自动填入</td>
</tr>
<tr>
<td>拓展配置</td>
<td>元对象额外的配置</td>
<td>目前存在的属性:view(视图专用),xxForm 为表单视图定义,默认的新增视图为addForm,编辑视图为updateForm,详情视图为detailForm以及其他自定义的表单视图</td>
</tr>
</tbody>
</table>
<p>拓展配置将会在视图view使用以及表单视图,会在后续的模块具体介绍</p>
<h2>字段</h2>
<table>
<thead>
<tr>
<th>字段</th>
<th>说明</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>对象</td>
<td>元对象</td>
<td></td>
</tr>
<tr>
<td>分组号</td>
<td>暂时没意义</td>
</tr>
<tr>
<td>字段名</td>
<td>数据表中的字段</td>
</tr>
<tr>
<td>字段表名</td>
<td>字段的所属表</td>
<td>如果对象是视图必填</td>
</tr>
<tr>
<td>控件类型</td>
<td>选择字段的合适的类型</td>
</tr>
<tr>
<td>中文名</td>
<td>列表、表单中的名称</td>
</tr>
<tr>
<td>排序</td>
<td>列表时候的顺序</td>
</tr>
<tr>
<td>分组名称</td>
<td>暂时无用</td>
</tr>
<tr>
<td>宽度</td>
<td>列表的宽度</td>
<td>支持130即130px,同时支持百分比配置如:20%</td>
</tr>
<tr>
<td>高度</td>
<td>表单中的高度</td>
<td>实际上只有富文本和编辑框才有效,单位px</td>
</tr>
<tr>
<td>新增状态</td>
<td>新增表单中的状态</td>
<td>正常、禁用、只读,隐藏,表单设计器比本处优先级更高</td>
</tr>
<tr>
<td>更新状态</td>
<td>更新表单中的状态</td>
<td>正常、禁用、只读,隐藏,表单设计器比本处优先级更高</td>
</tr>
<tr>
<td>快速查询</td>
<td>列表等视图中需要查询的字段</td>
</tr>
<tr>
<td>单元格编辑</td>
<td>暂时不支持</td>
</tr>
<tr>
<td>是否必填</td>
<td>将校验必填</td>
</tr>
<tr>
<td>允许排序</td>
<td>在列表中可以点击排序</td>
</tr>
<tr>
<td>列表显示</td>
<td>在列表中是否显示</td>
</tr>
<tr>
<td>是否多值</td>
<td>针对一些控件生效:复选、下拉,菜单查找框</td>
</tr>
<tr>
<td>输入提示</td>
<td>表单中字段的提示</td>
</tr>
<tr>
<td>默认值</td>
<td>如果有值则已有值,如果无则使用默认值</td>
<td>支持固定值如:1,以及beetl表达式:${user.id!}</td>
</tr>
<tr>
<td>ui校验</td>
<td>配置系统支持校验表单视</td>
<td>必填不要在此配置,使用前面的“是否必填”,校验使用后面单独拉出来说明</td>
</tr>
<tr>
<td>格式化</td>
<td>列表显示的时候有些数据需要特殊处理</td>
<td>后文单独说明</td>
</tr>
<tr>
<td>拓展配置</td>
<td>每个控件可能会设计到单独的属性</td>
<td>在控件单独说</td>
</tr>
</tbody>
</table>
<h2>格式化</h2>
<p>列表中字段显示需要做相应的处理的,举几个常用例子:</p>
<ul>
<li>
<p>字段显示为图片</p>
<p>function(value, row, index, keyName) {
if (value) {
return '<img src="http://图片域名/图片目录/' + value + '" height=25>'
}
return value
}</p>
</li>
<li>
<p>格式化-红色加粗</p>
<p>function(value, row, index, keyName) {
if (value) {
return '<b style="color: red">' + value + '</b>';
}
return value;
}</p>
</li>
<li>
<p>格式化-链接</p>
<p>function(value, row, index, keyName) {
return '<a target="_blank" href="http://www.baidu.com" style="color:blue">' + value + ''
}</p>
</li>
<li>
<p>打开新Tab</p>
<p>function(value, row, index, keyName) {
var url='/single_grid/list/v_hotel_bed?template=h&query_hotel<em>id='+row.id;
return '<a href="javascript:$.modal.openTab(\''+row.name+'床位\',\''+url+'\');" style="color:blue">'+value+'</a>';
}
如果打开的地址有查询限制参数请以 “query</em>”开头,比如打开 hotel_id=3的床位,则为:query_hotel_id=3</p>
</li>
</ul>
<p>函数介绍如下:</p>
<blockquote>
<p>1、<strong>$.modal.openTab('Tab名字','Tab地址'); </strong> 函数将帮我们打开一个新的Tab
回调函数参数如下:</p>
<table>
<thead>
<tr>
<th>字段</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>value</td>
<td>本字段值</td>
</tr>
<tr>
<td>row</td>
<td>行数据</td>
</tr>
<tr>
<td>index</td>
<td>当前行序号</td>
</tr>
<tr>
<td>keyName</td>
<td>本字段key</td>
</tr>
</tbody>
</table>
<p>2、参数 template=h为指定ui模板采用bootstrap,query_hotel<em>id=row.id 为传输酒店ID
3、更多参数以 query</em>+"参数名"=xxx 形式传递</p>
</blockquote>
<h1>校验</h1>
<p>以jQuery Validate验证框为基础并做了一定的调整。</p>
<table>
<thead>
<tr>
<th>序号</th>
<th>规则</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>required</td>
<td>必输字段 (一般不需要配置,只要选中‘是否必填’即可)</td>
</tr>
<tr>
<td>2</td>
<td>remote="remote-valid.jsp"</td>
<td>使用ajax方法调用remote-valid.jsp验证输入值,,额外增加功能(字段为ID):xx.jsp?a=1,fielda,fieldb,校验的时候除了会把自己上送还会把填充的字段上送</td>
</tr>
<tr>
<td>3</td>
<td>email=true</td>
<td>必须输入正确格式的电子邮件</td>
</tr>
<tr>
<td>4</td>
<td>url=true</td>
<td>必须输入正确格式的网址</td>
</tr>
<tr>
<td>5</td>
<td>date=true</td>
<td>必须输入正确格式的日期,日期校验ie6出错,慎用</td>
</tr>
<tr>
<td>6</td>
<td>dateISO=true</td>
<td>必须输入正确格式的日期(ISO),例如:2009-06-23,1998/01/22 只验证格式,不验证有效性</td>
</tr>
<tr>
<td>7</td>
<td>number=true</td>
<td>必须输入合法的数字(负数,小数)</td>
</tr>
<tr>
<td>8</td>
<td>digits=true</td>
<td>必须输入整数</td>
</tr>
<tr>
<td>9</td>
<td>creditcard=true</td>
<td>必须输入合法的信用卡号</td>
</tr>
<tr>
<td>10</td>
<td>equalTo="#password"</td>
<td>输入值必须和#password相同</td>
</tr>
<tr>
<td>11</td>
<td>accept=</td>
<td>输入拥有合法后缀名的字符串(上传文件的后缀)</td>
</tr>
<tr>
<td>12</td>
<td>maxlength=5</td>
<td>输入长度最多是5的字符串(汉字算一个字符)</td>
</tr>
<tr>
<td>13</td>
<td>minlength=10</td>
<td>输入长度最小是10的字符串(汉字算一个字符)</td>
</tr>
<tr>
<td>14</td>
<td>rangelength=[5,10]</td>
<td>输入长度必须介于 5 和 10 之间的字符串")(汉字算一个字符)</td>
</tr>
<tr>
<td>15</td>
<td>range=[5,10]</td>
<td>输入值必须介于 5 和 10 之间</td>
</tr>
<tr>
<td>16</td>
<td>max=5</td>
<td>输入值不能大于5</td>
</tr>
<tr>
<td>17</td>
<td>min=10</td>
<td>输入值不能小于10</td>
</tr>
</tbody>
</table>
<p>自定义校验(<strong>/ui_h/ajax/libs/validate/jquery.validate.extend.js</strong>):</p>
<table>
<thead>
<tr>
<th>规则</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>isPhone=true</td>
<td>电话号</td>
</tr>
<tr>
<td>isName=true</td>
<td>姓名校验</td>
</tr>
<tr>
<td>isUserName=true</td>
<td>用户名</td>
</tr>
<tr>
<td>isIdentity=true</td>
<td>校验身份证</td>
</tr>
<tr>
<td>isBirth=true</td>
<td>校验出生日期</td>
</tr>
<tr>
<td>isIp=true</td>
<td>校验IP地址</td>
</tr>
</tbody>
</table>
<p>自建规则也在此补充,或者在元数据中依赖js中单独添加单独使用。</p>
<p>多个规则逗号分隔:
<strong>如:required=true;email=true;remote="remote-valid.jsp?a=1,userId,userName"</strong>
等多姿势待您解锁。</p>
<h2>视图支持</h2>
<p>系统支持视图,先建立一张视图(字段不能重名)然后使用"导入元数据"导入
关于元对象额外的配置 view 属性的定义如下(<strong>必须要配置,告知视图中表的关系</strong>):</p>
<p>1、字段 中 字段表名,需要大家补充下(告知系统此字段来源哪个表),后期看下系统是否能自动读取
2、对象 中 扩展配置,增加如下json,主要是view字段:</p>
<pre><code>{
"view": {
"users": { --表名
"whereField": "id", --表字段ID(当前表的条件字段)
"paramField": "id" --对应的视图中值字段,
},
"users_exp": { --表名
"whereField": "users_id",--表字段ID(当前表的条件字段)
"paramField": "id" ---对应的视图中值字段, 根据“表.user_id”=视图.id的值的数据更新表
}
}
}</code></pre>
<p>此处的意思为:表users、表users_exp需要更新并将视图只的值对应表相应字段,即可这么理解需要更新那张表即需要配置此表的主键/外键以及对应的视图值,保存顺序依次为:users,users_exp
举个例子:</p>
<table>
<thead>
<tr>
<th>users字段</th>
<th>users字段</th>
<th>users_exp字段</th>
</tr>
</thead>
<tbody>
<tr>
<td>id</td>
<td>name</td>
<td>exp</td>
</tr>
<tr>
<td>1</td>
<td>赵金</td>
<td>16</td>
</tr>
</tbody>
</table>
<p>更新users:update users set name='赵金' where id=1;
更新users_exp:update users_exp set exp=16 where user_id=1 ;</p>
<p>PS:目前阶段不建议生成视图字段转义(类似:select a.id as aid,b.name as bname from a left join b on a.id=b.aid),因为系统目前暂时不能识别字段对应表字段是哪个(后期我再优化下)
且视图的表不支持联合主键
注意:<strong>视图更新有先后</strong></p>
<p>最后明确下几种场景:
1、a left join b 并且只有a或者只有b需要新增或者编辑
2、a left join b 且a、b都要进行操作
至于再复杂的视图大家看着办吧~_~,原则也支持大家多测试吧。</p>