sqlx_query_dsl/
params.rs

1
2use serde::Deserialize;
3use serde_json::Value;
4
5/// 通用查询参数结构体
6/// 用于接收前端传递的查询条件、分页、排序等信息
7#[derive(Debug, Deserialize)]
8pub struct QueryParams {
9    /// 过滤条件表达式(支持嵌套的 AND/OR)
10    pub filter: Option<FilterExpr>,
11    /// GROUP BY 字段列表
12    pub group_by: Option<Vec<String>>,
13    /// HAVING 过滤条件
14    pub having: Option<FilterExpr>,
15    /// 排序规则列表
16    pub sort: Vec<SortItem>,
17    /// 当前页码(通常从 0 开始,具体取决于实现)
18    pub page: u32,
19    /// 每页记录数
20    pub page_size: u32,
21}
22
23/// 过滤表达式枚举
24/// 支持逻辑与、逻辑或以及具体条件
25#[derive(Debug, Deserialize)]
26#[serde(untagged)]
27pub enum FilterExpr {
28    /// 逻辑与 (AND)
29    And { and: Vec<FilterExpr> },
30    /// 逻辑或 (OR)
31    Or { or: Vec<FilterExpr> },
32    /// 单个过滤条件
33    Cond(FilterCond),
34}
35
36/// 单个过滤条件详情
37#[derive(Debug, Deserialize)]
38pub struct FilterCond {
39    /// 数据库字段名
40    pub field: Option<String>,
41    /// 操作符
42    pub op: Op,
43    /// 比较值
44    pub value: Option<Value>,
45}
46
47/// 支持的 SQL 操作符
48#[derive(Debug, Deserialize)]
49#[serde(rename_all = "snake_case")]
50pub enum Op {
51    /// 等于 (=)
52    Eq,
53    /// 不等于 (!=)
54    Ne,
55    /// 模糊匹配 (LIKE)
56    Like,
57    /// 大于 (>)
58    Gt,
59    /// 小于 (<)
60    Lt,
61    /// 大于等于 (>=)
62    Gte,
63    /// 小于等于 (<=)
64    Lte,
65    /// 包含在列表内 (IN)
66    In,
67    /// 不包含在列表内 (NOT IN)
68    NotIn,
69    /// 在范围内 (BETWEEN)
70    Between,
71    /// 逗号分隔字符串查找 (FIND_IN_SET)
72    FindInSet,
73    /// JSON 包含 (JSON_CONTAINS)
74    JsonContains,
75    /// 为空 (IS NULL)
76    IsNull,
77    /// 不为空 (IS NOT NULL)
78    IsNotNull,
79    /// 存在子查询 (EXISTS)
80    Exists,
81    /// 不存在子查询 (NOT EXISTS)
82    NotExists,
83}
84
85/// 排序项
86#[derive(Debug, Deserialize)]
87pub struct SortItem {
88    /// 排序字段名
89    pub field: String,
90    /// 是否降序 (true: DESC, false: ASC)
91    pub desc: bool,
92}
93
94/// EXISTS/NOT EXISTS 操作符所需的值结构
95#[derive(Debug, Deserialize)]
96pub struct ExistsValue {
97    /// 子查询 SQL 语句
98    pub sql: String,
99    /// 子查询绑定的参数列表
100    pub bind: Option<Vec<Value>>,
101}