后台开发pc站 - 入门级

项目使用的是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”
嗯就打开了。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值