外卖项目02---员工管理业务开发

本文详细介绍了如何在SpringMVC应用中实现登录功能的过滤器,包括创建自定义过滤器LoginCheckFilter,处理未登录的请求,以及在启动类中添加注解。此外,还涵盖了新增员工页面的设计,包括需求分析、程序执行流程、异常处理和功能测试。同时,讲解了员工信息分页查询的实现,从需求分析到代码开发,以及功能测试。最后讨论了启用/禁用员工账号的逻辑和全局异常处理器的编写。
摘要由CSDN通过智能技术生成

目录

一、完善登陆功能 16

1.1问题分析

1.2代码实现 16

1.3完善登陆功能—代码开发 17(完善过滤器处理逻辑)

1.4完善登陆功能---功能测试 18

二、新增员工页面设计 19

2.1需求分析

2.2新增员工---梳理程序执行流程(代码开发) 20

2.3新增员工---编写全局异常处理器(全局异常捕获解决异常 ) 22

2.4新增员工---小结 24

三、员工信息分页查询 

3.1需求分析 25

3.2员工信息分页查询---梳理程序执行过程 26

3.3员工信息分页查询---代码开发 27

3.4员工信息分页查询---代码开发2 28

3.5员工信息分页查询---功能测试 29

四、启用/禁用员工账号 31

4.1需求分析 31

4.2启用、禁用员工账号---分析页面按钮动态效果 32 

4.3启用、禁用员工账号---分析页面ajax请求发送过程 33

4.4启用、禁用员工账号---代码开发和功能测试 34 ​编辑

4.5启用、禁用员工账号---代码修复配置消息转换器 35

五、编辑员工信息 

5.1需求分析 37

5.2编辑员工信息---页面效果分析和代码开发 38


一、完善登陆功能 16

1.1问题分析

 

注:使用Web组件过滤器。SpringMVC中的拦截器。

1.2代码实现 16

步骤一:创建自定义过滤器LoginCheckFilter

创建过滤器的的类代码如下:

package com.itheima.reggie.filter;


import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 检查用户是否已经完成登陆
 */
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")//过滤器的名称可以随便命名,
                                                        // 拦截的内容是在urlPatterns中进行设置的。
public class LoginCheckFilter implements Filter {       //因为要实现接口中的方法,所以需要进行接口的实现

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;//进行一个强制性的类型转换
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        log.info("拦截到请求: {}",request.getRequestURI());//{}表示一个占位符,如果替代参数进行占据位置。是后面request.getRequestURI()的内容
        filterChain.doFilter(request,response);
    }
}

步骤二:在启动类中添加注解@ServletComponentScan

1.3完善登陆功能—代码开发 17(完善过滤器处理逻辑)

最后一步如何处理5、未登录则返回未登录结果,实现跳转功能:

然后使用我们公共定义的R类,将code传输为0,则就会实现未登录页面的跳转。

 总体代码展示:

/**
 * 检查用户是否已经完成登陆
 */
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")//过滤器的名称可以随便命名,
                                                        // 拦截的内容是在urlPatterns中进行设置的。
public class LoginCheckFilter implements Filter {       //因为要实现接口中的方法,所以需要进行接口的实现

    //路径URL匹配器。支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();//目的是路径进行匹配
                                        // 使得/backend/index.html和/backend/**的路径信息能够匹配上
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;//进行一个强制性的类型转换
        HttpServletResponse response = (HttpServletResponse) servletResponse;
//        log.info("拦截到请求: {}",request.getRequestURI());//{}表示一个占位符,如果替代参数进行占据位置。是后面request.getRequestURI()的内容
//        filterChain.doFilter(request,response);

        //1、获取本次请求的URI
        String requestURI = request.getRequestURI();

        //定义不需要处理的请求路径
        String[] urls = new String[]{
                "/employee/login",//登陆界面的URL
                "/employee/logout",//登陆退出界面的URL
                "/backend/**",//静态地址中的信息
                "/front/**"//同样也是静态信息的URL
        };

        //2、判断本次请求去是否需要处理
        boolean check = check(urls,requestURI);

        //3、如果不需要处理,则直接放行
        if(check){
            filterChain.doFilter(request,response);
            return;
        }
        //4、判断登陆状态:如果已经登陆,则放行
        //判断是否已经登陆,使用Session判断这个里面的是否存在字符,如果登陆成功的话会有员工的ID,不为null。
        if (request.getSession().getAttribute("employee") != null){
            filterChain.doFilter(request,response);
            return;
        }
        //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));//将数据写回客户端
        return;

    }

    /**
     * 路径匹配,检查本次请求是否需要放行
     * @param urls
     * @param requestURL
     * @return
     */
    public boolean check (String[] urls,String requestURL){//urls:是前面定义不需要处理的请求路径 requestURL:自己获取的URL
                                    //对路径信息进行比较
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURL);
            if(match){
                return true;
            }
        }
        return false;
    }
}

