邮箱
以QQ邮箱为例:(实际以自己的业务需求为准)
> 1.登录QQ邮箱获取到授权码
设置 - 账户
> 2.在项目中导入email依赖
<!--对邮件的支持jar-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
> 3.在yml中配置邮箱
spring:
mail:
host: smtp.qq.com # 设置邮箱主机(服务商),这里使用QQ邮件服务器
username: (发件人邮箱) # 设置用户名 - 发送方
password: ******** # 设置密码,该处的密码是QQ邮箱开启SMTP的授权码而非QQ密码
properties:
mail:
smtp:
auth: true # 必须进行授权认证,它的目的就是阻止他人任意乱发邮件
starttls: #SMTP加密方式:连接到一个TLS保护连接
enable: true
required: true
> 4.邮件工具类
public class EmailUtil {
private static final String FROM = "*********@qq.com";
private static final JavaMailSender javaMailSender = SpringUtil.getBean(JavaMailSender.class);
private EmailUtil() {
}
public static MimeMessageHelper getHelper(){
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
helper.setFrom(FROM);
return helper;
} catch (MessagingException e) {
throw new GlobalException(GlobalExceptionEnum.ERROR);
}
}
public static void send(MimeMessageHelper helper) {
javaMailSender.send(helper.getMimeMessage());
}
}
> 5.发送邮件
// 发邮件
MimeMessageHelper helper = EmailUtil.getHelper();
helper.setTo(employee.getEmail());
helper.setSubject("*******");
helper.setText("<h1>*********************</h1><a href='#'>点击该链接</a>", true);
// 发送邮件
EmailUtil.send(helper);
短信
以有免费使用次数的中国网建为例:(实际以自己的业务需求为准)
> 1.去中国网建注册帐号
> 2.设置签名
> 3.获取密钥
> 4.拷贝依赖到项目中
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
> 5.短信工具类
public class SendMsgUtil {
public static void sendMsg(String phone,String text){
try {
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("https://utf8api.smschinese.cn/");
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//在头文件中设置转码
NameValuePair[] data ={ new NameValuePair("Uid", "****"),new NameValuePair("Key", "密钥"),new NameValuePair("smsMob",phone),new NameValuePair("smsText",text)};
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println("statusCode:"+statusCode); //HTTP状态码
for(Header h : headers){
System.out.println(h.toString());
}
String result = new String(post.getResponseBodyAsString().getBytes("utf-8"));
System.out.println(result); //打印返回消息状态
post.releaseConnection();
} catch (IOException e) {
throw new GlobalException(GlobalExceptionEnum.MESSAGE_SEND_ERROR);
}
}
}
> 6.使用
// text为信息内容
SendMessageUtil.sendMsg(text);
EasyPOI
可以导入导出的东西
1.word 2.excel 3.ppt 4.pdf 等等
EasyPoi是基于Poi封装的操作文件的框架,操作非常简单,由工具类和注解组成
> 1.导入依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.2.0</version>
</dependency>
> 2.工具类
public class ExcelUtils{
/**
* 导出工具类
* @param list
* @param title
* @param sheetName
* @param pojoClass
* @param fileName
* @param isCreateHeader
* @param response
*/
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,
String fileName, boolean isCreateHeader, HttpServletResponse response){
ExportParams exportParams = new ExportParams(title, sheetName);
exportParams.setCreateHeadRows(isCreateHeader);
defaultExport(list, pojoClass, fileName, response, exportParams);
}
/**
* 导出工具类
* @param list
* @param title
* @param sheetName
* @param pojoClass
* @param fileName
* @param response
*/
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName,
HttpServletResponse response){
defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
}
public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){
defaultExport(list, fileName, response);
}
private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName,
HttpServletResponse response, ExportParams exportParams) {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list);
if (workbook != null); downLoadExcel(fileName, response, workbook);
}
private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
try {
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
workbook.write(response.getOutputStream());
} catch (IOException e) {
//throw new NormalException(e.getMessage());
}
}
private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
if (workbook != null);
downLoadExcel(fileName, response, workbook);
}
public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){
if (StringUtils.isBlank(filePath)){
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
List<T> list = null;
try {
list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
}catch (NoSuchElementException e){
//throw new NormalException("模板不能为空");
} catch (Exception e) {
e.printStackTrace();
//throw new NormalException(e.getMessage());
} return list;
}
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){
if (file == null){ return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
List<T> list = null;
try {
list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
}catch (NoSuchElementException e){
// throw new NormalException("excel文件不能为空");
} catch (Exception e) {
//throw new NormalException(e.getMessage());
System.out.println(e.getMessage());
}
return list;
}
}
> 3.编写导入导出接口 以店铺信息为例子
@GetMapping("/export")
public void export( HttpServletResponse response){
List<Shop> shops = shopService.selectAll();
//调用工具类导出excel
//(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, Boolean isCreateHeader,HttpServletResponse response)
//导出的数据 标题 sheetName页名称 导出的类型 文件名 是否创建头 响应对象
//文件名如果不写后缀默认是xls,可以写上xlsx就是指定的xlsx类型
ExcelUtils.exportExcel(shops, "店铺信息", "店铺数据", Shop.class, "shop.xlsx",true, response);
}
/**
* 文件上传 导入
* @return
*
* MultipartFile:复杂文件对象,专门用来接收文件的对象
* RESTFUL风格要接收复杂文件对象要加上一个注解:@RequestPart
*/
@PostMapping("/importExcel")
public void importExcel(@RequestPart("file") MultipartFile file){
//String file = "F:\\文件名.xls";
//解析excel,MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass
// 文件对象 忽略标题行数 护理表头行数 生成的对象类型
List<Shop> shops = ExcelUtils.importExcel(file,1,1,Shop.class);
//保存到数据库中[提示:动态sql 批量插入]
shopService.batchAdd(shops);
}
> 4.前端准备按钮
<el-form-item>
<!--v-perm="'menu:save'"-->
<el-button type="primary" @click="exportShop">导出</el-button>
</el-form-item>
<el-form-item>
<!-- 默认name="file" -->
<el-upload class="upload-demo"
action="http://localhost:8080/shop/importExcel"
list-type="text">
<el-button type="warning">点击导入</el-button>
</el-upload>
</el-form-item>
> 5.实体类上加注解 以店铺信息实体类为例
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Shop extends BaseDomain {
// 店铺名称
@NotBlank(message = "请输入店铺名称")
@Excel(name = "店铺名称",orderNum = "1",width = 30)
private String name;
// 店铺座机
@NotBlank(message = "请输入店铺座机号")
@Pattern(regexp = "[0-9]*", message = "请输入正确的座机号")
@Excel(name = "店铺电话",orderNum = "2",width = 50)
private String tel;
// 入驻时间
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT + 8")
@Excel(name = "入驻时间",orderNum = "3",width = 50,exportFormat="yyyy-MM-dd")
private Date registerTime = new Date();
// 店铺状态
//店铺状态:待审核【1】 ,审核通过,待激活【2】,激活成功【3】,审核失败->驳回【4】
@Excel(name = "店铺状态",orderNum = "4",width = 20, replace = {"待审核_1","待激活_2","激活成功_3","驳回_4",})
private Integer state;
// 店铺地址
@Excel(name = "店铺地址",orderNum = "5",width = 50)
@NotBlank(message = "请输入店铺地址")
private String address;
// 店铺logo
private String logo;
// 店铺管理员id
private Long adminId;
// 管理员对象
private Employee employee;
}
Echarts
1.什么是Echarts:
就是一个根据数据生成图形报表的工具,在企业中通常用来展示数据,便于快速分析以及报告
> 2.使用 以店铺信息为例
> 1.去echarts官网找到你要使用的图形,此处以柱状图为例
> 2.HTML代码和JS代码
drawColumnChart() {
this.$http.get("/echarts/column").then(res => {
let columns = res.data;
this.chartColumn = echarts.init(document.getElementById('chartColumn'));
//将状态的1234 - 转成待审核,待激活,激活成功,驳回
for (let i = 0; i < columns.ydata.length; i++) {
if (columns.ydata[i] == 1) {
columns.ydata.splice(i, 1, "待审核"); //替换 i表示下标 1 表示从下标往后替换多少个
}
if (columns.ydata[i] == 2) {
columns.ydata.splice(i, 1, "待激活");
}
if (columns.ydata[i] == 3) {
columns.ydata.splice(i, 1, "激活成功");
}
if (columns.ydata[i] == 4) {
columns.ydata.splice(i, 1, "驳回");
}
}
this.chartColumn.setOption({
title: {text: '店铺状态比例'},
tooltip: {},
xAxis: {
data: columns.ydata
},
yAxis: {},
series: [{
name: '个数',
type: 'bar',
data: columns.xdata
}]
});
}).catch(res => {
})
},
> 3.页面加载的时候发送请求,把数据填充到JS中,此处要注意图形的JS代码一定要在获取数据的Axios请求的.then回调中执行
Controller层:
@GetMapping("/column")
public ShopColumnVo column() {
return shopService.getColumn();
}
Service层:
/**
* 查询店铺柱状图数据
*/
@Override
public ShopColumnVo getColumn() {
// 1.查询柱状图数据
List<ShopColumnBo> shopColumnBos = shopMapper.getShopColumns();
// 以店铺状态信息为x轴
List<Integer> xData = shopColumnBos.stream().map(ShopColumnBo::getState).collect(Collectors.toList());
// 该状态信息的店铺数量为y轴
List<Integer> yData = shopColumnBos.stream().map(ShopColumnBo::getCount).collect(Collectors.toList());
return new ShopColumnVo(xData, yData);
}
SQL语句:
<!--查询柱状图所需的数据-->
<select id="getShopColumns" resultType="com.ljy.org.domain.bo.ShopColumnBo">
select state,count(state) count
from t_shop group by state;
</select>