提供企业公共基础服务。如单项服务QPS过高可从该模块独立出去部署
- 省市区三级联动服务
- 短链生成及短链重定向服务
- 日历服务
- 通用excel导出服务。用于支持excel异步导出场景
- 字典服务
- 尽量降低excel导出时的内存消耗
- 后端导出统一化、前端导出组件化。统一导出规范
- 封装公共导出方法,管理导出的整个生命周期。只用关心业务逻辑,简化开发流程
- 使用自定义线程池异步处理,避免导出占用大量的服务器资源,影响业务接口正常响应
- 引入文件系统。避免因导出文件过大、导出逻辑耗时过长带来的请求超时等的问题
-
公共服务提供统一的excel导出接口,前端通过统一的接口来导出。统一导出接口会根据导出的url参数转发请求到各业务方的接口实现上,并带上导出参数
参考biz-spring-cloud-api-service-utility
公共基础服务的/excels/export/sid
接口的实现 -
公共组件包中提供通用异步导出方法。该方法封装分页查库 -> 分页数据写入excel -> excel文件上传 -> 同步导出状态等逻辑
参考biz-spring-cloud-api-starter
公共组件包的ExcelHelper.java
的实现,提供多种导出方法工业务方使用 -
支持导出模型不同类型字段支持,包括Java8时间类库以及常用的类型转换支持
因为是基于EasyExcel
实现,所以支持EasyExcel
中所有的功能特性。包括导出图片,行列合并等 -
公共服务提供统一的获取导出excel文件下载地址的方法,支持异步轮询下载导出文件 参考
biz-spring-cloud-api-service-utility
公共基础服务的/excels/export/status
接口的实现 -
扩展: 可在通用导出服务中添加导出审计日志,记录各业务方接口导出情况。并且可以添加导出权限控制、异常告警等扩展功能
具体使用可参考
biz-archetype-portal
服务/archetypes/export
接口。
-
添加pom依赖
<dependency> <groupId>cn.waynechu</groupId> <artifactId>biz-spring-cloud-api-starter</artifactId> </dependency>
-
在本地项目中添加导出接口,返回参数为String类型的sid (即导出唯一标识)
@ApiOperation("导出项目原型列表") @PostMapping("/export") public BizResponse<String> export(@RequestBody SearchArchetypeRequest request) { String sid = archetypeService.export(request); return BizResponse.success(sid); }
-
定义导出的Excel模型
@Data @ApiModel public class SearchArchetypeResponse { @ExcelProperty("原型id") @ApiModelProperty("原型id") private Long id; @ExcelIgnore @ApiModelProperty("项目类型: 0Service 1SDK") private Integer appType; @ExcelIgnore @ApiModelProperty("状态: 0生成中 1成功 2失败") private Integer statusCode; @ExcelProperty(value = "上传git", converter = BooleanConvert.class) @ApiModelProperty("上传git: 0否 1是") private Boolean gitUploadType; @ExcelProperty("创建人") @ApiModelProperty("创建人") private String createdUser; @ExcelProperty("创建时间") @ApiModelProperty("创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private LocalDateTime createdTime; ... }
相关注解说明:
注解 说明 @ExcelProperty 自定义导出的标题头 @ExcelIgnore(可选) 导出时忽略该字段 @ColumnWidth(可选) 自定义导出的列宽度。加在类上全局生效,否则单列生效 @HeadRowHeight(可选) 自定义标题列的高度。只能加在类上 @ContentRowHeight(可选) 自定义内容列的高度。只能加在类上 @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")(可选) 自定义时间字段格式 @NumberFormat("#.##%")(可选) 自定义数值类型格式。如加上百分号等 注:如果想要自定义类型转化器,可参考
cn.waynechu.springcloud.common.excel.convert
包下的转化器实现。 -
使用导出工具类导出
方式一:直接使用list数据导出
该方式推荐在数据量比较小的情况下使用。如果要查询的数据量很大,会增大获取sid接口的耗时@Service public class ArchetypeServiceImpl implements ArchetypeService { @Autowired private ExcelHelper excelHelper; @Override public List<SearchArchetypeResponse> listArchetypes(SearchArchetypeRequest request) { ···· } @Override public String export(SearchArchetypeRequest request) { // 查询导出数据 List<SearchArchetypeResponse> data = this.listArchetypes(request); // 导出excel return excelHelper.exportForSid("原型列表", data, SearchArchetypeResponse.class); } }
方式二(推荐):使用查询list数据的方法导出
因为传入查询方法后内部会异步去查询,故该方式不会产生接口超时的问题。推荐老的项目改造时使用该方式@Service public class ArchetypeServiceImpl implements ArchetypeService { @Autowired private ExcelHelper excelHelper; @Override public List<SearchArchetypeResponse> listArchetypes(SearchArchetypeRequest request) { ···· } @Override public String export(SearchArchetypeRequest request) { return excelHelper.exportForSid("原型列表", () -> listArchetypes(request), SearchArchetypeResponse.class); } }
方式三:使用列表查询分页数据的方法导出
使用该方式需满足分页查询规范,入参继承BizPageRequest
类、出参返回BizPageInfo
类型。 该方式可复用列表查询的方法,推荐新项目接入时可采用该方式@Service public class ArchetypeServiceImpl implements ArchetypeService { @Autowired private ExcelHelper excelHelper; @Override public BizPageInfo<SearchArchetypeResponse> search(SearchArchetypeRequest request) { ···· } @Override public String export(SearchArchetypeRequest request) { return excelHelper.exportForSid("原型列表", request, () -> search(request), SearchArchetypeResponse.class); } }
-
前后端联调
- 前端请求通用导出地址获取sid。接口地址为:
POST /service-utility/excels/export/sid
- 通用导出根据地址转发请求到业务放项目的导出接口上。导出地址格式为项目名 + 接口路径
- 前端拿到sid之后调用通用服务接口获取导出结果。 接口地址为:
POST /service-utility/excels/export/status
导出状态status说明:
状态Code 状态 说明 -1 导出失败 导出失败,具体失败原因可通过requestId查询 0 生成中 该状态下,前端轮询调用获取导出结果直到状态发生变更。轮询间隔建议从1秒开始指数型递增。如: 1s, 2s, 4s, 8s, 16s, 32s 1 生成成功 成功状态下,取返回的url即为导出的excel文件地址 - 前端请求通用导出地址获取sid。接口地址为: