项目使用的是spring+mybatis+mysql
项目包括了
1.登录
2.验证码
3.上传(只是上传到了本地服务器)
4.导出
1登录用的验证码是 kaptcha
<!-- 验证码-->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
完整代码 先是生成验证码然后存到session里
package com.skypegmwcn.zhxy.skypegmwcn.controller;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.skypegmwcn.zhxy.skypegmwcn.entity.Login;
import com.skypegmwcn.zhxy.skypegmwcn.service.LoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
@RestController
@AllArgsConstructor
@RequestMapping("/login" )
@Api(value = "login", tags = "用户登录")
public class LoginController {
private LoginService loginService;
@Autowired
DefaultKaptcha defaultKaptcha;
//获取验证码
@ApiOperation(value = "查询验证码", notes = "查询验证码")
@GetMapping("/defaultKaptcha")
public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{
byte[] captchaChallengeAsJpeg = null;
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
//生产验证码字符串并保存到session中
String createText = defaultKaptcha.createText();
httpServletRequest.getSession().setAttribute("vrifyCode", createText);
//使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中
BufferedImage challenge = defaultKaptcha.createImage(createText);
ImageIO.write(challenge, "jpg", jpegOutputStream);
} catch (IllegalArgumentException e) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
//定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
httpServletResponse.setHeader("Cache-Control", "no-store");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
httpServletResponse.setContentType("image/jpeg");
ServletOutputStream responseOutputStream =
httpServletResponse.getOutputStream();
responseOutputStream.write(captchaChallengeAsJpeg);
responseOutputStream.flush();
responseOutputStream.close();
}
/***
* 验证登录信息
* @param login
* @param login
* @return
*/
@ApiOperation(value = "登录验证", notes = "登录验证")
@PutMapping("/imgvrifyControllerDefaultKaptcha")
public boolean imgvrifyControllerDefaultKaptcha(HttpServletRequest httpServletRequest,Login login){
String captchaId = (String) httpServletRequest.getSession().getAttribute("vrifyCode");
String parameter = login.getCode();
if (!captchaId.equals(parameter)) {
return false;
} else {
return loginService.login(login);
}
}
}
loginService.login方法 这里登录密码用的是spring-security-crypto加密模块
<!-- 加密模块-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
但是要验证密码的时候需要注意一点,就是需要用自带的方法 ENCODER.matches第一个参数为前端穿过来的密码 比方123原始数据 然后第二个参数为加密过后从数据库中查出来的数据
private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
/***
* 验证登录信息
* @param login
* @return
*/
public Boolean login(Login login){
Admin admin = adminMapper.getAdmin();
if (!ENCODER.matches(login.getPassWord(),admin.getPassWord()) || !login.getUserName().equals(admin.getUserName())){
return false;
} else {
return true;
}
}
上传文件FileController.java
package com.skypegmwcn.zhxy.skypegmwcn.controller;
import com.skypegmwcn.zhxy.skypegmwcn.entity.File;
import com.skypegmwcn.zhxy.skypegmwcn.service.FileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import java.util.Iterator;
@RestController
@AllArgsConstructor
@RequestMapping("/file" )
@Api(value = "file", tags = "上传文件")
public class FileController{
private FileService fileService;
/***
* 上传文件
* @param file
* @param request
* @return
* @throws Exception
*/
@ApiOperation(value = "上传文件", notes = "上传文件")
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
@ResponseBody
public File uploadFile(MultipartFile file,
HttpServletRequest request) throws Exception {
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession()
.getServletContext());
commonsMultipartResolver.setDefaultEncoding("utf-8");
File files = new File();
// 判断是否有文件上传
if (commonsMultipartResolver.isMultipart(request)) {//有文件上传
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
Iterator iter = multiRequest.getFileNames();
while (iter.hasNext()) {
MultipartFile imageFile = multiRequest.getFile(iter.next().toString());//(String) iter.next()
//文件保存方法,其中参数imageFile为文件路径,file文件实体
files = fileService.addFile(request, imageFile, file);
}
}
return files;
}
}
FileService.java
package com.skypegmwcn.zhxy.skypegmwcn.service;
import com.skypegmwcn.zhxy.skypegmwcn.entity.File;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
public interface FileService {
File addFile(HttpServletRequest request, MultipartFile imageFile, MultipartFile file);
}
FileServiceImpl.java
package com.skypegmwcn.zhxy.skypegmwcn.service.impl;
import com.skypegmwcn.zhxy.skypegmwcn.entity.File;
import com.skypegmwcn.zhxy.skypegmwcn.service.FileService;
import lombok.AllArgsConstructor;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
@Service
@AllArgsConstructor
public class FileServicelmpl implements FileService {
private ConfigurableApplicationContext applicationContext;
@Transactional
public File addFile(HttpServletRequest request, MultipartFile imageFile, MultipartFile file) {
File files = new File();
try {
SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd");
String filePath = applicationContext.getEnvironment().getProperty("file.uploadFolder")+date.format(new Date());
java.io.File file2 = new java.io.File(filePath);
if (!file2.exists()) {
file2.mkdirs();
}
String name=imageFile.getOriginalFilename().substring(imageFile.getOriginalFilename().lastIndexOf("."));
Random rand = new Random();
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
String time = df.format(new Date());
int randnum1 = rand.nextInt(900)+100;
time=time.concat(String.valueOf(randnum1));
int randnum2 = rand.nextInt(90)+10;
time=time.concat(String.valueOf(randnum2));
String newName = time+name;
String path=filePath+ java.io.File.separator+newName;
java.io.File file1= new java.io.File(path);
if(file1.exists()){
file1.delete();
}
imageFile.transferTo(file1);
files.setFilepath(filePath+ '/'+newName);文件路径
} catch (Exception e) {
e.printStackTrace();
}
return files;
}
}
#静态资源对外暴露的访问路径
file.staticAccessPath=/images/**
#文件上传目录(注意Linux和Windows上的目录结构不同)
#file.uploadFolder=/root/uploadFiles/
file.uploadFolder=F://uploadFiles/
这样一个上传图片就完成了,我是用的年月日去生成的文件夹,然后上传文件的地址是在外层配置文件中配置的
导出excel文件,我这里使用的前端传递id字符串的形式批量导出,因为页面可以自行选择导出的数据
引入
<dependency>
<groupId>io.github.magic-core</groupId>
<artifactId>excel-boot</artifactId>
<version>2.0</version>
</dependency>
controller
/***
* 信息登记表导出
* @param httpServletResponse
*/
@ApiOperation("信息登记表导出")
@PostMapping(value = "/exportExcel", produces="application/octet-stream")
public void exportExcel(@RequestParam String ids,HttpServletResponse httpServletResponse) {
registerService.exportExcel(ids,httpServletResponse);
}
service
package com.skypegmwcn.zhxy.skypegmwcn.service;
import javax.servlet.http.HttpServletResponse;
public interface RegisterService {
/***
* 导出表格
* @param ids
* @param httpServletResponse
* @return
*/
void exportExcel(String ids,HttpServletResponse httpServletResponse);
}
Impl 实现层
package com.skypegmwcn.zhxy.skypegmwcn.service.impl;
import com.excel.poi.ExcelBoot;
import com.excel.poi.function.ExportFunction;
import com.skypegmwcn.zhxy.skypegmwcn.entity.RegisterExcel;
import com.skypegmwcn.zhxy.skypegmwcn.mapper.RegisterMapper;
import com.skypegmwcn.zhxy.skypegmwcn.service.RegisterService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@Service
@AllArgsConstructor
public class RegisterServicelmpl implements RegisterService {
private final RegisterMapper registerMapper;
/***
* 导出表格
* @param ids
* @param httpServletResponse
* @return
*/
@Override
public void exportExcel(String ids,HttpServletResponse httpServletResponse){
try {
ExcelBoot.ExportBuilder(httpServletResponse, "Register", RegisterExcel.class).
exportResponse(null, new ExportFunction<RegisterExcel, RegisterExcel>() {
@Override
public List<RegisterExcel> pageQuery(RegisterExcel registerExcel, int pageNum, int pageSize) {
String[] split = ids.split(",");
ArrayList<Integer> list = new ArrayList<>();
for (String sp : split) {
int i = Integer.parseInt(sp);
list.add(i);
}
System.out.println("-----------"+list);
List<RegisterExcel> registerExcelList = registerMapper.findRegisterListByIds(list);
System.out.println("+++++++"+registerExcelList);
return registerExcelList;
}
@Override
public RegisterExcel convert(RegisterExcel registerExcel) {
return registerExcel;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
这个一直很顺利,但是有一个坑还是swagger 留下的就是导出的excel一直打不开,提示文件损坏,开始以为是代码的问题,debug找了好久发现没有什么问题,后来突然想到会不会是下载文件的时候出现的问题,然后。。。
最开始传参时 controller 中请求头是这个么写的produces = “application/json”
后来改成了现在的produces=“application/octet-stream”
嗯就打开了。。。