APP瀑布流分页问题——领取,使用等操作即消失问题

问题

需求:需要在APP开发一个类似评论审核的功能,当点击审核通过时,此评论从审核列表之中清除.列表根据审核的创建时间倒序
难点:当清除的之后,会对后续分页的结果产生影响

如操作前分页结果


(分页),分页内容1 分页内容2 分页内容3
1, A B C
2, D E F
3, G H I

待请求
4, J K L

接下来,我们将第二页之中的 E数据清除

结果变为


期望
(分页),分页内容1 分页内容2 分页内容3
1, A B C
2, D   F
3, G H I

待请求
4, J K L

实际
(分页),分页内容1 分页内容2 分页内容3
1, A B C
2, D F G
3, H I  

待请求
4, K L M

没有返回的数据
K

当我们在请求数据的时候,会跳过原本应该在第四页输出的

适用范围

本博文只适用于操作完,被操作的数据不再出现在列表内。

数据结构

表字段 字段含义
id id主键
userId 用户id
status 状态 1 未审核 2 审核成功
create_time 创建时间

基本分页方案

基本SQL
SELECT * FROM t WHERE userId=XXX AND status=1 ORDER BY create_time LIMIT xx , xx

解决方案

1. 外传入Id

方案基本逻辑:
将上一条排序在末尾的数据,他的ID作为查询条件,一次性最多取十条。

适用范围:
存在一个可以排序的id

具体方案:
SELECT * FROM t WHERE userId=XXX AND status=1 AND id > #{minId} ORDER BY create_time LIMIT 10

但是,我们当前排序的逻辑却是使用create_time,因此单纯使用 miniId 却是与我们的逻辑不符
因此,我们便需要使用两个字段进行排序字段create_time 与 id 。

此方案不能使用一条SQL解决,需要使用两条SQL

SELEC * FROM  t WHERE  userId=XXX AND id > `#{minId}` AND  AND status=1create_time=`#{create_time}` ORDER BY create_time , id LIMIT 10

# 确定上条SQL条数,变量为num
if( num > 0 ){
	SELECT * FROM  t WHERE  userId=XXX  AND status=1 AND create_time > `#{create_time}` ORDER BY create_time ,id  LIMIT num
}

2. 前端将被操作的数据ID,作为额外id传入

方案基本逻辑:
将被操作的数据作为额外参数传入,在排序的时候便可以将被操作的数据一起进行排序

方案适用范围:

  1. 操作后的数据,其排序字段并不会被修改

    如: 在领取后,并不会对排序字段create_time进行修改

  2. 当前查询之中拥有额外可作为索引的字段
    在查询SQL之中存在查询条件 userId=XXXX
    6

具体方案:

简单方案:
将SQL修改为

SELECT * FROM t WHERE userId=XXXX AND (status=1 OR id IN (XXX)) ORDER BY create_time LIMIT XX , 10

3. 前端灵活的加载逻辑

方案基本逻辑:

  1. 用户操作第十一条数据
  2. 前端计算出,当前这条数据在第二页,第二页数据开始的队列索引为10
  3. 删除10往后的所有数据(包括下标为10)
  4. 重新加载第二页的数据,分页其实下标调整为 2

方案适用范围:

当前屏幕无法一次性加载单页内的所有数据。若屏幕能展示,单页内的所有数据。则会有很明显的数据较少的样式

你可能感兴趣的:(笔记,数据库,java,前端,技术方案)