目录
一、管理员登录
1、实体创建
按照Java面向对象的编程属性,我们首先需要创建一个实体类,在这个类中包含了该对象的所有属性,以及在必要时的方法。同时在实体类中的属性也能和数据库中该对象数据的索引对应。
@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;
private LocalDateTime createTime;
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
由于目前实现的是后端管理页面,因此创建一个员工类,并在该类中定义员工的所有属性,其中包括员工ID、用户名、密码等信息。
2、创建Mapper
Mapper的目的是将实体类中的属性和数据库中表的索引一一对应,实现方法如下:
import Reggie.entity.Employee;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}
首先需要创建一个Mapper的接口用来实现BaseMapper,在这里BaseMapper会提供一个数据输入的泛型,在这里将之前创建好的实体类导入即可。
3、创建service
service层相当于中间层,它为controller提供了接口,在这里我们的目的是查询数据库,因此在这里service主要提供的是数据库查询接口,当controller调用service后,service会拉取Mapper的映射去查询数据库,创建方法如下:
创建一个service的接口实现IService
import Reggie.entity.Employee;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.stereotype.Service;
@Service
public interface EmployeeService extends IService<Employee> {
}
这里的IService同样需要一个泛型,将之前创建的Employee输入即可
接下来创建一个impl的类用于实现service接口
import Reggie.entity.Employee;
import Reggie.mapper.EmployeeMapper;
import Reggie.service.EmployeeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper , Employee> implements EmployeeService {
}
4、创建controller
controller用于和前端进行交互,同时拉取后端。
登录页面在点击按钮后生成了Post请求,因此在controller中的对应方法需要添加Post的注解。代码如下
import Reggie.common.R;
import Reggie.entity.Employee;
import Reggie.service.EmployeeService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
/*
1、判断用户名
2、判断密码
3、判断用户是否被禁用
*/
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request , @RequestBody Employee employee){
//1、加密处理
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
//2、查用户名
//将网页中的数据进行封装
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
//数据库查询,通过等值查询判断是否有此人
queryWrapper.eq(Employee::getUsername , employee.getUsername());//等值查询
//接收数据库查询的返回值
Employee emp = employeeService.getOne(queryWrapper);
if (emp == null) {
return R.error("登录失败");
}
//3、密码比对
if(!emp.getPassword().equals(password)){
return R.error("密码错误");
}
//4、账号状态判断
if (emp.getStatus() == 0) {
return R.error("该账号已禁用");
}
//5、比对均通过后放行
request.getSession().setAttribute("employee" , emp.getId());
return R.success(emp);
}
}
首先我们需要实例化一个EmployeeService对象用于和数据库交互,之后创建一个用于处理登录事件的方法并添加PostMapping注解,括号中加入请求的页面。之后是从网页发送回来的请求体中获取用户名和密码(此处密码进行MD5加密处理)之后是数据库查询该用户密码并判断是否放行。
二、管理员退出
退出功能和登录功能是成对出现的,接下来我们将实现管理员页面的退出功能。退出功能只需要我们清除当前登录对象的session对象并退出即可。
首先查询登录请求的页面
当点击退出按钮后,在控制台中可以看见请求的URL地址为logout,方式为Post。因此在PostMapping中需要将该页面添加过去
//用户退出
@PostMapping("/logout")//网页退出的请求方式为post
private R<String> logout(HttpServletRequest request){
//清除session数据
request.getSession().removeAttribute("employee");
return R.success("退出成功");
//退出时需要返回界面同时清除浏览器会话中的数据
}
三、网页拦截器
管理员界面由于隐私的问题,我们需要让未登录、未注册的用户无法访问某些关键页面,因此需要设置一个拦截器,当用户直接访问这些页面时就需要返回指定的页面。
@WebFilter
public class LoginCheckFilter implements Filter {
//路径匹配
public static final AntPathMatcher pathMatcher = new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//获取访问路径
String requestURI = request.getRequestURI();
//设置无需拦截的页面
String path [] = new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};
boolean filterStatus = check(path , requestURI);
//1、状态1:直接放行
if (filterStatus){
filterChain.doFilter(request , response);
return;
}
//2、状态2:用户已登录时放行(上述未通过)
if (request.getSession().getAttribute("employee") != null){
filterChain.doFilter(request , response);
return;
}
}
public boolean check(String [] url , String requestURI){
for (String s : url) {
boolean match = pathMatcher.match(s , requestURI);
if (match) {
return true;
}
}
return false;
}
}
(持续更新)