query-filter 使用指南(团队约定)
本指南统一说明在业务列表接口中使用 query-filter 进行筛选、排序与分页的推荐范式,确保各模块行为一致、代码可读。
快速开始
js
import queryFilter, { KeyType, ListOrder, SortBy, DEFAULT_PAGE_FIRST, DEFAULT_PAGE_SIZE } from '@/api/base/query-filter'
queryFilter.init()
// 可选:分页
queryFilter.page = DEFAULT_PAGE_FIRST
queryFilter.pageSize = DEFAULT_PAGE_SIZE
// 设定筛选条件(支持多个)
queryFilter.setQuery([
{ keyBy: 'status', keyValue: 1, keyType: KeyType.EQ },
{ keyBy: 'id', keyValue: '100,101,102', keyType: KeyType.IN }
])
// 设定排序
queryFilter.sortBy = 'id' // 或 SortBy.CREATE_TIME / UPDATE_TIME / LIST_ORDER
queryFilter.listOrder = ListOrder.DESC
// 传给任意 *Index 列表接口
const res = await someIndexApi(queryFilter.getFilters())常见筛选模式
等值匹配(eq)
- 用途:精确匹配某个字段值
- 用法:
{ keyBy: 'platform', keyValue: 'douyin', keyType: KeyType.EQ }
模糊匹配(like)
- 用途:关键字搜索(名称、标题、标签等)
- 用法:
{ keyBy: 'keyword', keyValue: '风景', keyType: KeyType.LIKE } - 说明:后端通常按 SQL LIKE 语义处理;无需显式加
%(如接口有特殊约定,可按接口文档补充)。
集合匹配(in / not_in)
- 用途:匹配一组 ID 或状态集合
- 用法:
{ keyBy: 'id', keyValue: '1,2,3', keyType: KeyType.IN } - 推荐:若前端拿到数组,可先
array.join(',')再赋值给keyValue。
区间匹配(between / not_between)
- 用途:时间范围、数值范围
- 用法:
{ keyBy: 'create_time', keyValue: '1727606400,1728211200', keyType: KeyType.BETWEEN } - 说明:区间值使用英文逗号分隔;时间字段传时间戳或后端约定的格式。
比较匹配(gt / egt / lt / elt / neq)
- 用途:>、≥、<、≤、!=
- 用法:
{ keyBy: 'score', keyValue: 90, keyType: KeyType.GT }
排序范式
统一写法
queryFilter.sortBy = 'id'或使用SortBy预定义常量(CREATE_TIME/UPDATE_TIME/LIST_ORDER)queryFilter.listOrder = ListOrder.DESC或ASC
团队约定
- 若无特别业务要求,列表默认使用
id desc,以保证“最新优先”的一致体验。
- 若无特别业务要求,列表默认使用
分页范式
- 推荐:列表页开启分页,导出/小列表场景可不分页
- 示例js
queryFilter.page = DEFAULT_PAGE_FIRST // 1 queryFilter.pageSize = DEFAULT_PAGE_SIZE // 50(可按模块定制)
组合条件(多条件 AND)
setQuery支持一次设置多个条件,内部会使用~将 kb/kv/kt 串联,后端按约定解析为 AND 组合:jsqueryFilter.setQuery([ { keyBy: 'platform', keyValue: 'douyin', keyType: KeyType.EQ }, { keyBy: 'storyboard_id', keyValue: 123, keyType: KeyType.EQ }, { keyBy: 'status', keyValue: 'ready,done', keyType: KeyType.IN } ])
关联对象筛选(可选)
- 若接口支持“关联条件”,可使用以下字段:
hasKey:关联对象名(如topic)hasKeyBy:关联对象字段(如name)hasKeyValue:关联字段值(同样支持逗号分隔)hasKeyType:匹配类型(同KeyType)
- 示例(仅在接口有该能力时使用):js
queryFilter.hasKey = 'topic' queryFilter.hasKeyBy = 'name' queryFilter.hasKeyValue = '风景' queryFilter.hasKeyType = KeyType.LIKE
常见场景示例
拉取最新发布记录(最新优先)
jsqueryFilter.init() queryFilter.setQuery([ { keyBy: 'storyboard_id', keyValue: storyboardId, keyType: KeyType.EQ }, { keyBy: 'platform', keyValue: platform, keyType: KeyType.EQ } ]) queryFilter.sortBy = 'id' queryFilter.listOrder = ListOrder.DESC const res = await materialStoryboardPublishIndex(queryFilter.getFilters())关键字 + 时间范围 + 分页
jsqueryFilter.init() queryFilter.page = 1 queryFilter.pageSize = 20 queryFilter.setQuery([ { keyBy: 'keyword', keyValue: keyword, keyType: KeyType.LIKE }, { keyBy: 'create_time', keyValue: `${startTs},${endTs}`, keyType: KeyType.BETWEEN } ]) queryFilter.sortBy = SortBy.CREATE_TIME queryFilter.listOrder = ListOrder.DESC const res = await someIndexApi(queryFilter.getFilters())批量按 ID 查询(IN)
jsqueryFilter.init() const ids = [101, 203, 309] queryFilter.setQuery([ { keyBy: 'id', keyValue: ids.join(','), keyType: KeyType.IN } ]) const res = await someIndexApi(queryFilter.getFilters())
注意事项
- 每次使用前务必调用
queryFilter.init(),避免不同调用间共享状态。 - IN/区间(BETWEEN)等复合值使用英文逗号连接,前后端需在接口层保持统一约定。
- LIKE 的匹配策略由后端决定;一般无需在前端手动添加
%。 - 排序未设定时,可能由后端默认排序决定;建议显式设定以获得稳定结果。
- 分页不设定时,后端可能返回全部数据;列表页建议显式开启分页。
推荐引用路径
js
import queryFilter, { KeyType, ListOrder, SortBy } from '@/api/base/query-filter'若模块未配置 @ 别名或必须使用相对路径,请以项目中现有写法为准。