平台默认支持AND方式组合查询,即a=1 AND b>2 AND c<3 这种组合查询模式。
平台目前支持精确匹配、模糊匹配、数值比较、范围查询等多种查询规则。
1、精确匹配
查询数据没有特殊格式,默认为精确匹配查询。
举例:
比如按职务编码精确查询,vue写法如下:
<a-form-item label="职位编码">
<a-input placeholder="请输入职位编码" v-model="queryParam.positionCode"></a-input>
</a-form-item>
2、模糊匹配
模糊匹配分3种情况,分别是左模糊、右模糊、全模糊,规则为在查询字段名称后加$llk或$rlk或$lk。
格式一: *张 (左模糊匹配,对应标识$llk)
格式二: 张* (右模糊匹配,对应标识$rlk)
格式三: *张* (全模糊匹配,对应标识$lk)
举例:
比如按照职务名称模块查询,vue写法如下:
<a-form-item label="职位名称">
<a-input placeholder="请输入职位名称" v-model="queryParam.positionName$lk"></a-input>
</a-form-item>
注意:v-model的值后面跟$lk标识,代表按照该字段全模糊查询。
3、数值比较
数值比较查询常见于数字字段,在页面查询控件需要变成“字段+$规则标识”这种格式,其中比较规则有:
大于,{*}$gt,
大于等于,{*}$ge,
小于,{*}$lt,
小于等于,{*}$le,
举例:
比如查询出差天数大于某一数的记录,vue的写法如下:
<a-form-item label="出差天数">
<a-input-number
placeholder="请输入出差天数"
v-model="queryParam.day$gt"
style="width: 100%"
:min="0"
:max="999999999"
:step="1"
:allowClear="true"
/>
</a-form-item>
注意:v-model的值后面跟$gt标识
4、范围查询
如果是范围查询,则页面查询控件需要变成两个分别名 {*}$ge,{*}$le
{*}$ge: 表示查询范围大于等于
{*}$le: 表示查询范围小于等于
举例:
比如按照创建日期查询一段时间范围内的数据,vue的实现如下,首先在v-model中绑定一个查询属性字段createTimeRange,该字段是页面中的临时字段,不需要跟后台业务对象对应,当执行onDateChange事件时把该字段分解成两个字段赋给查询对象,一个是范围开始字段createTime$ge,一个是范围结束字段createTime$le,字段createTime是需要跟后台数据库字段有对应关系的,否则查询SQL出错。
<a-form-item label="创建时间" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-range-picker
style="width: 210px"
v-model="queryParam.createTimeRange"
format="YYYY-MM-DD"
:placeholder="['开始时间', '结束时间']"
@change="onDateChange"
@ok="onDateOk"
/>
</a-form-item>
onDateChange: function(value, dateString) {
this.queryParam.createTime$ge = dateString[0]
this.queryParam.createTime$le = dateString[1]
}
平台目前支持的查询规则如下:
规则 |
标识 |
举例 |
大于 |
gt |
字段名$gt |
大于等于 |
ge |
字段名$ge |
小于 |
lt |
字段名$lt |
小于等于 |
le |
字段名$le |
等于 |
eq |
字段名 |
不等于 |
ne |
字段名$ne |
包含 |
in |
字段名$in |
全模糊 |
lk |
字段名$lk |
左模糊 |
llk |
字段名$llk |
右模糊 |
rlk |
字段名$rlk |
在vue列表页面的查询区域,增加要查询的字段即可,比如:
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-col :md="6" :sm="8">
<a-form-item label="职位名称">
<a-input placeholder="请输入职位名称" v-model="queryParam.positionName$lk"></a-input>
</a-form-item>
</a-col>
<a-col :md="6" :sm="8">
<a-form-item label="职位编码">
<a-input placeholder="请输入职位编码" v-model="queryParam.positionCode"></a-input>
</a-form-item>
</a-col>
<a-col :md="6" :sm="8">
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
<a-button type="default" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
<a @click="handleToggleSearch" style="margin-left: 8px">
{{ toggleSearchStatus ? '收起' : '展开' }}
<a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
</a>
</span>
</a-col>
</a-row>
</a-form>
</div>
界面效果:
云程平台对后端代码进行封装,业务上只需要实现Controller层的方法即可。
@GetMapping(value = "/list")
@AutoLog(value = "职务管理-分页查询")
public HttpResult<?> queryPageList(SysPosition sysPosition,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<SysPosition> queryWrapper = QueryBuilder.initQueryWrapper(sysPosition, req.getParameterMap());
Page<SysPosition> page = new Page<SysPosition>(pageNo, pageSize);
IPage<SysPosition> list = sysPositionService.page(page, queryWrapper);
return HttpResult.ok(list);
}
实现查询过滤重点语句是:
QueryWrapper<SysPosition> queryWrapper = QueryBuilder.initQueryWrapper(sysPosition, req.getParameterMap());
在该语句中,实现对查询规则的解析,并封装成后台mybatis-plus可以解析的SQL语句。