1.R对象
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
* 通用返回结果类,服务端响应的数据最终都会封装成此对象
* @param <T>
*/
@Data
public class R<T> {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
private Map map = new HashMap(); //动态数据
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
2.实体类(Employee)
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 员工实体类
*/
@Data
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Long id; //主键
private String username; //登录账号,数据库有unique唯一约束
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; //更新用户
}
3.controller
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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;
import java.time.LocalDateTime;
//import 实体所在包
//import R对象所在包
//import service所在包
@Slf4j //日志注解,方便调试
@RestController
@RequestMapping("/employee")
//为什么是employee,因为登录页面发送请求的路径里面有employee,登录方法对应login
public class EmployeeController {
//依赖注入:通过注解把Service接口注入进来
@Autowired
private EmployeeService employeeService;
/**
* 员工登录
*
* @param request 获取当前登录用户
* @param employee 用户在登录页面输入的数据
* @return 封装的结果对象R
*/
@PostMapping("/login") //因为前端发送的请求时post,所以是PostMapping,请求路径与前端页面匹配
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) { //接受json数据需要注解@RequestBody
//@RequestBody注解将json格式的数据参数,封装为employee对象
//需要对象HttpServletRequest request,因为待会登录成功后需要把employee对象中保存的员工id存入session一份,表示登录成功
//如果想获取当前登录用户,随时可以获取,到时候可以通过request对象get一个session,因为request对象待会会用到,所以提前准备好
//1.将页面提交的密码password进行md5加密处理
//密码在哪?已经封装到employee对象里面了,直接通过employee.getPassword()拿到密码,并将其保存到字符串中
String password = employee.getPassword();
//调用工具类,md5加密的工具方法,然后把密码传进入,转为byte数组。这样就会对明文密码进行处理,处理之后再交给password变量,就不用创建新变量
password = DigestUtils.md5DigestAsHex(password.getBytes());
//2.根据页面提交的用户名username查询数据库
//包装查询对象
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
//添加查询条件
queryWrapper.eq(Employee::getUsername, employee.getUsername());
//调用service的getOne方法把queryWrapper 对象传进去
//为什么调用getOne方法,因为数据库里边已经对username字段做了唯一的约束
//唯一约束在哪里实现的:数据库employee表,设计表,点击索引,username加了Unique唯一索引,在注册账号的时候用户名字段不能重复
//因为是唯一的,所以可以调用getOne方法,去查询唯一的数据
Employee emp = employeeService.getOne(queryWrapper);
//3.如果没有查询到则返回登录失败结果
//如果数据库中没有该用户名,就表示没有该用户,没有该用户就没有数据封装到Employee实体类中,
//所以当emp=null的时候,表示数据库中没有这个用户,就不能登录,返回“登录失败”的信息
if (emp == null) {
return R.error("登录失败"); //结果需要封装成R对象
}
// 4.密码比对,如果不一致则返回登录失败结果
//数据库中的username与前端获取的用户输入的用户名进行比对
if (!emp.getPassword().equals((password))) { //因为是String类型,所有用equals判断
return R.error("登录失败");
}
//5.查看员工转态,如果为已禁用状态,则返回员工已禁用结果
if (emp.getStatus() == 0) { //因为是interger类型,所以用==判断
return R.error("账号已禁用");
}
//6.登录成功,将员工id存入session并返回登录成功结果
//session如何获得?request对象
request.getSession().setAttribute("employee", emp.getId());
return R.success(emp);
}
/**
* 员工退出
*
* @param request 获取当前登录用户
* @return 退出信息
*/
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request) { //退出不需要封装详细的数据,所以泛型为String就可以了
//清理Session中保存的当前登录员工的id
request.getSession().removeAttribute("employee"); //放的时候是哪个用户,移除的时候也是哪个用户
return R.success("退出成功");
}
}
4.service
import com.baomidou.mybatisplus.extension.service.IService;
//import 实体所在包
public interface EmployeeService extends IService<Employee> {
//这个接口需要继承mybatis plus提供的IService父接口,指定泛型实体类
}
5.serviceImpl
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
//import 实体所在包
//import mapper所在包
//import service所在包
@Service //加Service注解,由string管理
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
//继承由mybatis plus提供的一个父类ServiceImpl
//指定两个泛型,第一个是mapper,第二个是实体
//实现service接口
}
6.mapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
//import 实体所在包
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
//继承由mybatis plus提供的接口BaseMapper,需要指定一个泛型,这个泛型就是创建的实体Employee
//虽然这里代码写的不多,但是因为继承了BaseMapper,所以常见的增删改查方法都已经继承,实现的功能很强大
}