瑞吉外卖03-新增员工

瑞吉外卖03-新增员工

需求分析

代码实现

思路分析

编写新增员工方法 

全局异常处理

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


瑞吉外卖03-新增员工

需求分析

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

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

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

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

代码实现

思路分析

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

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

编写新增员工方法 

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

@Override
public R<String> save(HttpServletRequest request, Employee employee) {
    //设置初始密码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);

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

全局异常处理

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

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

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

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

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

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

所在包:com.harmony.reggie.filter

/**
 * 检查用户是否已经完成登入
 *
 * @WebServlet : 声明一个自定义的 Servlet
 * @WebFilter : 声明一个Servlet 过滤器
 * @WebListener : 声明一个类为 Servlet 监听器
 */
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {

    //路径匹配器,支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

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

        log.info("拦截到的请求: {}", requestURL);

        // 定义可以放行的资源
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

        // 2. 判断本次请求, 是否需要登录, 才可以访问
        boolean check = check(urls, requestURL);

        // 3. 如果不需要,则直接放行
        if (check) {
            log.info("不需要处理的请求: {}", requestURL);
            filterChain.doFilter(request, response);
            return;
        }

        // 4. 判断登录状态,如果已登录,则直接放行
        if (request.getSession().getAttribute("employee") != null) {
            log.info("用户已登入,用户ID为: {}", request.getSession().getAttribute("employee"));
            filterChain.doFilter(request, response);
            return;
        }

        log.info("用户未登入...");

        // 5. 如果未登录, 则返回未登录结果,通过输出流的方式向客户端响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
    }

    /**
     * 路径匹配,检查本次请求是否需要放行
     *
     * @param urls
     * @param requestURI
     * @return
     */
    public boolean check(String[] urls, String requestURI) {
        for (String url : urls) {
            // URL匹配
            boolean match = PATH_MATCHER.match(url, requestURI);
            if (match) {
                return true;
            }
        }
        return false;
    }
}

注意使用了@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/

posted @ 2022-09-25 19:22  金鳞踏雨  阅读(29)  评论(0编辑  收藏  举报  来源