1. 背景
对于用户来讲查询功能按易用性分三个层次:
1)最简单查询操作是一个输入框,全文检索,如百度,后台实现技术使用搜索引擎,需要设计和建立索引,技术较为复杂,适用于文档和信息数据库检索,但是结果很难精确控制。
2)其次是定义字段查询,很多企业信息系统大多用的是这种查询,针对模块特定字段的查询,有针对性、使用门坎低,适用于企业内部信息管理系统模块定制。
3)最后一种是专门针对数据模型灵活的查询编辑器,使用难度最高,但是查询结果可以灵活和精确的控制,适用于有一定IT知识并对数据相当了解的用户,同时又可以避免直接将数据库暴露给用户带来的不安全隐患。
大家不难发现一个好的系统软件的查询基本会涵盖上述三种类型的查询功能
2. jeecg实现原理
Jeecg系统中模块主要使用第二种方式的查询功能,使用hibernate的QBC来封装前端查询条件,针对字段的定制过滤条件,最后转换为sql执行数据库查询。
现有方案优点:
- 默认无须复杂开发即可实现字段检索,支持范围、模糊、精确匹配查询
- 内置简单表达式支持:!*,实现非、模糊、数组等
现有方案缺点:
- 不支持or条件
- 不支持字段间操作field1=field2
- 不支持非hibernate关联表联合查询
- 单一字段条件只能出现一次
- 不支持sql嵌套
- 要支持上述功能需要额外开发定制工作
某些特定场景下,用户想要通过模块获得相关信息必须借助于第三方报表模块功能或求助于开发人员,无形中对报表模块开发带来一定压力。比如,用户要从模块中查询特殊的部分数据进行操作,现有查询功能无法做到,报表模块又不能操作编辑,这个时候就是高级查询器定制查询功能派上用场的时候了。
3. 类似应用举例
我们来看看Outlook邮件查询设计:
1)全文检索型
2)字段定制型
3)高级查找
微软Team Foundation Server查询编辑器:
4. Jeecg查询器设计与实现
UI设计:首先要实现高级查询,必须要对数据表元信息metadata进行封装才可以通用化,我们利用datagrid标签中的columnList来自动生成字段下拉列表。作为高级查询,从易用的性和使用频率的角度功能所占UI比例不能太多,采用弹出窗口实现,如图:
这里的表格我使用了treegrid,因为更适合表达sql语法树,但没有实现树形结构,条件只加了大于、小于、包含等常用操作符,有待后续扩展sql嵌套。
右侧有查询历史,将每次查询的json条件保存在一个数组中实现快速重查,这个历史查询记录使用HTML5的localstorage保存在客户端缓存中,下次登录仍然有效,对于不支持localstorage的浏览器将使用cookie存储。
前后端交互:从到向前兼容性和对框架升级改动最小的因素考虑,将查询器组装的所有内容封装到一个json字符串,作为一个参数_sqlbuidler传递到后台,由后台控制条件组装,更加安全,防止sql注入等漏洞
json格式示例:
- [{“id”:101,”field”:”user_name”,”condition”:”like”,”value”:”%王%”,”relation”:”and”},{“id”:101,”field”:”user_name”,”condition”:”like”,”value”:”%王%”,”relation”:”and”}]
后台封装处理java对象QueryCondition
- package org.jeecgframework.web.demo.entity.test;
- import java.util.List;
- public class QueryCondition {
- String field;
- String type;
- String condition;
- String value;
- String relation;
- List<QueryCondition> children;
- public List<QueryCondition> getChildren() {
- return children;
- }
- public void setChildren(List<QueryCondition> children) {
- this.children = children;
- }
- public String getField() {
- return field;
- }
- public void setField(String field) {
- this.field = field;
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
- public String getCondition() {
- return condition;
- }
- public void setCondition(String condition) {
- this.condition = condition;
- }
- public String getValue() {
- return value;
- }
- public void setValue(String value) {
- this.value = value;
- }
- public String getRelation() {
- return relation;
- }
- public void setRelation(String relation) {
- this.relation = relation;
- }
- public String toString(){
- StringBuffer sb =new StringBuffer();
- sb.append(this.relation).append(" ");
- sb.append(this.field).append(" ")
- .append(this.condition).append(" ");
- if("java.util.Date".equals(this.type)){
- sb.append("to_date('").append(this.value).append("','yyyy-MM-dd')");
- }else if("java.lang.Number".equals(this.type)
- ||this.condition.indexOf("in")>0){//TODO 需要按类型处理
- sb.append(this.value);
- }else{
- sb.append("'").append(this.value).append("'");//TODO 需要处理特殊字符
- }
- return sb.toString();
- }
- }
后台解析处理代码,修改org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil:
- public static void installHql(CriteriaQuery cq, Object searchObj,
- Map<String, String[]> parameterMap) {
- installHqlJoinAlias(cq, searchObj, getRuleMap(), parameterMap, "");
- // --增加一个特殊sql参数处理----------------------------------
- try{ if(StringUtil.isNotEmpty(parameterMap.get("_sqlbuilder"))){
- List<QueryCondition> list = JSONHelper.toList(
- parameterMap.get("_sqlbuilder")[0]
- , QueryCondition.class);
- String sql=getSql(list,"");
- System.out.println("DEBUG sqlbuilder:"+sql);
- cq.add(Restrictions.sqlRestriction(sql));
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- // --增加一个特殊sql参数处理----------------------------------
- cq.add();
- }
5. 实现约束
- 只支持标准命名的表名,因为是通过java驼峰命名转换带下划线的数据库表名,如果表名不是这个规则字段名会转换错误;
- Sql前端界面在输入时并没有做太多约束和控制,因此非专业用户使用时会出现非法的语句而查询无果,建议在懂sql的人员指导下使用不要直接交给用户。
6. 标签使用
Datagrid标签中已经对高级查询器做了封装,js变量也根据每个模块的id做了命名处理防止冲突。
使用时只需在datagrid标签加一个属性queryBuilder="true",例如
- <t:datagrid name="jeecgDemoList" title="DEMO示例列表" autoLoadData="true" actionUrl="jeecgDemoController.do?datagrid" sortName="userName" fitColumns="true"
- idField="id" fit="true" queryMode="group" checkbox="true" queryBuilder="true">
模块UI效果如下,重置后面会多一个按钮:
7. TODO
UI方面:易用性还可以提升,比如选中某字段和条件=时,值自动根据数据库表中该列实际值枚举一部分候选项;字段为date类型时,值编辑框变成date控件;字段为整形时,值编辑框有校验或只能输入整数的spinbox来防呆
功能:List<QueryCondition>对象转换为sql getSql()函数中仅仅实现拼装原生sql,这块还有很大的改进空间,可以增加字段类型(int,string,date)的识别和处理、操作符(正则匹配)、内置表达式和函数(类似TFS)等扩展。
安全:模块按钮还没有跟权限绑定,只是通过标签属性来开关,应该加一个动态权限由系统配置来控制
相关推荐
以上仅是JEECG UI标签库的部分内容概览,更多高级功能和详细参数说明,请查阅JEECG官方网站提供的完整文档,或加入JEECG社区交流,获取最新技术和实践分享。JEECG智能开发平台致力于提供高效、便捷的开发体验,适用...
- **查询过滤器高级特性**: - **组合条件查询**:介绍了如何实现多条件组合查询的功能。 - **字段范围查询**:解释了如何实现基于字段范围的查询功能。 - **查询字段添加日期控件**:指导如何为查询条件添加日期...
为了解决数据查询的复杂性,JEECG提供了查询HQL过滤器,该过滤器能够处理复杂的组合条件查询,同时还支持字段范围查询、日期控件添加等高级特性。 ### 7. 数据字典与标签 JEECG允许开发者在标签中使用数据字典,...
JEECG平台支持Online报表配置,包括查询过滤器的高级特性,如组合条件查询、字段范围查询以及日期字段的数据格式化等。 7. 用户权限管理 权限设计原理、目标和数据表是用户权限管理的核心。JEECG允许开发者设置访问...
Jeecg在此基础上进行了封装,提供了更高级的查询和操作API。 4. **Shiro安全框架**: Apache Shiro用于实现用户权限控制,Jeecg利用Shiro实现了角色、权限的分配,以及登录验证、会话管理等功能,为应用提供了强大...
除了代码生成器,JEECG还提供了对Online表单开发、Online报表配置、Online图表配置等高级功能的支持,大大简化了表单和报表的开发流程,并介绍了相关的实现原理。 在权限设计方面,文档讲解了权限设计的目标、设计...
- 官方文档:Jeecg提供了详尽的官方文档,涵盖了从快速入门到高级特性的所有内容。 - 社区论坛:Jeecg拥有活跃的社区,开发者可以在论坛上提问、交流经验。 - 示例代码:压缩包中的源码是一个很好的学习资源,...
综上所述,JEECG_v3开发指南v3.2.pdf详细介绍了JEECG智能开发平台的各项功能和使用方法,不仅包括了技术背景、平台介绍、开发环境搭建、代码生成器等多个方面的内容,还涉及到了查询过滤器、数据字典、表单校验、...
**查询过滤器高级特性**: - **组合条件查询**:支持多个条件的组合查询。 - **字段范围查询**:支持数值型字段的范围查询。 - **日期字段的数据格式化**:支持日期类型的格式化显示。 **查询规则**: - 定义了查询...
它还介绍了查询过滤器的高级特性,比如组合条件查询、字段范围查询、日期控件添加以及日期格式化和数据列表合计功能等。 数据字典 数据字典提供了标签参数、使用案例等信息,帮助开发人员管理和维护项目中的数据...
更高级别的版本会增加如OA办公协同组件、独立移动APP源码、大屏设计器等功能,并提供更长时间的技术支持和服务。 此外,JEECG BOOT 还强调了接口安全机制、在线接口文档、在线定时任务、消息中心等企业级应用所需的...
我们可以通过添加事件监听器来响应用户的鼠标和键盘操作,实现3D对象的选择、旋转、平移和缩放。同时,Java3D还支持动画和时间依赖的变换,使得3D场景能够动态变化。 除此之外,Java3D还提供了纹理映射、深度测试、...
动态设置审批人是一项实用的功能,可以根据业务需求,在流程运行时动态地指定审批人,这可以通过Flowable的事件监听器和任务委托机制实现。例如,可以基于用户角色、任务属性或特定条件动态调整审批人,增加了流程的...
常见的加密算法有AES(高级加密标准)、RSA(公钥加密算法)以及DES(数据加密标准)等。这些算法能够将原始数据转换为无法理解的形式,只有拥有正确密钥的人才能解密并访问文件内容。 其次,文件上传时的加密通常...
这个项目的名字来源于"JeecgBoot"和"Site"的结合,意在构建一个适合互联网场景的企业级网站平台。"wolfking-jeesite.zip"是该项目的压缩包文件,包含了一系列必要的文件和资源,便于开发者下载并进行本地开发。 ...