springboot + springmvc + mybatis plus实现员工(Employee)登录、退出,并返回结果对象(R)(代码)

 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,所以常见的增删改查方法都已经继承,实现的功能很强大
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值