• 瑞吉外卖02-后台功能


    瑞吉外卖02-后台功能

    后台登入功能

    需求分析

    1. 登入页面

    2. 点击登入跳转至主页

    3. 当前项目状态

    ​编辑

    4. 查看登录请求  

    5. 前端页面分析 

    代码开发

    登录逻辑分析

    1. 创建实体类Employee  

    2. 定义通用结果类R ​​​​​​​

    3. 定义Controller层

    4. 定义Mapper接口

    5. Service接口 ​​​​​​​

    6. Service实现类 ​​​​​​​

    后台退出功能 

    需求分析

    1. 退出页面展示 

    2. 前端页面分析 ​​​​​​​

    代码开发

    1. Controller层

    2. service接口 

    3. service实现类

    后台功能存在问题及优化

    问题描述

    实现思路

    代码实现

    定义登录校验过滤器

    给启动类添加注解@ServletComponentScan

    本次功能代码实现(免费)​​​​​​​


    瑞吉外卖02-后台功能

    后台登入功能

    需求分析

    1. 登入页面

    2. 点击登入跳转至主页

    3. 当前项目状态

    此时我们还什么都没有做,项目开发还在初始阶段!

    只是配置的了SpringBoot静态资源放行路径

    4. 查看登录请求  

    可以看到我们点击登入按钮的时候,请求的路径是:http://localhost:8080/employee/login 

    并且是post请求 

    我们的后台代码还没有编写,所以这里就报404

    故我们现在应该按照三层架构的方式来构建后台逻辑 

    5. 前端页面分析 

    在上述的前端代码中, 大家可以看到, 发送登录的异步请求之后, 获取到响应结果, 在响应结果中至少包含三个属性: code、data、msg 

    代码开发

    登录逻辑分析

    1. 创建实体类Employee  

    所在的包:​​​​​​​com.harmony.reggie.entity

    1. @Data
    2. @Setter
    3. @Getter
    4. public class Employee {
    5. // serialVersionUID用作Serializable类中的版本控件
    6. // JavaBean规范中要实现java.io.Serializable接口实现序列化!!!
    7. private static final long serialVersionUID = 1L;
    8. private Long id;
    9. private String username;
    10. private String name;
    11. private String password;
    12. private String phone;
    13. private String sex;
    14. // 数据库里面是id_number 在application.yml配置即可,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    15. private String idNumber;
    16. private Long status;
    17. // LocalDateTime : JDK8 线程安全
    18. private LocalDateTime createTime;
    19. private LocalDateTime updateTime;
    20. // MP中用于标识非主键的字段。将数据库列与 JavaBean 中的属性进行映射,
    21. // fill 字段填充标记,表示在插入时自动填充
    22. @TableField(fill = FieldFill.INSERT)
    23. private Long createUser;
    24. @TableField(fill = FieldFill.INSERT_UPDATE)
    25. private Long updateUser;
    26. }

    serialVersionUID:用作Serializable类中的版本控件,表示该类为可序列化类!JavaBean规范中要实现java.io.Serializable接口实现序列化(序列化serialVersionUID解释说明

    idNumber:数据库里面是id_number 在application.yml配置即可,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射

    @TableField(fill = FieldFill.INSERT):MP中用于标识非主键的字段。将数据库列与 JavaBean 中的属性进行映射,fill 字段填充标记,表示在插入时自动填充

    2. 定义通用结果类R ​​​​​​​

    此类是一个通用结果类,服务端响应的所有结果最终都会包装成此种类型返回给前端页面

    所在的包:​​​​​​​com.harmony.reggie.common

    1. /**
    2. * 通用返回结果,服务端返回的数据最终会封装成此对象
    3. * @param
    4. */
    5. @Data
    6. public class R {
    7. private Integer code; //编码:1成功,0和其它数字为失败
    8. private String msg; //错误信息
    9. private T data; //数据
    10. private Map map = new HashMap(); //动态数据
    11. public static R success(T object) {
    12. R r = new R();
    13. r.data = object;
    14. r.code = 1;
    15. return r;
    16. }
    17. public static R error(String msg) {
    18. R r = new R();
    19. r.msg = msg;
    20. r.code = 0;
    21. return r;
    22. }
    23. public R add(String key, Object value) {
    24. this.map.put(key, value);
    25. return this;
    26. }
    27. }

    3. 定义Controller层

    所在的包:com.harmony.reggie.controller

    1. @Slf4j
    2. @RestController
    3. @RequestMapping("/employee")
    4. public class EmployeeController {
    5. @Autowired
    6. private EmployeeService employeeService;
    7. /**
    8. * 员工登入
    9. * @param request
    10. * @param employee
    11. * @return
    12. */
    13. @PostMapping("/login")
    14. public R login(HttpServletRequest request, @RequestBody Employee employee) {
    15. // @RequestBody : 用来接收前端传递给后端的json字符串中的数据的
    16. return employeeService.login(request,employee);
    17. }
    18. }

    4. 定义Mapper接口

    所在的包:com.harmony.reggie.mapper

    MybatisPlus中, 自定义的Mapper接口, 需要继承自 BaseMapper

    1. @Mapper
    2. public interface EmployeeMapper extends BaseMapper {
    3. }

    5. Service接口 ​​​​​​​

    所在的包:​​​​​​​com.harmony.reggie.service

    本项目的Service接口, 在定义时需要继承自MybatisPlus提供的Service层接口 IService, 这样就可以直接调用 父接口的方法直接执行业务操作, 简化业务层代码实现。  

    1. public interface EmployeeService extends IService {
    2. R login(HttpServletRequest request, Employee employee);
    3. }

    6. Service实现类 ​​​​​​​

    该功能的业务逻辑都在这里了! 

    ①. 将页面提交的密码password进行md5加密处理, 得到加密后的字符串

    ②. 根据页面提交的用户名username查询数据库中员工数据信息

    ③. 如果没有查询到, 则返回登录失败结果

    ④. 密码比对,如果不一致, 则返回登录失败结果

    ⑤. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果

    ⑥. 登录成功,将员工id存入Session, 并返回登录成功结果  

    所在的包:​​​​​​​com.harmony.reggie.service.impl 

    1. @Service
    2. public class EmployeeServiceImpl extends ServiceImpl implements EmployeeService {
    3. @Autowired
    4. private EmployeeMapper employeeMapper;
    5. @Override
    6. public R login(HttpServletRequest request, Employee employee) {
    7. // 1. 将页面提交的密码password进行md5加密处理, 得到加密后的字符串
    8. String password = employee.getPassword();
    9. password = DigestUtils.md5DigestAsHex(password.getBytes());
    10. // 2. 根据页面提交的用户名username查询数据库中员工数据信息
    11. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    12. // Employee::getUsername 查询SQL表里面的用户名
    13. // employee.getUsername() 获取JavaBean的用户名
    14. // eq()表示查询符合条件的数据
    15. queryWrapper.eq(Employee::getUsername,employee.getUsername());
    16. Employee emp = employeeMapper.selectOne(queryWrapper);
    17. // 3. 如果没有查询到, 则返回登录失败结果 || 密码比对,如果不一致, 则返回登录失败结果
    18. if(emp == null || !emp.getPassword().equals(password)){
    19. return R.error("登入失败");
    20. }
    21. // 4. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果
    22. if(emp.getStatus() == 0) {
    23. return R.error("账号已禁用");
    24. }
    25. // 6. 登录成功,将员工id存入Session, 并返回登录成功结果
    26. request.getSession().setAttribute("employee",emp.getId());
    27. return R.success(emp);
    28. }
    29. }

     但是这里面有几个点需要注意一下!

    queryWrapper.eq(Employee::getUsername,employee.getUsername());

    Employee::getUsername :用于获取对象属性名,即获取到的值就是employee类的 “username”属性名。

    eq():第一个参数为表列名,第二个为你的条件

    后台退出功能 

    需求分析

    1. 退出页面展示 

    2. 前端页面分析 ​​​​​​​

    代码开发

    在登入功能里面有一些公用的类已经写了,这里有不重复说明了!

    1. Controller层

    所在的包:​​​​​​​com.harmony.reggie.controller

    1. @Slf4j
    2. @RestController
    3. @RequestMapping("/employee")
    4. public class EmployeeController {
    5. @Autowired
    6. private EmployeeService employeeService;
    7. /**
    8. * 员工退出
    9. * @param request
    10. * @return
    11. */
    12. @PostMapping("/logout")
    13. public R logout(HttpServletRequest request) {
    14. return employeeService.logout(request);
    15. }
    16. }

    2. service接口 

    所在的包:​​​​​​​com.harmony.reggie.service

    1. public interface EmployeeService extends IService {
    2. R logout(HttpServletRequest request);
    3. }

    3. service实现类

    所在的包:​​​​​​​com.harmony.reggie.service.impl

    1. @Service
    2. public class EmployeeServiceImpl extends ServiceImpl implements EmployeeService {
    3. @Autowired
    4. private EmployeeMapper employeeMapper;
    5. @Override
    6. public R logout(HttpServletRequest request) {
    7. request.getSession().removeAttribute("employee");
    8. return R.success("退出成功");
    9. }
    10. }

    后台功能存在问题及优化

    问题描述

    前面我们已经完成了后台系统的员工登录功能开发,但是目前还存在一个问题,如下图所示:

    上述这种设计并不合理,我们希望看到的效果应该是,只有登录成功后才可以访问系统中的页面,如果没有登录, 访问系统中的任何界面都直接跳转到登录页面。  

    实现思路

    A. 获取本次请求的URI

    B. 判断本次请求, 是否需要登录, 才可以访问

    C. 如果不需要,则直接放行

    D. 判断登录状态,如果已登录,则直接放行

    E. 如果未登录, 则返回未登录结

    代码实现

    定义登录校验过滤器

    所在的包:​​​​​​​com.harmony.reggie.filter

    1. /**
    2. * 检查用户是否已经完成登入
    3. *
    4. * @WebServlet : 声明一个自定义的 Servlet
    5. * @WebFilter : 声明一个Servlet 过滤器
    6. * @WebListener : 声明一个类为 Servlet 监听器
    7. */
    8. @WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
    9. @Slf4j
    10. public class LoginCheckFilter implements Filter {
    11. //路径匹配器,支持通配符
    12. public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
    13. @Override
    14. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    15. HttpServletRequest request = (HttpServletRequest) servletRequest;
    16. HttpServletResponse response = (HttpServletResponse) servletResponse;
    17. // 1. 获取本次请求的URI
    18. String requestURL = request.getRequestURI();
    19. log.info("拦截到的请求: {}", requestURL);
    20. // 定义可以放行的资源
    21. String[] urls = new String[]{
    22. "/employee/login",
    23. "/employee/logout",
    24. "/backend/**",
    25. "/front/**"
    26. };
    27. // 2. 判断本次请求, 是否需要登录, 才可以访问
    28. boolean check = check(urls, requestURL);
    29. // 3. 如果不需要,则直接放行
    30. if (check) {
    31. log.info("不需要处理的请求: {}", requestURL);
    32. filterChain.doFilter(request, response);
    33. return;
    34. }
    35. // 4. 判断登录状态,如果已登录,则直接放行
    36. if (request.getSession().getAttribute("employee") != null) {
    37. log.info("用户已登入,用户ID为: {}", request.getSession().getAttribute("employee"));
    38. filterChain.doFilter(request, response);
    39. return;
    40. }
    41. log.info("用户未登入...");
    42. // 5. 如果未登录, 则返回未登录结果,通过输出流的方式向客户端响应数据
    43. response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
    44. }
    45. /**
    46. * 路径匹配,检查本次请求是否需要放行
    47. *
    48. * @param urls
    49. * @param requestURI
    50. * @return
    51. */
    52. public boolean check(String[] urls, String requestURI) {
    53. for (String url : urls) {
    54. // URL匹配
    55. boolean match = PATH_MATCHER.match(url, requestURI);
    56. if (match) {
    57. return true;
    58. }
    59. }
    60. return false;
    61. }
    62. }

    给启动类添加注解@ServletComponentScan

    只有给启动类添加了这个注解上面配置的过滤器类才会交给Spring容器管理! 

    1. @Slf4j
    2. @SpringBootApplication
    3. @ServletComponentScan
    4. public class ReggieApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(ReggieApplication.class);
    7. log.info("项目启动成功...");
    8. }
    9. }

    @ServletComponentScan、@WebServlet、@WebFilter、@WebListener 

    本次功能代码实现(免费)

    注意是在这个分支里面哦!!!

    master是项目的主线,即项目最新的功能点实现情况! 

    可以的话请给个免费的star哦~~~谢谢

    reggie_v2_BackendLogin

    瑞吉外卖: 瑞吉外卖项目完整代码,使用Sprinboot,SSM,MP,MySQL,Redis,Nginx等技术。 - Gitee.comicon-default.png?t=M85Bhttps://gitee.com/Harmony_TL/reggie_take_out/tree/reggie_v2_BackendLogin/

  • 相关阅读:
    路由交换技术之代理ARP
    【面试普通人VS高手系列】Fail-safe机制与Fail-fast机制分别有什么作用
    论文《How to Learn Item Representation for Cold-Start Multimedia Recommendation》阅读
    echarts:基本使用
    JavaScript遭嫌弃,“反JS”主义者兴起
    螺旋矩阵的实现
    Docker运维,基础
    [附源码]Python计算机毕业设计Django四川景区管理系统
    java子类向父类转型再转回子类
    基于战争优化算法(WSO)的光伏模型参数估计研究(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/weixin_43715214/article/details/126446859