查询三要素
查询功能由三个要素组成:查询字段、查询关键字、查询方式
一般的查询侧重前两项,比如按照手机号查询、按照订单号查询等等。
但是查询方式呢?往往都是只设置了一种,比如查询手机号,只能是模糊查询,包含要查的数字就算,不会做更详细的区分。
比如我想查138 开头的手机号,那么中间可以能出现138 ,我想查0318结尾的手机号,那么0318也可能出现在中间。
一般的情况下,如果客户不是特意强调需求的话,一个字段只会给出一个查询方式,不会提供其他备选的查询方式。
这个,是不是不够灵活?
所以我想做一个更灵活的查询控件,首先就要实现多种查询方式。
那么有多少种查询方式呢?简单的整理了一下
/**
* 查询方式
* * 数字 =、<>、>=、<=、between
* * 字符串 =、不等于、包含、起始于、结束于
* * 日期时间 =、between
*/
export const findKindList = {
// 字符串
401: { // 等于 字符
id: 401,
name: '=',
where: '{col} = "{key}"'
},
402: { // 不等于 字符
id: 402,
name: '不等',
where: '{col} <> "{key}"'
},
403: { // 包含 字符
id: 403,
name: '包含',
where: '{col} like "%{key}%"'
},
404: { // 不包含 字符
id: 404,
name: '不包含',
where: '{col} not like "%{key}%"'
},
405: { // 起始于 字符
id: 405,
name: '起始于',
where: '{col} like "{key}%"'
},
406: { // 结束于 字符
id: 406,
name: '结束于',
where: '{col} like "%{key}"'
},
// 数字
411: { // 等于 数字
id: 411,
name: '等于',
where: '{col} = {key}'
},
412: { // 不等于 数字
id: 412,
name: '不等于',
where: '{col} <> {key}'
},
413: { // 大于 数字
id: 413,
name: '>',
where: '{col} > {key}'
},
414: { // 大于等于 数字
id: 414,
name: '>=',
where: '{col} >= {key}'
},
415: { // 小于 数字
id: 415,
name: '<',
where: '{col} < {key}'
},
416: { // 小于等于 数字
id: 416,
name: '<=',
where: '{col} <= {key}'
},
417: { // 范围 数字
id: 417,
name: '从',
where: '{col} between {key1} and {key2}'
},
// 多选组
420: {
id: 420,
name: 'in',
where: '{col} in ({key})'
}
}
基本是这些,然后就是日期的查询方式,这个比较乱。
以前只是“等于日期”,日期范围就可以了,但是现在日期控件不仅可以提供日期,还可以提供“年月”、“年”、“年周”这类的形式。
而且后端也出现了用int或者char的类型来存放日期数据。
那么综合起来要如何做查询呢?
似乎排列组合的结果有点多。
等于
日期、日期+时间、年月、年周
范围
开始日期 + 结束日期、年月(比如202101)、年周(比如202104)、年(比如2021)
开始年月+结束年月、开始年周+结束年周、开始年份 + 结束年份
大于小于的情况。
其中年月,就是指的某一个月份,比如202101,指的是2021年01月01日到 2021年01月31日
有的时候只是查一个月的范围,那么也就没必要选择开始日期+结束日期的形式,或者开始年月+结束年月这么麻烦。
所以日期的查询还是很麻烦的,目前是想用两个角度的分类。
首先按照查询条件来分:等于、范围、大于、小于
然后按照日期类型来分:日期、日期+时间、年月、年周、年
这样避免罗列组合的数量。另外还有一个显示格式和交给后端的格式的问题。这就要看后端期待什么格式了,是字符串的‘2021-01-01’的形式,还是标识的日期格式,或者是时间戳。
总是很麻烦,那么为啥要考虑这么多呢?因为就是这些事情,前端不爱管,后端也不爱管,那么谁来管?只能是做控件的来操心了呀,要不然岂不是封装了个寂寞。。。
所以还是需要一些时间来完善的。
目前是这样的,比较简陋
数据格式
如果只是字段和查询关键字的话,可以用key-value的对象形式,但是现在多了一个查询条件,那么要如何设计呢?
- 方案一:
{
colName: 'title',
findKind: 401,
findValue: '某某某'
},
{
...
}
比较标准吧,只是太繁琐,如果项目要求查询必须用get,那么这个就太长了,很容易超出字符数的限制。
- 方案二:
title:[401, '某某某']
这个比较简洁,字段名称作为key,后面跟一个数组,第一个元素是查询条件,第二个元素是查询关键字,如果是范围查询,那么第二个元素是数组。
缺点就是没有明确的区分说明,不看定义,说知道数组里面都是啥东东。
查询方式为啥又是数字?
这个,个人习惯吧,我是特别喜欢数字的形式,因为“好识别”,当然这个不是针对程序员的,而是针对代码的。其实这一套查询解决方案,包括前后端的,都不用程序员去读去写,而是可视化的方式来实现的,所以看到的是数字对应的name。