4.1. 仙人模式の表达式强化 - 图1

在EovaV1.5之前的版本中,表达式都非常弱,一不小心就会出现语法错误,让人揪心!

所以EovaV1.5 采用了Druid的SQL解析引擎来解析表达式,使Eova表达式能力和兼容性大幅度提升!

语法奥秘:

  • 随意空格 不会报错(建议规范书写,放开No放荡)
  • 不用跟小尾巴where 1=1
  • 支持变量和复杂逻辑运算(暂时只支持用户对象)
  • 默认数据源为main,可以省略;ds=main(省钱又省布)
  • 支持排序 order by id desc
  • 支持子查询
  • 复杂的多表查询通过view来解决
  • 支持多列显示
  • 支持智能宽度标准语法:下拉框select xxx ID, xxx CN from 表名;ds=数据源

语法解释:ID CN别名为固定关键字ID:第1列必须对应下拉框的值项CN:第2列必须对应下拉框的文本项

下拉树select xx ID,xx NAME,xx PID from xxx_tree_table;ds=数据源

语法解释:ID NAME PID 别名为固定关键字ID:第1列必须对应树节点IDNAME:第2列必须树节点名称PID:树节点父IDeova-1.6-beta4 开始支持自定义根节点值 ;root=0

查找框select xxx 用户ID, xxx 用户名 from 表名;ds=数据源

语法解释:别名会成为查找框弹出Dialog中Grid的列名,推荐使用中文别名第1列必须对应查找框的隐藏值第2列必须对应查找框的显示文本隐藏功能:根据列名自动结算列显示宽度.(V1.6.0提供)隐藏功能:如果不写别名/或别名和字段名一样,该列会自动隐藏(V1.6.0提供)新手提示:没有数据源最后不要带;号


高级用法

根据当前角色过滤数据

  1. select xxx ID, xxx CN from 表名 where 1=1
  2. <%if(user.rid == 1){// A角色只看A数据%>
  3. and type = 1
  4. <%}%>
  5. <%if(user.rid == 2){// B角色只看B数据%>
  6. and type = 2
  7. <%}%>

如何使用其它非用户数据,比如我的部门,我的公司,我的店铺….

  1. // com.oss.OSSController
  2. @Override
  3. protected void loginInit(Controller ctrl, User user) throws Exception {
  4. super.loginInit(ctrl, user);
  5. // 添加自定义业务信息到当前用户中
  6. 公司 company = Db.获取我的公司(user.id);
  7. if (company != null) {
  8. user.put("company", company);
  9. // 表达式里调用公司信息 ${user.company.name}
  10. }
  11. }

自定义表达式参数语法规则:表达式主体;自定义参数

  1. // 举例:
  2. String exp = "select xxx 用户ID, xxx 用户名 from 表名;ds=数据源";
  3. // 获取数据源参数,默认值=main
  4. String ds = new EovaExp(exp).getPara("type", "main");

EOVA表达式系统参数:

  1. CNAME("cname", "", "文本字段名"), // V1.6.1 Add 使用场景:订单编码
  2. ROOT("root", "0", "下拉树根节点的值"), // V1.6.0 Add 使用场景:下拉树指定根节点
  3. CACHE("cache", "", "缓存KEY"),
  4. DS("ds", "main", "数据源KEY");
  5. private String val;// 参数Key
  6. private String def;// 参数默认值
  7. private String txt;// 参数描述

应用场景举例需求:想在全局拦截器里区分不同类型的表达式,分别执行各自的特殊逻辑

  1. // 举例:
  2. String exp = "select xxx 用户ID, xxx 用户名 from 表名;type=1";
  3. // 获取类型参数
  4. String type = new EovaExp(exp).getPara("type", "1")
  5. if(type == 1){
  6. // 执行逻辑1
  7. } else {
  8. // 执行逻辑2
  9. }