本文章以Employee(员工)实体类为例子
一、实体类
如下例子:
@Data
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String name;
private String password;
private String phone;
private String sex;
private String idNumber;
private Integer status;
@TableField(fill = FieldFill.INSERT)//插入时填充字段
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时填充字段
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
二、数据层(dao)
如下例子:
@Mapper
public interface EmployeeDao extends BaseMapper<Employee> {
}
三、服务层(service)
1.编写EmployeeService接口
public interface EmployeeService extends IService<Employee> {
}
2.编写EmployeeServiceImpl实现类
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeDao, Employee> implements EmployeeService {
}
四、编写controller(业务层)接口
以下实例包括了员工的登录,退出,添加,删除,禁用等接口
@RestController
@RequestMapping("/employee")
@Slf4j
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
//员工登录
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request,@RequestBody Employee employee){
//1.将页面传过来的密码进行MD5加密
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
//2.根据username查询数据库
LambdaQueryWrapper<Employee> lw = new LambdaQueryWrapper<>();
lw.eq(Employee::getUsername,employee.getUsername());
Employee emp = employeeService.getOne(lw);
//3.没有查询到返回登录失败
if(emp==null){
return R.error("登录失败!");
}
//4.密码比对
if(!emp.getPassword().equals(password)){
return R.error("登录失败!");
}
//5.查看员工状态是否禁用,如果禁用返回禁用结果
if(emp.getStatus()==0){
return R.error("账号已禁用!");
}
//6.登录成果,将员工id存储到session中,并返回登录成果结果
request.getSession().setAttribute("employee",emp.getId());
return R.success(emp);
}
@PostMapping("logout")//员工退出
public R<String> logout(HttpServletRequest request){
//清除session中保存的员工id
request.getSession().removeAttribute("employee");
return R.success("退出成功!");
}
@PostMapping//新增员工
public R<String> save(HttpServletRequest request,@RequestBody Employee employee){
System.out.println(employee.toString());
//设置初始密码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);
employeeService.save(employee);
return R.success("新增员工成功!");
}
@GetMapping("/page")//分页查询
public R<Page> page(int page,int pageSize,String name){
//构造分页构造器
Page p1 = new Page(page,pageSize);
//条件构造器
LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper();
//添加过滤条件
lqw.like(name!=null,Employee::getName,name);
//添加排序条件
lqw.orderByDesc(Employee::getUpdateTime);
//执行查询
employeeService.page(p1,lqw);
return R.success(p1);
}
@PutMapping//根据id修改员工信息
public R<String> update(HttpServletRequest request,@RequestBody Employee employee){
//这里的id会丢失精度,因为js最多处理16位数字,id有19位,所以需要配置消息转换器,将id转成string返回给页面
//employee.setUpdateTime(LocalDateTime.now());
//Long empId = (Long)request.getSession().getAttribute("employee");
//employee.setUpdateUser(empId);
long id = Thread.currentThread().getId();
log.info("线程id为:{}",id);
employeeService.updateById(employee);
return R.success("状态修改成功!");
}
@GetMapping("/{id}")//根据id查询员工信息
public R<Employee> getById(@PathVariable Long id){
Employee emp = employeeService.getById(id);
if (emp != null) {
return R.success(emp);
}
return R.error("没有查询到该员工信息");
}
}
五、Filter过滤层
页面拦截代码:
//检查用户是否已经登录
@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.获取本次请求的url
String requestURI = request.getRequestURI();
//定义不需要处理的url
String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};
//2.判断本次请求是否需要处理
boolean check = check(urls,requestURI);
//3.如果不需要处理直接放行
if (check) {
filterChain.doFilter(request,response);
return;
}
//4.判断登录状态,登录了直接放行
if(request.getSession().getAttribute("employee")!=null){
Long empId = (Long) request.getSession().getAttribute("employee");
long id = Thread.currentThread().getId();
BaseContext.setCurrentId(empId);
log.info("线程id为:{}",id);
filterChain.doFilter(request,response);
return;
}
//5.如果未登录则返回登录结果,通过输出流的方式向客户端响应数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
//检查本次请求是否需要放行
public boolean check(String[] urls,String requestURI){
for (String url : urls) {
//匹配url是否包含再requestURI路径中
boolean match = PATH_MATCHER.match(url, requestURI);
if (match) {
return true;
}
}
return false;
}
}
六、程序启动类TestApplication.java
注意:一定要加@ServletComponentScan注解,否则拦截器不生效
@SpringBootApplication
@ServletComponentScan//扫描拦截器,标识开启扫描Servlet组件的功能
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class,args);
}
}