案例 进度条优化用户体验
一、示例:移动、复制文件与文件夹
调整前:
1、找到所有父节点;
2、根据父节点找到子节点数据,并复制数据入库;
3、递归第二步,完成各子节点数据的复制/移动操作
调整后:
第一步:代码调优
1、根据被复制/移动路径找到所有节点数据datas;
2、循环datas(禁止递归),将符合条件的节点数据存入List集合;数据校验通过,即可认为该条数据复制或移动成功
3、循环结束,根据List拼接SQL语句,批量新增或更新(降低数据库连接次数);
二、示例:识别、查验添加发票
请求参数声明:上传附件列表MultipartFile[] files、附件名称fileNames
业务声明:发票类型分为批量添加/非电子发票添加(PDF、IMG),电子发票添加(PDF、OFD)
调整前:
1、循环files,并根据请求参数fileNames区分文件类型;
2、批量添加:用户提交查验->识别发票->用户确认发票内容后、添加发票->查验且查验成功后添加发票
3、电子发票添加:用户提交查验->自动识别、查验且成功后自动添加发票
调整后:
1、循环files,获取文件的fileName;
2、循环files,根据fileName区分文件类型,并根据上传附件file获取发票原件invoiceFiles;(特殊规则:批量添加-PDF,将PDF转图片,获取发票原件;电子发票添加-PDF,只取第一页作为发票原件);
3、循环invoiceFiles,根据发票类型对发票原件识别、查验、添加发票,并将查验详情存入List集合;
4、循环结束,根据List拼接SQL语句,批量新增或更新(降低数据库连接次数);
三、实现进度条功能
通过观察,我们得知,调整前的实现逻辑,存在滥用数据库连接、数据量稍微大点就可能导致请求接口超时等问题;
吐槽:这这这,,部分老六式的代码属实难懂,换句话说,开发总想着为抽写方法而提取代码块,但抽象不出来往往提取的方法啥也不是,各种‘假作坊’造黑盒子方法,那逻辑写的稀碎啊。
建议:在理清业务实现逻辑的前提下,一定要学会‘装’黑盒子方法,归类就可以,不用绞尽脑汁的‘造’方法!
1、前端调用接口,controller层只做参数校验、并返回操作ID,前端根据ID可实时获取操作进度并展示; 2、service层生成操作ID,进度条总长度(初始化进度条相关数据); 3、service层开启异步任务,实现核心业务,并在for循环中更新操作实时进度; 4、当循环结束时,将整理到的数据批量入库,并更新本次操作结果;
*最后,关键位置记得写日志,一~~呀呼
雨淋淋过的季节