简单来说就是优化后台文件下载的,主要因为文件类型多,有的文件需要动态写入值(报表),有的不需要,有的能下载有的只能在线打开,可采用策略+工厂方法优化一下代码
结构:
@Data
@Slf4j
public class ExcelFile implements FileInterface{
private FileBase fileBase;
@Override
public String anlysql() {
log.info(fileBase.getId());
return "Excel anlysql";
}
@Override
public String writeFile() {
log.info(fileBase.getId());
return "Excel writeFile";
}
}
@Data
@Slf4j
public class WordFile implements FileInterface{
private FileBase fileBase;
@Override
public String anlysql() {
log.info(fileBase.getId());
return "Word anlysql";
}
@Override
public String writeFile() {
log.info(fileBase.getId());
return "Word writeFile";
}
}
@Data
@Slf4j
public class PdfFile implements FileInterface{
private FileBase fileBase;
@Override
public String anlysql() {
return null;
}
@Override
public String writeFile() {
return null;
}
}
public interface FileInterface {
String anlysql();
String writeFile();
FileBase getFileBase() ;
void setFileBase(FileBase fileBase) ;
}
@Component
public class FileFactory {
public List<FileInterface> getFile(List<FileBase> fileList){
List<FileInterface> list = new ArrayList<>();
for (FileBase fileBase : fileList) {
//查询数据库
switch (fileBase.getType()){
case 1:
FileInterface excelFile = new ExcelFile();
((ExcelFile) excelFile).setFileBase(fileBase);
list.add(excelFile);
break;
case 2:
FileInterface wordFile = new WordFile();
((WordFile) wordFile).setFileBase(fileBase);
list.add(wordFile);
break;
default:
break;
}
}
return list;
}
}
@RequestMapping("/webDownLoadFile")
public Object test()throws Exception{
//查某用户在某个业务下的文件,得到文件ID:
ArrayList<String> listString = new ArrayList<>();
QueryWrapper<FileBase> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id","type","url","sqls");
List<FileBase> list = fileBaseMapper.selectList(queryWrapper);
//工厂类根据type进一步创建具体对象
List<FileInterface> file = fileFactory.getFile(list);
for (FileInterface f : file) {
FileBase fileBase = f.getFileBase();
String anlysql = f.anlysql();
fileBase.setSqls(anlysql);
f.writeFile();
}
return null;
}