后台登录功能的开发
-
需求分析
-
代码开发
-
功能测试
一、需求分析
登录
登录页面展示(瑞吉外卖管理端)
二、代码开发(创建controller,service,mapper,实体类,导入通用返回结果类)
创建各个模块,完善功能
功能模块截图:
1.实体类entity:
这块的需求是后台员工登录,所以这里的实体类是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;//身份zheng号码 驼峰命名法
private Integer status;
private LocalDateTime createTime;
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
2.Mapper
别名: dao层
用途: 对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,主要实现一些增删改查操作,在mybatis中方法主要与与xxx.xml内相互一一映射。
但是此项目中的数据库使用的是mybatis-plus,此中封装了许多增删改查的方法,在这里只需要继承BaseMapper即可
***在Mapper包下,创建EmployeeMapper接口,继承BaseMapper,将@mapper注解添加到该接口上
代码如下:
package com.itheima.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}
3.service层
用途:给controller层的类提供接口进行调用。一般就是自己写的方法封装起来,声明一下,具体实现在serviceImpl中。
此处创建EmployeeService接口,并继承IService,再创建impl包下再创建EmployeeServiceImpl方法实现接口EmployeeService,并继承ServiceImpl类
代码如下:
EmployeeService接口:
package com.itheima.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.entity.Employee;
public interface EmployeeService extends IService<Employee> {
}
EmployeeServiceImpl方法:
package com.itheima.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.entity.Employee;
import com.itheima.mapper.EmployeeMapper;
import com.itheima.service.EmployeeService;
import org.springframework.stereotype.Service;
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}
4.通用返回结果类
在reggie包下创建一个子包为common,再在common包下创建一个R类
package com.itheima.reggie.common;
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;
}
}
5.控制层即Controller:
用途: 负责具体模块的业务流程控制
调用service逻辑设计层的接口来控制业务流程。因为service中的方法是我们使用到的,controller通过接收前端H5或者App传过来的参数进行业务操作,再将处理结果返回到前端。
创建EmployeeController类,给EmployeeController类添加一个login方法
- @RequestBody 主要用于接收前端传递给后端的json字符串(请求体中的数据)
- HttpServletRequest request作用:如果登录成功,将员工对应的id存到session一份,这样想获取一份登录用户的信息就可以随时获取出来
package com.itheima.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.entity.Employee;
import com.itheima.service.EmployeeService;
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;
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
//通过自动装配将service接口注入
@Autowired
private EmployeeService employeeService;
/*
员工登录的方法
*/
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
// 1.将页面提交的密码进行MD5加密处理 将密码传入转成getBytes数组
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
// 2.根据页面提交的用户名username查询数据库
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Employee::getUsername,employee.getUsername());
Employee emp = employeeService.getOne(queryWrapper);
// 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);
}
}