当前位置: 首页 > news >正文

uni-app——uni-app 小程序 之 【列表多状态筛选的前后端联调实践:从单状态到IN查询的向后兼容设计】

本文记录一个真实的业务场景:列表页需要支持多状态组合筛选(如“进行中”合并两种关联状态),如何在不破坏现有API的前提下,优雅地实现前后端联调。

一、问题背景

1.1 原始需求

在前端应用的列表功能中,列表页需要按以下规则展示:

Tab分类

包含状态

说明

正在进行

状态1(2) + 状态2(3)

合并两种进行中的关联状态

历史数据

状态3(4)

仅展示已结束的相关数据

同时,列表项按钮展示逻辑如下:

  • 状态1:不显示操作按钮

  • 状态2 + 未操作:显示“去操作”按钮

  • 状态2 + 已操作:显示“查看详情”按钮

1.2 原有实现的问题

原有的API设计只支持单状态查询:

// 原查询参数
public class ListQueryForm {
private Integer status; // 只能传单个状态值
}

AND data.status = #{query.status}

这导致前端无法用一个请求获取“状态1+状态2”的合并列表,只能采用以下两种不合理方式:

  1. 发两次请求分别查询,前端合并 —— 分页逻辑复杂,易出现数据错乱

  2. 查询全部状态,前端过滤 —— 数据量大时性能差,浪费带宽

二、解决方案设计

2.1 核心思路

新增statusList参数支持多状态IN查询,同时保留原status参数确保向后兼容。

优先级:statusList > status

  • 如果传了 statusList,使用 IN 查询
  • 如果只传 status,保持原有逻辑
  • 两者都不传,不加状态筛选条件

2.2 方案优势

特性

说明

向后兼容

旧的调用方式继续生效,无需修改已有代码和相关依赖

灵活扩展

支持任意状态组合,适应未来业务需求变化

单次请求

避免多次请求的复杂性和性能损耗,提升接口响应效率

分页友好

数据库层面完成筛选,分页逻辑正确,无数据漏查、重复问题

三、后端实现

3.1 扩展查询参数

// ListQueryForm.java
public class ListQueryForm extends PageParam {

/** 单状态筛选(保留,向后兼容) */ private Integer status; /** 多状态筛选(新增,优先级更高) */ private List<Integer> statusList; // getter/setter...

}

3.2 MyBatis动态SQL

SELECT data.id, data.title, data.status, ... FROM t_list_data data data.deleted_flag = 0
<!-- 多状态筛选(优先级高) --> <if test="query.statusList != null and query.statusList.size() > 0"> AND data.status IN <foreach collection="query.statusList" item="s" open="(" separator="," close=")"> #{s} </foreach> </if> <!-- 单状态筛选(向后兼容,仅在statusList为空时生效) --> <if test="(query.statusList == null or query.statusList.size() == 0) and query.status != null"> AND data.status = #{query.status} </if> <!-- 其他条件... --> </where> ORDER BY data.create_time DESC

关键点解析:

  1. 条件优先级:通过嵌套的<if>判断,确保statusList优先于status,避免逻辑冲突

  2. 空集合处理:statusList.size() > 0避免生成IN ()的无效SQL,防止数据库报错

  3. foreach用法:open/separator/close自动生成正确的IN (2, 3)语法,无需手动拼接

3.3 生成的SQL示例

– 前端传入 statusList = [2, 3]
SELECT … FROM t_list_data data
WHERE data.deleted_flag = 0
AND data.status IN (2, 3)
ORDER BY data.create_time DESC
LIMIT 0, 10;

– 旧接口传入 status = 4(向后兼容)
SELECT … FROM t_list_data data
WHERE data.deleted_flag = 0
AND data.status = 4
ORDER BY data.create_time DESC
LIMIT 0, 10;

四、前端适配

4.1 Tab与API参数映射

// list.vue
const TAB_CONFIG = {
ongoing: {
label: ‘正在进行’,
statusList: [2, 3] // 状态1 + 状态2
},
history: {
label: ‘历史数据’,
statusList: [4] // 状态3
}
}

const currentTab = ref(‘ongoing’)

// 获取列表数据
async function fetchListData(page = 1) {
const params = {
page,
pageSize: 10,
statusList: TAB_CONFIG[currentTab.value].statusList
}
const res = await api.getListData(params)
// …
}

4.2 按钮展示逻辑

{{ item.title }} {{ getStatusText(item.status) }}
<!-- 按钮区域:状态1不显示 --> <view class="list-actions" v-if="item.status !== 2"> <!-- 状态2:根据是否已操作显示不同按钮 --> <template v-if="item.status === 3"> <button v-if="!item.hasOperated" type="primary" @click="goOperate(item)"> 去操作 </button> <button v-else type="default" @click="viewDetail(item)"> 查看详情 </button> </template> <!-- 状态3:只能查看 --> <button v-if="item.status === 4" type="default" @click="viewDetail(item)"> 查看结果 </button> </view>

4.3 状态与按钮对照表

状态

status值

hasOperated

显示按钮

状态1

