导入导出的系统设计
导入
导入在系统中属于比较常见的功能。
新增数据时,每次只新增一条数据,会比较慢。
可以通过导入excel文件,进行批量导入。
导入的主要流程
(1)用户点击下载excel导入模板
(2)用户填写模板数据后,点击上传文件,选中文件进行上传
(3)解析导入文件
(4)校验字段,并给出提示
数据全部校验通过,就批量新增/更新,导入成功后提示成功。
部分数据校验不通过,不导入数据,直接提示失败的行数/列数,以及错误原因。
文件存储
如果文件直接放进系统所在的服务器上,时间久了,必然会占用大量的服务器资源,进而影响整个系统,必须用定时任务定时清除历史久远的文件。
如果项目或者公司有 OSS (Object Storage Service,对象存储服务),最好使用 OSS。
将文件上传到 OSS 上,需要导出时,再从OSS下载。
OSS一般会有一个失效时间,需要长期保存的文件就设置为永久,临时的文件可以根据业务需求跟产品确认后进行调整。
文件命名
文件上传到OSS时,每个文件需要设置一个唯一的文件id,以区分不同文件。
唯一的文件id,可以使用uuid。如果是分布式的项目,可以采用分布式唯一id。
文件id相同的视为同一文件,上传后会对旧文件进行更新替换。
导入模板
如果没有导入模板,用户不知道该输入哪些数据,也不知道具体的格式。
excel的导入模板,需要给出列标题,以及校验规则。可以在第二行或者批注中给出校验规则,以及示例。
字段校验
字符串字段,提示字段长度不能超过多少。
日期字段,提示日期格式。比如日期格式为 2022-08-01,或者 2022/08/01。
包含多个选项的字段,可以在excel中设置下拉选项,让用户直接选择。
批量插入/批量更新
最好有一个流水号的字段。相当于主键id。这样才能够确认数据是新增,还是更新。
数据校验通过之后,需要进行批量插入/更新。
如果使用的是Mysql,可以使用 INSERT ON DUPLICATE KEY UPDATE,可以实现“不存在则插入,存在则更新”。
详情见: https://www.cnblogs.com/expiator/p/14417406.html
分批处理
数据量比较大时,可以进行分批处理。
可以采用 谷歌Guava包的Lists.partition去做分批处理。
详情见: https://blog.csdn.net/qq_39416311/article/details/83310591
导出
导出文件的命名
导出文件,可以用"功能模块--用户id--日期时间"的格式进行命名。
导出的主要流程:
(1)用户点击导出
(2)异步处理,根据输入条件,查询出结果
(3)填充excel列标题,将查询结果写入excel,并生成文件id以及文件名称
(4)将excel异步上传到OSS
(5)获取OSS Url并持久化
(6)用户可以从导出列表下载excel
缓存
如果不是实时的数据,或者数据变更不频繁,可以使用缓存。加快查询数据的速度。
查询结果写入excel
可以使用 Poi,也可以使用 EasyExcel。
详情见: https://www.cnblogs.com/expiator/p/7424189.html
导出列表
设计一个导出列表,用户重新下载会比较方便,也容易定位问题。
导出列表,可以显示文件名称,导出时间,状态(导出成功,导出失败,导出中),失败原因,下载等。