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

当填写完表单信息, 点击"保存"按钮后, 会提交该表单的数据到服务端, 在服务端中需要接受数据, 然后将数据保存至数据库中。 (即在employee表中插入一条数据)
但是需要注意!employee表中对username字段加入了唯一约束,因为username是员工的登录账号,必须是唯一的。

如果重复插入,那么系统是会报错的!所以我们要对该异常进行处理!
A. 在新增员工时, 按钮页面原型中的需求描述, 需要给员工设置初始默认密码 123456, 并对密码进行MD5加密。
B. 在组装员工信息时, 还需要封装创建时间、修改时间,创建人、修改人信息(从session中获取当前登录用户)。
所在包: com.harmony.reggie.service.impl
- @Override
- public R
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