场景:在某些筛选条件下查询列表,后端接口返回了一个List<Picture>集合,前端点击预览进入预览页。
需求:在预览页增加【上一个】【下一个】【关闭】按钮,直接在该页面翻页预览其它内容。
实现:如果是后端来做的话,感觉最方便的是用Stack来存储,不过前端没有栈这个类型,所有用List模拟数组实现。
package com.tk.ecommerce.controller;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
/**
* 模拟前端预览图片时的翻页
* @author tkai
*/
public class Preview {
public static void main(String[] args) {
PreviewDemo previewDemo = new PreviewDemo();
Scanner scanner = new Scanner(System.in);
boolean flag = true;
System.out.println("请输入预览ID:");
int id = scanner.nextInt();
Dossier dossier = previewDemo.previewOne(id);
System.err.println("当前预览的对象:"+dossier);
while(flag){
System.out.println("请选择:");
System.out.println("n:下一个");
System.out.println("b:上一个");
System.out.println("e:退出程序");
String key = scanner.next();
switch(key){
case "n":
dossier = previewDemo.nextOne(dossier);
break;
case "b":
dossier = previewDemo.beforeOne(dossier);
break;
case "e":
previewDemo.clear();
flag = false;
scanner.close();
break;
default:break;
}
System.err.println("当前预览的对象:"+dossier);
}
System.out.println("退出预览!");
}
}
/**
* @author tkai
* @description: TODO
* @date 2022/10/24 14:49
*/
class PreviewDemo {
public List<Dossier> dataList;
public List<Dossier> before;
public List<Dossier> after;
public PreviewDemo() {
this.dataList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
Dossier dossier = new Dossier(i, "测试文件" + i + ".png", new Date());
dataList.add(dossier);
}
this.before = new ArrayList<>();
this.after = new ArrayList<>();
}
/**
* 首次点击预览时 划分当前图片的前一部分和后一部分
* @param id
* @return
*/
public Dossier previewOne(int id){
int i = 0;
while(true){
if(dataList.get(i).getId()==id){break;}
before.add(dataList.get(i));
i++;
}
Dossier cur = dataList.get(i);
i++;
while(true){
if(i==dataList.size()-1){
break;
}
after.add(dataList.get(i));
i++;
}
return cur;
};
/**
* 点击下一个时 取出后面队列的第一个,作为预览的元素,并将当前传入的元素置入前面队列的最后
* @param cur
* @return
*/
public Dossier nextOne(Dossier cur){
if(after.size()==0){
System.err.println("后面没有更多了");
return cur;
}
Dossier next = after.get(0);
//从后面的队列中移除
after.remove(0);
//将原来的放入before的最后面
before.add(cur);
return next;
}
public Dossier beforeOne(Dossier cur){
if(before.size()==0){
System.err.println("前没有更多了");
return cur;
}
Dossier next = before.get(before.size() - 1);
//前面的队列中移除最后一个元素
before.remove(before.size()-1);
//将当前元素放入到后面元素的最前面
List<Dossier> oldAfter = after;
after = new ArrayList<>();
after.add(cur);
after.addAll(oldAfter);
return next;
}
public void clear(){
after = new ArrayList<>();
before = new ArrayList<>();
}
}
/**
* 档案对象
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
class Dossier{
private Integer id;
private String fileName;
private Date createTime;
}