服务端过滤

服务端过滤,顾名思义就是在服务端施加的过滤条件。为什么要在服务端施加过滤条件,通常在以下几种情况时,使用服务端过滤

  • 出于安全性考虑:有些查询一定要写在服务端,避免来自前端的攻击
  • 增加易用性:服务端定义一些过滤条件,由前端选择使用哪个过滤条件,指定过滤名称即可
  • 增加可维护性:条件统一在服务端修改
  • 需要默认过滤:大多数都要施加的过滤,就是默认过滤,前端使用时无需设置过滤,就能使用默认过滤

下面以需要默认过滤为场景,详细介绍服务端过滤。

应用场景

客户表中存储着全部的客户数据,有些客户已经不使用,通常会使用状态列来标识,例如1表示使用,0表示不使用。在系统中显示客户的地方,大多数只显示使用的客户,不显示不使用的客户。只在少数情况显示全部的客户。通常的做法是在每一个显示使用的客户的地方,设置过滤条件,取状态列为1的客户。这样做的麻烦之处在于大多数场景都需要设置。

系统提供设置服务端过滤的能力,例如将状态=1设置为默认过滤条件,这样所有显示使用的客户的地方,不需要进行任何设置,获取到的数据就是状态=1的数据。再设置一个查询全部数据的服务端过滤条件,在显示全部客户的地方,设置使用这个过滤条件。这样做的好处是,大多数使用场景得到了简化。

实现服务端过滤

对于上面的场景,首先给客户数据集增加一个状态列,名为 active,用于标识客户是否可使用。再增加一个服务端过滤,名为客户服务端过滤 customerBackFilter,用于实现默认查询使用的客户,注意服务端过滤的名称必须以 BackFilter 结尾。

在这个服务端过滤中,添加两个过滤器,一个是查询状态 active 等于1的过滤器,名为 active,另一个是查询全部数据的过滤器,名为 all。并设置查询状态 active 等于1的过滤器为默认过滤器。即在没有指明 customerBackFilter 的值时,对于客户数据集的查询,都会在已有的过滤条件后,施加 active=1 这个条件。指明 customerBackFilter=all 时,则不额外施加过滤条件,表示查询全部数据。

服务端过滤的定义如下,这里使用的是 Spring 表达式。

    <param>
        <field label="客户服务端过滤" name="customerBackFilter" kind="in" editor="backFilter" dataType="String" private="false" 
            defaultValue="expr:'active'" 
            value="expr:{active:'active=eq.1',all:'NULL'}.get(#self.inputValue)" 
            constraint="" error=""/>`
    </param>

设置入口(点击数据集参数下方的+号,选择“服务端过滤”):

1659432969238

服务端过滤的配置界面如下图所示:

注:下方过滤器列表的过滤器名称不能输入中文字符。

正常调用 DBRest 接口查询数据,url 如下,系统自动使用默认的过滤器,即只查询出使用的客户。

    域名/服务名/main/dbrest/customer?limit=20&offset=0&select=phone,name,active,id

在调用 DBRest 接口查询数据时,传入服务端过滤参数 $customerBackFilter=eq.all,系统使用开发者指定的过滤器,即查询出全部数据

    域名/服务名/main/dbrest/customer?limit=20&offset=0&select=phone,name,active,id&$customerBackFilter=eq.all

设置服务器过滤后,可以在页面的数据集编辑中,在“过滤及参数”对启用哪个过滤器进行设置:

1659436314604

1659436325456

执行结果如下图所示:

results matching ""

    No results matching ""