2

    无按钮

    状态2

    3

    false

    去操作

    状态2

    3

    true

    查看详情

    状态3

    4

      查看结果

      五、经验总结

      5.1 API扩展的兼容性原则

      ✅ 新增参数,保留旧参数
      ✅ 新参数优先,旧参数兜底
      ✅ 不改变原有参数的语义
      ❌ 直接修改或删除旧参数
      ❌ 改变旧参数的默认行为

      5.2 MyBatis多状态查询的通用模式

      AND table.status IN #{item} AND table.status = #{query.status}

      5.3 前端状态管理建议

      1. 配置化Tab映射:将Tab与状态的对应关系抽取为配置,集中管理,便于后续修改和维护

      2. 统一状态常量:前后端共用状态码定义,避免魔法数字,减少联调误差

      3. 按钮逻辑与列表解耦:按钮显示规则独立封装为方法或组件,提高可测试性和复用性

      六、扩展思考

      6.1 如果状态更多怎么办?

      当状态组合变得复杂时,可以考虑通过枚举统一管理状态组:

      // 定义状态组枚举
      public enum DataStatusGroup {
      ONGOING(Arrays.asList(2, 3)), // 正在进行
      HISTORY(Arrays.asList(4)), // 历史
      ALL(Arrays.asList(2, 3, 4)); // 全部

      private final List<Integer> statusList; // ...

      }

      前端只需传入statusGroup: "ONGOING",后端自动展开为对应的状态列表,降低前后端联调成本。

      6.2 性能优化

      对于状态字段,建议做以下优化,提升查询效率:

      1. 添加数据库索引:CREATE INDEX idx_status ON t_list_data(status),加速状态筛选

      2. 如果状态值固定且数量较少,IN查询性能通常优于OR查询,更适合多状态组合场景


      本文基于实际开发经验整理,聚焦多状态筛选的前后端联调技巧与兼容性设计,希望对遇到类似场景的开发者有所帮助。

      http://www.jsqmd.com/news/442671/

      相关文章:

    • 电采暖性价比高的厂家怎么选 哈尔滨韩达电热工程公司靠谱不 - 工业品网
    • 制作网站选服务器还是虚拟主机?轻量应用服务器能不能选
    • 智能家居控制系统设计与实现
    • 上海室内设计公司哪家好,铂空间设计给你高品质设计体验 - 工业品网
    • ASCLIN UART LIN这三个解释一下
    • 2026年高精度数控油源生产公司哪家专业,排名情况揭秘 - mypinpai
    • MES工具更新信息 01/2026
    • 为什么 Infineon 不直接叫 UART,而叫 ASCLIN?以及 ASCLIN 和 STM32 的 USART 在架构上的本质区别(这个对理解 AURIX 外设很重要)
    • 点云数据类型详解:从XYZ到XYZRGB到法向量
    • 2025陕西玻璃钢雕塑厂家五大推荐:覆盖泡沫雕塑、不锈钢雕塑与景观雕塑的一站式厂家榜单 - 深度智识库
    • 炎症“三巨头”——TNF-α, IL-1β, IL-6 的作用机制解析
    • 探讨2026年方形摇摆筛,河南亚通机械靠谱吗? - 工业品牌热点
    • 项目管理秘籍-低代码开发者的职业天花板,到底在哪里?
    • 2026年靠谱的地源热泵制冷品牌推荐:天津地源热泵主机厂家实力哪家强 - 行业平台推荐
    • 2026年北京售后完善且诚信的AI搜索机构推荐与选购指南 - myqiye
    • 制作网站为什么要进行域名备案
    • 使用 Windows.Media.Control 控制音乐播放程序
    • 上海宠物主分享:给狗狗做绝育,这些医生评价不错,猫咪绝育/猫咪耳道内窥镜检查/母犬腹腔镜绝育,狗狗绝育医生推荐排行 - 品牌推荐师
    • 偏高岭土选购指南2026:揭秘优质供应商名单,白糊精/陶土/偏高岭土/氧化铝粉/白刚玉,偏高岭土源头厂家有哪些 - 品牌推荐师
    • emlog管理员(包括内容编辑)上传文件最大限制
    • GPT-5.4是什么?介绍、国内使用与官方价格
    • Sentinel 12,Sentinel 熔断降级:慢调用、异常比例、异常数实战
    • 2026年就业率高的央国企就业规划机构,衔芦职导服务价格多少钱 - 工业推荐榜
    • 硕士论文降AI实操记录:3万字从38%到9.2%,1小时搞定 - 老米_专讲AIGC率
    • 2026年评价高的雨棚工厂推荐:篮球场雨棚/佛山电动雨棚/佛山篮球场雨棚值得信赖的生产厂家 - 行业平台推荐
    • 请问网站如何更换默认的浏览器图标?
    • emlog管理员(包括内容编辑)上传文件类型限制
    • 类与对象的创建
    • 2026年热门的激光切割去毛刺机公司推荐:苏州除挂渣去毛刺机公司口碑哪家靠谱 - 行业平台推荐
    • 2026年热门的三维动画工厂推荐:宁波三维动画设计口碑好的厂家推荐 - 行业平台推荐