需求背景
- 日常工作中,对于一个码农来说,熟练使用框架之外,还需要灵活使用各类工具类,类似于导入导出,上传下载,邮件短信,语音视频等常用功能也是非常常见的需求,网上搜索的相关资料也是非常的多,今天就描述一个需求的场景,难度不是太难,只是需要注意的小细节还是挺多的,故借此契机,二狗在此将我个人实现的过程全程记录下来,希望有类似需求的朋友可以参考,但是话说到底,编程这个东西可以看,可以摘录,可以背诵,但是只有自己手敲出来的才是自己的,希望二狗的文章可以帮助更多的朋友把时间花在研究技术原理以及各类底层实现的设计艺术上,而对于业务类的需求,永远千变万化,只需要理解清楚,想顺畅了,就可以动手开干~以上一些个人理解,如有
实现功能:
- 每周二上午10点,以当天时间为参照时间节点,到当天之前的一周内的这个时间段,把后台的律师信息表中的律师信息,进行汇总,然后通过excel附件的形式,使用阿里邮箱发送到市场运营人员的邮箱;
需求分析:
- 每周二上午10点–定时任务解决(需要注意线上多台服务器跑批,执行定时任务需要添加分布锁,避免重复跑批)
- 时间段为:(当天-当天前一周]
- 通过Excel 附件形式,考虑使用POI生成Excel模板文件,后端读取数据进行填充
- 使用阿里邮箱,需要准备好连接邮箱的Host,端口,协议等参数,数据上准备好收件人邮箱账号+发件人邮箱账号,密码
项目技术架构选型描述
- 本项目使用的是Springboot框架,一些固定参数,比如邮箱的Host,端口,协议等参数,数据上准备好收件人邮箱账号发件人邮箱账号,密码等均参数化的配置在boot框架的yml配置文件中
- 定时任务使用注解@Scheduled(cron="")方式进行跑批,当然启动类Application类需要添加@EnableScheduling 注解以便于执行定是脚本,在此不再赘述,因为不是本文探讨的重点;
- 本本文描述的代码基于Idea+ jdk1.8+ 数据库mysql+ Mybatis+ Gradle导包+ Redis缓存
代码过程展示
1、build.gradle 文件 的dependencies { }中先导包,如果你使用的是Maven原理也是一样,可以去 Maven中央仓库搜索你想要的包的版本的Maven写法,在此就不再赘述
//poi
implementation('org.apache.poi:poi:3.16')
implementation('org.apache.poi:poi-ooxml:3.14')
implementation('org.apache.poi:poi-scratchpad:3.15')
//email
implementation('org.springframework:spring-context-support')
implementation('javax.mail:javax.mail-api:1.5.1')
implementation('com.sun.mail:javax.mail:1.5.4')
2、yml文件内配置邮箱相关参数
email:
host: smtpdm.aliyun.com
port: 80
senderMail: autoAdmin@wahaha.cn
senderPassword: Wahaha2019
sendTo: autoMarketOne@wahahatech.com,autoMarketSecond@wahahatech.com
3、律师信息实体类–使用的Lombok插件通过@Data生成setter 和getter
@Data
public class LawyerAuthenticate {
/**
* 主键
* */
private Long id;
/**
* 律师姓名
* */
private String lawName;
/**
* 所属律所
* */
private String lawFirm;
/**
* 律师手机号
* */
private String phone;
/**
* 律师常用邮箱
* */
private String mail;
/**
* 律师执业证号
* */
private String licenseNumber;
/**
* 律师执业证照片名字
* */
private String licenseName;
/**
* 律师执业证照片url
* */
private String licenseUrl;
/**
* 身份证照片名字
* */
private String idcardName;
/**
* 身份证照片url
* */
private String idcardUrl;
/**
* 创建日期
* */
private Date createDate;
/**
* 起始时间--不存库
* */
private Date startTime;
/**
* 截止时间--不存库
* */
private Date endTime;
}
4、日期工具类–在本功能内仅仅用到了:nextDay(int num) 这个方法&#x