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


    目录

    一、完善登陆功能 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

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

    1. package com.itheima.reggie.filter;
    2. import lombok.extern.slf4j.Slf4j;
    3. import javax.servlet.*;
    4. import javax.servlet.annotation.WebFilter;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. /**
    9. * 检查用户是否已经完成登陆
    10. */
    11. @Slf4j
    12. @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")//过滤器的名称可以随便命名,
    13. // 拦截的内容是在urlPatterns中进行设置的。
    14. public class LoginCheckFilter implements Filter { //因为要实现接口中的方法,所以需要进行接口的实现
    15. @Override
    16. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    17. HttpServletRequest request = (HttpServletRequest) servletRequest;//进行一个强制性的类型转换
    18. HttpServletResponse response = (HttpServletResponse) servletResponse;
    19. log.info("拦截到请求: {}",request.getRequestURI());//{}表示一个占位符,如果替代参数进行占据位置。是后面request.getRequestURI()的内容
    20. filterChain.doFilter(request,response);
    21. }
    22. }

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

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

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

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

     总体代码展示:

    1. /**
    2. * 检查用户是否已经完成登陆
    3. */
    4. @Slf4j
    5. @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")//过滤器的名称可以随便命名,
    6. // 拦截的内容是在urlPatterns中进行设置的。
    7. public class LoginCheckFilter implements Filter { //因为要实现接口中的方法,所以需要进行接口的实现
    8. //路径URL匹配器。支持通配符
    9. public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();//目的是路径进行匹配
    10. // 使得/backend/index.html和/backend/**的路径信息能够匹配上
    11. @Override
    12. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    13. HttpServletRequest request = (HttpServletRequest) servletRequest;//进行一个强制性的类型转换
    14. HttpServletResponse response = (HttpServletResponse) servletResponse;
    15. // log.info("拦截到请求: {}",request.getRequestURI());//{}表示一个占位符,如果替代参数进行占据位置。是后面request.getRequestURI()的内容
    16. // filterChain.doFilter(request,response);
    17. //1、获取本次请求的URI
    18. String requestURI = request.getRequestURI();
    19. //定义不需要处理的请求路径
    20. String[] urls = new String[]{
    21. "/employee/login",//登陆界面的URL
    22. "/employee/logout",//登陆退出界面的URL
    23. "/backend/**",//静态地址中的信息
    24. "/front/**"//同样也是静态信息的URL
    25. };
    26. //2、判断本次请求去是否需要处理
    27. boolean check = check(urls,requestURI);
    28. //3、如果不需要处理,则直接放行
    29. if(check){
    30. filterChain.doFilter(request,response);
    31. return;
    32. }
    33. //4、判断登陆状态:如果已经登陆,则放行
    34. //判断是否已经登陆,使用Session判断这个里面的是否存在字符,如果登陆成功的话会有员工的ID,不为null。
    35. if (request.getSession().getAttribute("employee") != null){
    36. filterChain.doFilter(request,response);
    37. return;
    38. }
    39. //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
    40. response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));//将数据写回客户端
    41. return;
    42. }
    43. /**
    44. * 路径匹配,检查本次请求是否需要放行
    45. * @param urls
    46. * @param requestURL
    47. * @return
    48. */
    49. public boolean check (String[] urls,String requestURL){//urls:是前面定义不需要处理的请求路径 requestURL:自己获取的URL
    50. //对路径信息进行比较
    51. for (String url : urls) {
    52. boolean match = PATH_MATCHER.match(url, requestURL);
    53. if(match){
    54. return true;
    55. }
    56. }
    57. return false;
    58. }
    59. }

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

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

     点击进行下一步的处理。

    二、新增员工页面设计 19

    2.1需求分析

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

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

    报状态码404的原因:

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

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

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

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

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

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

     

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

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

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

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

    方法2:全局异常捕获 

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

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

    代码:

    1. package com.itheima.reggie.common;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.ControllerAdvice;
    5. import org.springframework.web.bind.annotation.ExceptionHandler;
    6. import org.springframework.web.bind.annotation.ResponseBody;
    7. import org.springframework.web.bind.annotation.RestController;
    8. import java.sql.SQLIntegrityConstraintViolationException;
    9. /**
    10. * 全局异常处理
    11. */
    12. @ControllerAdvice(annotations = {RestController.class, Controller.class})//拦截添加某一类注解的类 比如所EmployeeController类中注解@RestController
    13. @Slf4j
    14. @ResponseBody
    15. public class GlobalExceptionHandleer {
    16. /**
    17. * 异常处理方法
    18. * @return
    19. */
    20. @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    21. public R exceptionHandler(SQLIntegrityConstraintViolationException ex){
    22. log.error(ex.getMessage());
    23. if(ex.getMessage().contains("Duplicate entry")){
    24. String[] split = ex.getMessage().split(" ");
    25. String msg = split[2] + "已存在";
    26. return R.error(msg);
    27. }
    28. return R.error("未知错误!");
    29. }
    30. }

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

    1. /**
    2. * 新增员工
    3. * @param employee
    4. * @return
    5. */
    6. @PostMapping
    7. public R save(HttpServletRequest request,@RequestBody Employee employee){
    8. log.info("新增员工,员工信息{}",employee.toString());
    9. //设置初始密码123456,需要进行md5加密处理
    10. employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
    11. employee.setCreateTime(LocalDateTime.now());
    12. employee.setUpdateTime(LocalDateTime.now());
    13. //获得当前登陆用户id
    14. Long empId = (Long) request.getSession().getAttribute("employee");
    15. employee.setCreateUser(empId);
    16. employee.setUpdateUser(empId);
    17. employeeService.save(employee);
    18. return R.success("新增员工成功");
    19. }

    2.4新增员工---小结 24

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

    三、员工信息分页查询 

    3.1需求分析 25

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

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

    问题描述:

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

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

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

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

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

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

    1. /**
    2. * 员工信息分页查询
    3. * @param page
    4. * @param pageSize
    5. * @param name
    6. * @return
    7. */
    8. @GetMapping("/page")
    9. public R page(int page,int pageSize,String name){//为什么使用Page这个类,因为在前端获取分页的数据中含有total和records数据
    10. // Page类中有所以泛型用page
    11. log.info("page = {},pageSize = {},name = {}",page,pageSize,name);
    12. //构造分页构造器
    13. Page pageInfo = new Page(page,pageSize);
    14. //构造条件构造器
    15. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
    16. //添加过滤条件,name不为空才会添加这条内容
    17. queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);//StringUtils.isNotEmpty(name):
    18. // 如果name的字段不为null,则会进行后面的内容
    19. //Employee::getName根据name字段在Employee类中进行查询。
    20. //name:查询的内容进行查找
    21. //添加排序条件
    22. queryWrapper.orderByDesc(Employee::getUpdateTime);
    23. //执行查询
    24. employeeService.page(pageInfo,queryWrapper);//这步会在page中自动封装,然后会分解成memberlist中需要total和records数据
    25. return R.success(pageInfo);
    26. }

    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

    本部分的代码:

    1. /**
    2. *根据id查询员工信息
    3. * @param id
    4. * @return
    5. */
    6. @GetMapping("/{id}")
    7. public R getById(@PathVariable Long id){
    8. log.info("根据id查询员工信息");
    9. Employee employee = employeeService.getById(id);
    10. if(employee != null){
    11. return R.success(employee);
    12. }
    13. return R.error("没有查询到对应员工信息");
    14. }

  • 相关阅读:
    Nacos注册中心
    springcloud alibaba 整合seata的TCC
    Linux 网络选项 setsockopt 设置
    第二章 Scala变量和数据类型
    【Linux】Docker部署sock shop
    台式电脑连不上wifi怎么办
    【AGC】增长服务2-应用内消息示例
    Plink常见命令 --bfile --freq--recode --make-bed
    Mybatis的类型转换注册类TypeHandlerRegistry
    JVM 的主要组成部分及其作用
  • 原文地址:https://blog.csdn.net/xiaoxixicc/article/details/127823138