• 瑞吉外卖03-新增员工


    瑞吉外卖03-新增员工

    需求分析

    代码实现

    思路分析

    编写新增员工方法 

    全局异常处理

    本次功能代码实现(免费)


    瑞吉外卖03-新增员工

    需求分析

    后台系统中可以管理员工信息,通过新增员工来添加后台系统用户。点击[添加员工]按钮跳转到新增页面,如下:

    当填写完表单信息, 点击"保存"按钮后, 会提交该表单的数据到服务端, 在服务端中需要接受数据, 然后将数据保存至数据库中。  (即在employee表中插入一条数据)

    但是需要注意!employee表中对username字段加入了唯一约束,因为username是员工的登录账号,必须是唯一的。

    如果重复插入,那么系统是会报错的!所以我们要对该异常进行处理!

    代码实现

    思路分析

    A. 在新增员工时, 按钮页面原型中的需求描述, 需要给员工设置初始默认密码 123456, 并对密码进行MD5加密。

    B. 在组装员工信息时, 还需要封装创建时间、修改时间,创建人、修改人信息(从session中获取当前登录用户)。

    编写新增员工方法 

    所在包: com.harmony.reggie.service.impl

    1. @Override
    2. public R save(HttpServletRequest request, Employee employee) {
    3. //设置初始密码123456,需要进行md5加密处理
    4. employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
    5. employee.setCreateTime(LocalDateTime.now());
    6. employee.setUpdateTime(LocalDateTime.now());
    7. //获得当前登录用户的id
    8. Long empId = (Long) request.getSession().getAttribute("employee");
    9. employee.setCreateUser(empId);
    10. employee.setUpdateUser(empId);
    11. employeeMapper.insert(employee);
    12. return R.success("新增员工成功");
    13. }

    全局异常处理

    要想解决上述测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:

    A. 在Controller方法中加入 try...catch 进行异常捕获

    1. try {
    2. employeeMapper.insert(employee);
    3. } catch (Exception e) {
    4. e.printStackTrace();
    5. return R.error("新增员工失败!");
    6. }

    如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在保存其他业务数据时,也需要在Controller方法中加上try...catch进行处理,代码冗余,不通用。

    B. 使用异常处理器进行全局异常捕获

    采用这种方式来实现,我们只需要在项目中定义一个通用的全局异常处理器,就可以解决本项目的所有异常。

    所在包:com.harmony.reggie.filter

    1. /**
    2. * 检查用户是否已经完成登入
    3. *
    4. * @WebServlet : 声明一个自定义的 Servlet
    5. * @WebFilter : 声明一个Servlet 过滤器
    6. * @WebListener : 声明一个类为 Servlet 监听器
    7. */
    8. @WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
    9. @Slf4j
    10. public class LoginCheckFilter implements Filter {
    11. //路径匹配器,支持通配符
    12. public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
    13. @Override
    14. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    15. HttpServletRequest request = (HttpServletRequest) servletRequest;
    16. HttpServletResponse response = (HttpServletResponse) servletResponse;
    17. // 1. 获取本次请求的URI
    18. String requestURL = request.getRequestURI();
    19. log.info("拦截到的请求: {}", requestURL);
    20. // 定义可以放行的资源
    21. String[] urls = new String[]{
    22. "/employee/login",
    23. "/employee/logout",
    24. "/backend/**",
    25. "/front/**"
    26. };
    27. // 2. 判断本次请求, 是否需要登录, 才可以访问
    28. boolean check = check(urls, requestURL);
    29. // 3. 如果不需要,则直接放行
    30. if (check) {
    31. log.info("不需要处理的请求: {}", requestURL);
    32. filterChain.doFilter(request, response);
    33. return;
    34. }
    35. // 4. 判断登录状态,如果已登录,则直接放行
    36. if (request.getSession().getAttribute("employee") != null) {
    37. log.info("用户已登入,用户ID为: {}", request.getSession().getAttribute("employee"));
    38. filterChain.doFilter(request, response);
    39. return;
    40. }
    41. log.info("用户未登入...");
    42. // 5. 如果未登录, 则返回未登录结果,通过输出流的方式向客户端响应数据
    43. response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
    44. }
    45. /**
    46. * 路径匹配,检查本次请求是否需要放行
    47. *
    48. * @param urls
    49. * @param requestURI
    50. * @return
    51. */
    52. public boolean check(String[] urls, String requestURI) {
    53. for (String url : urls) {
    54. // URL匹配
    55. boolean match = PATH_MATCHER.match(url, requestURI);
    56. if (match) {
    57. return true;
    58. }
    59. }
    60. return false;
    61. }
    62. }

    注意使用了@WebFilter注解,在SpringBoot的启动类上面是要有@ServletComponentScan注解的,否则识别不了!

    上述的全局异常处理器上使用了的两个注解 @ControllerAdvice , @ResponseBody , 他们的作用分别为:

    @ControllerAdvice : 指定拦截那些类型的控制器

    @ResponseBody: 将方法的返回值 R 对象转换为json格式的数据, 响应给页面;

    本次功能代码实现(免费)

    注意是在这个分支里面哦!!!

    master是项目的主线,即项目最新的功能点实现情况! 

    可以的话请给个免费的star哦~~~谢谢

    reggie_v3_AddEmployee

    瑞吉外卖: 瑞吉外卖项目完整代码,使用Sprinboot,SSM,MP,MySQL,Redis,Nginx等技术。 - Gitee.comicon-default.png?t=M85Bhttps://gitee.com/Harmony_TL/reggie_take_out/tree/reggie_v3_AddEmployee/

  • 相关阅读:
    k线图精解与实战应用技巧(见位进场)
    2022 极术通讯-《服务器应用场景性能测试方法 虚拟化》解读
    vcruntime140_1.dll是什么东东?vcruntime140_1.dll缺失的8个解决方法
    vscode运行Live Server报错:Windows找不到文件Microsoft Edge
    技术管理进阶——为什么要多总结,如何做总结?
    深入理解Elasticsearch中的Match Phrase查询
    K8S自建LoadBalancer
    柔性电子数字源表测试方案
    C. Building Permutation
    聊聊分布式架构02——Http到Https
  • 原文地址:https://blog.csdn.net/weixin_43715214/article/details/127041385