导入导出的系统设计

导入

导入在系统中属于比较常见的功能。
新增数据时,每次只新增一条数据,会比较慢。
可以通过导入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去做分批处理。
详情见: Lists.partition用法_lists.partition(_南无南有的博客-CSDN博客

导出

导出文件的命名

导出文件,可以用"功能模块--用户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

导出列表

设计一个导出列表,用户重新下载会比较方便,也容易定位问题。
导出列表,可以显示文件名称,导出时间,状态(导出成功,导出失败,导出中),失败原因,下载等。

你可能感兴趣的:(A1-系统设计,java)