1.4完善登陆功能---功能测试 18

也可以直接使用登陆界面的F12进行查看。

 点击进行下一步的处理。

二、新增员工页面设计 19

2.1需求分析

2.2新增员工---梳理程序执行流程(代码开发) 20

目的实现:将在web上添加的数据能够传输到数据库中,并进行保存。

报状态码404的原因:

是因为后台没有写controller,来处理这个请求。

处理前端和后端的解决思路:(根据前端写后端的程序):

首先进入到响应的需要实现的功能下面,然后在该界面下按F12查看页面的数据信息。

第一步:看发送请求的地址是哪里

第二步:看发送请求的数据格式是什么

 注:本文的这个是json格式的

 

2.3新增员工---编写全局异常处理器(全局异常捕获解决异常 ) 22

该部分主要解决,如果在后台数据新增员工信息,员工的信息重复,怎么办。即解决除了成功保存员工信息外的异常情况。

注:上面有两种解决异常的方法:

方法1:解决的问题有限,不建议使用。

方法2:全局异常捕获 

实现全局异常捕获步骤:能大家公用

步骤一:创建全局异常的类

代码:

package com.itheima.reggie.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理
 */

@ControllerAdvice(annotations = {RestController.class, Controller.class})//拦截添加某一类注解的类    比如所EmployeeController类中注解@RestController
@Slf4j
@ResponseBody
public class GlobalExceptionHandleer {


    /**
     * 异常处理方法
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){

        log.error(ex.getMessage());

        if(ex.getMessage().contains("Duplicate entry")){
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在";
            return R.error(msg);
        }


        return R.error("未知错误!");
    }
}

步骤二:在controller中添加新增员工操作方法

    /**
     * 新增员工
     * @param employee
     * @return
     */
    @PostMapping
    public R<String> save(HttpServletRequest request,@RequestBody Employee employee){
        log.info("新增员工,员工信息{}",employee.toString());
        //设置初始密码123456,需要进行md5加密处理
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));

        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());

        //获得当前登陆用户id
        Long empId = (Long) request.getSession().getAttribute("employee");

        employee.setCreateUser(empId);
        employee.setUpdateUser(empId);

        employeeService.save(employee);
        return R.success("新增员工成功");
    }

2.4新增员工---小结 24

 分析数据的流转过程和数据格式:

三、员工信息分页查询 

3.1需求分析 25

 需求分析:分页条和系统查询的两个功能

3.2员工信息分页查询---梳理程序执行过程 26

问题描述:

3.3员工信息分页查询---代码开发 27

其中分页查询会需要使用mybatisplus里面的插件来协助完成 分页查询这个功能。

代码部分:(员工信息分页查询的基本代码框架)

    /**
     * 员工信息分页查询
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize,String name){//为什么使用Page这个类,因为在前端获取分页的数据中含有toal和records数据
                            // Page类中有所以泛型用page
        log.info("page = {},pageSize = {},name = {}",page,pageSize,name);
        return null;
    }

3.4员工信息分页查询---代码开发2 28

分页查询代码开发的扩展处理。

    /**
     * 员工信息分页查询
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize,String name){//为什么使用Page这个类,因为在前端获取分页的数据中含有total和records数据
                            // Page类中有所以泛型用page
        log.info("page = {},pageSize = {},name = {}",page,pageSize,name);

        //构造分页构造器
        Page pageInfo = new Page(page,pageSize);

        //构造条件构造器
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();

        //添加过滤条件,name不为空才会添加这条内容
        queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);//StringUtils.isNotEmpty(name):
                                                                        // 如果name的字段不为null,则会进行后面的内容
                                                                //Employee::getName根据name字段在Employee类中进行查询。
                                                                //name:查询的内容进行查找
        //添加排序条件
        queryWrapper.orderByDesc(Employee::getUpdateTime);

        //执行查询
        employeeService.page(pageInfo,queryWrapper);//这步会在page中自动封装,然后会分解成memberlist中需要total和records数据
        return R.success(pageInfo);
    }

3.5员工信息分页查询---功能测试 29

使用debug进行程序的测试处理。

四、启用/禁用员工账号 31

4.1需求分析 31

 

4.2启用、禁用员工账号---分析页面按钮动态效果 32 

4.3启用、禁用员工账号---分析页面ajax请求发送过程 33

4.4启用、禁用员工账号---代码开发和功能测试 34 

 

 

 

4.5启用、禁用员工账号---代码修复配置消息转换器 35

 

使用这个类可以将json数据格式转换为java格式。 避免精度丢失问题。

五、编辑员工信息 

5.1需求分析 37

 

5.2编辑员工信息---页面效果分析和代码开发 38

本部分的代码:

    /**
     *根据id查询员工信息
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable Long id){
        log.info("根据id查询员工信息");
        Employee employee = employeeService.getById(id);
        if(employee != null){
            return R.success(employee);
        }
        return R.error("没有查询到对应员工信息");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值