瑞吉外卖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