订单多条件筛选接口设计与实现

电子说

1.4w人已加入

描述

 背景需求

在电商系统中,订单管理模块常需支持多维度组合查询。典型筛选条件包括:

时间范围:$t in [t_{text{start}}, t_{text{end}}]$

订单状态:$s in {text{待支付}, text{已发货}, text{已完成}}$

金额区间:$p in [p_{min}, p_{max}]$

商品类别:$c = c_{text{target}}$

用户ID:$u = u_{text{specified}}$

接口设计原则

RESTful风格
GET /orders?param1=value1¶m2=value2

参数动态组合
支持任意条件自由组合,未传参数视为不筛选

分页机制
需包含page和size参数,避免全量查询

核心实现方案

 

from flask import request
from sqlalchemy import and_

@app.route('/orders', methods=['GET'])
def filter_orders():
    # 解析查询参数
    filters = []
    if 'start_time' in request.args:
        filters.append(Order.create_time >= request.args['start_time'])
    if 'end_time' in request.args:
        filters.append(Order.create_time <= request.args['end_time'])
    if 'status' in request.args:
        filters.append(Order.status == request.args['status'])
    # 其他条件类似处理...
    
    # 组合查询与分页
    query = Order.query.filter(and_(*filters)) if filters else Order.query
    page = query.paginate(page=int(request.args.get('page',1)), 
                          per_page=int(request.args.get('size',20)))
    return jsonify([order.to_dict() for order in page.items])
接口设计

 

关键优化点

数据库索引

为高频筛选字段(如create_time, status)建立复合索引

满足最左前缀原则:$ text{INDEX}(t,s) $

参数校验

时间格式校验:$text{ISO}8601$

枚举值校验:$s in S_{text{valid}}$

缓存策略

 

graph LR
A[请求] -- > B{参数是否变化}
B -- >|否| C[返回缓存结果]
B -- >|是| D[数据库查询]
D -- > E[更新缓存]
接口设计

 

边界处理

空结果集返回204 No Content

非法参数返回400 Bad Request并携带错误明细

大结果集强制分页,默认限制$text{MAX_SIZE}=100$

总结

多条件筛选接口需平衡灵活性与性能,核心在于:

动态构建查询条件

合理利用数据库索引

规范化参数处理 通过分层设计可满足复杂业务场景,同时保障系统稳定性。欢迎大家留言探讨。

​审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分